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).unwrap().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            asc: self.parse_asc_desc(),
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 local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5128        let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5129        let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5130        let global: Option<bool> = if global {
5131            Some(true)
5132        } else if local {
5133            Some(false)
5134        } else {
5135            None
5136        };
5137        let temporary = self
5138            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5139            .is_some();
5140        let persistent = dialect_of!(self is DuckDbDialect)
5141            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5142        let create_view_params = self.parse_create_view_params()?;
5143        if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5144            self.parse_create_snapshot_table().map(Into::into)
5145        } else if self.parse_keyword(Keyword::TABLE) {
5146            self.parse_create_table(or_replace, temporary, global, transient)
5147                .map(Into::into)
5148        } else if self.peek_keyword(Keyword::MATERIALIZED)
5149            || self.peek_keyword(Keyword::VIEW)
5150            || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5151            || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5152        {
5153            self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5154                .map(Into::into)
5155        } else if self.parse_keyword(Keyword::POLICY) {
5156            self.parse_create_policy().map(Into::into)
5157        } else if self.parse_keyword(Keyword::EXTERNAL) {
5158            self.parse_create_external_table(or_replace).map(Into::into)
5159        } else if self.parse_keyword(Keyword::FUNCTION) {
5160            self.parse_create_function(or_alter, or_replace, temporary)
5161        } else if self.parse_keyword(Keyword::DOMAIN) {
5162            self.parse_create_domain().map(Into::into)
5163        } else if self.parse_keyword(Keyword::TRIGGER) {
5164            self.parse_create_trigger(temporary, or_alter, or_replace, false)
5165                .map(Into::into)
5166        } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5167            self.parse_create_trigger(temporary, or_alter, or_replace, true)
5168                .map(Into::into)
5169        } else if self.parse_keyword(Keyword::MACRO) {
5170            self.parse_create_macro(or_replace, temporary)
5171        } else if self.parse_keyword(Keyword::SECRET) {
5172            self.parse_create_secret(or_replace, temporary, persistent)
5173        } else if self.parse_keyword(Keyword::USER) {
5174            self.parse_create_user(or_replace).map(Into::into)
5175        } else if or_replace {
5176            self.expected_ref(
5177                "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5178                self.peek_token_ref(),
5179            )
5180        } else if self.parse_keyword(Keyword::EXTENSION) {
5181            self.parse_create_extension().map(Into::into)
5182        } else if self.parse_keyword(Keyword::INDEX) {
5183            self.parse_create_index(false).map(Into::into)
5184        } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5185            self.parse_create_index(true).map(Into::into)
5186        } else if self.parse_keyword(Keyword::VIRTUAL) {
5187            self.parse_create_virtual_table()
5188        } else if self.parse_keyword(Keyword::SCHEMA) {
5189            self.parse_create_schema()
5190        } else if self.parse_keyword(Keyword::DATABASE) {
5191            self.parse_create_database()
5192        } else if self.parse_keyword(Keyword::ROLE) {
5193            self.parse_create_role().map(Into::into)
5194        } else if self.parse_keyword(Keyword::SEQUENCE) {
5195            self.parse_create_sequence(temporary)
5196        } else if self.parse_keyword(Keyword::COLLATION) {
5197            self.parse_create_collation().map(Into::into)
5198        } else if self.parse_keyword(Keyword::TYPE) {
5199            self.parse_create_type()
5200        } else if self.parse_keyword(Keyword::PROCEDURE) {
5201            self.parse_create_procedure(or_alter)
5202        } else if self.parse_keyword(Keyword::CONNECTOR) {
5203            self.parse_create_connector().map(Into::into)
5204        } else if self.parse_keyword(Keyword::OPERATOR) {
5205            // Check if this is CREATE OPERATOR FAMILY or CREATE OPERATOR CLASS
5206            if self.parse_keyword(Keyword::FAMILY) {
5207                self.parse_create_operator_family().map(Into::into)
5208            } else if self.parse_keyword(Keyword::CLASS) {
5209                self.parse_create_operator_class().map(Into::into)
5210            } else {
5211                self.parse_create_operator().map(Into::into)
5212            }
5213        } else if self.parse_keyword(Keyword::SERVER) {
5214            self.parse_pg_create_server()
5215        } else {
5216            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5217        }
5218    }
5219
5220    fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5221        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5222        let name = self.parse_identifier()?;
5223        let options = self
5224            .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5225            .options;
5226        let with_tags = self.parse_keyword(Keyword::WITH);
5227        let tags = if self.parse_keyword(Keyword::TAG) {
5228            self.parse_key_value_options(true, &[])?.options
5229        } else {
5230            vec![]
5231        };
5232        Ok(CreateUser {
5233            or_replace,
5234            if_not_exists,
5235            name,
5236            options: KeyValueOptions {
5237                options,
5238                delimiter: KeyValueOptionsDelimiter::Space,
5239            },
5240            with_tags,
5241            tags: KeyValueOptions {
5242                options: tags,
5243                delimiter: KeyValueOptionsDelimiter::Comma,
5244            },
5245        })
5246    }
5247
5248    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
5249    pub fn parse_create_secret(
5250        &mut self,
5251        or_replace: bool,
5252        temporary: bool,
5253        persistent: bool,
5254    ) -> Result<Statement, ParserError> {
5255        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5256
5257        let mut storage_specifier = None;
5258        let mut name = None;
5259        if self.peek_token_ref().token != Token::LParen {
5260            if self.parse_keyword(Keyword::IN) {
5261                storage_specifier = self.parse_identifier().ok()
5262            } else {
5263                name = self.parse_identifier().ok();
5264            }
5265
5266            // Storage specifier may follow the name
5267            if storage_specifier.is_none()
5268                && self.peek_token_ref().token != Token::LParen
5269                && self.parse_keyword(Keyword::IN)
5270            {
5271                storage_specifier = self.parse_identifier().ok();
5272            }
5273        }
5274
5275        self.expect_token(&Token::LParen)?;
5276        self.expect_keyword_is(Keyword::TYPE)?;
5277        let secret_type = self.parse_identifier()?;
5278
5279        let mut options = Vec::new();
5280        if self.consume_token(&Token::Comma) {
5281            options.append(&mut self.parse_comma_separated(|p| {
5282                let key = p.parse_identifier()?;
5283                let value = p.parse_identifier()?;
5284                Ok(SecretOption { key, value })
5285            })?);
5286        }
5287        self.expect_token(&Token::RParen)?;
5288
5289        let temp = match (temporary, persistent) {
5290            (true, false) => Some(true),
5291            (false, true) => Some(false),
5292            (false, false) => None,
5293            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5294        };
5295
5296        Ok(Statement::CreateSecret {
5297            or_replace,
5298            temporary: temp,
5299            if_not_exists,
5300            name,
5301            storage_specifier,
5302            secret_type,
5303            options,
5304        })
5305    }
5306
5307    /// Parse a CACHE TABLE statement
5308    pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5309        let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5310        if self.parse_keyword(Keyword::TABLE) {
5311            let table_name = self.parse_object_name(false)?;
5312            if self.peek_token_ref().token != Token::EOF {
5313                if let Token::Word(word) = &self.peek_token_ref().token {
5314                    if word.keyword == Keyword::OPTIONS {
5315                        options = self.parse_options(Keyword::OPTIONS)?
5316                    }
5317                };
5318
5319                if self.peek_token_ref().token != Token::EOF {
5320                    let (a, q) = self.parse_as_query()?;
5321                    has_as = a;
5322                    query = Some(q);
5323                }
5324
5325                Ok(Statement::Cache {
5326                    table_flag,
5327                    table_name,
5328                    has_as,
5329                    options,
5330                    query,
5331                })
5332            } else {
5333                Ok(Statement::Cache {
5334                    table_flag,
5335                    table_name,
5336                    has_as,
5337                    options,
5338                    query,
5339                })
5340            }
5341        } else {
5342            table_flag = Some(self.parse_object_name(false)?);
5343            if self.parse_keyword(Keyword::TABLE) {
5344                let table_name = self.parse_object_name(false)?;
5345                if self.peek_token_ref().token != Token::EOF {
5346                    if let Token::Word(word) = &self.peek_token_ref().token {
5347                        if word.keyword == Keyword::OPTIONS {
5348                            options = self.parse_options(Keyword::OPTIONS)?
5349                        }
5350                    };
5351
5352                    if self.peek_token_ref().token != Token::EOF {
5353                        let (a, q) = self.parse_as_query()?;
5354                        has_as = a;
5355                        query = Some(q);
5356                    }
5357
5358                    Ok(Statement::Cache {
5359                        table_flag,
5360                        table_name,
5361                        has_as,
5362                        options,
5363                        query,
5364                    })
5365                } else {
5366                    Ok(Statement::Cache {
5367                        table_flag,
5368                        table_name,
5369                        has_as,
5370                        options,
5371                        query,
5372                    })
5373                }
5374            } else {
5375                if self.peek_token_ref().token == Token::EOF {
5376                    self.prev_token();
5377                }
5378                self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5379            }
5380        }
5381    }
5382
5383    /// Parse 'AS' before as query,such as `WITH XXX AS SELECT XXX` oer `CACHE TABLE AS SELECT XXX`
5384    pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5385        match &self.peek_token_ref().token {
5386            Token::Word(word) => match word.keyword {
5387                Keyword::AS => {
5388                    self.next_token();
5389                    Ok((true, self.parse_query()?))
5390                }
5391                _ => Ok((false, self.parse_query()?)),
5392            },
5393            _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5394        }
5395    }
5396
5397    /// Parse a UNCACHE TABLE statement
5398    pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5399        self.expect_keyword_is(Keyword::TABLE)?;
5400        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5401        let table_name = self.parse_object_name(false)?;
5402        Ok(Statement::UNCache {
5403            table_name,
5404            if_exists,
5405        })
5406    }
5407
5408    /// SQLite-specific `CREATE VIRTUAL TABLE`
5409    pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5410        self.expect_keyword_is(Keyword::TABLE)?;
5411        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5412        let table_name = self.parse_object_name(false)?;
5413        self.expect_keyword_is(Keyword::USING)?;
5414        let module_name = self.parse_identifier()?;
5415        // SQLite docs note that module "arguments syntax is sufficiently
5416        // general that the arguments can be made to appear as column
5417        // definitions in a traditional CREATE TABLE statement", but
5418        // we don't implement that.
5419        let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5420        Ok(Statement::CreateVirtualTable {
5421            name: table_name,
5422            if_not_exists,
5423            module_name,
5424            module_args,
5425        })
5426    }
5427
5428    /// Parse a `CREATE SCHEMA` statement.
5429    pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5430        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5431
5432        let schema_name = self.parse_schema_name()?;
5433
5434        let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5435            Some(self.parse_expr()?)
5436        } else {
5437            None
5438        };
5439
5440        let with = if self.peek_keyword(Keyword::WITH) {
5441            Some(self.parse_options(Keyword::WITH)?)
5442        } else {
5443            None
5444        };
5445
5446        let options = if self.peek_keyword(Keyword::OPTIONS) {
5447            Some(self.parse_options(Keyword::OPTIONS)?)
5448        } else {
5449            None
5450        };
5451
5452        let clone = if self.parse_keyword(Keyword::CLONE) {
5453            Some(self.parse_object_name(false)?)
5454        } else {
5455            None
5456        };
5457
5458        Ok(Statement::CreateSchema {
5459            schema_name,
5460            if_not_exists,
5461            with,
5462            options,
5463            default_collate_spec,
5464            clone,
5465        })
5466    }
5467
5468    fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5469        if self.parse_keyword(Keyword::AUTHORIZATION) {
5470            Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5471        } else {
5472            let name = self.parse_object_name(false)?;
5473
5474            if self.parse_keyword(Keyword::AUTHORIZATION) {
5475                Ok(SchemaName::NamedAuthorization(
5476                    name,
5477                    self.parse_identifier()?,
5478                ))
5479            } else {
5480                Ok(SchemaName::Simple(name))
5481            }
5482        }
5483    }
5484
5485    /// Parse a `CREATE DATABASE` statement.
5486    pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5487        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5488        let db_name = self.parse_object_name(false)?;
5489        let mut location = None;
5490        let mut managed_location = None;
5491        loop {
5492            match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5493                Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5494                Some(Keyword::MANAGEDLOCATION) => {
5495                    managed_location = Some(self.parse_literal_string()?)
5496                }
5497                _ => break,
5498            }
5499        }
5500        let clone = if self.parse_keyword(Keyword::CLONE) {
5501            Some(self.parse_object_name(false)?)
5502        } else {
5503            None
5504        };
5505
5506        // Parse MySQL-style [DEFAULT] CHARACTER SET and [DEFAULT] COLLATE options
5507        //
5508        // Note: The docs only mention `CHARACTER SET`, but `CHARSET` is also supported.
5509        // Furthermore, MySQL will only accept one character set, raising an error if there is more
5510        // than one, but will accept multiple collations and use the last one.
5511        //
5512        // <https://dev.mysql.com/doc/refman/8.4/en/create-database.html>
5513        let mut default_charset = None;
5514        let mut default_collation = None;
5515        loop {
5516            let has_default = self.parse_keyword(Keyword::DEFAULT);
5517            if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5518                || self.parse_keyword(Keyword::CHARSET)
5519            {
5520                let _ = self.consume_token(&Token::Eq);
5521                default_charset = Some(self.parse_identifier()?.value);
5522            } else if self.parse_keyword(Keyword::COLLATE) {
5523                let _ = self.consume_token(&Token::Eq);
5524                default_collation = Some(self.parse_identifier()?.value);
5525            } else if has_default {
5526                // DEFAULT keyword not followed by CHARACTER SET, CHARSET, or COLLATE
5527                self.prev_token();
5528                break;
5529            } else {
5530                break;
5531            }
5532        }
5533
5534        Ok(Statement::CreateDatabase {
5535            db_name,
5536            if_not_exists: ine,
5537            location,
5538            managed_location,
5539            or_replace: false,
5540            transient: false,
5541            clone,
5542            data_retention_time_in_days: None,
5543            max_data_extension_time_in_days: None,
5544            external_volume: None,
5545            catalog: None,
5546            replace_invalid_characters: None,
5547            default_ddl_collation: None,
5548            storage_serialization_policy: None,
5549            comment: None,
5550            default_charset,
5551            default_collation,
5552            catalog_sync: None,
5553            catalog_sync_namespace_mode: None,
5554            catalog_sync_namespace_flatten_delimiter: None,
5555            with_tags: None,
5556            with_contacts: None,
5557        })
5558    }
5559
5560    /// Parse an optional `USING` clause for `CREATE FUNCTION`.
5561    pub fn parse_optional_create_function_using(
5562        &mut self,
5563    ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5564        if !self.parse_keyword(Keyword::USING) {
5565            return Ok(None);
5566        };
5567        let keyword =
5568            self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5569
5570        let uri = self.parse_literal_string()?;
5571
5572        match keyword {
5573            Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5574            Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5575            Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5576            _ => self.expected(
5577                "JAR, FILE or ARCHIVE, got {:?}",
5578                TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5579            ),
5580        }
5581    }
5582
5583    /// Parse a `CREATE FUNCTION` statement.
5584    pub fn parse_create_function(
5585        &mut self,
5586        or_alter: bool,
5587        or_replace: bool,
5588        temporary: bool,
5589    ) -> Result<Statement, ParserError> {
5590        if dialect_of!(self is HiveDialect) {
5591            self.parse_hive_create_function(or_replace, temporary)
5592                .map(Into::into)
5593        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5594            self.parse_postgres_create_function(or_replace, temporary)
5595                .map(Into::into)
5596        } else if dialect_of!(self is DuckDbDialect) {
5597            self.parse_create_macro(or_replace, temporary)
5598        } else if dialect_of!(self is BigQueryDialect) {
5599            self.parse_bigquery_create_function(or_replace, temporary)
5600                .map(Into::into)
5601        } else if dialect_of!(self is MsSqlDialect) {
5602            self.parse_mssql_create_function(or_alter, or_replace, temporary)
5603                .map(Into::into)
5604        } else {
5605            self.prev_token();
5606            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5607        }
5608    }
5609
5610    /// Parse `CREATE FUNCTION` for [PostgreSQL]
5611    ///
5612    /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
5613    fn parse_postgres_create_function(
5614        &mut self,
5615        or_replace: bool,
5616        temporary: bool,
5617    ) -> Result<CreateFunction, ParserError> {
5618        let name = self.parse_object_name(false)?;
5619
5620        self.expect_token(&Token::LParen)?;
5621        let args = if Token::RParen != self.peek_token_ref().token {
5622            self.parse_comma_separated(Parser::parse_function_arg)?
5623        } else {
5624            vec![]
5625        };
5626        self.expect_token(&Token::RParen)?;
5627
5628        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5629            Some(self.parse_function_return_type()?)
5630        } else {
5631            None
5632        };
5633
5634        #[derive(Default)]
5635        struct Body {
5636            language: Option<Ident>,
5637            behavior: Option<FunctionBehavior>,
5638            function_body: Option<CreateFunctionBody>,
5639            called_on_null: Option<FunctionCalledOnNull>,
5640            parallel: Option<FunctionParallel>,
5641            security: Option<FunctionSecurity>,
5642        }
5643        let mut body = Body::default();
5644        let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5645        loop {
5646            fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5647                if field.is_some() {
5648                    return Err(ParserError::ParserError(format!(
5649                        "{name} specified more than once",
5650                    )));
5651                }
5652                Ok(())
5653            }
5654            if self.parse_keyword(Keyword::AS) {
5655                ensure_not_set(&body.function_body, "AS")?;
5656                body.function_body = Some(self.parse_create_function_body_string()?);
5657            } else if self.parse_keyword(Keyword::LANGUAGE) {
5658                ensure_not_set(&body.language, "LANGUAGE")?;
5659                body.language = Some(self.parse_identifier()?);
5660            } else if self.parse_keyword(Keyword::IMMUTABLE) {
5661                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5662                body.behavior = Some(FunctionBehavior::Immutable);
5663            } else if self.parse_keyword(Keyword::STABLE) {
5664                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5665                body.behavior = Some(FunctionBehavior::Stable);
5666            } else if self.parse_keyword(Keyword::VOLATILE) {
5667                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5668                body.behavior = Some(FunctionBehavior::Volatile);
5669            } else if self.parse_keywords(&[
5670                Keyword::CALLED,
5671                Keyword::ON,
5672                Keyword::NULL,
5673                Keyword::INPUT,
5674            ]) {
5675                ensure_not_set(
5676                    &body.called_on_null,
5677                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5678                )?;
5679                body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5680            } else if self.parse_keywords(&[
5681                Keyword::RETURNS,
5682                Keyword::NULL,
5683                Keyword::ON,
5684                Keyword::NULL,
5685                Keyword::INPUT,
5686            ]) {
5687                ensure_not_set(
5688                    &body.called_on_null,
5689                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5690                )?;
5691                body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5692            } else if self.parse_keyword(Keyword::STRICT) {
5693                ensure_not_set(
5694                    &body.called_on_null,
5695                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5696                )?;
5697                body.called_on_null = Some(FunctionCalledOnNull::Strict);
5698            } else if self.parse_keyword(Keyword::PARALLEL) {
5699                ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5700                if self.parse_keyword(Keyword::UNSAFE) {
5701                    body.parallel = Some(FunctionParallel::Unsafe);
5702                } else if self.parse_keyword(Keyword::RESTRICTED) {
5703                    body.parallel = Some(FunctionParallel::Restricted);
5704                } else if self.parse_keyword(Keyword::SAFE) {
5705                    body.parallel = Some(FunctionParallel::Safe);
5706                } else {
5707                    return self
5708                        .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5709                }
5710            } else if self.parse_keyword(Keyword::SECURITY) {
5711                ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5712                if self.parse_keyword(Keyword::DEFINER) {
5713                    body.security = Some(FunctionSecurity::Definer);
5714                } else if self.parse_keyword(Keyword::INVOKER) {
5715                    body.security = Some(FunctionSecurity::Invoker);
5716                } else {
5717                    return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5718                }
5719            } else if self.parse_keyword(Keyword::SET) {
5720                let name = self.parse_object_name(false)?;
5721                let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5722                    FunctionSetValue::FromCurrent
5723                } else {
5724                    if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5725                        return self.expected_ref("= or TO", self.peek_token_ref());
5726                    }
5727                    if self.parse_keyword(Keyword::DEFAULT) {
5728                        FunctionSetValue::Default
5729                    } else {
5730                        let values = self.parse_comma_separated(Parser::parse_expr)?;
5731                        FunctionSetValue::Values(values)
5732                    }
5733                };
5734                set_params.push(FunctionDefinitionSetParam { name, value });
5735            } else if self.parse_keyword(Keyword::RETURN) {
5736                ensure_not_set(&body.function_body, "RETURN")?;
5737                body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5738            } else {
5739                break;
5740            }
5741        }
5742
5743        Ok(CreateFunction {
5744            or_alter: false,
5745            or_replace,
5746            temporary,
5747            name,
5748            args: Some(args),
5749            return_type,
5750            behavior: body.behavior,
5751            called_on_null: body.called_on_null,
5752            parallel: body.parallel,
5753            security: body.security,
5754            set_params,
5755            language: body.language,
5756            function_body: body.function_body,
5757            if_not_exists: false,
5758            using: None,
5759            determinism_specifier: None,
5760            options: None,
5761            remote_connection: None,
5762        })
5763    }
5764
5765    /// Parse `CREATE FUNCTION` for [Hive]
5766    ///
5767    /// [Hive]: https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-Create/Drop/ReloadFunction
5768    fn parse_hive_create_function(
5769        &mut self,
5770        or_replace: bool,
5771        temporary: bool,
5772    ) -> Result<CreateFunction, ParserError> {
5773        let name = self.parse_object_name(false)?;
5774        self.expect_keyword_is(Keyword::AS)?;
5775
5776        let body = self.parse_create_function_body_string()?;
5777        let using = self.parse_optional_create_function_using()?;
5778
5779        Ok(CreateFunction {
5780            or_alter: false,
5781            or_replace,
5782            temporary,
5783            name,
5784            function_body: Some(body),
5785            using,
5786            if_not_exists: false,
5787            args: None,
5788            return_type: None,
5789            behavior: None,
5790            called_on_null: None,
5791            parallel: None,
5792            security: None,
5793            set_params: vec![],
5794            language: None,
5795            determinism_specifier: None,
5796            options: None,
5797            remote_connection: None,
5798        })
5799    }
5800
5801    /// Parse `CREATE FUNCTION` for [BigQuery]
5802    ///
5803    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement
5804    fn parse_bigquery_create_function(
5805        &mut self,
5806        or_replace: bool,
5807        temporary: bool,
5808    ) -> Result<CreateFunction, ParserError> {
5809        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5810        let (name, args) = self.parse_create_function_name_and_params()?;
5811
5812        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5813            Some(self.parse_function_return_type()?)
5814        } else {
5815            None
5816        };
5817
5818        let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
5819            Some(FunctionDeterminismSpecifier::Deterministic)
5820        } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
5821            Some(FunctionDeterminismSpecifier::NotDeterministic)
5822        } else {
5823            None
5824        };
5825
5826        let language = if self.parse_keyword(Keyword::LANGUAGE) {
5827            Some(self.parse_identifier()?)
5828        } else {
5829            None
5830        };
5831
5832        let remote_connection =
5833            if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
5834                Some(self.parse_object_name(false)?)
5835            } else {
5836                None
5837            };
5838
5839        // `OPTIONS` may come before of after the function body but
5840        // may be specified at most once.
5841        let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
5842
5843        let function_body = if remote_connection.is_none() {
5844            self.expect_keyword_is(Keyword::AS)?;
5845            let expr = self.parse_expr()?;
5846            if options.is_none() {
5847                options = self.maybe_parse_options(Keyword::OPTIONS)?;
5848                Some(CreateFunctionBody::AsBeforeOptions {
5849                    body: expr,
5850                    link_symbol: None,
5851                })
5852            } else {
5853                Some(CreateFunctionBody::AsAfterOptions(expr))
5854            }
5855        } else {
5856            None
5857        };
5858
5859        Ok(CreateFunction {
5860            or_alter: false,
5861            or_replace,
5862            temporary,
5863            if_not_exists,
5864            name,
5865            args: Some(args),
5866            return_type,
5867            function_body,
5868            language,
5869            determinism_specifier,
5870            options,
5871            remote_connection,
5872            using: None,
5873            behavior: None,
5874            called_on_null: None,
5875            parallel: None,
5876            security: None,
5877            set_params: vec![],
5878        })
5879    }
5880
5881    /// Parse `CREATE FUNCTION` for [MsSql]
5882    ///
5883    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
5884    fn parse_mssql_create_function(
5885        &mut self,
5886        or_alter: bool,
5887        or_replace: bool,
5888        temporary: bool,
5889    ) -> Result<CreateFunction, ParserError> {
5890        let (name, args) = self.parse_create_function_name_and_params()?;
5891
5892        self.expect_keyword(Keyword::RETURNS)?;
5893
5894        let return_table = self.maybe_parse(|p| {
5895            let return_table_name = p.parse_identifier()?;
5896
5897            p.expect_keyword_is(Keyword::TABLE)?;
5898            p.prev_token();
5899
5900            let table_column_defs = match p.parse_data_type()? {
5901                DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5902                    table_column_defs
5903                }
5904                _ => parser_err!(
5905                    "Expected table column definitions after TABLE keyword",
5906                    p.peek_token_ref().span.start
5907                )?,
5908            };
5909
5910            Ok(DataType::NamedTable {
5911                name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5912                columns: table_column_defs,
5913            })
5914        })?;
5915
5916        let data_type = match return_table {
5917            Some(table_type) => table_type,
5918            None => self.parse_data_type()?,
5919        };
5920        let return_type = Some(FunctionReturnType::DataType(data_type));
5921
5922        let _ = self.parse_keyword(Keyword::AS);
5923
5924        let function_body = if self.peek_keyword(Keyword::BEGIN) {
5925            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5926            let statements = self.parse_statement_list(&[Keyword::END])?;
5927            let end_token = self.expect_keyword(Keyword::END)?;
5928
5929            Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
5930                begin_token: AttachedToken(begin_token),
5931                statements,
5932                end_token: AttachedToken(end_token),
5933            }))
5934        } else if self.parse_keyword(Keyword::RETURN) {
5935            if self.peek_token_ref().token == Token::LParen {
5936                Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
5937            } else if self.peek_keyword(Keyword::SELECT) {
5938                let select = self.parse_select()?;
5939                Some(CreateFunctionBody::AsReturnSelect(select))
5940            } else {
5941                parser_err!(
5942                    "Expected a subquery (or bare SELECT statement) after RETURN",
5943                    self.peek_token_ref().span.start
5944                )?
5945            }
5946        } else {
5947            parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
5948        };
5949
5950        Ok(CreateFunction {
5951            or_alter,
5952            or_replace,
5953            temporary,
5954            if_not_exists: false,
5955            name,
5956            args: Some(args),
5957            return_type,
5958            function_body,
5959            language: None,
5960            determinism_specifier: None,
5961            options: None,
5962            remote_connection: None,
5963            using: None,
5964            behavior: None,
5965            called_on_null: None,
5966            parallel: None,
5967            security: None,
5968            set_params: vec![],
5969        })
5970    }
5971
5972    fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
5973        if self.parse_keyword(Keyword::SETOF) {
5974            Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
5975        } else {
5976            Ok(FunctionReturnType::DataType(self.parse_data_type()?))
5977        }
5978    }
5979
5980    fn parse_create_function_name_and_params(
5981        &mut self,
5982    ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
5983        let name = self.parse_object_name(false)?;
5984        let parse_function_param =
5985            |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
5986                let name = parser.parse_identifier()?;
5987                let data_type = parser.parse_data_type()?;
5988                let default_expr = if parser.consume_token(&Token::Eq) {
5989                    Some(parser.parse_expr()?)
5990                } else {
5991                    None
5992                };
5993
5994                Ok(OperateFunctionArg {
5995                    mode: None,
5996                    name: Some(name),
5997                    data_type,
5998                    default_expr,
5999                })
6000            };
6001        self.expect_token(&Token::LParen)?;
6002        let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6003        self.expect_token(&Token::RParen)?;
6004        Ok((name, args))
6005    }
6006
6007    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6008        let mode = if self.parse_keyword(Keyword::IN) {
6009            Some(ArgMode::In)
6010        } else if self.parse_keyword(Keyword::OUT) {
6011            Some(ArgMode::Out)
6012        } else if self.parse_keyword(Keyword::INOUT) {
6013            Some(ArgMode::InOut)
6014        } else if self.parse_keyword(Keyword::VARIADIC) {
6015            Some(ArgMode::Variadic)
6016        } else {
6017            None
6018        };
6019
6020        // parse: [ argname ] argtype
6021        let mut name = None;
6022        let mut data_type = self.parse_data_type()?;
6023
6024        // To check whether the first token is a name or a type, we need to
6025        // peek the next token, which if it is another type keyword, then the
6026        // first token is a name and not a type in itself.
6027        let data_type_idx = self.get_current_index();
6028
6029        // DEFAULT will be parsed as `DataType::Custom`, which is undesirable in this context
6030        fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6031            if parser.peek_keyword(Keyword::DEFAULT) {
6032                // This dummy error is ignored in `maybe_parse`
6033                parser_err!(
6034                    "The DEFAULT keyword is not a type",
6035                    parser.peek_token_ref().span.start
6036                )
6037            } else {
6038                parser.parse_data_type()
6039            }
6040        }
6041
6042        if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6043            let token = self.token_at(data_type_idx);
6044
6045            // We ensure that the token is a `Word` token, and not other special tokens.
6046            if !matches!(token.token, Token::Word(_)) {
6047                return self.expected("a name or type", token.clone());
6048            }
6049
6050            name = Some(Ident::new(token.to_string()));
6051            data_type = next_data_type;
6052        }
6053
6054        let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6055        {
6056            Some(self.parse_expr()?)
6057        } else {
6058            None
6059        };
6060        Ok(OperateFunctionArg {
6061            mode,
6062            name,
6063            data_type,
6064            default_expr,
6065        })
6066    }
6067
6068    fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6069        let mode = if self.parse_keyword(Keyword::IN) {
6070            Some(ArgMode::In)
6071        } else {
6072            if self
6073                .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6074                .is_some()
6075            {
6076                return self.expected_ref(
6077                    "IN or argument type in aggregate signature",
6078                    self.peek_token_ref(),
6079                );
6080            }
6081            None
6082        };
6083
6084        // Parse: [ argname ] argtype, but do not consume ORDER from
6085        // `... argtype ORDER BY ...` as a type-name disambiguator.
6086        let mut name = None;
6087        let mut data_type = self.parse_data_type()?;
6088        let data_type_idx = self.get_current_index();
6089
6090        fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6091            if parser.peek_keyword(Keyword::DEFAULT)
6092                || parser.peek_keyword(Keyword::ORDER)
6093                || parser.peek_token_ref().token == Token::Comma
6094                || parser.peek_token_ref().token == Token::RParen
6095            {
6096                // Dummy error ignored by maybe_parse
6097                parser_err!(
6098                    "The current token cannot start an aggregate argument type",
6099                    parser.peek_token_ref().span.start
6100                )
6101            } else {
6102                parser.parse_data_type()
6103            }
6104        }
6105
6106        if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6107            let token = self.token_at(data_type_idx);
6108            if !matches!(token.token, Token::Word(_)) {
6109                return self.expected("a name or type", token.clone());
6110            }
6111
6112            name = Some(Ident::new(token.to_string()));
6113            data_type = next_data_type;
6114        }
6115
6116        if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6117            return self.expected_ref(
6118                "',' or ')' or ORDER BY after aggregate argument type",
6119                self.peek_token_ref(),
6120            );
6121        }
6122
6123        Ok(OperateFunctionArg {
6124            mode,
6125            name,
6126            data_type,
6127            default_expr: None,
6128        })
6129    }
6130
6131    /// Parse statements of the DropTrigger type such as:
6132    ///
6133    /// ```sql
6134    /// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
6135    /// ```
6136    pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6137        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6138        {
6139            self.prev_token();
6140            return self.expected_ref("an object type after DROP", self.peek_token_ref());
6141        }
6142        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6143        let trigger_name = self.parse_object_name(false)?;
6144        let table_name = if self.parse_keyword(Keyword::ON) {
6145            Some(self.parse_object_name(false)?)
6146        } else {
6147            None
6148        };
6149        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6150            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6151            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6152            Some(unexpected_keyword) => return Err(ParserError::ParserError(
6153                format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6154            )),
6155            None => None,
6156        };
6157        Ok(DropTrigger {
6158            if_exists,
6159            trigger_name,
6160            table_name,
6161            option,
6162        })
6163    }
6164
6165    /// Parse a `CREATE TRIGGER` statement.
6166    pub fn parse_create_trigger(
6167        &mut self,
6168        temporary: bool,
6169        or_alter: bool,
6170        or_replace: bool,
6171        is_constraint: bool,
6172    ) -> Result<CreateTrigger, ParserError> {
6173        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6174        {
6175            self.prev_token();
6176            return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6177        }
6178
6179        let name = self.parse_object_name(false)?;
6180        let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6181
6182        let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6183        self.expect_keyword_is(Keyword::ON)?;
6184        let table_name = self.parse_object_name(false)?;
6185
6186        let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6187            self.parse_object_name(true).ok()
6188        } else {
6189            None
6190        };
6191
6192        let characteristics = self.parse_constraint_characteristics()?;
6193
6194        let mut referencing = vec![];
6195        if self.parse_keyword(Keyword::REFERENCING) {
6196            while let Some(refer) = self.parse_trigger_referencing()? {
6197                referencing.push(refer);
6198            }
6199        }
6200
6201        let trigger_object = if self.parse_keyword(Keyword::FOR) {
6202            let include_each = self.parse_keyword(Keyword::EACH);
6203            let trigger_object =
6204                match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6205                    Keyword::ROW => TriggerObject::Row,
6206                    Keyword::STATEMENT => TriggerObject::Statement,
6207                    unexpected_keyword => return Err(ParserError::ParserError(
6208                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6209                    )),
6210                };
6211
6212            Some(if include_each {
6213                TriggerObjectKind::ForEach(trigger_object)
6214            } else {
6215                TriggerObjectKind::For(trigger_object)
6216            })
6217        } else {
6218            let _ = self.parse_keyword(Keyword::FOR);
6219
6220            None
6221        };
6222
6223        let condition = self
6224            .parse_keyword(Keyword::WHEN)
6225            .then(|| self.parse_expr())
6226            .transpose()?;
6227
6228        let mut exec_body = None;
6229        let mut statements = None;
6230        if self.parse_keyword(Keyword::EXECUTE) {
6231            exec_body = Some(self.parse_trigger_exec_body()?);
6232        } else {
6233            statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6234        }
6235
6236        Ok(CreateTrigger {
6237            or_alter,
6238            temporary,
6239            or_replace,
6240            is_constraint,
6241            name,
6242            period,
6243            period_before_table: true,
6244            events,
6245            table_name,
6246            referenced_table_name,
6247            referencing,
6248            trigger_object,
6249            condition,
6250            exec_body,
6251            statements_as: false,
6252            statements,
6253            characteristics,
6254        })
6255    }
6256
6257    /// Parse the period part of a trigger (`BEFORE`, `AFTER`, etc.).
6258    pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6259        Ok(
6260            match self.expect_one_of_keywords(&[
6261                Keyword::FOR,
6262                Keyword::BEFORE,
6263                Keyword::AFTER,
6264                Keyword::INSTEAD,
6265            ])? {
6266                Keyword::FOR => TriggerPeriod::For,
6267                Keyword::BEFORE => TriggerPeriod::Before,
6268                Keyword::AFTER => TriggerPeriod::After,
6269                Keyword::INSTEAD => self
6270                    .expect_keyword_is(Keyword::OF)
6271                    .map(|_| TriggerPeriod::InsteadOf)?,
6272                unexpected_keyword => return Err(ParserError::ParserError(
6273                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6274                )),
6275            },
6276        )
6277    }
6278
6279    /// Parse the event part of a trigger (`INSERT`, `UPDATE`, etc.).
6280    pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6281        Ok(
6282            match self.expect_one_of_keywords(&[
6283                Keyword::INSERT,
6284                Keyword::UPDATE,
6285                Keyword::DELETE,
6286                Keyword::TRUNCATE,
6287            ])? {
6288                Keyword::INSERT => TriggerEvent::Insert,
6289                Keyword::UPDATE => {
6290                    if self.parse_keyword(Keyword::OF) {
6291                        let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6292                        TriggerEvent::Update(cols)
6293                    } else {
6294                        TriggerEvent::Update(vec![])
6295                    }
6296                }
6297                Keyword::DELETE => TriggerEvent::Delete,
6298                Keyword::TRUNCATE => TriggerEvent::Truncate,
6299                unexpected_keyword => return Err(ParserError::ParserError(
6300                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6301                )),
6302            },
6303        )
6304    }
6305
6306    /// Parse the `REFERENCING` clause of a trigger.
6307    pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6308        let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6309            Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6310                TriggerReferencingType::OldTable
6311            }
6312            Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6313                TriggerReferencingType::NewTable
6314            }
6315            _ => {
6316                return Ok(None);
6317            }
6318        };
6319
6320        let is_as = self.parse_keyword(Keyword::AS);
6321        let transition_relation_name = self.parse_object_name(false)?;
6322        Ok(Some(TriggerReferencing {
6323            refer_type,
6324            is_as,
6325            transition_relation_name,
6326        }))
6327    }
6328
6329    /// Parse the execution body of a trigger (`FUNCTION` or `PROCEDURE`).
6330    pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6331        Ok(TriggerExecBody {
6332            exec_type: match self
6333                .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6334            {
6335                Keyword::FUNCTION => TriggerExecBodyType::Function,
6336                Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6337                unexpected_keyword => return Err(ParserError::ParserError(
6338                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6339                )),
6340            },
6341            func_desc: self.parse_function_desc()?,
6342        })
6343    }
6344
6345    /// Parse a `CREATE MACRO` statement.
6346    pub fn parse_create_macro(
6347        &mut self,
6348        or_replace: bool,
6349        temporary: bool,
6350    ) -> Result<Statement, ParserError> {
6351        if dialect_of!(self is DuckDbDialect |  GenericDialect) {
6352            let name = self.parse_object_name(false)?;
6353            self.expect_token(&Token::LParen)?;
6354            let args = if self.consume_token(&Token::RParen) {
6355                self.prev_token();
6356                None
6357            } else {
6358                Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6359            };
6360
6361            self.expect_token(&Token::RParen)?;
6362            self.expect_keyword_is(Keyword::AS)?;
6363
6364            Ok(Statement::CreateMacro {
6365                or_replace,
6366                temporary,
6367                name,
6368                args,
6369                definition: if self.parse_keyword(Keyword::TABLE) {
6370                    MacroDefinition::Table(self.parse_query()?)
6371                } else {
6372                    MacroDefinition::Expr(self.parse_expr()?)
6373                },
6374            })
6375        } else {
6376            self.prev_token();
6377            self.expected_ref("an object type after CREATE", self.peek_token_ref())
6378        }
6379    }
6380
6381    fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6382        let name = self.parse_identifier()?;
6383
6384        let default_expr =
6385            if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6386                Some(self.parse_expr()?)
6387            } else {
6388                None
6389            };
6390        Ok(MacroArg { name, default_expr })
6391    }
6392
6393    /// Parse a `CREATE EXTERNAL TABLE` statement.
6394    pub fn parse_create_external_table(
6395        &mut self,
6396        or_replace: bool,
6397    ) -> Result<CreateTable, ParserError> {
6398        self.expect_keyword_is(Keyword::TABLE)?;
6399        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6400        let table_name = self.parse_object_name(false)?;
6401        let (columns, constraints) = self.parse_columns()?;
6402
6403        let hive_distribution = self.parse_hive_distribution()?;
6404        let hive_formats = self.parse_hive_formats()?;
6405
6406        let file_format = if let Some(ref hf) = hive_formats {
6407            if let Some(ref ff) = hf.storage {
6408                match ff {
6409                    HiveIOFormat::FileFormat { format } => Some(*format),
6410                    _ => None,
6411                }
6412            } else {
6413                None
6414            }
6415        } else {
6416            None
6417        };
6418        let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6419        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6420        let table_options = if !table_properties.is_empty() {
6421            CreateTableOptions::TableProperties(table_properties)
6422        } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6423            CreateTableOptions::Options(options)
6424        } else {
6425            CreateTableOptions::None
6426        };
6427        Ok(CreateTableBuilder::new(table_name)
6428            .columns(columns)
6429            .constraints(constraints)
6430            .hive_distribution(hive_distribution)
6431            .hive_formats(hive_formats)
6432            .table_options(table_options)
6433            .or_replace(or_replace)
6434            .if_not_exists(if_not_exists)
6435            .external(true)
6436            .file_format(file_format)
6437            .location(location)
6438            .build())
6439    }
6440
6441    /// Parse `CREATE SNAPSHOT TABLE` statement.
6442    ///
6443    /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_snapshot_table_statement>
6444    pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6445        self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6446        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6447        let table_name = self.parse_object_name(true)?;
6448
6449        self.expect_keyword_is(Keyword::CLONE)?;
6450        let clone = Some(self.parse_object_name(true)?);
6451
6452        let version =
6453            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6454            {
6455                Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6456            } else {
6457                None
6458            };
6459
6460        let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6461            CreateTableOptions::Options(options)
6462        } else {
6463            CreateTableOptions::None
6464        };
6465
6466        Ok(CreateTableBuilder::new(table_name)
6467            .snapshot(true)
6468            .if_not_exists(if_not_exists)
6469            .clone_clause(clone)
6470            .version(version)
6471            .table_options(table_options)
6472            .build())
6473    }
6474
6475    /// Parse a file format for external tables.
6476    pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6477        let next_token = self.next_token();
6478        match &next_token.token {
6479            Token::Word(w) => match w.keyword {
6480                Keyword::AVRO => Ok(FileFormat::AVRO),
6481                Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6482                Keyword::ORC => Ok(FileFormat::ORC),
6483                Keyword::PARQUET => Ok(FileFormat::PARQUET),
6484                Keyword::RCFILE => Ok(FileFormat::RCFILE),
6485                Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6486                Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6487                _ => self.expected("fileformat", next_token),
6488            },
6489            _ => self.expected("fileformat", next_token),
6490        }
6491    }
6492
6493    fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6494        if self.consume_token(&Token::Eq) {
6495            Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6496        } else {
6497            Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6498        }
6499    }
6500
6501    /// Parse an `ANALYZE FORMAT`.
6502    pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6503        let next_token = self.next_token();
6504        match &next_token.token {
6505            Token::Word(w) => match w.keyword {
6506                Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6507                Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6508                Keyword::JSON => Ok(AnalyzeFormat::JSON),
6509                Keyword::TREE => Ok(AnalyzeFormat::TREE),
6510                _ => self.expected("fileformat", next_token),
6511            },
6512            _ => self.expected("fileformat", next_token),
6513        }
6514    }
6515
6516    /// Parse a `CREATE VIEW` statement.
6517    pub fn parse_create_view(
6518        &mut self,
6519        or_alter: bool,
6520        or_replace: bool,
6521        temporary: bool,
6522        create_view_params: Option<CreateViewParams>,
6523    ) -> Result<CreateView, ParserError> {
6524        let secure = self.parse_keyword(Keyword::SECURE);
6525        let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6526        self.expect_keyword_is(Keyword::VIEW)?;
6527        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6528        // Tries to parse IF NOT EXISTS either before name or after name
6529        // Name before IF NOT EXISTS is supported by snowflake but undocumented
6530        let if_not_exists_first =
6531            self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6532        let name = self.parse_object_name(allow_unquoted_hyphen)?;
6533        let name_before_not_exists = !if_not_exists_first
6534            && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6535        let if_not_exists = if_not_exists_first || name_before_not_exists;
6536        let copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6537        // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
6538        // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
6539        let columns = self.parse_view_columns()?;
6540        let mut options = CreateTableOptions::None;
6541        let with_options = self.parse_options(Keyword::WITH)?;
6542        if !with_options.is_empty() {
6543            options = CreateTableOptions::With(with_options);
6544        }
6545
6546        let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6547            self.expect_keyword_is(Keyword::BY)?;
6548            self.parse_parenthesized_column_list(Optional, false)?
6549        } else {
6550            vec![]
6551        };
6552
6553        if dialect_of!(self is BigQueryDialect | GenericDialect) {
6554            if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6555                if !opts.is_empty() {
6556                    options = CreateTableOptions::Options(opts);
6557                }
6558            };
6559        }
6560
6561        let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6562            && self.parse_keyword(Keyword::TO)
6563        {
6564            Some(self.parse_object_name(false)?)
6565        } else {
6566            None
6567        };
6568
6569        let comment = if self.dialect.supports_create_view_comment_syntax()
6570            && self.parse_keyword(Keyword::COMMENT)
6571        {
6572            self.expect_token(&Token::Eq)?;
6573            Some(self.parse_comment_value()?)
6574        } else {
6575            None
6576        };
6577
6578        self.expect_keyword_is(Keyword::AS)?;
6579        let query = self.parse_query()?;
6580        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
6581
6582        let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6583            && self.parse_keywords(&[
6584                Keyword::WITH,
6585                Keyword::NO,
6586                Keyword::SCHEMA,
6587                Keyword::BINDING,
6588            ]);
6589
6590        Ok(CreateView {
6591            or_alter,
6592            name,
6593            columns,
6594            query,
6595            materialized,
6596            secure,
6597            or_replace,
6598            options,
6599            cluster_by,
6600            comment,
6601            with_no_schema_binding,
6602            if_not_exists,
6603            temporary,
6604            copy_grants,
6605            to,
6606            params: create_view_params,
6607            name_before_not_exists,
6608        })
6609    }
6610
6611    /// Parse optional parameters for the `CREATE VIEW` statement supported by [MySQL].
6612    ///
6613    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/create-view.html
6614    fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6615        let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6616            self.expect_token(&Token::Eq)?;
6617            Some(
6618                match self.expect_one_of_keywords(&[
6619                    Keyword::UNDEFINED,
6620                    Keyword::MERGE,
6621                    Keyword::TEMPTABLE,
6622                ])? {
6623                    Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6624                    Keyword::MERGE => CreateViewAlgorithm::Merge,
6625                    Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6626                    _ => {
6627                        self.prev_token();
6628                        let found = self.next_token();
6629                        return self
6630                            .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6631                    }
6632                },
6633            )
6634        } else {
6635            None
6636        };
6637        let definer = if self.parse_keyword(Keyword::DEFINER) {
6638            self.expect_token(&Token::Eq)?;
6639            Some(self.parse_grantee_name()?)
6640        } else {
6641            None
6642        };
6643        let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6644            Some(
6645                match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6646                    Keyword::DEFINER => CreateViewSecurity::Definer,
6647                    Keyword::INVOKER => CreateViewSecurity::Invoker,
6648                    _ => {
6649                        self.prev_token();
6650                        let found = self.next_token();
6651                        return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6652                    }
6653                },
6654            )
6655        } else {
6656            None
6657        };
6658        if algorithm.is_some() || definer.is_some() || security.is_some() {
6659            Ok(Some(CreateViewParams {
6660                algorithm,
6661                definer,
6662                security,
6663            }))
6664        } else {
6665            Ok(None)
6666        }
6667    }
6668
6669    /// Parse a `CREATE ROLE` statement.
6670    pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6671        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6672        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6673
6674        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
6675
6676        let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6677            vec![Keyword::AUTHORIZATION]
6678        } else if dialect_of!(self is PostgreSqlDialect) {
6679            vec![
6680                Keyword::LOGIN,
6681                Keyword::NOLOGIN,
6682                Keyword::INHERIT,
6683                Keyword::NOINHERIT,
6684                Keyword::BYPASSRLS,
6685                Keyword::NOBYPASSRLS,
6686                Keyword::PASSWORD,
6687                Keyword::CREATEDB,
6688                Keyword::NOCREATEDB,
6689                Keyword::CREATEROLE,
6690                Keyword::NOCREATEROLE,
6691                Keyword::SUPERUSER,
6692                Keyword::NOSUPERUSER,
6693                Keyword::REPLICATION,
6694                Keyword::NOREPLICATION,
6695                Keyword::CONNECTION,
6696                Keyword::VALID,
6697                Keyword::IN,
6698                Keyword::ROLE,
6699                Keyword::ADMIN,
6700                Keyword::USER,
6701            ]
6702        } else {
6703            vec![]
6704        };
6705
6706        // MSSQL
6707        let mut authorization_owner = None;
6708        // Postgres
6709        let mut login = None;
6710        let mut inherit = None;
6711        let mut bypassrls = None;
6712        let mut password = None;
6713        let mut create_db = None;
6714        let mut create_role = None;
6715        let mut superuser = None;
6716        let mut replication = None;
6717        let mut connection_limit = None;
6718        let mut valid_until = None;
6719        let mut in_role = vec![];
6720        let mut in_group = vec![];
6721        let mut role = vec![];
6722        let mut user = vec![];
6723        let mut admin = vec![];
6724
6725        while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6726            let loc = self
6727                .tokens
6728                .get(self.index - 1)
6729                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6730            match keyword {
6731                Keyword::AUTHORIZATION => {
6732                    if authorization_owner.is_some() {
6733                        parser_err!("Found multiple AUTHORIZATION", loc)
6734                    } else {
6735                        authorization_owner = Some(self.parse_object_name(false)?);
6736                        Ok(())
6737                    }
6738                }
6739                Keyword::LOGIN | Keyword::NOLOGIN => {
6740                    if login.is_some() {
6741                        parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6742                    } else {
6743                        login = Some(keyword == Keyword::LOGIN);
6744                        Ok(())
6745                    }
6746                }
6747                Keyword::INHERIT | Keyword::NOINHERIT => {
6748                    if inherit.is_some() {
6749                        parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6750                    } else {
6751                        inherit = Some(keyword == Keyword::INHERIT);
6752                        Ok(())
6753                    }
6754                }
6755                Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6756                    if bypassrls.is_some() {
6757                        parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6758                    } else {
6759                        bypassrls = Some(keyword == Keyword::BYPASSRLS);
6760                        Ok(())
6761                    }
6762                }
6763                Keyword::CREATEDB | Keyword::NOCREATEDB => {
6764                    if create_db.is_some() {
6765                        parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6766                    } else {
6767                        create_db = Some(keyword == Keyword::CREATEDB);
6768                        Ok(())
6769                    }
6770                }
6771                Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6772                    if create_role.is_some() {
6773                        parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6774                    } else {
6775                        create_role = Some(keyword == Keyword::CREATEROLE);
6776                        Ok(())
6777                    }
6778                }
6779                Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6780                    if superuser.is_some() {
6781                        parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6782                    } else {
6783                        superuser = Some(keyword == Keyword::SUPERUSER);
6784                        Ok(())
6785                    }
6786                }
6787                Keyword::REPLICATION | Keyword::NOREPLICATION => {
6788                    if replication.is_some() {
6789                        parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6790                    } else {
6791                        replication = Some(keyword == Keyword::REPLICATION);
6792                        Ok(())
6793                    }
6794                }
6795                Keyword::PASSWORD => {
6796                    if password.is_some() {
6797                        parser_err!("Found multiple PASSWORD", loc)
6798                    } else {
6799                        password = if self.parse_keyword(Keyword::NULL) {
6800                            Some(Password::NullPassword)
6801                        } else {
6802                            Some(Password::Password(Expr::Value(self.parse_value()?)))
6803                        };
6804                        Ok(())
6805                    }
6806                }
6807                Keyword::CONNECTION => {
6808                    self.expect_keyword_is(Keyword::LIMIT)?;
6809                    if connection_limit.is_some() {
6810                        parser_err!("Found multiple CONNECTION LIMIT", loc)
6811                    } else {
6812                        connection_limit = Some(Expr::Value(self.parse_number_value()?));
6813                        Ok(())
6814                    }
6815                }
6816                Keyword::VALID => {
6817                    self.expect_keyword_is(Keyword::UNTIL)?;
6818                    if valid_until.is_some() {
6819                        parser_err!("Found multiple VALID UNTIL", loc)
6820                    } else {
6821                        valid_until = Some(Expr::Value(self.parse_value()?));
6822                        Ok(())
6823                    }
6824                }
6825                Keyword::IN => {
6826                    if self.parse_keyword(Keyword::ROLE) {
6827                        if !in_role.is_empty() {
6828                            parser_err!("Found multiple IN ROLE", loc)
6829                        } else {
6830                            in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
6831                            Ok(())
6832                        }
6833                    } else if self.parse_keyword(Keyword::GROUP) {
6834                        if !in_group.is_empty() {
6835                            parser_err!("Found multiple IN GROUP", loc)
6836                        } else {
6837                            in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
6838                            Ok(())
6839                        }
6840                    } else {
6841                        self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
6842                    }
6843                }
6844                Keyword::ROLE => {
6845                    if !role.is_empty() {
6846                        parser_err!("Found multiple ROLE", loc)
6847                    } else {
6848                        role = self.parse_comma_separated(|p| p.parse_identifier())?;
6849                        Ok(())
6850                    }
6851                }
6852                Keyword::USER => {
6853                    if !user.is_empty() {
6854                        parser_err!("Found multiple USER", loc)
6855                    } else {
6856                        user = self.parse_comma_separated(|p| p.parse_identifier())?;
6857                        Ok(())
6858                    }
6859                }
6860                Keyword::ADMIN => {
6861                    if !admin.is_empty() {
6862                        parser_err!("Found multiple ADMIN", loc)
6863                    } else {
6864                        admin = self.parse_comma_separated(|p| p.parse_identifier())?;
6865                        Ok(())
6866                    }
6867                }
6868                _ => break,
6869            }?
6870        }
6871
6872        Ok(CreateRole {
6873            names,
6874            if_not_exists,
6875            login,
6876            inherit,
6877            bypassrls,
6878            password,
6879            create_db,
6880            create_role,
6881            replication,
6882            superuser,
6883            connection_limit,
6884            valid_until,
6885            in_role,
6886            in_group,
6887            role,
6888            user,
6889            admin,
6890            authorization_owner,
6891        })
6892    }
6893
6894    /// Parse an `OWNER` clause.
6895    pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
6896        let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
6897            Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
6898            Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
6899            Some(Keyword::SESSION_USER) => Owner::SessionUser,
6900            Some(unexpected_keyword) => return Err(ParserError::ParserError(
6901                format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
6902            )),
6903            None => {
6904                match self.parse_identifier() {
6905                    Ok(ident) => Owner::Ident(ident),
6906                    Err(e) => {
6907                        return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
6908                    }
6909                }
6910            }
6911        };
6912        Ok(owner)
6913    }
6914
6915    /// Parses a [Statement::CreateDomain] statement.
6916    fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
6917        let name = self.parse_object_name(false)?;
6918        self.expect_keyword_is(Keyword::AS)?;
6919        let data_type = self.parse_data_type()?;
6920        let collation = if self.parse_keyword(Keyword::COLLATE) {
6921            Some(self.parse_identifier()?)
6922        } else {
6923            None
6924        };
6925        let default = if self.parse_keyword(Keyword::DEFAULT) {
6926            Some(self.parse_expr()?)
6927        } else {
6928            None
6929        };
6930        let mut constraints = Vec::new();
6931        while let Some(constraint) = self.parse_optional_table_constraint()? {
6932            constraints.push(constraint);
6933        }
6934
6935        Ok(CreateDomain {
6936            name,
6937            data_type,
6938            collation,
6939            default,
6940            constraints,
6941        })
6942    }
6943
6944    /// ```sql
6945    ///     CREATE POLICY name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ]
6946    ///     [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
6947    ///     [ TO { role_name | PUBLIC | CURRENT_USER | CURRENT_ROLE | SESSION_USER } [, ...] ]
6948    ///     [ USING ( using_expression ) ]
6949    ///     [ WITH CHECK ( with_check_expression ) ]
6950    /// ```
6951    ///
6952    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createpolicy.html)
6953    pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
6954        let name = self.parse_identifier()?;
6955        self.expect_keyword_is(Keyword::ON)?;
6956        let table_name = self.parse_object_name(false)?;
6957
6958        let policy_type = if self.parse_keyword(Keyword::AS) {
6959            let keyword =
6960                self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
6961            Some(match keyword {
6962                Keyword::PERMISSIVE => CreatePolicyType::Permissive,
6963                Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
6964                unexpected_keyword => return Err(ParserError::ParserError(
6965                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
6966                )),
6967            })
6968        } else {
6969            None
6970        };
6971
6972        let command = if self.parse_keyword(Keyword::FOR) {
6973            let keyword = self.expect_one_of_keywords(&[
6974                Keyword::ALL,
6975                Keyword::SELECT,
6976                Keyword::INSERT,
6977                Keyword::UPDATE,
6978                Keyword::DELETE,
6979            ])?;
6980            Some(match keyword {
6981                Keyword::ALL => CreatePolicyCommand::All,
6982                Keyword::SELECT => CreatePolicyCommand::Select,
6983                Keyword::INSERT => CreatePolicyCommand::Insert,
6984                Keyword::UPDATE => CreatePolicyCommand::Update,
6985                Keyword::DELETE => CreatePolicyCommand::Delete,
6986                unexpected_keyword => return Err(ParserError::ParserError(
6987                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
6988                )),
6989            })
6990        } else {
6991            None
6992        };
6993
6994        let to = if self.parse_keyword(Keyword::TO) {
6995            Some(self.parse_comma_separated(|p| p.parse_owner())?)
6996        } else {
6997            None
6998        };
6999
7000        let using = if self.parse_keyword(Keyword::USING) {
7001            self.expect_token(&Token::LParen)?;
7002            let expr = self.parse_expr()?;
7003            self.expect_token(&Token::RParen)?;
7004            Some(expr)
7005        } else {
7006            None
7007        };
7008
7009        let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7010            self.expect_token(&Token::LParen)?;
7011            let expr = self.parse_expr()?;
7012            self.expect_token(&Token::RParen)?;
7013            Some(expr)
7014        } else {
7015            None
7016        };
7017
7018        Ok(CreatePolicy {
7019            name,
7020            table_name,
7021            policy_type,
7022            command,
7023            to,
7024            using,
7025            with_check,
7026        })
7027    }
7028
7029    /// ```sql
7030    /// CREATE CONNECTOR [IF NOT EXISTS] connector_name
7031    /// [TYPE datasource_type]
7032    /// [URL datasource_url]
7033    /// [COMMENT connector_comment]
7034    /// [WITH DCPROPERTIES(property_name=property_value, ...)]
7035    /// ```
7036    ///
7037    /// [Hive Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
7038    pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7039        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7040        let name = self.parse_identifier()?;
7041
7042        let connector_type = if self.parse_keyword(Keyword::TYPE) {
7043            Some(self.parse_literal_string()?)
7044        } else {
7045            None
7046        };
7047
7048        let url = if self.parse_keyword(Keyword::URL) {
7049            Some(self.parse_literal_string()?)
7050        } else {
7051            None
7052        };
7053
7054        let comment = self.parse_optional_inline_comment()?;
7055
7056        let with_dcproperties =
7057            match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7058                properties if !properties.is_empty() => Some(properties),
7059                _ => None,
7060            };
7061
7062        Ok(CreateConnector {
7063            name,
7064            if_not_exists,
7065            connector_type,
7066            url,
7067            comment,
7068            with_dcproperties,
7069        })
7070    }
7071
7072    /// Parse an operator name, which can contain special characters like +, -, <, >, =
7073    /// that are tokenized as operator tokens rather than identifiers.
7074    /// This is used for PostgreSQL CREATE OPERATOR statements.
7075    ///
7076    /// Examples: `+`, `myschema.+`, `pg_catalog.<=`
7077    fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7078        let mut parts = vec![];
7079        loop {
7080            parts.push(ObjectNamePart::Identifier(Ident::new(
7081                self.next_token().to_string(),
7082            )));
7083            if !self.consume_token(&Token::Period) {
7084                break;
7085            }
7086        }
7087        Ok(ObjectName(parts))
7088    }
7089
7090    /// Parse a [Statement::CreateOperator]
7091    ///
7092    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createoperator.html)
7093    pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7094        let name = self.parse_operator_name()?;
7095        self.expect_token(&Token::LParen)?;
7096
7097        let mut function: Option<ObjectName> = None;
7098        let mut is_procedure = false;
7099        let mut left_arg: Option<DataType> = None;
7100        let mut right_arg: Option<DataType> = None;
7101        let mut options: Vec<OperatorOption> = Vec::new();
7102
7103        loop {
7104            let keyword = self.expect_one_of_keywords(&[
7105                Keyword::FUNCTION,
7106                Keyword::PROCEDURE,
7107                Keyword::LEFTARG,
7108                Keyword::RIGHTARG,
7109                Keyword::COMMUTATOR,
7110                Keyword::NEGATOR,
7111                Keyword::RESTRICT,
7112                Keyword::JOIN,
7113                Keyword::HASHES,
7114                Keyword::MERGES,
7115            ])?;
7116
7117            match keyword {
7118                Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7119                    options.push(OperatorOption::Hashes);
7120                }
7121                Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7122                    options.push(OperatorOption::Merges);
7123                }
7124                Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7125                    self.expect_token(&Token::Eq)?;
7126                    function = Some(self.parse_object_name(false)?);
7127                    is_procedure = keyword == Keyword::PROCEDURE;
7128                }
7129                Keyword::LEFTARG if left_arg.is_none() => {
7130                    self.expect_token(&Token::Eq)?;
7131                    left_arg = Some(self.parse_data_type()?);
7132                }
7133                Keyword::RIGHTARG if right_arg.is_none() => {
7134                    self.expect_token(&Token::Eq)?;
7135                    right_arg = Some(self.parse_data_type()?);
7136                }
7137                Keyword::COMMUTATOR
7138                    if !options
7139                        .iter()
7140                        .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7141                {
7142                    self.expect_token(&Token::Eq)?;
7143                    if self.parse_keyword(Keyword::OPERATOR) {
7144                        self.expect_token(&Token::LParen)?;
7145                        let op = self.parse_operator_name()?;
7146                        self.expect_token(&Token::RParen)?;
7147                        options.push(OperatorOption::Commutator(op));
7148                    } else {
7149                        options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7150                    }
7151                }
7152                Keyword::NEGATOR
7153                    if !options
7154                        .iter()
7155                        .any(|o| matches!(o, OperatorOption::Negator(_))) =>
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::Negator(op));
7163                    } else {
7164                        options.push(OperatorOption::Negator(self.parse_operator_name()?));
7165                    }
7166                }
7167                Keyword::RESTRICT
7168                    if !options
7169                        .iter()
7170                        .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7171                {
7172                    self.expect_token(&Token::Eq)?;
7173                    options.push(OperatorOption::Restrict(Some(
7174                        self.parse_object_name(false)?,
7175                    )));
7176                }
7177                Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7178                    self.expect_token(&Token::Eq)?;
7179                    options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7180                }
7181                _ => {
7182                    return Err(ParserError::ParserError(format!(
7183                        "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7184                        keyword
7185                    )))
7186                }
7187            }
7188
7189            if !self.consume_token(&Token::Comma) {
7190                break;
7191            }
7192        }
7193
7194        // Expect closing parenthesis
7195        self.expect_token(&Token::RParen)?;
7196
7197        // FUNCTION is required
7198        let function = function.ok_or_else(|| {
7199            ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7200        })?;
7201
7202        Ok(CreateOperator {
7203            name,
7204            function,
7205            is_procedure,
7206            left_arg,
7207            right_arg,
7208            options,
7209        })
7210    }
7211
7212    /// Parse a [Statement::CreateOperatorFamily]
7213    ///
7214    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopfamily.html)
7215    pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7216        let name = self.parse_object_name(false)?;
7217        self.expect_keyword(Keyword::USING)?;
7218        let using = self.parse_identifier()?;
7219
7220        Ok(CreateOperatorFamily { name, using })
7221    }
7222
7223    /// Parse a [Statement::CreateOperatorClass]
7224    ///
7225    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopclass.html)
7226    pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7227        let name = self.parse_object_name(false)?;
7228        let default = self.parse_keyword(Keyword::DEFAULT);
7229        self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7230        let for_type = self.parse_data_type()?;
7231        self.expect_keyword(Keyword::USING)?;
7232        let using = self.parse_identifier()?;
7233
7234        let family = if self.parse_keyword(Keyword::FAMILY) {
7235            Some(self.parse_object_name(false)?)
7236        } else {
7237            None
7238        };
7239
7240        self.expect_keyword(Keyword::AS)?;
7241
7242        let mut items = vec![];
7243        loop {
7244            if self.parse_keyword(Keyword::OPERATOR) {
7245                let strategy_number = self.parse_literal_uint()?;
7246                let operator_name = self.parse_operator_name()?;
7247
7248                // Optional operator argument types
7249                let op_types = if self.consume_token(&Token::LParen) {
7250                    let left = self.parse_data_type()?;
7251                    self.expect_token(&Token::Comma)?;
7252                    let right = self.parse_data_type()?;
7253                    self.expect_token(&Token::RParen)?;
7254                    Some(OperatorArgTypes { left, right })
7255                } else {
7256                    None
7257                };
7258
7259                // Optional purpose
7260                let purpose = if self.parse_keyword(Keyword::FOR) {
7261                    if self.parse_keyword(Keyword::SEARCH) {
7262                        Some(OperatorPurpose::ForSearch)
7263                    } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7264                        let sort_family = self.parse_object_name(false)?;
7265                        Some(OperatorPurpose::ForOrderBy { sort_family })
7266                    } else {
7267                        return self
7268                            .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7269                    }
7270                } else {
7271                    None
7272                };
7273
7274                items.push(OperatorClassItem::Operator {
7275                    strategy_number,
7276                    operator_name,
7277                    op_types,
7278                    purpose,
7279                });
7280            } else if self.parse_keyword(Keyword::FUNCTION) {
7281                let support_number = self.parse_literal_uint()?;
7282
7283                // Optional operator types
7284                let op_types = if self.consume_token(&Token::LParen)
7285                    && self.peek_token_ref().token != Token::RParen
7286                {
7287                    let mut types = vec![];
7288                    loop {
7289                        types.push(self.parse_data_type()?);
7290                        if !self.consume_token(&Token::Comma) {
7291                            break;
7292                        }
7293                    }
7294                    self.expect_token(&Token::RParen)?;
7295                    Some(types)
7296                } else if self.consume_token(&Token::LParen) {
7297                    self.expect_token(&Token::RParen)?;
7298                    Some(vec![])
7299                } else {
7300                    None
7301                };
7302
7303                let function_name = self.parse_object_name(false)?;
7304
7305                // Function argument types
7306                let argument_types = if self.consume_token(&Token::LParen) {
7307                    let mut types = vec![];
7308                    loop {
7309                        if self.peek_token_ref().token == Token::RParen {
7310                            break;
7311                        }
7312                        types.push(self.parse_data_type()?);
7313                        if !self.consume_token(&Token::Comma) {
7314                            break;
7315                        }
7316                    }
7317                    self.expect_token(&Token::RParen)?;
7318                    types
7319                } else {
7320                    vec![]
7321                };
7322
7323                items.push(OperatorClassItem::Function {
7324                    support_number,
7325                    op_types,
7326                    function_name,
7327                    argument_types,
7328                });
7329            } else if self.parse_keyword(Keyword::STORAGE) {
7330                let storage_type = self.parse_data_type()?;
7331                items.push(OperatorClassItem::Storage { storage_type });
7332            } else {
7333                break;
7334            }
7335
7336            // Check for comma separator
7337            if !self.consume_token(&Token::Comma) {
7338                break;
7339            }
7340        }
7341
7342        Ok(CreateOperatorClass {
7343            name,
7344            default,
7345            for_type,
7346            using,
7347            family,
7348            items,
7349        })
7350    }
7351
7352    /// Parse a `DROP` statement.
7353    pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7354        // MySQL dialect supports `TEMPORARY`
7355        let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7356            && self.parse_keyword(Keyword::TEMPORARY);
7357        let persistent = dialect_of!(self is DuckDbDialect)
7358            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7359
7360        let object_type = if self.parse_keyword(Keyword::TABLE) {
7361            ObjectType::Table
7362        } else if self.parse_keyword(Keyword::COLLATION) {
7363            ObjectType::Collation
7364        } else if self.parse_keyword(Keyword::VIEW) {
7365            ObjectType::View
7366        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7367            ObjectType::MaterializedView
7368        } else if self.parse_keyword(Keyword::INDEX) {
7369            ObjectType::Index
7370        } else if self.parse_keyword(Keyword::ROLE) {
7371            ObjectType::Role
7372        } else if self.parse_keyword(Keyword::SCHEMA) {
7373            ObjectType::Schema
7374        } else if self.parse_keyword(Keyword::DATABASE) {
7375            ObjectType::Database
7376        } else if self.parse_keyword(Keyword::SEQUENCE) {
7377            ObjectType::Sequence
7378        } else if self.parse_keyword(Keyword::STAGE) {
7379            ObjectType::Stage
7380        } else if self.parse_keyword(Keyword::TYPE) {
7381            ObjectType::Type
7382        } else if self.parse_keyword(Keyword::USER) {
7383            ObjectType::User
7384        } else if self.parse_keyword(Keyword::STREAM) {
7385            ObjectType::Stream
7386        } else if self.parse_keyword(Keyword::FUNCTION) {
7387            return self.parse_drop_function().map(Into::into);
7388        } else if self.parse_keyword(Keyword::POLICY) {
7389            return self.parse_drop_policy().map(Into::into);
7390        } else if self.parse_keyword(Keyword::CONNECTOR) {
7391            return self.parse_drop_connector();
7392        } else if self.parse_keyword(Keyword::DOMAIN) {
7393            return self.parse_drop_domain().map(Into::into);
7394        } else if self.parse_keyword(Keyword::PROCEDURE) {
7395            return self.parse_drop_procedure();
7396        } else if self.parse_keyword(Keyword::SECRET) {
7397            return self.parse_drop_secret(temporary, persistent);
7398        } else if self.parse_keyword(Keyword::TRIGGER) {
7399            return self.parse_drop_trigger().map(Into::into);
7400        } else if self.parse_keyword(Keyword::EXTENSION) {
7401            return self.parse_drop_extension();
7402        } else if self.parse_keyword(Keyword::OPERATOR) {
7403            // Check if this is DROP OPERATOR FAMILY or DROP OPERATOR CLASS
7404            return if self.parse_keyword(Keyword::FAMILY) {
7405                self.parse_drop_operator_family()
7406            } else if self.parse_keyword(Keyword::CLASS) {
7407                self.parse_drop_operator_class()
7408            } else {
7409                self.parse_drop_operator()
7410            };
7411        } else {
7412            return self.expected_ref(
7413                "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7414                self.peek_token_ref(),
7415            );
7416        };
7417        // Many dialects support the non-standard `IF EXISTS` clause and allow
7418        // specifying multiple objects to delete in a single statement
7419        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7420        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7421
7422        let loc = self.peek_token_ref().span.start;
7423        let cascade = self.parse_keyword(Keyword::CASCADE);
7424        let restrict = self.parse_keyword(Keyword::RESTRICT);
7425        let purge = self.parse_keyword(Keyword::PURGE);
7426        if cascade && restrict {
7427            return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7428        }
7429        if object_type == ObjectType::Role && (cascade || restrict || purge) {
7430            return parser_err!(
7431                "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7432                loc
7433            );
7434        }
7435        let table = if self.parse_keyword(Keyword::ON) {
7436            Some(self.parse_object_name(false)?)
7437        } else {
7438            None
7439        };
7440        Ok(Statement::Drop {
7441            object_type,
7442            if_exists,
7443            names,
7444            cascade,
7445            restrict,
7446            purge,
7447            temporary,
7448            table,
7449        })
7450    }
7451
7452    fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7453        match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7454            Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7455            Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7456            _ => None,
7457        }
7458    }
7459
7460    /// ```sql
7461    /// DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7462    /// [ CASCADE | RESTRICT ]
7463    /// ```
7464    fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7465        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7466        let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7467        let drop_behavior = self.parse_optional_drop_behavior();
7468        Ok(DropFunction {
7469            if_exists,
7470            func_desc,
7471            drop_behavior,
7472        })
7473    }
7474
7475    /// ```sql
7476    /// DROP POLICY [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
7477    /// ```
7478    ///
7479    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-droppolicy.html)
7480    fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7481        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7482        let name = self.parse_identifier()?;
7483        self.expect_keyword_is(Keyword::ON)?;
7484        let table_name = self.parse_object_name(false)?;
7485        let drop_behavior = self.parse_optional_drop_behavior();
7486        Ok(DropPolicy {
7487            if_exists,
7488            name,
7489            table_name,
7490            drop_behavior,
7491        })
7492    }
7493    /// ```sql
7494    /// DROP CONNECTOR [IF EXISTS] name
7495    /// ```
7496    ///
7497    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-DropConnector)
7498    fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7499        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7500        let name = self.parse_identifier()?;
7501        Ok(Statement::DropConnector { if_exists, name })
7502    }
7503
7504    /// ```sql
7505    /// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
7506    /// ```
7507    fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7508        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7509        let name = self.parse_object_name(false)?;
7510        let drop_behavior = self.parse_optional_drop_behavior();
7511        Ok(DropDomain {
7512            if_exists,
7513            name,
7514            drop_behavior,
7515        })
7516    }
7517
7518    /// ```sql
7519    /// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7520    /// [ CASCADE | RESTRICT ]
7521    /// ```
7522    fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7523        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7524        let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7525        let drop_behavior = self.parse_optional_drop_behavior();
7526        Ok(Statement::DropProcedure {
7527            if_exists,
7528            proc_desc,
7529            drop_behavior,
7530        })
7531    }
7532
7533    fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7534        let name = self.parse_object_name(false)?;
7535
7536        let args = if self.consume_token(&Token::LParen) {
7537            if self.consume_token(&Token::RParen) {
7538                Some(vec![])
7539            } else {
7540                let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7541                self.expect_token(&Token::RParen)?;
7542                Some(args)
7543            }
7544        } else {
7545            None
7546        };
7547
7548        Ok(FunctionDesc { name, args })
7549    }
7550
7551    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
7552    fn parse_drop_secret(
7553        &mut self,
7554        temporary: bool,
7555        persistent: bool,
7556    ) -> Result<Statement, ParserError> {
7557        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7558        let name = self.parse_identifier()?;
7559        let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7560            self.parse_identifier().ok()
7561        } else {
7562            None
7563        };
7564        let temp = match (temporary, persistent) {
7565            (true, false) => Some(true),
7566            (false, true) => Some(false),
7567            (false, false) => None,
7568            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7569        };
7570
7571        Ok(Statement::DropSecret {
7572            if_exists,
7573            temporary: temp,
7574            name,
7575            storage_specifier,
7576        })
7577    }
7578
7579    /// Parse a `DECLARE` statement.
7580    ///
7581    /// ```sql
7582    /// DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
7583    ///     CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
7584    /// ```
7585    ///
7586    /// The syntax can vary significantly between warehouses. See the grammar
7587    /// on the warehouse specific function in such cases.
7588    pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7589        if dialect_of!(self is BigQueryDialect) {
7590            return self.parse_big_query_declare();
7591        }
7592        if dialect_of!(self is SnowflakeDialect) {
7593            return self.parse_snowflake_declare();
7594        }
7595        if dialect_of!(self is MsSqlDialect) {
7596            return self.parse_mssql_declare();
7597        }
7598
7599        let name = self.parse_identifier()?;
7600
7601        let binary = Some(self.parse_keyword(Keyword::BINARY));
7602        let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7603            Some(true)
7604        } else if self.parse_keyword(Keyword::ASENSITIVE) {
7605            Some(false)
7606        } else {
7607            None
7608        };
7609        let scroll = if self.parse_keyword(Keyword::SCROLL) {
7610            Some(true)
7611        } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7612            Some(false)
7613        } else {
7614            None
7615        };
7616
7617        self.expect_keyword_is(Keyword::CURSOR)?;
7618        let declare_type = Some(DeclareType::Cursor);
7619
7620        let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7621            Some(keyword) => {
7622                self.expect_keyword_is(Keyword::HOLD)?;
7623
7624                match keyword {
7625                    Keyword::WITH => Some(true),
7626                    Keyword::WITHOUT => Some(false),
7627                    unexpected_keyword => return Err(ParserError::ParserError(
7628                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7629                    )),
7630                }
7631            }
7632            None => None,
7633        };
7634
7635        self.expect_keyword_is(Keyword::FOR)?;
7636
7637        let query = Some(self.parse_query()?);
7638
7639        Ok(Statement::Declare {
7640            stmts: vec![Declare {
7641                names: vec![name],
7642                data_type: None,
7643                assignment: None,
7644                declare_type,
7645                binary,
7646                sensitive,
7647                scroll,
7648                hold,
7649                for_query: query,
7650            }],
7651        })
7652    }
7653
7654    /// Parse a [BigQuery] `DECLARE` statement.
7655    ///
7656    /// Syntax:
7657    /// ```text
7658    /// DECLARE variable_name[, ...] [{ <variable_type> | <DEFAULT expression> }];
7659    /// ```
7660    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#declare
7661    pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7662        let names = self.parse_comma_separated(Parser::parse_identifier)?;
7663
7664        let data_type = match &self.peek_token_ref().token {
7665            Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7666            _ => Some(self.parse_data_type()?),
7667        };
7668
7669        let expr = if data_type.is_some() {
7670            if self.parse_keyword(Keyword::DEFAULT) {
7671                Some(self.parse_expr()?)
7672            } else {
7673                None
7674            }
7675        } else {
7676            // If no variable type - default expression must be specified, per BQ docs.
7677            // i.e `DECLARE foo;` is invalid.
7678            self.expect_keyword_is(Keyword::DEFAULT)?;
7679            Some(self.parse_expr()?)
7680        };
7681
7682        Ok(Statement::Declare {
7683            stmts: vec![Declare {
7684                names,
7685                data_type,
7686                assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7687                declare_type: None,
7688                binary: None,
7689                sensitive: None,
7690                scroll: None,
7691                hold: None,
7692                for_query: None,
7693            }],
7694        })
7695    }
7696
7697    /// Parse a [Snowflake] `DECLARE` statement.
7698    ///
7699    /// Syntax:
7700    /// ```text
7701    /// DECLARE
7702    ///   [{ <variable_declaration>
7703    ///      | <cursor_declaration>
7704    ///      | <resultset_declaration>
7705    ///      | <exception_declaration> }; ... ]
7706    ///
7707    /// <variable_declaration>
7708    /// <variable_name> [<type>] [ { DEFAULT | := } <expression>]
7709    ///
7710    /// <cursor_declaration>
7711    /// <cursor_name> CURSOR FOR <query>
7712    ///
7713    /// <resultset_declaration>
7714    /// <resultset_name> RESULTSET [ { DEFAULT | := } ( <query> ) ] ;
7715    ///
7716    /// <exception_declaration>
7717    /// <exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
7718    /// ```
7719    ///
7720    /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare
7721    pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7722        let mut stmts = vec![];
7723        loop {
7724            let name = self.parse_identifier()?;
7725            let (declare_type, for_query, assigned_expr, data_type) =
7726                if self.parse_keyword(Keyword::CURSOR) {
7727                    self.expect_keyword_is(Keyword::FOR)?;
7728                    match &self.peek_token_ref().token {
7729                        Token::Word(w) if w.keyword == Keyword::SELECT => (
7730                            Some(DeclareType::Cursor),
7731                            Some(self.parse_query()?),
7732                            None,
7733                            None,
7734                        ),
7735                        _ => (
7736                            Some(DeclareType::Cursor),
7737                            None,
7738                            Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7739                            None,
7740                        ),
7741                    }
7742                } else if self.parse_keyword(Keyword::RESULTSET) {
7743                    let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7744                        self.parse_snowflake_variable_declaration_expression()?
7745                    } else {
7746                        // Nothing more to do. The statement has no further parameters.
7747                        None
7748                    };
7749
7750                    (Some(DeclareType::ResultSet), None, assigned_expr, None)
7751                } else if self.parse_keyword(Keyword::EXCEPTION) {
7752                    let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7753                        Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7754                    } else {
7755                        // Nothing more to do. The statement has no further parameters.
7756                        None
7757                    };
7758
7759                    (Some(DeclareType::Exception), None, assigned_expr, None)
7760                } else {
7761                    // Without an explicit keyword, the only valid option is variable declaration.
7762                    let (assigned_expr, data_type) = if let Some(assigned_expr) =
7763                        self.parse_snowflake_variable_declaration_expression()?
7764                    {
7765                        (Some(assigned_expr), None)
7766                    } else if let Token::Word(_) = &self.peek_token_ref().token {
7767                        let data_type = self.parse_data_type()?;
7768                        (
7769                            self.parse_snowflake_variable_declaration_expression()?,
7770                            Some(data_type),
7771                        )
7772                    } else {
7773                        (None, None)
7774                    };
7775                    (None, None, assigned_expr, data_type)
7776                };
7777            let stmt = Declare {
7778                names: vec![name],
7779                data_type,
7780                assignment: assigned_expr,
7781                declare_type,
7782                binary: None,
7783                sensitive: None,
7784                scroll: None,
7785                hold: None,
7786                for_query,
7787            };
7788
7789            stmts.push(stmt);
7790            if self.consume_token(&Token::SemiColon) {
7791                match &self.peek_token_ref().token {
7792                    Token::Word(w)
7793                        if ALL_KEYWORDS
7794                            .binary_search(&w.value.to_uppercase().as_str())
7795                            .is_err() =>
7796                    {
7797                        // Not a keyword - start of a new declaration.
7798                        continue;
7799                    }
7800                    _ => {
7801                        // Put back the semicolon, this is the end of the DECLARE statement.
7802                        self.prev_token();
7803                    }
7804                }
7805            }
7806
7807            break;
7808        }
7809
7810        Ok(Statement::Declare { stmts })
7811    }
7812
7813    /// Parse a [MsSql] `DECLARE` statement.
7814    ///
7815    /// Syntax:
7816    /// ```text
7817    /// DECLARE
7818    // {
7819    //   { @local_variable [AS] data_type [ = value ] }
7820    //   | { @cursor_variable_name CURSOR [ FOR ] }
7821    // } [ ,...n ]
7822    /// ```
7823    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
7824    pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
7825        let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
7826
7827        Ok(Statement::Declare { stmts })
7828    }
7829
7830    /// Parse the body of a [MsSql] `DECLARE`statement.
7831    ///
7832    /// Syntax:
7833    /// ```text
7834    // {
7835    //   { @local_variable [AS] data_type [ = value ] }
7836    //   | { @cursor_variable_name CURSOR [ FOR ]}
7837    // } [ ,...n ]
7838    /// ```
7839    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
7840    pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
7841        let name = {
7842            let ident = self.parse_identifier()?;
7843            if !ident.value.starts_with('@')
7844                && !matches!(
7845                    &self.peek_token_ref().token,
7846                    Token::Word(w) if w.keyword == Keyword::CURSOR
7847                )
7848            {
7849                Err(ParserError::TokenizerError(
7850                    "Invalid MsSql variable declaration.".to_string(),
7851                ))
7852            } else {
7853                Ok(ident)
7854            }
7855        }?;
7856
7857        let (declare_type, data_type) = match &self.peek_token_ref().token {
7858            Token::Word(w) => match w.keyword {
7859                Keyword::CURSOR => {
7860                    self.next_token();
7861                    (Some(DeclareType::Cursor), None)
7862                }
7863                Keyword::AS => {
7864                    self.next_token();
7865                    (None, Some(self.parse_data_type()?))
7866                }
7867                _ => (None, Some(self.parse_data_type()?)),
7868            },
7869            _ => (None, Some(self.parse_data_type()?)),
7870        };
7871
7872        let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
7873            self.next_token();
7874            let query = Some(self.parse_query()?);
7875            (query, None)
7876        } else {
7877            let assignment = self.parse_mssql_variable_declaration_expression()?;
7878            (None, assignment)
7879        };
7880
7881        Ok(Declare {
7882            names: vec![name],
7883            data_type,
7884            assignment,
7885            declare_type,
7886            binary: None,
7887            sensitive: None,
7888            scroll: None,
7889            hold: None,
7890            for_query,
7891        })
7892    }
7893
7894    /// Parses the assigned expression in a variable declaration.
7895    ///
7896    /// Syntax:
7897    /// ```text
7898    /// [ { DEFAULT | := } <expression>]
7899    /// ```
7900    /// <https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare#variable-declaration-syntax>
7901    pub fn parse_snowflake_variable_declaration_expression(
7902        &mut self,
7903    ) -> Result<Option<DeclareAssignment>, ParserError> {
7904        Ok(match &self.peek_token_ref().token {
7905            Token::Word(w) if w.keyword == Keyword::DEFAULT => {
7906                self.next_token(); // Skip `DEFAULT`
7907                Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
7908            }
7909            Token::Assignment => {
7910                self.next_token(); // Skip `:=`
7911                Some(DeclareAssignment::DuckAssignment(Box::new(
7912                    self.parse_expr()?,
7913                )))
7914            }
7915            _ => None,
7916        })
7917    }
7918
7919    /// Parses the assigned expression in a variable declaration.
7920    ///
7921    /// Syntax:
7922    /// ```text
7923    /// [ = <expression>]
7924    /// ```
7925    pub fn parse_mssql_variable_declaration_expression(
7926        &mut self,
7927    ) -> Result<Option<DeclareAssignment>, ParserError> {
7928        Ok(match &self.peek_token_ref().token {
7929            Token::Eq => {
7930                self.next_token(); // Skip `=`
7931                Some(DeclareAssignment::MsSqlAssignment(Box::new(
7932                    self.parse_expr()?,
7933                )))
7934            }
7935            _ => None,
7936        })
7937    }
7938
7939    /// Parse `FETCH [direction] { FROM | IN } cursor INTO target;` statement.
7940    pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
7941        let direction = if self.parse_keyword(Keyword::NEXT) {
7942            FetchDirection::Next
7943        } else if self.parse_keyword(Keyword::PRIOR) {
7944            FetchDirection::Prior
7945        } else if self.parse_keyword(Keyword::FIRST) {
7946            FetchDirection::First
7947        } else if self.parse_keyword(Keyword::LAST) {
7948            FetchDirection::Last
7949        } else if self.parse_keyword(Keyword::ABSOLUTE) {
7950            FetchDirection::Absolute {
7951                limit: self.parse_number_value()?,
7952            }
7953        } else if self.parse_keyword(Keyword::RELATIVE) {
7954            FetchDirection::Relative {
7955                limit: self.parse_number_value()?,
7956            }
7957        } else if self.parse_keyword(Keyword::FORWARD) {
7958            if self.parse_keyword(Keyword::ALL) {
7959                FetchDirection::ForwardAll
7960            } else {
7961                FetchDirection::Forward {
7962                    // TODO: Support optional
7963                    limit: Some(self.parse_number_value()?),
7964                }
7965            }
7966        } else if self.parse_keyword(Keyword::BACKWARD) {
7967            if self.parse_keyword(Keyword::ALL) {
7968                FetchDirection::BackwardAll
7969            } else {
7970                FetchDirection::Backward {
7971                    // TODO: Support optional
7972                    limit: Some(self.parse_number_value()?),
7973                }
7974            }
7975        } else if self.parse_keyword(Keyword::ALL) {
7976            FetchDirection::All
7977        } else {
7978            FetchDirection::Count {
7979                limit: self.parse_number_value()?,
7980            }
7981        };
7982
7983        let position = if self.peek_keyword(Keyword::FROM) {
7984            self.expect_keyword(Keyword::FROM)?;
7985            FetchPosition::From
7986        } else if self.peek_keyword(Keyword::IN) {
7987            self.expect_keyword(Keyword::IN)?;
7988            FetchPosition::In
7989        } else {
7990            return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
7991        };
7992
7993        let name = self.parse_identifier()?;
7994
7995        let into = if self.parse_keyword(Keyword::INTO) {
7996            Some(self.parse_object_name(false)?)
7997        } else {
7998            None
7999        };
8000
8001        Ok(Statement::Fetch {
8002            name,
8003            direction,
8004            position,
8005            into,
8006        })
8007    }
8008
8009    /// Parse a `DISCARD` statement.
8010    pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8011        let object_type = if self.parse_keyword(Keyword::ALL) {
8012            DiscardObject::ALL
8013        } else if self.parse_keyword(Keyword::PLANS) {
8014            DiscardObject::PLANS
8015        } else if self.parse_keyword(Keyword::SEQUENCES) {
8016            DiscardObject::SEQUENCES
8017        } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8018            DiscardObject::TEMP
8019        } else {
8020            return self.expected_ref(
8021                "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8022                self.peek_token_ref(),
8023            );
8024        };
8025        Ok(Statement::Discard { object_type })
8026    }
8027
8028    /// Parse a `CREATE INDEX` statement.
8029    pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8030        let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8031        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8032
8033        let mut using = None;
8034
8035        let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8036            let index_name = self.parse_object_name(false)?;
8037            // MySQL allows `USING index_type` either before or after `ON table_name`
8038            using = self.parse_optional_using_then_index_type()?;
8039            self.expect_keyword_is(Keyword::ON)?;
8040            Some(index_name)
8041        } else {
8042            None
8043        };
8044
8045        let table_name = self.parse_object_name(false)?;
8046
8047        // MySQL allows having two `USING` clauses.
8048        // In that case, the second clause overwrites the first.
8049        using = self.parse_optional_using_then_index_type()?.or(using);
8050
8051        let columns = self.parse_parenthesized_index_column_list()?;
8052
8053        let include = if self.parse_keyword(Keyword::INCLUDE) {
8054            self.expect_token(&Token::LParen)?;
8055            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8056            self.expect_token(&Token::RParen)?;
8057            columns
8058        } else {
8059            vec![]
8060        };
8061
8062        let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8063            let not = self.parse_keyword(Keyword::NOT);
8064            self.expect_keyword_is(Keyword::DISTINCT)?;
8065            Some(!not)
8066        } else {
8067            None
8068        };
8069
8070        let with = if self.dialect.supports_create_index_with_clause()
8071            && self.parse_keyword(Keyword::WITH)
8072        {
8073            self.expect_token(&Token::LParen)?;
8074            let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8075            self.expect_token(&Token::RParen)?;
8076            with_params
8077        } else {
8078            Vec::new()
8079        };
8080
8081        let predicate = if self.parse_keyword(Keyword::WHERE) {
8082            Some(self.parse_expr()?)
8083        } else {
8084            None
8085        };
8086
8087        // MySQL options (including the modern style of `USING` after the column list instead of
8088        // before, which is deprecated) shouldn't conflict with other preceding options (e.g. `WITH
8089        // PARSER` won't be caught by the above `WITH` clause parsing because MySQL doesn't set that
8090        // support flag). This is probably invalid syntax for other dialects, but it is simpler to
8091        // parse it anyway (as we do inside `ALTER TABLE` and `CREATE TABLE` parsing).
8092        let index_options = self.parse_index_options()?;
8093
8094        // MySQL allows `ALGORITHM` and `LOCK` options. Unlike in `ALTER TABLE`, they need not be comma separated.
8095        let mut alter_options = Vec::new();
8096        while self
8097            .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8098            .is_some()
8099        {
8100            alter_options.push(self.parse_alter_table_operation()?)
8101        }
8102
8103        Ok(CreateIndex {
8104            name: index_name,
8105            table_name,
8106            using,
8107            columns,
8108            unique,
8109            concurrently,
8110            if_not_exists,
8111            include,
8112            nulls_distinct,
8113            with,
8114            predicate,
8115            index_options,
8116            alter_options,
8117        })
8118    }
8119
8120    /// Parse a `CREATE EXTENSION` statement.
8121    pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8122        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8123        let name = self.parse_identifier()?;
8124
8125        let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8126            let schema = if self.parse_keyword(Keyword::SCHEMA) {
8127                Some(self.parse_identifier()?)
8128            } else {
8129                None
8130            };
8131
8132            let version = if self.parse_keyword(Keyword::VERSION) {
8133                Some(self.parse_identifier()?)
8134            } else {
8135                None
8136            };
8137
8138            let cascade = self.parse_keyword(Keyword::CASCADE);
8139
8140            (schema, version, cascade)
8141        } else {
8142            (None, None, false)
8143        };
8144
8145        Ok(CreateExtension {
8146            name,
8147            if_not_exists,
8148            schema,
8149            version,
8150            cascade,
8151        })
8152    }
8153
8154    /// Parse a PostgreSQL-specific [Statement::CreateCollation] statement.
8155    pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8156        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8157        let name = self.parse_object_name(false)?;
8158
8159        let definition = if self.parse_keyword(Keyword::FROM) {
8160            CreateCollationDefinition::From(self.parse_object_name(false)?)
8161        } else if self.consume_token(&Token::LParen) {
8162            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8163            self.expect_token(&Token::RParen)?;
8164            CreateCollationDefinition::Options(options)
8165        } else {
8166            return self.expected_ref(
8167                "FROM or parenthesized option list after CREATE COLLATION name",
8168                self.peek_token_ref(),
8169            );
8170        };
8171
8172        Ok(CreateCollation {
8173            if_not_exists,
8174            name,
8175            definition,
8176        })
8177    }
8178
8179    /// Parse a PostgreSQL-specific [Statement::DropExtension] statement.
8180    pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8181        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8182        let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8183        let cascade_or_restrict =
8184            self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8185        Ok(Statement::DropExtension(DropExtension {
8186            names,
8187            if_exists,
8188            cascade_or_restrict: cascade_or_restrict
8189                .map(|k| match k {
8190                    Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8191                    Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8192                    _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8193                })
8194                .transpose()?,
8195        }))
8196    }
8197
8198    /// Parse a[Statement::DropOperator] statement.
8199    ///
8200    pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8201        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8202        let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8203        let drop_behavior = self.parse_optional_drop_behavior();
8204        Ok(Statement::DropOperator(DropOperator {
8205            if_exists,
8206            operators,
8207            drop_behavior,
8208        }))
8209    }
8210
8211    /// Parse an operator signature for a [Statement::DropOperator]
8212    /// Format: `name ( { left_type | NONE } , right_type )`
8213    fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8214        let name = self.parse_operator_name()?;
8215        self.expect_token(&Token::LParen)?;
8216
8217        // Parse left operand type (or NONE for prefix operators)
8218        let left_type = if self.parse_keyword(Keyword::NONE) {
8219            None
8220        } else {
8221            Some(self.parse_data_type()?)
8222        };
8223
8224        self.expect_token(&Token::Comma)?;
8225
8226        // Parse right operand type (always required)
8227        let right_type = self.parse_data_type()?;
8228
8229        self.expect_token(&Token::RParen)?;
8230
8231        Ok(DropOperatorSignature {
8232            name,
8233            left_type,
8234            right_type,
8235        })
8236    }
8237
8238    /// Parse a [Statement::DropOperatorFamily]
8239    ///
8240    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopfamily.html)
8241    pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8242        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8243        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8244        self.expect_keyword(Keyword::USING)?;
8245        let using = self.parse_identifier()?;
8246        let drop_behavior = self.parse_optional_drop_behavior();
8247        Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8248            if_exists,
8249            names,
8250            using,
8251            drop_behavior,
8252        }))
8253    }
8254
8255    /// Parse a [Statement::DropOperatorClass]
8256    ///
8257    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopclass.html)
8258    pub fn parse_drop_operator_class(&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::DropOperatorClass(DropOperatorClass {
8265            if_exists,
8266            names,
8267            using,
8268            drop_behavior,
8269        }))
8270    }
8271
8272    /// Parse Hive distribution style.
8273    ///
8274    /// TODO: Support parsing for `SKEWED` distribution style.
8275    pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8276        if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8277            self.expect_token(&Token::LParen)?;
8278            let columns =
8279                self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8280            self.expect_token(&Token::RParen)?;
8281            Ok(HiveDistributionStyle::PARTITIONED { columns })
8282        } else {
8283            Ok(HiveDistributionStyle::NONE)
8284        }
8285    }
8286
8287    /// Parse Redshift `DISTSTYLE { AUTO | EVEN | KEY | ALL }`.
8288    ///
8289    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
8290    fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8291        let token = self.next_token();
8292        match &token.token {
8293            Token::Word(w) => match w.keyword {
8294                Keyword::AUTO => Ok(DistStyle::Auto),
8295                Keyword::EVEN => Ok(DistStyle::Even),
8296                Keyword::KEY => Ok(DistStyle::Key),
8297                Keyword::ALL => Ok(DistStyle::All),
8298                _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8299            },
8300            _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8301        }
8302    }
8303
8304    /// Parse Hive formats.
8305    pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8306        let mut hive_format: Option<HiveFormat> = None;
8307        loop {
8308            match self.parse_one_of_keywords(&[
8309                Keyword::ROW,
8310                Keyword::STORED,
8311                Keyword::LOCATION,
8312                Keyword::WITH,
8313                Keyword::USING,
8314            ]) {
8315                Some(Keyword::ROW) => {
8316                    hive_format
8317                        .get_or_insert_with(HiveFormat::default)
8318                        .row_format = Some(self.parse_row_format()?);
8319                }
8320                Some(Keyword::STORED) => {
8321                    self.expect_keyword_is(Keyword::AS)?;
8322                    if self.parse_keyword(Keyword::INPUTFORMAT) {
8323                        let input_format = self.parse_expr()?;
8324                        self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8325                        let output_format = self.parse_expr()?;
8326                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8327                            Some(HiveIOFormat::IOF {
8328                                input_format,
8329                                output_format,
8330                            });
8331                    } else {
8332                        let format = self.parse_file_format()?;
8333                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8334                            Some(HiveIOFormat::FileFormat { format });
8335                    }
8336                }
8337                Some(Keyword::LOCATION) => {
8338                    hive_format.get_or_insert_with(HiveFormat::default).location =
8339                        Some(self.parse_literal_string()?);
8340                }
8341                Some(Keyword::WITH) => {
8342                    self.prev_token();
8343                    let properties = self
8344                        .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8345                    if !properties.is_empty() {
8346                        hive_format
8347                            .get_or_insert_with(HiveFormat::default)
8348                            .serde_properties = Some(properties);
8349                    } else {
8350                        break;
8351                    }
8352                }
8353                Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8354                    let format = self.parse_identifier()?;
8355                    hive_format.get_or_insert_with(HiveFormat::default).storage =
8356                        Some(HiveIOFormat::Using { format });
8357                }
8358                Some(Keyword::USING) => {
8359                    // USING is not a table format keyword in this dialect; put it back
8360                    self.prev_token();
8361                    break;
8362                }
8363                None => break,
8364                _ => break,
8365            }
8366        }
8367
8368        Ok(hive_format)
8369    }
8370
8371    /// Parse Hive row format.
8372    pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8373        self.expect_keyword_is(Keyword::FORMAT)?;
8374        match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8375            Some(Keyword::SERDE) => {
8376                let class = self.parse_literal_string()?;
8377                Ok(HiveRowFormat::SERDE { class })
8378            }
8379            _ => {
8380                let mut row_delimiters = vec![];
8381
8382                loop {
8383                    match self.parse_one_of_keywords(&[
8384                        Keyword::FIELDS,
8385                        Keyword::COLLECTION,
8386                        Keyword::MAP,
8387                        Keyword::LINES,
8388                        Keyword::NULL,
8389                    ]) {
8390                        Some(Keyword::FIELDS)
8391                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8392                        {
8393                            row_delimiters.push(HiveRowDelimiter {
8394                                delimiter: HiveDelimiter::FieldsTerminatedBy,
8395                                char: self.parse_identifier()?,
8396                            });
8397
8398                            if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8399                                row_delimiters.push(HiveRowDelimiter {
8400                                    delimiter: HiveDelimiter::FieldsEscapedBy,
8401                                    char: self.parse_identifier()?,
8402                                });
8403                            }
8404                        }
8405                        Some(Keyword::COLLECTION)
8406                            if self.parse_keywords(&[
8407                                Keyword::ITEMS,
8408                                Keyword::TERMINATED,
8409                                Keyword::BY,
8410                            ]) =>
8411                        {
8412                            row_delimiters.push(HiveRowDelimiter {
8413                                delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8414                                char: self.parse_identifier()?,
8415                            });
8416                        }
8417                        Some(Keyword::MAP)
8418                            if self.parse_keywords(&[
8419                                Keyword::KEYS,
8420                                Keyword::TERMINATED,
8421                                Keyword::BY,
8422                            ]) =>
8423                        {
8424                            row_delimiters.push(HiveRowDelimiter {
8425                                delimiter: HiveDelimiter::MapKeysTerminatedBy,
8426                                char: self.parse_identifier()?,
8427                            });
8428                        }
8429                        Some(Keyword::LINES)
8430                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8431                        {
8432                            row_delimiters.push(HiveRowDelimiter {
8433                                delimiter: HiveDelimiter::LinesTerminatedBy,
8434                                char: self.parse_identifier()?,
8435                            });
8436                        }
8437                        Some(Keyword::NULL)
8438                            if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8439                        {
8440                            row_delimiters.push(HiveRowDelimiter {
8441                                delimiter: HiveDelimiter::NullDefinedAs,
8442                                char: self.parse_identifier()?,
8443                            });
8444                        }
8445                        _ => {
8446                            break;
8447                        }
8448                    }
8449                }
8450
8451                Ok(HiveRowFormat::DELIMITED {
8452                    delimiters: row_delimiters,
8453                })
8454            }
8455        }
8456    }
8457
8458    fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8459        if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8460            Ok(Some(self.parse_identifier()?))
8461        } else {
8462            Ok(None)
8463        }
8464    }
8465
8466    /// Parse `CREATE TABLE` statement.
8467    pub fn parse_create_table(
8468        &mut self,
8469        or_replace: bool,
8470        temporary: bool,
8471        global: Option<bool>,
8472        transient: bool,
8473    ) -> Result<CreateTable, ParserError> {
8474        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8475        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8476        let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8477
8478        // PostgreSQL PARTITION OF for child partition tables
8479        // Note: This is a PostgreSQL-specific feature, but the dialect check was intentionally
8480        // removed to allow GenericDialect and other dialects to parse this syntax. This enables
8481        // multi-dialect SQL tools to work with PostgreSQL-specific DDL statements.
8482        //
8483        // PARTITION OF can be combined with other table definition clauses in the AST,
8484        // though PostgreSQL itself prohibits PARTITION OF with AS SELECT or LIKE clauses.
8485        // The parser accepts these combinations for flexibility; semantic validation
8486        // is left to downstream tools.
8487        // Child partitions can have their own constraints and indexes.
8488        let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8489            Some(self.parse_object_name(allow_unquoted_hyphen)?)
8490        } else {
8491            None
8492        };
8493
8494        // Clickhouse has `ON CLUSTER 'cluster'` syntax for DDLs
8495        let on_cluster = self.parse_optional_on_cluster()?;
8496
8497        let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8498
8499        let clone = if self.parse_keyword(Keyword::CLONE) {
8500            self.parse_object_name(allow_unquoted_hyphen).ok()
8501        } else {
8502            None
8503        };
8504
8505        // parse optional column list (schema)
8506        let (columns, constraints) = self.parse_columns()?;
8507        let comment_after_column_def =
8508            if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8509                let next_token = self.next_token();
8510                match next_token.token {
8511                    Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8512                    _ => self.expected("comment", next_token)?,
8513                }
8514            } else {
8515                None
8516            };
8517
8518        // PostgreSQL PARTITION OF: partition bound specification
8519        let for_values = if partition_of.is_some() {
8520            if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8521                Some(self.parse_partition_for_values()?)
8522            } else {
8523                return self.expected_ref(
8524                    "FOR VALUES or DEFAULT after PARTITION OF",
8525                    self.peek_token_ref(),
8526                );
8527            }
8528        } else {
8529            None
8530        };
8531
8532        // SQLite supports `WITHOUT ROWID` at the end of `CREATE TABLE`
8533        let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8534
8535        let hive_distribution = self.parse_hive_distribution()?;
8536        let clustered_by = self.parse_optional_clustered_by()?;
8537        let hive_formats = self.parse_hive_formats()?;
8538
8539        let create_table_config = self.parse_optional_create_table_config()?;
8540
8541        // ClickHouse supports `PRIMARY KEY`, before `ORDER BY`
8542        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#primary-key
8543        let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8544            && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8545        {
8546            Some(Box::new(self.parse_expr()?))
8547        } else {
8548            None
8549        };
8550
8551        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8552            if self.consume_token(&Token::LParen) {
8553                let columns = if self.peek_token_ref().token != Token::RParen {
8554                    self.parse_comma_separated(|p| p.parse_expr())?
8555                } else {
8556                    vec![]
8557                };
8558                self.expect_token(&Token::RParen)?;
8559                Some(OneOrManyWithParens::Many(columns))
8560            } else {
8561                Some(OneOrManyWithParens::One(self.parse_expr()?))
8562            }
8563        } else {
8564            None
8565        };
8566
8567        // ClickHouse allows PARTITION BY after ORDER BY
8568        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#partition-by
8569        let partition_by = if create_table_config.partition_by.is_none()
8570            && self.dialect.supports_partition_by_after_order_by()
8571            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8572        {
8573            Some(Box::new(self.parse_expr()?))
8574        } else {
8575            create_table_config.partition_by
8576        };
8577
8578        let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8579            Some(self.parse_create_table_on_commit()?)
8580        } else {
8581            None
8582        };
8583
8584        let strict = self.parse_keyword(Keyword::STRICT);
8585
8586        // Redshift: BACKUP YES|NO
8587        let backup = if self.parse_keyword(Keyword::BACKUP) {
8588            let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8589            Some(keyword == Keyword::YES)
8590        } else {
8591            None
8592        };
8593
8594        // Redshift: DISTSTYLE, DISTKEY, SORTKEY
8595        let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8596            Some(self.parse_dist_style()?)
8597        } else {
8598            None
8599        };
8600        let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8601            self.expect_token(&Token::LParen)?;
8602            let expr = self.parse_expr()?;
8603            self.expect_token(&Token::RParen)?;
8604            Some(expr)
8605        } else {
8606            None
8607        };
8608        let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8609            self.expect_token(&Token::LParen)?;
8610            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8611            self.expect_token(&Token::RParen)?;
8612            Some(columns)
8613        } else {
8614            None
8615        };
8616
8617        // Parse optional `AS ( query )`
8618        let query = if self.parse_keyword(Keyword::AS) {
8619            Some(self.parse_query()?)
8620        } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8621        {
8622            // rewind the SELECT keyword
8623            self.prev_token();
8624            Some(self.parse_query()?)
8625        } else {
8626            None
8627        };
8628
8629        Ok(CreateTableBuilder::new(table_name)
8630            .temporary(temporary)
8631            .columns(columns)
8632            .constraints(constraints)
8633            .or_replace(or_replace)
8634            .if_not_exists(if_not_exists)
8635            .transient(transient)
8636            .hive_distribution(hive_distribution)
8637            .hive_formats(hive_formats)
8638            .global(global)
8639            .query(query)
8640            .without_rowid(without_rowid)
8641            .like(like)
8642            .clone_clause(clone)
8643            .comment_after_column_def(comment_after_column_def)
8644            .order_by(order_by)
8645            .on_commit(on_commit)
8646            .on_cluster(on_cluster)
8647            .clustered_by(clustered_by)
8648            .partition_by(partition_by)
8649            .cluster_by(create_table_config.cluster_by)
8650            .inherits(create_table_config.inherits)
8651            .partition_of(partition_of)
8652            .for_values(for_values)
8653            .table_options(create_table_config.table_options)
8654            .primary_key(primary_key)
8655            .strict(strict)
8656            .backup(backup)
8657            .diststyle(diststyle)
8658            .distkey(distkey)
8659            .sortkey(sortkey)
8660            .build())
8661    }
8662
8663    fn maybe_parse_create_table_like(
8664        &mut self,
8665        allow_unquoted_hyphen: bool,
8666    ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8667        let like = if self.dialect.supports_create_table_like_parenthesized()
8668            && self.consume_token(&Token::LParen)
8669        {
8670            if self.parse_keyword(Keyword::LIKE) {
8671                let name = self.parse_object_name(allow_unquoted_hyphen)?;
8672                let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
8673                    Some(CreateTableLikeDefaults::Including)
8674                } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
8675                    Some(CreateTableLikeDefaults::Excluding)
8676                } else {
8677                    None
8678                };
8679                self.expect_token(&Token::RParen)?;
8680                Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
8681                    name,
8682                    defaults,
8683                }))
8684            } else {
8685                // Rollback the '(' it's probably the columns list
8686                self.prev_token();
8687                None
8688            }
8689        } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
8690            let name = self.parse_object_name(allow_unquoted_hyphen)?;
8691            Some(CreateTableLikeKind::Plain(CreateTableLike {
8692                name,
8693                defaults: None,
8694            }))
8695        } else {
8696            None
8697        };
8698        Ok(like)
8699    }
8700
8701    pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
8702        if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
8703            Ok(OnCommit::DeleteRows)
8704        } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
8705            Ok(OnCommit::PreserveRows)
8706        } else if self.parse_keywords(&[Keyword::DROP]) {
8707            Ok(OnCommit::Drop)
8708        } else {
8709            parser_err!(
8710                "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
8711                self.peek_token_ref()
8712            )
8713        }
8714    }
8715
8716    /// Parse [ForValues] of a `PARTITION OF` clause.
8717    ///
8718    /// Parses: `FOR VALUES partition_bound_spec | DEFAULT`
8719    ///
8720    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtable.html)
8721    fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
8722        if self.parse_keyword(Keyword::DEFAULT) {
8723            return Ok(ForValues::Default);
8724        }
8725
8726        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
8727
8728        if self.parse_keyword(Keyword::IN) {
8729            // FOR VALUES IN (expr, ...)
8730            self.expect_token(&Token::LParen)?;
8731            if self.peek_token_ref().token == Token::RParen {
8732                return self.expected_ref("at least one value", self.peek_token_ref());
8733            }
8734            let values = self.parse_comma_separated(Parser::parse_expr)?;
8735            self.expect_token(&Token::RParen)?;
8736            Ok(ForValues::In(values))
8737        } else if self.parse_keyword(Keyword::FROM) {
8738            // FOR VALUES FROM (...) TO (...)
8739            self.expect_token(&Token::LParen)?;
8740            if self.peek_token_ref().token == Token::RParen {
8741                return self.expected_ref("at least one value", self.peek_token_ref());
8742            }
8743            let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8744            self.expect_token(&Token::RParen)?;
8745            self.expect_keyword(Keyword::TO)?;
8746            self.expect_token(&Token::LParen)?;
8747            if self.peek_token_ref().token == Token::RParen {
8748                return self.expected_ref("at least one value", self.peek_token_ref());
8749            }
8750            let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8751            self.expect_token(&Token::RParen)?;
8752            Ok(ForValues::From { from, to })
8753        } else if self.parse_keyword(Keyword::WITH) {
8754            // FOR VALUES WITH (MODULUS n, REMAINDER r)
8755            self.expect_token(&Token::LParen)?;
8756            self.expect_keyword(Keyword::MODULUS)?;
8757            let modulus = self.parse_literal_uint()?;
8758            self.expect_token(&Token::Comma)?;
8759            self.expect_keyword(Keyword::REMAINDER)?;
8760            let remainder = self.parse_literal_uint()?;
8761            self.expect_token(&Token::RParen)?;
8762            Ok(ForValues::With { modulus, remainder })
8763        } else {
8764            self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
8765        }
8766    }
8767
8768    /// Parse a single partition bound value (MINVALUE, MAXVALUE, or expression).
8769    fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
8770        if self.parse_keyword(Keyword::MINVALUE) {
8771            Ok(PartitionBoundValue::MinValue)
8772        } else if self.parse_keyword(Keyword::MAXVALUE) {
8773            Ok(PartitionBoundValue::MaxValue)
8774        } else {
8775            Ok(PartitionBoundValue::Expr(self.parse_expr()?))
8776        }
8777    }
8778
8779    /// Parse configuration like inheritance, partitioning, clustering information during the table creation.
8780    ///
8781    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2)
8782    /// [PostgreSQL](https://www.postgresql.org/docs/current/ddl-partitioning.html)
8783    /// [MySql](https://dev.mysql.com/doc/refman/8.4/en/create-table.html)
8784    fn parse_optional_create_table_config(
8785        &mut self,
8786    ) -> Result<CreateTableConfiguration, ParserError> {
8787        let mut table_options = CreateTableOptions::None;
8788
8789        let inherits = if self.parse_keyword(Keyword::INHERITS) {
8790            Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
8791        } else {
8792            None
8793        };
8794
8795        // PostgreSQL supports `WITH ( options )`, before `AS`
8796        let with_options = self.parse_options(Keyword::WITH)?;
8797        if !with_options.is_empty() {
8798            table_options = CreateTableOptions::With(with_options)
8799        }
8800
8801        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
8802        if !table_properties.is_empty() {
8803            table_options = CreateTableOptions::TableProperties(table_properties);
8804        }
8805        let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
8806            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8807        {
8808            Some(Box::new(self.parse_expr()?))
8809        } else {
8810            None
8811        };
8812
8813        let mut cluster_by = None;
8814        if dialect_of!(self is BigQueryDialect | GenericDialect) {
8815            if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
8816                cluster_by = Some(WrappedCollection::NoWrapping(
8817                    self.parse_comma_separated(|p| p.parse_expr())?,
8818                ));
8819            };
8820
8821            if let Token::Word(word) = &self.peek_token_ref().token {
8822                if word.keyword == Keyword::OPTIONS {
8823                    table_options =
8824                        CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
8825                }
8826            };
8827        }
8828
8829        if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
8830            let plain_options = self.parse_plain_options()?;
8831            if !plain_options.is_empty() {
8832                table_options = CreateTableOptions::Plain(plain_options)
8833            }
8834        };
8835
8836        Ok(CreateTableConfiguration {
8837            partition_by,
8838            cluster_by,
8839            inherits,
8840            table_options,
8841        })
8842    }
8843
8844    fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
8845        // Single parameter option
8846        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8847        if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
8848            return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
8849        }
8850
8851        // Custom option
8852        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8853        if self.parse_keywords(&[Keyword::COMMENT]) {
8854            let has_eq = self.consume_token(&Token::Eq);
8855            let value = self.next_token();
8856
8857            let comment = match (has_eq, value.token) {
8858                (true, Token::SingleQuotedString(s)) => {
8859                    Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
8860                }
8861                (false, Token::SingleQuotedString(s)) => {
8862                    Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
8863                }
8864                (_, token) => {
8865                    self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
8866                }
8867            };
8868            return comment;
8869        }
8870
8871        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8872        // <https://clickhouse.com/docs/sql-reference/statements/create/table>
8873        if self.parse_keywords(&[Keyword::ENGINE]) {
8874            let _ = self.consume_token(&Token::Eq);
8875            let value = self.next_token();
8876
8877            let engine = match value.token {
8878                Token::Word(w) => {
8879                    let parameters = if self.peek_token_ref().token == Token::LParen {
8880                        self.parse_parenthesized_identifiers()?
8881                    } else {
8882                        vec![]
8883                    };
8884
8885                    Ok(Some(SqlOption::NamedParenthesizedList(
8886                        NamedParenthesizedList {
8887                            key: Ident::new("ENGINE"),
8888                            name: Some(Ident::new(w.value)),
8889                            values: parameters,
8890                        },
8891                    )))
8892                }
8893                _ => {
8894                    return self.expected("Token::Word", value)?;
8895                }
8896            };
8897
8898            return engine;
8899        }
8900
8901        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8902        if self.parse_keywords(&[Keyword::TABLESPACE]) {
8903            let _ = self.consume_token(&Token::Eq);
8904            let value = self.next_token();
8905
8906            let tablespace = match value.token {
8907                Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
8908                    let storage = match self.parse_keyword(Keyword::STORAGE) {
8909                        true => {
8910                            let _ = self.consume_token(&Token::Eq);
8911                            let storage_token = self.next_token();
8912                            match &storage_token.token {
8913                                Token::Word(w) => match w.value.to_uppercase().as_str() {
8914                                    "DISK" => Some(StorageType::Disk),
8915                                    "MEMORY" => Some(StorageType::Memory),
8916                                    _ => self
8917                                        .expected("Storage type (DISK or MEMORY)", storage_token)?,
8918                                },
8919                                _ => self.expected("Token::Word", storage_token)?,
8920                            }
8921                        }
8922                        false => None,
8923                    };
8924
8925                    Ok(Some(SqlOption::TableSpace(TablespaceOption {
8926                        name,
8927                        storage,
8928                    })))
8929                }
8930                _ => {
8931                    return self.expected("Token::Word", value)?;
8932                }
8933            };
8934
8935            return tablespace;
8936        }
8937
8938        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
8939        if self.parse_keyword(Keyword::UNION) {
8940            let _ = self.consume_token(&Token::Eq);
8941            let value = self.next_token();
8942
8943            match value.token {
8944                Token::LParen => {
8945                    let tables: Vec<Ident> =
8946                        self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
8947                    self.expect_token(&Token::RParen)?;
8948
8949                    return Ok(Some(SqlOption::NamedParenthesizedList(
8950                        NamedParenthesizedList {
8951                            key: Ident::new("UNION"),
8952                            name: None,
8953                            values: tables,
8954                        },
8955                    )));
8956                }
8957                _ => {
8958                    return self.expected("Token::LParen", value)?;
8959                }
8960            }
8961        }
8962
8963        // Key/Value parameter option
8964        let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
8965            Ident::new("DEFAULT CHARSET")
8966        } else if self.parse_keyword(Keyword::CHARSET) {
8967            Ident::new("CHARSET")
8968        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
8969            Ident::new("DEFAULT CHARACTER SET")
8970        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
8971            Ident::new("CHARACTER SET")
8972        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
8973            Ident::new("DEFAULT COLLATE")
8974        } else if self.parse_keyword(Keyword::COLLATE) {
8975            Ident::new("COLLATE")
8976        } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
8977            Ident::new("DATA DIRECTORY")
8978        } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
8979            Ident::new("INDEX DIRECTORY")
8980        } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
8981            Ident::new("KEY_BLOCK_SIZE")
8982        } else if self.parse_keyword(Keyword::ROW_FORMAT) {
8983            Ident::new("ROW_FORMAT")
8984        } else if self.parse_keyword(Keyword::PACK_KEYS) {
8985            Ident::new("PACK_KEYS")
8986        } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
8987            Ident::new("STATS_AUTO_RECALC")
8988        } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
8989            Ident::new("STATS_PERSISTENT")
8990        } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
8991            Ident::new("STATS_SAMPLE_PAGES")
8992        } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
8993            Ident::new("DELAY_KEY_WRITE")
8994        } else if self.parse_keyword(Keyword::COMPRESSION) {
8995            Ident::new("COMPRESSION")
8996        } else if self.parse_keyword(Keyword::ENCRYPTION) {
8997            Ident::new("ENCRYPTION")
8998        } else if self.parse_keyword(Keyword::MAX_ROWS) {
8999            Ident::new("MAX_ROWS")
9000        } else if self.parse_keyword(Keyword::MIN_ROWS) {
9001            Ident::new("MIN_ROWS")
9002        } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9003            Ident::new("AUTOEXTEND_SIZE")
9004        } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9005            Ident::new("AVG_ROW_LENGTH")
9006        } else if self.parse_keyword(Keyword::CHECKSUM) {
9007            Ident::new("CHECKSUM")
9008        } else if self.parse_keyword(Keyword::CONNECTION) {
9009            Ident::new("CONNECTION")
9010        } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9011            Ident::new("ENGINE_ATTRIBUTE")
9012        } else if self.parse_keyword(Keyword::PASSWORD) {
9013            Ident::new("PASSWORD")
9014        } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9015            Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9016        } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9017            Ident::new("INSERT_METHOD")
9018        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9019            Ident::new("AUTO_INCREMENT")
9020        } else {
9021            return Ok(None);
9022        };
9023
9024        let _ = self.consume_token(&Token::Eq);
9025
9026        let value = match self
9027            .maybe_parse(|parser| parser.parse_value())?
9028            .map(Expr::Value)
9029        {
9030            Some(expr) => expr,
9031            None => Expr::Identifier(self.parse_identifier()?),
9032        };
9033
9034        Ok(Some(SqlOption::KeyValue { key, value }))
9035    }
9036
9037    /// Parse plain options.
9038    pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9039        let mut options = Vec::new();
9040
9041        while let Some(option) = self.parse_plain_option()? {
9042            options.push(option);
9043            // Some dialects support comma-separated options; it shouldn't introduce ambiguity to
9044            // consume it for all dialects.
9045            let _ = self.consume_token(&Token::Comma);
9046        }
9047
9048        Ok(options)
9049    }
9050
9051    /// Parse optional inline comment.
9052    pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9053        let comment = if self.parse_keyword(Keyword::COMMENT) {
9054            let has_eq = self.consume_token(&Token::Eq);
9055            let comment = self.parse_comment_value()?;
9056            Some(if has_eq {
9057                CommentDef::WithEq(comment)
9058            } else {
9059                CommentDef::WithoutEq(comment)
9060            })
9061        } else {
9062            None
9063        };
9064        Ok(comment)
9065    }
9066
9067    /// Parse comment value.
9068    pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9069        let next_token = self.next_token();
9070        let value = match next_token.token {
9071            Token::SingleQuotedString(str) => str,
9072            Token::DollarQuotedString(str) => str.value,
9073            _ => self.expected("string literal", next_token)?,
9074        };
9075        Ok(value)
9076    }
9077
9078    /// Parse optional procedure parameters.
9079    pub fn parse_optional_procedure_parameters(
9080        &mut self,
9081    ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9082        let mut params = vec![];
9083        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9084            return Ok(Some(params));
9085        }
9086        loop {
9087            if let Token::Word(_) = &self.peek_token_ref().token {
9088                params.push(self.parse_procedure_param()?)
9089            }
9090            let comma = self.consume_token(&Token::Comma);
9091            if self.consume_token(&Token::RParen) {
9092                // allow a trailing comma, even though it's not in standard
9093                break;
9094            } else if !comma {
9095                return self.expected_ref(
9096                    "',' or ')' after parameter definition",
9097                    self.peek_token_ref(),
9098                );
9099            }
9100        }
9101        Ok(Some(params))
9102    }
9103
9104    /// Parse columns and constraints.
9105    pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9106        let mut columns = vec![];
9107        let mut constraints = vec![];
9108        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9109            return Ok((columns, constraints));
9110        }
9111
9112        loop {
9113            if let Some(constraint) = self.parse_optional_table_constraint()? {
9114                constraints.push(constraint);
9115            } else if let Token::Word(_) = &self.peek_token_ref().token {
9116                columns.push(self.parse_column_def()?);
9117            } else {
9118                return self.expected_ref(
9119                    "column name or constraint definition",
9120                    self.peek_token_ref(),
9121                );
9122            }
9123
9124            let comma = self.consume_token(&Token::Comma);
9125            let rparen = self.peek_token_ref().token == Token::RParen;
9126
9127            if !comma && !rparen {
9128                return self
9129                    .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9130            };
9131
9132            if rparen
9133                && (!comma
9134                    || self.dialect.supports_column_definition_trailing_commas()
9135                    || self.options.trailing_commas)
9136            {
9137                let _ = self.consume_token(&Token::RParen);
9138                break;
9139            }
9140        }
9141
9142        Ok((columns, constraints))
9143    }
9144
9145    /// Parse procedure parameter.
9146    pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9147        let mode = if self.parse_keyword(Keyword::IN) {
9148            Some(ArgMode::In)
9149        } else if self.parse_keyword(Keyword::OUT) {
9150            Some(ArgMode::Out)
9151        } else if self.parse_keyword(Keyword::INOUT) {
9152            Some(ArgMode::InOut)
9153        } else {
9154            None
9155        };
9156        let name = self.parse_identifier()?;
9157        let data_type = self.parse_data_type()?;
9158        let default = if self.consume_token(&Token::Eq) {
9159            Some(self.parse_expr()?)
9160        } else {
9161            None
9162        };
9163
9164        Ok(ProcedureParam {
9165            name,
9166            data_type,
9167            mode,
9168            default,
9169        })
9170    }
9171
9172    /// Parse column definition.
9173    pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9174        self.parse_column_def_inner(false)
9175    }
9176
9177    fn parse_column_def_inner(
9178        &mut self,
9179        optional_data_type: bool,
9180    ) -> Result<ColumnDef, ParserError> {
9181        let col_name = self.parse_identifier()?;
9182        let data_type = if self.is_column_type_sqlite_unspecified() {
9183            DataType::Unspecified
9184        } else if optional_data_type {
9185            self.maybe_parse(|parser| parser.parse_data_type())?
9186                .unwrap_or(DataType::Unspecified)
9187        } else {
9188            self.parse_data_type()?
9189        };
9190        let mut options = vec![];
9191        loop {
9192            if self.parse_keyword(Keyword::CONSTRAINT) {
9193                let name = Some(self.parse_identifier()?);
9194                if let Some(option) = self.parse_optional_column_option()? {
9195                    options.push(ColumnOptionDef { name, option });
9196                } else {
9197                    return self.expected_ref(
9198                        "constraint details after CONSTRAINT <name>",
9199                        self.peek_token_ref(),
9200                    );
9201                }
9202            } else if let Some(option) = self.parse_optional_column_option()? {
9203                options.push(ColumnOptionDef { name: None, option });
9204            } else {
9205                break;
9206            };
9207        }
9208        Ok(ColumnDef {
9209            name: col_name,
9210            data_type,
9211            options,
9212        })
9213    }
9214
9215    fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9216        if dialect_of!(self is SQLiteDialect) {
9217            match &self.peek_token_ref().token {
9218                Token::Word(word) => matches!(
9219                    word.keyword,
9220                    Keyword::CONSTRAINT
9221                        | Keyword::PRIMARY
9222                        | Keyword::NOT
9223                        | Keyword::UNIQUE
9224                        | Keyword::CHECK
9225                        | Keyword::DEFAULT
9226                        | Keyword::COLLATE
9227                        | Keyword::REFERENCES
9228                        | Keyword::GENERATED
9229                        | Keyword::AS
9230                ),
9231                _ => true, // e.g. comma immediately after column name
9232            }
9233        } else {
9234            false
9235        }
9236    }
9237
9238    /// Parse optional column option.
9239    pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9240        if let Some(option) = self.dialect.parse_column_option(self)? {
9241            return option;
9242        }
9243
9244        self.with_state(
9245            ColumnDefinition,
9246            |parser| -> Result<Option<ColumnOption>, ParserError> {
9247                parser.parse_optional_column_option_inner()
9248            },
9249        )
9250    }
9251
9252    fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9253        if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9254            Ok(Some(ColumnOption::CharacterSet(
9255                self.parse_object_name(false)?,
9256            )))
9257        } else if self.parse_keywords(&[Keyword::COLLATE]) {
9258            Ok(Some(ColumnOption::Collation(
9259                self.parse_object_name(false)?,
9260            )))
9261        } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9262            Ok(Some(ColumnOption::NotNull))
9263        } else if self.parse_keywords(&[Keyword::COMMENT]) {
9264            Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9265        } else if self.parse_keyword(Keyword::NULL) {
9266            Ok(Some(ColumnOption::Null))
9267        } else if self.parse_keyword(Keyword::DEFAULT) {
9268            Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9269        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9270            && self.parse_keyword(Keyword::MATERIALIZED)
9271        {
9272            Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9273        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9274            && self.parse_keyword(Keyword::ALIAS)
9275        {
9276            Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9277        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9278            && self.parse_keyword(Keyword::EPHEMERAL)
9279        {
9280            // The expression is optional for the EPHEMERAL syntax, so we need to check
9281            // if the column definition has remaining tokens before parsing the expression.
9282            if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9283                Ok(Some(ColumnOption::Ephemeral(None)))
9284            } else {
9285                Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9286            }
9287        } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9288            let characteristics = self.parse_constraint_characteristics()?;
9289            Ok(Some(
9290                PrimaryKeyConstraint {
9291                    name: None,
9292                    index_name: None,
9293                    index_type: None,
9294                    columns: vec![],
9295                    index_options: vec![],
9296                    characteristics,
9297                }
9298                .into(),
9299            ))
9300        } else if self.parse_keyword(Keyword::UNIQUE) {
9301            let index_type_display =
9302                if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9303                    KeyOrIndexDisplay::Key
9304                } else {
9305                    KeyOrIndexDisplay::None
9306                };
9307            let characteristics = self.parse_constraint_characteristics()?;
9308            Ok(Some(
9309                UniqueConstraint {
9310                    name: None,
9311                    index_name: None,
9312                    index_type_display,
9313                    index_type: None,
9314                    columns: vec![],
9315                    index_options: vec![],
9316                    characteristics,
9317                    nulls_distinct: NullsDistinctOption::None,
9318                }
9319                .into(),
9320            ))
9321        } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9322            // In MySQL, `KEY` in a column definition is shorthand for `PRIMARY KEY`.
9323            // See: https://dev.mysql.com/doc/refman/8.4/en/create-table.html
9324            let characteristics = self.parse_constraint_characteristics()?;
9325            Ok(Some(
9326                PrimaryKeyConstraint {
9327                    name: None,
9328                    index_name: None,
9329                    index_type: None,
9330                    columns: vec![],
9331                    index_options: vec![],
9332                    characteristics,
9333                }
9334                .into(),
9335            ))
9336        } else if self.parse_keyword(Keyword::REFERENCES) {
9337            let foreign_table = self.parse_object_name(false)?;
9338            // PostgreSQL allows omitting the column list and
9339            // uses the primary key column of the foreign table by default
9340            let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9341            let mut match_kind = None;
9342            let mut on_delete = None;
9343            let mut on_update = None;
9344            loop {
9345                if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9346                    match_kind = Some(self.parse_match_kind()?);
9347                } else if on_delete.is_none()
9348                    && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9349                {
9350                    on_delete = Some(self.parse_referential_action()?);
9351                } else if on_update.is_none()
9352                    && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9353                {
9354                    on_update = Some(self.parse_referential_action()?);
9355                } else {
9356                    break;
9357                }
9358            }
9359            let characteristics = self.parse_constraint_characteristics()?;
9360
9361            Ok(Some(
9362                ForeignKeyConstraint {
9363                    name: None,       // Column-level constraints don't have names
9364                    index_name: None, // Not applicable for column-level constraints
9365                    columns: vec![],  // Not applicable for column-level constraints
9366                    foreign_table,
9367                    referred_columns,
9368                    on_delete,
9369                    on_update,
9370                    match_kind,
9371                    characteristics,
9372                }
9373                .into(),
9374            ))
9375        } else if self.parse_keyword(Keyword::CHECK) {
9376            self.expect_token(&Token::LParen)?;
9377            // since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
9378            let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9379            self.expect_token(&Token::RParen)?;
9380
9381            let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9382                Some(true)
9383            } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9384                Some(false)
9385            } else {
9386                None
9387            };
9388
9389            Ok(Some(
9390                CheckConstraint {
9391                    name: None, // Column-level check constraints don't have names
9392                    expr: Box::new(expr),
9393                    enforced,
9394                }
9395                .into(),
9396            ))
9397        } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9398            && dialect_of!(self is MySqlDialect | GenericDialect)
9399        {
9400            // Support AUTO_INCREMENT for MySQL
9401            Ok(Some(ColumnOption::DialectSpecific(vec![
9402                Token::make_keyword("AUTO_INCREMENT"),
9403            ])))
9404        } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9405            && dialect_of!(self is SQLiteDialect |  GenericDialect)
9406        {
9407            // Support AUTOINCREMENT for SQLite
9408            Ok(Some(ColumnOption::DialectSpecific(vec![
9409                Token::make_keyword("AUTOINCREMENT"),
9410            ])))
9411        } else if self.parse_keyword(Keyword::ASC)
9412            && self.dialect.supports_asc_desc_in_column_definition()
9413        {
9414            // Support ASC for SQLite
9415            Ok(Some(ColumnOption::DialectSpecific(vec![
9416                Token::make_keyword("ASC"),
9417            ])))
9418        } else if self.parse_keyword(Keyword::DESC)
9419            && self.dialect.supports_asc_desc_in_column_definition()
9420        {
9421            // Support DESC for SQLite
9422            Ok(Some(ColumnOption::DialectSpecific(vec![
9423                Token::make_keyword("DESC"),
9424            ])))
9425        } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9426            && dialect_of!(self is MySqlDialect | GenericDialect)
9427        {
9428            let expr = self.parse_expr()?;
9429            Ok(Some(ColumnOption::OnUpdate(expr)))
9430        } else if self.parse_keyword(Keyword::GENERATED) {
9431            self.parse_optional_column_option_generated()
9432        } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9433            && self.parse_keyword(Keyword::OPTIONS)
9434        {
9435            self.prev_token();
9436            Ok(Some(ColumnOption::Options(
9437                self.parse_options(Keyword::OPTIONS)?,
9438            )))
9439        } else if self.parse_keyword(Keyword::AS)
9440            && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9441        {
9442            self.parse_optional_column_option_as()
9443        } else if self.parse_keyword(Keyword::SRID)
9444            && dialect_of!(self is MySqlDialect | GenericDialect)
9445        {
9446            Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9447        } else if self.parse_keyword(Keyword::IDENTITY)
9448            && dialect_of!(self is MsSqlDialect | GenericDialect)
9449        {
9450            let parameters = if self.consume_token(&Token::LParen) {
9451                let seed = self.parse_number()?;
9452                self.expect_token(&Token::Comma)?;
9453                let increment = self.parse_number()?;
9454                self.expect_token(&Token::RParen)?;
9455
9456                Some(IdentityPropertyFormatKind::FunctionCall(
9457                    IdentityParameters { seed, increment },
9458                ))
9459            } else {
9460                None
9461            };
9462            Ok(Some(ColumnOption::Identity(
9463                IdentityPropertyKind::Identity(IdentityProperty {
9464                    parameters,
9465                    order: None,
9466                }),
9467            )))
9468        } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9469            && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9470        {
9471            // Support ON CONFLICT for SQLite
9472            Ok(Some(ColumnOption::OnConflict(
9473                self.expect_one_of_keywords(&[
9474                    Keyword::ROLLBACK,
9475                    Keyword::ABORT,
9476                    Keyword::FAIL,
9477                    Keyword::IGNORE,
9478                    Keyword::REPLACE,
9479                ])?,
9480            )))
9481        } else if self.parse_keyword(Keyword::INVISIBLE) {
9482            Ok(Some(ColumnOption::Invisible))
9483        } else {
9484            Ok(None)
9485        }
9486    }
9487
9488    pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9489        let name = self.parse_object_name(false)?;
9490        self.expect_token(&Token::Eq)?;
9491        let value = self.parse_literal_string()?;
9492
9493        Ok(Tag::new(name, value))
9494    }
9495
9496    fn parse_optional_column_option_generated(
9497        &mut self,
9498    ) -> Result<Option<ColumnOption>, ParserError> {
9499        if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9500            let mut sequence_options = vec![];
9501            if self.expect_token(&Token::LParen).is_ok() {
9502                sequence_options = self.parse_create_sequence_options()?;
9503                self.expect_token(&Token::RParen)?;
9504            }
9505            Ok(Some(ColumnOption::Generated {
9506                generated_as: GeneratedAs::Always,
9507                sequence_options: Some(sequence_options),
9508                generation_expr: None,
9509                generation_expr_mode: None,
9510                generated_keyword: true,
9511            }))
9512        } else if self.parse_keywords(&[
9513            Keyword::BY,
9514            Keyword::DEFAULT,
9515            Keyword::AS,
9516            Keyword::IDENTITY,
9517        ]) {
9518            let mut sequence_options = vec![];
9519            if self.expect_token(&Token::LParen).is_ok() {
9520                sequence_options = self.parse_create_sequence_options()?;
9521                self.expect_token(&Token::RParen)?;
9522            }
9523            Ok(Some(ColumnOption::Generated {
9524                generated_as: GeneratedAs::ByDefault,
9525                sequence_options: Some(sequence_options),
9526                generation_expr: None,
9527                generation_expr_mode: None,
9528                generated_keyword: true,
9529            }))
9530        } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9531            if self.expect_token(&Token::LParen).is_ok() {
9532                let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9533                self.expect_token(&Token::RParen)?;
9534                let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9535                    Ok((
9536                        GeneratedAs::ExpStored,
9537                        Some(GeneratedExpressionMode::Stored),
9538                    ))
9539                } else if dialect_of!(self is PostgreSqlDialect) {
9540                    // Postgres' AS IDENTITY branches are above, this one needs STORED
9541                    self.expected_ref("STORED", self.peek_token_ref())
9542                } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9543                    Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9544                } else {
9545                    Ok((GeneratedAs::Always, None))
9546                }?;
9547
9548                Ok(Some(ColumnOption::Generated {
9549                    generated_as: gen_as,
9550                    sequence_options: None,
9551                    generation_expr: Some(expr),
9552                    generation_expr_mode: expr_mode,
9553                    generated_keyword: true,
9554                }))
9555            } else {
9556                Ok(None)
9557            }
9558        } else {
9559            Ok(None)
9560        }
9561    }
9562
9563    fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9564        // Some DBs allow 'AS (expr)', shorthand for GENERATED ALWAYS AS
9565        self.expect_token(&Token::LParen)?;
9566        let expr = self.parse_expr()?;
9567        self.expect_token(&Token::RParen)?;
9568
9569        let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9570            (
9571                GeneratedAs::ExpStored,
9572                Some(GeneratedExpressionMode::Stored),
9573            )
9574        } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9575            (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9576        } else {
9577            (GeneratedAs::Always, None)
9578        };
9579
9580        Ok(Some(ColumnOption::Generated {
9581            generated_as: gen_as,
9582            sequence_options: None,
9583            generation_expr: Some(expr),
9584            generation_expr_mode: expr_mode,
9585            generated_keyword: false,
9586        }))
9587    }
9588
9589    /// Parse optional `CLUSTERED BY` clause for Hive/Generic dialects.
9590    pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9591        let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9592            && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9593        {
9594            let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9595
9596            let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9597                self.expect_token(&Token::LParen)?;
9598                let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9599                self.expect_token(&Token::RParen)?;
9600                Some(sorted_by_columns)
9601            } else {
9602                None
9603            };
9604
9605            self.expect_keyword_is(Keyword::INTO)?;
9606            let num_buckets = self.parse_number_value()?.value;
9607            self.expect_keyword_is(Keyword::BUCKETS)?;
9608            Some(ClusteredBy {
9609                columns,
9610                sorted_by,
9611                num_buckets,
9612            })
9613        } else {
9614            None
9615        };
9616        Ok(clustered_by)
9617    }
9618
9619    /// Parse a referential action used in foreign key clauses.
9620    ///
9621    /// Recognized forms: `RESTRICT`, `CASCADE`, `SET NULL`, `NO ACTION`, `SET DEFAULT`.
9622    pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9623        if self.parse_keyword(Keyword::RESTRICT) {
9624            Ok(ReferentialAction::Restrict)
9625        } else if self.parse_keyword(Keyword::CASCADE) {
9626            Ok(ReferentialAction::Cascade)
9627        } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9628            Ok(ReferentialAction::SetNull)
9629        } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9630            Ok(ReferentialAction::NoAction)
9631        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9632            Ok(ReferentialAction::SetDefault)
9633        } else {
9634            self.expected_ref(
9635                "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9636                self.peek_token_ref(),
9637            )
9638        }
9639    }
9640
9641    /// Parse a `MATCH` kind for constraint references: `FULL`, `PARTIAL`, or `SIMPLE`.
9642    pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9643        if self.parse_keyword(Keyword::FULL) {
9644            Ok(ConstraintReferenceMatchKind::Full)
9645        } else if self.parse_keyword(Keyword::PARTIAL) {
9646            Ok(ConstraintReferenceMatchKind::Partial)
9647        } else if self.parse_keyword(Keyword::SIMPLE) {
9648            Ok(ConstraintReferenceMatchKind::Simple)
9649        } else {
9650            self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9651        }
9652    }
9653
9654    /// Parse `index_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
9655    /// after `{ PRIMARY KEY | UNIQUE } USING INDEX`.
9656    fn parse_constraint_using_index(
9657        &mut self,
9658        name: Option<Ident>,
9659    ) -> Result<ConstraintUsingIndex, ParserError> {
9660        let index_name = self.parse_identifier()?;
9661        let characteristics = self.parse_constraint_characteristics()?;
9662        Ok(ConstraintUsingIndex {
9663            name,
9664            index_name,
9665            characteristics,
9666        })
9667    }
9668
9669    /// Parse optional constraint characteristics such as `DEFERRABLE`, `INITIALLY` and `ENFORCED`.
9670    pub fn parse_constraint_characteristics(
9671        &mut self,
9672    ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
9673        let mut cc = ConstraintCharacteristics::default();
9674
9675        loop {
9676            if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
9677            {
9678                cc.deferrable = Some(false);
9679            } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
9680                cc.deferrable = Some(true);
9681            } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
9682                if self.parse_keyword(Keyword::DEFERRED) {
9683                    cc.initially = Some(DeferrableInitial::Deferred);
9684                } else if self.parse_keyword(Keyword::IMMEDIATE) {
9685                    cc.initially = Some(DeferrableInitial::Immediate);
9686                } else {
9687                    self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
9688                }
9689            } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
9690                cc.enforced = Some(true);
9691            } else if cc.enforced.is_none()
9692                && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
9693            {
9694                cc.enforced = Some(false);
9695            } else {
9696                break;
9697            }
9698        }
9699
9700        if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
9701            Ok(Some(cc))
9702        } else {
9703            Ok(None)
9704        }
9705    }
9706
9707    /// Parse an optional table constraint (e.g. `PRIMARY KEY`, `UNIQUE`, `FOREIGN KEY`, `CHECK`).
9708    pub fn parse_optional_table_constraint(
9709        &mut self,
9710    ) -> Result<Option<TableConstraint>, ParserError> {
9711        let name = if self.parse_keyword(Keyword::CONSTRAINT) {
9712            if self.dialect.supports_constraint_keyword_without_name()
9713                && self
9714                    .peek_one_of_keywords(&[
9715                        Keyword::CHECK,
9716                        Keyword::PRIMARY,
9717                        Keyword::UNIQUE,
9718                        Keyword::FOREIGN,
9719                    ])
9720                    .is_some()
9721            {
9722                None
9723            } else {
9724                Some(self.parse_identifier()?)
9725            }
9726        } else {
9727            None
9728        };
9729
9730        let next_token = self.next_token();
9731        match next_token.token {
9732            Token::Word(w) if w.keyword == Keyword::UNIQUE => {
9733                // PostgreSQL: UNIQUE USING INDEX index_name
9734                // https://www.postgresql.org/docs/current/sql-altertable.html
9735                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9736                    return Ok(Some(TableConstraint::UniqueUsingIndex(
9737                        self.parse_constraint_using_index(name)?,
9738                    )));
9739                }
9740
9741                let index_type_display = self.parse_index_type_display();
9742                if !dialect_of!(self is GenericDialect | MySqlDialect)
9743                    && !index_type_display.is_none()
9744                {
9745                    return self.expected_ref(
9746                        "`index_name` or `(column_name [, ...])`",
9747                        self.peek_token_ref(),
9748                    );
9749                }
9750
9751                let nulls_distinct = self.parse_optional_nulls_distinct()?;
9752
9753                // optional index name
9754                let index_name = self.parse_optional_ident()?;
9755                let index_type = self.parse_optional_using_then_index_type()?;
9756
9757                let columns = self.parse_parenthesized_index_column_list()?;
9758                let index_options = self.parse_index_options()?;
9759                let characteristics = self.parse_constraint_characteristics()?;
9760                Ok(Some(
9761                    UniqueConstraint {
9762                        name,
9763                        index_name,
9764                        index_type_display,
9765                        index_type,
9766                        columns,
9767                        index_options,
9768                        characteristics,
9769                        nulls_distinct,
9770                    }
9771                    .into(),
9772                ))
9773            }
9774            Token::Word(w) if w.keyword == Keyword::PRIMARY => {
9775                // after `PRIMARY` always stay `KEY`
9776                self.expect_keyword_is(Keyword::KEY)?;
9777
9778                // PostgreSQL: PRIMARY KEY USING INDEX index_name
9779                // https://www.postgresql.org/docs/current/sql-altertable.html
9780                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9781                    return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
9782                        self.parse_constraint_using_index(name)?,
9783                    )));
9784                }
9785
9786                // optional index name
9787                let index_name = self.parse_optional_ident()?;
9788                let index_type = self.parse_optional_using_then_index_type()?;
9789
9790                let columns = self.parse_parenthesized_index_column_list()?;
9791                let index_options = self.parse_index_options()?;
9792                let characteristics = self.parse_constraint_characteristics()?;
9793                Ok(Some(
9794                    PrimaryKeyConstraint {
9795                        name,
9796                        index_name,
9797                        index_type,
9798                        columns,
9799                        index_options,
9800                        characteristics,
9801                    }
9802                    .into(),
9803                ))
9804            }
9805            Token::Word(w) if w.keyword == Keyword::FOREIGN => {
9806                self.expect_keyword_is(Keyword::KEY)?;
9807                let index_name = self.parse_optional_ident()?;
9808                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9809                self.expect_keyword_is(Keyword::REFERENCES)?;
9810                let foreign_table = self.parse_object_name(false)?;
9811                let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9812                let mut match_kind = None;
9813                let mut on_delete = None;
9814                let mut on_update = None;
9815                loop {
9816                    if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9817                        match_kind = Some(self.parse_match_kind()?);
9818                    } else if on_delete.is_none()
9819                        && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9820                    {
9821                        on_delete = Some(self.parse_referential_action()?);
9822                    } else if on_update.is_none()
9823                        && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9824                    {
9825                        on_update = Some(self.parse_referential_action()?);
9826                    } else {
9827                        break;
9828                    }
9829                }
9830
9831                let characteristics = self.parse_constraint_characteristics()?;
9832
9833                Ok(Some(
9834                    ForeignKeyConstraint {
9835                        name,
9836                        index_name,
9837                        columns,
9838                        foreign_table,
9839                        referred_columns,
9840                        on_delete,
9841                        on_update,
9842                        match_kind,
9843                        characteristics,
9844                    }
9845                    .into(),
9846                ))
9847            }
9848            Token::Word(w) if w.keyword == Keyword::CHECK => {
9849                self.expect_token(&Token::LParen)?;
9850                let expr = Box::new(self.parse_expr()?);
9851                self.expect_token(&Token::RParen)?;
9852
9853                let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9854                    Some(true)
9855                } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9856                    Some(false)
9857                } else {
9858                    None
9859                };
9860
9861                Ok(Some(
9862                    CheckConstraint {
9863                        name,
9864                        expr,
9865                        enforced,
9866                    }
9867                    .into(),
9868                ))
9869            }
9870            Token::Word(w)
9871                if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
9872                    && dialect_of!(self is GenericDialect | MySqlDialect)
9873                    && name.is_none() =>
9874            {
9875                let display_as_key = w.keyword == Keyword::KEY;
9876
9877                let name = match &self.peek_token_ref().token {
9878                    Token::Word(word) if word.keyword == Keyword::USING => None,
9879                    _ => self.parse_optional_ident()?,
9880                };
9881
9882                let index_type = self.parse_optional_using_then_index_type()?;
9883                let columns = self.parse_parenthesized_index_column_list()?;
9884                let index_options = self.parse_index_options()?;
9885
9886                Ok(Some(
9887                    IndexConstraint {
9888                        display_as_key,
9889                        name,
9890                        index_type,
9891                        columns,
9892                        index_options,
9893                    }
9894                    .into(),
9895                ))
9896            }
9897            Token::Word(w)
9898                if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
9899                    && dialect_of!(self is GenericDialect | MySqlDialect) =>
9900            {
9901                if let Some(name) = name {
9902                    return self.expected(
9903                        "FULLTEXT or SPATIAL option without constraint name",
9904                        TokenWithSpan {
9905                            token: Token::make_keyword(&name.to_string()),
9906                            span: next_token.span,
9907                        },
9908                    );
9909                }
9910
9911                let fulltext = w.keyword == Keyword::FULLTEXT;
9912
9913                let index_type_display = self.parse_index_type_display();
9914
9915                let opt_index_name = self.parse_optional_ident()?;
9916
9917                let columns = self.parse_parenthesized_index_column_list()?;
9918
9919                Ok(Some(
9920                    FullTextOrSpatialConstraint {
9921                        fulltext,
9922                        index_type_display,
9923                        opt_index_name,
9924                        columns,
9925                    }
9926                    .into(),
9927                ))
9928            }
9929            _ => {
9930                if name.is_some() {
9931                    self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
9932                } else {
9933                    self.prev_token();
9934                    Ok(None)
9935                }
9936            }
9937        }
9938    }
9939
9940    fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
9941        Ok(if self.parse_keyword(Keyword::NULLS) {
9942            let not = self.parse_keyword(Keyword::NOT);
9943            self.expect_keyword_is(Keyword::DISTINCT)?;
9944            if not {
9945                NullsDistinctOption::NotDistinct
9946            } else {
9947                NullsDistinctOption::Distinct
9948            }
9949        } else {
9950            NullsDistinctOption::None
9951        })
9952    }
9953
9954    /// Optionally parse a parenthesized list of `SqlOption`s introduced by `keyword`.
9955    pub fn maybe_parse_options(
9956        &mut self,
9957        keyword: Keyword,
9958    ) -> Result<Option<Vec<SqlOption>>, ParserError> {
9959        if let Token::Word(word) = &self.peek_token_ref().token {
9960            if word.keyword == keyword {
9961                return Ok(Some(self.parse_options(keyword)?));
9962            }
9963        };
9964        Ok(None)
9965    }
9966
9967    /// Parse a parenthesized list of `SqlOption`s following `keyword`, or return an empty vec.
9968    pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
9969        if self.parse_keyword(keyword) {
9970            self.expect_token(&Token::LParen)?;
9971            let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
9972            self.expect_token(&Token::RParen)?;
9973            Ok(options)
9974        } else {
9975            Ok(vec![])
9976        }
9977    }
9978
9979    /// Parse options introduced by one of `keywords` followed by a parenthesized list.
9980    pub fn parse_options_with_keywords(
9981        &mut self,
9982        keywords: &[Keyword],
9983    ) -> Result<Vec<SqlOption>, ParserError> {
9984        if self.parse_keywords(keywords) {
9985            self.expect_token(&Token::LParen)?;
9986            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
9987            self.expect_token(&Token::RParen)?;
9988            Ok(options)
9989        } else {
9990            Ok(vec![])
9991        }
9992    }
9993
9994    /// Parse an index type token (e.g. `BTREE`, `HASH`, or a custom identifier).
9995    pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
9996        Ok(if self.parse_keyword(Keyword::BTREE) {
9997            IndexType::BTree
9998        } else if self.parse_keyword(Keyword::HASH) {
9999            IndexType::Hash
10000        } else if self.parse_keyword(Keyword::GIN) {
10001            IndexType::GIN
10002        } else if self.parse_keyword(Keyword::GIST) {
10003            IndexType::GiST
10004        } else if self.parse_keyword(Keyword::SPGIST) {
10005            IndexType::SPGiST
10006        } else if self.parse_keyword(Keyword::BRIN) {
10007            IndexType::BRIN
10008        } else if self.parse_keyword(Keyword::BLOOM) {
10009            IndexType::Bloom
10010        } else {
10011            IndexType::Custom(self.parse_identifier()?)
10012        })
10013    }
10014
10015    /// Optionally parse the `USING` keyword, followed by an [IndexType]
10016    /// Example:
10017    /// ```sql
10018    //// USING BTREE (name, age DESC)
10019    /// ```
10020    /// Optionally parse `USING <index_type>` and return the parsed `IndexType` if present.
10021    pub fn parse_optional_using_then_index_type(
10022        &mut self,
10023    ) -> Result<Option<IndexType>, ParserError> {
10024        if self.parse_keyword(Keyword::USING) {
10025            Ok(Some(self.parse_index_type()?))
10026        } else {
10027            Ok(None)
10028        }
10029    }
10030
10031    /// Parse `[ident]`, mostly `ident` is name, like:
10032    /// `window_name`, `index_name`, ...
10033    /// Parse an optional identifier, returning `Some(Ident)` if present.
10034    pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10035        self.maybe_parse(|parser| parser.parse_identifier())
10036    }
10037
10038    #[must_use]
10039    /// Parse optional `KEY` or `INDEX` display tokens used in index/constraint declarations.
10040    pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10041        if self.parse_keyword(Keyword::KEY) {
10042            KeyOrIndexDisplay::Key
10043        } else if self.parse_keyword(Keyword::INDEX) {
10044            KeyOrIndexDisplay::Index
10045        } else {
10046            KeyOrIndexDisplay::None
10047        }
10048    }
10049
10050    /// Parse an optional index option such as `USING <type>` or `COMMENT <string>`.
10051    pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10052        if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10053            Ok(Some(IndexOption::Using(index_type)))
10054        } else if self.parse_keyword(Keyword::COMMENT) {
10055            let s = self.parse_literal_string()?;
10056            Ok(Some(IndexOption::Comment(s)))
10057        } else {
10058            Ok(None)
10059        }
10060    }
10061
10062    /// Parse zero or more index options and return them as a vector.
10063    pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10064        let mut options = Vec::new();
10065
10066        loop {
10067            match self.parse_optional_index_option()? {
10068                Some(index_option) => options.push(index_option),
10069                None => return Ok(options),
10070            }
10071        }
10072    }
10073
10074    /// Parse a single `SqlOption` used by various dialect-specific DDL statements.
10075    pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10076        let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10077
10078        match &self.peek_token_ref().token {
10079            Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10080                Ok(SqlOption::Ident(self.parse_identifier()?))
10081            }
10082            Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10083                self.parse_option_partition()
10084            }
10085            Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10086                self.parse_option_clustered()
10087            }
10088            _ => {
10089                let name = self.parse_identifier()?;
10090                self.expect_token(&Token::Eq)?;
10091                let value = self.parse_expr()?;
10092
10093                Ok(SqlOption::KeyValue { key: name, value })
10094            }
10095        }
10096    }
10097
10098    /// Parse a `CLUSTERED` table option (MSSQL-specific syntaxes supported).
10099    pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10100        if self.parse_keywords(&[
10101            Keyword::CLUSTERED,
10102            Keyword::COLUMNSTORE,
10103            Keyword::INDEX,
10104            Keyword::ORDER,
10105        ]) {
10106            Ok(SqlOption::Clustered(
10107                TableOptionsClustered::ColumnstoreIndexOrder(
10108                    self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10109                ),
10110            ))
10111        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10112            Ok(SqlOption::Clustered(
10113                TableOptionsClustered::ColumnstoreIndex,
10114            ))
10115        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10116            self.expect_token(&Token::LParen)?;
10117
10118            let columns = self.parse_comma_separated(|p| {
10119                let name = p.parse_identifier()?;
10120                let asc = p.parse_asc_desc();
10121
10122                Ok(ClusteredIndex { name, asc })
10123            })?;
10124
10125            self.expect_token(&Token::RParen)?;
10126
10127            Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10128        } else {
10129            Err(ParserError::ParserError(
10130                "invalid CLUSTERED sequence".to_string(),
10131            ))
10132        }
10133    }
10134
10135    /// Parse a `PARTITION(...) FOR VALUES(...)` table option.
10136    pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10137        self.expect_keyword_is(Keyword::PARTITION)?;
10138        self.expect_token(&Token::LParen)?;
10139        let column_name = self.parse_identifier()?;
10140
10141        self.expect_keyword_is(Keyword::RANGE)?;
10142        let range_direction = if self.parse_keyword(Keyword::LEFT) {
10143            Some(PartitionRangeDirection::Left)
10144        } else if self.parse_keyword(Keyword::RIGHT) {
10145            Some(PartitionRangeDirection::Right)
10146        } else {
10147            None
10148        };
10149
10150        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10151        self.expect_token(&Token::LParen)?;
10152
10153        let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10154
10155        self.expect_token(&Token::RParen)?;
10156        self.expect_token(&Token::RParen)?;
10157
10158        Ok(SqlOption::Partition {
10159            column_name,
10160            range_direction,
10161            for_values,
10162        })
10163    }
10164
10165    /// Parse a parenthesized list of partition expressions and return a `Partition` value.
10166    pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10167        self.expect_token(&Token::LParen)?;
10168        let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10169        self.expect_token(&Token::RParen)?;
10170        Ok(Partition::Partitions(partitions))
10171    }
10172
10173    /// Parse a parenthesized `SELECT` projection used for projection-based operations.
10174    pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10175        self.expect_token(&Token::LParen)?;
10176        self.expect_keyword_is(Keyword::SELECT)?;
10177        let projection = self.parse_projection()?;
10178        let group_by = self.parse_optional_group_by()?;
10179        let order_by = self.parse_optional_order_by()?;
10180        self.expect_token(&Token::RParen)?;
10181        Ok(ProjectionSelect {
10182            projection,
10183            group_by,
10184            order_by,
10185        })
10186    }
10187    /// Parse `ALTER TABLE ... ADD PROJECTION ...` operation.
10188    pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10189        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10190        let name = self.parse_identifier()?;
10191        let query = self.parse_projection_select()?;
10192        Ok(AlterTableOperation::AddProjection {
10193            if_not_exists,
10194            name,
10195            select: query,
10196        })
10197    }
10198
10199    /// Parse Redshift `ALTER SORTKEY (column_list)`.
10200    ///
10201    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html>
10202    fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10203        self.expect_keyword_is(Keyword::ALTER)?;
10204        self.expect_keyword_is(Keyword::SORTKEY)?;
10205        self.expect_token(&Token::LParen)?;
10206        let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10207        self.expect_token(&Token::RParen)?;
10208        Ok(AlterTableOperation::AlterSortKey { columns })
10209    }
10210
10211    /// Parse a single `ALTER TABLE` operation and return an `AlterTableOperation`.
10212    pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10213        let operation = if self.parse_keyword(Keyword::ADD) {
10214            if let Some(constraint) = self.parse_optional_table_constraint()? {
10215                let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10216                AlterTableOperation::AddConstraint {
10217                    constraint,
10218                    not_valid,
10219                }
10220            } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10221                && self.parse_keyword(Keyword::PROJECTION)
10222            {
10223                return self.parse_alter_table_add_projection();
10224            } else {
10225                let if_not_exists =
10226                    self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10227                let mut new_partitions = vec![];
10228                loop {
10229                    if self.parse_keyword(Keyword::PARTITION) {
10230                        new_partitions.push(self.parse_partition()?);
10231                    } else {
10232                        break;
10233                    }
10234                }
10235                if !new_partitions.is_empty() {
10236                    AlterTableOperation::AddPartitions {
10237                        if_not_exists,
10238                        new_partitions,
10239                    }
10240                } else {
10241                    let column_keyword = self.parse_keyword(Keyword::COLUMN);
10242
10243                    let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10244                    {
10245                        self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10246                            || if_not_exists
10247                    } else {
10248                        false
10249                    };
10250
10251                    let column_def = self.parse_column_def()?;
10252
10253                    let column_position = self.parse_column_position()?;
10254
10255                    AlterTableOperation::AddColumn {
10256                        column_keyword,
10257                        if_not_exists,
10258                        column_def,
10259                        column_position,
10260                    }
10261                }
10262            }
10263        } else if self.parse_keyword(Keyword::RENAME) {
10264            if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10265                let old_name = self.parse_identifier()?;
10266                self.expect_keyword_is(Keyword::TO)?;
10267                let new_name = self.parse_identifier()?;
10268                AlterTableOperation::RenameConstraint { old_name, new_name }
10269            } else if self.parse_keyword(Keyword::TO) {
10270                let table_name = self.parse_object_name(false)?;
10271                AlterTableOperation::RenameTable {
10272                    table_name: RenameTableNameKind::To(table_name),
10273                }
10274            } else if self.parse_keyword(Keyword::AS) {
10275                let table_name = self.parse_object_name(false)?;
10276                AlterTableOperation::RenameTable {
10277                    table_name: RenameTableNameKind::As(table_name),
10278                }
10279            } else {
10280                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10281                let old_column_name = self.parse_identifier()?;
10282                self.expect_keyword_is(Keyword::TO)?;
10283                let new_column_name = self.parse_identifier()?;
10284                AlterTableOperation::RenameColumn {
10285                    old_column_name,
10286                    new_column_name,
10287                }
10288            }
10289        } else if self.parse_keyword(Keyword::DISABLE) {
10290            if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10291                AlterTableOperation::DisableRowLevelSecurity {}
10292            } else if self.parse_keyword(Keyword::RULE) {
10293                let name = self.parse_identifier()?;
10294                AlterTableOperation::DisableRule { name }
10295            } else if self.parse_keyword(Keyword::TRIGGER) {
10296                let name = self.parse_identifier()?;
10297                AlterTableOperation::DisableTrigger { name }
10298            } else {
10299                return self.expected_ref(
10300                    "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10301                    self.peek_token_ref(),
10302                );
10303            }
10304        } else if self.parse_keyword(Keyword::ENABLE) {
10305            if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10306                let name = self.parse_identifier()?;
10307                AlterTableOperation::EnableAlwaysRule { name }
10308            } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10309                let name = self.parse_identifier()?;
10310                AlterTableOperation::EnableAlwaysTrigger { name }
10311            } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10312                AlterTableOperation::EnableRowLevelSecurity {}
10313            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10314                let name = self.parse_identifier()?;
10315                AlterTableOperation::EnableReplicaRule { name }
10316            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10317                let name = self.parse_identifier()?;
10318                AlterTableOperation::EnableReplicaTrigger { name }
10319            } else if self.parse_keyword(Keyword::RULE) {
10320                let name = self.parse_identifier()?;
10321                AlterTableOperation::EnableRule { name }
10322            } else if self.parse_keyword(Keyword::TRIGGER) {
10323                let name = self.parse_identifier()?;
10324                AlterTableOperation::EnableTrigger { name }
10325            } else {
10326                return self.expected_ref(
10327                    "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10328                    self.peek_token_ref(),
10329                );
10330            }
10331        } else if self.parse_keywords(&[
10332            Keyword::FORCE,
10333            Keyword::ROW,
10334            Keyword::LEVEL,
10335            Keyword::SECURITY,
10336        ]) {
10337            AlterTableOperation::ForceRowLevelSecurity
10338        } else if self.parse_keywords(&[
10339            Keyword::NO,
10340            Keyword::FORCE,
10341            Keyword::ROW,
10342            Keyword::LEVEL,
10343            Keyword::SECURITY,
10344        ]) {
10345            AlterTableOperation::NoForceRowLevelSecurity
10346        } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10347            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10348        {
10349            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10350            let name = self.parse_identifier()?;
10351            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10352                Some(self.parse_identifier()?)
10353            } else {
10354                None
10355            };
10356            AlterTableOperation::ClearProjection {
10357                if_exists,
10358                name,
10359                partition,
10360            }
10361        } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10362            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10363        {
10364            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10365            let name = self.parse_identifier()?;
10366            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10367                Some(self.parse_identifier()?)
10368            } else {
10369                None
10370            };
10371            AlterTableOperation::MaterializeProjection {
10372                if_exists,
10373                name,
10374                partition,
10375            }
10376        } else if self.parse_keyword(Keyword::DROP) {
10377            if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10378                self.expect_token(&Token::LParen)?;
10379                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10380                self.expect_token(&Token::RParen)?;
10381                AlterTableOperation::DropPartitions {
10382                    partitions,
10383                    if_exists: true,
10384                }
10385            } else if self.parse_keyword(Keyword::PARTITION) {
10386                self.expect_token(&Token::LParen)?;
10387                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10388                self.expect_token(&Token::RParen)?;
10389                AlterTableOperation::DropPartitions {
10390                    partitions,
10391                    if_exists: false,
10392                }
10393            } else if self.parse_keyword(Keyword::CONSTRAINT) {
10394                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10395                let name = self.parse_identifier()?;
10396                let drop_behavior = self.parse_optional_drop_behavior();
10397                AlterTableOperation::DropConstraint {
10398                    if_exists,
10399                    name,
10400                    drop_behavior,
10401                }
10402            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10403                let drop_behavior = self.parse_optional_drop_behavior();
10404                AlterTableOperation::DropPrimaryKey { drop_behavior }
10405            } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10406                let name = self.parse_identifier()?;
10407                let drop_behavior = self.parse_optional_drop_behavior();
10408                AlterTableOperation::DropForeignKey {
10409                    name,
10410                    drop_behavior,
10411                }
10412            } else if self.parse_keyword(Keyword::INDEX) {
10413                let name = self.parse_identifier()?;
10414                AlterTableOperation::DropIndex { name }
10415            } else if self.parse_keyword(Keyword::PROJECTION)
10416                && dialect_of!(self is ClickHouseDialect|GenericDialect)
10417            {
10418                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10419                let name = self.parse_identifier()?;
10420                AlterTableOperation::DropProjection { if_exists, name }
10421            } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10422                AlterTableOperation::DropClusteringKey
10423            } else {
10424                let has_column_keyword = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10425                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10426                let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10427                    self.parse_comma_separated(Parser::parse_identifier)?
10428                } else {
10429                    vec![self.parse_identifier()?]
10430                };
10431                let drop_behavior = self.parse_optional_drop_behavior();
10432                AlterTableOperation::DropColumn {
10433                    has_column_keyword,
10434                    column_names,
10435                    if_exists,
10436                    drop_behavior,
10437                }
10438            }
10439        } else if self.parse_keyword(Keyword::PARTITION) {
10440            self.expect_token(&Token::LParen)?;
10441            let before = self.parse_comma_separated(Parser::parse_expr)?;
10442            self.expect_token(&Token::RParen)?;
10443            self.expect_keyword_is(Keyword::RENAME)?;
10444            self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10445            self.expect_token(&Token::LParen)?;
10446            let renames = self.parse_comma_separated(Parser::parse_expr)?;
10447            self.expect_token(&Token::RParen)?;
10448            AlterTableOperation::RenamePartitions {
10449                old_partitions: before,
10450                new_partitions: renames,
10451            }
10452        } else if self.parse_keyword(Keyword::CHANGE) {
10453            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10454            let old_name = self.parse_identifier()?;
10455            let new_name = self.parse_identifier()?;
10456            let data_type = self.parse_data_type()?;
10457            let mut options = vec![];
10458            while let Some(option) = self.parse_optional_column_option()? {
10459                options.push(option);
10460            }
10461
10462            let column_position = self.parse_column_position()?;
10463
10464            AlterTableOperation::ChangeColumn {
10465                old_name,
10466                new_name,
10467                data_type,
10468                options,
10469                column_position,
10470            }
10471        } else if self.parse_keyword(Keyword::MODIFY) {
10472            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10473            let col_name = self.parse_identifier()?;
10474            let data_type = self.parse_data_type()?;
10475            let mut options = vec![];
10476            while let Some(option) = self.parse_optional_column_option()? {
10477                options.push(option);
10478            }
10479
10480            let column_position = self.parse_column_position()?;
10481
10482            AlterTableOperation::ModifyColumn {
10483                col_name,
10484                data_type,
10485                options,
10486                column_position,
10487            }
10488        } else if self.parse_keyword(Keyword::ALTER) {
10489            if self.peek_keyword(Keyword::SORTKEY) {
10490                self.prev_token();
10491                return self.parse_alter_sort_key();
10492            }
10493
10494            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10495            let column_name = self.parse_identifier()?;
10496            let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10497
10498            let op: AlterColumnOperation = if self.parse_keywords(&[
10499                Keyword::SET,
10500                Keyword::NOT,
10501                Keyword::NULL,
10502            ]) {
10503                AlterColumnOperation::SetNotNull {}
10504            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10505                AlterColumnOperation::DropNotNull {}
10506            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10507                AlterColumnOperation::SetDefault {
10508                    value: self.parse_expr()?,
10509                }
10510            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10511                AlterColumnOperation::DropDefault {}
10512            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10513                self.parse_set_data_type(true)?
10514            } else if self.parse_keyword(Keyword::TYPE) {
10515                self.parse_set_data_type(false)?
10516            } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10517                let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10518                    Some(GeneratedAs::Always)
10519                } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10520                    Some(GeneratedAs::ByDefault)
10521                } else {
10522                    None
10523                };
10524
10525                self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10526
10527                let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10528
10529                if self.peek_token_ref().token == Token::LParen {
10530                    self.expect_token(&Token::LParen)?;
10531                    sequence_options = Some(self.parse_create_sequence_options()?);
10532                    self.expect_token(&Token::RParen)?;
10533                }
10534
10535                AlterColumnOperation::AddGenerated {
10536                    generated_as,
10537                    sequence_options,
10538                }
10539            } else {
10540                let message = if is_postgresql {
10541                    "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10542                } else {
10543                    "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10544                };
10545
10546                return self.expected_ref(message, self.peek_token_ref());
10547            };
10548            AlterTableOperation::AlterColumn { column_name, op }
10549        } else if self.parse_keyword(Keyword::SWAP) {
10550            self.expect_keyword_is(Keyword::WITH)?;
10551            let table_name = self.parse_object_name(false)?;
10552            AlterTableOperation::SwapWith { table_name }
10553        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10554            && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10555        {
10556            let new_owner = self.parse_owner()?;
10557            AlterTableOperation::OwnerTo { new_owner }
10558        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10559            && self.parse_keyword(Keyword::ATTACH)
10560        {
10561            AlterTableOperation::AttachPartition {
10562                partition: self.parse_part_or_partition()?,
10563            }
10564        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10565            && self.parse_keyword(Keyword::DETACH)
10566        {
10567            AlterTableOperation::DetachPartition {
10568                partition: self.parse_part_or_partition()?,
10569            }
10570        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10571            && self.parse_keyword(Keyword::FREEZE)
10572        {
10573            let partition = self.parse_part_or_partition()?;
10574            let with_name = if self.parse_keyword(Keyword::WITH) {
10575                self.expect_keyword_is(Keyword::NAME)?;
10576                Some(self.parse_identifier()?)
10577            } else {
10578                None
10579            };
10580            AlterTableOperation::FreezePartition {
10581                partition,
10582                with_name,
10583            }
10584        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10585            && self.parse_keyword(Keyword::UNFREEZE)
10586        {
10587            let partition = self.parse_part_or_partition()?;
10588            let with_name = if self.parse_keyword(Keyword::WITH) {
10589                self.expect_keyword_is(Keyword::NAME)?;
10590                Some(self.parse_identifier()?)
10591            } else {
10592                None
10593            };
10594            AlterTableOperation::UnfreezePartition {
10595                partition,
10596                with_name,
10597            }
10598        } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
10599            self.expect_token(&Token::LParen)?;
10600            let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
10601            self.expect_token(&Token::RParen)?;
10602            AlterTableOperation::ClusterBy { exprs }
10603        } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
10604            AlterTableOperation::SuspendRecluster
10605        } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
10606            AlterTableOperation::ResumeRecluster
10607        } else if self.parse_keyword(Keyword::LOCK) {
10608            let equals = self.consume_token(&Token::Eq);
10609            let lock = match self.parse_one_of_keywords(&[
10610                Keyword::DEFAULT,
10611                Keyword::EXCLUSIVE,
10612                Keyword::NONE,
10613                Keyword::SHARED,
10614            ]) {
10615                Some(Keyword::DEFAULT) => AlterTableLock::Default,
10616                Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
10617                Some(Keyword::NONE) => AlterTableLock::None,
10618                Some(Keyword::SHARED) => AlterTableLock::Shared,
10619                _ => self.expected_ref(
10620                    "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
10621                    self.peek_token_ref(),
10622                )?,
10623            };
10624            AlterTableOperation::Lock { equals, lock }
10625        } else if self.parse_keyword(Keyword::ALGORITHM) {
10626            let equals = self.consume_token(&Token::Eq);
10627            let algorithm = match self.parse_one_of_keywords(&[
10628                Keyword::DEFAULT,
10629                Keyword::INSTANT,
10630                Keyword::INPLACE,
10631                Keyword::COPY,
10632            ]) {
10633                Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
10634                Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
10635                Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
10636                Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
10637                _ => self.expected_ref(
10638                    "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
10639                    self.peek_token_ref(),
10640                )?,
10641            };
10642            AlterTableOperation::Algorithm { equals, algorithm }
10643        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
10644            let equals = self.consume_token(&Token::Eq);
10645            let value = self.parse_number_value()?;
10646            AlterTableOperation::AutoIncrement { equals, value }
10647        } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
10648            let identity = if self.parse_keyword(Keyword::NOTHING) {
10649                ReplicaIdentity::Nothing
10650            } else if self.parse_keyword(Keyword::FULL) {
10651                ReplicaIdentity::Full
10652            } else if self.parse_keyword(Keyword::DEFAULT) {
10653                ReplicaIdentity::Default
10654            } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10655                ReplicaIdentity::Index(self.parse_identifier()?)
10656            } else {
10657                return self.expected_ref(
10658                    "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
10659                    self.peek_token_ref(),
10660                );
10661            };
10662
10663            AlterTableOperation::ReplicaIdentity { identity }
10664        } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
10665            let name = self.parse_identifier()?;
10666            AlterTableOperation::ValidateConstraint { name }
10667        } else {
10668            let mut options =
10669                self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
10670            if !options.is_empty() {
10671                AlterTableOperation::SetTblProperties {
10672                    table_properties: options,
10673                }
10674            } else {
10675                options = self.parse_options(Keyword::SET)?;
10676                if !options.is_empty() {
10677                    AlterTableOperation::SetOptionsParens { options }
10678                } else {
10679                    return self.expected_ref(
10680                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
10681                    self.peek_token_ref(),
10682                  );
10683                }
10684            }
10685        };
10686        Ok(operation)
10687    }
10688
10689    fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
10690        let data_type = self.parse_data_type()?;
10691        let using = if self.dialect.supports_alter_column_type_using()
10692            && self.parse_keyword(Keyword::USING)
10693        {
10694            Some(self.parse_expr()?)
10695        } else {
10696            None
10697        };
10698        Ok(AlterColumnOperation::SetDataType {
10699            data_type,
10700            using,
10701            had_set,
10702        })
10703    }
10704
10705    fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
10706        let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
10707        match keyword {
10708            Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
10709            Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
10710            // unreachable because expect_one_of_keywords used above
10711            unexpected_keyword => Err(ParserError::ParserError(
10712                format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
10713            )),
10714        }
10715    }
10716
10717    /// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
10718    pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10719        let object_type = self.expect_one_of_keywords(&[
10720            Keyword::VIEW,
10721            Keyword::TYPE,
10722            Keyword::COLLATION,
10723            Keyword::TABLE,
10724            Keyword::INDEX,
10725            Keyword::FUNCTION,
10726            Keyword::AGGREGATE,
10727            Keyword::ROLE,
10728            Keyword::POLICY,
10729            Keyword::CONNECTOR,
10730            Keyword::ICEBERG,
10731            Keyword::SCHEMA,
10732            Keyword::USER,
10733            Keyword::OPERATOR,
10734        ])?;
10735        match object_type {
10736            Keyword::SCHEMA => {
10737                self.prev_token();
10738                self.prev_token();
10739                self.parse_alter_schema()
10740            }
10741            Keyword::VIEW => self.parse_alter_view(),
10742            Keyword::TYPE => self.parse_alter_type(),
10743            Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
10744            Keyword::TABLE => self.parse_alter_table(false),
10745            Keyword::ICEBERG => {
10746                self.expect_keyword(Keyword::TABLE)?;
10747                self.parse_alter_table(true)
10748            }
10749            Keyword::INDEX => {
10750                let index_name = self.parse_object_name(false)?;
10751                let operation = if self.parse_keyword(Keyword::RENAME) {
10752                    if self.parse_keyword(Keyword::TO) {
10753                        let index_name = self.parse_object_name(false)?;
10754                        AlterIndexOperation::RenameIndex { index_name }
10755                    } else {
10756                        return self.expected_ref("TO after RENAME", self.peek_token_ref());
10757                    }
10758                } else {
10759                    return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
10760                };
10761
10762                Ok(Statement::AlterIndex {
10763                    name: index_name,
10764                    operation,
10765                })
10766            }
10767            Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
10768            Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
10769            Keyword::OPERATOR => {
10770                if self.parse_keyword(Keyword::FAMILY) {
10771                    self.parse_alter_operator_family().map(Into::into)
10772                } else if self.parse_keyword(Keyword::CLASS) {
10773                    self.parse_alter_operator_class().map(Into::into)
10774                } else {
10775                    self.parse_alter_operator().map(Into::into)
10776                }
10777            }
10778            Keyword::ROLE => self.parse_alter_role(),
10779            Keyword::POLICY => self.parse_alter_policy().map(Into::into),
10780            Keyword::CONNECTOR => self.parse_alter_connector(),
10781            Keyword::USER => self.parse_alter_user().map(Into::into),
10782            // unreachable because expect_one_of_keywords used above
10783            unexpected_keyword => Err(ParserError::ParserError(
10784                format!("Internal parser error: expected any of {{VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
10785            )),
10786        }
10787    }
10788
10789    fn parse_alter_aggregate_signature(
10790        &mut self,
10791    ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
10792        let name = self.parse_object_name(false)?;
10793        self.expect_token(&Token::LParen)?;
10794
10795        if self.consume_token(&Token::Mul) {
10796            self.expect_token(&Token::RParen)?;
10797            return Ok((
10798                FunctionDesc {
10799                    name,
10800                    args: Some(vec![]),
10801                },
10802                true,
10803                None,
10804            ));
10805        }
10806
10807        let args =
10808            if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
10809                vec![]
10810            } else {
10811                self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
10812            };
10813
10814        let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
10815            Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
10816        } else {
10817            None
10818        };
10819
10820        self.expect_token(&Token::RParen)?;
10821        Ok((
10822            FunctionDesc {
10823                name,
10824                args: Some(args),
10825            },
10826            false,
10827            aggregate_order_by,
10828        ))
10829    }
10830
10831    fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
10832        let action = if self.parse_keywords(&[
10833            Keyword::CALLED,
10834            Keyword::ON,
10835            Keyword::NULL,
10836            Keyword::INPUT,
10837        ]) {
10838            Some(AlterFunctionAction::CalledOnNull(
10839                FunctionCalledOnNull::CalledOnNullInput,
10840            ))
10841        } else if self.parse_keywords(&[
10842            Keyword::RETURNS,
10843            Keyword::NULL,
10844            Keyword::ON,
10845            Keyword::NULL,
10846            Keyword::INPUT,
10847        ]) {
10848            Some(AlterFunctionAction::CalledOnNull(
10849                FunctionCalledOnNull::ReturnsNullOnNullInput,
10850            ))
10851        } else if self.parse_keyword(Keyword::STRICT) {
10852            Some(AlterFunctionAction::CalledOnNull(
10853                FunctionCalledOnNull::Strict,
10854            ))
10855        } else if self.parse_keyword(Keyword::IMMUTABLE) {
10856            Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
10857        } else if self.parse_keyword(Keyword::STABLE) {
10858            Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
10859        } else if self.parse_keyword(Keyword::VOLATILE) {
10860            Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
10861        } else if self.parse_keyword(Keyword::NOT) {
10862            self.expect_keyword(Keyword::LEAKPROOF)?;
10863            Some(AlterFunctionAction::Leakproof(false))
10864        } else if self.parse_keyword(Keyword::LEAKPROOF) {
10865            Some(AlterFunctionAction::Leakproof(true))
10866        } else if self.parse_keyword(Keyword::EXTERNAL) {
10867            self.expect_keyword(Keyword::SECURITY)?;
10868            let security = if self.parse_keyword(Keyword::DEFINER) {
10869                FunctionSecurity::Definer
10870            } else if self.parse_keyword(Keyword::INVOKER) {
10871                FunctionSecurity::Invoker
10872            } else {
10873                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
10874            };
10875            Some(AlterFunctionAction::Security {
10876                external: true,
10877                security,
10878            })
10879        } else if self.parse_keyword(Keyword::SECURITY) {
10880            let security = if self.parse_keyword(Keyword::DEFINER) {
10881                FunctionSecurity::Definer
10882            } else if self.parse_keyword(Keyword::INVOKER) {
10883                FunctionSecurity::Invoker
10884            } else {
10885                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
10886            };
10887            Some(AlterFunctionAction::Security {
10888                external: false,
10889                security,
10890            })
10891        } else if self.parse_keyword(Keyword::PARALLEL) {
10892            let parallel = if self.parse_keyword(Keyword::UNSAFE) {
10893                FunctionParallel::Unsafe
10894            } else if self.parse_keyword(Keyword::RESTRICTED) {
10895                FunctionParallel::Restricted
10896            } else if self.parse_keyword(Keyword::SAFE) {
10897                FunctionParallel::Safe
10898            } else {
10899                return self
10900                    .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
10901            };
10902            Some(AlterFunctionAction::Parallel(parallel))
10903        } else if self.parse_keyword(Keyword::COST) {
10904            Some(AlterFunctionAction::Cost(self.parse_number()?))
10905        } else if self.parse_keyword(Keyword::ROWS) {
10906            Some(AlterFunctionAction::Rows(self.parse_number()?))
10907        } else if self.parse_keyword(Keyword::SUPPORT) {
10908            Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
10909        } else if self.parse_keyword(Keyword::SET) {
10910            let name = self.parse_object_name(false)?;
10911            let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
10912                FunctionSetValue::FromCurrent
10913            } else {
10914                if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
10915                    return self.expected_ref("= or TO", self.peek_token_ref());
10916                }
10917                if self.parse_keyword(Keyword::DEFAULT) {
10918                    FunctionSetValue::Default
10919                } else {
10920                    FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
10921                }
10922            };
10923            Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
10924                name,
10925                value,
10926            }))
10927        } else if self.parse_keyword(Keyword::RESET) {
10928            let reset_config = if self.parse_keyword(Keyword::ALL) {
10929                ResetConfig::ALL
10930            } else {
10931                ResetConfig::ConfigName(self.parse_object_name(false)?)
10932            };
10933            Some(AlterFunctionAction::Reset(reset_config))
10934        } else {
10935            None
10936        };
10937
10938        Ok(action)
10939    }
10940
10941    fn parse_alter_function_actions(
10942        &mut self,
10943    ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
10944        let mut actions = vec![];
10945        while let Some(action) = self.parse_alter_function_action()? {
10946            actions.push(action);
10947        }
10948        if actions.is_empty() {
10949            return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
10950        }
10951        let restrict = self.parse_keyword(Keyword::RESTRICT);
10952        Ok((actions, restrict))
10953    }
10954
10955    /// Parse an `ALTER FUNCTION` or `ALTER AGGREGATE` statement.
10956    pub fn parse_alter_function(
10957        &mut self,
10958        kind: AlterFunctionKind,
10959    ) -> Result<Statement, ParserError> {
10960        let (function, aggregate_star, aggregate_order_by) = match kind {
10961            AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
10962            AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
10963        };
10964
10965        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
10966            let new_name = self.parse_identifier()?;
10967            AlterFunctionOperation::RenameTo { new_name }
10968        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
10969            AlterFunctionOperation::OwnerTo(self.parse_owner()?)
10970        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
10971            AlterFunctionOperation::SetSchema {
10972                schema_name: self.parse_object_name(false)?,
10973            }
10974        } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
10975            if !self.parse_keyword(Keyword::DEPENDS) {
10976                return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
10977            }
10978            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
10979            AlterFunctionOperation::DependsOnExtension {
10980                no: true,
10981                extension_name: self.parse_object_name(false)?,
10982            }
10983        } else if matches!(kind, AlterFunctionKind::Function)
10984            && self.parse_keyword(Keyword::DEPENDS)
10985        {
10986            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
10987            AlterFunctionOperation::DependsOnExtension {
10988                no: false,
10989                extension_name: self.parse_object_name(false)?,
10990            }
10991        } else if matches!(kind, AlterFunctionKind::Function) {
10992            let (actions, restrict) = self.parse_alter_function_actions()?;
10993            AlterFunctionOperation::Actions { actions, restrict }
10994        } else {
10995            return self.expected_ref(
10996                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
10997                self.peek_token_ref(),
10998            );
10999        };
11000
11001        Ok(Statement::AlterFunction(AlterFunction {
11002            kind,
11003            function,
11004            aggregate_order_by,
11005            aggregate_star,
11006            operation,
11007        }))
11008    }
11009
11010    /// Parse a [Statement::AlterTable]
11011    pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11012        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11013        let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
11014        let table_name = self.parse_object_name(false)?;
11015        let on_cluster = self.parse_optional_on_cluster()?;
11016        let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11017
11018        let mut location = None;
11019        if self.parse_keyword(Keyword::LOCATION) {
11020            location = Some(HiveSetLocation {
11021                has_set: false,
11022                location: self.parse_identifier()?,
11023            });
11024        } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11025            location = Some(HiveSetLocation {
11026                has_set: true,
11027                location: self.parse_identifier()?,
11028            });
11029        }
11030
11031        let end_token = if self.peek_token_ref().token == Token::SemiColon {
11032            self.peek_token_ref().clone()
11033        } else {
11034            self.get_current_token().clone()
11035        };
11036
11037        Ok(AlterTable {
11038            name: table_name,
11039            if_exists,
11040            only,
11041            operations,
11042            location,
11043            on_cluster,
11044            table_type: if iceberg {
11045                Some(AlterTableType::Iceberg)
11046            } else {
11047                None
11048            },
11049            end_token: AttachedToken(end_token),
11050        }
11051        .into())
11052    }
11053
11054    /// Parse an `ALTER VIEW` statement.
11055    pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11056        let name = self.parse_object_name(false)?;
11057        let columns = self.parse_parenthesized_column_list(Optional, false)?;
11058
11059        let with_options = self.parse_options(Keyword::WITH)?;
11060
11061        self.expect_keyword_is(Keyword::AS)?;
11062        let query = self.parse_query()?;
11063
11064        Ok(Statement::AlterView {
11065            name,
11066            columns,
11067            query,
11068            with_options,
11069        })
11070    }
11071
11072    /// Parse a [Statement::AlterType]
11073    pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11074        let name = self.parse_object_name(false)?;
11075
11076        if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11077            let new_name = self.parse_identifier()?;
11078            Ok(Statement::AlterType(AlterType {
11079                name,
11080                operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11081            }))
11082        } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11083            let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11084            let new_enum_value = self.parse_identifier()?;
11085            let position = if self.parse_keyword(Keyword::BEFORE) {
11086                Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11087            } else if self.parse_keyword(Keyword::AFTER) {
11088                Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11089            } else {
11090                None
11091            };
11092
11093            Ok(Statement::AlterType(AlterType {
11094                name,
11095                operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11096                    if_not_exists,
11097                    value: new_enum_value,
11098                    position,
11099                }),
11100            }))
11101        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11102            let existing_enum_value = self.parse_identifier()?;
11103            self.expect_keyword(Keyword::TO)?;
11104            let new_enum_value = self.parse_identifier()?;
11105
11106            Ok(Statement::AlterType(AlterType {
11107                name,
11108                operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11109                    from: existing_enum_value,
11110                    to: new_enum_value,
11111                }),
11112            }))
11113        } else {
11114            self.expected_ref(
11115                "{RENAME TO | { RENAME | ADD } VALUE}",
11116                self.peek_token_ref(),
11117            )
11118        }
11119    }
11120
11121    /// Parse a [Statement::AlterCollation].
11122    ///
11123    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-altercollation.html)
11124    pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11125        let name = self.parse_object_name(false)?;
11126        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11127            AlterCollationOperation::RenameTo {
11128                new_name: self.parse_identifier()?,
11129            }
11130        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11131            AlterCollationOperation::OwnerTo(self.parse_owner()?)
11132        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11133            AlterCollationOperation::SetSchema {
11134                schema_name: self.parse_object_name(false)?,
11135            }
11136        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11137            AlterCollationOperation::RefreshVersion
11138        } else {
11139            return self.expected_ref(
11140                "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11141                self.peek_token_ref(),
11142            );
11143        };
11144
11145        Ok(AlterCollation { name, operation })
11146    }
11147
11148    /// Parse a [Statement::AlterOperator]
11149    ///
11150    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-alteroperator.html)
11151    pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11152        let name = self.parse_operator_name()?;
11153
11154        // Parse (left_type, right_type)
11155        self.expect_token(&Token::LParen)?;
11156
11157        let left_type = if self.parse_keyword(Keyword::NONE) {
11158            None
11159        } else {
11160            Some(self.parse_data_type()?)
11161        };
11162
11163        self.expect_token(&Token::Comma)?;
11164        let right_type = self.parse_data_type()?;
11165        self.expect_token(&Token::RParen)?;
11166
11167        // Parse the operation
11168        let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11169            let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11170                Owner::CurrentRole
11171            } else if self.parse_keyword(Keyword::CURRENT_USER) {
11172                Owner::CurrentUser
11173            } else if self.parse_keyword(Keyword::SESSION_USER) {
11174                Owner::SessionUser
11175            } else {
11176                Owner::Ident(self.parse_identifier()?)
11177            };
11178            AlterOperatorOperation::OwnerTo(owner)
11179        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11180            let schema_name = self.parse_object_name(false)?;
11181            AlterOperatorOperation::SetSchema { schema_name }
11182        } else if self.parse_keyword(Keyword::SET) {
11183            self.expect_token(&Token::LParen)?;
11184
11185            let mut options = Vec::new();
11186            loop {
11187                let keyword = self.expect_one_of_keywords(&[
11188                    Keyword::RESTRICT,
11189                    Keyword::JOIN,
11190                    Keyword::COMMUTATOR,
11191                    Keyword::NEGATOR,
11192                    Keyword::HASHES,
11193                    Keyword::MERGES,
11194                ])?;
11195
11196                match keyword {
11197                    Keyword::RESTRICT => {
11198                        self.expect_token(&Token::Eq)?;
11199                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11200                            None
11201                        } else {
11202                            Some(self.parse_object_name(false)?)
11203                        };
11204                        options.push(OperatorOption::Restrict(proc_name));
11205                    }
11206                    Keyword::JOIN => {
11207                        self.expect_token(&Token::Eq)?;
11208                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11209                            None
11210                        } else {
11211                            Some(self.parse_object_name(false)?)
11212                        };
11213                        options.push(OperatorOption::Join(proc_name));
11214                    }
11215                    Keyword::COMMUTATOR => {
11216                        self.expect_token(&Token::Eq)?;
11217                        let op_name = self.parse_operator_name()?;
11218                        options.push(OperatorOption::Commutator(op_name));
11219                    }
11220                    Keyword::NEGATOR => {
11221                        self.expect_token(&Token::Eq)?;
11222                        let op_name = self.parse_operator_name()?;
11223                        options.push(OperatorOption::Negator(op_name));
11224                    }
11225                    Keyword::HASHES => {
11226                        options.push(OperatorOption::Hashes);
11227                    }
11228                    Keyword::MERGES => {
11229                        options.push(OperatorOption::Merges);
11230                    }
11231                    unexpected_keyword => return Err(ParserError::ParserError(
11232                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11233                    )),
11234                }
11235
11236                if !self.consume_token(&Token::Comma) {
11237                    break;
11238                }
11239            }
11240
11241            self.expect_token(&Token::RParen)?;
11242            AlterOperatorOperation::Set { options }
11243        } else {
11244            return self.expected_ref(
11245                "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11246                self.peek_token_ref(),
11247            );
11248        };
11249
11250        Ok(AlterOperator {
11251            name,
11252            left_type,
11253            right_type,
11254            operation,
11255        })
11256    }
11257
11258    /// Parse an operator item for ALTER OPERATOR FAMILY ADD operations
11259    fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11260        let strategy_number = self.parse_literal_uint()?;
11261        let operator_name = self.parse_operator_name()?;
11262
11263        // Operator argument types (required for ALTER OPERATOR FAMILY)
11264        self.expect_token(&Token::LParen)?;
11265        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11266        self.expect_token(&Token::RParen)?;
11267
11268        // Optional purpose
11269        let purpose = if self.parse_keyword(Keyword::FOR) {
11270            if self.parse_keyword(Keyword::SEARCH) {
11271                Some(OperatorPurpose::ForSearch)
11272            } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11273                let sort_family = self.parse_object_name(false)?;
11274                Some(OperatorPurpose::ForOrderBy { sort_family })
11275            } else {
11276                return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11277            }
11278        } else {
11279            None
11280        };
11281
11282        Ok(OperatorFamilyItem::Operator {
11283            strategy_number,
11284            operator_name,
11285            op_types,
11286            purpose,
11287        })
11288    }
11289
11290    /// Parse a function item for ALTER OPERATOR FAMILY ADD operations
11291    fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11292        let support_number = self.parse_literal_uint()?;
11293
11294        // Optional operator types
11295        let op_types =
11296            if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11297                let types = self.parse_comma_separated(Parser::parse_data_type)?;
11298                self.expect_token(&Token::RParen)?;
11299                Some(types)
11300            } else if self.consume_token(&Token::LParen) {
11301                self.expect_token(&Token::RParen)?;
11302                Some(vec![])
11303            } else {
11304                None
11305            };
11306
11307        let function_name = self.parse_object_name(false)?;
11308
11309        // Function argument types
11310        let argument_types = if self.consume_token(&Token::LParen) {
11311            if self.peek_token_ref().token == Token::RParen {
11312                self.expect_token(&Token::RParen)?;
11313                vec![]
11314            } else {
11315                let types = self.parse_comma_separated(Parser::parse_data_type)?;
11316                self.expect_token(&Token::RParen)?;
11317                types
11318            }
11319        } else {
11320            vec![]
11321        };
11322
11323        Ok(OperatorFamilyItem::Function {
11324            support_number,
11325            op_types,
11326            function_name,
11327            argument_types,
11328        })
11329    }
11330
11331    /// Parse an operator item for ALTER OPERATOR FAMILY DROP operations
11332    fn parse_operator_family_drop_operator(
11333        &mut self,
11334    ) -> Result<OperatorFamilyDropItem, ParserError> {
11335        let strategy_number = self.parse_literal_uint()?;
11336
11337        // Operator argument types (required for DROP)
11338        self.expect_token(&Token::LParen)?;
11339        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11340        self.expect_token(&Token::RParen)?;
11341
11342        Ok(OperatorFamilyDropItem::Operator {
11343            strategy_number,
11344            op_types,
11345        })
11346    }
11347
11348    /// Parse a function item for ALTER OPERATOR FAMILY DROP operations
11349    fn parse_operator_family_drop_function(
11350        &mut self,
11351    ) -> Result<OperatorFamilyDropItem, ParserError> {
11352        let support_number = self.parse_literal_uint()?;
11353
11354        // Operator types (required for DROP)
11355        self.expect_token(&Token::LParen)?;
11356        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11357        self.expect_token(&Token::RParen)?;
11358
11359        Ok(OperatorFamilyDropItem::Function {
11360            support_number,
11361            op_types,
11362        })
11363    }
11364
11365    /// Parse an operator family item for ADD operations (dispatches to operator or function parsing)
11366    fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11367        if self.parse_keyword(Keyword::OPERATOR) {
11368            self.parse_operator_family_add_operator()
11369        } else if self.parse_keyword(Keyword::FUNCTION) {
11370            self.parse_operator_family_add_function()
11371        } else {
11372            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11373        }
11374    }
11375
11376    /// Parse an operator family item for DROP operations (dispatches to operator or function parsing)
11377    fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11378        if self.parse_keyword(Keyword::OPERATOR) {
11379            self.parse_operator_family_drop_operator()
11380        } else if self.parse_keyword(Keyword::FUNCTION) {
11381            self.parse_operator_family_drop_function()
11382        } else {
11383            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11384        }
11385    }
11386
11387    /// Parse a [Statement::AlterOperatorFamily]
11388    /// See <https://www.postgresql.org/docs/current/sql-alteropfamily.html>
11389    pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11390        let name = self.parse_object_name(false)?;
11391        self.expect_keyword(Keyword::USING)?;
11392        let using = self.parse_identifier()?;
11393
11394        let operation = if self.parse_keyword(Keyword::ADD) {
11395            let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11396            AlterOperatorFamilyOperation::Add { items }
11397        } else if self.parse_keyword(Keyword::DROP) {
11398            let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11399            AlterOperatorFamilyOperation::Drop { items }
11400        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11401            let new_name = self.parse_object_name(false)?;
11402            AlterOperatorFamilyOperation::RenameTo { new_name }
11403        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11404            let owner = self.parse_owner()?;
11405            AlterOperatorFamilyOperation::OwnerTo(owner)
11406        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11407            let schema_name = self.parse_object_name(false)?;
11408            AlterOperatorFamilyOperation::SetSchema { schema_name }
11409        } else {
11410            return self.expected_ref(
11411                "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11412                self.peek_token_ref(),
11413            );
11414        };
11415
11416        Ok(AlterOperatorFamily {
11417            name,
11418            using,
11419            operation,
11420        })
11421    }
11422
11423    /// Parse an `ALTER OPERATOR CLASS` statement.
11424    ///
11425    /// Handles operations like `RENAME TO`, `OWNER TO`, and `SET SCHEMA`.
11426    pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11427        let name = self.parse_object_name(false)?;
11428        self.expect_keyword(Keyword::USING)?;
11429        let using = self.parse_identifier()?;
11430
11431        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11432            let new_name = self.parse_object_name(false)?;
11433            AlterOperatorClassOperation::RenameTo { new_name }
11434        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11435            let owner = self.parse_owner()?;
11436            AlterOperatorClassOperation::OwnerTo(owner)
11437        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11438            let schema_name = self.parse_object_name(false)?;
11439            AlterOperatorClassOperation::SetSchema { schema_name }
11440        } else {
11441            return self.expected_ref(
11442                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11443                self.peek_token_ref(),
11444            );
11445        };
11446
11447        Ok(AlterOperatorClass {
11448            name,
11449            using,
11450            operation,
11451        })
11452    }
11453
11454    /// Parse an `ALTER SCHEMA` statement.
11455    ///
11456    /// Supports operations such as setting options, renaming, adding/dropping replicas, and changing owner.
11457    pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11458        self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11459        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11460        let name = self.parse_object_name(false)?;
11461        let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11462            self.prev_token();
11463            let options = self.parse_options(Keyword::OPTIONS)?;
11464            AlterSchemaOperation::SetOptionsParens { options }
11465        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11466            let collate = self.parse_expr()?;
11467            AlterSchemaOperation::SetDefaultCollate { collate }
11468        } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11469            let replica = self.parse_identifier()?;
11470            let options = if self.peek_keyword(Keyword::OPTIONS) {
11471                Some(self.parse_options(Keyword::OPTIONS)?)
11472            } else {
11473                None
11474            };
11475            AlterSchemaOperation::AddReplica { replica, options }
11476        } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11477            let replica = self.parse_identifier()?;
11478            AlterSchemaOperation::DropReplica { replica }
11479        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11480            let new_name = self.parse_object_name(false)?;
11481            AlterSchemaOperation::Rename { name: new_name }
11482        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11483            let owner = self.parse_owner()?;
11484            AlterSchemaOperation::OwnerTo { owner }
11485        } else {
11486            return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11487        };
11488        Ok(Statement::AlterSchema(AlterSchema {
11489            name,
11490            if_exists,
11491            operations: vec![operation],
11492        }))
11493    }
11494
11495    /// Parse a `CALL procedure_name(arg1, arg2, ...)`
11496    /// or `CALL procedure_name` statement
11497    pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11498        let object_name = self.parse_object_name(false)?;
11499        if self.peek_token_ref().token == Token::LParen {
11500            match self.parse_function(object_name)? {
11501                Expr::Function(f) => Ok(Statement::Call(f)),
11502                other => parser_err!(
11503                    format!("Expected a simple procedure call but found: {other}"),
11504                    self.peek_token_ref().span.start
11505                ),
11506            }
11507        } else {
11508            Ok(Statement::Call(Function {
11509                name: object_name,
11510                uses_odbc_syntax: false,
11511                parameters: FunctionArguments::None,
11512                args: FunctionArguments::None,
11513                over: None,
11514                filter: None,
11515                null_treatment: None,
11516                within_group: vec![],
11517            }))
11518        }
11519    }
11520
11521    /// Parse a copy statement
11522    pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11523        let source;
11524        if self.consume_token(&Token::LParen) {
11525            source = CopySource::Query(self.parse_query()?);
11526            self.expect_token(&Token::RParen)?;
11527        } else {
11528            let table_name = self.parse_object_name(false)?;
11529            let columns = self.parse_parenthesized_column_list(Optional, false)?;
11530            source = CopySource::Table {
11531                table_name,
11532                columns,
11533            };
11534        }
11535        let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
11536            Some(Keyword::FROM) => false,
11537            Some(Keyword::TO) => true,
11538            _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
11539        };
11540        if !to {
11541            // Use a separate if statement to prevent Rust compiler from complaining about
11542            // "if statement in this position is unstable: https://github.com/rust-lang/rust/issues/53667"
11543            if let CopySource::Query(_) = source {
11544                return Err(ParserError::ParserError(
11545                    "COPY ... FROM does not support query as a source".to_string(),
11546                ));
11547            }
11548        }
11549        let target = if self.parse_keyword(Keyword::STDIN) {
11550            CopyTarget::Stdin
11551        } else if self.parse_keyword(Keyword::STDOUT) {
11552            CopyTarget::Stdout
11553        } else if self.parse_keyword(Keyword::PROGRAM) {
11554            CopyTarget::Program {
11555                command: self.parse_literal_string()?,
11556            }
11557        } else {
11558            CopyTarget::File {
11559                filename: self.parse_literal_string()?,
11560            }
11561        };
11562        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
11563        let mut options = vec![];
11564        if self.consume_token(&Token::LParen) {
11565            options = self.parse_comma_separated(Parser::parse_copy_option)?;
11566            self.expect_token(&Token::RParen)?;
11567        }
11568        let mut legacy_options = vec![];
11569        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
11570            legacy_options.push(opt);
11571        }
11572        let values =
11573            if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
11574                self.expect_token(&Token::SemiColon)?;
11575                self.parse_tsv()
11576            } else {
11577                vec![]
11578            };
11579        Ok(Statement::Copy {
11580            source,
11581            to,
11582            target,
11583            options,
11584            legacy_options,
11585            values,
11586        })
11587    }
11588
11589    /// Parse [Statement::Open]
11590    fn parse_open(&mut self) -> Result<Statement, ParserError> {
11591        self.expect_keyword(Keyword::OPEN)?;
11592        Ok(Statement::Open(OpenStatement {
11593            cursor_name: self.parse_identifier()?,
11594        }))
11595    }
11596
11597    /// Parse a `CLOSE` cursor statement.
11598    pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
11599        let cursor = if self.parse_keyword(Keyword::ALL) {
11600            CloseCursor::All
11601        } else {
11602            let name = self.parse_identifier()?;
11603
11604            CloseCursor::Specific { name }
11605        };
11606
11607        Ok(Statement::Close { cursor })
11608    }
11609
11610    fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
11611        let ret = match self.parse_one_of_keywords(&[
11612            Keyword::FORMAT,
11613            Keyword::FREEZE,
11614            Keyword::DELIMITER,
11615            Keyword::NULL,
11616            Keyword::HEADER,
11617            Keyword::QUOTE,
11618            Keyword::ESCAPE,
11619            Keyword::FORCE_QUOTE,
11620            Keyword::FORCE_NOT_NULL,
11621            Keyword::FORCE_NULL,
11622            Keyword::ENCODING,
11623        ]) {
11624            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
11625            Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
11626                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11627                Some(Keyword::FALSE)
11628            )),
11629            Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
11630            Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
11631            Some(Keyword::HEADER) => CopyOption::Header(!matches!(
11632                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11633                Some(Keyword::FALSE)
11634            )),
11635            Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
11636            Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
11637            Some(Keyword::FORCE_QUOTE) => {
11638                CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
11639            }
11640            Some(Keyword::FORCE_NOT_NULL) => {
11641                CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11642            }
11643            Some(Keyword::FORCE_NULL) => {
11644                CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11645            }
11646            Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
11647            _ => self.expected_ref("option", self.peek_token_ref())?,
11648        };
11649        Ok(ret)
11650    }
11651
11652    fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
11653        // FORMAT \[ AS \] is optional
11654        if self.parse_keyword(Keyword::FORMAT) {
11655            let _ = self.parse_keyword(Keyword::AS);
11656        }
11657
11658        let ret = match self.parse_one_of_keywords(&[
11659            Keyword::ACCEPTANYDATE,
11660            Keyword::ACCEPTINVCHARS,
11661            Keyword::ADDQUOTES,
11662            Keyword::ALLOWOVERWRITE,
11663            Keyword::BINARY,
11664            Keyword::BLANKSASNULL,
11665            Keyword::BZIP2,
11666            Keyword::CLEANPATH,
11667            Keyword::COMPUPDATE,
11668            Keyword::CREDENTIALS,
11669            Keyword::CSV,
11670            Keyword::DATEFORMAT,
11671            Keyword::DELIMITER,
11672            Keyword::EMPTYASNULL,
11673            Keyword::ENCRYPTED,
11674            Keyword::ESCAPE,
11675            Keyword::EXTENSION,
11676            Keyword::FIXEDWIDTH,
11677            Keyword::GZIP,
11678            Keyword::HEADER,
11679            Keyword::IAM_ROLE,
11680            Keyword::IGNOREHEADER,
11681            Keyword::JSON,
11682            Keyword::MANIFEST,
11683            Keyword::MAXFILESIZE,
11684            Keyword::NULL,
11685            Keyword::PARALLEL,
11686            Keyword::PARQUET,
11687            Keyword::PARTITION,
11688            Keyword::REGION,
11689            Keyword::REMOVEQUOTES,
11690            Keyword::ROWGROUPSIZE,
11691            Keyword::STATUPDATE,
11692            Keyword::TIMEFORMAT,
11693            Keyword::TRUNCATECOLUMNS,
11694            Keyword::ZSTD,
11695        ]) {
11696            Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
11697            Some(Keyword::ACCEPTINVCHARS) => {
11698                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
11699                let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11700                    Some(self.parse_literal_string()?)
11701                } else {
11702                    None
11703                };
11704                CopyLegacyOption::AcceptInvChars(ch)
11705            }
11706            Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
11707            Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
11708            Some(Keyword::BINARY) => CopyLegacyOption::Binary,
11709            Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
11710            Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
11711            Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
11712            Some(Keyword::COMPUPDATE) => {
11713                let preset = self.parse_keyword(Keyword::PRESET);
11714                let enabled = match self.parse_one_of_keywords(&[
11715                    Keyword::TRUE,
11716                    Keyword::FALSE,
11717                    Keyword::ON,
11718                    Keyword::OFF,
11719                ]) {
11720                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11721                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11722                    _ => None,
11723                };
11724                CopyLegacyOption::CompUpdate { preset, enabled }
11725            }
11726            Some(Keyword::CREDENTIALS) => {
11727                CopyLegacyOption::Credentials(self.parse_literal_string()?)
11728            }
11729            Some(Keyword::CSV) => CopyLegacyOption::Csv({
11730                let mut opts = vec![];
11731                while let Some(opt) =
11732                    self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
11733                {
11734                    opts.push(opt);
11735                }
11736                opts
11737            }),
11738            Some(Keyword::DATEFORMAT) => {
11739                let _ = self.parse_keyword(Keyword::AS);
11740                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11741                    Some(self.parse_literal_string()?)
11742                } else {
11743                    None
11744                };
11745                CopyLegacyOption::DateFormat(fmt)
11746            }
11747            Some(Keyword::DELIMITER) => {
11748                let _ = self.parse_keyword(Keyword::AS);
11749                CopyLegacyOption::Delimiter(self.parse_literal_char()?)
11750            }
11751            Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
11752            Some(Keyword::ENCRYPTED) => {
11753                let auto = self.parse_keyword(Keyword::AUTO);
11754                CopyLegacyOption::Encrypted { auto }
11755            }
11756            Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
11757            Some(Keyword::EXTENSION) => {
11758                let ext = self.parse_literal_string()?;
11759                CopyLegacyOption::Extension(ext)
11760            }
11761            Some(Keyword::FIXEDWIDTH) => {
11762                let spec = self.parse_literal_string()?;
11763                CopyLegacyOption::FixedWidth(spec)
11764            }
11765            Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
11766            Some(Keyword::HEADER) => CopyLegacyOption::Header,
11767            Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
11768            Some(Keyword::IGNOREHEADER) => {
11769                let _ = self.parse_keyword(Keyword::AS);
11770                let num_rows = self.parse_literal_uint()?;
11771                CopyLegacyOption::IgnoreHeader(num_rows)
11772            }
11773            Some(Keyword::JSON) => {
11774                let _ = self.parse_keyword(Keyword::AS);
11775                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11776                    Some(self.parse_literal_string()?)
11777                } else {
11778                    None
11779                };
11780                CopyLegacyOption::Json(fmt)
11781            }
11782            Some(Keyword::MANIFEST) => {
11783                let verbose = self.parse_keyword(Keyword::VERBOSE);
11784                CopyLegacyOption::Manifest { verbose }
11785            }
11786            Some(Keyword::MAXFILESIZE) => {
11787                let _ = self.parse_keyword(Keyword::AS);
11788                let size = self.parse_number_value()?;
11789                let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11790                    Some(Keyword::MB) => Some(FileSizeUnit::MB),
11791                    Some(Keyword::GB) => Some(FileSizeUnit::GB),
11792                    _ => None,
11793                };
11794                CopyLegacyOption::MaxFileSize(FileSize { size, unit })
11795            }
11796            Some(Keyword::NULL) => {
11797                let _ = self.parse_keyword(Keyword::AS);
11798                CopyLegacyOption::Null(self.parse_literal_string()?)
11799            }
11800            Some(Keyword::PARALLEL) => {
11801                let enabled = match self.parse_one_of_keywords(&[
11802                    Keyword::TRUE,
11803                    Keyword::FALSE,
11804                    Keyword::ON,
11805                    Keyword::OFF,
11806                ]) {
11807                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11808                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11809                    _ => None,
11810                };
11811                CopyLegacyOption::Parallel(enabled)
11812            }
11813            Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
11814            Some(Keyword::PARTITION) => {
11815                self.expect_keyword(Keyword::BY)?;
11816                let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
11817                let include = self.parse_keyword(Keyword::INCLUDE);
11818                CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
11819            }
11820            Some(Keyword::REGION) => {
11821                let _ = self.parse_keyword(Keyword::AS);
11822                let region = self.parse_literal_string()?;
11823                CopyLegacyOption::Region(region)
11824            }
11825            Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
11826            Some(Keyword::ROWGROUPSIZE) => {
11827                let _ = self.parse_keyword(Keyword::AS);
11828                let file_size = self.parse_file_size()?;
11829                CopyLegacyOption::RowGroupSize(file_size)
11830            }
11831            Some(Keyword::STATUPDATE) => {
11832                let enabled = match self.parse_one_of_keywords(&[
11833                    Keyword::TRUE,
11834                    Keyword::FALSE,
11835                    Keyword::ON,
11836                    Keyword::OFF,
11837                ]) {
11838                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11839                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11840                    _ => None,
11841                };
11842                CopyLegacyOption::StatUpdate(enabled)
11843            }
11844            Some(Keyword::TIMEFORMAT) => {
11845                let _ = self.parse_keyword(Keyword::AS);
11846                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11847                    Some(self.parse_literal_string()?)
11848                } else {
11849                    None
11850                };
11851                CopyLegacyOption::TimeFormat(fmt)
11852            }
11853            Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
11854            Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
11855            _ => self.expected_ref("option", self.peek_token_ref())?,
11856        };
11857        Ok(ret)
11858    }
11859
11860    fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
11861        let size = self.parse_number_value()?;
11862        let unit = self.maybe_parse_file_size_unit();
11863        Ok(FileSize { size, unit })
11864    }
11865
11866    fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
11867        match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11868            Some(Keyword::MB) => Some(FileSizeUnit::MB),
11869            Some(Keyword::GB) => Some(FileSizeUnit::GB),
11870            _ => None,
11871        }
11872    }
11873
11874    fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
11875        if self.parse_keyword(Keyword::DEFAULT) {
11876            Ok(IamRoleKind::Default)
11877        } else {
11878            let arn = self.parse_literal_string()?;
11879            Ok(IamRoleKind::Arn(arn))
11880        }
11881    }
11882
11883    fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
11884        let ret = match self.parse_one_of_keywords(&[
11885            Keyword::HEADER,
11886            Keyword::QUOTE,
11887            Keyword::ESCAPE,
11888            Keyword::FORCE,
11889        ]) {
11890            Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
11891            Some(Keyword::QUOTE) => {
11892                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
11893                CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
11894            }
11895            Some(Keyword::ESCAPE) => {
11896                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
11897                CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
11898            }
11899            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
11900                CopyLegacyCsvOption::ForceNotNull(
11901                    self.parse_comma_separated(|p| p.parse_identifier())?,
11902                )
11903            }
11904            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
11905                CopyLegacyCsvOption::ForceQuote(
11906                    self.parse_comma_separated(|p| p.parse_identifier())?,
11907                )
11908            }
11909            _ => self.expected_ref("csv option", self.peek_token_ref())?,
11910        };
11911        Ok(ret)
11912    }
11913
11914    fn parse_literal_char(&mut self) -> Result<char, ParserError> {
11915        let s = self.parse_literal_string()?;
11916        if s.len() != 1 {
11917            let loc = self
11918                .tokens
11919                .get(self.index - 1)
11920                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
11921            return parser_err!(format!("Expect a char, found {s:?}"), loc);
11922        }
11923        Ok(s.chars().next().unwrap())
11924    }
11925
11926    /// Parse a tab separated values in
11927    /// COPY payload
11928    pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
11929        self.parse_tab_value()
11930    }
11931
11932    /// Parse a single tab-separated value row used by `COPY` payload parsing.
11933    pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
11934        let mut values = vec![];
11935        let mut content = String::new();
11936        while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
11937            match t {
11938                Token::Whitespace(Whitespace::Tab) => {
11939                    values.push(Some(core::mem::take(&mut content)));
11940                }
11941                Token::Whitespace(Whitespace::Newline) => {
11942                    values.push(Some(core::mem::take(&mut content)));
11943                }
11944                Token::Backslash => {
11945                    if self.consume_token(&Token::Period) {
11946                        return values;
11947                    }
11948                    if let Token::Word(w) = self.next_token().token {
11949                        if w.value == "N" {
11950                            values.push(None);
11951                        }
11952                    }
11953                }
11954                _ => {
11955                    content.push_str(&t.to_string());
11956                }
11957            }
11958        }
11959        values
11960    }
11961
11962    /// Parse a literal value (numbers, strings, date/time, booleans)
11963    pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
11964        let next_token = self.next_token();
11965        let span = next_token.span;
11966        let ok_value = |value: Value| Ok(value.with_span(span));
11967        match next_token.token {
11968            Token::Word(w) => match w.keyword {
11969                Keyword::TRUE if self.dialect.supports_boolean_literals() => {
11970                    ok_value(Value::Boolean(true))
11971                }
11972                Keyword::FALSE if self.dialect.supports_boolean_literals() => {
11973                    ok_value(Value::Boolean(false))
11974                }
11975                Keyword::NULL => ok_value(Value::Null),
11976                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
11977                    Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
11978                    Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
11979                    _ => self.expected(
11980                        "A value?",
11981                        TokenWithSpan {
11982                            token: Token::Word(w),
11983                            span,
11984                        },
11985                    )?,
11986                },
11987                _ => self.expected(
11988                    "a concrete value",
11989                    TokenWithSpan {
11990                        token: Token::Word(w),
11991                        span,
11992                    },
11993                ),
11994            },
11995            // The call to n.parse() returns a bigdecimal when the
11996            // bigdecimal feature is enabled, and is otherwise a no-op
11997            // (i.e., it returns the input string).
11998            Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
11999            Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12000                self.maybe_concat_string_literal(s.to_string()),
12001            )),
12002            Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12003                self.maybe_concat_string_literal(s.to_string()),
12004            )),
12005            Token::TripleSingleQuotedString(ref s) => {
12006                ok_value(Value::TripleSingleQuotedString(s.to_string()))
12007            }
12008            Token::TripleDoubleQuotedString(ref s) => {
12009                ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12010            }
12011            Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12012            Token::SingleQuotedByteStringLiteral(ref s) => {
12013                ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12014            }
12015            Token::DoubleQuotedByteStringLiteral(ref s) => {
12016                ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12017            }
12018            Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12019                ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12020            }
12021            Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12022                ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12023            }
12024            Token::SingleQuotedRawStringLiteral(ref s) => {
12025                ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12026            }
12027            Token::DoubleQuotedRawStringLiteral(ref s) => {
12028                ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12029            }
12030            Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12031                ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12032            }
12033            Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12034                ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12035            }
12036            Token::NationalStringLiteral(ref s) => {
12037                ok_value(Value::NationalStringLiteral(s.to_string()))
12038            }
12039            Token::QuoteDelimitedStringLiteral(v) => {
12040                ok_value(Value::QuoteDelimitedStringLiteral(v))
12041            }
12042            Token::NationalQuoteDelimitedStringLiteral(v) => {
12043                ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12044            }
12045            Token::EscapedStringLiteral(ref s) => {
12046                ok_value(Value::EscapedStringLiteral(s.to_string()))
12047            }
12048            Token::UnicodeStringLiteral(ref s) => {
12049                ok_value(Value::UnicodeStringLiteral(s.to_string()))
12050            }
12051            Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12052            Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12053            tok @ Token::Colon | tok @ Token::AtSign => {
12054                // 1. Not calling self.parse_identifier(false)?
12055                //    because only in placeholder we want to check
12056                //    numbers as idfentifies.  This because snowflake
12057                //    allows numbers as placeholders
12058                // 2. Not calling self.next_token() to enforce `tok`
12059                //    be followed immediately by a word/number, ie.
12060                //    without any whitespace in between
12061                let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12062                let ident = match next_token.token {
12063                    Token::Word(w) => Ok(w.into_ident(next_token.span)),
12064                    Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12065                    _ => self.expected("placeholder", next_token),
12066                }?;
12067                Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12068                    .with_span(Span::new(span.start, ident.span.end)))
12069            }
12070            unexpected => self.expected(
12071                "a value",
12072                TokenWithSpan {
12073                    token: unexpected,
12074                    span,
12075                },
12076            ),
12077        }
12078    }
12079
12080    fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12081        if self.dialect.supports_string_literal_concatenation() {
12082            while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12083                self.peek_token_ref().token
12084            {
12085                str.push_str(s);
12086                self.advance_token();
12087            }
12088        } else if self
12089            .dialect
12090            .supports_string_literal_concatenation_with_newline()
12091        {
12092            // We are iterating over tokens including whitespaces, to identify
12093            // string literals separated by newlines so we can concatenate them.
12094            let mut after_newline = false;
12095            loop {
12096                match self.peek_token_no_skip().token {
12097                    Token::Whitespace(Whitespace::Newline) => {
12098                        after_newline = true;
12099                        self.next_token_no_skip();
12100                    }
12101                    Token::Whitespace(_) => {
12102                        self.next_token_no_skip();
12103                    }
12104                    Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12105                        if after_newline =>
12106                    {
12107                        str.push_str(s.clone().as_str());
12108                        self.next_token_no_skip();
12109                        after_newline = false;
12110                    }
12111                    _ => break,
12112                }
12113            }
12114        }
12115
12116        str
12117    }
12118
12119    /// Parse an unsigned numeric literal
12120    pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12121        let value_wrapper = self.parse_value()?;
12122        match &value_wrapper.value {
12123            Value::Number(_, _) => Ok(value_wrapper),
12124            Value::Placeholder(_) => Ok(value_wrapper),
12125            _ => {
12126                self.prev_token();
12127                self.expected_ref("literal number", self.peek_token_ref())
12128            }
12129        }
12130    }
12131
12132    /// Parse a numeric literal as an expression. Returns a [`Expr::UnaryOp`] if the number is signed,
12133    /// otherwise returns a [`Expr::Value`]
12134    pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12135        let next_token = self.next_token();
12136        match next_token.token {
12137            Token::Plus => Ok(Expr::UnaryOp {
12138                op: UnaryOperator::Plus,
12139                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12140            }),
12141            Token::Minus => Ok(Expr::UnaryOp {
12142                op: UnaryOperator::Minus,
12143                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12144            }),
12145            _ => {
12146                self.prev_token();
12147                Ok(Expr::Value(self.parse_number_value()?))
12148            }
12149        }
12150    }
12151
12152    fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12153        let next_token = self.next_token();
12154        let span = next_token.span;
12155        match next_token.token {
12156            Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12157                Value::SingleQuotedString(s.to_string()).with_span(span),
12158            )),
12159            Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12160                Value::DoubleQuotedString(s.to_string()).with_span(span),
12161            )),
12162            Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12163                Value::HexStringLiteral(s.to_string()).with_span(span),
12164            )),
12165            unexpected => self.expected(
12166                "a string value",
12167                TokenWithSpan {
12168                    token: unexpected,
12169                    span,
12170                },
12171            ),
12172        }
12173    }
12174
12175    /// Parse an unsigned literal integer/long
12176    pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12177        let next_token = self.next_token();
12178        match next_token.token {
12179            Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12180            _ => self.expected("literal int", next_token),
12181        }
12182    }
12183
12184    /// Parse the body of a `CREATE FUNCTION` specified as a string.
12185    /// e.g. `CREATE FUNCTION ... AS $$ body $$`.
12186    fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12187        let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12188            let peek_token = parser.peek_token();
12189            let span = peek_token.span;
12190            match peek_token.token {
12191                Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12192                {
12193                    parser.next_token();
12194                    Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12195                }
12196                _ => Ok(Expr::Value(
12197                    Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12198                )),
12199            }
12200        };
12201
12202        Ok(CreateFunctionBody::AsBeforeOptions {
12203            body: parse_string_expr(self)?,
12204            link_symbol: if self.consume_token(&Token::Comma) {
12205                Some(parse_string_expr(self)?)
12206            } else {
12207                None
12208            },
12209        })
12210    }
12211
12212    /// Parse a literal string
12213    pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12214        let next_token = self.next_token();
12215        match next_token.token {
12216            Token::Word(Word {
12217                value,
12218                keyword: Keyword::NoKeyword,
12219                ..
12220            }) => Ok(value),
12221            Token::SingleQuotedString(s) => Ok(s),
12222            Token::DoubleQuotedString(s) => Ok(s),
12223            Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12224                Ok(s)
12225            }
12226            Token::UnicodeStringLiteral(s) => Ok(s),
12227            _ => self.expected("literal string", next_token),
12228        }
12229    }
12230
12231    /// Parse a boolean string
12232    pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12233        match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12234            Some(Keyword::TRUE) => Ok(true),
12235            Some(Keyword::FALSE) => Ok(false),
12236            _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12237        }
12238    }
12239
12240    /// Parse a literal unicode normalization clause
12241    pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12242        let neg = self.parse_keyword(Keyword::NOT);
12243        let normalized_form = self.maybe_parse(|parser| {
12244            match parser.parse_one_of_keywords(&[
12245                Keyword::NFC,
12246                Keyword::NFD,
12247                Keyword::NFKC,
12248                Keyword::NFKD,
12249            ]) {
12250                Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12251                Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12252                Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12253                Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12254                _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12255            }
12256        })?;
12257        if self.parse_keyword(Keyword::NORMALIZED) {
12258            return Ok(Expr::IsNormalized {
12259                expr: Box::new(expr),
12260                form: normalized_form,
12261                negated: neg,
12262            });
12263        }
12264        self.expected_ref("unicode normalization form", self.peek_token_ref())
12265    }
12266
12267    /// Parse parenthesized enum members, used with `ENUM(...)` type definitions.
12268    pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12269        self.expect_token(&Token::LParen)?;
12270        let values = self.parse_comma_separated(|parser| {
12271            let name = parser.parse_literal_string()?;
12272            let e = if parser.consume_token(&Token::Eq) {
12273                let value = parser.parse_number()?;
12274                EnumMember::NamedValue(name, value)
12275            } else {
12276                EnumMember::Name(name)
12277            };
12278            Ok(e)
12279        })?;
12280        self.expect_token(&Token::RParen)?;
12281
12282        Ok(values)
12283    }
12284
12285    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
12286    pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12287        let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12288        if trailing_bracket.0 {
12289            return parser_err!(
12290                format!("unmatched > after parsing data type {ty}"),
12291                self.peek_token_ref()
12292            );
12293        }
12294
12295        Ok(ty)
12296    }
12297
12298    fn parse_data_type_helper(
12299        &mut self,
12300    ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12301        let dialect = self.dialect;
12302        self.advance_token();
12303        let next_token = self.get_current_token();
12304        let next_token_index = self.get_current_index();
12305
12306        let mut trailing_bracket: MatchedTrailingBracket = false.into();
12307        let mut data = match &next_token.token {
12308            Token::Word(w) => match w.keyword {
12309                Keyword::BOOLEAN => Ok(DataType::Boolean),
12310                Keyword::BOOL => Ok(DataType::Bool),
12311                Keyword::FLOAT => {
12312                    let precision = self.parse_exact_number_optional_precision_scale()?;
12313
12314                    if self.parse_keyword(Keyword::UNSIGNED) {
12315                        Ok(DataType::FloatUnsigned(precision))
12316                    } else {
12317                        Ok(DataType::Float(precision))
12318                    }
12319                }
12320                Keyword::REAL => {
12321                    if self.parse_keyword(Keyword::UNSIGNED) {
12322                        Ok(DataType::RealUnsigned)
12323                    } else {
12324                        Ok(DataType::Real)
12325                    }
12326                }
12327                Keyword::FLOAT4 => Ok(DataType::Float4),
12328                Keyword::FLOAT32 => Ok(DataType::Float32),
12329                Keyword::FLOAT64 => Ok(DataType::Float64),
12330                Keyword::FLOAT8 => Ok(DataType::Float8),
12331                Keyword::DOUBLE => {
12332                    if self.parse_keyword(Keyword::PRECISION) {
12333                        if self.parse_keyword(Keyword::UNSIGNED) {
12334                            Ok(DataType::DoublePrecisionUnsigned)
12335                        } else {
12336                            Ok(DataType::DoublePrecision)
12337                        }
12338                    } else {
12339                        let precision = self.parse_exact_number_optional_precision_scale()?;
12340
12341                        if self.parse_keyword(Keyword::UNSIGNED) {
12342                            Ok(DataType::DoubleUnsigned(precision))
12343                        } else {
12344                            Ok(DataType::Double(precision))
12345                        }
12346                    }
12347                }
12348                Keyword::TINYINT => {
12349                    let optional_precision = self.parse_optional_precision();
12350                    if self.parse_keyword(Keyword::UNSIGNED) {
12351                        Ok(DataType::TinyIntUnsigned(optional_precision?))
12352                    } else {
12353                        if dialect.supports_data_type_signed_suffix() {
12354                            let _ = self.parse_keyword(Keyword::SIGNED);
12355                        }
12356                        Ok(DataType::TinyInt(optional_precision?))
12357                    }
12358                }
12359                Keyword::INT2 => {
12360                    let optional_precision = self.parse_optional_precision();
12361                    if self.parse_keyword(Keyword::UNSIGNED) {
12362                        Ok(DataType::Int2Unsigned(optional_precision?))
12363                    } else {
12364                        Ok(DataType::Int2(optional_precision?))
12365                    }
12366                }
12367                Keyword::SMALLINT => {
12368                    let optional_precision = self.parse_optional_precision();
12369                    if self.parse_keyword(Keyword::UNSIGNED) {
12370                        Ok(DataType::SmallIntUnsigned(optional_precision?))
12371                    } else {
12372                        if dialect.supports_data_type_signed_suffix() {
12373                            let _ = self.parse_keyword(Keyword::SIGNED);
12374                        }
12375                        Ok(DataType::SmallInt(optional_precision?))
12376                    }
12377                }
12378                Keyword::MEDIUMINT => {
12379                    let optional_precision = self.parse_optional_precision();
12380                    if self.parse_keyword(Keyword::UNSIGNED) {
12381                        Ok(DataType::MediumIntUnsigned(optional_precision?))
12382                    } else {
12383                        if dialect.supports_data_type_signed_suffix() {
12384                            let _ = self.parse_keyword(Keyword::SIGNED);
12385                        }
12386                        Ok(DataType::MediumInt(optional_precision?))
12387                    }
12388                }
12389                Keyword::INT => {
12390                    let optional_precision = self.parse_optional_precision();
12391                    if self.parse_keyword(Keyword::UNSIGNED) {
12392                        Ok(DataType::IntUnsigned(optional_precision?))
12393                    } else {
12394                        if dialect.supports_data_type_signed_suffix() {
12395                            let _ = self.parse_keyword(Keyword::SIGNED);
12396                        }
12397                        Ok(DataType::Int(optional_precision?))
12398                    }
12399                }
12400                Keyword::INT4 => {
12401                    let optional_precision = self.parse_optional_precision();
12402                    if self.parse_keyword(Keyword::UNSIGNED) {
12403                        Ok(DataType::Int4Unsigned(optional_precision?))
12404                    } else {
12405                        Ok(DataType::Int4(optional_precision?))
12406                    }
12407                }
12408                Keyword::INT8 => {
12409                    let optional_precision = self.parse_optional_precision();
12410                    if self.parse_keyword(Keyword::UNSIGNED) {
12411                        Ok(DataType::Int8Unsigned(optional_precision?))
12412                    } else {
12413                        Ok(DataType::Int8(optional_precision?))
12414                    }
12415                }
12416                Keyword::INT16 => Ok(DataType::Int16),
12417                Keyword::INT32 => Ok(DataType::Int32),
12418                Keyword::INT64 => Ok(DataType::Int64),
12419                Keyword::INT128 => Ok(DataType::Int128),
12420                Keyword::INT256 => Ok(DataType::Int256),
12421                Keyword::INTEGER => {
12422                    let optional_precision = self.parse_optional_precision();
12423                    if self.parse_keyword(Keyword::UNSIGNED) {
12424                        Ok(DataType::IntegerUnsigned(optional_precision?))
12425                    } else {
12426                        if dialect.supports_data_type_signed_suffix() {
12427                            let _ = self.parse_keyword(Keyword::SIGNED);
12428                        }
12429                        Ok(DataType::Integer(optional_precision?))
12430                    }
12431                }
12432                Keyword::BIGINT => {
12433                    let optional_precision = self.parse_optional_precision();
12434                    if self.parse_keyword(Keyword::UNSIGNED) {
12435                        Ok(DataType::BigIntUnsigned(optional_precision?))
12436                    } else {
12437                        if dialect.supports_data_type_signed_suffix() {
12438                            let _ = self.parse_keyword(Keyword::SIGNED);
12439                        }
12440                        Ok(DataType::BigInt(optional_precision?))
12441                    }
12442                }
12443                Keyword::HUGEINT => Ok(DataType::HugeInt),
12444                Keyword::UBIGINT => Ok(DataType::UBigInt),
12445                Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12446                Keyword::USMALLINT => Ok(DataType::USmallInt),
12447                Keyword::UTINYINT => Ok(DataType::UTinyInt),
12448                Keyword::UINT8 => Ok(DataType::UInt8),
12449                Keyword::UINT16 => Ok(DataType::UInt16),
12450                Keyword::UINT32 => Ok(DataType::UInt32),
12451                Keyword::UINT64 => Ok(DataType::UInt64),
12452                Keyword::UINT128 => Ok(DataType::UInt128),
12453                Keyword::UINT256 => Ok(DataType::UInt256),
12454                Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12455                Keyword::NVARCHAR => {
12456                    Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12457                }
12458                Keyword::CHARACTER => {
12459                    if self.parse_keyword(Keyword::VARYING) {
12460                        Ok(DataType::CharacterVarying(
12461                            self.parse_optional_character_length()?,
12462                        ))
12463                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12464                        Ok(DataType::CharacterLargeObject(
12465                            self.parse_optional_precision()?,
12466                        ))
12467                    } else {
12468                        Ok(DataType::Character(self.parse_optional_character_length()?))
12469                    }
12470                }
12471                Keyword::CHAR => {
12472                    if self.parse_keyword(Keyword::VARYING) {
12473                        Ok(DataType::CharVarying(
12474                            self.parse_optional_character_length()?,
12475                        ))
12476                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12477                        Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12478                    } else {
12479                        Ok(DataType::Char(self.parse_optional_character_length()?))
12480                    }
12481                }
12482                Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12483                Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12484                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12485                Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12486                Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12487                Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12488                Keyword::LONGBLOB => Ok(DataType::LongBlob),
12489                Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12490                    Ok(DataType::BigInt(None))
12491                }
12492                Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12493                Keyword::BIT => {
12494                    if self.parse_keyword(Keyword::VARYING) {
12495                        Ok(DataType::BitVarying(self.parse_optional_precision()?))
12496                    } else {
12497                        Ok(DataType::Bit(self.parse_optional_precision()?))
12498                    }
12499                }
12500                Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12501                Keyword::UUID => Ok(DataType::Uuid),
12502                Keyword::DATE => Ok(DataType::Date),
12503                Keyword::DATE32 => Ok(DataType::Date32),
12504                Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12505                Keyword::DATETIME64 => {
12506                    self.prev_token();
12507                    let (precision, time_zone) = self.parse_datetime_64()?;
12508                    Ok(DataType::Datetime64(precision, time_zone))
12509                }
12510                Keyword::TIMESTAMP => {
12511                    let precision = self.parse_optional_precision()?;
12512                    let tz = if self.parse_keyword(Keyword::WITH) {
12513                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12514                        TimezoneInfo::WithTimeZone
12515                    } else if self.parse_keyword(Keyword::WITHOUT) {
12516                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12517                        TimezoneInfo::WithoutTimeZone
12518                    } else {
12519                        TimezoneInfo::None
12520                    };
12521                    Ok(DataType::Timestamp(precision, tz))
12522                }
12523                Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
12524                    self.parse_optional_precision()?,
12525                    TimezoneInfo::Tz,
12526                )),
12527                Keyword::TIMESTAMP_NTZ => {
12528                    Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
12529                }
12530                Keyword::TIME => {
12531                    let precision = self.parse_optional_precision()?;
12532                    let tz = if self.parse_keyword(Keyword::WITH) {
12533                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12534                        TimezoneInfo::WithTimeZone
12535                    } else if self.parse_keyword(Keyword::WITHOUT) {
12536                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12537                        TimezoneInfo::WithoutTimeZone
12538                    } else {
12539                        TimezoneInfo::None
12540                    };
12541                    Ok(DataType::Time(precision, tz))
12542                }
12543                Keyword::TIMETZ => Ok(DataType::Time(
12544                    self.parse_optional_precision()?,
12545                    TimezoneInfo::Tz,
12546                )),
12547                Keyword::INTERVAL => {
12548                    if self.dialect.supports_interval_options() {
12549                        let fields = self.maybe_parse_optional_interval_fields()?;
12550                        let precision = self.parse_optional_precision()?;
12551                        Ok(DataType::Interval { fields, precision })
12552                    } else {
12553                        Ok(DataType::Interval {
12554                            fields: None,
12555                            precision: None,
12556                        })
12557                    }
12558                }
12559                Keyword::JSON => Ok(DataType::JSON),
12560                Keyword::JSONB => Ok(DataType::JSONB),
12561                Keyword::REGCLASS => Ok(DataType::Regclass),
12562                Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
12563                Keyword::FIXEDSTRING => {
12564                    self.expect_token(&Token::LParen)?;
12565                    let character_length = self.parse_literal_uint()?;
12566                    self.expect_token(&Token::RParen)?;
12567                    Ok(DataType::FixedString(character_length))
12568                }
12569                Keyword::TEXT => {
12570                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12571                        Ok(DataType::Custom(
12572                            ObjectName::from(vec![Ident::new("TEXT")]),
12573                            modifiers,
12574                        ))
12575                    } else {
12576                        Ok(DataType::Text)
12577                    }
12578                }
12579                Keyword::TINYTEXT => Ok(DataType::TinyText),
12580                Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
12581                Keyword::LONGTEXT => Ok(DataType::LongText),
12582                Keyword::BYTEA => Ok(DataType::Bytea),
12583                Keyword::NUMERIC => Ok(DataType::Numeric(
12584                    self.parse_exact_number_optional_precision_scale()?,
12585                )),
12586                Keyword::DECIMAL => {
12587                    let precision = self.parse_exact_number_optional_precision_scale()?;
12588
12589                    if self.parse_keyword(Keyword::UNSIGNED) {
12590                        Ok(DataType::DecimalUnsigned(precision))
12591                    } else {
12592                        Ok(DataType::Decimal(precision))
12593                    }
12594                }
12595                Keyword::DEC => {
12596                    let precision = self.parse_exact_number_optional_precision_scale()?;
12597
12598                    if self.parse_keyword(Keyword::UNSIGNED) {
12599                        Ok(DataType::DecUnsigned(precision))
12600                    } else {
12601                        Ok(DataType::Dec(precision))
12602                    }
12603                }
12604                Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
12605                    self.parse_exact_number_optional_precision_scale()?,
12606                )),
12607                Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
12608                    self.parse_exact_number_optional_precision_scale()?,
12609                )),
12610                Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
12611                Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
12612                Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
12613                Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
12614                Keyword::ARRAY => {
12615                    if self.dialect.supports_array_typedef_without_element_type() {
12616                        Ok(DataType::Array(ArrayElemTypeDef::None))
12617                    } else if dialect_of!(self is ClickHouseDialect) {
12618                        Ok(self.parse_sub_type(|internal_type| {
12619                            DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
12620                        })?)
12621                    } else {
12622                        self.expect_token(&Token::Lt)?;
12623                        let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
12624                        trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12625                        Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
12626                            inside_type,
12627                        ))))
12628                    }
12629                }
12630                Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
12631                    self.prev_token();
12632                    let field_defs = self.parse_duckdb_struct_type_def()?;
12633                    Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
12634                }
12635                Keyword::STRUCT if self.dialect.supports_struct_literal() => {
12636                    self.prev_token();
12637                    let (field_defs, _trailing_bracket) =
12638                        self.parse_struct_type_def(Self::parse_struct_field_def)?;
12639                    trailing_bracket = _trailing_bracket;
12640                    Ok(DataType::Struct(
12641                        field_defs,
12642                        StructBracketKind::AngleBrackets,
12643                    ))
12644                }
12645                Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
12646                    self.prev_token();
12647                    let fields = self.parse_union_type_def()?;
12648                    Ok(DataType::Union(fields))
12649                }
12650                Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12651                    Ok(self.parse_sub_type(DataType::Nullable)?)
12652                }
12653                Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12654                    Ok(self.parse_sub_type(DataType::LowCardinality)?)
12655                }
12656                Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
12657                    self.expect_token(&Token::Lt)?;
12658                    let key_data_type = self.parse_data_type()?;
12659                    self.expect_token(&Token::Comma)?;
12660                    let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
12661                    trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12662                    Ok(DataType::Map(
12663                        Box::new(key_data_type),
12664                        Box::new(value_data_type),
12665                    ))
12666                }
12667                Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12668                    self.prev_token();
12669                    let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
12670                    Ok(DataType::Map(
12671                        Box::new(key_data_type),
12672                        Box::new(value_data_type),
12673                    ))
12674                }
12675                Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12676                    self.expect_token(&Token::LParen)?;
12677                    let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
12678                    self.expect_token(&Token::RParen)?;
12679                    Ok(DataType::Nested(field_defs))
12680                }
12681                Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12682                    self.prev_token();
12683                    let field_defs = self.parse_click_house_tuple_def()?;
12684                    Ok(DataType::Tuple(field_defs))
12685                }
12686                Keyword::TRIGGER => Ok(DataType::Trigger),
12687                Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
12688                    let _ = self.parse_keyword(Keyword::TYPE);
12689                    Ok(DataType::AnyType)
12690                }
12691                Keyword::TABLE => {
12692                    // an LParen after the TABLE keyword indicates that table columns are being defined
12693                    // whereas no LParen indicates an anonymous table expression will be returned
12694                    if self.peek_token_ref().token == Token::LParen {
12695                        let columns = self.parse_returns_table_columns()?;
12696                        Ok(DataType::Table(Some(columns)))
12697                    } else {
12698                        Ok(DataType::Table(None))
12699                    }
12700                }
12701                Keyword::SIGNED => {
12702                    if self.parse_keyword(Keyword::INTEGER) {
12703                        Ok(DataType::SignedInteger)
12704                    } else {
12705                        Ok(DataType::Signed)
12706                    }
12707                }
12708                Keyword::UNSIGNED => {
12709                    if self.parse_keyword(Keyword::INTEGER) {
12710                        Ok(DataType::UnsignedInteger)
12711                    } else {
12712                        Ok(DataType::Unsigned)
12713                    }
12714                }
12715                Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12716                    Ok(DataType::TsVector)
12717                }
12718                Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12719                    Ok(DataType::TsQuery)
12720                }
12721                _ => {
12722                    self.prev_token();
12723                    let type_name = self.parse_object_name(false)?;
12724                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12725                        Ok(DataType::Custom(type_name, modifiers))
12726                    } else {
12727                        Ok(DataType::Custom(type_name, vec![]))
12728                    }
12729                }
12730            },
12731            _ => self.expected_at("a data type name", next_token_index),
12732        }?;
12733
12734        if self.dialect.supports_array_typedef_with_brackets() {
12735            while self.consume_token(&Token::LBracket) {
12736                // Parse optional array data type size
12737                let size = self.maybe_parse(|p| p.parse_literal_uint())?;
12738                self.expect_token(&Token::RBracket)?;
12739                data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
12740            }
12741        }
12742        Ok((data, trailing_bracket))
12743    }
12744
12745    fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
12746        self.parse_column_def()
12747    }
12748
12749    fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
12750        self.expect_token(&Token::LParen)?;
12751        let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
12752        self.expect_token(&Token::RParen)?;
12753        Ok(columns)
12754    }
12755
12756    /// Parse a parenthesized, comma-separated list of single-quoted strings.
12757    pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
12758        self.expect_token(&Token::LParen)?;
12759        let mut values = Vec::new();
12760        loop {
12761            let next_token = self.next_token();
12762            match next_token.token {
12763                Token::SingleQuotedString(value) => values.push(value),
12764                _ => self.expected("a string", next_token)?,
12765            }
12766            let next_token = self.next_token();
12767            match next_token.token {
12768                Token::Comma => (),
12769                Token::RParen => break,
12770                _ => self.expected(", or }", next_token)?,
12771            }
12772        }
12773        Ok(values)
12774    }
12775
12776    /// Strictly parse `identifier AS identifier`
12777    pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12778        let ident = self.parse_identifier()?;
12779        self.expect_keyword_is(Keyword::AS)?;
12780        let alias = self.parse_identifier()?;
12781        Ok(IdentWithAlias { ident, alias })
12782    }
12783
12784    /// Parse `identifier [AS] identifier` where the AS keyword is optional
12785    fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12786        let ident = self.parse_identifier()?;
12787        let _after_as = self.parse_keyword(Keyword::AS);
12788        let alias = self.parse_identifier()?;
12789        Ok(IdentWithAlias { ident, alias })
12790    }
12791
12792    /// Parse comma-separated list of parenthesized queries for pipe operators
12793    fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
12794        self.parse_comma_separated(|parser| {
12795            parser.expect_token(&Token::LParen)?;
12796            let query = parser.parse_query()?;
12797            parser.expect_token(&Token::RParen)?;
12798            Ok(*query)
12799        })
12800    }
12801
12802    /// Parse set quantifier for pipe operators that require DISTINCT. E.g. INTERSECT and EXCEPT
12803    fn parse_distinct_required_set_quantifier(
12804        &mut self,
12805        operator_name: &str,
12806    ) -> Result<SetQuantifier, ParserError> {
12807        let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
12808        match quantifier {
12809            SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
12810            _ => Err(ParserError::ParserError(format!(
12811                "{operator_name} pipe operator requires DISTINCT modifier",
12812            ))),
12813        }
12814    }
12815
12816    /// Parse optional identifier alias (with or without AS keyword)
12817    fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12818        if self.parse_keyword(Keyword::AS) {
12819            Ok(Some(self.parse_identifier()?))
12820        } else {
12821            // Check if the next token is an identifier (implicit alias)
12822            self.maybe_parse(|parser| parser.parse_identifier())
12823        }
12824    }
12825
12826    /// Optionally parses an alias for a select list item
12827    fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12828        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12829            parser.dialect.is_select_item_alias(explicit, kw, parser)
12830        }
12831        self.parse_optional_alias_inner(None, validator)
12832    }
12833
12834    /// Optionally parses an alias for a table like in `... FROM generate_series(1, 10) AS t (col)`.
12835    /// In this case, the alias is allowed to optionally name the columns in the table, in
12836    /// addition to the table itself.
12837    pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
12838        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12839            parser.dialect.is_table_factor_alias(explicit, kw, parser)
12840        }
12841        let explicit = self.peek_keyword(Keyword::AS);
12842        match self.parse_optional_alias_inner(None, validator)? {
12843            Some(name) => {
12844                let columns = self.parse_table_alias_column_defs()?;
12845                let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
12846                    Some(self.parse_identifier()?)
12847                } else {
12848                    None
12849                };
12850                Ok(Some(TableAlias {
12851                    explicit,
12852                    name,
12853                    columns,
12854                    at,
12855                }))
12856            }
12857            None => Ok(None),
12858        }
12859    }
12860
12861    fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
12862        let mut hints = vec![];
12863        while let Some(hint_type) =
12864            self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
12865        {
12866            let hint_type = match hint_type {
12867                Keyword::USE => TableIndexHintType::Use,
12868                Keyword::IGNORE => TableIndexHintType::Ignore,
12869                Keyword::FORCE => TableIndexHintType::Force,
12870                _ => {
12871                    return self.expected_ref(
12872                        "expected to match USE/IGNORE/FORCE keyword",
12873                        self.peek_token_ref(),
12874                    )
12875                }
12876            };
12877            let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
12878                Some(Keyword::INDEX) => TableIndexType::Index,
12879                Some(Keyword::KEY) => TableIndexType::Key,
12880                _ => {
12881                    return self
12882                        .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
12883                }
12884            };
12885            let for_clause = if self.parse_keyword(Keyword::FOR) {
12886                let clause = if self.parse_keyword(Keyword::JOIN) {
12887                    TableIndexHintForClause::Join
12888                } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
12889                    TableIndexHintForClause::OrderBy
12890                } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
12891                    TableIndexHintForClause::GroupBy
12892                } else {
12893                    return self.expected_ref(
12894                        "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
12895                        self.peek_token_ref(),
12896                    );
12897                };
12898                Some(clause)
12899            } else {
12900                None
12901            };
12902
12903            self.expect_token(&Token::LParen)?;
12904            let index_names = if self.peek_token_ref().token != Token::RParen {
12905                self.parse_comma_separated(Parser::parse_identifier)?
12906            } else {
12907                vec![]
12908            };
12909            self.expect_token(&Token::RParen)?;
12910            hints.push(TableIndexHints {
12911                hint_type,
12912                index_type,
12913                for_clause,
12914                index_names,
12915            });
12916        }
12917        Ok(hints)
12918    }
12919
12920    /// Wrapper for parse_optional_alias_inner, left for backwards-compatibility
12921    /// but new flows should use the context-specific methods such as `maybe_parse_select_item_alias`
12922    /// and `maybe_parse_table_alias`.
12923    pub fn parse_optional_alias(
12924        &mut self,
12925        reserved_kwds: &[Keyword],
12926    ) -> Result<Option<Ident>, ParserError> {
12927        fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
12928            false
12929        }
12930        self.parse_optional_alias_inner(Some(reserved_kwds), validator)
12931    }
12932
12933    /// Parses an optional alias after a SQL element such as a select list item
12934    /// or a table name.
12935    ///
12936    /// This method accepts an optional list of reserved keywords or a function
12937    /// to call to validate if a keyword should be parsed as an alias, to allow
12938    /// callers to customize the parsing logic based on their context.
12939    fn parse_optional_alias_inner<F>(
12940        &mut self,
12941        reserved_kwds: Option<&[Keyword]>,
12942        validator: F,
12943    ) -> Result<Option<Ident>, ParserError>
12944    where
12945        F: Fn(bool, &Keyword, &mut Parser) -> bool,
12946    {
12947        let after_as = self.parse_keyword(Keyword::AS);
12948
12949        let next_token = self.next_token();
12950        match next_token.token {
12951            // Accepts a keyword as an alias if the AS keyword explicitly indicate an alias or if the
12952            // caller provided a list of reserved keywords and the keyword is not on that list.
12953            Token::Word(w)
12954                if reserved_kwds.is_some()
12955                    && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
12956            {
12957                Ok(Some(w.into_ident(next_token.span)))
12958            }
12959            // Accepts a keyword as alias based on the caller's context, such as to what SQL element
12960            // this word is a potential alias of using the validator call-back. This allows for
12961            // dialect-specific logic.
12962            Token::Word(w) if validator(after_as, &w.keyword, self) => {
12963                Ok(Some(w.into_ident(next_token.span)))
12964            }
12965            // For backwards-compatibility, we accept quoted strings as aliases regardless of the context.
12966            Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
12967            Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
12968            _ => {
12969                if after_as {
12970                    return self.expected("an identifier after AS", next_token);
12971                }
12972                self.prev_token();
12973                Ok(None) // no alias found
12974            }
12975        }
12976    }
12977
12978    /// Parse an optional `GROUP BY` clause, returning `Some(GroupByExpr)` when present.
12979    pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
12980        if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
12981            let expressions = if self.parse_keyword(Keyword::ALL) {
12982                None
12983            } else {
12984                Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
12985            };
12986
12987            let mut modifiers = vec![];
12988            if self.dialect.supports_group_by_with_modifier() {
12989                loop {
12990                    if !self.parse_keyword(Keyword::WITH) {
12991                        break;
12992                    }
12993                    let keyword = self.expect_one_of_keywords(&[
12994                        Keyword::ROLLUP,
12995                        Keyword::CUBE,
12996                        Keyword::TOTALS,
12997                    ])?;
12998                    modifiers.push(match keyword {
12999                        Keyword::ROLLUP => GroupByWithModifier::Rollup,
13000                        Keyword::CUBE => GroupByWithModifier::Cube,
13001                        Keyword::TOTALS => GroupByWithModifier::Totals,
13002                        _ => {
13003                            return parser_err!(
13004                                "BUG: expected to match GroupBy modifier keyword",
13005                                self.peek_token_ref().span.start
13006                            )
13007                        }
13008                    });
13009                }
13010            }
13011            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13012                self.expect_token(&Token::LParen)?;
13013                let result = self.parse_comma_separated(|p| {
13014                    if p.peek_token_ref().token == Token::LParen {
13015                        p.parse_tuple(true, true)
13016                    } else {
13017                        Ok(vec![p.parse_expr()?])
13018                    }
13019                })?;
13020                self.expect_token(&Token::RParen)?;
13021                modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13022                    result,
13023                )));
13024            };
13025            let group_by = match expressions {
13026                None => GroupByExpr::All(modifiers),
13027                Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13028            };
13029            Ok(Some(group_by))
13030        } else {
13031            Ok(None)
13032        }
13033    }
13034
13035    /// Parse an optional `ORDER BY` clause, returning `Some(OrderBy)` when present.
13036    pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13037        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13038            let order_by =
13039                if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13040                    let order_by_options = self.parse_order_by_options()?;
13041                    OrderBy {
13042                        kind: OrderByKind::All(order_by_options),
13043                        interpolate: None,
13044                    }
13045                } else {
13046                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13047                    let interpolate = if self.dialect.supports_interpolate() {
13048                        self.parse_interpolations()?
13049                    } else {
13050                        None
13051                    };
13052                    OrderBy {
13053                        kind: OrderByKind::Expressions(exprs),
13054                        interpolate,
13055                    }
13056                };
13057            Ok(Some(order_by))
13058        } else {
13059            Ok(None)
13060        }
13061    }
13062
13063    fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13064        let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13065            Some(self.parse_offset()?)
13066        } else {
13067            None
13068        };
13069
13070        let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13071            let expr = self.parse_limit()?;
13072
13073            if self.dialect.supports_limit_comma()
13074                && offset.is_none()
13075                && expr.is_some() // ALL not supported with comma
13076                && self.consume_token(&Token::Comma)
13077            {
13078                let offset = expr.ok_or_else(|| {
13079                    ParserError::ParserError(
13080                        "Missing offset for LIMIT <offset>, <limit>".to_string(),
13081                    )
13082                })?;
13083                return Ok(Some(LimitClause::OffsetCommaLimit {
13084                    offset,
13085                    limit: self.parse_expr()?,
13086                }));
13087            }
13088
13089            let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13090                Some(self.parse_comma_separated(Parser::parse_expr)?)
13091            } else {
13092                None
13093            };
13094
13095            (Some(expr), limit_by)
13096        } else {
13097            (None, None)
13098        };
13099
13100        if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13101            offset = Some(self.parse_offset()?);
13102        }
13103
13104        if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13105            Ok(Some(LimitClause::LimitOffset {
13106                limit: limit.unwrap_or_default(),
13107                offset,
13108                limit_by: limit_by.unwrap_or_default(),
13109            }))
13110        } else {
13111            Ok(None)
13112        }
13113    }
13114
13115    /// Parse a table object for insertion
13116    /// e.g. `some_database.some_table` or `FUNCTION some_table_func(...)`
13117    pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13118        if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13119            let fn_name = self.parse_object_name(false)?;
13120            self.parse_function_call(fn_name)
13121                .map(TableObject::TableFunction)
13122        } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13123            self.parse_parenthesized(|p| p.parse_query())
13124                .map(TableObject::TableQuery)
13125        } else {
13126            self.parse_object_name(false).map(TableObject::TableName)
13127        }
13128    }
13129
13130    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13131    /// `foo` or `myschema."table"
13132    ///
13133    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13134    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13135    /// in this context on BigQuery.
13136    pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13137        self.parse_object_name_inner(in_table_clause, false)
13138    }
13139
13140    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13141    /// `foo` or `myschema."table"
13142    ///
13143    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13144    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13145    /// in this context on BigQuery.
13146    ///
13147    /// The `allow_wildcards` parameter indicates whether to allow for wildcards in the object name
13148    /// e.g. *, *.*, `foo`.*, or "foo"."bar"
13149    fn parse_object_name_inner(
13150        &mut self,
13151        in_table_clause: bool,
13152        allow_wildcards: bool,
13153    ) -> Result<ObjectName, ParserError> {
13154        let mut parts = vec![];
13155        if dialect_of!(self is BigQueryDialect) && in_table_clause {
13156            loop {
13157                let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13158                parts.push(ObjectNamePart::Identifier(ident));
13159                if !self.consume_token(&Token::Period) && !end_with_period {
13160                    break;
13161                }
13162            }
13163        } else {
13164            loop {
13165                if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13166                    let span = self.next_token().span;
13167                    parts.push(ObjectNamePart::Identifier(Ident {
13168                        value: Token::Mul.to_string(),
13169                        quote_style: None,
13170                        span,
13171                    }));
13172                } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13173                    let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13174                    parts.push(ObjectNamePart::Identifier(ident));
13175                    if !self.consume_token(&Token::Period) && !end_with_period {
13176                        break;
13177                    }
13178                } else if self.dialect.supports_object_name_double_dot_notation()
13179                    && parts.len() == 1
13180                    && matches!(self.peek_token_ref().token, Token::Period)
13181                {
13182                    // Empty string here means default schema
13183                    parts.push(ObjectNamePart::Identifier(Ident::new("")));
13184                } else {
13185                    let ident = self.parse_identifier()?;
13186                    let part = if self
13187                        .dialect
13188                        .is_identifier_generating_function_name(&ident, &parts)
13189                    {
13190                        self.expect_token(&Token::LParen)?;
13191                        let args: Vec<FunctionArg> =
13192                            self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13193                        self.expect_token(&Token::RParen)?;
13194                        ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13195                    } else {
13196                        ObjectNamePart::Identifier(ident)
13197                    };
13198                    parts.push(part);
13199                }
13200
13201                if !self.consume_token(&Token::Period) {
13202                    break;
13203                }
13204            }
13205        }
13206
13207        // BigQuery accepts any number of quoted identifiers of a table name.
13208        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
13209        if dialect_of!(self is BigQueryDialect)
13210            && parts.iter().any(|part| {
13211                part.as_ident()
13212                    .is_some_and(|ident| ident.value.contains('.'))
13213            })
13214        {
13215            parts = parts
13216                .into_iter()
13217                .flat_map(|part| match part.as_ident() {
13218                    Some(ident) => ident
13219                        .value
13220                        .split('.')
13221                        .map(|value| {
13222                            ObjectNamePart::Identifier(Ident {
13223                                value: value.into(),
13224                                quote_style: ident.quote_style,
13225                                span: ident.span,
13226                            })
13227                        })
13228                        .collect::<Vec<_>>(),
13229                    None => vec![part],
13230                })
13231                .collect()
13232        }
13233
13234        Ok(ObjectName(parts))
13235    }
13236
13237    /// Parse identifiers
13238    pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13239        let mut idents = vec![];
13240        loop {
13241            let token = self.peek_token_ref();
13242            match &token.token {
13243                Token::Word(w) => {
13244                    idents.push(w.to_ident(token.span));
13245                }
13246                Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13247                    break
13248                }
13249                _ => {}
13250            }
13251            self.advance_token();
13252        }
13253        Ok(idents)
13254    }
13255
13256    /// Parse identifiers of form ident1[.identN]*
13257    ///
13258    /// Similar in functionality to [parse_identifiers], with difference
13259    /// being this function is much more strict about parsing a valid multipart identifier, not
13260    /// allowing extraneous tokens to be parsed, otherwise it fails.
13261    ///
13262    /// For example:
13263    ///
13264    /// ```rust
13265    /// use sqlparser::ast::Ident;
13266    /// use sqlparser::dialect::GenericDialect;
13267    /// use sqlparser::parser::Parser;
13268    ///
13269    /// let dialect = GenericDialect {};
13270    /// let expected = vec![Ident::new("one"), Ident::new("two")];
13271    ///
13272    /// // expected usage
13273    /// let sql = "one.two";
13274    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13275    /// let actual = parser.parse_multipart_identifier().unwrap();
13276    /// assert_eq!(&actual, &expected);
13277    ///
13278    /// // parse_identifiers is more loose on what it allows, parsing successfully
13279    /// let sql = "one + two";
13280    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13281    /// let actual = parser.parse_identifiers().unwrap();
13282    /// assert_eq!(&actual, &expected);
13283    ///
13284    /// // expected to strictly fail due to + separator
13285    /// let sql = "one + two";
13286    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13287    /// let actual = parser.parse_multipart_identifier().unwrap_err();
13288    /// assert_eq!(
13289    ///     actual.to_string(),
13290    ///     "sql parser error: Unexpected token in identifier: +"
13291    /// );
13292    /// ```
13293    ///
13294    /// [parse_identifiers]: Parser::parse_identifiers
13295    pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13296        let mut idents = vec![];
13297
13298        // expecting at least one word for identifier
13299        let next_token = self.next_token();
13300        match next_token.token {
13301            Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13302            Token::EOF => {
13303                return Err(ParserError::ParserError(
13304                    "Empty input when parsing identifier".to_string(),
13305                ))?
13306            }
13307            token => {
13308                return Err(ParserError::ParserError(format!(
13309                    "Unexpected token in identifier: {token}"
13310                )))?
13311            }
13312        };
13313
13314        // parse optional next parts if exist
13315        loop {
13316            match self.next_token().token {
13317                // ensure that optional period is succeeded by another identifier
13318                Token::Period => {
13319                    let next_token = self.next_token();
13320                    match next_token.token {
13321                        Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13322                        Token::EOF => {
13323                            return Err(ParserError::ParserError(
13324                                "Trailing period in identifier".to_string(),
13325                            ))?
13326                        }
13327                        token => {
13328                            return Err(ParserError::ParserError(format!(
13329                                "Unexpected token following period in identifier: {token}"
13330                            )))?
13331                        }
13332                    }
13333                }
13334                Token::EOF => break,
13335                token => {
13336                    return Err(ParserError::ParserError(format!(
13337                        "Unexpected token in identifier: {token}"
13338                    )))?;
13339                }
13340            }
13341        }
13342
13343        Ok(idents)
13344    }
13345
13346    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
13347    pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13348        let next_token = self.next_token();
13349        match next_token.token {
13350            Token::Word(w) => Ok(w.into_ident(next_token.span)),
13351            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13352            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13353            _ => self.expected("identifier", next_token),
13354        }
13355    }
13356
13357    /// On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
13358    /// TABLE clause.
13359    ///
13360    /// The first segment must be an ordinary unquoted identifier, e.g. it must not start
13361    /// with a digit. Subsequent segments are either must either be valid identifiers or
13362    /// integers, e.g. foo-123 is allowed, but foo-123a is not.
13363    ///
13364    /// [BigQuery-lexical](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical)
13365    ///
13366    /// Return a tuple of the identifier and a boolean indicating it ends with a period.
13367    fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13368        match self.peek_token().token {
13369            Token::Word(w) => {
13370                let quote_style_is_none = w.quote_style.is_none();
13371                let mut requires_whitespace = false;
13372                let mut ident = w.into_ident(self.next_token().span);
13373                if quote_style_is_none {
13374                    while matches!(self.peek_token_no_skip().token, Token::Minus) {
13375                        self.next_token();
13376                        ident.value.push('-');
13377
13378                        let token = self
13379                            .next_token_no_skip()
13380                            .cloned()
13381                            .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13382                        requires_whitespace = match token.token {
13383                            Token::Word(next_word) if next_word.quote_style.is_none() => {
13384                                ident.value.push_str(&next_word.value);
13385                                false
13386                            }
13387                            Token::Number(s, false) => {
13388                                // A number token can represent a decimal value ending with a period, e.g., `Number('123.')`.
13389                                // However, for an [ObjectName], it is part of a hyphenated identifier, e.g., `foo-123.bar`.
13390                                //
13391                                // If a number token is followed by a period, it is part of an [ObjectName].
13392                                // Return the identifier with `true` if the number token is followed by a period, indicating that
13393                                // parsing should continue for the next part of the hyphenated identifier.
13394                                if s.ends_with('.') {
13395                                    let Some(s) = s.split('.').next().filter(|s| {
13396                                        !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13397                                    }) else {
13398                                        return self.expected(
13399                                            "continuation of hyphenated identifier",
13400                                            TokenWithSpan::new(Token::Number(s, false), token.span),
13401                                        );
13402                                    };
13403                                    ident.value.push_str(s);
13404                                    return Ok((ident, true));
13405                                } else {
13406                                    ident.value.push_str(&s);
13407                                }
13408                                // If next token is period, then it is part of an ObjectName and we don't expect whitespace
13409                                // after the number.
13410                                !matches!(self.peek_token_ref().token, Token::Period)
13411                            }
13412                            _ => {
13413                                return self
13414                                    .expected("continuation of hyphenated identifier", token);
13415                            }
13416                        }
13417                    }
13418
13419                    // If the last segment was a number, we must check that it's followed by whitespace,
13420                    // otherwise foo-123a will be parsed as `foo-123` with the alias `a`.
13421                    if requires_whitespace {
13422                        let token = self.next_token();
13423                        if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13424                            return self
13425                                .expected("whitespace following hyphenated identifier", token);
13426                        }
13427                    }
13428                }
13429                Ok((ident, false))
13430            }
13431            _ => Ok((self.parse_identifier()?, false)),
13432        }
13433    }
13434
13435    /// Parses a parenthesized, comma-separated list of column definitions within a view.
13436    fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13437        if self.consume_token(&Token::LParen) {
13438            if self.peek_token_ref().token == Token::RParen {
13439                self.next_token();
13440                Ok(vec![])
13441            } else {
13442                let cols = self.parse_comma_separated_with_trailing_commas(
13443                    Parser::parse_view_column,
13444                    self.dialect.supports_column_definition_trailing_commas(),
13445                    Self::is_reserved_for_column_alias,
13446                )?;
13447                self.expect_token(&Token::RParen)?;
13448                Ok(cols)
13449            }
13450        } else {
13451            Ok(vec![])
13452        }
13453    }
13454
13455    /// Parses a column definition within a view.
13456    fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13457        let name = self.parse_identifier()?;
13458        let options = self.parse_view_column_options()?;
13459        let data_type = if dialect_of!(self is ClickHouseDialect) {
13460            Some(self.parse_data_type()?)
13461        } else {
13462            None
13463        };
13464        Ok(ViewColumnDef {
13465            name,
13466            data_type,
13467            options,
13468        })
13469    }
13470
13471    fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13472        let mut options = Vec::new();
13473        loop {
13474            let option = self.parse_optional_column_option()?;
13475            if let Some(option) = option {
13476                options.push(option);
13477            } else {
13478                break;
13479            }
13480        }
13481        if options.is_empty() {
13482            Ok(None)
13483        } else if self.dialect.supports_space_separated_column_options() {
13484            Ok(Some(ColumnOptions::SpaceSeparated(options)))
13485        } else {
13486            Ok(Some(ColumnOptions::CommaSeparated(options)))
13487        }
13488    }
13489
13490    /// Parses a parenthesized comma-separated list of unqualified, possibly quoted identifiers.
13491    /// For example: `(col1, "col 2", ...)`
13492    pub fn parse_parenthesized_column_list(
13493        &mut self,
13494        optional: IsOptional,
13495        allow_empty: bool,
13496    ) -> Result<Vec<Ident>, ParserError> {
13497        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
13498    }
13499
13500    /// Parse a parenthesized list of compound identifiers as expressions.
13501    pub fn parse_parenthesized_compound_identifier_list(
13502        &mut self,
13503        optional: IsOptional,
13504        allow_empty: bool,
13505    ) -> Result<Vec<Expr>, ParserError> {
13506        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13507            Ok(Expr::CompoundIdentifier(
13508                p.parse_period_separated(|p| p.parse_identifier())?,
13509            ))
13510        })
13511    }
13512
13513    /// Parses a parenthesized comma-separated list of index columns, which can be arbitrary
13514    /// expressions with ordering information (and an opclass in some dialects).
13515    fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
13516        self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
13517            p.parse_create_index_expr()
13518        })
13519    }
13520
13521    /// Parses a parenthesized comma-separated list of qualified, possibly quoted identifiers.
13522    /// For example: `(db1.sc1.tbl1.col1, db1.sc1.tbl1."col 2", ...)`
13523    pub fn parse_parenthesized_qualified_column_list(
13524        &mut self,
13525        optional: IsOptional,
13526        allow_empty: bool,
13527    ) -> Result<Vec<ObjectName>, ParserError> {
13528        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13529            p.parse_object_name(true)
13530        })
13531    }
13532
13533    /// Parses a parenthesized comma-separated list of columns using
13534    /// the provided function to parse each element.
13535    fn parse_parenthesized_column_list_inner<F, T>(
13536        &mut self,
13537        optional: IsOptional,
13538        allow_empty: bool,
13539        mut f: F,
13540    ) -> Result<Vec<T>, ParserError>
13541    where
13542        F: FnMut(&mut Parser) -> Result<T, ParserError>,
13543    {
13544        if self.consume_token(&Token::LParen) {
13545            if allow_empty && self.peek_token_ref().token == Token::RParen {
13546                self.next_token();
13547                Ok(vec![])
13548            } else {
13549                let cols = self.parse_comma_separated(|p| f(p))?;
13550                self.expect_token(&Token::RParen)?;
13551                Ok(cols)
13552            }
13553        } else if optional == Optional {
13554            Ok(vec![])
13555        } else {
13556            self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
13557        }
13558    }
13559
13560    /// Parses a parenthesized comma-separated list of table alias column definitions.
13561    fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
13562        if self.consume_token(&Token::LParen) {
13563            let cols = self.parse_comma_separated(|p| {
13564                let name = p.parse_identifier()?;
13565                let data_type = p.maybe_parse(|p| p.parse_data_type())?;
13566                Ok(TableAliasColumnDef { name, data_type })
13567            })?;
13568            self.expect_token(&Token::RParen)?;
13569            Ok(cols)
13570        } else {
13571            Ok(vec![])
13572        }
13573    }
13574
13575    /// Parse an unsigned precision value enclosed in parentheses, e.g. `(10)`.
13576    pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
13577        self.expect_token(&Token::LParen)?;
13578        let n = self.parse_literal_uint()?;
13579        self.expect_token(&Token::RParen)?;
13580        Ok(n)
13581    }
13582
13583    /// Parse an optional precision `(n)` and return it as `Some(n)` when present.
13584    pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
13585        if self.consume_token(&Token::LParen) {
13586            let n = self.parse_literal_uint()?;
13587            self.expect_token(&Token::RParen)?;
13588            Ok(Some(n))
13589        } else {
13590            Ok(None)
13591        }
13592    }
13593
13594    fn maybe_parse_optional_interval_fields(
13595        &mut self,
13596    ) -> Result<Option<IntervalFields>, ParserError> {
13597        match self.parse_one_of_keywords(&[
13598            // Can be followed by `TO` option
13599            Keyword::YEAR,
13600            Keyword::DAY,
13601            Keyword::HOUR,
13602            Keyword::MINUTE,
13603            // No `TO` option
13604            Keyword::MONTH,
13605            Keyword::SECOND,
13606        ]) {
13607            Some(Keyword::YEAR) => {
13608                if self.peek_keyword(Keyword::TO) {
13609                    self.expect_keyword(Keyword::TO)?;
13610                    self.expect_keyword(Keyword::MONTH)?;
13611                    Ok(Some(IntervalFields::YearToMonth))
13612                } else {
13613                    Ok(Some(IntervalFields::Year))
13614                }
13615            }
13616            Some(Keyword::DAY) => {
13617                if self.peek_keyword(Keyword::TO) {
13618                    self.expect_keyword(Keyword::TO)?;
13619                    match self.expect_one_of_keywords(&[
13620                        Keyword::HOUR,
13621                        Keyword::MINUTE,
13622                        Keyword::SECOND,
13623                    ])? {
13624                        Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
13625                        Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
13626                        Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
13627                        _ => {
13628                            self.prev_token();
13629                            self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
13630                        }
13631                    }
13632                } else {
13633                    Ok(Some(IntervalFields::Day))
13634                }
13635            }
13636            Some(Keyword::HOUR) => {
13637                if self.peek_keyword(Keyword::TO) {
13638                    self.expect_keyword(Keyword::TO)?;
13639                    match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
13640                        Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
13641                        Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
13642                        _ => {
13643                            self.prev_token();
13644                            self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
13645                        }
13646                    }
13647                } else {
13648                    Ok(Some(IntervalFields::Hour))
13649                }
13650            }
13651            Some(Keyword::MINUTE) => {
13652                if self.peek_keyword(Keyword::TO) {
13653                    self.expect_keyword(Keyword::TO)?;
13654                    self.expect_keyword(Keyword::SECOND)?;
13655                    Ok(Some(IntervalFields::MinuteToSecond))
13656                } else {
13657                    Ok(Some(IntervalFields::Minute))
13658                }
13659            }
13660            Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
13661            Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
13662            Some(_) => {
13663                self.prev_token();
13664                self.expected_ref(
13665                    "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
13666                    self.peek_token_ref(),
13667                )
13668            }
13669            None => Ok(None),
13670        }
13671    }
13672
13673    /// Parse datetime64 [1]
13674    /// Syntax
13675    /// ```sql
13676    /// DateTime64(precision[, timezone])
13677    /// ```
13678    ///
13679    /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/datetime64
13680    pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
13681        self.expect_keyword_is(Keyword::DATETIME64)?;
13682        self.expect_token(&Token::LParen)?;
13683        let precision = self.parse_literal_uint()?;
13684        let time_zone = if self.consume_token(&Token::Comma) {
13685            Some(self.parse_literal_string()?)
13686        } else {
13687            None
13688        };
13689        self.expect_token(&Token::RParen)?;
13690        Ok((precision, time_zone))
13691    }
13692
13693    /// Parse an optional character length specification `(n | MAX [CHARACTERS|OCTETS])`.
13694    pub fn parse_optional_character_length(
13695        &mut self,
13696    ) -> Result<Option<CharacterLength>, ParserError> {
13697        if self.consume_token(&Token::LParen) {
13698            let character_length = self.parse_character_length()?;
13699            self.expect_token(&Token::RParen)?;
13700            Ok(Some(character_length))
13701        } else {
13702            Ok(None)
13703        }
13704    }
13705
13706    /// Parse an optional binary length specification like `(n)`.
13707    pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
13708        if self.consume_token(&Token::LParen) {
13709            let binary_length = self.parse_binary_length()?;
13710            self.expect_token(&Token::RParen)?;
13711            Ok(Some(binary_length))
13712        } else {
13713            Ok(None)
13714        }
13715    }
13716
13717    /// Parse a character length, handling `MAX` or integer lengths with optional units.
13718    pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
13719        if self.parse_keyword(Keyword::MAX) {
13720            return Ok(CharacterLength::Max);
13721        }
13722        let length = self.parse_literal_uint()?;
13723        let unit = if self.parse_keyword(Keyword::CHARACTERS) {
13724            Some(CharLengthUnits::Characters)
13725        } else if self.parse_keyword(Keyword::OCTETS) {
13726            Some(CharLengthUnits::Octets)
13727        } else {
13728            None
13729        };
13730        Ok(CharacterLength::IntegerLength { length, unit })
13731    }
13732
13733    /// Parse a binary length specification, returning `BinaryLength`.
13734    pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
13735        if self.parse_keyword(Keyword::MAX) {
13736            return Ok(BinaryLength::Max);
13737        }
13738        let length = self.parse_literal_uint()?;
13739        Ok(BinaryLength::IntegerLength { length })
13740    }
13741
13742    /// Parse an optional `(precision[, scale])` and return `(Option<precision>, Option<scale>)`.
13743    pub fn parse_optional_precision_scale(
13744        &mut self,
13745    ) -> Result<(Option<u64>, Option<u64>), ParserError> {
13746        if self.consume_token(&Token::LParen) {
13747            let n = self.parse_literal_uint()?;
13748            let scale = if self.consume_token(&Token::Comma) {
13749                Some(self.parse_literal_uint()?)
13750            } else {
13751                None
13752            };
13753            self.expect_token(&Token::RParen)?;
13754            Ok((Some(n), scale))
13755        } else {
13756            Ok((None, None))
13757        }
13758    }
13759
13760    /// Parse exact-number precision/scale info like `(precision[, scale])` for decimal types.
13761    pub fn parse_exact_number_optional_precision_scale(
13762        &mut self,
13763    ) -> Result<ExactNumberInfo, ParserError> {
13764        if self.consume_token(&Token::LParen) {
13765            let precision = self.parse_literal_uint()?;
13766            let scale = if self.consume_token(&Token::Comma) {
13767                Some(self.parse_signed_integer()?)
13768            } else {
13769                None
13770            };
13771
13772            self.expect_token(&Token::RParen)?;
13773
13774            match scale {
13775                None => Ok(ExactNumberInfo::Precision(precision)),
13776                Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
13777            }
13778        } else {
13779            Ok(ExactNumberInfo::None)
13780        }
13781    }
13782
13783    /// Parse an optionally signed integer literal.
13784    fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
13785        let is_negative = self.consume_token(&Token::Minus);
13786
13787        if !is_negative {
13788            let _ = self.consume_token(&Token::Plus);
13789        }
13790
13791        let current_token = self.peek_token_ref();
13792        match &current_token.token {
13793            Token::Number(s, _) => {
13794                let s = s.clone();
13795                let span_start = current_token.span.start;
13796                self.advance_token();
13797                let value = Self::parse::<i64>(s, span_start)?;
13798                Ok(if is_negative { -value } else { value })
13799            }
13800            _ => self.expected_ref("number", current_token),
13801        }
13802    }
13803
13804    /// Parse optional type modifiers appearing in parentheses e.g. `(UNSIGNED, ZEROFILL)`.
13805    pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
13806        if self.consume_token(&Token::LParen) {
13807            let mut modifiers = Vec::new();
13808            loop {
13809                let next_token = self.next_token();
13810                match next_token.token {
13811                    Token::Word(w) => modifiers.push(w.to_string()),
13812                    Token::Number(n, _) => modifiers.push(n),
13813                    Token::SingleQuotedString(s) => modifiers.push(s),
13814
13815                    Token::Comma => {
13816                        continue;
13817                    }
13818                    Token::RParen => {
13819                        break;
13820                    }
13821                    _ => self.expected("type modifiers", next_token)?,
13822                }
13823            }
13824
13825            Ok(Some(modifiers))
13826        } else {
13827            Ok(None)
13828        }
13829    }
13830
13831    /// Parse a parenthesized sub data type
13832    fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
13833    where
13834        F: FnOnce(Box<DataType>) -> DataType,
13835    {
13836        self.expect_token(&Token::LParen)?;
13837        let inside_type = self.parse_data_type()?;
13838        self.expect_token(&Token::RParen)?;
13839        Ok(parent_type(inside_type.into()))
13840    }
13841
13842    /// Parse a DELETE statement, returning a `Box`ed SetExpr
13843    ///
13844    /// This is used to reduce the size of the stack frames in debug builds
13845    fn parse_delete_setexpr_boxed(
13846        &mut self,
13847        delete_token: TokenWithSpan,
13848    ) -> Result<Box<SetExpr>, ParserError> {
13849        Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
13850    }
13851
13852    /// Parse a `DELETE` statement and return `Statement::Delete`.
13853    pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
13854        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
13855        let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
13856            // `FROM` keyword is optional in BigQuery SQL.
13857            // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
13858            if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
13859                (vec![], false)
13860            } else {
13861                let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
13862                self.expect_keyword_is(Keyword::FROM)?;
13863                (tables, true)
13864            }
13865        } else {
13866            (vec![], true)
13867        };
13868
13869        let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
13870
13871        let output = self.maybe_parse_output_clause()?;
13872
13873        let using = if self.parse_keyword(Keyword::USING) {
13874            Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
13875        } else {
13876            None
13877        };
13878        let selection = if self.parse_keyword(Keyword::WHERE) {
13879            Some(self.parse_expr()?)
13880        } else {
13881            None
13882        };
13883        let returning = if self.parse_keyword(Keyword::RETURNING) {
13884            Some(self.parse_comma_separated(Parser::parse_select_item)?)
13885        } else {
13886            None
13887        };
13888        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13889            self.parse_comma_separated(Parser::parse_order_by_expr)?
13890        } else {
13891            vec![]
13892        };
13893        let limit = if self.parse_keyword(Keyword::LIMIT) {
13894            self.parse_limit()?
13895        } else {
13896            None
13897        };
13898
13899        Ok(Statement::Delete(Delete {
13900            delete_token: delete_token.into(),
13901            optimizer_hints,
13902            tables,
13903            from: if with_from_keyword {
13904                FromTable::WithFromKeyword(from)
13905            } else {
13906                FromTable::WithoutKeyword(from)
13907            },
13908            using,
13909            selection,
13910            returning,
13911            output,
13912            order_by,
13913            limit,
13914        }))
13915    }
13916
13917    /// Parse a `KILL` statement, optionally specifying `CONNECTION`, `QUERY`, or `MUTATION`.
13918    /// KILL [CONNECTION | QUERY | MUTATION] processlist_id
13919    pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
13920        let modifier_keyword =
13921            self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
13922
13923        let id = self.parse_literal_uint()?;
13924
13925        let modifier = match modifier_keyword {
13926            Some(Keyword::CONNECTION) => Some(KillType::Connection),
13927            Some(Keyword::QUERY) => Some(KillType::Query),
13928            Some(Keyword::MUTATION) => {
13929                if dialect_of!(self is ClickHouseDialect | GenericDialect) {
13930                    Some(KillType::Mutation)
13931                } else {
13932                    self.expected_ref(
13933                        "Unsupported type for KILL, allowed: CONNECTION | QUERY",
13934                        self.peek_token_ref(),
13935                    )?
13936                }
13937            }
13938            _ => None,
13939        };
13940
13941        Ok(Statement::Kill { modifier, id })
13942    }
13943
13944    /// Parse an `EXPLAIN` statement, handling dialect-specific options and modifiers.
13945    pub fn parse_explain(
13946        &mut self,
13947        describe_alias: DescribeAlias,
13948    ) -> Result<Statement, ParserError> {
13949        let mut analyze = false;
13950        let mut verbose = false;
13951        let mut query_plan = false;
13952        let mut estimate = false;
13953        let mut format = None;
13954        let mut options = None;
13955
13956        // Note: DuckDB is compatible with PostgreSQL syntax for this statement,
13957        // although not all features may be implemented.
13958        if describe_alias == DescribeAlias::Explain
13959            && self.dialect.supports_explain_with_utility_options()
13960            && self.peek_token_ref().token == Token::LParen
13961        {
13962            options = Some(self.parse_utility_options()?)
13963        } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
13964            query_plan = true;
13965        } else if self.parse_keyword(Keyword::ESTIMATE) {
13966            estimate = true;
13967        } else {
13968            analyze = self.parse_keyword(Keyword::ANALYZE);
13969            verbose = self.parse_keyword(Keyword::VERBOSE);
13970            if self.parse_keyword(Keyword::FORMAT) {
13971                format = Some(self.parse_analyze_format_kind()?);
13972            }
13973        }
13974
13975        match self.maybe_parse(|parser| parser.parse_statement())? {
13976            Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
13977                ParserError::ParserError("Explain must be root of the plan".to_string()),
13978            ),
13979            Some(statement) => Ok(Statement::Explain {
13980                describe_alias,
13981                analyze,
13982                verbose,
13983                query_plan,
13984                estimate,
13985                statement: Box::new(statement),
13986                format,
13987                options,
13988            }),
13989            _ => {
13990                let hive_format =
13991                    match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
13992                        Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
13993                        Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
13994                        _ => None,
13995                    };
13996
13997                let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
13998                    // only allow to use TABLE keyword for DESC|DESCRIBE statement
13999                    self.parse_keyword(Keyword::TABLE)
14000                } else {
14001                    false
14002                };
14003
14004                let table_name = self.parse_object_name(false)?;
14005                Ok(Statement::ExplainTable {
14006                    describe_alias,
14007                    hive_format,
14008                    has_table_keyword,
14009                    table_name,
14010                })
14011            }
14012        }
14013    }
14014
14015    /// Parse a query expression, i.e. a `SELECT` statement optionally
14016    /// preceded with some `WITH` CTE declarations and optionally followed
14017    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
14018    /// expect the initial keyword to be already consumed
14019    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14020    pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14021        let _guard = self.recursion_counter.try_decrease()?;
14022        let with = if self.parse_keyword(Keyword::WITH) {
14023            let with_token = self.get_current_token();
14024            Some(With {
14025                with_token: with_token.clone().into(),
14026                recursive: self.parse_keyword(Keyword::RECURSIVE),
14027                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14028            })
14029        } else {
14030            None
14031        };
14032        if self.parse_keyword(Keyword::INSERT) {
14033            Ok(Query {
14034                with,
14035                body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14036                order_by: None,
14037                limit_clause: None,
14038                fetch: None,
14039                locks: vec![],
14040                for_clause: None,
14041                settings: None,
14042                format_clause: None,
14043                pipe_operators: vec![],
14044            }
14045            .into())
14046        } else if self.parse_keyword(Keyword::UPDATE) {
14047            Ok(Query {
14048                with,
14049                body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14050                order_by: None,
14051                limit_clause: None,
14052                fetch: None,
14053                locks: vec![],
14054                for_clause: None,
14055                settings: None,
14056                format_clause: None,
14057                pipe_operators: vec![],
14058            }
14059            .into())
14060        } else if self.parse_keyword(Keyword::DELETE) {
14061            Ok(Query {
14062                with,
14063                body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14064                limit_clause: None,
14065                order_by: None,
14066                fetch: None,
14067                locks: vec![],
14068                for_clause: None,
14069                settings: None,
14070                format_clause: None,
14071                pipe_operators: vec![],
14072            }
14073            .into())
14074        } else if self.parse_keyword(Keyword::MERGE) {
14075            Ok(Query {
14076                with,
14077                body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14078                limit_clause: None,
14079                order_by: None,
14080                fetch: None,
14081                locks: vec![],
14082                for_clause: None,
14083                settings: None,
14084                format_clause: None,
14085                pipe_operators: vec![],
14086            }
14087            .into())
14088        } else {
14089            let body = self.parse_query_body(self.dialect.prec_unknown())?;
14090
14091            let order_by = self.parse_optional_order_by()?;
14092
14093            let limit_clause = self.parse_optional_limit_clause()?;
14094
14095            let settings = self.parse_settings()?;
14096
14097            let fetch = if self.parse_keyword(Keyword::FETCH) {
14098                Some(self.parse_fetch()?)
14099            } else {
14100                None
14101            };
14102
14103            let mut for_clause = None;
14104            let mut locks = Vec::new();
14105            while self.parse_keyword(Keyword::FOR) {
14106                if let Some(parsed_for_clause) = self.parse_for_clause()? {
14107                    for_clause = Some(parsed_for_clause);
14108                    break;
14109                } else {
14110                    locks.push(self.parse_lock()?);
14111                }
14112            }
14113            let format_clause =
14114                if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14115                    if self.parse_keyword(Keyword::NULL) {
14116                        Some(FormatClause::Null)
14117                    } else {
14118                        let ident = self.parse_identifier()?;
14119                        Some(FormatClause::Identifier(ident))
14120                    }
14121                } else {
14122                    None
14123                };
14124
14125            let pipe_operators = if self.dialect.supports_pipe_operator() {
14126                self.parse_pipe_operators()?
14127            } else {
14128                Vec::new()
14129            };
14130
14131            Ok(Query {
14132                with,
14133                body,
14134                order_by,
14135                limit_clause,
14136                fetch,
14137                locks,
14138                for_clause,
14139                settings,
14140                format_clause,
14141                pipe_operators,
14142            }
14143            .into())
14144        }
14145    }
14146
14147    fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14148        let mut pipe_operators = Vec::new();
14149
14150        while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14151            let kw = self.expect_one_of_keywords(&[
14152                Keyword::SELECT,
14153                Keyword::EXTEND,
14154                Keyword::SET,
14155                Keyword::DROP,
14156                Keyword::AS,
14157                Keyword::WHERE,
14158                Keyword::LIMIT,
14159                Keyword::AGGREGATE,
14160                Keyword::ORDER,
14161                Keyword::TABLESAMPLE,
14162                Keyword::RENAME,
14163                Keyword::UNION,
14164                Keyword::INTERSECT,
14165                Keyword::EXCEPT,
14166                Keyword::CALL,
14167                Keyword::PIVOT,
14168                Keyword::UNPIVOT,
14169                Keyword::JOIN,
14170                Keyword::INNER,
14171                Keyword::LEFT,
14172                Keyword::RIGHT,
14173                Keyword::FULL,
14174                Keyword::CROSS,
14175            ])?;
14176            match kw {
14177                Keyword::SELECT => {
14178                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14179                    pipe_operators.push(PipeOperator::Select { exprs })
14180                }
14181                Keyword::EXTEND => {
14182                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14183                    pipe_operators.push(PipeOperator::Extend { exprs })
14184                }
14185                Keyword::SET => {
14186                    let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14187                    pipe_operators.push(PipeOperator::Set { assignments })
14188                }
14189                Keyword::DROP => {
14190                    let columns = self.parse_identifiers()?;
14191                    pipe_operators.push(PipeOperator::Drop { columns })
14192                }
14193                Keyword::AS => {
14194                    let alias = self.parse_identifier()?;
14195                    pipe_operators.push(PipeOperator::As { alias })
14196                }
14197                Keyword::WHERE => {
14198                    let expr = self.parse_expr()?;
14199                    pipe_operators.push(PipeOperator::Where { expr })
14200                }
14201                Keyword::LIMIT => {
14202                    let expr = self.parse_expr()?;
14203                    let offset = if self.parse_keyword(Keyword::OFFSET) {
14204                        Some(self.parse_expr()?)
14205                    } else {
14206                        None
14207                    };
14208                    pipe_operators.push(PipeOperator::Limit { expr, offset })
14209                }
14210                Keyword::AGGREGATE => {
14211                    let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14212                        vec![]
14213                    } else {
14214                        self.parse_comma_separated(|parser| {
14215                            parser.parse_expr_with_alias_and_order_by()
14216                        })?
14217                    };
14218
14219                    let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14220                        self.parse_comma_separated(|parser| {
14221                            parser.parse_expr_with_alias_and_order_by()
14222                        })?
14223                    } else {
14224                        vec![]
14225                    };
14226
14227                    pipe_operators.push(PipeOperator::Aggregate {
14228                        full_table_exprs,
14229                        group_by_expr,
14230                    })
14231                }
14232                Keyword::ORDER => {
14233                    self.expect_one_of_keywords(&[Keyword::BY])?;
14234                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14235                    pipe_operators.push(PipeOperator::OrderBy { exprs })
14236                }
14237                Keyword::TABLESAMPLE => {
14238                    let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14239                    pipe_operators.push(PipeOperator::TableSample { sample });
14240                }
14241                Keyword::RENAME => {
14242                    let mappings =
14243                        self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14244                    pipe_operators.push(PipeOperator::Rename { mappings });
14245                }
14246                Keyword::UNION => {
14247                    let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14248                    let queries = self.parse_pipe_operator_queries()?;
14249                    pipe_operators.push(PipeOperator::Union {
14250                        set_quantifier,
14251                        queries,
14252                    });
14253                }
14254                Keyword::INTERSECT => {
14255                    let set_quantifier =
14256                        self.parse_distinct_required_set_quantifier("INTERSECT")?;
14257                    let queries = self.parse_pipe_operator_queries()?;
14258                    pipe_operators.push(PipeOperator::Intersect {
14259                        set_quantifier,
14260                        queries,
14261                    });
14262                }
14263                Keyword::EXCEPT => {
14264                    let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14265                    let queries = self.parse_pipe_operator_queries()?;
14266                    pipe_operators.push(PipeOperator::Except {
14267                        set_quantifier,
14268                        queries,
14269                    });
14270                }
14271                Keyword::CALL => {
14272                    let function_name = self.parse_object_name(false)?;
14273                    let function_expr = self.parse_function(function_name)?;
14274                    if let Expr::Function(function) = function_expr {
14275                        let alias = self.parse_identifier_optional_alias()?;
14276                        pipe_operators.push(PipeOperator::Call { function, alias });
14277                    } else {
14278                        return Err(ParserError::ParserError(
14279                            "Expected function call after CALL".to_string(),
14280                        ));
14281                    }
14282                }
14283                Keyword::PIVOT => {
14284                    self.expect_token(&Token::LParen)?;
14285                    let aggregate_functions =
14286                        self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14287                    self.expect_keyword_is(Keyword::FOR)?;
14288                    let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14289                    self.expect_keyword_is(Keyword::IN)?;
14290
14291                    self.expect_token(&Token::LParen)?;
14292                    let value_source = if self.parse_keyword(Keyword::ANY) {
14293                        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14294                            self.parse_comma_separated(Parser::parse_order_by_expr)?
14295                        } else {
14296                            vec![]
14297                        };
14298                        PivotValueSource::Any(order_by)
14299                    } else if self.peek_sub_query() {
14300                        PivotValueSource::Subquery(self.parse_query()?)
14301                    } else {
14302                        PivotValueSource::List(
14303                            self.parse_comma_separated(Self::parse_expr_with_alias)?,
14304                        )
14305                    };
14306                    self.expect_token(&Token::RParen)?;
14307                    self.expect_token(&Token::RParen)?;
14308
14309                    let alias = self.parse_identifier_optional_alias()?;
14310
14311                    pipe_operators.push(PipeOperator::Pivot {
14312                        aggregate_functions,
14313                        value_column,
14314                        value_source,
14315                        alias,
14316                    });
14317                }
14318                Keyword::UNPIVOT => {
14319                    self.expect_token(&Token::LParen)?;
14320                    let value_column = self.parse_identifier()?;
14321                    self.expect_keyword(Keyword::FOR)?;
14322                    let name_column = self.parse_identifier()?;
14323                    self.expect_keyword(Keyword::IN)?;
14324
14325                    self.expect_token(&Token::LParen)?;
14326                    let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14327                    self.expect_token(&Token::RParen)?;
14328
14329                    self.expect_token(&Token::RParen)?;
14330
14331                    let alias = self.parse_identifier_optional_alias()?;
14332
14333                    pipe_operators.push(PipeOperator::Unpivot {
14334                        value_column,
14335                        name_column,
14336                        unpivot_columns,
14337                        alias,
14338                    });
14339                }
14340                Keyword::JOIN
14341                | Keyword::INNER
14342                | Keyword::LEFT
14343                | Keyword::RIGHT
14344                | Keyword::FULL
14345                | Keyword::CROSS => {
14346                    self.prev_token();
14347                    let mut joins = self.parse_joins()?;
14348                    if joins.len() != 1 {
14349                        return Err(ParserError::ParserError(
14350                            "Join pipe operator must have a single join".to_string(),
14351                        ));
14352                    }
14353                    let join = joins.swap_remove(0);
14354                    pipe_operators.push(PipeOperator::Join(join))
14355                }
14356                unhandled => {
14357                    return Err(ParserError::ParserError(format!(
14358                    "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14359                )))
14360                }
14361            }
14362        }
14363        Ok(pipe_operators)
14364    }
14365
14366    fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14367        let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14368        {
14369            let key_values = self.parse_comma_separated(|p| {
14370                let key = p.parse_identifier()?;
14371                p.expect_token(&Token::Eq)?;
14372                let value = p.parse_expr()?;
14373                Ok(Setting { key, value })
14374            })?;
14375            Some(key_values)
14376        } else {
14377            None
14378        };
14379        Ok(settings)
14380    }
14381
14382    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
14383    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14384        if self.parse_keyword(Keyword::XML) {
14385            Ok(Some(self.parse_for_xml()?))
14386        } else if self.parse_keyword(Keyword::JSON) {
14387            Ok(Some(self.parse_for_json()?))
14388        } else if self.parse_keyword(Keyword::BROWSE) {
14389            Ok(Some(ForClause::Browse))
14390        } else {
14391            Ok(None)
14392        }
14393    }
14394
14395    /// Parse a mssql `FOR XML` clause
14396    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14397        let for_xml = if self.parse_keyword(Keyword::RAW) {
14398            let mut element_name = None;
14399            if self.peek_token_ref().token == Token::LParen {
14400                self.expect_token(&Token::LParen)?;
14401                element_name = Some(self.parse_literal_string()?);
14402                self.expect_token(&Token::RParen)?;
14403            }
14404            ForXml::Raw(element_name)
14405        } else if self.parse_keyword(Keyword::AUTO) {
14406            ForXml::Auto
14407        } else if self.parse_keyword(Keyword::EXPLICIT) {
14408            ForXml::Explicit
14409        } else if self.parse_keyword(Keyword::PATH) {
14410            let mut element_name = None;
14411            if self.peek_token_ref().token == Token::LParen {
14412                self.expect_token(&Token::LParen)?;
14413                element_name = Some(self.parse_literal_string()?);
14414                self.expect_token(&Token::RParen)?;
14415            }
14416            ForXml::Path(element_name)
14417        } else {
14418            return Err(ParserError::ParserError(
14419                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14420            ));
14421        };
14422        let mut elements = false;
14423        let mut binary_base64 = false;
14424        let mut root = None;
14425        let mut r#type = false;
14426        while self.peek_token_ref().token == Token::Comma {
14427            self.next_token();
14428            if self.parse_keyword(Keyword::ELEMENTS) {
14429                elements = true;
14430            } else if self.parse_keyword(Keyword::BINARY) {
14431                self.expect_keyword_is(Keyword::BASE64)?;
14432                binary_base64 = true;
14433            } else if self.parse_keyword(Keyword::ROOT) {
14434                self.expect_token(&Token::LParen)?;
14435                root = Some(self.parse_literal_string()?);
14436                self.expect_token(&Token::RParen)?;
14437            } else if self.parse_keyword(Keyword::TYPE) {
14438                r#type = true;
14439            }
14440        }
14441        Ok(ForClause::Xml {
14442            for_xml,
14443            elements,
14444            binary_base64,
14445            root,
14446            r#type,
14447        })
14448    }
14449
14450    /// Parse a mssql `FOR JSON` clause
14451    pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14452        let for_json = if self.parse_keyword(Keyword::AUTO) {
14453            ForJson::Auto
14454        } else if self.parse_keyword(Keyword::PATH) {
14455            ForJson::Path
14456        } else {
14457            return Err(ParserError::ParserError(
14458                "Expected FOR JSON [AUTO | PATH ]".to_string(),
14459            ));
14460        };
14461        let mut root = None;
14462        let mut include_null_values = false;
14463        let mut without_array_wrapper = false;
14464        while self.peek_token_ref().token == Token::Comma {
14465            self.next_token();
14466            if self.parse_keyword(Keyword::ROOT) {
14467                self.expect_token(&Token::LParen)?;
14468                root = Some(self.parse_literal_string()?);
14469                self.expect_token(&Token::RParen)?;
14470            } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14471                include_null_values = true;
14472            } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14473                without_array_wrapper = true;
14474            }
14475        }
14476        Ok(ForClause::Json {
14477            for_json,
14478            root,
14479            include_null_values,
14480            without_array_wrapper,
14481        })
14482    }
14483
14484    /// Parse a CTE (`alias [( col1, col2, ... )] [AS] (subquery)`)
14485    pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
14486        let name = self.parse_identifier()?;
14487
14488        let as_optional = self.dialect.supports_cte_without_as();
14489
14490        // If AS is optional, first try to parse `name (query)` directly
14491        if as_optional && !self.peek_keyword(Keyword::AS) {
14492            if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
14493                p.expect_token(&Token::LParen)?;
14494                let query = p.parse_query()?;
14495                let closing_paren_token = p.expect_token(&Token::RParen)?;
14496                Ok((query, closing_paren_token))
14497            })? {
14498                let mut cte = Cte {
14499                    alias: TableAlias {
14500                        explicit: false,
14501                        name,
14502                        columns: vec![],
14503                        at: None,
14504                    },
14505                    query,
14506                    from: None,
14507                    materialized: None,
14508                    closing_paren_token: closing_paren_token.into(),
14509                };
14510                if self.parse_keyword(Keyword::FROM) {
14511                    cte.from = Some(self.parse_identifier()?);
14512                }
14513                return Ok(cte);
14514            }
14515        }
14516
14517        // Determine column definitions and consume AS
14518        let columns = if self.parse_keyword(Keyword::AS) {
14519            vec![]
14520        } else {
14521            let columns = self.parse_table_alias_column_defs()?;
14522            if as_optional {
14523                let _ = self.parse_keyword(Keyword::AS);
14524            } else {
14525                self.expect_keyword_is(Keyword::AS)?;
14526            }
14527            columns
14528        };
14529
14530        let mut is_materialized = None;
14531        if dialect_of!(self is PostgreSqlDialect) {
14532            if self.parse_keyword(Keyword::MATERIALIZED) {
14533                is_materialized = Some(CteAsMaterialized::Materialized);
14534            } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
14535                is_materialized = Some(CteAsMaterialized::NotMaterialized);
14536            }
14537        }
14538
14539        self.expect_token(&Token::LParen)?;
14540        let query = self.parse_query()?;
14541        let closing_paren_token = self.expect_token(&Token::RParen)?;
14542
14543        let mut cte = Cte {
14544            alias: TableAlias {
14545                explicit: false,
14546                name,
14547                columns,
14548                at: None,
14549            },
14550            query,
14551            from: None,
14552            materialized: is_materialized,
14553            closing_paren_token: closing_paren_token.into(),
14554        };
14555        if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
14556            cte.from = Some(self.parse_identifier()?);
14557        }
14558        Ok(cte)
14559    }
14560
14561    /// Parse a "query body", which is an expression with roughly the
14562    /// following grammar:
14563    /// ```sql
14564    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
14565    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
14566    ///   subquery ::= query_body [ order_by_limit ]
14567    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
14568    /// ```
14569    pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
14570        // We parse the expression using a Pratt parser, as in `parse_expr()`.
14571        // Start by parsing a restricted SELECT or a `(subquery)`:
14572        let expr = if self.peek_keyword(Keyword::SELECT)
14573            || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
14574        {
14575            SetExpr::Select(self.parse_select().map(Box::new)?)
14576        } else if self.consume_token(&Token::LParen) {
14577            // CTEs are not allowed here, but the parser currently accepts them
14578            let subquery = self.parse_query()?;
14579            self.expect_token(&Token::RParen)?;
14580            SetExpr::Query(subquery)
14581        } else if self.parse_keyword(Keyword::VALUES) {
14582            let is_mysql = dialect_of!(self is MySqlDialect);
14583            SetExpr::Values(self.parse_values(is_mysql, false)?)
14584        } else if self.parse_keyword(Keyword::VALUE) {
14585            let is_mysql = dialect_of!(self is MySqlDialect);
14586            SetExpr::Values(self.parse_values(is_mysql, true)?)
14587        } else if self.parse_keyword(Keyword::TABLE) {
14588            SetExpr::Table(Box::new(self.parse_as_table()?))
14589        } else {
14590            return self.expected_ref(
14591                "SELECT, VALUES, or a subquery in the query body",
14592                self.peek_token_ref(),
14593            );
14594        };
14595
14596        self.parse_remaining_set_exprs(expr, precedence)
14597    }
14598
14599    /// Parse any extra set expressions that may be present in a query body
14600    ///
14601    /// (this is its own function to reduce required stack size in debug builds)
14602    fn parse_remaining_set_exprs(
14603        &mut self,
14604        mut expr: SetExpr,
14605        precedence: u8,
14606    ) -> Result<Box<SetExpr>, ParserError> {
14607        loop {
14608            // The query can be optionally followed by a set operator:
14609            let op = self.parse_set_operator(&self.peek_token().token);
14610            let next_precedence = match op {
14611                // UNION and EXCEPT have the same binding power and evaluate left-to-right
14612                Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
14613                    10
14614                }
14615                // INTERSECT has higher precedence than UNION/EXCEPT
14616                Some(SetOperator::Intersect) => 20,
14617                // Unexpected token or EOF => stop parsing the query body
14618                None => break,
14619            };
14620            if precedence >= next_precedence {
14621                break;
14622            }
14623            self.next_token(); // skip past the set operator
14624            let set_quantifier = self.parse_set_quantifier(&op);
14625            expr = SetExpr::SetOperation {
14626                left: Box::new(expr),
14627                op: op.unwrap(),
14628                set_quantifier,
14629                right: self.parse_query_body(next_precedence)?,
14630            };
14631        }
14632
14633        Ok(expr.into())
14634    }
14635
14636    /// Parse a set operator token into its `SetOperator` variant.
14637    pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
14638        match token {
14639            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
14640            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
14641            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
14642            Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
14643            _ => None,
14644        }
14645    }
14646
14647    /// Parse a set quantifier (e.g., `ALL`, `DISTINCT BY NAME`) for the given set operator.
14648    pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
14649        match op {
14650            Some(
14651                SetOperator::Except
14652                | SetOperator::Intersect
14653                | SetOperator::Union
14654                | SetOperator::Minus,
14655            ) => {
14656                if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
14657                    SetQuantifier::DistinctByName
14658                } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14659                    SetQuantifier::ByName
14660                } else if self.parse_keyword(Keyword::ALL) {
14661                    if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14662                        SetQuantifier::AllByName
14663                    } else {
14664                        SetQuantifier::All
14665                    }
14666                } else if self.parse_keyword(Keyword::DISTINCT) {
14667                    SetQuantifier::Distinct
14668                } else {
14669                    SetQuantifier::None
14670                }
14671            }
14672            _ => SetQuantifier::None,
14673        }
14674    }
14675
14676    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`)
14677    pub fn parse_select(&mut self) -> Result<Select, ParserError> {
14678        let mut from_first = None;
14679
14680        if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
14681            let from_token = self.expect_keyword(Keyword::FROM)?;
14682            let from = self.parse_table_with_joins()?;
14683            if !self.peek_keyword(Keyword::SELECT) {
14684                return Ok(Select {
14685                    select_token: AttachedToken(from_token),
14686                    optimizer_hints: vec![],
14687                    distinct: None,
14688                    select_modifiers: None,
14689                    top: None,
14690                    top_before_distinct: false,
14691                    projection: vec![],
14692                    exclude: None,
14693                    into: None,
14694                    from,
14695                    lateral_views: vec![],
14696                    prewhere: None,
14697                    selection: None,
14698                    group_by: GroupByExpr::Expressions(vec![], vec![]),
14699                    cluster_by: vec![],
14700                    distribute_by: vec![],
14701                    sort_by: vec![],
14702                    having: None,
14703                    named_window: vec![],
14704                    window_before_qualify: false,
14705                    qualify: None,
14706                    value_table_mode: None,
14707                    connect_by: vec![],
14708                    flavor: SelectFlavor::FromFirstNoSelect,
14709                });
14710            }
14711            from_first = Some(from);
14712        }
14713
14714        let select_token = self.expect_keyword(Keyword::SELECT)?;
14715        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14716        let value_table_mode = self.parse_value_table_mode()?;
14717
14718        let (select_modifiers, distinct_select_modifier) =
14719            if self.dialect.supports_select_modifiers() {
14720                self.parse_select_modifiers()?
14721            } else {
14722                (None, None)
14723            };
14724
14725        let mut top_before_distinct = false;
14726        let mut top = None;
14727        if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14728            top = Some(self.parse_top()?);
14729            top_before_distinct = true;
14730        }
14731
14732        let distinct = if distinct_select_modifier.is_some() {
14733            distinct_select_modifier
14734        } else {
14735            self.parse_all_or_distinct()?
14736        };
14737
14738        if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14739            top = Some(self.parse_top()?);
14740        }
14741
14742        let projection =
14743            if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
14744                vec![]
14745            } else {
14746                self.parse_projection()?
14747            };
14748
14749        let exclude = if self.dialect.supports_select_exclude() {
14750            self.parse_optional_select_item_exclude()?
14751        } else {
14752            None
14753        };
14754
14755        let into = if self.parse_keyword(Keyword::INTO) {
14756            Some(self.parse_select_into()?)
14757        } else {
14758            None
14759        };
14760
14761        // Note that for keywords to be properly handled here, they need to be
14762        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
14763        // otherwise they may be parsed as an alias as part of the `projection`
14764        // or `from`.
14765
14766        let (from, from_first) = if let Some(from) = from_first.take() {
14767            (from, true)
14768        } else if self.parse_keyword(Keyword::FROM) {
14769            (self.parse_table_with_joins()?, false)
14770        } else {
14771            (vec![], false)
14772        };
14773
14774        let mut lateral_views = vec![];
14775        loop {
14776            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
14777                let outer = self.parse_keyword(Keyword::OUTER);
14778                let lateral_view = self.parse_expr()?;
14779                let lateral_view_name = self.parse_object_name(false)?;
14780                let lateral_col_alias = self
14781                    .parse_comma_separated(|parser| {
14782                        parser.parse_optional_alias(&[
14783                            Keyword::WHERE,
14784                            Keyword::GROUP,
14785                            Keyword::CLUSTER,
14786                            Keyword::HAVING,
14787                            Keyword::LATERAL,
14788                        ]) // This couldn't possibly be a bad idea
14789                    })?
14790                    .into_iter()
14791                    .flatten()
14792                    .collect();
14793
14794                lateral_views.push(LateralView {
14795                    lateral_view,
14796                    lateral_view_name,
14797                    lateral_col_alias,
14798                    outer,
14799                });
14800            } else {
14801                break;
14802            }
14803        }
14804
14805        let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
14806        {
14807            Some(self.parse_expr()?)
14808        } else {
14809            None
14810        };
14811
14812        let selection = if self.parse_keyword(Keyword::WHERE) {
14813            Some(self.parse_expr()?)
14814        } else {
14815            None
14816        };
14817
14818        let connect_by = self.maybe_parse_connect_by()?;
14819
14820        let group_by = self
14821            .parse_optional_group_by()?
14822            .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
14823
14824        let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
14825            self.parse_comma_separated(Parser::parse_expr)?
14826        } else {
14827            vec![]
14828        };
14829
14830        let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
14831            self.parse_comma_separated(Parser::parse_expr)?
14832        } else {
14833            vec![]
14834        };
14835
14836        let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
14837            self.parse_comma_separated(Parser::parse_order_by_expr)?
14838        } else {
14839            vec![]
14840        };
14841
14842        let having = if self.parse_keyword(Keyword::HAVING) {
14843            Some(self.parse_expr()?)
14844        } else {
14845            None
14846        };
14847
14848        // Accept QUALIFY and WINDOW in any order and flag accordingly.
14849        let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
14850        {
14851            let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
14852            if self.parse_keyword(Keyword::QUALIFY) {
14853                (named_windows, Some(self.parse_expr()?), true)
14854            } else {
14855                (named_windows, None, true)
14856            }
14857        } else if self.parse_keyword(Keyword::QUALIFY) {
14858            let qualify = Some(self.parse_expr()?);
14859            if self.parse_keyword(Keyword::WINDOW) {
14860                (
14861                    self.parse_comma_separated(Parser::parse_named_window)?,
14862                    qualify,
14863                    false,
14864                )
14865            } else {
14866                (Default::default(), qualify, false)
14867            }
14868        } else {
14869            Default::default()
14870        };
14871
14872        Ok(Select {
14873            select_token: AttachedToken(select_token),
14874            optimizer_hints,
14875            distinct,
14876            select_modifiers,
14877            top,
14878            top_before_distinct,
14879            projection,
14880            exclude,
14881            into,
14882            from,
14883            lateral_views,
14884            prewhere,
14885            selection,
14886            group_by,
14887            cluster_by,
14888            distribute_by,
14889            sort_by,
14890            having,
14891            named_window: named_windows,
14892            window_before_qualify,
14893            qualify,
14894            value_table_mode,
14895            connect_by,
14896            flavor: if from_first {
14897                SelectFlavor::FromFirst
14898            } else {
14899                SelectFlavor::Standard
14900            },
14901        })
14902    }
14903
14904    /// Parses optimizer hints at the current token position.
14905    ///
14906    /// Collects all `/*prefix+...*/` and `--prefix+...` patterns.
14907    /// The `prefix` is any run of ASCII alphanumeric characters between the
14908    /// comment marker and `+` (e.g. `""` for `/*+...*/`, `"abc"` for `/*abc+...*/`).
14909    ///
14910    /// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/optimizer-hints.html#optimizer-hints-overview)
14911    /// [Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E)
14912    fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
14913        let supports_hints = self.dialect.supports_comment_optimizer_hint();
14914        if !supports_hints {
14915            return Ok(vec![]);
14916        }
14917        let mut hints = vec![];
14918        loop {
14919            let t = self.peek_nth_token_no_skip_ref(0);
14920            let Token::Whitespace(ws) = &t.token else {
14921                break;
14922            };
14923            match ws {
14924                Whitespace::SingleLineComment { comment, prefix } => {
14925                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
14926                        hints.push(OptimizerHint {
14927                            prefix: hint_prefix,
14928                            text,
14929                            style: OptimizerHintStyle::SingleLine {
14930                                prefix: prefix.clone(),
14931                            },
14932                        });
14933                    }
14934                    self.next_token_no_skip();
14935                }
14936                Whitespace::MultiLineComment(comment) => {
14937                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
14938                        hints.push(OptimizerHint {
14939                            prefix: hint_prefix,
14940                            text,
14941                            style: OptimizerHintStyle::MultiLine,
14942                        });
14943                    }
14944                    self.next_token_no_skip();
14945                }
14946                Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
14947                    self.next_token_no_skip();
14948                }
14949            }
14950        }
14951        Ok(hints)
14952    }
14953
14954    /// Checks if a comment's content starts with `[ASCII-alphanumeric]*+`
14955    /// and returns `(prefix, text_after_plus)` if so.
14956    fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
14957        let (before_plus, text) = comment.split_once('+')?;
14958        if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
14959            Some((before_plus.to_string(), text.to_string()))
14960        } else {
14961            None
14962        }
14963    }
14964
14965    /// Parses MySQL SELECT modifiers and DISTINCT/ALL in any order.
14966    ///
14967    /// Manual testing shows odifiers can appear in any order, and modifiers other than DISTINCT/ALL
14968    /// can be repeated.
14969    ///
14970    /// <https://dev.mysql.com/doc/refman/8.4/en/select.html>
14971    fn parse_select_modifiers(
14972        &mut self,
14973    ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
14974        let mut modifiers = SelectModifiers::default();
14975        let mut distinct = None;
14976
14977        let keywords = &[
14978            Keyword::ALL,
14979            Keyword::DISTINCT,
14980            Keyword::DISTINCTROW,
14981            Keyword::HIGH_PRIORITY,
14982            Keyword::STRAIGHT_JOIN,
14983            Keyword::SQL_SMALL_RESULT,
14984            Keyword::SQL_BIG_RESULT,
14985            Keyword::SQL_BUFFER_RESULT,
14986            Keyword::SQL_NO_CACHE,
14987            Keyword::SQL_CALC_FOUND_ROWS,
14988        ];
14989
14990        while let Some(keyword) = self.parse_one_of_keywords(keywords) {
14991            match keyword {
14992                Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
14993                    self.prev_token();
14994                    distinct = self.parse_all_or_distinct()?;
14995                }
14996                // DISTINCTROW is a MySQL-specific legacy (but not deprecated) alias for DISTINCT
14997                Keyword::DISTINCTROW if distinct.is_none() => {
14998                    distinct = Some(Distinct::Distinct);
14999                }
15000                Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15001                Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15002                Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15003                Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15004                Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15005                Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15006                Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15007                _ => {
15008                    self.prev_token();
15009                    return self.expected_ref(
15010                        "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15011                        self.peek_token_ref(),
15012                    );
15013                }
15014            }
15015        }
15016
15017        // Avoid polluting the AST with `Some(SelectModifiers::default())` empty value unless there
15018        // actually were some modifiers set.
15019        let select_modifiers = if modifiers.is_any_set() {
15020            Some(modifiers)
15021        } else {
15022            None
15023        };
15024        Ok((select_modifiers, distinct))
15025    }
15026
15027    fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15028        if !dialect_of!(self is BigQueryDialect) {
15029            return Ok(None);
15030        }
15031
15032        let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15033            Some(ValueTableMode::DistinctAsValue)
15034        } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15035            Some(ValueTableMode::DistinctAsStruct)
15036        } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15037            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15038        {
15039            Some(ValueTableMode::AsValue)
15040        } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15041            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15042        {
15043            Some(ValueTableMode::AsStruct)
15044        } else if self.parse_keyword(Keyword::AS) {
15045            self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15046        } else {
15047            None
15048        };
15049
15050        Ok(mode)
15051    }
15052
15053    /// Invoke `f` after first setting the parser's `ParserState` to `state`.
15054    ///
15055    /// Upon return, restores the parser's state to what it started at.
15056    fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15057    where
15058        F: FnMut(&mut Parser) -> Result<T, ParserError>,
15059    {
15060        let current_state = self.state;
15061        self.state = state;
15062        let res = f(self);
15063        self.state = current_state;
15064        res
15065    }
15066
15067    /// Parse a `CONNECT BY` clause (Oracle-style hierarchical query support).
15068    pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15069        let mut clauses = Vec::with_capacity(2);
15070        loop {
15071            if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15072                clauses.push(ConnectByKind::StartWith {
15073                    start_token: self.token_at(idx).clone().into(),
15074                    condition: self.parse_expr()?.into(),
15075                });
15076            } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15077            {
15078                clauses.push(ConnectByKind::ConnectBy {
15079                    connect_token: self.token_at(idx).clone().into(),
15080                    nocycle: self.parse_keyword(Keyword::NOCYCLE),
15081                    relationships: self.with_state(ParserState::ConnectBy, |parser| {
15082                        parser.parse_comma_separated(Parser::parse_expr)
15083                    })?,
15084                });
15085            } else {
15086                break;
15087            }
15088        }
15089        Ok(clauses)
15090    }
15091
15092    /// Parse `CREATE TABLE x AS TABLE y`
15093    pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15094        let token1 = self.next_token();
15095        let token2 = self.next_token();
15096        let token3 = self.next_token();
15097
15098        let table_name;
15099        let schema_name;
15100        if token2 == Token::Period {
15101            match token1.token {
15102                Token::Word(w) => {
15103                    schema_name = w.value;
15104                }
15105                _ => {
15106                    return self.expected("Schema name", token1);
15107                }
15108            }
15109            match token3.token {
15110                Token::Word(w) => {
15111                    table_name = w.value;
15112                }
15113                _ => {
15114                    return self.expected("Table name", token3);
15115                }
15116            }
15117            Ok(Table {
15118                table_name: Some(table_name),
15119                schema_name: Some(schema_name),
15120            })
15121        } else {
15122            match token1.token {
15123                Token::Word(w) => {
15124                    table_name = w.value;
15125                }
15126                _ => {
15127                    return self.expected("Table name", token1);
15128                }
15129            }
15130            Ok(Table {
15131                table_name: Some(table_name),
15132                schema_name: None,
15133            })
15134        }
15135    }
15136
15137    /// Parse a `SET ROLE` statement. Expects SET to be consumed already.
15138    fn parse_set_role(
15139        &mut self,
15140        modifier: Option<ContextModifier>,
15141    ) -> Result<Statement, ParserError> {
15142        self.expect_keyword_is(Keyword::ROLE)?;
15143
15144        let role_name = if self.parse_keyword(Keyword::NONE) {
15145            None
15146        } else {
15147            Some(self.parse_identifier()?)
15148        };
15149        Ok(Statement::Set(Set::SetRole {
15150            context_modifier: modifier,
15151            role_name,
15152        }))
15153    }
15154
15155    fn parse_set_values(
15156        &mut self,
15157        parenthesized_assignment: bool,
15158    ) -> Result<Vec<Expr>, ParserError> {
15159        let mut values = vec![];
15160
15161        if parenthesized_assignment {
15162            self.expect_token(&Token::LParen)?;
15163        }
15164
15165        loop {
15166            let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15167                expr
15168            } else if let Ok(expr) = self.parse_expr() {
15169                expr
15170            } else {
15171                self.expected_ref("variable value", self.peek_token_ref())?
15172            };
15173
15174            values.push(value);
15175            if self.consume_token(&Token::Comma) {
15176                continue;
15177            }
15178
15179            if parenthesized_assignment {
15180                self.expect_token(&Token::RParen)?;
15181            }
15182            return Ok(values);
15183        }
15184    }
15185
15186    fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15187        let modifier =
15188            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15189
15190        Self::keyword_to_modifier(modifier)
15191    }
15192
15193    /// Parse a single SET statement assignment `var = expr`.
15194    fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15195        let scope = self.parse_context_modifier();
15196
15197        let name = if self.dialect.supports_parenthesized_set_variables()
15198            && self.consume_token(&Token::LParen)
15199        {
15200            // Parenthesized assignments are handled in the `parse_set` function after
15201            // trying to parse list of assignments using this function.
15202            // If a dialect supports both, and we find a LParen, we early exit from this function.
15203            self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15204        } else {
15205            self.parse_object_name(false)?
15206        };
15207
15208        if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15209            return self.expected_ref("assignment operator", self.peek_token_ref());
15210        }
15211
15212        let value = self.parse_expr()?;
15213
15214        Ok(SetAssignment { scope, name, value })
15215    }
15216
15217    fn parse_set(&mut self) -> Result<Statement, ParserError> {
15218        let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15219
15220        // Modifier is either HIVEVAR: or a ContextModifier (LOCAL, SESSION, etc), not both
15221        let scope = if !hivevar {
15222            self.parse_context_modifier()
15223        } else {
15224            None
15225        };
15226
15227        if hivevar {
15228            self.expect_token(&Token::Colon)?;
15229        }
15230
15231        if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15232            return Ok(set_role_stmt);
15233        }
15234
15235        // Handle special cases first
15236        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15237            || self.parse_keyword(Keyword::TIMEZONE)
15238        {
15239            if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15240                return Ok(Set::SingleAssignment {
15241                    scope,
15242                    hivevar,
15243                    variable: ObjectName::from(vec!["TIMEZONE".into()]),
15244                    values: self.parse_set_values(false)?,
15245                }
15246                .into());
15247            } else {
15248                // A shorthand alias for SET TIME ZONE that doesn't require
15249                // the assignment operator. It's originally PostgreSQL specific,
15250                // but we allow it for all the dialects
15251                return Ok(Set::SetTimeZone {
15252                    local: scope == Some(ContextModifier::Local),
15253                    value: self.parse_expr()?,
15254                }
15255                .into());
15256            }
15257        } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15258            if self.parse_keyword(Keyword::DEFAULT) {
15259                return Ok(Set::SetNamesDefault {}.into());
15260            }
15261            let charset_name = self.parse_identifier()?;
15262            let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15263                Some(self.parse_literal_string()?)
15264            } else {
15265                None
15266            };
15267
15268            return Ok(Set::SetNames {
15269                charset_name,
15270                collation_name,
15271            }
15272            .into());
15273        } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15274            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15275            return Ok(Set::SetTransaction {
15276                modes: self.parse_transaction_modes()?,
15277                snapshot: None,
15278                session: true,
15279            }
15280            .into());
15281        } else if self.parse_keyword(Keyword::TRANSACTION) {
15282            if self.parse_keyword(Keyword::SNAPSHOT) {
15283                let snapshot_id = self.parse_value()?;
15284                return Ok(Set::SetTransaction {
15285                    modes: vec![],
15286                    snapshot: Some(snapshot_id),
15287                    session: false,
15288                }
15289                .into());
15290            }
15291            return Ok(Set::SetTransaction {
15292                modes: self.parse_transaction_modes()?,
15293                snapshot: None,
15294                session: false,
15295            }
15296            .into());
15297        } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15298            let scope = match scope {
15299                Some(s) => s,
15300                None => {
15301                    return self.expected_at(
15302                        "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15303                        self.get_current_index(),
15304                    )
15305                }
15306            };
15307            let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15308                SetSessionAuthorizationParamKind::Default
15309            } else {
15310                let value = self.parse_identifier()?;
15311                SetSessionAuthorizationParamKind::User(value)
15312            };
15313            return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15314                scope,
15315                kind: auth_value,
15316            })
15317            .into());
15318        }
15319
15320        if self.dialect.supports_comma_separated_set_assignments() {
15321            if scope.is_some() {
15322                self.prev_token();
15323            }
15324
15325            if let Some(assignments) = self
15326                .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15327            {
15328                return if assignments.len() > 1 {
15329                    Ok(Set::MultipleAssignments { assignments }.into())
15330                } else {
15331                    let SetAssignment { scope, name, value } =
15332                        assignments.into_iter().next().ok_or_else(|| {
15333                            ParserError::ParserError("Expected at least one assignment".to_string())
15334                        })?;
15335
15336                    Ok(Set::SingleAssignment {
15337                        scope,
15338                        hivevar,
15339                        variable: name,
15340                        values: vec![value],
15341                    }
15342                    .into())
15343                };
15344            }
15345        }
15346
15347        let variables = if self.dialect.supports_parenthesized_set_variables()
15348            && self.consume_token(&Token::LParen)
15349        {
15350            let vars = OneOrManyWithParens::Many(
15351                self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15352                    .into_iter()
15353                    .map(|ident| ObjectName::from(vec![ident]))
15354                    .collect(),
15355            );
15356            self.expect_token(&Token::RParen)?;
15357            vars
15358        } else {
15359            OneOrManyWithParens::One(self.parse_object_name(false)?)
15360        };
15361
15362        if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15363            let stmt = match variables {
15364                OneOrManyWithParens::One(var) => Set::SingleAssignment {
15365                    scope,
15366                    hivevar,
15367                    variable: var,
15368                    values: self.parse_set_values(false)?,
15369                },
15370                OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15371                    variables: vars,
15372                    values: self.parse_set_values(true)?,
15373                },
15374            };
15375
15376            return Ok(stmt.into());
15377        }
15378
15379        if self.dialect.supports_set_stmt_without_operator() {
15380            self.prev_token();
15381            return self.parse_set_session_params();
15382        };
15383
15384        self.expected_ref("equals sign or TO", self.peek_token_ref())
15385    }
15386
15387    /// Parse session parameter assignments after `SET` when no `=` or `TO` is present.
15388    pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15389        if self.parse_keyword(Keyword::STATISTICS) {
15390            let topic = match self.parse_one_of_keywords(&[
15391                Keyword::IO,
15392                Keyword::PROFILE,
15393                Keyword::TIME,
15394                Keyword::XML,
15395            ]) {
15396                Some(Keyword::IO) => SessionParamStatsTopic::IO,
15397                Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15398                Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15399                Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15400                _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15401            };
15402            let value = self.parse_session_param_value()?;
15403            Ok(
15404                Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15405                    topic,
15406                    value,
15407                }))
15408                .into(),
15409            )
15410        } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15411            let obj = self.parse_object_name(false)?;
15412            let value = self.parse_session_param_value()?;
15413            Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15414                SetSessionParamIdentityInsert { obj, value },
15415            ))
15416            .into())
15417        } else if self.parse_keyword(Keyword::OFFSETS) {
15418            let keywords = self.parse_comma_separated(|parser| {
15419                let next_token = parser.next_token();
15420                match &next_token.token {
15421                    Token::Word(w) => Ok(w.to_string()),
15422                    _ => parser.expected("SQL keyword", next_token),
15423                }
15424            })?;
15425            let value = self.parse_session_param_value()?;
15426            Ok(
15427                Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15428                    keywords,
15429                    value,
15430                }))
15431                .into(),
15432            )
15433        } else {
15434            let names = self.parse_comma_separated(|parser| {
15435                let next_token = parser.next_token();
15436                match next_token.token {
15437                    Token::Word(w) => Ok(w.to_string()),
15438                    _ => parser.expected("Session param name", next_token),
15439                }
15440            })?;
15441            let value = self.parse_expr()?.to_string();
15442            Ok(
15443                Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15444                    names,
15445                    value,
15446                }))
15447                .into(),
15448            )
15449        }
15450    }
15451
15452    fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15453        if self.parse_keyword(Keyword::ON) {
15454            Ok(SessionParamValue::On)
15455        } else if self.parse_keyword(Keyword::OFF) {
15456            Ok(SessionParamValue::Off)
15457        } else {
15458            self.expected_ref("ON or OFF", self.peek_token_ref())
15459        }
15460    }
15461
15462    /// Parse a `SHOW` statement and dispatch to specific SHOW handlers.
15463    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15464        let terse = self.parse_keyword(Keyword::TERSE);
15465        let extended = self.parse_keyword(Keyword::EXTENDED);
15466        let full = self.parse_keyword(Keyword::FULL);
15467        let session = self.parse_keyword(Keyword::SESSION);
15468        let global = self.parse_keyword(Keyword::GLOBAL);
15469        let external = self.parse_keyword(Keyword::EXTERNAL);
15470        if self
15471            .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15472            .is_some()
15473        {
15474            Ok(self.parse_show_columns(extended, full)?)
15475        } else if self.parse_keyword(Keyword::TABLES) {
15476            Ok(self.parse_show_tables(terse, extended, full, external)?)
15477        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15478            Ok(self.parse_show_views(terse, true)?)
15479        } else if self.parse_keyword(Keyword::VIEWS) {
15480            Ok(self.parse_show_views(terse, false)?)
15481        } else if self.parse_keyword(Keyword::FUNCTIONS) {
15482            Ok(self.parse_show_functions()?)
15483        } else if self.parse_keyword(Keyword::PROCESSLIST) {
15484            Ok(Statement::ShowProcessList { full })
15485        } else if extended || full {
15486            Err(ParserError::ParserError(
15487                "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
15488            ))
15489        } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
15490            Ok(self.parse_show_create()?)
15491        } else if self.parse_keyword(Keyword::COLLATION) {
15492            Ok(self.parse_show_collation()?)
15493        } else if self.parse_keyword(Keyword::VARIABLES)
15494            && dialect_of!(self is MySqlDialect | GenericDialect)
15495        {
15496            Ok(Statement::ShowVariables {
15497                filter: self.parse_show_statement_filter()?,
15498                session,
15499                global,
15500            })
15501        } else if self.parse_keyword(Keyword::STATUS)
15502            && dialect_of!(self is MySqlDialect | GenericDialect)
15503        {
15504            Ok(Statement::ShowStatus {
15505                filter: self.parse_show_statement_filter()?,
15506                session,
15507                global,
15508            })
15509        } else if self.parse_keyword(Keyword::CATALOGS) {
15510            self.parse_show_catalogs(terse)
15511        } else if self.parse_keyword(Keyword::DATABASES) {
15512            self.parse_show_databases(terse)
15513        } else if self.parse_keyword(Keyword::SCHEMAS) {
15514            self.parse_show_schemas(terse)
15515        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
15516            self.parse_show_charset(false)
15517        } else if self.parse_keyword(Keyword::CHARSET) {
15518            self.parse_show_charset(true)
15519        } else {
15520            Ok(Statement::ShowVariable {
15521                variable: self.parse_identifiers()?,
15522            })
15523        }
15524    }
15525
15526    fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
15527        // parse one of keywords
15528        Ok(Statement::ShowCharset(ShowCharset {
15529            is_shorthand,
15530            filter: self.parse_show_statement_filter()?,
15531        }))
15532    }
15533
15534    fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
15535        let history = self.parse_keyword(Keyword::HISTORY);
15536        let show_options = self.parse_show_stmt_options()?;
15537        Ok(Statement::ShowCatalogs {
15538            terse,
15539            history,
15540            show_options,
15541        })
15542    }
15543
15544    fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
15545        let history = self.parse_keyword(Keyword::HISTORY);
15546        let show_options = self.parse_show_stmt_options()?;
15547        Ok(Statement::ShowDatabases {
15548            terse,
15549            history,
15550            show_options,
15551        })
15552    }
15553
15554    fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
15555        let history = self.parse_keyword(Keyword::HISTORY);
15556        let show_options = self.parse_show_stmt_options()?;
15557        Ok(Statement::ShowSchemas {
15558            terse,
15559            history,
15560            show_options,
15561        })
15562    }
15563
15564    /// Parse `SHOW CREATE <object>` returning the corresponding `ShowCreate` statement.
15565    pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
15566        let obj_type = match self.expect_one_of_keywords(&[
15567            Keyword::TABLE,
15568            Keyword::TRIGGER,
15569            Keyword::FUNCTION,
15570            Keyword::PROCEDURE,
15571            Keyword::EVENT,
15572            Keyword::VIEW,
15573        ])? {
15574            Keyword::TABLE => Ok(ShowCreateObject::Table),
15575            Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
15576            Keyword::FUNCTION => Ok(ShowCreateObject::Function),
15577            Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
15578            Keyword::EVENT => Ok(ShowCreateObject::Event),
15579            Keyword::VIEW => Ok(ShowCreateObject::View),
15580            keyword => Err(ParserError::ParserError(format!(
15581                "Unable to map keyword to ShowCreateObject: {keyword:?}"
15582            ))),
15583        }?;
15584
15585        let obj_name = self.parse_object_name(false)?;
15586
15587        Ok(Statement::ShowCreate { obj_type, obj_name })
15588    }
15589
15590    /// Parse `SHOW COLUMNS`/`SHOW FIELDS` and return a `ShowColumns` statement.
15591    pub fn parse_show_columns(
15592        &mut self,
15593        extended: bool,
15594        full: bool,
15595    ) -> Result<Statement, ParserError> {
15596        let show_options = self.parse_show_stmt_options()?;
15597        Ok(Statement::ShowColumns {
15598            extended,
15599            full,
15600            show_options,
15601        })
15602    }
15603
15604    fn parse_show_tables(
15605        &mut self,
15606        terse: bool,
15607        extended: bool,
15608        full: bool,
15609        external: bool,
15610    ) -> Result<Statement, ParserError> {
15611        let history = !external && self.parse_keyword(Keyword::HISTORY);
15612        let show_options = self.parse_show_stmt_options()?;
15613        Ok(Statement::ShowTables {
15614            terse,
15615            history,
15616            extended,
15617            full,
15618            external,
15619            show_options,
15620        })
15621    }
15622
15623    fn parse_show_views(
15624        &mut self,
15625        terse: bool,
15626        materialized: bool,
15627    ) -> Result<Statement, ParserError> {
15628        let show_options = self.parse_show_stmt_options()?;
15629        Ok(Statement::ShowViews {
15630            materialized,
15631            terse,
15632            show_options,
15633        })
15634    }
15635
15636    /// Parse `SHOW FUNCTIONS` and optional filter.
15637    pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
15638        let filter = self.parse_show_statement_filter()?;
15639        Ok(Statement::ShowFunctions { filter })
15640    }
15641
15642    /// Parse `SHOW COLLATION` and optional filter.
15643    pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
15644        let filter = self.parse_show_statement_filter()?;
15645        Ok(Statement::ShowCollation { filter })
15646    }
15647
15648    /// Parse an optional filter used by `SHOW` statements (LIKE, ILIKE, WHERE, or literal).
15649    pub fn parse_show_statement_filter(
15650        &mut self,
15651    ) -> Result<Option<ShowStatementFilter>, ParserError> {
15652        if self.parse_keyword(Keyword::LIKE) {
15653            Ok(Some(ShowStatementFilter::Like(
15654                self.parse_literal_string()?,
15655            )))
15656        } else if self.parse_keyword(Keyword::ILIKE) {
15657            Ok(Some(ShowStatementFilter::ILike(
15658                self.parse_literal_string()?,
15659            )))
15660        } else if self.parse_keyword(Keyword::WHERE) {
15661            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
15662        } else {
15663            self.maybe_parse(|parser| -> Result<String, ParserError> {
15664                parser.parse_literal_string()
15665            })?
15666            .map_or(Ok(None), |filter| {
15667                Ok(Some(ShowStatementFilter::NoKeyword(filter)))
15668            })
15669        }
15670    }
15671
15672    /// Parse a `USE` statement (database/catalog/schema/warehouse/role selection).
15673    pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
15674        // Determine which keywords are recognized by the current dialect
15675        let parsed_keyword = if dialect_of!(self is HiveDialect) {
15676            // HiveDialect accepts USE DEFAULT; statement without any db specified
15677            if self.parse_keyword(Keyword::DEFAULT) {
15678                return Ok(Statement::Use(Use::Default));
15679            }
15680            None // HiveDialect doesn't expect any other specific keyword after `USE`
15681        } else if dialect_of!(self is DatabricksDialect) {
15682            self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
15683        } else if dialect_of!(self is SnowflakeDialect) {
15684            self.parse_one_of_keywords(&[
15685                Keyword::DATABASE,
15686                Keyword::SCHEMA,
15687                Keyword::WAREHOUSE,
15688                Keyword::ROLE,
15689                Keyword::SECONDARY,
15690            ])
15691        } else {
15692            None // No specific keywords for other dialects, including GenericDialect
15693        };
15694
15695        let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
15696            self.parse_secondary_roles()?
15697        } else {
15698            let obj_name = self.parse_object_name(false)?;
15699            match parsed_keyword {
15700                Some(Keyword::CATALOG) => Use::Catalog(obj_name),
15701                Some(Keyword::DATABASE) => Use::Database(obj_name),
15702                Some(Keyword::SCHEMA) => Use::Schema(obj_name),
15703                Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
15704                Some(Keyword::ROLE) => Use::Role(obj_name),
15705                _ => Use::Object(obj_name),
15706            }
15707        };
15708
15709        Ok(Statement::Use(result))
15710    }
15711
15712    fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
15713        self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
15714        if self.parse_keyword(Keyword::NONE) {
15715            Ok(Use::SecondaryRoles(SecondaryRoles::None))
15716        } else if self.parse_keyword(Keyword::ALL) {
15717            Ok(Use::SecondaryRoles(SecondaryRoles::All))
15718        } else {
15719            let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
15720            Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
15721        }
15722    }
15723
15724    /// Parse a table factor followed by any join clauses, returning `TableWithJoins`.
15725    pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
15726        let relation = self.parse_table_factor()?;
15727        // Note that for keywords to be properly handled here, they need to be
15728        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
15729        // a table alias.
15730        let joins = self.parse_joins()?;
15731        Ok(TableWithJoins { relation, joins })
15732    }
15733
15734    fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
15735        let mut joins = vec![];
15736        loop {
15737            let global = self.parse_keyword(Keyword::GLOBAL);
15738            let join = if self.parse_keyword(Keyword::CROSS) {
15739                let join_operator = if self.parse_keyword(Keyword::JOIN) {
15740                    JoinOperator::CrossJoin(JoinConstraint::None)
15741                } else if self.parse_keyword(Keyword::APPLY) {
15742                    // MSSQL extension, similar to CROSS JOIN LATERAL
15743                    JoinOperator::CrossApply
15744                } else {
15745                    return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
15746                };
15747                let relation = self.parse_table_factor()?;
15748                let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
15749                    && self.dialect.supports_cross_join_constraint()
15750                {
15751                    let constraint = self.parse_join_constraint(false)?;
15752                    JoinOperator::CrossJoin(constraint)
15753                } else {
15754                    join_operator
15755                };
15756                Join {
15757                    relation,
15758                    global,
15759                    join_operator,
15760                }
15761            } else if self.parse_keyword(Keyword::OUTER) {
15762                // MSSQL extension, similar to LEFT JOIN LATERAL .. ON 1=1
15763                self.expect_keyword_is(Keyword::APPLY)?;
15764                Join {
15765                    relation: self.parse_table_factor()?,
15766                    global,
15767                    join_operator: JoinOperator::OuterApply,
15768                }
15769            } else if self.parse_keyword(Keyword::ASOF) {
15770                self.expect_keyword_is(Keyword::JOIN)?;
15771                let relation = self.parse_table_factor()?;
15772                self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
15773                let match_condition = self.parse_parenthesized(Self::parse_expr)?;
15774                Join {
15775                    relation,
15776                    global,
15777                    join_operator: JoinOperator::AsOf {
15778                        match_condition,
15779                        constraint: self.parse_join_constraint(false)?,
15780                    },
15781                }
15782            } else if self.dialect.supports_array_join_syntax()
15783                && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
15784            {
15785                // ClickHouse: INNER ARRAY JOIN
15786                Join {
15787                    relation: self.parse_table_factor()?,
15788                    global,
15789                    join_operator: JoinOperator::InnerArrayJoin,
15790                }
15791            } else if self.dialect.supports_array_join_syntax()
15792                && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
15793            {
15794                // ClickHouse: LEFT ARRAY JOIN
15795                Join {
15796                    relation: self.parse_table_factor()?,
15797                    global,
15798                    join_operator: JoinOperator::LeftArrayJoin,
15799                }
15800            } else if self.dialect.supports_array_join_syntax()
15801                && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
15802            {
15803                // ClickHouse: ARRAY JOIN
15804                Join {
15805                    relation: self.parse_table_factor()?,
15806                    global,
15807                    join_operator: JoinOperator::ArrayJoin,
15808                }
15809            } else {
15810                let natural = self.parse_keyword(Keyword::NATURAL);
15811                let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
15812                    w.keyword
15813                } else {
15814                    Keyword::NoKeyword
15815                };
15816
15817                let join_operator_type = match peek_keyword {
15818                    Keyword::INNER | Keyword::JOIN => {
15819                        let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
15820                        self.expect_keyword_is(Keyword::JOIN)?;
15821                        if inner {
15822                            JoinOperator::Inner
15823                        } else {
15824                            JoinOperator::Join
15825                        }
15826                    }
15827                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
15828                        let _ = self.next_token(); // consume LEFT/RIGHT
15829                        let is_left = kw == Keyword::LEFT;
15830                        let join_type = self.parse_one_of_keywords(&[
15831                            Keyword::OUTER,
15832                            Keyword::SEMI,
15833                            Keyword::ANTI,
15834                            Keyword::JOIN,
15835                        ]);
15836                        match join_type {
15837                            Some(Keyword::OUTER) => {
15838                                self.expect_keyword_is(Keyword::JOIN)?;
15839                                if is_left {
15840                                    JoinOperator::LeftOuter
15841                                } else {
15842                                    JoinOperator::RightOuter
15843                                }
15844                            }
15845                            Some(Keyword::SEMI) => {
15846                                self.expect_keyword_is(Keyword::JOIN)?;
15847                                if is_left {
15848                                    JoinOperator::LeftSemi
15849                                } else {
15850                                    JoinOperator::RightSemi
15851                                }
15852                            }
15853                            Some(Keyword::ANTI) => {
15854                                self.expect_keyword_is(Keyword::JOIN)?;
15855                                if is_left {
15856                                    JoinOperator::LeftAnti
15857                                } else {
15858                                    JoinOperator::RightAnti
15859                                }
15860                            }
15861                            Some(Keyword::JOIN) => {
15862                                if is_left {
15863                                    JoinOperator::Left
15864                                } else {
15865                                    JoinOperator::Right
15866                                }
15867                            }
15868                            _ => {
15869                                return Err(ParserError::ParserError(format!(
15870                                    "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
15871                                )))
15872                            }
15873                        }
15874                    }
15875                    Keyword::ANTI => {
15876                        let _ = self.next_token(); // consume ANTI
15877                        self.expect_keyword_is(Keyword::JOIN)?;
15878                        JoinOperator::Anti
15879                    }
15880                    Keyword::SEMI => {
15881                        let _ = self.next_token(); // consume SEMI
15882                        self.expect_keyword_is(Keyword::JOIN)?;
15883                        JoinOperator::Semi
15884                    }
15885                    Keyword::FULL => {
15886                        let _ = self.next_token(); // consume FULL
15887                        let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
15888                        self.expect_keyword_is(Keyword::JOIN)?;
15889                        JoinOperator::FullOuter
15890                    }
15891                    Keyword::OUTER => {
15892                        return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
15893                    }
15894                    Keyword::STRAIGHT_JOIN => {
15895                        let _ = self.next_token(); // consume STRAIGHT_JOIN
15896                        JoinOperator::StraightJoin
15897                    }
15898                    _ if natural => {
15899                        return self
15900                            .expected_ref("a join type after NATURAL", self.peek_token_ref());
15901                    }
15902                    _ => break,
15903                };
15904                let mut relation = self.parse_table_factor()?;
15905
15906                if !self
15907                    .dialect
15908                    .supports_left_associative_joins_without_parens()
15909                    && self.peek_parens_less_nested_join()
15910                {
15911                    let joins = self.parse_joins()?;
15912                    relation = TableFactor::NestedJoin {
15913                        table_with_joins: Box::new(TableWithJoins { relation, joins }),
15914                        alias: None,
15915                    };
15916                }
15917
15918                let join_constraint = self.parse_join_constraint(natural)?;
15919                Join {
15920                    relation,
15921                    global,
15922                    join_operator: join_operator_type(join_constraint),
15923                }
15924            };
15925            joins.push(join);
15926        }
15927        Ok(joins)
15928    }
15929
15930    fn peek_parens_less_nested_join(&self) -> bool {
15931        matches!(
15932            self.peek_token_ref().token,
15933            Token::Word(Word {
15934                keyword: Keyword::JOIN
15935                    | Keyword::INNER
15936                    | Keyword::LEFT
15937                    | Keyword::RIGHT
15938                    | Keyword::FULL,
15939                ..
15940            })
15941        )
15942    }
15943
15944    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
15945    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
15946    pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
15947        let _guard = self.recursion_counter.try_decrease()?;
15948        if self.parse_keyword(Keyword::LATERAL) {
15949            // LATERAL must always be followed by a subquery or table function.
15950            if self.consume_token(&Token::LParen) {
15951                self.parse_derived_table_factor(Lateral)
15952            } else {
15953                let name = self.parse_object_name(false)?;
15954                self.expect_token(&Token::LParen)?;
15955                let args = self.parse_optional_args()?;
15956                let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
15957                let alias = self.maybe_parse_table_alias()?;
15958                Ok(TableFactor::Function {
15959                    lateral: true,
15960                    name,
15961                    args,
15962                    with_ordinality,
15963                    alias,
15964                })
15965            }
15966        } else if self.parse_keyword(Keyword::TABLE) {
15967            // parse table function (SELECT * FROM TABLE (<expr>) [ AS <alias> ])
15968            self.expect_token(&Token::LParen)?;
15969            let expr = self.parse_expr()?;
15970            self.expect_token(&Token::RParen)?;
15971            let alias = self.maybe_parse_table_alias()?;
15972            Ok(TableFactor::TableFunction { expr, alias })
15973        } else if self.consume_token(&Token::LParen) {
15974            // A left paren introduces either a derived table (i.e., a subquery)
15975            // or a nested join. It's nearly impossible to determine ahead of
15976            // time which it is... so we just try to parse both.
15977            //
15978            // Here's an example that demonstrates the complexity:
15979            //                     /-------------------------------------------------------\
15980            //                     | /-----------------------------------\                 |
15981            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
15982            //                   ^ ^ ^ ^
15983            //                   | | | |
15984            //                   | | | |
15985            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
15986            //                   | | (3) starts a derived table (subquery)
15987            //                   | (2) starts a nested join
15988            //                   (1) an additional set of parens around a nested join
15989            //
15990
15991            // If the recently consumed '(' starts a derived table, the call to
15992            // `parse_derived_table_factor` below will return success after parsing the
15993            // subquery, followed by the closing ')', and the alias of the derived table.
15994            // In the example above this is case (3).
15995            if let Some(mut table) =
15996                self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))?
15997            {
15998                while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
15999                {
16000                    table = match kw {
16001                        Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16002                        Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16003                        unexpected_keyword => return Err(ParserError::ParserError(
16004                            format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16005                        )),
16006                    }
16007                }
16008                return Ok(table);
16009            }
16010
16011            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
16012            // recently consumed does not start a derived table (cases 1, 2, or 4).
16013            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
16014
16015            // Inside the parentheses we expect to find an (A) table factor
16016            // followed by some joins or (B) another level of nesting.
16017            let mut table_and_joins = self.parse_table_and_joins()?;
16018
16019            #[allow(clippy::if_same_then_else)]
16020            if !table_and_joins.joins.is_empty() {
16021                self.expect_token(&Token::RParen)?;
16022                let alias = self.maybe_parse_table_alias()?;
16023                Ok(TableFactor::NestedJoin {
16024                    table_with_joins: Box::new(table_and_joins),
16025                    alias,
16026                }) // (A)
16027            } else if let TableFactor::NestedJoin {
16028                table_with_joins: _,
16029                alias: _,
16030            } = &table_and_joins.relation
16031            {
16032                // (B): `table_and_joins` (what we found inside the parentheses)
16033                // is a nested join `(foo JOIN bar)`, not followed by other joins.
16034                self.expect_token(&Token::RParen)?;
16035                let alias = self.maybe_parse_table_alias()?;
16036                Ok(TableFactor::NestedJoin {
16037                    table_with_joins: Box::new(table_and_joins),
16038                    alias,
16039                })
16040            } else if self.dialect.supports_parens_around_table_factor() {
16041                // Dialect-specific behavior: Snowflake diverges from the
16042                // standard and from most of the other implementations by
16043                // allowing extra parentheses not only around a join (B), but
16044                // around lone table names (e.g. `FROM (mytable [AS alias])`)
16045                // and around derived tables (e.g. `FROM ((SELECT ...)
16046                // [AS alias])`) as well.
16047                self.expect_token(&Token::RParen)?;
16048
16049                if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16050                    // Snowflake also allows specifying an alias *after* parens
16051                    // e.g. `FROM (mytable) AS alias`
16052                    match &mut table_and_joins.relation {
16053                        TableFactor::Derived { alias, .. }
16054                        | TableFactor::Table { alias, .. }
16055                        | TableFactor::Function { alias, .. }
16056                        | TableFactor::UNNEST { alias, .. }
16057                        | TableFactor::JsonTable { alias, .. }
16058                        | TableFactor::XmlTable { alias, .. }
16059                        | TableFactor::OpenJsonTable { alias, .. }
16060                        | TableFactor::TableFunction { alias, .. }
16061                        | TableFactor::Pivot { alias, .. }
16062                        | TableFactor::Unpivot { alias, .. }
16063                        | TableFactor::MatchRecognize { alias, .. }
16064                        | TableFactor::SemanticView { alias, .. }
16065                        | TableFactor::NestedJoin { alias, .. } => {
16066                            // but not `FROM (mytable AS alias1) AS alias2`.
16067                            if let Some(inner_alias) = alias {
16068                                return Err(ParserError::ParserError(format!(
16069                                    "duplicate alias {inner_alias}"
16070                                )));
16071                            }
16072                            // Act as if the alias was specified normally next
16073                            // to the table name: `(mytable) AS alias` ->
16074                            // `(mytable AS alias)`
16075                            alias.replace(outer_alias);
16076                        }
16077                    };
16078                }
16079                // Do not store the extra set of parens in the AST
16080                Ok(table_and_joins.relation)
16081            } else {
16082                // The SQL spec prohibits derived tables and bare tables from
16083                // appearing alone in parentheses (e.g. `FROM (mytable)`)
16084                self.expected_ref("joined table", self.peek_token_ref())
16085            }
16086        } else if self.dialect.supports_values_as_table_factor()
16087            && matches!(
16088                self.peek_tokens(),
16089                [
16090                    Token::Word(Word {
16091                        keyword: Keyword::VALUES,
16092                        ..
16093                    }),
16094                    Token::LParen
16095                ]
16096            )
16097        {
16098            self.expect_keyword_is(Keyword::VALUES)?;
16099
16100            // Snowflake and Databricks allow syntax like below:
16101            // SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
16102            // where there are no parentheses around the VALUES clause.
16103            let values = SetExpr::Values(self.parse_values(false, false)?);
16104            let alias = self.maybe_parse_table_alias()?;
16105            Ok(TableFactor::Derived {
16106                lateral: false,
16107                subquery: Box::new(Query {
16108                    with: None,
16109                    body: Box::new(values),
16110                    order_by: None,
16111                    limit_clause: None,
16112                    fetch: None,
16113                    locks: vec![],
16114                    for_clause: None,
16115                    settings: None,
16116                    format_clause: None,
16117                    pipe_operators: vec![],
16118                }),
16119                alias,
16120                sample: None,
16121            })
16122        } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16123            && self.parse_keyword(Keyword::UNNEST)
16124        {
16125            self.expect_token(&Token::LParen)?;
16126            let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16127            self.expect_token(&Token::RParen)?;
16128
16129            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16130            let alias = match self.maybe_parse_table_alias() {
16131                Ok(Some(alias)) => Some(alias),
16132                Ok(None) => None,
16133                Err(e) => return Err(e),
16134            };
16135
16136            let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16137                Ok(()) => true,
16138                Err(_) => false,
16139            };
16140
16141            let with_offset_alias = if with_offset {
16142                match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16143                    Ok(Some(alias)) => Some(alias),
16144                    Ok(None) => None,
16145                    Err(e) => return Err(e),
16146                }
16147            } else {
16148                None
16149            };
16150
16151            Ok(TableFactor::UNNEST {
16152                alias,
16153                array_exprs,
16154                with_offset,
16155                with_offset_alias,
16156                with_ordinality,
16157            })
16158        } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16159            let json_expr = self.parse_expr()?;
16160            self.expect_token(&Token::Comma)?;
16161            let json_path = self.parse_value()?;
16162            self.expect_keyword_is(Keyword::COLUMNS)?;
16163            self.expect_token(&Token::LParen)?;
16164            let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16165            self.expect_token(&Token::RParen)?;
16166            self.expect_token(&Token::RParen)?;
16167            let alias = self.maybe_parse_table_alias()?;
16168            Ok(TableFactor::JsonTable {
16169                json_expr,
16170                json_path,
16171                columns,
16172                alias,
16173            })
16174        } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16175            self.prev_token();
16176            self.parse_open_json_table_factor()
16177        } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16178            self.prev_token();
16179            self.parse_xml_table_factor()
16180        } else if self.dialect.supports_semantic_view_table_factor()
16181            && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16182        {
16183            self.parse_semantic_view_table_factor()
16184        } else if self.peek_token_ref().token == Token::AtSign {
16185            // Stage reference: @mystage or @namespace.stage (e.g. Snowflake)
16186            self.parse_snowflake_stage_table_factor()
16187        } else {
16188            let name = self.parse_object_name(true)?;
16189
16190            let json_path = match &self.peek_token_ref().token {
16191                Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16192                _ => None,
16193            };
16194
16195            let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16196                && self.parse_keyword(Keyword::PARTITION)
16197            {
16198                self.parse_parenthesized_identifiers()?
16199            } else {
16200                vec![]
16201            };
16202
16203            // Parse potential version qualifier
16204            let version = self.maybe_parse_table_version()?;
16205
16206            // Postgres, MSSQL, ClickHouse: table-valued functions:
16207            let args = if self.consume_token(&Token::LParen) {
16208                Some(self.parse_table_function_args()?)
16209            } else {
16210                None
16211            };
16212
16213            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16214
16215            let mut sample = None;
16216            if self.dialect.supports_table_sample_before_alias() {
16217                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16218                    sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16219                }
16220            }
16221
16222            let alias = self.maybe_parse_table_alias()?;
16223
16224            // MYSQL-specific table hints:
16225            let index_hints = if self.dialect.supports_table_hints() {
16226                self.maybe_parse(|p| p.parse_table_index_hints())?
16227                    .unwrap_or(vec![])
16228            } else {
16229                vec![]
16230            };
16231
16232            // MSSQL-specific table hints:
16233            let mut with_hints = vec![];
16234            if self.parse_keyword(Keyword::WITH) {
16235                if self.consume_token(&Token::LParen) {
16236                    with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16237                    self.expect_token(&Token::RParen)?;
16238                } else {
16239                    // rewind, as WITH may belong to the next statement's CTE
16240                    self.prev_token();
16241                }
16242            };
16243
16244            if !self.dialect.supports_table_sample_before_alias() {
16245                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16246                    sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16247                }
16248            }
16249
16250            let mut table = TableFactor::Table {
16251                name,
16252                alias,
16253                args,
16254                with_hints,
16255                version,
16256                partitions,
16257                with_ordinality,
16258                json_path,
16259                sample,
16260                index_hints,
16261            };
16262
16263            while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16264                table = match kw {
16265                    Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16266                    Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16267                    unexpected_keyword => return Err(ParserError::ParserError(
16268                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16269                    )),
16270                }
16271            }
16272
16273            if self.dialect.supports_match_recognize()
16274                && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16275            {
16276                table = self.parse_match_recognize(table)?;
16277            }
16278
16279            Ok(table)
16280        }
16281    }
16282
16283    /// Parse a Snowflake stage reference as a table factor.
16284    /// Handles syntax like: `@mystage1 (file_format => 'myformat', pattern => '...')`
16285    ///
16286    /// See: <https://docs.snowflake.com/en/user-guide/querying-stage>
16287    fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16288        // Parse the stage name starting with @
16289        let name = crate::dialect::parse_snowflake_stage_name(self)?;
16290
16291        // Parse optional stage options like (file_format => 'myformat', pattern => '...')
16292        let args = if self.consume_token(&Token::LParen) {
16293            Some(self.parse_table_function_args()?)
16294        } else {
16295            None
16296        };
16297
16298        let alias = self.maybe_parse_table_alias()?;
16299
16300        Ok(TableFactor::Table {
16301            name,
16302            alias,
16303            args,
16304            with_hints: vec![],
16305            version: None,
16306            partitions: vec![],
16307            with_ordinality: false,
16308            json_path: None,
16309            sample: None,
16310            index_hints: vec![],
16311        })
16312    }
16313
16314    fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16315        let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16316            TableSampleModifier::TableSample
16317        } else if self.parse_keyword(Keyword::SAMPLE) {
16318            TableSampleModifier::Sample
16319        } else {
16320            return Ok(None);
16321        };
16322        self.parse_table_sample(modifier).map(Some)
16323    }
16324
16325    fn parse_table_sample(
16326        &mut self,
16327        modifier: TableSampleModifier,
16328    ) -> Result<Box<TableSample>, ParserError> {
16329        let name = match self.parse_one_of_keywords(&[
16330            Keyword::BERNOULLI,
16331            Keyword::ROW,
16332            Keyword::SYSTEM,
16333            Keyword::BLOCK,
16334        ]) {
16335            Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16336            Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16337            Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16338            Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16339            _ => None,
16340        };
16341
16342        let parenthesized = self.consume_token(&Token::LParen);
16343
16344        let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16345            let selected_bucket = self.parse_number_value()?;
16346            self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16347            let total = self.parse_number_value()?;
16348            let on = if self.parse_keyword(Keyword::ON) {
16349                Some(self.parse_expr()?)
16350            } else {
16351                None
16352            };
16353            (
16354                None,
16355                Some(TableSampleBucket {
16356                    bucket: selected_bucket,
16357                    total,
16358                    on,
16359                }),
16360            )
16361        } else {
16362            let value = match self.maybe_parse(|p| p.parse_expr())? {
16363                Some(num) => num,
16364                None => {
16365                    let next_token = self.next_token();
16366                    if let Token::Word(w) = next_token.token {
16367                        Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16368                    } else {
16369                        return parser_err!(
16370                            "Expecting number or byte length e.g. 100M",
16371                            self.peek_token_ref().span.start
16372                        );
16373                    }
16374                }
16375            };
16376            let unit = if self.parse_keyword(Keyword::ROWS) {
16377                Some(TableSampleUnit::Rows)
16378            } else if self.parse_keyword(Keyword::PERCENT) {
16379                Some(TableSampleUnit::Percent)
16380            } else {
16381                None
16382            };
16383            (
16384                Some(TableSampleQuantity {
16385                    parenthesized,
16386                    value,
16387                    unit,
16388                }),
16389                None,
16390            )
16391        };
16392        if parenthesized {
16393            self.expect_token(&Token::RParen)?;
16394        }
16395
16396        let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16397            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16398        } else if self.parse_keyword(Keyword::SEED) {
16399            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16400        } else {
16401            None
16402        };
16403
16404        let offset = if self.parse_keyword(Keyword::OFFSET) {
16405            Some(self.parse_expr()?)
16406        } else {
16407            None
16408        };
16409
16410        Ok(Box::new(TableSample {
16411            modifier,
16412            name,
16413            quantity,
16414            seed,
16415            bucket,
16416            offset,
16417        }))
16418    }
16419
16420    fn parse_table_sample_seed(
16421        &mut self,
16422        modifier: TableSampleSeedModifier,
16423    ) -> Result<TableSampleSeed, ParserError> {
16424        self.expect_token(&Token::LParen)?;
16425        let value = self.parse_number_value()?;
16426        self.expect_token(&Token::RParen)?;
16427        Ok(TableSampleSeed { modifier, value })
16428    }
16429
16430    /// Parses `OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]` clause,
16431    /// assuming the `OPENJSON` keyword was already consumed.
16432    fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16433        self.expect_token(&Token::LParen)?;
16434        let json_expr = self.parse_expr()?;
16435        let json_path = if self.consume_token(&Token::Comma) {
16436            Some(self.parse_value()?)
16437        } else {
16438            None
16439        };
16440        self.expect_token(&Token::RParen)?;
16441        let columns = if self.parse_keyword(Keyword::WITH) {
16442            self.expect_token(&Token::LParen)?;
16443            let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16444            self.expect_token(&Token::RParen)?;
16445            columns
16446        } else {
16447            Vec::new()
16448        };
16449        let alias = self.maybe_parse_table_alias()?;
16450        Ok(TableFactor::OpenJsonTable {
16451            json_expr,
16452            json_path,
16453            columns,
16454            alias,
16455        })
16456    }
16457
16458    fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16459        self.expect_token(&Token::LParen)?;
16460        let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
16461            self.expect_token(&Token::LParen)?;
16462            let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
16463            self.expect_token(&Token::RParen)?;
16464            self.expect_token(&Token::Comma)?;
16465            namespaces
16466        } else {
16467            vec![]
16468        };
16469        let row_expression = self.parse_expr()?;
16470        let passing = self.parse_xml_passing_clause()?;
16471        self.expect_keyword_is(Keyword::COLUMNS)?;
16472        let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
16473        self.expect_token(&Token::RParen)?;
16474        let alias = self.maybe_parse_table_alias()?;
16475        Ok(TableFactor::XmlTable {
16476            namespaces,
16477            row_expression,
16478            passing,
16479            columns,
16480            alias,
16481        })
16482    }
16483
16484    fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
16485        let uri = self.parse_expr()?;
16486        self.expect_keyword_is(Keyword::AS)?;
16487        let name = self.parse_identifier()?;
16488        Ok(XmlNamespaceDefinition { uri, name })
16489    }
16490
16491    fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
16492        let name = self.parse_identifier()?;
16493
16494        let option = if self.parse_keyword(Keyword::FOR) {
16495            self.expect_keyword(Keyword::ORDINALITY)?;
16496            XmlTableColumnOption::ForOrdinality
16497        } else {
16498            let r#type = self.parse_data_type()?;
16499            let mut path = None;
16500            let mut default = None;
16501
16502            if self.parse_keyword(Keyword::PATH) {
16503                path = Some(self.parse_expr()?);
16504            }
16505
16506            if self.parse_keyword(Keyword::DEFAULT) {
16507                default = Some(self.parse_expr()?);
16508            }
16509
16510            let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
16511            if !not_null {
16512                // NULL is the default but can be specified explicitly
16513                let _ = self.parse_keyword(Keyword::NULL);
16514            }
16515
16516            XmlTableColumnOption::NamedInfo {
16517                r#type,
16518                path,
16519                default,
16520                nullable: !not_null,
16521            }
16522        };
16523        Ok(XmlTableColumn { name, option })
16524    }
16525
16526    fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
16527        let mut arguments = vec![];
16528        if self.parse_keyword(Keyword::PASSING) {
16529            loop {
16530                let by_value =
16531                    self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
16532                let expr = self.parse_expr()?;
16533                let alias = if self.parse_keyword(Keyword::AS) {
16534                    Some(self.parse_identifier()?)
16535                } else {
16536                    None
16537                };
16538                arguments.push(XmlPassingArgument {
16539                    expr,
16540                    alias,
16541                    by_value,
16542                });
16543                if !self.consume_token(&Token::Comma) {
16544                    break;
16545                }
16546            }
16547        }
16548        Ok(XmlPassingClause { arguments })
16549    }
16550
16551    /// Parse a [TableFactor::SemanticView]
16552    fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16553        self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
16554        self.expect_token(&Token::LParen)?;
16555
16556        let name = self.parse_object_name(true)?;
16557
16558        // Parse DIMENSIONS, METRICS, FACTS and WHERE clauses in flexible order
16559        let mut dimensions = Vec::new();
16560        let mut metrics = Vec::new();
16561        let mut facts = Vec::new();
16562        let mut where_clause = None;
16563
16564        while self.peek_token_ref().token != Token::RParen {
16565            if self.parse_keyword(Keyword::DIMENSIONS) {
16566                if !dimensions.is_empty() {
16567                    return Err(ParserError::ParserError(
16568                        "DIMENSIONS clause can only be specified once".to_string(),
16569                    ));
16570                }
16571                dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16572            } else if self.parse_keyword(Keyword::METRICS) {
16573                if !metrics.is_empty() {
16574                    return Err(ParserError::ParserError(
16575                        "METRICS clause can only be specified once".to_string(),
16576                    ));
16577                }
16578                metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16579            } else if self.parse_keyword(Keyword::FACTS) {
16580                if !facts.is_empty() {
16581                    return Err(ParserError::ParserError(
16582                        "FACTS clause can only be specified once".to_string(),
16583                    ));
16584                }
16585                facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16586            } else if self.parse_keyword(Keyword::WHERE) {
16587                if where_clause.is_some() {
16588                    return Err(ParserError::ParserError(
16589                        "WHERE clause can only be specified once".to_string(),
16590                    ));
16591                }
16592                where_clause = Some(self.parse_expr()?);
16593            } else {
16594                let tok = self.peek_token_ref();
16595                return parser_err!(
16596                    format!(
16597                        "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
16598                        tok.token
16599                    ),
16600                    tok.span.start
16601                )?;
16602            }
16603        }
16604
16605        self.expect_token(&Token::RParen)?;
16606
16607        let alias = self.maybe_parse_table_alias()?;
16608
16609        Ok(TableFactor::SemanticView {
16610            name,
16611            dimensions,
16612            metrics,
16613            facts,
16614            where_clause,
16615            alias,
16616        })
16617    }
16618
16619    fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
16620        self.expect_token(&Token::LParen)?;
16621
16622        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
16623            self.parse_comma_separated(Parser::parse_expr)?
16624        } else {
16625            vec![]
16626        };
16627
16628        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
16629            self.parse_comma_separated(Parser::parse_order_by_expr)?
16630        } else {
16631            vec![]
16632        };
16633
16634        let measures = if self.parse_keyword(Keyword::MEASURES) {
16635            self.parse_comma_separated(|p| {
16636                let expr = p.parse_expr()?;
16637                let _ = p.parse_keyword(Keyword::AS);
16638                let alias = p.parse_identifier()?;
16639                Ok(Measure { expr, alias })
16640            })?
16641        } else {
16642            vec![]
16643        };
16644
16645        let rows_per_match =
16646            if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
16647                Some(RowsPerMatch::OneRow)
16648            } else if self.parse_keywords(&[
16649                Keyword::ALL,
16650                Keyword::ROWS,
16651                Keyword::PER,
16652                Keyword::MATCH,
16653            ]) {
16654                Some(RowsPerMatch::AllRows(
16655                    if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
16656                        Some(EmptyMatchesMode::Show)
16657                    } else if self.parse_keywords(&[
16658                        Keyword::OMIT,
16659                        Keyword::EMPTY,
16660                        Keyword::MATCHES,
16661                    ]) {
16662                        Some(EmptyMatchesMode::Omit)
16663                    } else if self.parse_keywords(&[
16664                        Keyword::WITH,
16665                        Keyword::UNMATCHED,
16666                        Keyword::ROWS,
16667                    ]) {
16668                        Some(EmptyMatchesMode::WithUnmatched)
16669                    } else {
16670                        None
16671                    },
16672                ))
16673            } else {
16674                None
16675            };
16676
16677        let after_match_skip =
16678            if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
16679                if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
16680                    Some(AfterMatchSkip::PastLastRow)
16681                } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
16682                    Some(AfterMatchSkip::ToNextRow)
16683                } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
16684                    Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
16685                } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
16686                    Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
16687                } else {
16688                    let found = self.next_token();
16689                    return self.expected("after match skip option", found);
16690                }
16691            } else {
16692                None
16693            };
16694
16695        self.expect_keyword_is(Keyword::PATTERN)?;
16696        let pattern = self.parse_parenthesized(Self::parse_pattern)?;
16697
16698        self.expect_keyword_is(Keyword::DEFINE)?;
16699
16700        let symbols = self.parse_comma_separated(|p| {
16701            let symbol = p.parse_identifier()?;
16702            p.expect_keyword_is(Keyword::AS)?;
16703            let definition = p.parse_expr()?;
16704            Ok(SymbolDefinition { symbol, definition })
16705        })?;
16706
16707        self.expect_token(&Token::RParen)?;
16708
16709        let alias = self.maybe_parse_table_alias()?;
16710
16711        Ok(TableFactor::MatchRecognize {
16712            table: Box::new(table),
16713            partition_by,
16714            order_by,
16715            measures,
16716            rows_per_match,
16717            after_match_skip,
16718            pattern,
16719            symbols,
16720            alias,
16721        })
16722    }
16723
16724    fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16725        match self.next_token().token {
16726            Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
16727            Token::Placeholder(s) if s == "$" => {
16728                Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
16729            }
16730            Token::LBrace => {
16731                self.expect_token(&Token::Minus)?;
16732                let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
16733                self.expect_token(&Token::Minus)?;
16734                self.expect_token(&Token::RBrace)?;
16735                Ok(MatchRecognizePattern::Exclude(symbol))
16736            }
16737            Token::Word(Word {
16738                value,
16739                quote_style: None,
16740                ..
16741            }) if value == "PERMUTE" => {
16742                self.expect_token(&Token::LParen)?;
16743                let symbols = self.parse_comma_separated(|p| {
16744                    p.parse_identifier().map(MatchRecognizeSymbol::Named)
16745                })?;
16746                self.expect_token(&Token::RParen)?;
16747                Ok(MatchRecognizePattern::Permute(symbols))
16748            }
16749            Token::LParen => {
16750                let pattern = self.parse_pattern()?;
16751                self.expect_token(&Token::RParen)?;
16752                Ok(MatchRecognizePattern::Group(Box::new(pattern)))
16753            }
16754            _ => {
16755                self.prev_token();
16756                self.parse_identifier()
16757                    .map(MatchRecognizeSymbol::Named)
16758                    .map(MatchRecognizePattern::Symbol)
16759            }
16760        }
16761    }
16762
16763    fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16764        let mut pattern = self.parse_base_pattern()?;
16765        loop {
16766            let token = self.next_token();
16767            let quantifier = match token.token {
16768                Token::Mul => RepetitionQuantifier::ZeroOrMore,
16769                Token::Plus => RepetitionQuantifier::OneOrMore,
16770                Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
16771                Token::LBrace => {
16772                    // quantifier is a range like {n} or {n,} or {,m} or {n,m}
16773                    let token = self.next_token();
16774                    match token.token {
16775                        Token::Comma => {
16776                            let next_token = self.next_token();
16777                            let Token::Number(n, _) = next_token.token else {
16778                                return self.expected("literal number", next_token);
16779                            };
16780                            self.expect_token(&Token::RBrace)?;
16781                            RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
16782                        }
16783                        Token::Number(n, _) if self.consume_token(&Token::Comma) => {
16784                            let next_token = self.next_token();
16785                            match next_token.token {
16786                                Token::Number(m, _) => {
16787                                    self.expect_token(&Token::RBrace)?;
16788                                    RepetitionQuantifier::Range(
16789                                        Self::parse(n, token.span.start)?,
16790                                        Self::parse(m, token.span.start)?,
16791                                    )
16792                                }
16793                                Token::RBrace => {
16794                                    RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
16795                                }
16796                                _ => {
16797                                    return self.expected("} or upper bound", next_token);
16798                                }
16799                            }
16800                        }
16801                        Token::Number(n, _) => {
16802                            self.expect_token(&Token::RBrace)?;
16803                            RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
16804                        }
16805                        _ => return self.expected("quantifier range", token),
16806                    }
16807                }
16808                _ => {
16809                    self.prev_token();
16810                    break;
16811                }
16812            };
16813            pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
16814        }
16815        Ok(pattern)
16816    }
16817
16818    fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16819        let mut patterns = vec![self.parse_repetition_pattern()?];
16820        while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
16821            patterns.push(self.parse_repetition_pattern()?);
16822        }
16823        match <[MatchRecognizePattern; 1]>::try_from(patterns) {
16824            Ok([pattern]) => Ok(pattern),
16825            Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
16826        }
16827    }
16828
16829    fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16830        let pattern = self.parse_concat_pattern()?;
16831        if self.consume_token(&Token::Pipe) {
16832            match self.parse_pattern()? {
16833                // flatten nested alternations
16834                MatchRecognizePattern::Alternation(mut patterns) => {
16835                    patterns.insert(0, pattern);
16836                    Ok(MatchRecognizePattern::Alternation(patterns))
16837                }
16838                next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
16839            }
16840        } else {
16841            Ok(pattern)
16842        }
16843    }
16844
16845    /// Parses a the timestamp version specifier (i.e. query historical data)
16846    pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
16847        if self.dialect.supports_table_versioning() {
16848            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
16849            {
16850                let expr = self.parse_expr()?;
16851                return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
16852            } else if self.peek_keyword(Keyword::CHANGES) {
16853                return self.parse_table_version_changes().map(Some);
16854            } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
16855                let func_name = self.parse_object_name(true)?;
16856                let func = self.parse_function(func_name)?;
16857                return Ok(Some(TableVersion::Function(func)));
16858            } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
16859                let expr = self.parse_expr()?;
16860                return Ok(Some(TableVersion::TimestampAsOf(expr)));
16861            } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
16862                let expr = Expr::Value(self.parse_number_value()?);
16863                return Ok(Some(TableVersion::VersionAsOf(expr)));
16864            }
16865        }
16866        Ok(None)
16867    }
16868
16869    /// Parses the Snowflake `CHANGES` clause for change tracking queries.
16870    ///
16871    /// Syntax:
16872    /// ```sql
16873    /// CHANGES (INFORMATION => DEFAULT)
16874    ///   AT (TIMESTAMP => <expr>)
16875    ///   [END (TIMESTAMP => <expr>)]
16876    /// ```
16877    ///
16878    /// <https://docs.snowflake.com/en/sql-reference/constructs/changes>
16879    fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
16880        let changes_name = self.parse_object_name(true)?;
16881        let changes = self.parse_function(changes_name)?;
16882        let at_name = self.parse_object_name(true)?;
16883        let at = self.parse_function(at_name)?;
16884        let end = if self.peek_keyword(Keyword::END) {
16885            let end_name = self.parse_object_name(true)?;
16886            Some(self.parse_function(end_name)?)
16887        } else {
16888            None
16889        };
16890        Ok(TableVersion::Changes { changes, at, end })
16891    }
16892
16893    /// Parses MySQL's JSON_TABLE column definition.
16894    /// For example: `id INT EXISTS PATH '$' DEFAULT '0' ON EMPTY ERROR ON ERROR`
16895    pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
16896        if self.parse_keyword(Keyword::NESTED) {
16897            let _has_path_keyword = self.parse_keyword(Keyword::PATH);
16898            let path = self.parse_value()?;
16899            self.expect_keyword_is(Keyword::COLUMNS)?;
16900            let columns = self.parse_parenthesized(|p| {
16901                p.parse_comma_separated(Self::parse_json_table_column_def)
16902            })?;
16903            return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
16904                path,
16905                columns,
16906            }));
16907        }
16908        let name = self.parse_identifier()?;
16909        if self.parse_keyword(Keyword::FOR) {
16910            self.expect_keyword_is(Keyword::ORDINALITY)?;
16911            return Ok(JsonTableColumn::ForOrdinality(name));
16912        }
16913        let r#type = self.parse_data_type()?;
16914        let exists = self.parse_keyword(Keyword::EXISTS);
16915        self.expect_keyword_is(Keyword::PATH)?;
16916        let path = self.parse_value()?;
16917        let mut on_empty = None;
16918        let mut on_error = None;
16919        while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
16920            if self.parse_keyword(Keyword::EMPTY) {
16921                on_empty = Some(error_handling);
16922            } else {
16923                self.expect_keyword_is(Keyword::ERROR)?;
16924                on_error = Some(error_handling);
16925            }
16926        }
16927        Ok(JsonTableColumn::Named(JsonTableNamedColumn {
16928            name,
16929            r#type,
16930            path,
16931            exists,
16932            on_empty,
16933            on_error,
16934        }))
16935    }
16936
16937    /// Parses MSSQL's `OPENJSON WITH` column definition.
16938    ///
16939    /// ```sql
16940    /// colName type [ column_path ] [ AS JSON ]
16941    /// ```
16942    ///
16943    /// Reference: <https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver16#syntax>
16944    pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
16945        let name = self.parse_identifier()?;
16946        let r#type = self.parse_data_type()?;
16947        let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
16948            self.next_token();
16949            Some(path)
16950        } else {
16951            None
16952        };
16953        let as_json = self.parse_keyword(Keyword::AS);
16954        if as_json {
16955            self.expect_keyword_is(Keyword::JSON)?;
16956        }
16957        Ok(OpenJsonTableColumn {
16958            name,
16959            r#type,
16960            path,
16961            as_json,
16962        })
16963    }
16964
16965    fn parse_json_table_column_error_handling(
16966        &mut self,
16967    ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
16968        let res = if self.parse_keyword(Keyword::NULL) {
16969            JsonTableColumnErrorHandling::Null
16970        } else if self.parse_keyword(Keyword::ERROR) {
16971            JsonTableColumnErrorHandling::Error
16972        } else if self.parse_keyword(Keyword::DEFAULT) {
16973            JsonTableColumnErrorHandling::Default(self.parse_value()?)
16974        } else {
16975            return Ok(None);
16976        };
16977        self.expect_keyword_is(Keyword::ON)?;
16978        Ok(Some(res))
16979    }
16980
16981    /// Parse a derived table factor (a parenthesized subquery), handling optional LATERAL.
16982    pub fn parse_derived_table_factor(
16983        &mut self,
16984        lateral: IsLateral,
16985    ) -> Result<TableFactor, ParserError> {
16986        let subquery = self.parse_query()?;
16987        self.expect_token(&Token::RParen)?;
16988        let alias = self.maybe_parse_table_alias()?;
16989
16990        // Parse optional SAMPLE clause after alias
16991        let sample = self
16992            .maybe_parse_table_sample()?
16993            .map(TableSampleKind::AfterTableAlias);
16994
16995        Ok(TableFactor::Derived {
16996            lateral: match lateral {
16997                Lateral => true,
16998                NotLateral => false,
16999            },
17000            subquery,
17001            alias,
17002            sample,
17003        })
17004    }
17005
17006    /// Parses an expression with an optional alias
17007    ///
17008    /// Examples:
17009    ///
17010    /// ```sql
17011    /// SUM(price) AS total_price
17012    /// ```
17013    /// ```sql
17014    /// SUM(price)
17015    /// ```
17016    ///
17017    /// Example
17018    /// ```
17019    /// # use sqlparser::parser::{Parser, ParserError};
17020    /// # use sqlparser::dialect::GenericDialect;
17021    /// # fn main() ->Result<(), ParserError> {
17022    /// let sql = r#"SUM("a") as "b""#;
17023    /// let mut parser = Parser::new(&GenericDialect).try_with_sql(sql)?;
17024    /// let expr_with_alias = parser.parse_expr_with_alias()?;
17025    /// assert_eq!(Some("b".to_string()), expr_with_alias.alias.map(|x|x.value));
17026    /// # Ok(())
17027    /// # }
17028    pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17029        let expr = self.parse_expr()?;
17030        let alias = if self.parse_keyword(Keyword::AS) {
17031            Some(self.parse_identifier()?)
17032        } else {
17033            None
17034        };
17035
17036        Ok(ExprWithAlias { expr, alias })
17037    }
17038
17039    /// Parse an expression followed by an optional alias; Unlike
17040    /// [Self::parse_expr_with_alias] the "AS" keyword between the expression
17041    /// and the alias is optional.
17042    fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17043        let expr = self.parse_expr()?;
17044        let alias = self.parse_identifier_optional_alias()?;
17045        Ok(ExprWithAlias { expr, alias })
17046    }
17047
17048    /// Parses a plain function call with an optional alias for the `PIVOT` clause
17049    fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17050        let function_name = match self.next_token().token {
17051            Token::Word(w) => Ok(w.value),
17052            _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17053        }?;
17054        let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17055        let alias = {
17056            fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17057                // ~ for a PIVOT aggregate function the alias must not be a "FOR"; in any dialect
17058                kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17059            }
17060            self.parse_optional_alias_inner(None, validator)?
17061        };
17062        Ok(ExprWithAlias { expr, alias })
17063    }
17064
17065    /// Parse a PIVOT table factor (ClickHouse/Oracle style pivot), returning a TableFactor.
17066    pub fn parse_pivot_table_factor(
17067        &mut self,
17068        table: TableFactor,
17069    ) -> Result<TableFactor, ParserError> {
17070        self.expect_token(&Token::LParen)?;
17071        let aggregate_functions =
17072            self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17073        self.expect_keyword_is(Keyword::FOR)?;
17074        let value_column = if self.peek_token_ref().token == Token::LParen {
17075            self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17076                p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17077            })?
17078        } else {
17079            vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17080        };
17081        self.expect_keyword_is(Keyword::IN)?;
17082
17083        self.expect_token(&Token::LParen)?;
17084        let value_source = if self.parse_keyword(Keyword::ANY) {
17085            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17086                self.parse_comma_separated(Parser::parse_order_by_expr)?
17087            } else {
17088                vec![]
17089            };
17090            PivotValueSource::Any(order_by)
17091        } else if self.peek_sub_query() {
17092            PivotValueSource::Subquery(self.parse_query()?)
17093        } else {
17094            PivotValueSource::List(
17095                self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17096            )
17097        };
17098        self.expect_token(&Token::RParen)?;
17099
17100        let default_on_null =
17101            if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17102                self.expect_token(&Token::LParen)?;
17103                let expr = self.parse_expr()?;
17104                self.expect_token(&Token::RParen)?;
17105                Some(expr)
17106            } else {
17107                None
17108            };
17109
17110        self.expect_token(&Token::RParen)?;
17111        let alias = self.maybe_parse_table_alias()?;
17112        Ok(TableFactor::Pivot {
17113            table: Box::new(table),
17114            aggregate_functions,
17115            value_column,
17116            value_source,
17117            default_on_null,
17118            alias,
17119        })
17120    }
17121
17122    /// Parse an UNPIVOT table factor, returning a TableFactor.
17123    pub fn parse_unpivot_table_factor(
17124        &mut self,
17125        table: TableFactor,
17126    ) -> Result<TableFactor, ParserError> {
17127        let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17128            self.expect_keyword_is(Keyword::NULLS)?;
17129            Some(NullInclusion::IncludeNulls)
17130        } else if self.parse_keyword(Keyword::EXCLUDE) {
17131            self.expect_keyword_is(Keyword::NULLS)?;
17132            Some(NullInclusion::ExcludeNulls)
17133        } else {
17134            None
17135        };
17136        self.expect_token(&Token::LParen)?;
17137        let value = self.parse_expr()?;
17138        self.expect_keyword_is(Keyword::FOR)?;
17139        let name = self.parse_identifier()?;
17140        self.expect_keyword_is(Keyword::IN)?;
17141        let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17142            p.parse_expr_with_alias()
17143        })?;
17144        self.expect_token(&Token::RParen)?;
17145        let alias = self.maybe_parse_table_alias()?;
17146        Ok(TableFactor::Unpivot {
17147            table: Box::new(table),
17148            value,
17149            null_inclusion,
17150            name,
17151            columns,
17152            alias,
17153        })
17154    }
17155
17156    /// Parse a JOIN constraint (`NATURAL`, `ON <expr>`, `USING (...)`, or no constraint).
17157    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17158        if natural {
17159            Ok(JoinConstraint::Natural)
17160        } else if self.parse_keyword(Keyword::ON) {
17161            let constraint = self.parse_expr()?;
17162            Ok(JoinConstraint::On(constraint))
17163        } else if self.parse_keyword(Keyword::USING) {
17164            let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17165            Ok(JoinConstraint::Using(columns))
17166        } else {
17167            Ok(JoinConstraint::None)
17168            //self.expected_ref("ON, or USING after JOIN", self.peek_token_ref())
17169        }
17170    }
17171
17172    /// Parse a GRANT statement.
17173    pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17174        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17175
17176        self.expect_keyword_is(Keyword::TO)?;
17177        let grantees = self.parse_grantees()?;
17178
17179        let with_grant_option =
17180            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17181
17182        let current_grants =
17183            if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17184                Some(CurrentGrantsKind::CopyCurrentGrants)
17185            } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17186                Some(CurrentGrantsKind::RevokeCurrentGrants)
17187            } else {
17188                None
17189            };
17190
17191        let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17192            Some(self.parse_identifier()?)
17193        } else {
17194            None
17195        };
17196
17197        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17198            Some(self.parse_identifier()?)
17199        } else {
17200            None
17201        };
17202
17203        Ok(Grant {
17204            privileges,
17205            objects,
17206            grantees,
17207            with_grant_option,
17208            as_grantor,
17209            granted_by,
17210            current_grants,
17211        })
17212    }
17213
17214    fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17215        let mut values = vec![];
17216        let mut grantee_type = GranteesType::None;
17217        loop {
17218            let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17219                GranteesType::Role
17220            } else if self.parse_keyword(Keyword::USER) {
17221                GranteesType::User
17222            } else if self.parse_keyword(Keyword::SHARE) {
17223                GranteesType::Share
17224            } else if self.parse_keyword(Keyword::GROUP) {
17225                GranteesType::Group
17226            } else if self.parse_keyword(Keyword::PUBLIC) {
17227                GranteesType::Public
17228            } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17229                GranteesType::DatabaseRole
17230            } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17231                GranteesType::ApplicationRole
17232            } else if self.parse_keyword(Keyword::APPLICATION) {
17233                GranteesType::Application
17234            } else {
17235                grantee_type.clone() // keep from previous iteraton, if not specified
17236            };
17237
17238            if self
17239                .dialect
17240                .get_reserved_grantees_types()
17241                .contains(&new_grantee_type)
17242            {
17243                self.prev_token();
17244            } else {
17245                grantee_type = new_grantee_type;
17246            }
17247
17248            let grantee = if grantee_type == GranteesType::Public {
17249                Grantee {
17250                    grantee_type: grantee_type.clone(),
17251                    name: None,
17252                }
17253            } else {
17254                let mut name = self.parse_grantee_name()?;
17255                if self.consume_token(&Token::Colon) {
17256                    // Redshift supports namespace prefix for external users and groups:
17257                    // <Namespace>:<GroupName> or <Namespace>:<UserName>
17258                    // https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html
17259                    let ident = self.parse_identifier()?;
17260                    if let GranteeName::ObjectName(namespace) = name {
17261                        name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17262                            format!("{namespace}:{ident}"),
17263                        )]));
17264                    };
17265                }
17266                Grantee {
17267                    grantee_type: grantee_type.clone(),
17268                    name: Some(name),
17269                }
17270            };
17271
17272            values.push(grantee);
17273
17274            if !self.consume_token(&Token::Comma) {
17275                break;
17276            }
17277        }
17278
17279        Ok(values)
17280    }
17281
17282    /// Parse privileges and optional target objects for GRANT/DENY/REVOKE statements.
17283    pub fn parse_grant_deny_revoke_privileges_objects(
17284        &mut self,
17285    ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17286        let privileges = if self.parse_keyword(Keyword::ALL) {
17287            Privileges::All {
17288                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17289            }
17290        } else {
17291            let actions = self.parse_actions_list()?;
17292            Privileges::Actions(actions)
17293        };
17294
17295        let objects = if self.parse_keyword(Keyword::ON) {
17296            if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17297                Some(GrantObjects::AllTablesInSchema {
17298                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17299                })
17300            } else if self.parse_keywords(&[
17301                Keyword::ALL,
17302                Keyword::EXTERNAL,
17303                Keyword::TABLES,
17304                Keyword::IN,
17305                Keyword::SCHEMA,
17306            ]) {
17307                Some(GrantObjects::AllExternalTablesInSchema {
17308                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17309                })
17310            } else if self.parse_keywords(&[
17311                Keyword::ALL,
17312                Keyword::VIEWS,
17313                Keyword::IN,
17314                Keyword::SCHEMA,
17315            ]) {
17316                Some(GrantObjects::AllViewsInSchema {
17317                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17318                })
17319            } else if self.parse_keywords(&[
17320                Keyword::ALL,
17321                Keyword::MATERIALIZED,
17322                Keyword::VIEWS,
17323                Keyword::IN,
17324                Keyword::SCHEMA,
17325            ]) {
17326                Some(GrantObjects::AllMaterializedViewsInSchema {
17327                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17328                })
17329            } else if self.parse_keywords(&[
17330                Keyword::ALL,
17331                Keyword::FUNCTIONS,
17332                Keyword::IN,
17333                Keyword::SCHEMA,
17334            ]) {
17335                Some(GrantObjects::AllFunctionsInSchema {
17336                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17337                })
17338            } else if self.parse_keywords(&[
17339                Keyword::FUTURE,
17340                Keyword::SCHEMAS,
17341                Keyword::IN,
17342                Keyword::DATABASE,
17343            ]) {
17344                Some(GrantObjects::FutureSchemasInDatabase {
17345                    databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17346                })
17347            } else if self.parse_keywords(&[
17348                Keyword::FUTURE,
17349                Keyword::TABLES,
17350                Keyword::IN,
17351                Keyword::SCHEMA,
17352            ]) {
17353                Some(GrantObjects::FutureTablesInSchema {
17354                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17355                })
17356            } else if self.parse_keywords(&[
17357                Keyword::FUTURE,
17358                Keyword::EXTERNAL,
17359                Keyword::TABLES,
17360                Keyword::IN,
17361                Keyword::SCHEMA,
17362            ]) {
17363                Some(GrantObjects::FutureExternalTablesInSchema {
17364                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17365                })
17366            } else if self.parse_keywords(&[
17367                Keyword::FUTURE,
17368                Keyword::VIEWS,
17369                Keyword::IN,
17370                Keyword::SCHEMA,
17371            ]) {
17372                Some(GrantObjects::FutureViewsInSchema {
17373                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17374                })
17375            } else if self.parse_keywords(&[
17376                Keyword::FUTURE,
17377                Keyword::MATERIALIZED,
17378                Keyword::VIEWS,
17379                Keyword::IN,
17380                Keyword::SCHEMA,
17381            ]) {
17382                Some(GrantObjects::FutureMaterializedViewsInSchema {
17383                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17384                })
17385            } else if self.parse_keywords(&[
17386                Keyword::ALL,
17387                Keyword::SEQUENCES,
17388                Keyword::IN,
17389                Keyword::SCHEMA,
17390            ]) {
17391                Some(GrantObjects::AllSequencesInSchema {
17392                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17393                })
17394            } else if self.parse_keywords(&[
17395                Keyword::FUTURE,
17396                Keyword::SEQUENCES,
17397                Keyword::IN,
17398                Keyword::SCHEMA,
17399            ]) {
17400                Some(GrantObjects::FutureSequencesInSchema {
17401                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17402                })
17403            } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17404                Some(GrantObjects::ResourceMonitors(
17405                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17406                ))
17407            } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17408                Some(GrantObjects::ComputePools(
17409                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17410                ))
17411            } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17412                Some(GrantObjects::FailoverGroup(
17413                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17414                ))
17415            } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17416                Some(GrantObjects::ReplicationGroup(
17417                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17418                ))
17419            } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17420                Some(GrantObjects::ExternalVolumes(
17421                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17422                ))
17423            } else {
17424                let object_type = self.parse_one_of_keywords(&[
17425                    Keyword::SEQUENCE,
17426                    Keyword::DATABASE,
17427                    Keyword::SCHEMA,
17428                    Keyword::TABLE,
17429                    Keyword::VIEW,
17430                    Keyword::WAREHOUSE,
17431                    Keyword::INTEGRATION,
17432                    Keyword::VIEW,
17433                    Keyword::WAREHOUSE,
17434                    Keyword::INTEGRATION,
17435                    Keyword::USER,
17436                    Keyword::CONNECTION,
17437                    Keyword::PROCEDURE,
17438                    Keyword::FUNCTION,
17439                ]);
17440                let objects =
17441                    self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
17442                match object_type {
17443                    Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
17444                    Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
17445                    Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
17446                    Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
17447                    Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
17448                    Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
17449                    Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
17450                    Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
17451                    kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
17452                        if let Some(name) = objects?.first() {
17453                            self.parse_grant_procedure_or_function(name, &kw)?
17454                        } else {
17455                            self.expected_ref("procedure or function name", self.peek_token_ref())?
17456                        }
17457                    }
17458                    Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
17459                    Some(unexpected_keyword) => return Err(ParserError::ParserError(
17460                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
17461                    )),
17462                }
17463            }
17464        } else {
17465            None
17466        };
17467
17468        Ok((privileges, objects))
17469    }
17470
17471    fn parse_grant_procedure_or_function(
17472        &mut self,
17473        name: &ObjectName,
17474        kw: &Option<Keyword>,
17475    ) -> Result<Option<GrantObjects>, ParserError> {
17476        let arg_types = if self.consume_token(&Token::LParen) {
17477            let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
17478            self.expect_token(&Token::RParen)?;
17479            list
17480        } else {
17481            vec![]
17482        };
17483        match kw {
17484            Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
17485                name: name.clone(),
17486                arg_types,
17487            })),
17488            Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
17489                name: name.clone(),
17490                arg_types,
17491            })),
17492            _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
17493        }
17494    }
17495
17496    /// Parse a single grantable permission/action (used within GRANT statements).
17497    pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
17498        fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
17499            let columns = parser.parse_parenthesized_column_list(Optional, false)?;
17500            if columns.is_empty() {
17501                Ok(None)
17502            } else {
17503                Ok(Some(columns))
17504            }
17505        }
17506
17507        // Multi-word privileges
17508        if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
17509            Ok(Action::ImportedPrivileges)
17510        } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
17511            Ok(Action::AddSearchOptimization)
17512        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
17513            Ok(Action::AttachListing)
17514        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
17515            Ok(Action::AttachPolicy)
17516        } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
17517            Ok(Action::BindServiceEndpoint)
17518        } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17519            let role = self.parse_object_name(false)?;
17520            Ok(Action::DatabaseRole { role })
17521        } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
17522            Ok(Action::EvolveSchema)
17523        } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
17524            Ok(Action::ImportShare)
17525        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
17526            Ok(Action::ManageVersions)
17527        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
17528            Ok(Action::ManageReleases)
17529        } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
17530            Ok(Action::OverrideShareRestrictions)
17531        } else if self.parse_keywords(&[
17532            Keyword::PURCHASE,
17533            Keyword::DATA,
17534            Keyword::EXCHANGE,
17535            Keyword::LISTING,
17536        ]) {
17537            Ok(Action::PurchaseDataExchangeListing)
17538        } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
17539            Ok(Action::ResolveAll)
17540        } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
17541            Ok(Action::ReadSession)
17542
17543        // Single-word privileges
17544        } else if self.parse_keyword(Keyword::APPLY) {
17545            let apply_type = self.parse_action_apply_type()?;
17546            Ok(Action::Apply { apply_type })
17547        } else if self.parse_keyword(Keyword::APPLYBUDGET) {
17548            Ok(Action::ApplyBudget)
17549        } else if self.parse_keyword(Keyword::AUDIT) {
17550            Ok(Action::Audit)
17551        } else if self.parse_keyword(Keyword::CONNECT) {
17552            Ok(Action::Connect)
17553        } else if self.parse_keyword(Keyword::CREATE) {
17554            let obj_type = self.maybe_parse_action_create_object_type();
17555            Ok(Action::Create { obj_type })
17556        } else if self.parse_keyword(Keyword::DELETE) {
17557            Ok(Action::Delete)
17558        } else if self.parse_keyword(Keyword::EXEC) {
17559            let obj_type = self.maybe_parse_action_execute_obj_type();
17560            Ok(Action::Exec { obj_type })
17561        } else if self.parse_keyword(Keyword::EXECUTE) {
17562            let obj_type = self.maybe_parse_action_execute_obj_type();
17563            Ok(Action::Execute { obj_type })
17564        } else if self.parse_keyword(Keyword::FAILOVER) {
17565            Ok(Action::Failover)
17566        } else if self.parse_keyword(Keyword::INSERT) {
17567            Ok(Action::Insert {
17568                columns: parse_columns(self)?,
17569            })
17570        } else if self.parse_keyword(Keyword::MANAGE) {
17571            let manage_type = self.parse_action_manage_type()?;
17572            Ok(Action::Manage { manage_type })
17573        } else if self.parse_keyword(Keyword::MODIFY) {
17574            let modify_type = self.parse_action_modify_type();
17575            Ok(Action::Modify { modify_type })
17576        } else if self.parse_keyword(Keyword::MONITOR) {
17577            let monitor_type = self.parse_action_monitor_type();
17578            Ok(Action::Monitor { monitor_type })
17579        } else if self.parse_keyword(Keyword::OPERATE) {
17580            Ok(Action::Operate)
17581        } else if self.parse_keyword(Keyword::REFERENCES) {
17582            Ok(Action::References {
17583                columns: parse_columns(self)?,
17584            })
17585        } else if self.parse_keyword(Keyword::READ) {
17586            Ok(Action::Read)
17587        } else if self.parse_keyword(Keyword::REPLICATE) {
17588            Ok(Action::Replicate)
17589        } else if self.parse_keyword(Keyword::ROLE) {
17590            let role = self.parse_object_name(false)?;
17591            Ok(Action::Role { role })
17592        } else if self.parse_keyword(Keyword::SELECT) {
17593            Ok(Action::Select {
17594                columns: parse_columns(self)?,
17595            })
17596        } else if self.parse_keyword(Keyword::TEMPORARY) {
17597            Ok(Action::Temporary)
17598        } else if self.parse_keyword(Keyword::TRIGGER) {
17599            Ok(Action::Trigger)
17600        } else if self.parse_keyword(Keyword::TRUNCATE) {
17601            Ok(Action::Truncate)
17602        } else if self.parse_keyword(Keyword::UPDATE) {
17603            Ok(Action::Update {
17604                columns: parse_columns(self)?,
17605            })
17606        } else if self.parse_keyword(Keyword::USAGE) {
17607            Ok(Action::Usage)
17608        } else if self.parse_keyword(Keyword::OWNERSHIP) {
17609            Ok(Action::Ownership)
17610        } else if self.parse_keyword(Keyword::DROP) {
17611            Ok(Action::Drop)
17612        } else {
17613            self.expected_ref("a privilege keyword", self.peek_token_ref())?
17614        }
17615    }
17616
17617    fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
17618        // Multi-word object types
17619        if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
17620            Some(ActionCreateObjectType::ApplicationPackage)
17621        } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17622            Some(ActionCreateObjectType::ComputePool)
17623        } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
17624            Some(ActionCreateObjectType::DataExchangeListing)
17625        } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17626            Some(ActionCreateObjectType::ExternalVolume)
17627        } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17628            Some(ActionCreateObjectType::FailoverGroup)
17629        } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
17630            Some(ActionCreateObjectType::NetworkPolicy)
17631        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
17632            Some(ActionCreateObjectType::OrganiationListing)
17633        } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17634            Some(ActionCreateObjectType::ReplicationGroup)
17635        }
17636        // Single-word object types
17637        else if self.parse_keyword(Keyword::ACCOUNT) {
17638            Some(ActionCreateObjectType::Account)
17639        } else if self.parse_keyword(Keyword::APPLICATION) {
17640            Some(ActionCreateObjectType::Application)
17641        } else if self.parse_keyword(Keyword::DATABASE) {
17642            Some(ActionCreateObjectType::Database)
17643        } else if self.parse_keyword(Keyword::INTEGRATION) {
17644            Some(ActionCreateObjectType::Integration)
17645        } else if self.parse_keyword(Keyword::ROLE) {
17646            Some(ActionCreateObjectType::Role)
17647        } else if self.parse_keyword(Keyword::SCHEMA) {
17648            Some(ActionCreateObjectType::Schema)
17649        } else if self.parse_keyword(Keyword::SHARE) {
17650            Some(ActionCreateObjectType::Share)
17651        } else if self.parse_keyword(Keyword::USER) {
17652            Some(ActionCreateObjectType::User)
17653        } else if self.parse_keyword(Keyword::WAREHOUSE) {
17654            Some(ActionCreateObjectType::Warehouse)
17655        } else {
17656            None
17657        }
17658    }
17659
17660    fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
17661        if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
17662            Ok(ActionApplyType::AggregationPolicy)
17663        } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
17664            Ok(ActionApplyType::AuthenticationPolicy)
17665        } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
17666            Ok(ActionApplyType::JoinPolicy)
17667        } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
17668            Ok(ActionApplyType::MaskingPolicy)
17669        } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
17670            Ok(ActionApplyType::PackagesPolicy)
17671        } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
17672            Ok(ActionApplyType::PasswordPolicy)
17673        } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
17674            Ok(ActionApplyType::ProjectionPolicy)
17675        } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
17676            Ok(ActionApplyType::RowAccessPolicy)
17677        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
17678            Ok(ActionApplyType::SessionPolicy)
17679        } else if self.parse_keyword(Keyword::TAG) {
17680            Ok(ActionApplyType::Tag)
17681        } else {
17682            self.expected_ref("GRANT APPLY type", self.peek_token_ref())
17683        }
17684    }
17685
17686    fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
17687        if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
17688            Some(ActionExecuteObjectType::DataMetricFunction)
17689        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
17690            Some(ActionExecuteObjectType::ManagedAlert)
17691        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
17692            Some(ActionExecuteObjectType::ManagedTask)
17693        } else if self.parse_keyword(Keyword::ALERT) {
17694            Some(ActionExecuteObjectType::Alert)
17695        } else if self.parse_keyword(Keyword::TASK) {
17696            Some(ActionExecuteObjectType::Task)
17697        } else {
17698            None
17699        }
17700    }
17701
17702    fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
17703        if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
17704            Ok(ActionManageType::AccountSupportCases)
17705        } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
17706            Ok(ActionManageType::EventSharing)
17707        } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
17708            Ok(ActionManageType::ListingAutoFulfillment)
17709        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
17710            Ok(ActionManageType::OrganizationSupportCases)
17711        } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
17712            Ok(ActionManageType::UserSupportCases)
17713        } else if self.parse_keyword(Keyword::GRANTS) {
17714            Ok(ActionManageType::Grants)
17715        } else if self.parse_keyword(Keyword::WAREHOUSES) {
17716            Ok(ActionManageType::Warehouses)
17717        } else {
17718            self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
17719        }
17720    }
17721
17722    fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
17723        if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
17724            Some(ActionModifyType::LogLevel)
17725        } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
17726            Some(ActionModifyType::TraceLevel)
17727        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
17728            Some(ActionModifyType::SessionLogLevel)
17729        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
17730            Some(ActionModifyType::SessionTraceLevel)
17731        } else {
17732            None
17733        }
17734    }
17735
17736    fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
17737        if self.parse_keyword(Keyword::EXECUTION) {
17738            Some(ActionMonitorType::Execution)
17739        } else if self.parse_keyword(Keyword::SECURITY) {
17740            Some(ActionMonitorType::Security)
17741        } else if self.parse_keyword(Keyword::USAGE) {
17742            Some(ActionMonitorType::Usage)
17743        } else {
17744            None
17745        }
17746    }
17747
17748    /// Parse a grantee name, possibly with a host qualifier (user@host).
17749    pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
17750        let mut name = self.parse_object_name(false)?;
17751        if self.dialect.supports_user_host_grantee()
17752            && name.0.len() == 1
17753            && name.0[0].as_ident().is_some()
17754            && self.consume_token(&Token::AtSign)
17755        {
17756            let user = name.0.pop().unwrap().as_ident().unwrap().clone();
17757            let host = self.parse_identifier()?;
17758            Ok(GranteeName::UserHost { user, host })
17759        } else {
17760            Ok(GranteeName::ObjectName(name))
17761        }
17762    }
17763
17764    /// Parse [`Statement::Deny`]
17765    pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
17766        self.expect_keyword(Keyword::DENY)?;
17767
17768        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17769        let objects = match objects {
17770            Some(o) => o,
17771            None => {
17772                return parser_err!(
17773                    "DENY statements must specify an object",
17774                    self.peek_token_ref().span.start
17775                )
17776            }
17777        };
17778
17779        self.expect_keyword_is(Keyword::TO)?;
17780        let grantees = self.parse_grantees()?;
17781        let cascade = self.parse_cascade_option();
17782        let granted_by = if self.parse_keywords(&[Keyword::AS]) {
17783            Some(self.parse_identifier()?)
17784        } else {
17785            None
17786        };
17787
17788        Ok(Statement::Deny(DenyStatement {
17789            privileges,
17790            objects,
17791            grantees,
17792            cascade,
17793            granted_by,
17794        }))
17795    }
17796
17797    /// Parse a REVOKE statement
17798    pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
17799        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17800
17801        self.expect_keyword_is(Keyword::FROM)?;
17802        let grantees = self.parse_grantees()?;
17803
17804        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17805            Some(self.parse_identifier()?)
17806        } else {
17807            None
17808        };
17809
17810        let cascade = self.parse_cascade_option();
17811
17812        Ok(Revoke {
17813            privileges,
17814            objects,
17815            grantees,
17816            granted_by,
17817            cascade,
17818        })
17819    }
17820
17821    /// Parse an REPLACE statement
17822    pub fn parse_replace(
17823        &mut self,
17824        replace_token: TokenWithSpan,
17825    ) -> Result<Statement, ParserError> {
17826        if !dialect_of!(self is MySqlDialect | GenericDialect) {
17827            return parser_err!(
17828                "Unsupported statement REPLACE",
17829                self.peek_token_ref().span.start
17830            );
17831        }
17832
17833        let mut insert = self.parse_insert(replace_token)?;
17834        if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
17835            *replace_into = true;
17836        }
17837
17838        Ok(insert)
17839    }
17840
17841    /// Parse an INSERT statement, returning a `Box`ed SetExpr
17842    ///
17843    /// This is used to reduce the size of the stack frames in debug builds
17844    fn parse_insert_setexpr_boxed(
17845        &mut self,
17846        insert_token: TokenWithSpan,
17847    ) -> Result<Box<SetExpr>, ParserError> {
17848        Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
17849    }
17850
17851    /// Parse an INSERT statement
17852    pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
17853        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
17854        let or = self.parse_conflict_clause();
17855        let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
17856            None
17857        } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
17858            Some(MysqlInsertPriority::LowPriority)
17859        } else if self.parse_keyword(Keyword::DELAYED) {
17860            Some(MysqlInsertPriority::Delayed)
17861        } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
17862            Some(MysqlInsertPriority::HighPriority)
17863        } else {
17864            None
17865        };
17866
17867        let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
17868            && self.parse_keyword(Keyword::IGNORE);
17869
17870        let replace_into = false;
17871
17872        let overwrite = self.parse_keyword(Keyword::OVERWRITE);
17873        let into = self.parse_keyword(Keyword::INTO);
17874
17875        let local = self.parse_keyword(Keyword::LOCAL);
17876
17877        if self.parse_keyword(Keyword::DIRECTORY) {
17878            let path = self.parse_literal_string()?;
17879            let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
17880                Some(self.parse_file_format()?)
17881            } else {
17882                None
17883            };
17884            let source = self.parse_query()?;
17885            Ok(Statement::Directory {
17886                local,
17887                path,
17888                overwrite,
17889                file_format,
17890                source,
17891            })
17892        } else {
17893            // Hive lets you put table here regardless
17894            let table = self.parse_keyword(Keyword::TABLE);
17895            let table_object = self.parse_table_object()?;
17896
17897            let table_alias = if self.dialect.supports_insert_table_alias()
17898                && !self.peek_sub_query()
17899                && self
17900                    .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
17901                    .is_none()
17902            {
17903                if self.parse_keyword(Keyword::AS) {
17904                    Some(TableAliasWithoutColumns {
17905                        explicit: true,
17906                        alias: self.parse_identifier()?,
17907                    })
17908                } else {
17909                    self.maybe_parse(|parser| parser.parse_identifier())?
17910                        .map(|alias| TableAliasWithoutColumns {
17911                            explicit: false,
17912                            alias,
17913                        })
17914                }
17915            } else {
17916                None
17917            };
17918
17919            let is_mysql = dialect_of!(self is MySqlDialect);
17920
17921            let (columns, partitioned, after_columns, output, source, assignments) = if self
17922                .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
17923            {
17924                (vec![], None, vec![], None, None, vec![])
17925            } else {
17926                let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
17927                    let columns =
17928                        self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
17929
17930                    let partitioned = self.parse_insert_partition()?;
17931                    // Hive allows you to specify columns after partitions as well if you want.
17932                    let after_columns = if dialect_of!(self is HiveDialect) {
17933                        self.parse_parenthesized_column_list(Optional, false)?
17934                    } else {
17935                        vec![]
17936                    };
17937                    (columns, partitioned, after_columns)
17938                } else {
17939                    Default::default()
17940                };
17941
17942                let output = self.maybe_parse_output_clause()?;
17943
17944                let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
17945                    || self.peek_keyword(Keyword::SETTINGS)
17946                {
17947                    (None, vec![])
17948                } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
17949                    (None, self.parse_comma_separated(Parser::parse_assignment)?)
17950                } else {
17951                    (Some(self.parse_query()?), vec![])
17952                };
17953
17954                (
17955                    columns,
17956                    partitioned,
17957                    after_columns,
17958                    output,
17959                    source,
17960                    assignments,
17961                )
17962            };
17963
17964            let (format_clause, settings) = if self.dialect.supports_insert_format() {
17965                // Settings always comes before `FORMAT` for ClickHouse:
17966                // <https://clickhouse.com/docs/en/sql-reference/statements/insert-into>
17967                let settings = self.parse_settings()?;
17968
17969                let format = if self.parse_keyword(Keyword::FORMAT) {
17970                    Some(self.parse_input_format_clause()?)
17971                } else {
17972                    None
17973                };
17974
17975                (format, settings)
17976            } else {
17977                Default::default()
17978            };
17979
17980            let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
17981                && self.parse_keyword(Keyword::AS)
17982            {
17983                let row_alias = self.parse_object_name(false)?;
17984                let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
17985                Some(InsertAliases {
17986                    row_alias,
17987                    col_aliases,
17988                })
17989            } else {
17990                None
17991            };
17992
17993            let on = if self.parse_keyword(Keyword::ON) {
17994                if self.parse_keyword(Keyword::CONFLICT) {
17995                    let conflict_target =
17996                        if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
17997                            Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
17998                        } else if self.peek_token_ref().token == Token::LParen {
17999                            Some(ConflictTarget::Columns(
18000                                self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18001                            ))
18002                        } else {
18003                            None
18004                        };
18005
18006                    self.expect_keyword_is(Keyword::DO)?;
18007                    let action = if self.parse_keyword(Keyword::NOTHING) {
18008                        OnConflictAction::DoNothing
18009                    } else {
18010                        self.expect_keyword_is(Keyword::UPDATE)?;
18011                        self.expect_keyword_is(Keyword::SET)?;
18012                        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18013                        let selection = if self.parse_keyword(Keyword::WHERE) {
18014                            Some(self.parse_expr()?)
18015                        } else {
18016                            None
18017                        };
18018                        OnConflictAction::DoUpdate(DoUpdate {
18019                            assignments,
18020                            selection,
18021                        })
18022                    };
18023
18024                    Some(OnInsert::OnConflict(OnConflict {
18025                        conflict_target,
18026                        action,
18027                    }))
18028                } else {
18029                    self.expect_keyword_is(Keyword::DUPLICATE)?;
18030                    self.expect_keyword_is(Keyword::KEY)?;
18031                    self.expect_keyword_is(Keyword::UPDATE)?;
18032                    let l = self.parse_comma_separated(Parser::parse_assignment)?;
18033
18034                    Some(OnInsert::DuplicateKeyUpdate(l))
18035                }
18036            } else {
18037                None
18038            };
18039
18040            let returning = if self.parse_keyword(Keyword::RETURNING) {
18041                Some(self.parse_comma_separated(Parser::parse_select_item)?)
18042            } else {
18043                None
18044            };
18045
18046            Ok(Insert {
18047                insert_token: insert_token.into(),
18048                optimizer_hints,
18049                or,
18050                table: table_object,
18051                table_alias,
18052                ignore,
18053                into,
18054                overwrite,
18055                partitioned,
18056                columns,
18057                after_columns,
18058                source,
18059                assignments,
18060                has_table_keyword: table,
18061                on,
18062                returning,
18063                output,
18064                replace_into,
18065                priority,
18066                insert_alias,
18067                settings,
18068                format_clause,
18069                multi_table_insert_type: None,
18070                multi_table_into_clauses: vec![],
18071                multi_table_when_clauses: vec![],
18072                multi_table_else_clause: None,
18073            }
18074            .into())
18075        }
18076    }
18077
18078    /// Parses input format clause used for ClickHouse.
18079    ///
18080    /// <https://clickhouse.com/docs/en/interfaces/formats>
18081    pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18082        let ident = self.parse_identifier()?;
18083        let values = self
18084            .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18085            .unwrap_or_default();
18086
18087        Ok(InputFormatClause { ident, values })
18088    }
18089
18090    /// Returns true if the immediate tokens look like the
18091    /// beginning of a subquery. `(SELECT ...`
18092    fn peek_subquery_start(&mut self) -> bool {
18093        matches!(
18094            self.peek_tokens_ref(),
18095            [
18096                TokenWithSpan {
18097                    token: Token::LParen,
18098                    ..
18099                },
18100                TokenWithSpan {
18101                    token: Token::Word(Word {
18102                        keyword: Keyword::SELECT,
18103                        ..
18104                    }),
18105                    ..
18106                },
18107            ]
18108        )
18109    }
18110
18111    /// Returns true if the immediate tokens look like the
18112    /// beginning of a subquery possibly preceded by CTEs;
18113    /// i.e. `(WITH ...` or `(SELECT ...`.
18114    fn peek_subquery_or_cte_start(&mut self) -> bool {
18115        matches!(
18116            self.peek_tokens_ref(),
18117            [
18118                TokenWithSpan {
18119                    token: Token::LParen,
18120                    ..
18121                },
18122                TokenWithSpan {
18123                    token: Token::Word(Word {
18124                        keyword: Keyword::SELECT | Keyword::WITH,
18125                        ..
18126                    }),
18127                    ..
18128                },
18129            ]
18130        )
18131    }
18132
18133    fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18134        if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18135            Some(SqliteOnConflict::Replace)
18136        } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18137            Some(SqliteOnConflict::Rollback)
18138        } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18139            Some(SqliteOnConflict::Abort)
18140        } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18141            Some(SqliteOnConflict::Fail)
18142        } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18143            Some(SqliteOnConflict::Ignore)
18144        } else if self.parse_keyword(Keyword::REPLACE) {
18145            Some(SqliteOnConflict::Replace)
18146        } else {
18147            None
18148        }
18149    }
18150
18151    /// Parse an optional `PARTITION (...)` clause for INSERT statements.
18152    pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18153        if self.parse_keyword(Keyword::PARTITION) {
18154            self.expect_token(&Token::LParen)?;
18155            let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18156            self.expect_token(&Token::RParen)?;
18157            Ok(partition_cols)
18158        } else {
18159            Ok(None)
18160        }
18161    }
18162
18163    /// Parse optional Hive `INPUTFORMAT ... SERDE ...` clause used by LOAD DATA.
18164    pub fn parse_load_data_table_format(
18165        &mut self,
18166    ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18167        if self.parse_keyword(Keyword::INPUTFORMAT) {
18168            let input_format = self.parse_expr()?;
18169            self.expect_keyword_is(Keyword::SERDE)?;
18170            let serde = self.parse_expr()?;
18171            Ok(Some(HiveLoadDataFormat {
18172                input_format,
18173                serde,
18174            }))
18175        } else {
18176            Ok(None)
18177        }
18178    }
18179
18180    /// Parse an UPDATE statement, returning a `Box`ed SetExpr
18181    ///
18182    /// This is used to reduce the size of the stack frames in debug builds
18183    fn parse_update_setexpr_boxed(
18184        &mut self,
18185        update_token: TokenWithSpan,
18186    ) -> Result<Box<SetExpr>, ParserError> {
18187        Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18188    }
18189
18190    /// Parse an `UPDATE` statement and return `Statement::Update`.
18191    pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18192        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18193        let or = self.parse_conflict_clause();
18194        let table = self.parse_table_and_joins()?;
18195        let from_before_set = if self.parse_keyword(Keyword::FROM) {
18196            Some(UpdateTableFromKind::BeforeSet(
18197                self.parse_table_with_joins()?,
18198            ))
18199        } else {
18200            None
18201        };
18202        self.expect_keyword(Keyword::SET)?;
18203        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18204
18205        let output = self.maybe_parse_output_clause()?;
18206
18207        let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18208            Some(UpdateTableFromKind::AfterSet(
18209                self.parse_table_with_joins()?,
18210            ))
18211        } else {
18212            from_before_set
18213        };
18214        let selection = if self.parse_keyword(Keyword::WHERE) {
18215            Some(self.parse_expr()?)
18216        } else {
18217            None
18218        };
18219        let returning = if self.parse_keyword(Keyword::RETURNING) {
18220            Some(self.parse_comma_separated(Parser::parse_select_item)?)
18221        } else {
18222            None
18223        };
18224        let order_by = if self.dialect.supports_update_order_by()
18225            && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18226        {
18227            self.parse_comma_separated(Parser::parse_order_by_expr)?
18228        } else {
18229            vec![]
18230        };
18231        let limit = if self.parse_keyword(Keyword::LIMIT) {
18232            Some(self.parse_expr()?)
18233        } else {
18234            None
18235        };
18236        Ok(Update {
18237            update_token: update_token.into(),
18238            optimizer_hints,
18239            table,
18240            assignments,
18241            from,
18242            selection,
18243            returning,
18244            output,
18245            or,
18246            order_by,
18247            limit,
18248        }
18249        .into())
18250    }
18251
18252    /// Parse a `var = expr` assignment, used in an UPDATE statement
18253    pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18254        let target = self.parse_assignment_target()?;
18255        self.expect_token(&Token::Eq)?;
18256        let value = self.parse_expr()?;
18257        Ok(Assignment { target, value })
18258    }
18259
18260    /// Parse the left-hand side of an assignment, used in an UPDATE statement
18261    pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18262        if self.consume_token(&Token::LParen) {
18263            let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18264            self.expect_token(&Token::RParen)?;
18265            Ok(AssignmentTarget::Tuple(columns))
18266        } else {
18267            let column = self.parse_object_name(false)?;
18268            Ok(AssignmentTarget::ColumnName(column))
18269        }
18270    }
18271
18272    /// Parse a single function argument, handling named and unnamed variants.
18273    pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18274        let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18275            self.maybe_parse(|p| {
18276                let name = p.parse_expr()?;
18277                let operator = p.parse_function_named_arg_operator()?;
18278                let arg = p.parse_wildcard_expr()?.into();
18279                Ok(FunctionArg::ExprNamed {
18280                    name,
18281                    arg,
18282                    operator,
18283                })
18284            })?
18285        } else {
18286            self.maybe_parse(|p| {
18287                let name = p.parse_identifier()?;
18288                let operator = p.parse_function_named_arg_operator()?;
18289                let arg = p.parse_wildcard_expr()?.into();
18290                Ok(FunctionArg::Named {
18291                    name,
18292                    arg,
18293                    operator,
18294                })
18295            })?
18296        };
18297        if let Some(arg) = arg {
18298            return Ok(arg);
18299        }
18300        let wildcard_expr = self.parse_wildcard_expr()?;
18301        let arg_expr: FunctionArgExpr = match wildcard_expr {
18302            Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18303                // Support `* EXCLUDE(col1, col2, ...)` inside function calls (e.g. Snowflake's
18304                // `HASH(* EXCLUDE(col))`).  Parse the options the same way SELECT items do.
18305                let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18306                if opts.opt_exclude.is_some()
18307                    || opts.opt_except.is_some()
18308                    || opts.opt_replace.is_some()
18309                    || opts.opt_rename.is_some()
18310                    || opts.opt_ilike.is_some()
18311                {
18312                    FunctionArgExpr::WildcardWithOptions(opts)
18313                } else {
18314                    wildcard_expr.into()
18315                }
18316            }
18317            other => other.into(),
18318        };
18319        Ok(FunctionArg::Unnamed(arg_expr))
18320    }
18321
18322    fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18323        if self.parse_keyword(Keyword::VALUE) {
18324            return Ok(FunctionArgOperator::Value);
18325        }
18326        let tok = self.next_token();
18327        match tok.token {
18328            Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18329                Ok(FunctionArgOperator::RightArrow)
18330            }
18331            Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18332                Ok(FunctionArgOperator::Equals)
18333            }
18334            Token::Assignment
18335                if self
18336                    .dialect
18337                    .supports_named_fn_args_with_assignment_operator() =>
18338            {
18339                Ok(FunctionArgOperator::Assignment)
18340            }
18341            Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18342                Ok(FunctionArgOperator::Colon)
18343            }
18344            _ => {
18345                self.prev_token();
18346                self.expected("argument operator", tok)
18347            }
18348        }
18349    }
18350
18351    /// Parse an optional, comma-separated list of function arguments (consumes closing paren).
18352    pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18353        if self.consume_token(&Token::RParen) {
18354            Ok(vec![])
18355        } else {
18356            let args = self.parse_comma_separated(Parser::parse_function_args)?;
18357            self.expect_token(&Token::RParen)?;
18358            Ok(args)
18359        }
18360    }
18361
18362    fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18363        if self.consume_token(&Token::RParen) {
18364            return Ok(TableFunctionArgs {
18365                args: vec![],
18366                settings: None,
18367            });
18368        }
18369        let mut args = vec![];
18370        let settings = loop {
18371            if let Some(settings) = self.parse_settings()? {
18372                break Some(settings);
18373            }
18374            args.push(self.parse_function_args()?);
18375            if self.is_parse_comma_separated_end() {
18376                break None;
18377            }
18378        };
18379        self.expect_token(&Token::RParen)?;
18380        Ok(TableFunctionArgs { args, settings })
18381    }
18382
18383    /// Parses a potentially empty list of arguments to a function
18384    /// (including the closing parenthesis).
18385    ///
18386    /// Examples:
18387    /// ```sql
18388    /// FIRST_VALUE(x ORDER BY 1,2,3);
18389    /// FIRST_VALUE(x IGNORE NULL);
18390    /// ```
18391    fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18392        let mut clauses = vec![];
18393
18394        // Handle clauses that may exist with an empty argument list
18395
18396        if let Some(null_clause) = self.parse_json_null_clause() {
18397            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18398        }
18399
18400        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18401            clauses.push(FunctionArgumentClause::JsonReturningClause(
18402                json_returning_clause,
18403            ));
18404        }
18405
18406        if self.consume_token(&Token::RParen) {
18407            return Ok(FunctionArgumentList {
18408                duplicate_treatment: None,
18409                args: vec![],
18410                clauses,
18411            });
18412        }
18413
18414        let duplicate_treatment = self.parse_duplicate_treatment()?;
18415        let args = self.parse_comma_separated(Parser::parse_function_args)?;
18416
18417        if self.dialect.supports_window_function_null_treatment_arg() {
18418            if let Some(null_treatment) = self.parse_null_treatment()? {
18419                clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
18420            }
18421        }
18422
18423        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
18424            clauses.push(FunctionArgumentClause::OrderBy(
18425                self.parse_comma_separated(Parser::parse_order_by_expr)?,
18426            ));
18427        }
18428
18429        if self.parse_keyword(Keyword::LIMIT) {
18430            clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
18431        }
18432
18433        if dialect_of!(self is GenericDialect | BigQueryDialect)
18434            && self.parse_keyword(Keyword::HAVING)
18435        {
18436            let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
18437                Keyword::MIN => HavingBoundKind::Min,
18438                Keyword::MAX => HavingBoundKind::Max,
18439                unexpected_keyword => return Err(ParserError::ParserError(
18440                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
18441                )),
18442            };
18443            clauses.push(FunctionArgumentClause::Having(HavingBound(
18444                kind,
18445                self.parse_expr()?,
18446            )))
18447        }
18448
18449        if dialect_of!(self is GenericDialect | MySqlDialect)
18450            && self.parse_keyword(Keyword::SEPARATOR)
18451        {
18452            clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
18453        }
18454
18455        if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
18456            clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
18457        }
18458
18459        if let Some(null_clause) = self.parse_json_null_clause() {
18460            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18461        }
18462
18463        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18464            clauses.push(FunctionArgumentClause::JsonReturningClause(
18465                json_returning_clause,
18466            ));
18467        }
18468
18469        self.expect_token(&Token::RParen)?;
18470        Ok(FunctionArgumentList {
18471            duplicate_treatment,
18472            args,
18473            clauses,
18474        })
18475    }
18476
18477    fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
18478        if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
18479            Some(JsonNullClause::AbsentOnNull)
18480        } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
18481            Some(JsonNullClause::NullOnNull)
18482        } else {
18483            None
18484        }
18485    }
18486
18487    fn maybe_parse_json_returning_clause(
18488        &mut self,
18489    ) -> Result<Option<JsonReturningClause>, ParserError> {
18490        if self.parse_keyword(Keyword::RETURNING) {
18491            let data_type = self.parse_data_type()?;
18492            Ok(Some(JsonReturningClause { data_type }))
18493        } else {
18494            Ok(None)
18495        }
18496    }
18497
18498    fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
18499        let loc = self.peek_token_ref().span.start;
18500        match (
18501            self.parse_keyword(Keyword::ALL),
18502            self.parse_keyword(Keyword::DISTINCT),
18503        ) {
18504            (true, false) => Ok(Some(DuplicateTreatment::All)),
18505            (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
18506            (false, false) => Ok(None),
18507            (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
18508        }
18509    }
18510
18511    /// Parse a comma-delimited list of projections after SELECT
18512    pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
18513        let prefix = self
18514            .parse_one_of_keywords(
18515                self.dialect
18516                    .get_reserved_keywords_for_select_item_operator(),
18517            )
18518            .map(|keyword| Ident::new(format!("{keyword:?}")));
18519
18520        match self.parse_wildcard_expr()? {
18521            Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
18522                SelectItemQualifiedWildcardKind::ObjectName(prefix),
18523                self.parse_wildcard_additional_options(token.0)?,
18524            )),
18525            Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
18526                self.parse_wildcard_additional_options(token.0)?,
18527            )),
18528            Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
18529                parser_err!(
18530                    format!("Expected an expression, found: {}", v),
18531                    self.peek_token_ref().span.start
18532                )
18533            }
18534            Expr::BinaryOp {
18535                left,
18536                op: BinaryOperator::Eq,
18537                right,
18538            } if self.dialect.supports_eq_alias_assignment()
18539                && matches!(left.as_ref(), Expr::Identifier(_)) =>
18540            {
18541                let Expr::Identifier(alias) = *left else {
18542                    return parser_err!(
18543                        "BUG: expected identifier expression as alias",
18544                        self.peek_token_ref().span.start
18545                    );
18546                };
18547                Ok(SelectItem::ExprWithAlias {
18548                    expr: *right,
18549                    alias,
18550                })
18551            }
18552            expr if self.dialect.supports_select_expr_star()
18553                && self.consume_tokens(&[Token::Period, Token::Mul]) =>
18554            {
18555                let wildcard_token = self.get_previous_token().clone();
18556                Ok(SelectItem::QualifiedWildcard(
18557                    SelectItemQualifiedWildcardKind::Expr(expr),
18558                    self.parse_wildcard_additional_options(wildcard_token)?,
18559                ))
18560            }
18561            expr if self.dialect.supports_select_item_multi_column_alias()
18562                && self.peek_keyword(Keyword::AS)
18563                && self.peek_nth_token(1).token == Token::LParen =>
18564            {
18565                self.expect_keyword(Keyword::AS)?;
18566                self.expect_token(&Token::LParen)?;
18567                let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
18568                self.expect_token(&Token::RParen)?;
18569                Ok(SelectItem::ExprWithAliases {
18570                    expr: maybe_prefixed_expr(expr, prefix),
18571                    aliases,
18572                })
18573            }
18574            expr => self
18575                .maybe_parse_select_item_alias()
18576                .map(|alias| match alias {
18577                    Some(alias) => SelectItem::ExprWithAlias {
18578                        expr: maybe_prefixed_expr(expr, prefix),
18579                        alias,
18580                    },
18581                    None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
18582                }),
18583        }
18584    }
18585
18586    /// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
18587    ///
18588    /// If it is not possible to parse it, will return an option.
18589    pub fn parse_wildcard_additional_options(
18590        &mut self,
18591        wildcard_token: TokenWithSpan,
18592    ) -> Result<WildcardAdditionalOptions, ParserError> {
18593        let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
18594            self.parse_optional_select_item_ilike()?
18595        } else {
18596            None
18597        };
18598        let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
18599        {
18600            self.parse_optional_select_item_exclude()?
18601        } else {
18602            None
18603        };
18604        let opt_except = if self.dialect.supports_select_wildcard_except() {
18605            self.parse_optional_select_item_except()?
18606        } else {
18607            None
18608        };
18609        let opt_replace = if self.dialect.supports_select_wildcard_replace() {
18610            self.parse_optional_select_item_replace()?
18611        } else {
18612            None
18613        };
18614        let opt_rename = if self.dialect.supports_select_wildcard_rename() {
18615            self.parse_optional_select_item_rename()?
18616        } else {
18617            None
18618        };
18619
18620        let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
18621            self.maybe_parse_select_item_alias()?
18622        } else {
18623            None
18624        };
18625
18626        Ok(WildcardAdditionalOptions {
18627            wildcard_token: wildcard_token.into(),
18628            opt_ilike,
18629            opt_exclude,
18630            opt_except,
18631            opt_rename,
18632            opt_replace,
18633            opt_alias,
18634        })
18635    }
18636
18637    /// Parse an [`Ilike`](IlikeSelectItem) information for wildcard select items.
18638    ///
18639    /// If it is not possible to parse it, will return an option.
18640    pub fn parse_optional_select_item_ilike(
18641        &mut self,
18642    ) -> Result<Option<IlikeSelectItem>, ParserError> {
18643        let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
18644            let next_token = self.next_token();
18645            let pattern = match next_token.token {
18646                Token::SingleQuotedString(s) => s,
18647                _ => return self.expected("ilike pattern", next_token),
18648            };
18649            Some(IlikeSelectItem { pattern })
18650        } else {
18651            None
18652        };
18653        Ok(opt_ilike)
18654    }
18655
18656    /// Parse an [`Exclude`](ExcludeSelectItem) information for wildcard select items.
18657    ///
18658    /// If it is not possible to parse it, will return an option.
18659    pub fn parse_optional_select_item_exclude(
18660        &mut self,
18661    ) -> Result<Option<ExcludeSelectItem>, ParserError> {
18662        let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
18663            if self.consume_token(&Token::LParen) {
18664                let columns =
18665                    self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
18666                self.expect_token(&Token::RParen)?;
18667                Some(ExcludeSelectItem::Multiple(columns))
18668            } else {
18669                let column = self.parse_object_name(false)?;
18670                Some(ExcludeSelectItem::Single(column))
18671            }
18672        } else {
18673            None
18674        };
18675
18676        Ok(opt_exclude)
18677    }
18678
18679    /// Parse an [`Except`](ExceptSelectItem) information for wildcard select items.
18680    ///
18681    /// If it is not possible to parse it, will return an option.
18682    pub fn parse_optional_select_item_except(
18683        &mut self,
18684    ) -> Result<Option<ExceptSelectItem>, ParserError> {
18685        let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
18686            if self.peek_token_ref().token == Token::LParen {
18687                let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
18688                match &idents[..] {
18689                    [] => {
18690                        return self.expected_ref(
18691                            "at least one column should be parsed by the expect clause",
18692                            self.peek_token_ref(),
18693                        )?;
18694                    }
18695                    [first, idents @ ..] => Some(ExceptSelectItem {
18696                        first_element: first.clone(),
18697                        additional_elements: idents.to_vec(),
18698                    }),
18699                }
18700            } else {
18701                // Clickhouse allows EXCEPT column_name
18702                let ident = self.parse_identifier()?;
18703                Some(ExceptSelectItem {
18704                    first_element: ident,
18705                    additional_elements: vec![],
18706                })
18707            }
18708        } else {
18709            None
18710        };
18711
18712        Ok(opt_except)
18713    }
18714
18715    /// Parse a [`Rename`](RenameSelectItem) information for wildcard select items.
18716    pub fn parse_optional_select_item_rename(
18717        &mut self,
18718    ) -> Result<Option<RenameSelectItem>, ParserError> {
18719        let opt_rename = if self.parse_keyword(Keyword::RENAME) {
18720            if self.consume_token(&Token::LParen) {
18721                let idents =
18722                    self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
18723                self.expect_token(&Token::RParen)?;
18724                Some(RenameSelectItem::Multiple(idents))
18725            } else {
18726                let ident = self.parse_identifier_with_alias()?;
18727                Some(RenameSelectItem::Single(ident))
18728            }
18729        } else {
18730            None
18731        };
18732
18733        Ok(opt_rename)
18734    }
18735
18736    /// Parse a [`Replace`](ReplaceSelectItem) information for wildcard select items.
18737    pub fn parse_optional_select_item_replace(
18738        &mut self,
18739    ) -> Result<Option<ReplaceSelectItem>, ParserError> {
18740        let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
18741            if self.consume_token(&Token::LParen) {
18742                let items = self.parse_comma_separated(|parser| {
18743                    Ok(Box::new(parser.parse_replace_elements()?))
18744                })?;
18745                self.expect_token(&Token::RParen)?;
18746                Some(ReplaceSelectItem { items })
18747            } else {
18748                let tok = self.next_token();
18749                return self.expected("( after REPLACE but", tok);
18750            }
18751        } else {
18752            None
18753        };
18754
18755        Ok(opt_replace)
18756    }
18757    /// Parse a single element of a `REPLACE (...)` select-item clause.
18758    pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
18759        let expr = self.parse_expr()?;
18760        let as_keyword = self.parse_keyword(Keyword::AS);
18761        let ident = self.parse_identifier()?;
18762        Ok(ReplaceSelectElement {
18763            expr,
18764            column_name: ident,
18765            as_keyword,
18766        })
18767    }
18768
18769    /// Parse ASC or DESC, returns an Option with true if ASC, false of DESC or `None` if none of
18770    /// them.
18771    pub fn parse_asc_desc(&mut self) -> Option<bool> {
18772        if self.parse_keyword(Keyword::ASC) {
18773            Some(true)
18774        } else if self.parse_keyword(Keyword::DESC) {
18775            Some(false)
18776        } else {
18777            None
18778        }
18779    }
18780
18781    /// Parse an [OrderByExpr] expression.
18782    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
18783        self.parse_order_by_expr_inner(false)
18784            .map(|(order_by, _)| order_by)
18785    }
18786
18787    /// Parse an [IndexColumn].
18788    pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
18789        self.parse_order_by_expr_inner(true)
18790            .map(|(column, operator_class)| IndexColumn {
18791                column,
18792                operator_class,
18793            })
18794    }
18795
18796    fn parse_order_by_expr_inner(
18797        &mut self,
18798        with_operator_class: bool,
18799    ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
18800        let expr = self.parse_expr()?;
18801
18802        let operator_class: Option<ObjectName> = if with_operator_class {
18803            // We check that if non of the following keywords are present, then we parse an
18804            // identifier as operator class.
18805            if self
18806                .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
18807                .is_some()
18808            {
18809                None
18810            } else {
18811                self.maybe_parse(|parser| parser.parse_object_name(false))?
18812            }
18813        } else {
18814            None
18815        };
18816
18817        let options = self.parse_order_by_options()?;
18818
18819        let with_fill = if self.dialect.supports_with_fill()
18820            && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
18821        {
18822            Some(self.parse_with_fill()?)
18823        } else {
18824            None
18825        };
18826
18827        Ok((
18828            OrderByExpr {
18829                expr,
18830                options,
18831                with_fill,
18832            },
18833            operator_class,
18834        ))
18835    }
18836
18837    fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
18838        let asc = self.parse_asc_desc();
18839
18840        let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
18841            Some(true)
18842        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
18843            Some(false)
18844        } else {
18845            None
18846        };
18847
18848        Ok(OrderByOptions { asc, nulls_first })
18849    }
18850
18851    // Parse a WITH FILL clause (ClickHouse dialect)
18852    // that follow the WITH FILL keywords in a ORDER BY clause
18853    /// Parse a `WITH FILL` clause used in ORDER BY (ClickHouse dialect).
18854    pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
18855        let from = if self.parse_keyword(Keyword::FROM) {
18856            Some(self.parse_expr()?)
18857        } else {
18858            None
18859        };
18860
18861        let to = if self.parse_keyword(Keyword::TO) {
18862            Some(self.parse_expr()?)
18863        } else {
18864            None
18865        };
18866
18867        let step = if self.parse_keyword(Keyword::STEP) {
18868            Some(self.parse_expr()?)
18869        } else {
18870            None
18871        };
18872
18873        Ok(WithFill { from, to, step })
18874    }
18875
18876    /// Parse a set of comma separated INTERPOLATE expressions (ClickHouse dialect)
18877    /// that follow the INTERPOLATE keyword in an ORDER BY clause with the WITH FILL modifier
18878    pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
18879        if !self.parse_keyword(Keyword::INTERPOLATE) {
18880            return Ok(None);
18881        }
18882
18883        if self.consume_token(&Token::LParen) {
18884            let interpolations =
18885                self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
18886            self.expect_token(&Token::RParen)?;
18887            // INTERPOLATE () and INTERPOLATE ( ... ) variants
18888            return Ok(Some(Interpolate {
18889                exprs: Some(interpolations),
18890            }));
18891        }
18892
18893        // INTERPOLATE
18894        Ok(Some(Interpolate { exprs: None }))
18895    }
18896
18897    /// Parse a INTERPOLATE expression (ClickHouse dialect)
18898    pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
18899        let column = self.parse_identifier()?;
18900        let expr = if self.parse_keyword(Keyword::AS) {
18901            Some(self.parse_expr()?)
18902        } else {
18903            None
18904        };
18905        Ok(InterpolateExpr { column, expr })
18906    }
18907
18908    /// Parse a TOP clause, MSSQL equivalent of LIMIT,
18909    /// that follows after `SELECT [DISTINCT]`.
18910    pub fn parse_top(&mut self) -> Result<Top, ParserError> {
18911        let quantity = if self.consume_token(&Token::LParen) {
18912            let quantity = self.parse_expr()?;
18913            self.expect_token(&Token::RParen)?;
18914            Some(TopQuantity::Expr(quantity))
18915        } else {
18916            let next_token = self.next_token();
18917            let quantity = match next_token.token {
18918                Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
18919                _ => self.expected("literal int", next_token)?,
18920            };
18921            Some(TopQuantity::Constant(quantity))
18922        };
18923
18924        let percent = self.parse_keyword(Keyword::PERCENT);
18925
18926        let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
18927
18928        Ok(Top {
18929            with_ties,
18930            percent,
18931            quantity,
18932        })
18933    }
18934
18935    /// Parse a LIMIT clause
18936    pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
18937        if self.parse_keyword(Keyword::ALL) {
18938            Ok(None)
18939        } else {
18940            Ok(Some(self.parse_expr()?))
18941        }
18942    }
18943
18944    /// Parse an OFFSET clause
18945    pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
18946        let value = self.parse_expr()?;
18947        let rows = if self.parse_keyword(Keyword::ROW) {
18948            OffsetRows::Row
18949        } else if self.parse_keyword(Keyword::ROWS) {
18950            OffsetRows::Rows
18951        } else {
18952            OffsetRows::None
18953        };
18954        Ok(Offset { value, rows })
18955    }
18956
18957    /// Parse a FETCH clause
18958    pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
18959        let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
18960
18961        let (quantity, percent) = if self
18962            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
18963            .is_some()
18964        {
18965            (None, false)
18966        } else {
18967            let quantity = Expr::Value(self.parse_value()?);
18968            let percent = self.parse_keyword(Keyword::PERCENT);
18969            let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
18970            (Some(quantity), percent)
18971        };
18972
18973        let with_ties = if self.parse_keyword(Keyword::ONLY) {
18974            false
18975        } else {
18976            self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
18977        };
18978
18979        Ok(Fetch {
18980            with_ties,
18981            percent,
18982            quantity,
18983        })
18984    }
18985
18986    /// Parse a FOR UPDATE/FOR SHARE clause
18987    pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
18988        let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
18989            Keyword::UPDATE => LockType::Update,
18990            Keyword::SHARE => LockType::Share,
18991            unexpected_keyword => return Err(ParserError::ParserError(
18992                format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
18993            )),
18994        };
18995        let of = if self.parse_keyword(Keyword::OF) {
18996            Some(self.parse_object_name(false)?)
18997        } else {
18998            None
18999        };
19000        let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19001            Some(NonBlock::Nowait)
19002        } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19003            Some(NonBlock::SkipLocked)
19004        } else {
19005            None
19006        };
19007        Ok(LockClause {
19008            lock_type,
19009            of,
19010            nonblock,
19011        })
19012    }
19013
19014    /// Parse a PostgreSQL `LOCK` statement.
19015    pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19016        self.expect_keyword(Keyword::LOCK)?;
19017
19018        if self.peek_keyword(Keyword::TABLES) {
19019            return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19020        }
19021
19022        let _ = self.parse_keyword(Keyword::TABLE);
19023        let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19024        let lock_mode = if self.parse_keyword(Keyword::IN) {
19025            let lock_mode = self.parse_lock_table_mode()?;
19026            self.expect_keyword(Keyword::MODE)?;
19027            Some(lock_mode)
19028        } else {
19029            None
19030        };
19031        let nowait = self.parse_keyword(Keyword::NOWAIT);
19032
19033        Ok(Lock {
19034            tables,
19035            lock_mode,
19036            nowait,
19037        })
19038    }
19039
19040    fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19041        let only = self.parse_keyword(Keyword::ONLY);
19042        let name = self.parse_object_name(false)?;
19043        let has_asterisk = self.consume_token(&Token::Mul);
19044
19045        Ok(LockTableTarget {
19046            name,
19047            only,
19048            has_asterisk,
19049        })
19050    }
19051
19052    fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19053        if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19054            Ok(LockTableMode::AccessShare)
19055        } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19056            Ok(LockTableMode::AccessExclusive)
19057        } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19058            Ok(LockTableMode::RowShare)
19059        } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19060            Ok(LockTableMode::RowExclusive)
19061        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19062            Ok(LockTableMode::ShareUpdateExclusive)
19063        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19064            Ok(LockTableMode::ShareRowExclusive)
19065        } else if self.parse_keyword(Keyword::SHARE) {
19066            Ok(LockTableMode::Share)
19067        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19068            Ok(LockTableMode::Exclusive)
19069        } else {
19070            self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19071        }
19072    }
19073
19074    /// Parse a VALUES clause
19075    pub fn parse_values(
19076        &mut self,
19077        allow_empty: bool,
19078        value_keyword: bool,
19079    ) -> Result<Values, ParserError> {
19080        let mut explicit_row = false;
19081
19082        let rows = self.parse_comma_separated(|parser| {
19083            if parser.parse_keyword(Keyword::ROW) {
19084                explicit_row = true;
19085            }
19086            Ok(Parens {
19087                opening_token: parser.expect_token(&Token::LParen)?.into(),
19088                content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19089                    vec![]
19090                } else {
19091                    parser.parse_comma_separated(Parser::parse_expr)?
19092                },
19093                closing_token: parser.expect_token(&Token::RParen)?.into(),
19094            })
19095        })?;
19096        Ok(Values {
19097            explicit_row,
19098            rows,
19099            value_keyword,
19100        })
19101    }
19102
19103    /// Parse a 'START TRANSACTION' statement
19104    pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19105        self.expect_keyword_is(Keyword::TRANSACTION)?;
19106        Ok(Statement::StartTransaction {
19107            modes: self.parse_transaction_modes()?,
19108            begin: false,
19109            transaction: Some(BeginTransactionKind::Transaction),
19110            modifier: None,
19111            statements: vec![],
19112            exception: None,
19113            has_end_keyword: false,
19114        })
19115    }
19116
19117    /// Parse a transaction modifier keyword that can follow a `BEGIN` statement.
19118    pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19119        if !self.dialect.supports_start_transaction_modifier() {
19120            None
19121        } else if self.parse_keyword(Keyword::DEFERRED) {
19122            Some(TransactionModifier::Deferred)
19123        } else if self.parse_keyword(Keyword::IMMEDIATE) {
19124            Some(TransactionModifier::Immediate)
19125        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19126            Some(TransactionModifier::Exclusive)
19127        } else if self.parse_keyword(Keyword::TRY) {
19128            Some(TransactionModifier::Try)
19129        } else if self.parse_keyword(Keyword::CATCH) {
19130            Some(TransactionModifier::Catch)
19131        } else {
19132            None
19133        }
19134    }
19135
19136    /// Parse a 'BEGIN' statement
19137    pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19138        let modifier = self.parse_transaction_modifier();
19139        let transaction =
19140            match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19141            {
19142                Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19143                Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19144                Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19145                _ => None,
19146            };
19147        Ok(Statement::StartTransaction {
19148            modes: self.parse_transaction_modes()?,
19149            begin: true,
19150            transaction,
19151            modifier,
19152            statements: vec![],
19153            exception: None,
19154            has_end_keyword: false,
19155        })
19156    }
19157
19158    /// Parse a 'BEGIN ... EXCEPTION ... END' block
19159    pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19160        let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19161
19162        let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19163            let mut when = Vec::new();
19164
19165            // We can have multiple `WHEN` arms so we consume all cases until `END`
19166            while !self.peek_keyword(Keyword::END) {
19167                self.expect_keyword(Keyword::WHEN)?;
19168
19169                // Each `WHEN` case can have one or more conditions, e.g.
19170                // WHEN EXCEPTION_1 [OR EXCEPTION_2] THEN
19171                // So we parse identifiers until the `THEN` keyword.
19172                let mut idents = Vec::new();
19173
19174                while !self.parse_keyword(Keyword::THEN) {
19175                    let ident = self.parse_identifier()?;
19176                    idents.push(ident);
19177
19178                    self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19179                }
19180
19181                let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19182
19183                when.push(ExceptionWhen { idents, statements });
19184            }
19185
19186            Some(when)
19187        } else {
19188            None
19189        };
19190
19191        self.expect_keyword(Keyword::END)?;
19192
19193        Ok(Statement::StartTransaction {
19194            begin: true,
19195            statements,
19196            exception,
19197            has_end_keyword: true,
19198            transaction: None,
19199            modifier: None,
19200            modes: Default::default(),
19201        })
19202    }
19203
19204    /// Parse an 'END' statement
19205    pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19206        let modifier = if !self.dialect.supports_end_transaction_modifier() {
19207            None
19208        } else if self.parse_keyword(Keyword::TRY) {
19209            Some(TransactionModifier::Try)
19210        } else if self.parse_keyword(Keyword::CATCH) {
19211            Some(TransactionModifier::Catch)
19212        } else {
19213            None
19214        };
19215        Ok(Statement::Commit {
19216            chain: self.parse_commit_rollback_chain()?,
19217            end: true,
19218            modifier,
19219        })
19220    }
19221
19222    /// Parse a list of transaction modes
19223    pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19224        let mut modes = vec![];
19225        let mut required = false;
19226        loop {
19227            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19228                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19229                    TransactionIsolationLevel::ReadUncommitted
19230                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19231                    TransactionIsolationLevel::ReadCommitted
19232                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19233                    TransactionIsolationLevel::RepeatableRead
19234                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19235                    TransactionIsolationLevel::Serializable
19236                } else if self.parse_keyword(Keyword::SNAPSHOT) {
19237                    TransactionIsolationLevel::Snapshot
19238                } else {
19239                    self.expected_ref("isolation level", self.peek_token_ref())?
19240                };
19241                TransactionMode::IsolationLevel(iso_level)
19242            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19243                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19244            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19245                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19246            } else if required {
19247                self.expected_ref("transaction mode", self.peek_token_ref())?
19248            } else {
19249                break;
19250            };
19251            modes.push(mode);
19252            // ANSI requires a comma after each transaction mode, but
19253            // PostgreSQL, for historical reasons, does not. We follow
19254            // PostgreSQL in making the comma optional, since that is strictly
19255            // more general.
19256            required = self.consume_token(&Token::Comma);
19257        }
19258        Ok(modes)
19259    }
19260
19261    /// Parse a 'COMMIT' statement
19262    pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19263        Ok(Statement::Commit {
19264            chain: self.parse_commit_rollback_chain()?,
19265            end: false,
19266            modifier: None,
19267        })
19268    }
19269
19270    /// Parse a 'ROLLBACK' statement
19271    pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19272        let chain = self.parse_commit_rollback_chain()?;
19273        let savepoint = self.parse_rollback_savepoint()?;
19274
19275        Ok(Statement::Rollback { chain, savepoint })
19276    }
19277
19278    /// Parse an optional `AND [NO] CHAIN` clause for `COMMIT` and `ROLLBACK` statements
19279    pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19280        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19281        if self.parse_keyword(Keyword::AND) {
19282            let chain = !self.parse_keyword(Keyword::NO);
19283            self.expect_keyword_is(Keyword::CHAIN)?;
19284            Ok(chain)
19285        } else {
19286            Ok(false)
19287        }
19288    }
19289
19290    /// Parse an optional 'TO SAVEPOINT savepoint_name' clause for ROLLBACK statements
19291    pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19292        if self.parse_keyword(Keyword::TO) {
19293            let _ = self.parse_keyword(Keyword::SAVEPOINT);
19294            let savepoint = self.parse_identifier()?;
19295
19296            Ok(Some(savepoint))
19297        } else {
19298            Ok(None)
19299        }
19300    }
19301
19302    /// Parse a 'RAISERROR' statement
19303    pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19304        self.expect_token(&Token::LParen)?;
19305        let message = Box::new(self.parse_expr()?);
19306        self.expect_token(&Token::Comma)?;
19307        let severity = Box::new(self.parse_expr()?);
19308        self.expect_token(&Token::Comma)?;
19309        let state = Box::new(self.parse_expr()?);
19310        let arguments = if self.consume_token(&Token::Comma) {
19311            self.parse_comma_separated(Parser::parse_expr)?
19312        } else {
19313            vec![]
19314        };
19315        self.expect_token(&Token::RParen)?;
19316        let options = if self.parse_keyword(Keyword::WITH) {
19317            self.parse_comma_separated(Parser::parse_raiserror_option)?
19318        } else {
19319            vec![]
19320        };
19321        Ok(Statement::RaisError {
19322            message,
19323            severity,
19324            state,
19325            arguments,
19326            options,
19327        })
19328    }
19329
19330    /// Parse a single `RAISERROR` option
19331    pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19332        match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19333            Keyword::LOG => Ok(RaisErrorOption::Log),
19334            Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19335            Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19336            _ => self.expected_ref(
19337                "LOG, NOWAIT OR SETERROR raiserror option",
19338                self.peek_token_ref(),
19339            ),
19340        }
19341    }
19342
19343    /// Parse a MSSQL `THROW` statement.
19344    ///
19345    /// See [Statement::Throw]
19346    pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
19347        self.expect_keyword_is(Keyword::THROW)?;
19348
19349        let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
19350        let (message, state) = if error_number.is_some() {
19351            self.expect_token(&Token::Comma)?;
19352            let message = Box::new(self.parse_expr()?);
19353            self.expect_token(&Token::Comma)?;
19354            let state = Box::new(self.parse_expr()?);
19355            (Some(message), Some(state))
19356        } else {
19357            (None, None)
19358        };
19359
19360        Ok(ThrowStatement {
19361            error_number,
19362            message,
19363            state,
19364        })
19365    }
19366
19367    /// Parse a SQL `DEALLOCATE` statement
19368    pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
19369        let prepare = self.parse_keyword(Keyword::PREPARE);
19370        let name = self.parse_identifier()?;
19371        Ok(Statement::Deallocate { name, prepare })
19372    }
19373
19374    /// Parse a SQL `EXECUTE` statement
19375    pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
19376        let immediate =
19377            self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
19378
19379        // When `EXEC` is immediately followed by `(`, the content is a dynamic-SQL
19380        // expression — e.g. `EXEC (@sql)`, `EXEC ('SELECT ...')`, or
19381        // `EXEC ('SELECT ... FROM ' + @tbl + ' WHERE ...')`.
19382        // Skip name parsing; the expression ends up in `parameters` via the
19383        // `has_parentheses` path below, consistent with `EXECUTE IMMEDIATE <expr>`.
19384        let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
19385            None
19386        } else {
19387            Some(self.parse_object_name(false)?)
19388        };
19389
19390        let has_parentheses = self.consume_token(&Token::LParen);
19391
19392        let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
19393        let end_token = match (has_parentheses, self.peek_token().token) {
19394            (true, _) => Token::RParen,
19395            (false, Token::EOF) => Token::EOF,
19396            (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
19397            (false, _) => Token::SemiColon,
19398        };
19399
19400        let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
19401
19402        if has_parentheses {
19403            self.expect_token(&Token::RParen)?;
19404        }
19405
19406        let into = if self.parse_keyword(Keyword::INTO) {
19407            self.parse_comma_separated(Self::parse_identifier)?
19408        } else {
19409            vec![]
19410        };
19411
19412        let using = if self.parse_keyword(Keyword::USING) {
19413            self.parse_comma_separated(Self::parse_expr_with_alias)?
19414        } else {
19415            vec![]
19416        };
19417
19418        let output = self.parse_keyword(Keyword::OUTPUT);
19419
19420        let default = self.parse_keyword(Keyword::DEFAULT);
19421
19422        Ok(Statement::Execute {
19423            immediate,
19424            name,
19425            parameters,
19426            has_parentheses,
19427            into,
19428            using,
19429            output,
19430            default,
19431        })
19432    }
19433
19434    /// Parse a SQL `PREPARE` statement
19435    pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
19436        let name = self.parse_identifier()?;
19437
19438        let mut data_types = vec![];
19439        if self.consume_token(&Token::LParen) {
19440            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
19441            self.expect_token(&Token::RParen)?;
19442        }
19443
19444        self.expect_keyword_is(Keyword::AS)?;
19445        let statement = Box::new(self.parse_statement()?);
19446        Ok(Statement::Prepare {
19447            name,
19448            data_types,
19449            statement,
19450        })
19451    }
19452
19453    /// Parse a SQL `UNLOAD` statement
19454    pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
19455        self.expect_keyword(Keyword::UNLOAD)?;
19456        self.expect_token(&Token::LParen)?;
19457        let (query, query_text) =
19458            if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
19459                (None, Some(self.parse_literal_string()?))
19460            } else {
19461                (Some(self.parse_query()?), None)
19462            };
19463        self.expect_token(&Token::RParen)?;
19464
19465        self.expect_keyword_is(Keyword::TO)?;
19466        let to = self.parse_identifier()?;
19467        let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
19468            Some(self.parse_iam_role_kind()?)
19469        } else {
19470            None
19471        };
19472        let with = self.parse_options(Keyword::WITH)?;
19473        let mut options = vec![];
19474        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
19475            options.push(opt);
19476        }
19477        Ok(Statement::Unload {
19478            query,
19479            query_text,
19480            to,
19481            auth,
19482            with,
19483            options,
19484        })
19485    }
19486
19487    fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
19488        let temporary = self
19489            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
19490            .is_some();
19491        let unlogged = self.parse_keyword(Keyword::UNLOGGED);
19492        let table = self.parse_keyword(Keyword::TABLE);
19493        let name = self.parse_object_name(false)?;
19494
19495        Ok(SelectInto {
19496            temporary,
19497            unlogged,
19498            table,
19499            name,
19500        })
19501    }
19502
19503    fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
19504        let v = self.parse_value()?;
19505        match &v.value {
19506            Value::SingleQuotedString(_) => Ok(v),
19507            Value::DoubleQuotedString(_) => Ok(v),
19508            Value::Number(_, _) => Ok(v),
19509            Value::Placeholder(_) => Ok(v),
19510            _ => {
19511                self.prev_token();
19512                self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
19513            }
19514        }
19515    }
19516
19517    /// PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
19518    pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
19519        let name = self.parse_object_name(false)?;
19520        if self.consume_token(&Token::LParen) {
19521            let value = self.parse_pragma_value()?;
19522            self.expect_token(&Token::RParen)?;
19523            Ok(Statement::Pragma {
19524                name,
19525                value: Some(value),
19526                is_eq: false,
19527            })
19528        } else if self.consume_token(&Token::Eq) {
19529            Ok(Statement::Pragma {
19530                name,
19531                value: Some(self.parse_pragma_value()?),
19532                is_eq: true,
19533            })
19534        } else {
19535            Ok(Statement::Pragma {
19536                name,
19537                value: None,
19538                is_eq: false,
19539            })
19540        }
19541    }
19542
19543    /// `INSTALL [extension_name]`
19544    pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
19545        let extension_name = self.parse_identifier()?;
19546
19547        Ok(Statement::Install { extension_name })
19548    }
19549
19550    /// Parse a SQL LOAD statement
19551    pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
19552        if self.dialect.supports_load_extension() {
19553            let extension_name = self.parse_identifier()?;
19554            Ok(Statement::Load { extension_name })
19555        } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
19556            let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
19557            self.expect_keyword_is(Keyword::INPATH)?;
19558            let inpath = self.parse_literal_string()?;
19559            let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
19560            self.expect_keyword_is(Keyword::INTO)?;
19561            self.expect_keyword_is(Keyword::TABLE)?;
19562            let table_name = self.parse_object_name(false)?;
19563            let partitioned = self.parse_insert_partition()?;
19564            let table_format = self.parse_load_data_table_format()?;
19565            Ok(Statement::LoadData {
19566                local,
19567                inpath,
19568                overwrite,
19569                table_name,
19570                partitioned,
19571                table_format,
19572            })
19573        } else {
19574            self.expected_ref(
19575                "`DATA` or an extension name after `LOAD`",
19576                self.peek_token_ref(),
19577            )
19578        }
19579    }
19580
19581    /// ClickHouse:
19582    /// ```sql
19583    /// OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]
19584    /// ```
19585    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/optimize)
19586    ///
19587    /// Databricks:
19588    /// ```sql
19589    /// OPTIMIZE table_name [WHERE predicate] [ZORDER BY (col_name1 [, ...])]
19590    /// ```
19591    /// [Databricks](https://docs.databricks.com/en/sql/language-manual/delta-optimize.html)
19592    pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
19593        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
19594
19595        let name = self.parse_object_name(false)?;
19596
19597        // ClickHouse-specific options
19598        let on_cluster = self.parse_optional_on_cluster()?;
19599
19600        let partition = if self.parse_keyword(Keyword::PARTITION) {
19601            if self.parse_keyword(Keyword::ID) {
19602                Some(Partition::Identifier(self.parse_identifier()?))
19603            } else {
19604                Some(Partition::Expr(self.parse_expr()?))
19605            }
19606        } else {
19607            None
19608        };
19609
19610        let include_final = self.parse_keyword(Keyword::FINAL);
19611
19612        let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
19613            if self.parse_keyword(Keyword::BY) {
19614                Some(Deduplicate::ByExpression(self.parse_expr()?))
19615            } else {
19616                Some(Deduplicate::All)
19617            }
19618        } else {
19619            None
19620        };
19621
19622        // Databricks-specific options
19623        let predicate = if self.parse_keyword(Keyword::WHERE) {
19624            Some(self.parse_expr()?)
19625        } else {
19626            None
19627        };
19628
19629        let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
19630            self.expect_token(&Token::LParen)?;
19631            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
19632            self.expect_token(&Token::RParen)?;
19633            Some(columns)
19634        } else {
19635            None
19636        };
19637
19638        Ok(Statement::OptimizeTable {
19639            name,
19640            has_table_keyword,
19641            on_cluster,
19642            partition,
19643            include_final,
19644            deduplicate,
19645            predicate,
19646            zorder,
19647        })
19648    }
19649
19650    /// ```sql
19651    /// CREATE [ { TEMPORARY | TEMP } ] SEQUENCE [ IF NOT EXISTS ] <sequence_name>
19652    /// ```
19653    ///
19654    /// See [Postgres docs](https://www.postgresql.org/docs/current/sql-createsequence.html) for more details.
19655    pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
19656        //[ IF NOT EXISTS ]
19657        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19658        //name
19659        let name = self.parse_object_name(false)?;
19660        //[ AS data_type ]
19661        let mut data_type: Option<DataType> = None;
19662        if self.parse_keywords(&[Keyword::AS]) {
19663            data_type = Some(self.parse_data_type()?)
19664        }
19665        let sequence_options = self.parse_create_sequence_options()?;
19666        // [ OWNED BY { table_name.column_name | NONE } ]
19667        let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
19668            if self.parse_keywords(&[Keyword::NONE]) {
19669                Some(ObjectName::from(vec![Ident::new("NONE")]))
19670            } else {
19671                Some(self.parse_object_name(false)?)
19672            }
19673        } else {
19674            None
19675        };
19676        Ok(Statement::CreateSequence {
19677            temporary,
19678            if_not_exists,
19679            name,
19680            data_type,
19681            sequence_options,
19682            owned_by,
19683        })
19684    }
19685
19686    fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
19687        let mut sequence_options = vec![];
19688        //[ INCREMENT [ BY ] increment ]
19689        if self.parse_keywords(&[Keyword::INCREMENT]) {
19690            if self.parse_keywords(&[Keyword::BY]) {
19691                sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
19692            } else {
19693                sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
19694            }
19695        }
19696        //[ MINVALUE minvalue | NO MINVALUE ]
19697        if self.parse_keyword(Keyword::MINVALUE) {
19698            sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
19699        } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
19700            sequence_options.push(SequenceOptions::MinValue(None));
19701        }
19702        //[ MAXVALUE maxvalue | NO MAXVALUE ]
19703        if self.parse_keywords(&[Keyword::MAXVALUE]) {
19704            sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
19705        } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
19706            sequence_options.push(SequenceOptions::MaxValue(None));
19707        }
19708
19709        //[ START [ WITH ] start ]
19710        if self.parse_keywords(&[Keyword::START]) {
19711            if self.parse_keywords(&[Keyword::WITH]) {
19712                sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
19713            } else {
19714                sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
19715            }
19716        }
19717        //[ CACHE cache ]
19718        if self.parse_keywords(&[Keyword::CACHE]) {
19719            sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
19720        }
19721        // [ [ NO ] CYCLE ]
19722        if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
19723            sequence_options.push(SequenceOptions::Cycle(true));
19724        } else if self.parse_keywords(&[Keyword::CYCLE]) {
19725            sequence_options.push(SequenceOptions::Cycle(false));
19726        }
19727
19728        Ok(sequence_options)
19729    }
19730
19731    ///   Parse a `CREATE SERVER` statement.
19732    ///
19733    ///  See [Statement::CreateServer]
19734    pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
19735        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19736        let name = self.parse_object_name(false)?;
19737
19738        let server_type = if self.parse_keyword(Keyword::TYPE) {
19739            Some(self.parse_identifier()?)
19740        } else {
19741            None
19742        };
19743
19744        let version = if self.parse_keyword(Keyword::VERSION) {
19745            Some(self.parse_identifier()?)
19746        } else {
19747            None
19748        };
19749
19750        self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
19751        let foreign_data_wrapper = self.parse_object_name(false)?;
19752
19753        let mut options = None;
19754        if self.parse_keyword(Keyword::OPTIONS) {
19755            self.expect_token(&Token::LParen)?;
19756            options = Some(self.parse_comma_separated(|p| {
19757                let key = p.parse_identifier()?;
19758                let value = p.parse_identifier()?;
19759                Ok(CreateServerOption { key, value })
19760            })?);
19761            self.expect_token(&Token::RParen)?;
19762        }
19763
19764        Ok(Statement::CreateServer(CreateServerStatement {
19765            name,
19766            if_not_exists: ine,
19767            server_type,
19768            version,
19769            foreign_data_wrapper,
19770            options,
19771        }))
19772    }
19773
19774    /// The index of the first unprocessed token.
19775    pub fn index(&self) -> usize {
19776        self.index
19777    }
19778
19779    /// Parse a named window definition.
19780    pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
19781        let ident = self.parse_identifier()?;
19782        self.expect_keyword_is(Keyword::AS)?;
19783
19784        let window_expr = if self.consume_token(&Token::LParen) {
19785            NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
19786        } else if self.dialect.supports_window_clause_named_window_reference() {
19787            NamedWindowExpr::NamedWindow(self.parse_identifier()?)
19788        } else {
19789            return self.expected_ref("(", self.peek_token_ref());
19790        };
19791
19792        Ok(NamedWindowDefinition(ident, window_expr))
19793    }
19794
19795    /// Parse `CREATE PROCEDURE` statement.
19796    pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
19797        let name = self.parse_object_name(false)?;
19798        let params = self.parse_optional_procedure_parameters()?;
19799
19800        let language = if self.parse_keyword(Keyword::LANGUAGE) {
19801            Some(self.parse_identifier()?)
19802        } else {
19803            None
19804        };
19805
19806        self.expect_keyword_is(Keyword::AS)?;
19807
19808        let body = self.parse_conditional_statements(&[Keyword::END])?;
19809
19810        Ok(Statement::CreateProcedure {
19811            name,
19812            or_alter,
19813            params,
19814            language,
19815            body,
19816        })
19817    }
19818
19819    /// Parse a window specification.
19820    pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
19821        let window_name = match &self.peek_token_ref().token {
19822            Token::Word(word) if word.keyword == Keyword::NoKeyword => {
19823                self.parse_optional_ident()?
19824            }
19825            _ => None,
19826        };
19827
19828        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
19829            self.parse_comma_separated(Parser::parse_expr)?
19830        } else {
19831            vec![]
19832        };
19833        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
19834            self.parse_comma_separated(Parser::parse_order_by_expr)?
19835        } else {
19836            vec![]
19837        };
19838
19839        let window_frame = if !self.consume_token(&Token::RParen) {
19840            let window_frame = self.parse_window_frame()?;
19841            self.expect_token(&Token::RParen)?;
19842            Some(window_frame)
19843        } else {
19844            None
19845        };
19846        Ok(WindowSpec {
19847            window_name,
19848            partition_by,
19849            order_by,
19850            window_frame,
19851        })
19852    }
19853
19854    /// Parse `CREATE TYPE` statement.
19855    pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
19856        let name = self.parse_object_name(false)?;
19857
19858        // Check if we have AS keyword
19859        let has_as = self.parse_keyword(Keyword::AS);
19860
19861        if !has_as {
19862            // Two cases: CREATE TYPE name; or CREATE TYPE name (options);
19863            if self.consume_token(&Token::LParen) {
19864                // CREATE TYPE name (options) - SQL definition without AS
19865                let options = self.parse_create_type_sql_definition_options()?;
19866                self.expect_token(&Token::RParen)?;
19867                return Ok(Statement::CreateType {
19868                    name,
19869                    representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
19870                });
19871            }
19872
19873            // CREATE TYPE name; - no representation
19874            return Ok(Statement::CreateType {
19875                name,
19876                representation: None,
19877            });
19878        }
19879
19880        // We have AS keyword
19881        if self.parse_keyword(Keyword::ENUM) {
19882            // CREATE TYPE name AS ENUM (labels)
19883            self.parse_create_type_enum(name)
19884        } else if self.parse_keyword(Keyword::RANGE) {
19885            // CREATE TYPE name AS RANGE (options)
19886            self.parse_create_type_range(name)
19887        } else if self.consume_token(&Token::LParen) {
19888            // CREATE TYPE name AS (attributes) - Composite
19889            self.parse_create_type_composite(name)
19890        } else {
19891            self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
19892        }
19893    }
19894
19895    /// Parse remainder of `CREATE TYPE AS (attributes)` statement (composite type)
19896    ///
19897    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
19898    fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
19899        if self.consume_token(&Token::RParen) {
19900            // Empty composite type
19901            return Ok(Statement::CreateType {
19902                name,
19903                representation: Some(UserDefinedTypeRepresentation::Composite {
19904                    attributes: vec![],
19905                }),
19906            });
19907        }
19908
19909        let mut attributes = vec![];
19910        loop {
19911            let attr_name = self.parse_identifier()?;
19912            let attr_data_type = self.parse_data_type()?;
19913            let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
19914                Some(self.parse_object_name(false)?)
19915            } else {
19916                None
19917            };
19918            attributes.push(UserDefinedTypeCompositeAttributeDef {
19919                name: attr_name,
19920                data_type: attr_data_type,
19921                collation: attr_collation,
19922            });
19923
19924            if !self.consume_token(&Token::Comma) {
19925                break;
19926            }
19927        }
19928        self.expect_token(&Token::RParen)?;
19929
19930        Ok(Statement::CreateType {
19931            name,
19932            representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
19933        })
19934    }
19935
19936    /// Parse remainder of `CREATE TYPE AS ENUM` statement (see [Statement::CreateType] and [Self::parse_create_type])
19937    ///
19938    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
19939    pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
19940        self.expect_token(&Token::LParen)?;
19941        let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
19942        self.expect_token(&Token::RParen)?;
19943
19944        Ok(Statement::CreateType {
19945            name,
19946            representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
19947        })
19948    }
19949
19950    /// Parse remainder of `CREATE TYPE AS RANGE` statement
19951    ///
19952    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
19953    fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
19954        self.expect_token(&Token::LParen)?;
19955        let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
19956        self.expect_token(&Token::RParen)?;
19957
19958        Ok(Statement::CreateType {
19959            name,
19960            representation: Some(UserDefinedTypeRepresentation::Range { options }),
19961        })
19962    }
19963
19964    /// Parse a single range option for a `CREATE TYPE AS RANGE` statement
19965    fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
19966        let keyword = self.parse_one_of_keywords(&[
19967            Keyword::SUBTYPE,
19968            Keyword::SUBTYPE_OPCLASS,
19969            Keyword::COLLATION,
19970            Keyword::CANONICAL,
19971            Keyword::SUBTYPE_DIFF,
19972            Keyword::MULTIRANGE_TYPE_NAME,
19973        ]);
19974
19975        match keyword {
19976            Some(Keyword::SUBTYPE) => {
19977                self.expect_token(&Token::Eq)?;
19978                let data_type = self.parse_data_type()?;
19979                Ok(UserDefinedTypeRangeOption::Subtype(data_type))
19980            }
19981            Some(Keyword::SUBTYPE_OPCLASS) => {
19982                self.expect_token(&Token::Eq)?;
19983                let name = self.parse_object_name(false)?;
19984                Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
19985            }
19986            Some(Keyword::COLLATION) => {
19987                self.expect_token(&Token::Eq)?;
19988                let name = self.parse_object_name(false)?;
19989                Ok(UserDefinedTypeRangeOption::Collation(name))
19990            }
19991            Some(Keyword::CANONICAL) => {
19992                self.expect_token(&Token::Eq)?;
19993                let name = self.parse_object_name(false)?;
19994                Ok(UserDefinedTypeRangeOption::Canonical(name))
19995            }
19996            Some(Keyword::SUBTYPE_DIFF) => {
19997                self.expect_token(&Token::Eq)?;
19998                let name = self.parse_object_name(false)?;
19999                Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20000            }
20001            Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20002                self.expect_token(&Token::Eq)?;
20003                let name = self.parse_object_name(false)?;
20004                Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20005            }
20006            _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20007        }
20008    }
20009
20010    /// Parse SQL definition options for CREATE TYPE (options)
20011    fn parse_create_type_sql_definition_options(
20012        &mut self,
20013    ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20014        self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20015    }
20016
20017    /// Parse a single SQL definition option for CREATE TYPE (options)
20018    fn parse_sql_definition_option(
20019        &mut self,
20020    ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20021        let keyword = self.parse_one_of_keywords(&[
20022            Keyword::INPUT,
20023            Keyword::OUTPUT,
20024            Keyword::RECEIVE,
20025            Keyword::SEND,
20026            Keyword::TYPMOD_IN,
20027            Keyword::TYPMOD_OUT,
20028            Keyword::ANALYZE,
20029            Keyword::SUBSCRIPT,
20030            Keyword::INTERNALLENGTH,
20031            Keyword::PASSEDBYVALUE,
20032            Keyword::ALIGNMENT,
20033            Keyword::STORAGE,
20034            Keyword::LIKE,
20035            Keyword::CATEGORY,
20036            Keyword::PREFERRED,
20037            Keyword::DEFAULT,
20038            Keyword::ELEMENT,
20039            Keyword::DELIMITER,
20040            Keyword::COLLATABLE,
20041        ]);
20042
20043        match keyword {
20044            Some(Keyword::INPUT) => {
20045                self.expect_token(&Token::Eq)?;
20046                let name = self.parse_object_name(false)?;
20047                Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20048            }
20049            Some(Keyword::OUTPUT) => {
20050                self.expect_token(&Token::Eq)?;
20051                let name = self.parse_object_name(false)?;
20052                Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20053            }
20054            Some(Keyword::RECEIVE) => {
20055                self.expect_token(&Token::Eq)?;
20056                let name = self.parse_object_name(false)?;
20057                Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20058            }
20059            Some(Keyword::SEND) => {
20060                self.expect_token(&Token::Eq)?;
20061                let name = self.parse_object_name(false)?;
20062                Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20063            }
20064            Some(Keyword::TYPMOD_IN) => {
20065                self.expect_token(&Token::Eq)?;
20066                let name = self.parse_object_name(false)?;
20067                Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20068            }
20069            Some(Keyword::TYPMOD_OUT) => {
20070                self.expect_token(&Token::Eq)?;
20071                let name = self.parse_object_name(false)?;
20072                Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20073            }
20074            Some(Keyword::ANALYZE) => {
20075                self.expect_token(&Token::Eq)?;
20076                let name = self.parse_object_name(false)?;
20077                Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20078            }
20079            Some(Keyword::SUBSCRIPT) => {
20080                self.expect_token(&Token::Eq)?;
20081                let name = self.parse_object_name(false)?;
20082                Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20083            }
20084            Some(Keyword::INTERNALLENGTH) => {
20085                self.expect_token(&Token::Eq)?;
20086                if self.parse_keyword(Keyword::VARIABLE) {
20087                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20088                        UserDefinedTypeInternalLength::Variable,
20089                    ))
20090                } else {
20091                    let value = self.parse_literal_uint()?;
20092                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20093                        UserDefinedTypeInternalLength::Fixed(value),
20094                    ))
20095                }
20096            }
20097            Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20098            Some(Keyword::ALIGNMENT) => {
20099                self.expect_token(&Token::Eq)?;
20100                let align_keyword = self.parse_one_of_keywords(&[
20101                    Keyword::CHAR,
20102                    Keyword::INT2,
20103                    Keyword::INT4,
20104                    Keyword::DOUBLE,
20105                ]);
20106                match align_keyword {
20107                    Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20108                        Alignment::Char,
20109                    )),
20110                    Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20111                        Alignment::Int2,
20112                    )),
20113                    Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20114                        Alignment::Int4,
20115                    )),
20116                    Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20117                        Alignment::Double,
20118                    )),
20119                    _ => self.expected_ref(
20120                        "alignment value (char, int2, int4, or double)",
20121                        self.peek_token_ref(),
20122                    ),
20123                }
20124            }
20125            Some(Keyword::STORAGE) => {
20126                self.expect_token(&Token::Eq)?;
20127                let storage_keyword = self.parse_one_of_keywords(&[
20128                    Keyword::PLAIN,
20129                    Keyword::EXTERNAL,
20130                    Keyword::EXTENDED,
20131                    Keyword::MAIN,
20132                ]);
20133                match storage_keyword {
20134                    Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20135                        UserDefinedTypeStorage::Plain,
20136                    )),
20137                    Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20138                        UserDefinedTypeStorage::External,
20139                    )),
20140                    Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20141                        UserDefinedTypeStorage::Extended,
20142                    )),
20143                    Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20144                        UserDefinedTypeStorage::Main,
20145                    )),
20146                    _ => self.expected_ref(
20147                        "storage value (plain, external, extended, or main)",
20148                        self.peek_token_ref(),
20149                    ),
20150                }
20151            }
20152            Some(Keyword::LIKE) => {
20153                self.expect_token(&Token::Eq)?;
20154                let name = self.parse_object_name(false)?;
20155                Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20156            }
20157            Some(Keyword::CATEGORY) => {
20158                self.expect_token(&Token::Eq)?;
20159                let category_str = self.parse_literal_string()?;
20160                let category_char = category_str.chars().next().ok_or_else(|| {
20161                    ParserError::ParserError(
20162                        "CATEGORY value must be a single character".to_string(),
20163                    )
20164                })?;
20165                Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20166            }
20167            Some(Keyword::PREFERRED) => {
20168                self.expect_token(&Token::Eq)?;
20169                let value =
20170                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20171                Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20172            }
20173            Some(Keyword::DEFAULT) => {
20174                self.expect_token(&Token::Eq)?;
20175                let expr = self.parse_expr()?;
20176                Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20177            }
20178            Some(Keyword::ELEMENT) => {
20179                self.expect_token(&Token::Eq)?;
20180                let data_type = self.parse_data_type()?;
20181                Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20182            }
20183            Some(Keyword::DELIMITER) => {
20184                self.expect_token(&Token::Eq)?;
20185                let delimiter = self.parse_literal_string()?;
20186                Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20187            }
20188            Some(Keyword::COLLATABLE) => {
20189                self.expect_token(&Token::Eq)?;
20190                let value =
20191                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20192                Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20193            }
20194            _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20195        }
20196    }
20197
20198    fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20199        self.expect_token(&Token::LParen)?;
20200        let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20201        self.expect_token(&Token::RParen)?;
20202        Ok(idents)
20203    }
20204
20205    fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20206        if dialect_of!(self is MySqlDialect | GenericDialect) {
20207            if self.parse_keyword(Keyword::FIRST) {
20208                Ok(Some(MySQLColumnPosition::First))
20209            } else if self.parse_keyword(Keyword::AFTER) {
20210                let ident = self.parse_identifier()?;
20211                Ok(Some(MySQLColumnPosition::After(ident)))
20212            } else {
20213                Ok(None)
20214            }
20215        } else {
20216            Ok(None)
20217        }
20218    }
20219
20220    /// Parse [Statement::Print]
20221    fn parse_print(&mut self) -> Result<Statement, ParserError> {
20222        Ok(Statement::Print(PrintStatement {
20223            message: Box::new(self.parse_expr()?),
20224        }))
20225    }
20226
20227    /// Parse [Statement::WaitFor]
20228    ///
20229    /// See: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/waitfor-transact-sql>
20230    fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20231        let wait_type = if self.parse_keyword(Keyword::DELAY) {
20232            WaitForType::Delay
20233        } else if self.parse_keyword(Keyword::TIME) {
20234            WaitForType::Time
20235        } else {
20236            return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20237        };
20238        let expr = self.parse_expr()?;
20239        Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20240    }
20241
20242    /// Parse [Statement::Return]
20243    fn parse_return(&mut self) -> Result<Statement, ParserError> {
20244        match self.maybe_parse(|p| p.parse_expr())? {
20245            Some(expr) => Ok(Statement::Return(ReturnStatement {
20246                value: Some(ReturnStatementValue::Expr(expr)),
20247            })),
20248            None => Ok(Statement::Return(ReturnStatement { value: None })),
20249        }
20250    }
20251
20252    /// /// Parse a `EXPORT DATA` statement.
20253    ///
20254    /// See [Statement::ExportData]
20255    fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20256        self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20257
20258        let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20259            Some(self.parse_object_name(false)?)
20260        } else {
20261            None
20262        };
20263        self.expect_keyword(Keyword::OPTIONS)?;
20264        self.expect_token(&Token::LParen)?;
20265        let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20266        self.expect_token(&Token::RParen)?;
20267        self.expect_keyword(Keyword::AS)?;
20268        let query = self.parse_query()?;
20269        Ok(Statement::ExportData(ExportData {
20270            options,
20271            query,
20272            connection,
20273        }))
20274    }
20275
20276    fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20277        self.expect_keyword(Keyword::VACUUM)?;
20278        let full = self.parse_keyword(Keyword::FULL);
20279        let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20280        let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20281        let reindex = self.parse_keyword(Keyword::REINDEX);
20282        let recluster = self.parse_keyword(Keyword::RECLUSTER);
20283        let (table_name, threshold, boost) =
20284            match self.maybe_parse(|p| p.parse_object_name(false))? {
20285                Some(table_name) => {
20286                    let threshold = if self.parse_keyword(Keyword::TO) {
20287                        let value = self.parse_value()?;
20288                        self.expect_keyword(Keyword::PERCENT)?;
20289                        Some(value)
20290                    } else {
20291                        None
20292                    };
20293                    let boost = self.parse_keyword(Keyword::BOOST);
20294                    (Some(table_name), threshold, boost)
20295                }
20296                _ => (None, None, false),
20297            };
20298        Ok(Statement::Vacuum(VacuumStatement {
20299            full,
20300            sort_only,
20301            delete_only,
20302            reindex,
20303            recluster,
20304            table_name,
20305            threshold,
20306            boost,
20307        }))
20308    }
20309
20310    /// Consume the parser and return its underlying token buffer
20311    pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20312        self.tokens
20313    }
20314
20315    /// Returns true if the next keyword indicates a sub query, i.e. SELECT or WITH
20316    fn peek_sub_query(&mut self) -> bool {
20317        self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20318            .is_some()
20319    }
20320
20321    pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20322        let show_in;
20323        let mut filter_position = None;
20324        if self.dialect.supports_show_like_before_in() {
20325            if let Some(filter) = self.parse_show_statement_filter()? {
20326                filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20327            }
20328            show_in = self.maybe_parse_show_stmt_in()?;
20329        } else {
20330            show_in = self.maybe_parse_show_stmt_in()?;
20331            if let Some(filter) = self.parse_show_statement_filter()? {
20332                filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20333            }
20334        }
20335        let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20336        let limit = self.maybe_parse_show_stmt_limit()?;
20337        let from = self.maybe_parse_show_stmt_from()?;
20338        Ok(ShowStatementOptions {
20339            filter_position,
20340            show_in,
20341            starts_with,
20342            limit,
20343            limit_from: from,
20344        })
20345    }
20346
20347    fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
20348        let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
20349            Some(Keyword::FROM) => ShowStatementInClause::FROM,
20350            Some(Keyword::IN) => ShowStatementInClause::IN,
20351            None => return Ok(None),
20352            _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
20353        };
20354
20355        let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
20356            Keyword::ACCOUNT,
20357            Keyword::DATABASE,
20358            Keyword::SCHEMA,
20359            Keyword::TABLE,
20360            Keyword::VIEW,
20361        ]) {
20362            // If we see these next keywords it means we don't have a parent name
20363            Some(Keyword::DATABASE)
20364                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20365                    | self.peek_keyword(Keyword::LIMIT) =>
20366            {
20367                (Some(ShowStatementInParentType::Database), None)
20368            }
20369            Some(Keyword::SCHEMA)
20370                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20371                    | self.peek_keyword(Keyword::LIMIT) =>
20372            {
20373                (Some(ShowStatementInParentType::Schema), None)
20374            }
20375            Some(parent_kw) => {
20376                // The parent name here is still optional, for example:
20377                // SHOW TABLES IN ACCOUNT, so parsing the object name
20378                // may fail because the statement ends.
20379                let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
20380                match parent_kw {
20381                    Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
20382                    Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
20383                    Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
20384                    Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
20385                    Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
20386                    _ => {
20387                        return self.expected_ref(
20388                            "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
20389                            self.peek_token_ref(),
20390                        )
20391                    }
20392                }
20393            }
20394            None => {
20395                // Parsing MySQL style FROM tbl_name FROM db_name
20396                // which is equivalent to FROM tbl_name.db_name
20397                let mut parent_name = self.parse_object_name(false)?;
20398                if self
20399                    .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
20400                    .is_some()
20401                {
20402                    parent_name
20403                        .0
20404                        .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
20405                }
20406                (None, Some(parent_name))
20407            }
20408        };
20409
20410        Ok(Some(ShowStatementIn {
20411            clause,
20412            parent_type,
20413            parent_name,
20414        }))
20415    }
20416
20417    fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20418        if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
20419            Ok(Some(self.parse_value()?))
20420        } else {
20421            Ok(None)
20422        }
20423    }
20424
20425    fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
20426        if self.parse_keyword(Keyword::LIMIT) {
20427            Ok(self.parse_limit()?)
20428        } else {
20429            Ok(None)
20430        }
20431    }
20432
20433    fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20434        if self.parse_keyword(Keyword::FROM) {
20435            Ok(Some(self.parse_value()?))
20436        } else {
20437            Ok(None)
20438        }
20439    }
20440
20441    pub(crate) fn in_column_definition_state(&self) -> bool {
20442        matches!(self.state, ColumnDefinition)
20443    }
20444
20445    /// Parses options provided in key-value format.
20446    ///
20447    /// * `parenthesized` - true if the options are enclosed in parenthesis
20448    /// * `end_words` - a list of keywords that any of them indicates the end of the options section
20449    pub(crate) fn parse_key_value_options(
20450        &mut self,
20451        parenthesized: bool,
20452        end_words: &[Keyword],
20453    ) -> Result<KeyValueOptions, ParserError> {
20454        let mut options: Vec<KeyValueOption> = Vec::new();
20455        let mut delimiter = KeyValueOptionsDelimiter::Space;
20456        if parenthesized {
20457            self.expect_token(&Token::LParen)?;
20458        }
20459        loop {
20460            match self.next_token().token {
20461                Token::RParen => {
20462                    if parenthesized {
20463                        break;
20464                    } else {
20465                        return self.expected_ref(" another option or EOF", self.peek_token_ref());
20466                    }
20467                }
20468                Token::EOF | Token::SemiColon => break,
20469                Token::Comma => {
20470                    delimiter = KeyValueOptionsDelimiter::Comma;
20471                    continue;
20472                }
20473                Token::Word(w) if !end_words.contains(&w.keyword) => {
20474                    options.push(self.parse_key_value_option(&w)?)
20475                }
20476                Token::Word(w) if end_words.contains(&w.keyword) => {
20477                    self.prev_token();
20478                    break;
20479                }
20480                _ => {
20481                    return self.expected_ref(
20482                        "another option, EOF, SemiColon, Comma or ')'",
20483                        self.peek_token_ref(),
20484                    )
20485                }
20486            };
20487        }
20488
20489        Ok(KeyValueOptions { delimiter, options })
20490    }
20491
20492    /// Parses a `KEY = VALUE` construct based on the specified key
20493    pub(crate) fn parse_key_value_option(
20494        &mut self,
20495        key: &Word,
20496    ) -> Result<KeyValueOption, ParserError> {
20497        self.expect_token(&Token::Eq)?;
20498        let peeked_token = self.peek_token();
20499        match peeked_token.token {
20500            Token::SingleQuotedString(_) => Ok(KeyValueOption {
20501                option_name: key.value.clone(),
20502                option_value: KeyValueOptionKind::Single(self.parse_value()?),
20503            }),
20504            Token::Word(word)
20505                if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
20506            {
20507                Ok(KeyValueOption {
20508                    option_name: key.value.clone(),
20509                    option_value: KeyValueOptionKind::Single(self.parse_value()?),
20510                })
20511            }
20512            Token::Number(..) => Ok(KeyValueOption {
20513                option_name: key.value.clone(),
20514                option_value: KeyValueOptionKind::Single(self.parse_value()?),
20515            }),
20516            Token::Word(word) => {
20517                self.next_token();
20518                Ok(KeyValueOption {
20519                    option_name: key.value.clone(),
20520                    option_value: KeyValueOptionKind::Single(
20521                        Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
20522                    ),
20523                })
20524            }
20525            Token::LParen => {
20526                // Can be a list of values or a list of key value properties.
20527                // Try to parse a list of values and if that fails, try to parse
20528                // a list of key-value properties.
20529                match self.maybe_parse(|parser| {
20530                    parser.expect_token(&Token::LParen)?;
20531                    let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
20532                    parser.expect_token(&Token::RParen)?;
20533                    values
20534                })? {
20535                    Some(values) => Ok(KeyValueOption {
20536                        option_name: key.value.clone(),
20537                        option_value: KeyValueOptionKind::Multi(values),
20538                    }),
20539                    None => Ok(KeyValueOption {
20540                        option_name: key.value.clone(),
20541                        option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
20542                            self.parse_key_value_options(true, &[])?,
20543                        )),
20544                    }),
20545                }
20546            }
20547            _ => self.expected_ref("expected option value", self.peek_token_ref()),
20548        }
20549    }
20550
20551    /// Parses a RESET statement
20552    fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
20553        if self.parse_keyword(Keyword::ALL) {
20554            return Ok(ResetStatement { reset: Reset::ALL });
20555        }
20556
20557        let obj = self.parse_object_name(false)?;
20558        Ok(ResetStatement {
20559            reset: Reset::ConfigurationParameter(obj),
20560        })
20561    }
20562}
20563
20564fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
20565    if let Some(prefix) = prefix {
20566        Expr::Prefixed {
20567            prefix,
20568            value: Box::new(expr),
20569        }
20570    } else {
20571        expr
20572    }
20573}
20574
20575impl Word {
20576    /// Convert a reference to this word into an [`Ident`] by cloning the value.
20577    ///
20578    /// Use this method when you need to keep the original `Word` around.
20579    /// If you can consume the `Word`, prefer [`into_ident`](Self::into_ident) instead
20580    /// to avoid cloning.
20581    pub fn to_ident(&self, span: Span) -> Ident {
20582        Ident {
20583            value: self.value.clone(),
20584            quote_style: self.quote_style,
20585            span,
20586        }
20587    }
20588
20589    /// Convert this word into an [`Ident`] identifier, consuming the `Word`.
20590    ///
20591    /// This avoids cloning the string value. If you need to keep the original
20592    /// `Word`, use [`to_ident`](Self::to_ident) instead.
20593    pub fn into_ident(self, span: Span) -> Ident {
20594        Ident {
20595            value: self.value,
20596            quote_style: self.quote_style,
20597            span,
20598        }
20599    }
20600}
20601
20602#[cfg(test)]
20603mod tests {
20604    use crate::test_utils::{all_dialects, TestedDialects};
20605
20606    use super::*;
20607
20608    #[test]
20609    fn test_prev_index() {
20610        let sql = "SELECT version";
20611        all_dialects().run_parser_method(sql, |parser| {
20612            assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
20613            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20614            parser.prev_token();
20615            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20616            assert_eq!(parser.next_token(), Token::make_word("version", None));
20617            parser.prev_token();
20618            assert_eq!(parser.peek_token(), Token::make_word("version", None));
20619            assert_eq!(parser.next_token(), Token::make_word("version", None));
20620            assert_eq!(parser.peek_token(), Token::EOF);
20621            parser.prev_token();
20622            assert_eq!(parser.next_token(), Token::make_word("version", None));
20623            assert_eq!(parser.next_token(), Token::EOF);
20624            assert_eq!(parser.next_token(), Token::EOF);
20625            parser.prev_token();
20626        });
20627    }
20628
20629    #[test]
20630    fn test_peek_tokens() {
20631        all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
20632            assert!(matches!(
20633                parser.peek_tokens(),
20634                [Token::Word(Word {
20635                    keyword: Keyword::SELECT,
20636                    ..
20637                })]
20638            ));
20639
20640            assert!(matches!(
20641                parser.peek_tokens(),
20642                [
20643                    Token::Word(Word {
20644                        keyword: Keyword::SELECT,
20645                        ..
20646                    }),
20647                    Token::Word(_),
20648                    Token::Word(Word {
20649                        keyword: Keyword::AS,
20650                        ..
20651                    }),
20652                ]
20653            ));
20654
20655            for _ in 0..4 {
20656                parser.next_token();
20657            }
20658
20659            assert!(matches!(
20660                parser.peek_tokens(),
20661                [
20662                    Token::Word(Word {
20663                        keyword: Keyword::FROM,
20664                        ..
20665                    }),
20666                    Token::Word(_),
20667                    Token::EOF,
20668                    Token::EOF,
20669                ]
20670            ))
20671        })
20672    }
20673
20674    #[cfg(test)]
20675    mod test_parse_data_type {
20676        use crate::ast::{
20677            CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
20678        };
20679        use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
20680        use crate::test_utils::TestedDialects;
20681
20682        macro_rules! test_parse_data_type {
20683            ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
20684                $dialect.run_parser_method(&*$input, |parser| {
20685                    let data_type = parser.parse_data_type().unwrap();
20686                    assert_eq!($expected_type, data_type);
20687                    assert_eq!($input.to_string(), data_type.to_string());
20688                });
20689            }};
20690        }
20691
20692        #[test]
20693        fn test_ansii_character_string_types() {
20694            // Character string types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-string-type>
20695            let dialect =
20696                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20697
20698            test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
20699
20700            test_parse_data_type!(
20701                dialect,
20702                "CHARACTER(20)",
20703                DataType::Character(Some(CharacterLength::IntegerLength {
20704                    length: 20,
20705                    unit: None
20706                }))
20707            );
20708
20709            test_parse_data_type!(
20710                dialect,
20711                "CHARACTER(20 CHARACTERS)",
20712                DataType::Character(Some(CharacterLength::IntegerLength {
20713                    length: 20,
20714                    unit: Some(CharLengthUnits::Characters)
20715                }))
20716            );
20717
20718            test_parse_data_type!(
20719                dialect,
20720                "CHARACTER(20 OCTETS)",
20721                DataType::Character(Some(CharacterLength::IntegerLength {
20722                    length: 20,
20723                    unit: Some(CharLengthUnits::Octets)
20724                }))
20725            );
20726
20727            test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
20728
20729            test_parse_data_type!(
20730                dialect,
20731                "CHAR(20)",
20732                DataType::Char(Some(CharacterLength::IntegerLength {
20733                    length: 20,
20734                    unit: None
20735                }))
20736            );
20737
20738            test_parse_data_type!(
20739                dialect,
20740                "CHAR(20 CHARACTERS)",
20741                DataType::Char(Some(CharacterLength::IntegerLength {
20742                    length: 20,
20743                    unit: Some(CharLengthUnits::Characters)
20744                }))
20745            );
20746
20747            test_parse_data_type!(
20748                dialect,
20749                "CHAR(20 OCTETS)",
20750                DataType::Char(Some(CharacterLength::IntegerLength {
20751                    length: 20,
20752                    unit: Some(CharLengthUnits::Octets)
20753                }))
20754            );
20755
20756            test_parse_data_type!(
20757                dialect,
20758                "CHARACTER VARYING(20)",
20759                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20760                    length: 20,
20761                    unit: None
20762                }))
20763            );
20764
20765            test_parse_data_type!(
20766                dialect,
20767                "CHARACTER VARYING(20 CHARACTERS)",
20768                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20769                    length: 20,
20770                    unit: Some(CharLengthUnits::Characters)
20771                }))
20772            );
20773
20774            test_parse_data_type!(
20775                dialect,
20776                "CHARACTER VARYING(20 OCTETS)",
20777                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20778                    length: 20,
20779                    unit: Some(CharLengthUnits::Octets)
20780                }))
20781            );
20782
20783            test_parse_data_type!(
20784                dialect,
20785                "CHAR VARYING(20)",
20786                DataType::CharVarying(Some(CharacterLength::IntegerLength {
20787                    length: 20,
20788                    unit: None
20789                }))
20790            );
20791
20792            test_parse_data_type!(
20793                dialect,
20794                "CHAR VARYING(20 CHARACTERS)",
20795                DataType::CharVarying(Some(CharacterLength::IntegerLength {
20796                    length: 20,
20797                    unit: Some(CharLengthUnits::Characters)
20798                }))
20799            );
20800
20801            test_parse_data_type!(
20802                dialect,
20803                "CHAR VARYING(20 OCTETS)",
20804                DataType::CharVarying(Some(CharacterLength::IntegerLength {
20805                    length: 20,
20806                    unit: Some(CharLengthUnits::Octets)
20807                }))
20808            );
20809
20810            test_parse_data_type!(
20811                dialect,
20812                "VARCHAR(20)",
20813                DataType::Varchar(Some(CharacterLength::IntegerLength {
20814                    length: 20,
20815                    unit: None
20816                }))
20817            );
20818        }
20819
20820        #[test]
20821        fn test_ansii_character_large_object_types() {
20822            // Character large object types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-length>
20823            let dialect =
20824                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20825
20826            test_parse_data_type!(
20827                dialect,
20828                "CHARACTER LARGE OBJECT",
20829                DataType::CharacterLargeObject(None)
20830            );
20831            test_parse_data_type!(
20832                dialect,
20833                "CHARACTER LARGE OBJECT(20)",
20834                DataType::CharacterLargeObject(Some(20))
20835            );
20836
20837            test_parse_data_type!(
20838                dialect,
20839                "CHAR LARGE OBJECT",
20840                DataType::CharLargeObject(None)
20841            );
20842            test_parse_data_type!(
20843                dialect,
20844                "CHAR LARGE OBJECT(20)",
20845                DataType::CharLargeObject(Some(20))
20846            );
20847
20848            test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
20849            test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
20850        }
20851
20852        #[test]
20853        fn test_parse_custom_types() {
20854            let dialect =
20855                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20856
20857            test_parse_data_type!(
20858                dialect,
20859                "GEOMETRY",
20860                DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
20861            );
20862
20863            test_parse_data_type!(
20864                dialect,
20865                "GEOMETRY(POINT)",
20866                DataType::Custom(
20867                    ObjectName::from(vec!["GEOMETRY".into()]),
20868                    vec!["POINT".to_string()]
20869                )
20870            );
20871
20872            test_parse_data_type!(
20873                dialect,
20874                "GEOMETRY(POINT, 4326)",
20875                DataType::Custom(
20876                    ObjectName::from(vec!["GEOMETRY".into()]),
20877                    vec!["POINT".to_string(), "4326".to_string()]
20878                )
20879            );
20880        }
20881
20882        #[test]
20883        fn test_ansii_exact_numeric_types() {
20884            // Exact numeric types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type>
20885            let dialect = TestedDialects::new(vec![
20886                Box::new(GenericDialect {}),
20887                Box::new(AnsiDialect {}),
20888                Box::new(PostgreSqlDialect {}),
20889            ]);
20890
20891            test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
20892
20893            test_parse_data_type!(
20894                dialect,
20895                "NUMERIC(2)",
20896                DataType::Numeric(ExactNumberInfo::Precision(2))
20897            );
20898
20899            test_parse_data_type!(
20900                dialect,
20901                "NUMERIC(2,10)",
20902                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
20903            );
20904
20905            test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
20906
20907            test_parse_data_type!(
20908                dialect,
20909                "DECIMAL(2)",
20910                DataType::Decimal(ExactNumberInfo::Precision(2))
20911            );
20912
20913            test_parse_data_type!(
20914                dialect,
20915                "DECIMAL(2,10)",
20916                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
20917            );
20918
20919            test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
20920
20921            test_parse_data_type!(
20922                dialect,
20923                "DEC(2)",
20924                DataType::Dec(ExactNumberInfo::Precision(2))
20925            );
20926
20927            test_parse_data_type!(
20928                dialect,
20929                "DEC(2,10)",
20930                DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
20931            );
20932
20933            // Test negative scale values.
20934            test_parse_data_type!(
20935                dialect,
20936                "NUMERIC(10,-2)",
20937                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
20938            );
20939
20940            test_parse_data_type!(
20941                dialect,
20942                "DECIMAL(1000,-10)",
20943                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
20944            );
20945
20946            test_parse_data_type!(
20947                dialect,
20948                "DEC(5,-1000)",
20949                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
20950            );
20951
20952            test_parse_data_type!(
20953                dialect,
20954                "NUMERIC(10,-5)",
20955                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
20956            );
20957
20958            test_parse_data_type!(
20959                dialect,
20960                "DECIMAL(20,-10)",
20961                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
20962            );
20963
20964            test_parse_data_type!(
20965                dialect,
20966                "DEC(5,-2)",
20967                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
20968            );
20969
20970            dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
20971                let data_type = parser.parse_data_type().unwrap();
20972                assert_eq!(
20973                    DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
20974                    data_type
20975                );
20976                // Note: Explicit '+' sign is not preserved in output, which is correct
20977                assert_eq!("NUMERIC(10,5)", data_type.to_string());
20978            });
20979        }
20980
20981        #[test]
20982        fn test_ansii_date_type() {
20983            // Datetime types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type>
20984            let dialect =
20985                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20986
20987            test_parse_data_type!(dialect, "DATE", DataType::Date);
20988
20989            test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
20990
20991            test_parse_data_type!(
20992                dialect,
20993                "TIME(6)",
20994                DataType::Time(Some(6), TimezoneInfo::None)
20995            );
20996
20997            test_parse_data_type!(
20998                dialect,
20999                "TIME WITH TIME ZONE",
21000                DataType::Time(None, TimezoneInfo::WithTimeZone)
21001            );
21002
21003            test_parse_data_type!(
21004                dialect,
21005                "TIME(6) WITH TIME ZONE",
21006                DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21007            );
21008
21009            test_parse_data_type!(
21010                dialect,
21011                "TIME WITHOUT TIME ZONE",
21012                DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21013            );
21014
21015            test_parse_data_type!(
21016                dialect,
21017                "TIME(6) WITHOUT TIME ZONE",
21018                DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21019            );
21020
21021            test_parse_data_type!(
21022                dialect,
21023                "TIMESTAMP",
21024                DataType::Timestamp(None, TimezoneInfo::None)
21025            );
21026
21027            test_parse_data_type!(
21028                dialect,
21029                "TIMESTAMP(22)",
21030                DataType::Timestamp(Some(22), TimezoneInfo::None)
21031            );
21032
21033            test_parse_data_type!(
21034                dialect,
21035                "TIMESTAMP(22) WITH TIME ZONE",
21036                DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21037            );
21038
21039            test_parse_data_type!(
21040                dialect,
21041                "TIMESTAMP(33) WITHOUT TIME ZONE",
21042                DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21043            );
21044        }
21045    }
21046
21047    #[test]
21048    fn test_parse_schema_name() {
21049        // The expected name should be identical as the input name, that's why I don't receive both
21050        macro_rules! test_parse_schema_name {
21051            ($input:expr, $expected_name:expr $(,)?) => {{
21052                all_dialects().run_parser_method(&*$input, |parser| {
21053                    let schema_name = parser.parse_schema_name().unwrap();
21054                    // Validate that the structure is the same as expected
21055                    assert_eq!(schema_name, $expected_name);
21056                    // Validate that the input and the expected structure serialization are the same
21057                    assert_eq!(schema_name.to_string(), $input.to_string());
21058                });
21059            }};
21060        }
21061
21062        let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21063        let dummy_authorization = Ident::new("dummy_authorization");
21064
21065        test_parse_schema_name!(
21066            format!("{dummy_name}"),
21067            SchemaName::Simple(dummy_name.clone())
21068        );
21069
21070        test_parse_schema_name!(
21071            format!("AUTHORIZATION {dummy_authorization}"),
21072            SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21073        );
21074        test_parse_schema_name!(
21075            format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21076            SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21077        );
21078    }
21079
21080    #[test]
21081    fn mysql_parse_index_table_constraint() {
21082        macro_rules! test_parse_table_constraint {
21083            ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21084                $dialect.run_parser_method(&*$input, |parser| {
21085                    let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21086                    // Validate that the structure is the same as expected
21087                    assert_eq!(constraint, $expected);
21088                    // Validate that the input and the expected structure serialization are the same
21089                    assert_eq!(constraint.to_string(), $input.to_string());
21090                });
21091            }};
21092        }
21093
21094        fn mk_expected_col(name: &str) -> IndexColumn {
21095            IndexColumn {
21096                column: OrderByExpr {
21097                    expr: Expr::Identifier(name.into()),
21098                    options: OrderByOptions {
21099                        asc: None,
21100                        nulls_first: None,
21101                    },
21102                    with_fill: None,
21103                },
21104                operator_class: None,
21105            }
21106        }
21107
21108        let dialect =
21109            TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21110
21111        test_parse_table_constraint!(
21112            dialect,
21113            "INDEX (c1)",
21114            IndexConstraint {
21115                display_as_key: false,
21116                name: None,
21117                index_type: None,
21118                columns: vec![mk_expected_col("c1")],
21119                index_options: vec![],
21120            }
21121            .into()
21122        );
21123
21124        test_parse_table_constraint!(
21125            dialect,
21126            "KEY (c1)",
21127            IndexConstraint {
21128                display_as_key: true,
21129                name: None,
21130                index_type: None,
21131                columns: vec![mk_expected_col("c1")],
21132                index_options: vec![],
21133            }
21134            .into()
21135        );
21136
21137        test_parse_table_constraint!(
21138            dialect,
21139            "INDEX 'index' (c1, c2)",
21140            TableConstraint::Index(IndexConstraint {
21141                display_as_key: false,
21142                name: Some(Ident::with_quote('\'', "index")),
21143                index_type: None,
21144                columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21145                index_options: vec![],
21146            })
21147        );
21148
21149        test_parse_table_constraint!(
21150            dialect,
21151            "INDEX USING BTREE (c1)",
21152            IndexConstraint {
21153                display_as_key: false,
21154                name: None,
21155                index_type: Some(IndexType::BTree),
21156                columns: vec![mk_expected_col("c1")],
21157                index_options: vec![],
21158            }
21159            .into()
21160        );
21161
21162        test_parse_table_constraint!(
21163            dialect,
21164            "INDEX USING HASH (c1)",
21165            IndexConstraint {
21166                display_as_key: false,
21167                name: None,
21168                index_type: Some(IndexType::Hash),
21169                columns: vec![mk_expected_col("c1")],
21170                index_options: vec![],
21171            }
21172            .into()
21173        );
21174
21175        test_parse_table_constraint!(
21176            dialect,
21177            "INDEX idx_name USING BTREE (c1)",
21178            IndexConstraint {
21179                display_as_key: false,
21180                name: Some(Ident::new("idx_name")),
21181                index_type: Some(IndexType::BTree),
21182                columns: vec![mk_expected_col("c1")],
21183                index_options: vec![],
21184            }
21185            .into()
21186        );
21187
21188        test_parse_table_constraint!(
21189            dialect,
21190            "INDEX idx_name USING HASH (c1)",
21191            IndexConstraint {
21192                display_as_key: false,
21193                name: Some(Ident::new("idx_name")),
21194                index_type: Some(IndexType::Hash),
21195                columns: vec![mk_expected_col("c1")],
21196                index_options: vec![],
21197            }
21198            .into()
21199        );
21200    }
21201
21202    #[test]
21203    fn test_tokenizer_error_loc() {
21204        let sql = "foo '";
21205        let ast = Parser::parse_sql(&GenericDialect, sql);
21206        assert_eq!(
21207            ast,
21208            Err(ParserError::TokenizerError(
21209                "Unterminated string literal at Line: 1, Column: 5".to_string()
21210            ))
21211        );
21212    }
21213
21214    #[test]
21215    fn test_parser_error_loc() {
21216        let sql = "SELECT this is a syntax error";
21217        let ast = Parser::parse_sql(&GenericDialect, sql);
21218        assert_eq!(
21219            ast,
21220            Err(ParserError::ParserError(
21221                "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
21222                    .to_string()
21223            ))
21224        );
21225    }
21226
21227    #[test]
21228    fn test_nested_explain_error() {
21229        let sql = "EXPLAIN EXPLAIN SELECT 1";
21230        let ast = Parser::parse_sql(&GenericDialect, sql);
21231        assert_eq!(
21232            ast,
21233            Err(ParserError::ParserError(
21234                "Explain must be root of the plan".to_string()
21235            ))
21236        );
21237    }
21238
21239    #[test]
21240    fn test_parse_multipart_identifier_positive() {
21241        let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21242
21243        // parse multipart with quotes
21244        let expected = vec![
21245            Ident {
21246                value: "CATALOG".to_string(),
21247                quote_style: None,
21248                span: Span::empty(),
21249            },
21250            Ident {
21251                value: "F(o)o. \"bar".to_string(),
21252                quote_style: Some('"'),
21253                span: Span::empty(),
21254            },
21255            Ident {
21256                value: "table".to_string(),
21257                quote_style: None,
21258                span: Span::empty(),
21259            },
21260        ];
21261        dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21262            let actual = parser.parse_multipart_identifier().unwrap();
21263            assert_eq!(expected, actual);
21264        });
21265
21266        // allow whitespace between ident parts
21267        let expected = vec![
21268            Ident {
21269                value: "CATALOG".to_string(),
21270                quote_style: None,
21271                span: Span::empty(),
21272            },
21273            Ident {
21274                value: "table".to_string(),
21275                quote_style: None,
21276                span: Span::empty(),
21277            },
21278        ];
21279        dialect.run_parser_method("CATALOG . table", |parser| {
21280            let actual = parser.parse_multipart_identifier().unwrap();
21281            assert_eq!(expected, actual);
21282        });
21283    }
21284
21285    #[test]
21286    fn test_parse_multipart_identifier_negative() {
21287        macro_rules! test_parse_multipart_identifier_error {
21288            ($input:expr, $expected_err:expr $(,)?) => {{
21289                all_dialects().run_parser_method(&*$input, |parser| {
21290                    let actual_err = parser.parse_multipart_identifier().unwrap_err();
21291                    assert_eq!(actual_err.to_string(), $expected_err);
21292                });
21293            }};
21294        }
21295
21296        test_parse_multipart_identifier_error!(
21297            "",
21298            "sql parser error: Empty input when parsing identifier",
21299        );
21300
21301        test_parse_multipart_identifier_error!(
21302            "*schema.table",
21303            "sql parser error: Unexpected token in identifier: *",
21304        );
21305
21306        test_parse_multipart_identifier_error!(
21307            "schema.table*",
21308            "sql parser error: Unexpected token in identifier: *",
21309        );
21310
21311        test_parse_multipart_identifier_error!(
21312            "schema.table.",
21313            "sql parser error: Trailing period in identifier",
21314        );
21315
21316        test_parse_multipart_identifier_error!(
21317            "schema.*",
21318            "sql parser error: Unexpected token following period in identifier: *",
21319        );
21320    }
21321
21322    #[test]
21323    fn test_mysql_partition_selection() {
21324        let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21325        let expected = vec!["p0", "p2"];
21326
21327        let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21328        assert_eq!(ast.len(), 1);
21329        if let Statement::Query(v) = &ast[0] {
21330            if let SetExpr::Select(select) = &*v.body {
21331                assert_eq!(select.from.len(), 1);
21332                let from: &TableWithJoins = &select.from[0];
21333                let table_factor = &from.relation;
21334                if let TableFactor::Table { partitions, .. } = table_factor {
21335                    let actual: Vec<&str> = partitions
21336                        .iter()
21337                        .map(|ident| ident.value.as_str())
21338                        .collect();
21339                    assert_eq!(expected, actual);
21340                }
21341            }
21342        } else {
21343            panic!("fail to parse mysql partition selection");
21344        }
21345    }
21346
21347    #[test]
21348    fn test_replace_into_placeholders() {
21349        let sql = "REPLACE INTO t (a) VALUES (&a)";
21350
21351        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21352    }
21353
21354    #[test]
21355    fn test_replace_into_set_placeholder() {
21356        let sql = "REPLACE INTO t SET ?";
21357
21358        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21359    }
21360
21361    #[test]
21362    fn test_replace_incomplete() {
21363        let sql = r#"REPLACE"#;
21364
21365        assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
21366    }
21367
21368    #[test]
21369    fn test_placeholder_invalid_whitespace() {
21370        for w in ["  ", "/*invalid*/"] {
21371            let sql = format!("\nSELECT\n  :{w}fooBar");
21372            assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
21373        }
21374    }
21375}