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                Keyword::SECURITY => self.parse_security_label().map(Into::into),
723                _ => self.expected("an SQL statement", next_token),
724            },
725            Token::LParen => {
726                self.prev_token();
727                self.parse_query().map(Into::into)
728            }
729            _ => self.expected("an SQL statement", next_token),
730        }
731    }
732
733    /// Parse a `CASE` statement.
734    ///
735    /// See [Statement::Case]
736    pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
737        let case_token = self.expect_keyword(Keyword::CASE)?;
738
739        let match_expr = if self.peek_keyword(Keyword::WHEN) {
740            None
741        } else {
742            Some(self.parse_expr()?)
743        };
744
745        self.expect_keyword_is(Keyword::WHEN)?;
746        let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
747            parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
748        })?;
749
750        let else_block = if self.parse_keyword(Keyword::ELSE) {
751            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
752        } else {
753            None
754        };
755
756        let mut end_case_token = self.expect_keyword(Keyword::END)?;
757        if self.peek_keyword(Keyword::CASE) {
758            end_case_token = self.expect_keyword(Keyword::CASE)?;
759        }
760
761        Ok(CaseStatement {
762            case_token: AttachedToken(case_token),
763            match_expr,
764            when_blocks,
765            else_block,
766            end_case_token: AttachedToken(end_case_token),
767        })
768    }
769
770    /// Parse an `IF` statement.
771    ///
772    /// See [Statement::If]
773    pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
774        self.expect_keyword_is(Keyword::IF)?;
775        let if_block = self.parse_conditional_statement_block(&[
776            Keyword::ELSE,
777            Keyword::ELSEIF,
778            Keyword::END,
779        ])?;
780
781        let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
782            self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
783                parser.parse_conditional_statement_block(&[
784                    Keyword::ELSEIF,
785                    Keyword::ELSE,
786                    Keyword::END,
787                ])
788            })?
789        } else {
790            vec![]
791        };
792
793        let else_block = if self.parse_keyword(Keyword::ELSE) {
794            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
795        } else {
796            None
797        };
798
799        self.expect_keyword_is(Keyword::END)?;
800        let end_token = self.expect_keyword(Keyword::IF)?;
801
802        Ok(IfStatement {
803            if_block,
804            elseif_blocks,
805            else_block,
806            end_token: Some(AttachedToken(end_token)),
807        })
808    }
809
810    /// Parse a `WHILE` statement.
811    ///
812    /// See [Statement::While]
813    fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
814        self.expect_keyword_is(Keyword::WHILE)?;
815        let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
816
817        Ok(WhileStatement { while_block })
818    }
819
820    /// Parses an expression and associated list of statements
821    /// belonging to a conditional statement like `IF` or `WHEN` or `WHILE`.
822    ///
823    /// Example:
824    /// ```sql
825    /// IF condition THEN statement1; statement2;
826    /// ```
827    fn parse_conditional_statement_block(
828        &mut self,
829        terminal_keywords: &[Keyword],
830    ) -> Result<ConditionalStatementBlock, ParserError> {
831        let start_token = self.get_current_token().clone(); // self.expect_keyword(keyword)?;
832        let mut then_token = None;
833
834        let condition = match &start_token.token {
835            Token::Word(w) if w.keyword == Keyword::ELSE => None,
836            Token::Word(w) if w.keyword == Keyword::WHILE => {
837                let expr = self.parse_expr()?;
838                Some(expr)
839            }
840            _ => {
841                let expr = self.parse_expr()?;
842                then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
843                Some(expr)
844            }
845        };
846
847        let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
848
849        Ok(ConditionalStatementBlock {
850            start_token: AttachedToken(start_token),
851            condition,
852            then_token,
853            conditional_statements,
854        })
855    }
856
857    /// Parse a BEGIN/END block or a sequence of statements
858    /// This could be inside of a conditional (IF, CASE, WHILE etc.) or an object body defined optionally BEGIN/END and one or more statements.
859    pub(crate) fn parse_conditional_statements(
860        &mut self,
861        terminal_keywords: &[Keyword],
862    ) -> Result<ConditionalStatements, ParserError> {
863        let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
864            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
865            let statements = self.parse_statement_list(terminal_keywords)?;
866            let end_token = self.expect_keyword(Keyword::END)?;
867
868            ConditionalStatements::BeginEnd(BeginEndStatements {
869                begin_token: AttachedToken(begin_token),
870                statements,
871                end_token: AttachedToken(end_token),
872            })
873        } else {
874            ConditionalStatements::Sequence {
875                statements: self.parse_statement_list(terminal_keywords)?,
876            }
877        };
878        Ok(conditional_statements)
879    }
880
881    /// Parse a `RAISE` statement.
882    ///
883    /// See [Statement::Raise]
884    pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
885        self.expect_keyword_is(Keyword::RAISE)?;
886
887        let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
888            self.expect_token(&Token::Eq)?;
889            Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
890        } else {
891            self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
892        };
893
894        Ok(RaiseStatement { value })
895    }
896    /// Parse a COMMENT statement.
897    ///
898    /// See [Statement::Comment]
899    pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
900        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
901
902        self.expect_keyword_is(Keyword::ON)?;
903        let token = self.next_token();
904
905        let keyword = match &token.token {
906            Token::Word(w) => Some(w.keyword),
907            _ => None,
908        };
909        let object_type = match keyword {
910            Some(Keyword::MATERIALIZED) => {
911                self.expect_keyword_is(Keyword::VIEW)?;
912                CommentObject::MaterializedView
913            }
914            Some(other) => match CommentObject::from_keyword(other) {
915                Some(obj) => obj,
916                None => return self.expected("comment object_type", token),
917            },
918            None => return self.expected("comment object_type", token),
919        };
920        let object_name = if object_type == CommentObject::Operator {
921            self.parse_operator_name()?
922        } else {
923            self.parse_object_name(false)?
924        };
925
926        let arguments = match object_type {
927            CommentObject::Function | CommentObject::Procedure | CommentObject::Aggregate => {
928                if self.consume_token(&Token::LParen) {
929                    let args =
930                        self.parse_comma_separated0(Self::parse_function_arg, Token::RParen)?;
931                    self.expect_token(&Token::RParen)?;
932                    Some(args.into_iter().map(|a| a.data_type).collect())
933                } else {
934                    None
935                }
936            }
937            _ => None,
938        };
939
940        if object_type == CommentObject::Aggregate && arguments.is_none() {
941            return Err(ParserError::ParserError(
942                "COMMENT ON AGGREGATE requires an argument list, e.g. AGGREGATE foo(int)".into(),
943            ));
944        }
945
946        let operator_args = if object_type == CommentObject::Operator {
947            self.expect_token(&Token::LParen)?;
948            let left = self.parse_operator_arg_type_or_none()?;
949            self.expect_token(&Token::Comma)?;
950            let right = self.parse_operator_arg_type_or_none()?;
951            self.expect_token(&Token::RParen)?;
952            Some(CommentOperatorArgs { left, right })
953        } else {
954            None
955        };
956
957        let (table_name, on_domain) = match object_type {
958            CommentObject::Trigger | CommentObject::Policy | CommentObject::Rule => {
959                self.expect_keyword_is(Keyword::ON)?;
960                (Some(self.parse_object_name(false)?), false)
961            }
962            CommentObject::Constraint => {
963                self.expect_keyword_is(Keyword::ON)?;
964                let on_domain = self.parse_keyword(Keyword::DOMAIN);
965                (Some(self.parse_object_name(false)?), on_domain)
966            }
967            _ => (None, false),
968        };
969
970        self.expect_keyword_is(Keyword::IS)?;
971        let (comment, comment_dollar_quote) = if self.parse_keyword(Keyword::NULL) {
972            (None, None)
973        } else if let Token::DollarQuotedString(dq) = &self.peek_token_ref().token {
974            // Preserve the dollar-quote delimiter so Display can round-trip,
975            // while keeping the decoded value in `comment` for consumers.
976            let dq = dq.clone();
977            self.next_token();
978            (Some(dq.value.clone()), Some(dq))
979        } else {
980            (Some(self.parse_literal_string()?), None)
981        };
982        Ok(Statement::Comment {
983            object_type,
984            object_name,
985            arguments,
986            operator_args,
987            table_name,
988            on_domain,
989            comment,
990            comment_dollar_quote,
991            if_exists,
992        })
993    }
994
995    /// Parse `FLUSH` statement.
996    pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
997        let mut channel = None;
998        let mut tables: Vec<ObjectName> = vec![];
999        let mut read_lock = false;
1000        let mut export = false;
1001
1002        if !dialect_of!(self is MySqlDialect | GenericDialect) {
1003            return parser_err!(
1004                "Unsupported statement FLUSH",
1005                self.peek_token_ref().span.start
1006            );
1007        }
1008
1009        let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
1010            Some(FlushLocation::NoWriteToBinlog)
1011        } else if self.parse_keyword(Keyword::LOCAL) {
1012            Some(FlushLocation::Local)
1013        } else {
1014            None
1015        };
1016
1017        let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
1018            FlushType::BinaryLogs
1019        } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
1020            FlushType::EngineLogs
1021        } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1022            FlushType::ErrorLogs
1023        } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1024            FlushType::GeneralLogs
1025        } else if self.parse_keywords(&[Keyword::HOSTS]) {
1026            FlushType::Hosts
1027        } else if self.parse_keyword(Keyword::PRIVILEGES) {
1028            FlushType::Privileges
1029        } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1030            FlushType::OptimizerCosts
1031        } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1032            if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1033                channel = Some(self.parse_object_name(false).unwrap().to_string());
1034            }
1035            FlushType::RelayLogs
1036        } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1037            FlushType::SlowLogs
1038        } else if self.parse_keyword(Keyword::STATUS) {
1039            FlushType::Status
1040        } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1041            FlushType::UserResources
1042        } else if self.parse_keywords(&[Keyword::LOGS]) {
1043            FlushType::Logs
1044        } else if self.parse_keywords(&[Keyword::TABLES]) {
1045            loop {
1046                let next_token = self.next_token();
1047                match &next_token.token {
1048                    Token::Word(w) => match w.keyword {
1049                        Keyword::WITH => {
1050                            read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1051                        }
1052                        Keyword::FOR => {
1053                            export = self.parse_keyword(Keyword::EXPORT);
1054                        }
1055                        Keyword::NoKeyword => {
1056                            self.prev_token();
1057                            tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1058                        }
1059                        _ => {}
1060                    },
1061                    _ => {
1062                        break;
1063                    }
1064                }
1065            }
1066
1067            FlushType::Tables
1068        } else {
1069            return self.expected_ref(
1070                "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1071                 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1072                self.peek_token_ref(),
1073            );
1074        };
1075
1076        Ok(Statement::Flush {
1077            object_type,
1078            location,
1079            channel,
1080            read_lock,
1081            export,
1082            tables,
1083        })
1084    }
1085
1086    /// Parse `MSCK` statement.
1087    pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1088        let repair = self.parse_keyword(Keyword::REPAIR);
1089        self.expect_keyword_is(Keyword::TABLE)?;
1090        let table_name = self.parse_object_name(false)?;
1091        let partition_action = self
1092            .maybe_parse(|parser| {
1093                let pa = match parser.parse_one_of_keywords(&[
1094                    Keyword::ADD,
1095                    Keyword::DROP,
1096                    Keyword::SYNC,
1097                ]) {
1098                    Some(Keyword::ADD) => Some(AddDropSync::ADD),
1099                    Some(Keyword::DROP) => Some(AddDropSync::DROP),
1100                    Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1101                    _ => None,
1102                };
1103                parser.expect_keyword_is(Keyword::PARTITIONS)?;
1104                Ok(pa)
1105            })?
1106            .unwrap_or_default();
1107        Ok(Msck {
1108            repair,
1109            table_name,
1110            partition_action,
1111        })
1112    }
1113
1114    /// Parse `TRUNCATE` statement.
1115    pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1116        let table = self.parse_keyword(Keyword::TABLE);
1117        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1118
1119        let table_names = self.parse_comma_separated(|p| {
1120            let only = p.parse_keyword(Keyword::ONLY);
1121            let name = p.parse_object_name(false)?;
1122            let has_asterisk = p.consume_token(&Token::Mul);
1123            Ok(TruncateTableTarget {
1124                name,
1125                only,
1126                has_asterisk,
1127            })
1128        })?;
1129
1130        let mut partitions = None;
1131        if self.parse_keyword(Keyword::PARTITION) {
1132            self.expect_token(&Token::LParen)?;
1133            partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1134            self.expect_token(&Token::RParen)?;
1135        }
1136
1137        let mut identity = None;
1138        let mut cascade = None;
1139
1140        if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1141            identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1142                Some(TruncateIdentityOption::Restart)
1143            } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1144                Some(TruncateIdentityOption::Continue)
1145            } else {
1146                None
1147            };
1148
1149            cascade = self.parse_cascade_option();
1150        };
1151
1152        let on_cluster = self.parse_optional_on_cluster()?;
1153
1154        Ok(Truncate {
1155            table_names,
1156            partitions,
1157            table,
1158            if_exists,
1159            identity,
1160            cascade,
1161            on_cluster,
1162        })
1163    }
1164
1165    fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1166        if self.parse_keyword(Keyword::CASCADE) {
1167            Some(CascadeOption::Cascade)
1168        } else if self.parse_keyword(Keyword::RESTRICT) {
1169            Some(CascadeOption::Restrict)
1170        } else {
1171            None
1172        }
1173    }
1174
1175    /// Parse options for `ATTACH DUCKDB DATABASE` statement.
1176    pub fn parse_attach_duckdb_database_options(
1177        &mut self,
1178    ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1179        if !self.consume_token(&Token::LParen) {
1180            return Ok(vec![]);
1181        }
1182
1183        let mut options = vec![];
1184        loop {
1185            if self.parse_keyword(Keyword::READ_ONLY) {
1186                let boolean = if self.parse_keyword(Keyword::TRUE) {
1187                    Some(true)
1188                } else if self.parse_keyword(Keyword::FALSE) {
1189                    Some(false)
1190                } else {
1191                    None
1192                };
1193                options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1194            } else if self.parse_keyword(Keyword::TYPE) {
1195                let ident = self.parse_identifier()?;
1196                options.push(AttachDuckDBDatabaseOption::Type(ident));
1197            } else {
1198                return self
1199                    .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1200            };
1201
1202            if self.consume_token(&Token::RParen) {
1203                return Ok(options);
1204            } else if self.consume_token(&Token::Comma) {
1205                continue;
1206            } else {
1207                return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1208            }
1209        }
1210    }
1211
1212    /// Parse `ATTACH DUCKDB DATABASE` statement.
1213    pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1214        let database = self.parse_keyword(Keyword::DATABASE);
1215        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1216        let database_path = self.parse_identifier()?;
1217        let database_alias = if self.parse_keyword(Keyword::AS) {
1218            Some(self.parse_identifier()?)
1219        } else {
1220            None
1221        };
1222
1223        let attach_options = self.parse_attach_duckdb_database_options()?;
1224        Ok(Statement::AttachDuckDBDatabase {
1225            if_not_exists,
1226            database,
1227            database_path,
1228            database_alias,
1229            attach_options,
1230        })
1231    }
1232
1233    /// Parse `DETACH DUCKDB DATABASE` statement.
1234    pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1235        let database = self.parse_keyword(Keyword::DATABASE);
1236        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1237        let database_alias = self.parse_identifier()?;
1238        Ok(Statement::DetachDuckDBDatabase {
1239            if_exists,
1240            database,
1241            database_alias,
1242        })
1243    }
1244
1245    /// Parse `ATTACH DATABASE` statement.
1246    pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1247        let database = self.parse_keyword(Keyword::DATABASE);
1248        let database_file_name = self.parse_expr()?;
1249        self.expect_keyword_is(Keyword::AS)?;
1250        let schema_name = self.parse_identifier()?;
1251        Ok(Statement::AttachDatabase {
1252            database,
1253            schema_name,
1254            database_file_name,
1255        })
1256    }
1257
1258    /// Parse `ANALYZE` statement.
1259    pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1260        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1261        let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1262        let mut for_columns = false;
1263        let mut cache_metadata = false;
1264        let mut noscan = false;
1265        let mut partitions = None;
1266        let mut compute_statistics = false;
1267        let mut columns = vec![];
1268
1269        // PostgreSQL syntax: ANALYZE t (col1, col2)
1270        if table_name.is_some() && self.consume_token(&Token::LParen) {
1271            columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1272            self.expect_token(&Token::RParen)?;
1273        }
1274
1275        loop {
1276            match self.parse_one_of_keywords(&[
1277                Keyword::PARTITION,
1278                Keyword::FOR,
1279                Keyword::CACHE,
1280                Keyword::NOSCAN,
1281                Keyword::COMPUTE,
1282            ]) {
1283                Some(Keyword::PARTITION) => {
1284                    self.expect_token(&Token::LParen)?;
1285                    partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1286                    self.expect_token(&Token::RParen)?;
1287                }
1288                Some(Keyword::NOSCAN) => noscan = true,
1289                Some(Keyword::FOR) => {
1290                    self.expect_keyword_is(Keyword::COLUMNS)?;
1291
1292                    columns = self
1293                        .maybe_parse(|parser| {
1294                            parser.parse_comma_separated(|p| p.parse_identifier())
1295                        })?
1296                        .unwrap_or_default();
1297                    for_columns = true
1298                }
1299                Some(Keyword::CACHE) => {
1300                    self.expect_keyword_is(Keyword::METADATA)?;
1301                    cache_metadata = true
1302                }
1303                Some(Keyword::COMPUTE) => {
1304                    self.expect_keyword_is(Keyword::STATISTICS)?;
1305                    compute_statistics = true
1306                }
1307                _ => break,
1308            }
1309        }
1310
1311        Ok(Analyze {
1312            has_table_keyword,
1313            table_name,
1314            for_columns,
1315            columns,
1316            partitions,
1317            cache_metadata,
1318            noscan,
1319            compute_statistics,
1320        })
1321    }
1322
1323    /// Parse a new expression including wildcard & qualified wildcard.
1324    pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1325        let index = self.index;
1326
1327        let next_token = self.next_token();
1328        match next_token.token {
1329            t @ (Token::Word(_) | Token::SingleQuotedString(_))
1330                if self.peek_token_ref().token == Token::Period =>
1331            {
1332                let mut id_parts: Vec<Ident> = vec![match t {
1333                    Token::Word(w) => w.into_ident(next_token.span),
1334                    Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1335                    _ => {
1336                        return Err(ParserError::ParserError(
1337                            "Internal parser error: unexpected token type".to_string(),
1338                        ))
1339                    }
1340                }];
1341
1342                while self.consume_token(&Token::Period) {
1343                    let next_token = self.next_token();
1344                    match next_token.token {
1345                        Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1346                        Token::SingleQuotedString(s) => {
1347                            // SQLite has single-quoted identifiers
1348                            id_parts.push(Ident::with_quote('\'', s))
1349                        }
1350                        Token::Placeholder(s) => {
1351                            // Snowflake uses $1, $2, etc. for positional column references
1352                            // in staged data queries like: SELECT t.$1 FROM @stage t
1353                            id_parts.push(Ident::new(s))
1354                        }
1355                        Token::Mul => {
1356                            return Ok(Expr::QualifiedWildcard(
1357                                ObjectName::from(id_parts),
1358                                AttachedToken(next_token),
1359                            ));
1360                        }
1361                        _ => {
1362                            return self.expected("an identifier or a '*' after '.'", next_token);
1363                        }
1364                    }
1365                }
1366            }
1367            Token::Mul => {
1368                return Ok(Expr::Wildcard(AttachedToken(next_token)));
1369            }
1370            // Handle parenthesized wildcard: (*)
1371            Token::LParen => {
1372                let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1373                if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1374                    let mul_token = self.next_token(); // consume Mul
1375                    self.next_token(); // consume RParen
1376                    return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1377                }
1378            }
1379            _ => (),
1380        };
1381
1382        self.index = index;
1383        self.parse_expr()
1384    }
1385
1386    /// Parse a new expression.
1387    pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1388        self.parse_subexpr(self.dialect.prec_unknown())
1389    }
1390
1391    /// Parse expression with optional alias and order by.
1392    pub fn parse_expr_with_alias_and_order_by(
1393        &mut self,
1394    ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1395        let expr = self.parse_expr()?;
1396
1397        fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1398            explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1399        }
1400        let alias = self.parse_optional_alias_inner(None, validator)?;
1401        let order_by = OrderByOptions {
1402            asc: self.parse_asc_desc(),
1403            nulls_first: None,
1404        };
1405        Ok(ExprWithAliasAndOrderBy {
1406            expr: ExprWithAlias { expr, alias },
1407            order_by,
1408        })
1409    }
1410
1411    /// Parse tokens until the precedence changes.
1412    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1413    pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1414        let _guard = self.recursion_counter.try_decrease()?;
1415        debug!("parsing expr");
1416        let mut expr = self.parse_prefix()?;
1417
1418        expr = self.parse_compound_expr(expr, vec![])?;
1419
1420        // Parse an optional collation cast operator following `expr`.
1421        //
1422        // For example (MSSQL): t1.a COLLATE Latin1_General_CI_AS
1423        if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1424            expr = Expr::Collate {
1425                expr: Box::new(expr),
1426                collation: self.parse_object_name(false)?,
1427            };
1428        }
1429
1430        debug!("prefix: {expr:?}");
1431        loop {
1432            let next_precedence = self.get_next_precedence()?;
1433            debug!("next precedence: {next_precedence:?}");
1434
1435            if precedence >= next_precedence {
1436                break;
1437            }
1438
1439            // The period operator is handled exclusively by the
1440            // compound field access parsing.
1441            if Token::Period == self.peek_token_ref().token {
1442                break;
1443            }
1444
1445            expr = self.parse_infix(expr, next_precedence)?;
1446        }
1447        Ok(expr)
1448    }
1449
1450    /// Parse `ASSERT` statement.
1451    pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1452        let condition = self.parse_expr()?;
1453        let message = if self.parse_keyword(Keyword::AS) {
1454            Some(self.parse_expr()?)
1455        } else {
1456            None
1457        };
1458
1459        Ok(Statement::Assert { condition, message })
1460    }
1461
1462    /// Parse `SAVEPOINT` statement.
1463    pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1464        let name = self.parse_identifier()?;
1465        Ok(Statement::Savepoint { name })
1466    }
1467
1468    /// Parse `RELEASE` statement.
1469    pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1470        let _ = self.parse_keyword(Keyword::SAVEPOINT);
1471        let name = self.parse_identifier()?;
1472
1473        Ok(Statement::ReleaseSavepoint { name })
1474    }
1475
1476    /// Parse `LISTEN` statement.
1477    pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1478        let channel = self.parse_identifier()?;
1479        Ok(Statement::LISTEN { channel })
1480    }
1481
1482    /// Parse `UNLISTEN` statement.
1483    pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1484        let channel = if self.consume_token(&Token::Mul) {
1485            Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1486        } else {
1487            match self.parse_identifier() {
1488                Ok(expr) => expr,
1489                _ => {
1490                    self.prev_token();
1491                    return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1492                }
1493            }
1494        };
1495        Ok(Statement::UNLISTEN { channel })
1496    }
1497
1498    /// Parse `NOTIFY` statement.
1499    pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1500        let channel = self.parse_identifier()?;
1501        let payload = if self.consume_token(&Token::Comma) {
1502            Some(self.parse_literal_string()?)
1503        } else {
1504            None
1505        };
1506        Ok(Statement::NOTIFY { channel, payload })
1507    }
1508
1509    /// Parses a `RENAME TABLE` statement. See [Statement::RenameTable]
1510    pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1511        if self.peek_keyword(Keyword::TABLE) {
1512            self.expect_keyword(Keyword::TABLE)?;
1513            let rename_tables = self.parse_comma_separated(|parser| {
1514                let old_name = parser.parse_object_name(false)?;
1515                parser.expect_keyword(Keyword::TO)?;
1516                let new_name = parser.parse_object_name(false)?;
1517
1518                Ok(RenameTable { old_name, new_name })
1519            })?;
1520            Ok(rename_tables.into())
1521        } else {
1522            self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1523        }
1524    }
1525
1526    /// Tries to parse an expression by matching the specified word to known keywords that have a special meaning in the dialect.
1527    /// Returns `None if no match is found.
1528    fn parse_expr_prefix_by_reserved_word(
1529        &mut self,
1530        w: &Word,
1531        w_span: Span,
1532    ) -> Result<Option<Expr>, ParserError> {
1533        match w.keyword {
1534            Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1535                self.prev_token();
1536                Ok(Some(Expr::Value(self.parse_value()?)))
1537            }
1538            Keyword::NULL => {
1539                self.prev_token();
1540                Ok(Some(Expr::Value(self.parse_value()?)))
1541            }
1542            Keyword::CURRENT_CATALOG
1543            | Keyword::CURRENT_USER
1544            | Keyword::SESSION_USER
1545            | Keyword::USER
1546            if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1547                {
1548                    Ok(Some(Expr::Function(Function {
1549                        name: ObjectName::from(vec![w.to_ident(w_span)]),
1550                        uses_odbc_syntax: false,
1551                        parameters: FunctionArguments::None,
1552                        args: FunctionArguments::None,
1553                        null_treatment: None,
1554                        filter: None,
1555                        over: None,
1556                        within_group: vec![],
1557                    })))
1558                }
1559            Keyword::CURRENT_TIMESTAMP
1560            | Keyword::CURRENT_TIME
1561            | Keyword::CURRENT_DATE
1562            | Keyword::LOCALTIME
1563            | Keyword::LOCALTIMESTAMP => {
1564                Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1565            }
1566            Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1567            Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1568            Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1569            Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1570            Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1571            Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1572            Keyword::EXISTS
1573            // Support parsing Databricks has a function named `exists`.
1574            if !dialect_of!(self is DatabricksDialect)
1575                || matches!(
1576                        self.peek_nth_token_ref(1).token,
1577                        Token::Word(Word {
1578                            keyword: Keyword::SELECT | Keyword::WITH,
1579                            ..
1580                        })
1581                    ) =>
1582                {
1583                    Ok(Some(self.parse_exists_expr(false)?))
1584                }
1585            Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1586            Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1587            Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1588            Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1589                Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1590            }
1591            Keyword::SUBSTR | Keyword::SUBSTRING => {
1592                self.prev_token();
1593                Ok(Some(self.parse_substring()?))
1594            }
1595            Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1596            Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1597            Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1598            // Treat ARRAY[1,2,3] as an array [1,2,3], otherwise try as subquery or a function call
1599            Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1600                self.expect_token(&Token::LBracket)?;
1601                Ok(Some(self.parse_array_expr(true)?))
1602            }
1603            Keyword::ARRAY
1604            if self.peek_token_ref().token == Token::LParen
1605                && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1606                {
1607                    self.expect_token(&Token::LParen)?;
1608                    let query = self.parse_query()?;
1609                    self.expect_token(&Token::RParen)?;
1610                    Ok(Some(Expr::Function(Function {
1611                        name: ObjectName::from(vec![w.to_ident(w_span)]),
1612                        uses_odbc_syntax: false,
1613                        parameters: FunctionArguments::None,
1614                        args: FunctionArguments::Subquery(query),
1615                        filter: None,
1616                        null_treatment: None,
1617                        over: None,
1618                        within_group: vec![],
1619                    })))
1620                }
1621            Keyword::NOT => Ok(Some(self.parse_not()?)),
1622            Keyword::MATCH if self.dialect.supports_match_against() => {
1623                Ok(Some(self.parse_match_against()?))
1624            }
1625            Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1626                let struct_expr = self.parse_struct_literal()?;
1627                Ok(Some(struct_expr))
1628            }
1629            Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1630                let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1631                Ok(Some(Expr::Prior(Box::new(expr))))
1632            }
1633            Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1634                Ok(Some(self.parse_duckdb_map_literal()?))
1635            }
1636            Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1637                Ok(Some(self.parse_lambda_expr()?))
1638            }
1639            _ if self.dialect.supports_geometric_types() => match w.keyword {
1640                Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1641                Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1642                Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1643                Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1644                Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1645                Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1646                Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1647                _ => Ok(None),
1648            },
1649            _ => Ok(None),
1650        }
1651    }
1652
1653    /// Tries to parse an expression by a word that is not known to have a special meaning in the dialect.
1654    fn parse_expr_prefix_by_unreserved_word(
1655        &mut self,
1656        w: &Word,
1657        w_span: Span,
1658    ) -> Result<Expr, ParserError> {
1659        let is_outer_join = self.peek_outer_join_operator();
1660        match &self.peek_token_ref().token {
1661            Token::LParen if !is_outer_join => {
1662                let id_parts = vec![w.to_ident(w_span)];
1663                self.parse_function(ObjectName::from(id_parts))
1664            }
1665            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
1666            Token::SingleQuotedString(_)
1667            | Token::DoubleQuotedString(_)
1668            | Token::HexStringLiteral(_)
1669                if w.value.starts_with('_') =>
1670            {
1671                Ok(Expr::Prefixed {
1672                    prefix: w.to_ident(w_span),
1673                    value: self.parse_introduced_string_expr()?.into(),
1674                })
1675            }
1676            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
1677            Token::SingleQuotedString(_)
1678            | Token::DoubleQuotedString(_)
1679            | Token::HexStringLiteral(_)
1680                if w.value.starts_with('_') =>
1681            {
1682                Ok(Expr::Prefixed {
1683                    prefix: w.to_ident(w_span),
1684                    value: self.parse_introduced_string_expr()?.into(),
1685                })
1686            }
1687            // An unreserved word (likely an identifier) is followed by an arrow,
1688            // which indicates a lambda function with a single, untyped parameter.
1689            // For example: `a -> a * 2`.
1690            Token::Arrow if self.dialect.supports_lambda_functions() => {
1691                self.expect_token(&Token::Arrow)?;
1692                Ok(Expr::Lambda(LambdaFunction {
1693                    params: OneOrManyWithParens::One(LambdaFunctionParameter {
1694                        name: w.to_ident(w_span),
1695                        data_type: None,
1696                    }),
1697                    body: Box::new(self.parse_expr()?),
1698                    syntax: LambdaSyntax::Arrow,
1699                }))
1700            }
1701            // An unreserved word (likely an identifier) that is followed by another word (likley a data type)
1702            // which is then followed by an arrow, which indicates a lambda function with a single, typed parameter.
1703            // For example: `a INT -> a * 2`.
1704            Token::Word(_)
1705                if self.dialect.supports_lambda_functions()
1706                    && self.peek_nth_token_ref(1).token == Token::Arrow =>
1707            {
1708                let data_type = self.parse_data_type()?;
1709                self.expect_token(&Token::Arrow)?;
1710                Ok(Expr::Lambda(LambdaFunction {
1711                    params: OneOrManyWithParens::One(LambdaFunctionParameter {
1712                        name: w.to_ident(w_span),
1713                        data_type: Some(data_type),
1714                    }),
1715                    body: Box::new(self.parse_expr()?),
1716                    syntax: LambdaSyntax::Arrow,
1717                }))
1718            }
1719            _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1720        }
1721    }
1722
1723    /// Returns true if the given [ObjectName] is a single unquoted
1724    /// identifier matching `expected` (case-insensitive).
1725    fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1726        if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1727            ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1728        } else {
1729            false
1730        }
1731    }
1732
1733    /// Parse an expression prefix.
1734    pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1735        // allow the dialect to override prefix parsing
1736        if let Some(prefix) = self.dialect.parse_prefix(self) {
1737            return prefix;
1738        }
1739
1740        // PostgreSQL allows any string literal to be preceded by a type name, indicating that the
1741        // string literal represents a literal of that type. Some examples:
1742        //
1743        //      DATE '2020-05-20'
1744        //      TIMESTAMP WITH TIME ZONE '2020-05-20 7:43:54'
1745        //      BOOL 'true'
1746        //
1747        // The first two are standard SQL, while the latter is a PostgreSQL extension. Complicating
1748        // matters is the fact that INTERVAL string literals may optionally be followed by special
1749        // keywords, e.g.:
1750        //
1751        //      INTERVAL '7' DAY
1752        //
1753        // Note also that naively `SELECT date` looks like a syntax error because the `date` type
1754        // name is not followed by a string literal, but in fact in PostgreSQL it is a valid
1755        // expression that should parse as the column name "date".
1756        let loc = self.peek_token_ref().span.start;
1757        let opt_expr = self.maybe_parse(|parser| {
1758            match parser.parse_data_type()? {
1759                DataType::Interval { .. } => parser.parse_interval(),
1760                // PostgreSQL allows almost any identifier to be used as custom data type name,
1761                // and we support that in `parse_data_type()`. But unlike Postgres we don't
1762                // have a list of globally reserved keywords (since they vary across dialects),
1763                // so given `NOT 'a' LIKE 'b'`, we'd accept `NOT` as a possible custom data type
1764                // name, resulting in `NOT 'a'` being recognized as a `TypedString` instead of
1765                // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we don't accept the
1766                // `type 'string'` syntax for the custom data types at all ...
1767                //
1768                // ... with the exception of `xml '...'` on dialects that support XML
1769                // expressions, which is a valid PostgreSQL typed string literal.
1770                DataType::Custom(ref name, ref modifiers)
1771                    if modifiers.is_empty()
1772                        && Self::is_simple_unquoted_object_name(name, "xml")
1773                        && parser.dialect.supports_xml_expressions() =>
1774                {
1775                    Ok(Expr::TypedString(TypedString {
1776                        data_type: DataType::Custom(name.clone(), modifiers.clone()),
1777                        value: parser.parse_value()?,
1778                        uses_odbc_syntax: false,
1779                    }))
1780                }
1781                DataType::Custom(..) => parser_err!("dummy", loc),
1782                // MySQL supports using the `BINARY` keyword as a cast to binary type.
1783                DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1784                    Ok(Expr::Cast {
1785                        kind: CastKind::Cast,
1786                        expr: Box::new(parser.parse_expr()?),
1787                        data_type: DataType::Binary(None),
1788                        array: false,
1789                        format: None,
1790                    })
1791                }
1792                data_type => Ok(Expr::TypedString(TypedString {
1793                    data_type,
1794                    value: parser.parse_value()?,
1795                    uses_odbc_syntax: false,
1796                })),
1797            }
1798        })?;
1799
1800        if let Some(expr) = opt_expr {
1801            return Ok(expr);
1802        }
1803
1804        // Cache some dialect properties to avoid lifetime issues with the
1805        // next_token reference.
1806
1807        let dialect = self.dialect;
1808
1809        self.advance_token();
1810        let next_token_index = self.get_current_index();
1811        let next_token = self.get_current_token();
1812        let span = next_token.span;
1813        let expr = match &next_token.token {
1814            Token::Word(w) => {
1815                // The word we consumed may fall into one of two cases: it has a special meaning, or not.
1816                // For example, in Snowflake, the word `interval` may have two meanings depending on the context:
1817                // `SELECT CURRENT_DATE() + INTERVAL '1 DAY', MAX(interval) FROM tbl;`
1818                //                          ^^^^^^^^^^^^^^^^      ^^^^^^^^
1819                //                         interval expression   identifier
1820                //
1821                // We first try to parse the word and following tokens as a special expression, and if that fails,
1822                // we rollback and try to parse it as an identifier.
1823                let w = w.clone();
1824                match self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span)) {
1825                    // This word indicated an expression prefix and parsing was successful
1826                    Ok(Some(expr)) => Ok(expr),
1827
1828                    // No expression prefix associated with this word
1829                    Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1830
1831                    // If parsing of the word as a special expression failed, we are facing two options:
1832                    // 1. The statement is malformed, e.g. `SELECT INTERVAL '1 DAI` (`DAI` instead of `DAY`)
1833                    // 2. The word is used as an identifier, e.g. `SELECT MAX(interval) FROM tbl`
1834                    // We first try to parse the word as an identifier and if that fails
1835                    // we rollback and return the parsing error we got from trying to parse a
1836                    // special expression (to maintain backwards compatibility of parsing errors).
1837                    Err(e) => {
1838                        if !self.dialect.is_reserved_for_identifier(w.keyword) {
1839                            if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1840                                parser.parse_expr_prefix_by_unreserved_word(&w, span)
1841                            }) {
1842                                return Ok(expr);
1843                            }
1844                        }
1845                        return Err(e);
1846                    }
1847                }
1848            } // End of Token::Word
1849            // array `[1, 2, 3]`
1850            Token::LBracket => self.parse_array_expr(false),
1851            tok @ Token::Minus | tok @ Token::Plus => {
1852                let op = if *tok == Token::Plus {
1853                    UnaryOperator::Plus
1854                } else {
1855                    UnaryOperator::Minus
1856                };
1857                Ok(Expr::UnaryOp {
1858                    op,
1859                    expr: Box::new(
1860                        self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1861                    ),
1862                })
1863            }
1864            Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1865                op: UnaryOperator::BangNot,
1866                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1867            }),
1868            tok @ Token::DoubleExclamationMark
1869            | tok @ Token::PGSquareRoot
1870            | tok @ Token::PGCubeRoot
1871            | tok @ Token::AtSign
1872                if dialect_is!(dialect is PostgreSqlDialect) =>
1873            {
1874                let op = match tok {
1875                    Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1876                    Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1877                    Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1878                    Token::AtSign => UnaryOperator::PGAbs,
1879                    _ => {
1880                        return Err(ParserError::ParserError(
1881                            "Internal parser error: unexpected unary operator token".to_string(),
1882                        ))
1883                    }
1884                };
1885                Ok(Expr::UnaryOp {
1886                    op,
1887                    expr: Box::new(
1888                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1889                    ),
1890                })
1891            }
1892            Token::Tilde => Ok(Expr::UnaryOp {
1893                op: UnaryOperator::BitwiseNot,
1894                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1895            }),
1896            tok @ Token::Sharp
1897            | tok @ Token::AtDashAt
1898            | tok @ Token::AtAt
1899            | tok @ Token::QuestionMarkDash
1900            | tok @ Token::QuestionPipe
1901                if self.dialect.supports_geometric_types() =>
1902            {
1903                let op = match tok {
1904                    Token::Sharp => UnaryOperator::Hash,
1905                    Token::AtDashAt => UnaryOperator::AtDashAt,
1906                    Token::AtAt => UnaryOperator::DoubleAt,
1907                    Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1908                    Token::QuestionPipe => UnaryOperator::QuestionPipe,
1909                    _ => {
1910                        return Err(ParserError::ParserError(format!(
1911                            "Unexpected token in unary operator parsing: {tok:?}"
1912                        )))
1913                    }
1914                };
1915                Ok(Expr::UnaryOp {
1916                    op,
1917                    expr: Box::new(
1918                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1919                    ),
1920                })
1921            }
1922            Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1923            {
1924                self.prev_token();
1925                Ok(Expr::Value(self.parse_value()?))
1926            }
1927            Token::UnicodeStringLiteral(_) => {
1928                self.prev_token();
1929                Ok(Expr::Value(self.parse_value()?))
1930            }
1931            Token::Number(_, _)
1932            | Token::SingleQuotedString(_)
1933            | Token::DoubleQuotedString(_)
1934            | Token::TripleSingleQuotedString(_)
1935            | Token::TripleDoubleQuotedString(_)
1936            | Token::DollarQuotedString(_)
1937            | Token::SingleQuotedByteStringLiteral(_)
1938            | Token::DoubleQuotedByteStringLiteral(_)
1939            | Token::TripleSingleQuotedByteStringLiteral(_)
1940            | Token::TripleDoubleQuotedByteStringLiteral(_)
1941            | Token::SingleQuotedRawStringLiteral(_)
1942            | Token::DoubleQuotedRawStringLiteral(_)
1943            | Token::TripleSingleQuotedRawStringLiteral(_)
1944            | Token::TripleDoubleQuotedRawStringLiteral(_)
1945            | Token::NationalStringLiteral(_)
1946            | Token::QuoteDelimitedStringLiteral(_)
1947            | Token::NationalQuoteDelimitedStringLiteral(_)
1948            | Token::HexStringLiteral(_) => {
1949                self.prev_token();
1950                Ok(Expr::Value(self.parse_value()?))
1951            }
1952            Token::LParen => {
1953                let expr =
1954                    if let Some(expr) = self.try_parse_expr_sub_query()? {
1955                        expr
1956                    } else if let Some(lambda) = self.try_parse_lambda()? {
1957                        return Ok(lambda);
1958                    } else {
1959                        // Parentheses in expressions switch to "normal" parsing state.
1960                        // This matters for dialects (SQLite, DuckDB) where `NOT NULL` can
1961                        // be an alias for `IS NOT NULL`. In column definitions like:
1962                        //
1963                        //   CREATE TABLE t (c INT DEFAULT (42 NOT NULL) NOT NULL)
1964                        //
1965                        // The `(42 NOT NULL)` is an expression with parens, so it parses
1966                        // as `IsNotNull(42)`. The trailing `NOT NULL` is outside those
1967                        // expression parens (the outer parens are CREATE TABLE syntax),
1968                        // so it remains a column constraint.
1969                        let exprs = self.with_state(ParserState::Normal, |p| {
1970                            p.parse_comma_separated(Parser::parse_expr)
1971                        })?;
1972                        match exprs.len() {
1973                            0 => return Err(ParserError::ParserError(
1974                                "Internal parser error: parse_comma_separated returned empty list"
1975                                    .to_string(),
1976                            )),
1977                            1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
1978                            _ => Expr::Tuple(exprs),
1979                        }
1980                    };
1981                self.expect_token(&Token::RParen)?;
1982                Ok(expr)
1983            }
1984            Token::Placeholder(_) | Token::Colon | Token::AtSign => {
1985                self.prev_token();
1986                Ok(Expr::Value(self.parse_value()?))
1987            }
1988            Token::LBrace => {
1989                self.prev_token();
1990                self.parse_lbrace_expr()
1991            }
1992            _ => self.expected_at("an expression", next_token_index),
1993        }?;
1994
1995        Ok(expr)
1996    }
1997
1998    fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
1999        Ok(Expr::TypedString(TypedString {
2000            data_type: DataType::GeometricType(kind),
2001            value: self.parse_value()?,
2002            uses_odbc_syntax: false,
2003        }))
2004    }
2005
2006    /// Try to parse an [Expr::CompoundFieldAccess] like `a.b.c` or `a.b[1].c`.
2007    /// If all the fields are `Expr::Identifier`s, return an [Expr::CompoundIdentifier] instead.
2008    /// If only the root exists, return the root.
2009    /// Parses compound expressions which may be delimited by period
2010    /// or bracket notation.
2011    /// For example: `a.b.c`, `a.b[1]`.
2012    pub fn parse_compound_expr(
2013        &mut self,
2014        root: Expr,
2015        mut chain: Vec<AccessExpr>,
2016    ) -> Result<Expr, ParserError> {
2017        let mut ending_wildcard: Option<TokenWithSpan> = None;
2018        loop {
2019            if self.consume_token(&Token::Period) {
2020                let next_token = self.peek_token_ref();
2021                match &next_token.token {
2022                    Token::Mul => {
2023                        // Postgres explicitly allows funcnm(tablenm.*) and the
2024                        // function array_agg traverses this control flow
2025                        if dialect_of!(self is PostgreSqlDialect) {
2026                            ending_wildcard = Some(self.next_token());
2027                        } else {
2028                            // Put back the consumed `.` tokens before exiting.
2029                            // If this expression is being parsed in the
2030                            // context of a projection, then the `.*` could imply
2031                            // a wildcard expansion. For example:
2032                            // `SELECT STRUCT('foo').* FROM T`
2033                            self.prev_token(); // .
2034                        }
2035
2036                        break;
2037                    }
2038                    Token::SingleQuotedString(s) => {
2039                        let expr =
2040                            Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2041                        chain.push(AccessExpr::Dot(expr));
2042                        self.advance_token(); // The consumed string
2043                    }
2044                    Token::Placeholder(s) => {
2045                        // Snowflake uses $1, $2, etc. for positional column references
2046                        // in staged data queries like: SELECT t.$1 FROM @stage t
2047                        let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2048                        chain.push(AccessExpr::Dot(expr));
2049                        self.advance_token(); // The consumed placeholder
2050                    }
2051                    // Fallback to parsing an arbitrary expression, but restrict to expression
2052                    // types that are valid after the dot operator. This ensures that e.g.
2053                    // `T.interval` is parsed as a compound identifier, not as an interval
2054                    // expression.
2055                    _ => {
2056                        let expr = self.maybe_parse(|parser| {
2057                            let expr = parser
2058                                .parse_subexpr(parser.dialect.prec_value(Precedence::Period))?;
2059                            match &expr {
2060                                Expr::CompoundFieldAccess { .. }
2061                                | Expr::CompoundIdentifier(_)
2062                                | Expr::Identifier(_)
2063                                | Expr::Value(_)
2064                                | Expr::Function(_) => Ok(expr),
2065                                _ => parser.expected_ref(
2066                                    "an identifier or value",
2067                                    parser.peek_token_ref(),
2068                                ),
2069                            }
2070                        })?;
2071
2072                        match expr {
2073                            // If we get back a compound field access or identifier,
2074                            // we flatten the nested expression.
2075                            // For example if the current root is `foo`
2076                            // and we get back a compound identifier expression `bar.baz`
2077                            // The full expression should be `foo.bar.baz` (i.e.
2078                            // a root with an access chain with 2 entries) and not
2079                            // `foo.(bar.baz)` (i.e. a root with an access chain with
2080                            // 1 entry`).
2081                            Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2082                                chain.push(AccessExpr::Dot(*root));
2083                                chain.extend(access_chain);
2084                            }
2085                            Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2086                                parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2087                            ),
2088                            Some(expr) => {
2089                                chain.push(AccessExpr::Dot(expr));
2090                            }
2091                            // If the expression is not a valid suffix, fall back to
2092                            // parsing as an identifier. This handles cases like `T.interval`
2093                            // where `interval` is a keyword but should be treated as an identifier.
2094                            None => {
2095                                chain.push(AccessExpr::Dot(Expr::Identifier(
2096                                    self.parse_identifier()?,
2097                                )));
2098                            }
2099                        }
2100                    }
2101                }
2102            } else if !self.dialect.supports_partiql()
2103                && self.peek_token_ref().token == Token::LBracket
2104            {
2105                self.parse_multi_dim_subscript(&mut chain)?;
2106            } else {
2107                break;
2108            }
2109        }
2110
2111        let tok_index = self.get_current_index();
2112        if let Some(wildcard_token) = ending_wildcard {
2113            if !Self::is_all_ident(&root, &chain) {
2114                return self
2115                    .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2116            };
2117            Ok(Expr::QualifiedWildcard(
2118                ObjectName::from(Self::exprs_to_idents(root, chain)?),
2119                AttachedToken(wildcard_token),
2120            ))
2121        } else if self.maybe_parse_outer_join_operator() {
2122            if !Self::is_all_ident(&root, &chain) {
2123                return self.expected_at("column identifier before (+)", tok_index);
2124            };
2125            let expr = if chain.is_empty() {
2126                root
2127            } else {
2128                Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2129            };
2130            Ok(Expr::OuterJoin(expr.into()))
2131        } else {
2132            Self::build_compound_expr(root, chain)
2133        }
2134    }
2135
2136    /// Combines a root expression and access chain to form
2137    /// a compound expression. Which may be a [Expr::CompoundFieldAccess]
2138    /// or other special cased expressions like [Expr::CompoundIdentifier],
2139    /// [Expr::OuterJoin].
2140    fn build_compound_expr(
2141        root: Expr,
2142        mut access_chain: Vec<AccessExpr>,
2143    ) -> Result<Expr, ParserError> {
2144        if access_chain.is_empty() {
2145            return Ok(root);
2146        }
2147
2148        if Self::is_all_ident(&root, &access_chain) {
2149            return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2150                root,
2151                access_chain,
2152            )?));
2153        }
2154
2155        // Flatten qualified function calls.
2156        // For example, the expression `a.b.c.foo(1,2,3)` should
2157        // represent a function called `a.b.c.foo`, rather than
2158        // a composite expression.
2159        if matches!(root, Expr::Identifier(_))
2160            && matches!(
2161                access_chain.last(),
2162                Some(AccessExpr::Dot(Expr::Function(_)))
2163            )
2164            && access_chain
2165                .iter()
2166                .rev()
2167                .skip(1) // All except the Function
2168                .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2169        {
2170            let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2171                return parser_err!("expected function expression", root.span().start);
2172            };
2173
2174            let compound_func_name = [root]
2175                .into_iter()
2176                .chain(access_chain.into_iter().flat_map(|access| match access {
2177                    AccessExpr::Dot(expr) => Some(expr),
2178                    _ => None,
2179                }))
2180                .flat_map(|expr| match expr {
2181                    Expr::Identifier(ident) => Some(ident),
2182                    _ => None,
2183                })
2184                .map(ObjectNamePart::Identifier)
2185                .chain(func.name.0)
2186                .collect::<Vec<_>>();
2187            func.name = ObjectName(compound_func_name);
2188
2189            return Ok(Expr::Function(func));
2190        }
2191
2192        // Flatten qualified outer join expressions.
2193        // For example, the expression `T.foo(+)` should
2194        // represent an outer join on the column name `T.foo`
2195        // rather than a composite expression.
2196        if access_chain.len() == 1
2197            && matches!(
2198                access_chain.last(),
2199                Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2200            )
2201        {
2202            let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2203                return parser_err!("expected (+) expression", root.span().start);
2204            };
2205
2206            if !Self::is_all_ident(&root, &[]) {
2207                return parser_err!("column identifier before (+)", root.span().start);
2208            };
2209
2210            let token_start = root.span().start;
2211            let mut idents = Self::exprs_to_idents(root, vec![])?;
2212            match *inner_expr {
2213                Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2214                Expr::Identifier(suffix) => idents.push(suffix),
2215                _ => {
2216                    return parser_err!("column identifier before (+)", token_start);
2217                }
2218            }
2219
2220            return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2221        }
2222
2223        Ok(Expr::CompoundFieldAccess {
2224            root: Box::new(root),
2225            access_chain,
2226        })
2227    }
2228
2229    fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2230        match k {
2231            Keyword::LOCAL => Some(ContextModifier::Local),
2232            Keyword::GLOBAL => Some(ContextModifier::Global),
2233            Keyword::SESSION => Some(ContextModifier::Session),
2234            _ => None,
2235        }
2236    }
2237
2238    /// Check if the root is an identifier and all fields are identifiers.
2239    fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2240        if !matches!(root, Expr::Identifier(_)) {
2241            return false;
2242        }
2243        fields
2244            .iter()
2245            .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2246    }
2247
2248    /// Convert a root and a list of fields to a list of identifiers.
2249    fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2250        let mut idents = vec![];
2251        if let Expr::Identifier(root) = root {
2252            idents.push(root);
2253            for x in fields {
2254                if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2255                    idents.push(ident);
2256                } else {
2257                    return parser_err!(
2258                        format!("Expected identifier, found: {}", x),
2259                        x.span().start
2260                    );
2261                }
2262            }
2263            Ok(idents)
2264        } else {
2265            parser_err!(
2266                format!("Expected identifier, found: {}", root),
2267                root.span().start
2268            )
2269        }
2270    }
2271
2272    /// Returns true if the next tokens indicate the outer join operator `(+)`.
2273    fn peek_outer_join_operator(&mut self) -> bool {
2274        if !self.dialect.supports_outer_join_operator() {
2275            return false;
2276        }
2277
2278        let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2279        Token::LParen == maybe_lparen.token
2280            && Token::Plus == maybe_plus.token
2281            && Token::RParen == maybe_rparen.token
2282    }
2283
2284    /// If the next tokens indicates the outer join operator `(+)`, consume
2285    /// the tokens and return true.
2286    fn maybe_parse_outer_join_operator(&mut self) -> bool {
2287        self.dialect.supports_outer_join_operator()
2288            && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2289    }
2290
2291    /// Parse utility options in the form of `(option1, option2 arg2, option3 arg3, ...)`
2292    pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2293        self.expect_token(&Token::LParen)?;
2294        let options = self.parse_comma_separated(Self::parse_utility_option)?;
2295        self.expect_token(&Token::RParen)?;
2296
2297        Ok(options)
2298    }
2299
2300    fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2301        let name = self.parse_identifier()?;
2302
2303        let next_token = self.peek_token_ref();
2304        if next_token == &Token::Comma || next_token == &Token::RParen {
2305            return Ok(UtilityOption { name, arg: None });
2306        }
2307        let arg = self.parse_expr()?;
2308
2309        Ok(UtilityOption {
2310            name,
2311            arg: Some(arg),
2312        })
2313    }
2314
2315    fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2316        if !self.peek_sub_query() {
2317            return Ok(None);
2318        }
2319
2320        Ok(Some(Expr::Subquery(self.parse_query()?)))
2321    }
2322
2323    fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2324        if !self.dialect.supports_lambda_functions() {
2325            return Ok(None);
2326        }
2327        self.maybe_parse(|p| {
2328            let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2329            p.expect_token(&Token::RParen)?;
2330            p.expect_token(&Token::Arrow)?;
2331            let expr = p.parse_expr()?;
2332            Ok(Expr::Lambda(LambdaFunction {
2333                params: OneOrManyWithParens::Many(params),
2334                body: Box::new(expr),
2335                syntax: LambdaSyntax::Arrow,
2336            }))
2337        })
2338    }
2339
2340    /// Parses a lambda expression following the `LAMBDA` keyword syntax.
2341    ///
2342    /// Syntax: `LAMBDA <params> : <expr>`
2343    ///
2344    /// Examples:
2345    /// - `LAMBDA x : x + 1`
2346    /// - `LAMBDA x, i : x > i`
2347    ///
2348    /// See <https://duckdb.org/docs/stable/sql/functions/lambda>
2349    fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2350        // Parse the parameters: either a single identifier or comma-separated identifiers
2351        let params = self.parse_lambda_function_parameters()?;
2352        // Expect the colon separator
2353        self.expect_token(&Token::Colon)?;
2354        // Parse the body expression
2355        let body = self.parse_expr()?;
2356        Ok(Expr::Lambda(LambdaFunction {
2357            params,
2358            body: Box::new(body),
2359            syntax: LambdaSyntax::LambdaKeyword,
2360        }))
2361    }
2362
2363    /// Parses the parameters of a lambda function with optional typing.
2364    fn parse_lambda_function_parameters(
2365        &mut self,
2366    ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2367        // Parse the parameters: either a single identifier or comma-separated identifiers
2368        let params = if self.consume_token(&Token::LParen) {
2369            // Parenthesized parameters: (x, y)
2370            let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2371            self.expect_token(&Token::RParen)?;
2372            OneOrManyWithParens::Many(params)
2373        } else {
2374            // Unparenthesized parameters: x or x, y
2375            let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2376            if params.len() == 1 {
2377                OneOrManyWithParens::One(params.into_iter().next().unwrap())
2378            } else {
2379                OneOrManyWithParens::Many(params)
2380            }
2381        };
2382        Ok(params)
2383    }
2384
2385    /// Parses a single parameter of a lambda function, with optional typing.
2386    fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2387        let name = self.parse_identifier()?;
2388        let data_type = match &self.peek_token_ref().token {
2389            Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2390            _ => None,
2391        };
2392        Ok(LambdaFunctionParameter { name, data_type })
2393    }
2394
2395    /// Tries to parse the body of an [ODBC escaping sequence]
2396    /// i.e. without the enclosing braces
2397    /// Currently implemented:
2398    /// Scalar Function Calls
2399    /// Date, Time, and Timestamp Literals
2400    /// See <https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/escape-sequences-in-odbc?view=sql-server-2017>
2401    fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2402        // Attempt 1: Try to parse it as a function.
2403        if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2404            return Ok(Some(expr));
2405        }
2406        // Attempt 2: Try to parse it as a Date, Time or Timestamp Literal
2407        self.maybe_parse_odbc_body_datetime()
2408    }
2409
2410    /// Tries to parse the body of an [ODBC Date, Time, and Timestamp Literals] call.
2411    ///
2412    /// ```sql
2413    /// {d '2025-07-17'}
2414    /// {t '14:12:01'}
2415    /// {ts '2025-07-17 14:12:01'}
2416    /// ```
2417    ///
2418    /// [ODBC Date, Time, and Timestamp Literals]:
2419    /// https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/date-time-and-timestamp-literals?view=sql-server-2017
2420    fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2421        self.maybe_parse(|p| {
2422            let token = p.next_token().clone();
2423            let word_string = token.token.to_string();
2424            let data_type = match word_string.as_str() {
2425                "t" => DataType::Time(None, TimezoneInfo::None),
2426                "d" => DataType::Date,
2427                "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2428                _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2429            };
2430            let value = p.parse_value()?;
2431            Ok(Expr::TypedString(TypedString {
2432                data_type,
2433                value,
2434                uses_odbc_syntax: true,
2435            }))
2436        })
2437    }
2438
2439    /// Tries to parse the body of an [ODBC function] call.
2440    /// i.e. without the enclosing braces
2441    ///
2442    /// ```sql
2443    /// fn myfunc(1,2,3)
2444    /// ```
2445    ///
2446    /// [ODBC function]: https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/scalar-function-calls?view=sql-server-2017
2447    fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2448        self.maybe_parse(|p| {
2449            p.expect_keyword(Keyword::FN)?;
2450            let fn_name = p.parse_object_name(false)?;
2451            let mut fn_call = p.parse_function_call(fn_name)?;
2452            fn_call.uses_odbc_syntax = true;
2453            Ok(Expr::Function(fn_call))
2454        })
2455    }
2456
2457    /// Parse a function call expression named by `name` and return it as an `Expr`.
2458    pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2459        self.parse_function_call(name).map(Expr::Function)
2460    }
2461
2462    fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2463        self.expect_token(&Token::LParen)?;
2464
2465        // Snowflake permits a subquery to be passed as an argument without
2466        // an enclosing set of parens if it's the only argument.
2467        if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2468            let subquery = self.parse_query()?;
2469            self.expect_token(&Token::RParen)?;
2470            return Ok(Function {
2471                name,
2472                uses_odbc_syntax: false,
2473                parameters: FunctionArguments::None,
2474                args: FunctionArguments::Subquery(subquery),
2475                filter: None,
2476                null_treatment: None,
2477                over: None,
2478                within_group: vec![],
2479            });
2480        }
2481
2482        let mut args = self.parse_function_argument_list()?;
2483        let mut parameters = FunctionArguments::None;
2484        // ClickHouse aggregations support parametric functions like `HISTOGRAM(0.5, 0.6)(x, y)`
2485        // which (0.5, 0.6) is a parameter to the function.
2486        if dialect_of!(self is ClickHouseDialect | GenericDialect)
2487            && self.consume_token(&Token::LParen)
2488        {
2489            parameters = FunctionArguments::List(args);
2490            args = self.parse_function_argument_list()?;
2491        }
2492
2493        let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2494            self.expect_token(&Token::LParen)?;
2495            self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2496            let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2497            self.expect_token(&Token::RParen)?;
2498            order_by
2499        } else {
2500            vec![]
2501        };
2502
2503        let filter = if self.dialect.supports_filter_during_aggregation()
2504            && self.parse_keyword(Keyword::FILTER)
2505            && self.consume_token(&Token::LParen)
2506            && self.parse_keyword(Keyword::WHERE)
2507        {
2508            let filter = Some(Box::new(self.parse_expr()?));
2509            self.expect_token(&Token::RParen)?;
2510            filter
2511        } else {
2512            None
2513        };
2514
2515        // Syntax for null treatment shows up either in the args list
2516        // or after the function call, but not both.
2517        let null_treatment = if args
2518            .clauses
2519            .iter()
2520            .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2521        {
2522            self.parse_null_treatment()?
2523        } else {
2524            None
2525        };
2526
2527        let over = if self.parse_keyword(Keyword::OVER) {
2528            if self.consume_token(&Token::LParen) {
2529                let window_spec = self.parse_window_spec()?;
2530                Some(WindowType::WindowSpec(window_spec))
2531            } else {
2532                Some(WindowType::NamedWindow(self.parse_identifier()?))
2533            }
2534        } else {
2535            None
2536        };
2537
2538        Ok(Function {
2539            name,
2540            uses_odbc_syntax: false,
2541            parameters,
2542            args: FunctionArguments::List(args),
2543            null_treatment,
2544            filter,
2545            over,
2546            within_group,
2547        })
2548    }
2549
2550    /// Optionally parses a null treatment clause.
2551    fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2552        match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2553            Some(keyword) => {
2554                self.expect_keyword_is(Keyword::NULLS)?;
2555
2556                Ok(match keyword {
2557                    Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2558                    Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2559                    _ => None,
2560                })
2561            }
2562            None => Ok(None),
2563        }
2564    }
2565
2566    /// Parse time-related function `name` possibly followed by `(...)` arguments.
2567    pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2568        let args = if self.consume_token(&Token::LParen) {
2569            FunctionArguments::List(self.parse_function_argument_list()?)
2570        } else {
2571            FunctionArguments::None
2572        };
2573        Ok(Expr::Function(Function {
2574            name,
2575            uses_odbc_syntax: false,
2576            parameters: FunctionArguments::None,
2577            args,
2578            filter: None,
2579            over: None,
2580            null_treatment: None,
2581            within_group: vec![],
2582        }))
2583    }
2584
2585    /// Parse window frame `UNITS` clause: `ROWS`, `RANGE`, or `GROUPS`.
2586    pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2587        let next_token = self.next_token();
2588        match &next_token.token {
2589            Token::Word(w) => match w.keyword {
2590                Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2591                Keyword::RANGE => Ok(WindowFrameUnits::Range),
2592                Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2593                _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2594            },
2595            _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2596        }
2597    }
2598
2599    /// Parse a `WINDOW` frame definition (units and bounds).
2600    pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2601        let units = self.parse_window_frame_units()?;
2602        let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2603            let start_bound = self.parse_window_frame_bound()?;
2604            self.expect_keyword_is(Keyword::AND)?;
2605            let end_bound = Some(self.parse_window_frame_bound()?);
2606            (start_bound, end_bound)
2607        } else {
2608            (self.parse_window_frame_bound()?, None)
2609        };
2610        Ok(WindowFrame {
2611            units,
2612            start_bound,
2613            end_bound,
2614        })
2615    }
2616
2617    /// Parse a window frame bound: `CURRENT ROW` or `<n> PRECEDING|FOLLOWING`.
2618    pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2619        if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2620            Ok(WindowFrameBound::CurrentRow)
2621        } else {
2622            let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2623                None
2624            } else {
2625                Some(Box::new(match &self.peek_token_ref().token {
2626                    Token::SingleQuotedString(_) => self.parse_interval()?,
2627                    _ => self.parse_expr()?,
2628                }))
2629            };
2630            if self.parse_keyword(Keyword::PRECEDING) {
2631                Ok(WindowFrameBound::Preceding(rows))
2632            } else if self.parse_keyword(Keyword::FOLLOWING) {
2633                Ok(WindowFrameBound::Following(rows))
2634            } else {
2635                self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2636            }
2637        }
2638    }
2639
2640    /// Parse a group by expr. Group by expr can be one of group sets, roll up, cube, or simple expr.
2641    fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2642        if self.dialect.supports_group_by_expr() {
2643            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2644                self.expect_token(&Token::LParen)?;
2645                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2646                self.expect_token(&Token::RParen)?;
2647                Ok(Expr::GroupingSets(result))
2648            } else if self.parse_keyword(Keyword::CUBE) {
2649                self.expect_token(&Token::LParen)?;
2650                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2651                self.expect_token(&Token::RParen)?;
2652                Ok(Expr::Cube(result))
2653            } else if self.parse_keyword(Keyword::ROLLUP) {
2654                self.expect_token(&Token::LParen)?;
2655                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2656                self.expect_token(&Token::RParen)?;
2657                Ok(Expr::Rollup(result))
2658            } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2659                // PostgreSQL allow to use empty tuple as a group by expression,
2660                // e.g. `GROUP BY (), name`. Please refer to GROUP BY Clause section in
2661                // [PostgreSQL](https://www.postgresql.org/docs/16/sql-select.html)
2662                Ok(Expr::Tuple(vec![]))
2663            } else {
2664                self.parse_expr()
2665            }
2666        } else {
2667            // TODO parse rollup for other dialects
2668            self.parse_expr()
2669        }
2670    }
2671
2672    /// Parse a tuple with `(` and `)`.
2673    /// If `lift_singleton` is true, then a singleton tuple is lifted to a tuple of length 1, otherwise it will fail.
2674    /// If `allow_empty` is true, then an empty tuple is allowed.
2675    fn parse_tuple(
2676        &mut self,
2677        lift_singleton: bool,
2678        allow_empty: bool,
2679    ) -> Result<Vec<Expr>, ParserError> {
2680        if lift_singleton {
2681            if self.consume_token(&Token::LParen) {
2682                let result = if allow_empty && self.consume_token(&Token::RParen) {
2683                    vec![]
2684                } else {
2685                    let result = self.parse_comma_separated(Parser::parse_expr)?;
2686                    self.expect_token(&Token::RParen)?;
2687                    result
2688                };
2689                Ok(result)
2690            } else {
2691                Ok(vec![self.parse_expr()?])
2692            }
2693        } else {
2694            self.expect_token(&Token::LParen)?;
2695            let result = if allow_empty && self.consume_token(&Token::RParen) {
2696                vec![]
2697            } else {
2698                let result = self.parse_comma_separated(Parser::parse_expr)?;
2699                self.expect_token(&Token::RParen)?;
2700                result
2701            };
2702            Ok(result)
2703        }
2704    }
2705
2706    /// Parse a `CASE` expression and return an [`Expr::Case`].
2707    pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2708        let case_token = AttachedToken(self.get_current_token().clone());
2709        let mut operand = None;
2710        if !self.parse_keyword(Keyword::WHEN) {
2711            operand = Some(Box::new(self.parse_expr()?));
2712            self.expect_keyword_is(Keyword::WHEN)?;
2713        }
2714        let mut conditions = vec![];
2715        loop {
2716            let condition = self.parse_expr()?;
2717            self.expect_keyword_is(Keyword::THEN)?;
2718            let result = self.parse_expr()?;
2719            conditions.push(CaseWhen { condition, result });
2720            if !self.parse_keyword(Keyword::WHEN) {
2721                break;
2722            }
2723        }
2724        let else_result = if self.parse_keyword(Keyword::ELSE) {
2725            Some(Box::new(self.parse_expr()?))
2726        } else {
2727            None
2728        };
2729        let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2730        Ok(Expr::Case {
2731            case_token,
2732            end_token,
2733            operand,
2734            conditions,
2735            else_result,
2736        })
2737    }
2738
2739    /// Parse an optional `FORMAT` clause for `CAST` expressions.
2740    pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2741        if self.parse_keyword(Keyword::FORMAT) {
2742            let value = self.parse_value()?;
2743            match self.parse_optional_time_zone()? {
2744                Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2745                None => Ok(Some(CastFormat::Value(value))),
2746            }
2747        } else {
2748            Ok(None)
2749        }
2750    }
2751
2752    /// Parse an optional `AT TIME ZONE` clause.
2753    pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2754        if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2755            self.parse_value().map(Some)
2756        } else {
2757            Ok(None)
2758        }
2759    }
2760
2761    /// mssql-like convert function
2762    fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2763        self.expect_token(&Token::LParen)?;
2764        let data_type = self.parse_data_type()?;
2765        self.expect_token(&Token::Comma)?;
2766        let expr = self.parse_expr()?;
2767        let styles = if self.consume_token(&Token::Comma) {
2768            self.parse_comma_separated(Parser::parse_expr)?
2769        } else {
2770            Default::default()
2771        };
2772        self.expect_token(&Token::RParen)?;
2773        Ok(Expr::Convert {
2774            is_try,
2775            expr: Box::new(expr),
2776            data_type: Some(data_type),
2777            charset: None,
2778            target_before_value: true,
2779            styles,
2780        })
2781    }
2782
2783    /// Parse a SQL CONVERT function:
2784    ///  - `CONVERT('héhé' USING utf8mb4)` (MySQL)
2785    ///  - `CONVERT('héhé', CHAR CHARACTER SET utf8mb4)` (MySQL)
2786    ///  - `CONVERT(DECIMAL(10, 5), 42)` (MSSQL) - the type comes first
2787    pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2788        if self.dialect.convert_type_before_value() {
2789            return self.parse_mssql_convert(is_try);
2790        }
2791        self.expect_token(&Token::LParen)?;
2792        let expr = self.parse_expr()?;
2793        if self.parse_keyword(Keyword::USING) {
2794            let charset = self.parse_object_name(false)?;
2795            self.expect_token(&Token::RParen)?;
2796            return Ok(Expr::Convert {
2797                is_try,
2798                expr: Box::new(expr),
2799                data_type: None,
2800                charset: Some(charset),
2801                target_before_value: false,
2802                styles: vec![],
2803            });
2804        }
2805        self.expect_token(&Token::Comma)?;
2806        let data_type = self.parse_data_type()?;
2807        let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2808            Some(self.parse_object_name(false)?)
2809        } else {
2810            None
2811        };
2812        self.expect_token(&Token::RParen)?;
2813        Ok(Expr::Convert {
2814            is_try,
2815            expr: Box::new(expr),
2816            data_type: Some(data_type),
2817            charset,
2818            target_before_value: false,
2819            styles: vec![],
2820        })
2821    }
2822
2823    /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
2824    pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2825        self.expect_token(&Token::LParen)?;
2826        let expr = self.parse_expr()?;
2827        self.expect_keyword_is(Keyword::AS)?;
2828        let data_type = self.parse_data_type()?;
2829        let array = self.parse_keyword(Keyword::ARRAY);
2830        let format = self.parse_optional_cast_format()?;
2831        self.expect_token(&Token::RParen)?;
2832        Ok(Expr::Cast {
2833            kind,
2834            expr: Box::new(expr),
2835            data_type,
2836            array,
2837            format,
2838        })
2839    }
2840
2841    /// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
2842    pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2843        self.expect_token(&Token::LParen)?;
2844        let exists_node = Expr::Exists {
2845            negated,
2846            subquery: self.parse_query()?,
2847        };
2848        self.expect_token(&Token::RParen)?;
2849        Ok(exists_node)
2850    }
2851
2852    /// Parse a SQL `EXTRACT` expression e.g. `EXTRACT(YEAR FROM date)`.
2853    pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2854        self.expect_token(&Token::LParen)?;
2855        let field = self.parse_date_time_field()?;
2856
2857        let syntax = if self.parse_keyword(Keyword::FROM) {
2858            ExtractSyntax::From
2859        } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2860        {
2861            ExtractSyntax::Comma
2862        } else {
2863            return Err(ParserError::ParserError(
2864                "Expected 'FROM' or ','".to_string(),
2865            ));
2866        };
2867
2868        let expr = self.parse_expr()?;
2869        self.expect_token(&Token::RParen)?;
2870        Ok(Expr::Extract {
2871            field,
2872            expr: Box::new(expr),
2873            syntax,
2874        })
2875    }
2876
2877    /// Parse a `CEIL` or `FLOOR` expression.
2878    pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2879        self.expect_token(&Token::LParen)?;
2880        let expr = self.parse_expr()?;
2881        // Parse `CEIL/FLOOR(expr)`
2882        let field = if self.parse_keyword(Keyword::TO) {
2883            // Parse `CEIL/FLOOR(expr TO DateTimeField)`
2884            CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2885        } else if self.consume_token(&Token::Comma) {
2886            // Parse `CEIL/FLOOR(expr, scale)`
2887            let v = self.parse_value()?;
2888            if matches!(v.value, Value::Number(_, _)) {
2889                CeilFloorKind::Scale(v)
2890            } else {
2891                return Err(ParserError::ParserError(
2892                    "Scale field can only be of number type".to_string(),
2893                ));
2894            }
2895        } else {
2896            CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2897        };
2898        self.expect_token(&Token::RParen)?;
2899        if is_ceil {
2900            Ok(Expr::Ceil {
2901                expr: Box::new(expr),
2902                field,
2903            })
2904        } else {
2905            Ok(Expr::Floor {
2906                expr: Box::new(expr),
2907                field,
2908            })
2909        }
2910    }
2911
2912    /// Parse a `POSITION` expression.
2913    pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2914        let between_prec = self.dialect.prec_value(Precedence::Between);
2915        let position_expr = self.maybe_parse(|p| {
2916            // PARSE SELECT POSITION('@' in field)
2917            p.expect_token(&Token::LParen)?;
2918
2919            // Parse the subexpr till the IN keyword
2920            let expr = p.parse_subexpr(between_prec)?;
2921            p.expect_keyword_is(Keyword::IN)?;
2922            let from = p.parse_expr()?;
2923            p.expect_token(&Token::RParen)?;
2924            Ok(Expr::Position {
2925                expr: Box::new(expr),
2926                r#in: Box::new(from),
2927            })
2928        })?;
2929        match position_expr {
2930            Some(expr) => Ok(expr),
2931            // Snowflake supports `position` as an ordinary function call
2932            // without the special `IN` syntax.
2933            None => self.parse_function(ObjectName::from(vec![ident])),
2934        }
2935    }
2936
2937    /// Parse `SUBSTRING`/`SUBSTR` expressions: `SUBSTRING(expr FROM start FOR length)` or `SUBSTR(expr, start, length)`.
2938    pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
2939        let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
2940            Keyword::SUBSTR => true,
2941            Keyword::SUBSTRING => false,
2942            _ => {
2943                self.prev_token();
2944                return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
2945            }
2946        };
2947        self.expect_token(&Token::LParen)?;
2948        let expr = self.parse_expr()?;
2949        let mut from_expr = None;
2950        let special = self.consume_token(&Token::Comma);
2951        if special || self.parse_keyword(Keyword::FROM) {
2952            from_expr = Some(self.parse_expr()?);
2953        }
2954
2955        let mut to_expr = None;
2956        if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
2957            to_expr = Some(self.parse_expr()?);
2958        }
2959        self.expect_token(&Token::RParen)?;
2960
2961        Ok(Expr::Substring {
2962            expr: Box::new(expr),
2963            substring_from: from_expr.map(Box::new),
2964            substring_for: to_expr.map(Box::new),
2965            special,
2966            shorthand,
2967        })
2968    }
2969
2970    /// Parse an OVERLAY expression.
2971    ///
2972    /// See [Expr::Overlay]
2973    pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
2974        // PARSE OVERLAY (EXPR PLACING EXPR FROM 1 [FOR 3])
2975        self.expect_token(&Token::LParen)?;
2976        let expr = self.parse_expr()?;
2977        self.expect_keyword_is(Keyword::PLACING)?;
2978        let what_expr = self.parse_expr()?;
2979        self.expect_keyword_is(Keyword::FROM)?;
2980        let from_expr = self.parse_expr()?;
2981        let mut for_expr = None;
2982        if self.parse_keyword(Keyword::FOR) {
2983            for_expr = Some(self.parse_expr()?);
2984        }
2985        self.expect_token(&Token::RParen)?;
2986
2987        Ok(Expr::Overlay {
2988            expr: Box::new(expr),
2989            overlay_what: Box::new(what_expr),
2990            overlay_from: Box::new(from_expr),
2991            overlay_for: for_expr.map(Box::new),
2992        })
2993    }
2994
2995    /// ```sql
2996    /// TRIM ([WHERE] ['text' FROM] 'text')
2997    /// TRIM ('text')
2998    /// TRIM(<expr>, [, characters]) -- PostgreSQL, DuckDB, Snowflake, BigQuery, Generic
2999    /// ```
3000    pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
3001        self.expect_token(&Token::LParen)?;
3002        let mut trim_where = None;
3003        if let Token::Word(word) = &self.peek_token_ref().token {
3004            if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
3005                trim_where = Some(self.parse_trim_where()?);
3006            }
3007        }
3008        let expr = self.parse_expr()?;
3009        if self.parse_keyword(Keyword::FROM) {
3010            let trim_what = Box::new(expr);
3011            let expr = self.parse_expr()?;
3012            self.expect_token(&Token::RParen)?;
3013            Ok(Expr::Trim {
3014                expr: Box::new(expr),
3015                trim_where,
3016                trim_what: Some(trim_what),
3017                trim_characters: None,
3018            })
3019        } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
3020        {
3021            let characters = self.parse_comma_separated(Parser::parse_expr)?;
3022            self.expect_token(&Token::RParen)?;
3023            Ok(Expr::Trim {
3024                expr: Box::new(expr),
3025                trim_where: None,
3026                trim_what: None,
3027                trim_characters: Some(characters),
3028            })
3029        } else {
3030            self.expect_token(&Token::RParen)?;
3031            Ok(Expr::Trim {
3032                expr: Box::new(expr),
3033                trim_where,
3034                trim_what: None,
3035                trim_characters: None,
3036            })
3037        }
3038    }
3039
3040    /// Parse the `WHERE` field for a `TRIM` expression.
3041    ///
3042    /// See [TrimWhereField]
3043    pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3044        let next_token = self.next_token();
3045        match &next_token.token {
3046            Token::Word(w) => match w.keyword {
3047                Keyword::BOTH => Ok(TrimWhereField::Both),
3048                Keyword::LEADING => Ok(TrimWhereField::Leading),
3049                Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3050                _ => self.expected("trim_where field", next_token)?,
3051            },
3052            _ => self.expected("trim_where field", next_token),
3053        }
3054    }
3055
3056    /// Parses an array expression `[ex1, ex2, ..]`
3057    /// if `named` is `true`, came from an expression like  `ARRAY[ex1, ex2]`
3058    pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3059        let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3060        self.expect_token(&Token::RBracket)?;
3061        Ok(Expr::Array(Array { elem: exprs, named }))
3062    }
3063
3064    /// Parse the `ON OVERFLOW` clause for `LISTAGG`.
3065    ///
3066    /// See [`ListAggOnOverflow`]
3067    pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3068        if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3069            if self.parse_keyword(Keyword::ERROR) {
3070                Ok(Some(ListAggOnOverflow::Error))
3071            } else {
3072                self.expect_keyword_is(Keyword::TRUNCATE)?;
3073                let filler = match &self.peek_token_ref().token {
3074                    Token::Word(w)
3075                        if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3076                    {
3077                        None
3078                    }
3079                    Token::SingleQuotedString(_)
3080                    | Token::EscapedStringLiteral(_)
3081                    | Token::UnicodeStringLiteral(_)
3082                    | Token::NationalStringLiteral(_)
3083                    | Token::QuoteDelimitedStringLiteral(_)
3084                    | Token::NationalQuoteDelimitedStringLiteral(_)
3085                    | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3086                    _ => self.expected_ref(
3087                        "either filler, WITH, or WITHOUT in LISTAGG",
3088                        self.peek_token_ref(),
3089                    )?,
3090                };
3091                let with_count = self.parse_keyword(Keyword::WITH);
3092                if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3093                    self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3094                }
3095                self.expect_keyword_is(Keyword::COUNT)?;
3096                Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3097            }
3098        } else {
3099            Ok(None)
3100        }
3101    }
3102
3103    /// Parse a date/time field for `EXTRACT`, interval qualifiers, and ceil/floor operations.
3104    ///
3105    /// `EXTRACT` supports a wider set of date/time fields than interval qualifiers,
3106    /// so this function may need to be split in two.
3107    ///
3108    /// See [`DateTimeField`]
3109    pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3110        let next_token = self.next_token();
3111        match &next_token.token {
3112            Token::Word(w) => match w.keyword {
3113                Keyword::YEAR => Ok(DateTimeField::Year),
3114                Keyword::YEARS => Ok(DateTimeField::Years),
3115                Keyword::MONTH => Ok(DateTimeField::Month),
3116                Keyword::MONTHS => Ok(DateTimeField::Months),
3117                Keyword::WEEK => {
3118                    let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3119                        && self.consume_token(&Token::LParen)
3120                    {
3121                        let week_day = self.parse_identifier()?;
3122                        self.expect_token(&Token::RParen)?;
3123                        Some(week_day)
3124                    } else {
3125                        None
3126                    };
3127                    Ok(DateTimeField::Week(week_day))
3128                }
3129                Keyword::WEEKS => Ok(DateTimeField::Weeks),
3130                Keyword::DAY => Ok(DateTimeField::Day),
3131                Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3132                Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3133                Keyword::DAYS => Ok(DateTimeField::Days),
3134                Keyword::DATE => Ok(DateTimeField::Date),
3135                Keyword::DATETIME => Ok(DateTimeField::Datetime),
3136                Keyword::HOUR => Ok(DateTimeField::Hour),
3137                Keyword::HOURS => Ok(DateTimeField::Hours),
3138                Keyword::MINUTE => Ok(DateTimeField::Minute),
3139                Keyword::MINUTES => Ok(DateTimeField::Minutes),
3140                Keyword::SECOND => Ok(DateTimeField::Second),
3141                Keyword::SECONDS => Ok(DateTimeField::Seconds),
3142                Keyword::CENTURY => Ok(DateTimeField::Century),
3143                Keyword::DECADE => Ok(DateTimeField::Decade),
3144                Keyword::DOY => Ok(DateTimeField::Doy),
3145                Keyword::DOW => Ok(DateTimeField::Dow),
3146                Keyword::EPOCH => Ok(DateTimeField::Epoch),
3147                Keyword::ISODOW => Ok(DateTimeField::Isodow),
3148                Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3149                Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3150                Keyword::JULIAN => Ok(DateTimeField::Julian),
3151                Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3152                Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3153                Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3154                Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3155                Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3156                Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3157                Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3158                Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3159                Keyword::QUARTER => Ok(DateTimeField::Quarter),
3160                Keyword::TIME => Ok(DateTimeField::Time),
3161                Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3162                Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3163                Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3164                Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3165                Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3166                _ if self.dialect.allow_extract_custom() => {
3167                    self.prev_token();
3168                    let custom = self.parse_identifier()?;
3169                    Ok(DateTimeField::Custom(custom))
3170                }
3171                _ => self.expected("date/time field", next_token),
3172            },
3173            Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3174                self.prev_token();
3175                let custom = self.parse_identifier()?;
3176                Ok(DateTimeField::Custom(custom))
3177            }
3178            _ => self.expected("date/time field", next_token),
3179        }
3180    }
3181
3182    /// Parse a `NOT` expression.
3183    ///
3184    /// Represented in the AST as `Expr::UnaryOp` with `UnaryOperator::Not`.
3185    pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3186        match &self.peek_token_ref().token {
3187            Token::Word(w) => match w.keyword {
3188                Keyword::EXISTS => {
3189                    let negated = true;
3190                    let _ = self.parse_keyword(Keyword::EXISTS);
3191                    self.parse_exists_expr(negated)
3192                }
3193                _ => Ok(Expr::UnaryOp {
3194                    op: UnaryOperator::Not,
3195                    expr: Box::new(
3196                        self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3197                    ),
3198                }),
3199            },
3200            _ => Ok(Expr::UnaryOp {
3201                op: UnaryOperator::Not,
3202                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3203            }),
3204        }
3205    }
3206
3207    /// Parse expression types that start with a left brace '{'.
3208    /// Examples:
3209    /// ```sql
3210    /// -- Dictionary expr.
3211    /// {'key1': 'value1', 'key2': 'value2'}
3212    ///
3213    /// -- Function call using the ODBC syntax.
3214    /// { fn CONCAT('foo', 'bar') }
3215    /// ```
3216    fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3217        let token = self.expect_token(&Token::LBrace)?;
3218
3219        if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3220            self.expect_token(&Token::RBrace)?;
3221            return Ok(fn_expr);
3222        }
3223
3224        if self.dialect.supports_dictionary_syntax() {
3225            self.prev_token(); // Put back the '{'
3226            return self.parse_dictionary();
3227        }
3228
3229        self.expected("an expression", token)
3230    }
3231
3232    /// Parses fulltext expressions [`sqlparser::ast::Expr::MatchAgainst`]
3233    ///
3234    /// # Errors
3235    /// This method will raise an error if the column list is empty or with invalid identifiers,
3236    /// the match expression is not a literal string, or if the search modifier is not valid.
3237    pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3238        let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3239
3240        self.expect_keyword_is(Keyword::AGAINST)?;
3241
3242        self.expect_token(&Token::LParen)?;
3243
3244        // MySQL is too permissive about the value, IMO we can't validate it perfectly on syntax level.
3245        let match_value = self.parse_value()?;
3246
3247        let in_natural_language_mode_keywords = &[
3248            Keyword::IN,
3249            Keyword::NATURAL,
3250            Keyword::LANGUAGE,
3251            Keyword::MODE,
3252        ];
3253
3254        let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3255
3256        let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3257
3258        let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3259            if self.parse_keywords(with_query_expansion_keywords) {
3260                Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3261            } else {
3262                Some(SearchModifier::InNaturalLanguageMode)
3263            }
3264        } else if self.parse_keywords(in_boolean_mode_keywords) {
3265            Some(SearchModifier::InBooleanMode)
3266        } else if self.parse_keywords(with_query_expansion_keywords) {
3267            Some(SearchModifier::WithQueryExpansion)
3268        } else {
3269            None
3270        };
3271
3272        self.expect_token(&Token::RParen)?;
3273
3274        Ok(Expr::MatchAgainst {
3275            columns,
3276            match_value,
3277            opt_search_modifier,
3278        })
3279    }
3280
3281    /// Parse an `INTERVAL` expression.
3282    ///
3283    /// Some syntactically valid intervals:
3284    ///
3285    /// ```sql
3286    ///   1. INTERVAL '1' DAY
3287    ///   2. INTERVAL '1-1' YEAR TO MONTH
3288    ///   3. INTERVAL '1' SECOND
3289    ///   4. INTERVAL '1:1:1.1' HOUR (5) TO SECOND (5)
3290    ///   5. INTERVAL '1.1' SECOND (2, 2)
3291    ///   6. INTERVAL '1:1' HOUR (5) TO MINUTE (5)
3292    ///   7. (MySql & BigQuery only): INTERVAL 1 DAY
3293    /// ```
3294    ///
3295    /// Note that we do not currently attempt to parse the quoted value.
3296    pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3297        // The SQL standard allows an optional sign before the value string, but
3298        // it is not clear if any implementations support that syntax, so we
3299        // don't currently try to parse it. (The sign can instead be included
3300        // inside the value string.)
3301
3302        // to match the different flavours of INTERVAL syntax, we only allow expressions
3303        // if the dialect requires an interval qualifier,
3304        // see https://github.com/sqlparser-rs/sqlparser-rs/pull/1398 for more details
3305        let value = if self.dialect.require_interval_qualifier() {
3306            // parse a whole expression so `INTERVAL 1 + 1 DAY` is valid
3307            self.parse_expr()?
3308        } else {
3309            // parse a prefix expression so `INTERVAL 1 DAY` is valid, but `INTERVAL 1 + 1 DAY` is not
3310            // this also means that `INTERVAL '5 days' > INTERVAL '1 day'` treated properly
3311            self.parse_prefix()?
3312        };
3313
3314        // Following the string literal is a qualifier which indicates the units
3315        // of the duration specified in the string literal.
3316        //
3317        // Note that PostgreSQL allows omitting the qualifier, so we provide
3318        // this more general implementation.
3319        let leading_field = if self.next_token_is_temporal_unit() {
3320            Some(self.parse_date_time_field()?)
3321        } else if self.dialect.require_interval_qualifier() {
3322            return parser_err!(
3323                "INTERVAL requires a unit after the literal value",
3324                self.peek_token_ref().span.start
3325            );
3326        } else {
3327            None
3328        };
3329
3330        let (leading_precision, last_field, fsec_precision) =
3331            if leading_field == Some(DateTimeField::Second) {
3332                // SQL mandates special syntax for `SECOND TO SECOND` literals.
3333                // Instead of
3334                //     `SECOND [(<leading precision>)] TO SECOND[(<fractional seconds precision>)]`
3335                // one must use the special format:
3336                //     `SECOND [( <leading precision> [ , <fractional seconds precision>] )]`
3337                let last_field = None;
3338                let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3339                (leading_precision, last_field, fsec_precision)
3340            } else {
3341                let leading_precision = self.parse_optional_precision()?;
3342                if self.parse_keyword(Keyword::TO) {
3343                    let last_field = Some(self.parse_date_time_field()?);
3344                    let fsec_precision = if last_field == Some(DateTimeField::Second) {
3345                        self.parse_optional_precision()?
3346                    } else {
3347                        None
3348                    };
3349                    (leading_precision, last_field, fsec_precision)
3350                } else {
3351                    (leading_precision, None, None)
3352                }
3353            };
3354
3355        Ok(Expr::Interval(Interval {
3356            value: Box::new(value),
3357            leading_field,
3358            leading_precision,
3359            last_field,
3360            fractional_seconds_precision: fsec_precision,
3361        }))
3362    }
3363
3364    /// Peek at the next token and determine if it is a temporal unit
3365    /// like `second`.
3366    pub fn next_token_is_temporal_unit(&mut self) -> bool {
3367        if let Token::Word(word) = &self.peek_token_ref().token {
3368            matches!(
3369                word.keyword,
3370                Keyword::YEAR
3371                    | Keyword::YEARS
3372                    | Keyword::MONTH
3373                    | Keyword::MONTHS
3374                    | Keyword::WEEK
3375                    | Keyword::WEEKS
3376                    | Keyword::DAY
3377                    | Keyword::DAYS
3378                    | Keyword::HOUR
3379                    | Keyword::HOURS
3380                    | Keyword::MINUTE
3381                    | Keyword::MINUTES
3382                    | Keyword::SECOND
3383                    | Keyword::SECONDS
3384                    | Keyword::CENTURY
3385                    | Keyword::DECADE
3386                    | Keyword::DOW
3387                    | Keyword::DOY
3388                    | Keyword::EPOCH
3389                    | Keyword::ISODOW
3390                    | Keyword::ISOYEAR
3391                    | Keyword::JULIAN
3392                    | Keyword::MICROSECOND
3393                    | Keyword::MICROSECONDS
3394                    | Keyword::MILLENIUM
3395                    | Keyword::MILLENNIUM
3396                    | Keyword::MILLISECOND
3397                    | Keyword::MILLISECONDS
3398                    | Keyword::NANOSECOND
3399                    | Keyword::NANOSECONDS
3400                    | Keyword::QUARTER
3401                    | Keyword::TIMEZONE
3402                    | Keyword::TIMEZONE_HOUR
3403                    | Keyword::TIMEZONE_MINUTE
3404            )
3405        } else {
3406            false
3407        }
3408    }
3409
3410    /// Syntax
3411    /// ```sql
3412    /// -- typed
3413    /// STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
3414    /// -- typeless
3415    /// STRUCT( expr1 [AS field_name] [, ... ])
3416    /// ```
3417    fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3418        // Parse the fields definition if exist `<[field_name] field_type, ...>`
3419        self.prev_token();
3420        let (fields, trailing_bracket) =
3421            self.parse_struct_type_def(Self::parse_struct_field_def)?;
3422        if trailing_bracket.0 {
3423            return parser_err!(
3424                "unmatched > in STRUCT literal",
3425                self.peek_token_ref().span.start
3426            );
3427        }
3428
3429        // Parse the struct values `(expr1 [, ... ])`
3430        self.expect_token(&Token::LParen)?;
3431        let values = self
3432            .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3433        self.expect_token(&Token::RParen)?;
3434
3435        Ok(Expr::Struct { values, fields })
3436    }
3437
3438    /// Parse an expression value for a struct literal
3439    /// Syntax
3440    /// ```sql
3441    /// expr [AS name]
3442    /// ```
3443    ///
3444    /// For biquery [1], Parameter typed_syntax is set to true if the expression
3445    /// is to be parsed as a field expression declared using typed
3446    /// struct syntax [2], and false if using typeless struct syntax [3].
3447    ///
3448    /// [1]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct
3449    /// [2]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typed_struct_syntax
3450    /// [3]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax
3451    fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3452        let expr = self.parse_expr()?;
3453        if self.parse_keyword(Keyword::AS) {
3454            if typed_syntax {
3455                return parser_err!("Typed syntax does not allow AS", {
3456                    self.prev_token();
3457                    self.peek_token_ref().span.start
3458                });
3459            }
3460            let field_name = self.parse_identifier()?;
3461            Ok(Expr::Named {
3462                expr: expr.into(),
3463                name: field_name,
3464            })
3465        } else {
3466            Ok(expr)
3467        }
3468    }
3469
3470    /// Parse a Struct type definition as a sequence of field-value pairs.
3471    /// The syntax of the Struct elem differs by dialect so it is customised
3472    /// by the `elem_parser` argument.
3473    ///
3474    /// Syntax
3475    /// ```sql
3476    /// Hive:
3477    /// STRUCT<field_name: field_type>
3478    ///
3479    /// BigQuery:
3480    /// STRUCT<[field_name] field_type>
3481    /// ```
3482    fn parse_struct_type_def<F>(
3483        &mut self,
3484        mut elem_parser: F,
3485    ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3486    where
3487        F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3488    {
3489        self.expect_keyword_is(Keyword::STRUCT)?;
3490
3491        // Nothing to do if we have no type information.
3492        if self.peek_token_ref().token != Token::Lt {
3493            return Ok((Default::default(), false.into()));
3494        }
3495        self.next_token();
3496
3497        let mut field_defs = vec![];
3498        let trailing_bracket = loop {
3499            let (def, trailing_bracket) = elem_parser(self)?;
3500            field_defs.push(def);
3501            // The struct field definition is finished if it occurs `>>` or comma.
3502            if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3503                break trailing_bracket;
3504            }
3505        };
3506
3507        Ok((
3508            field_defs,
3509            self.expect_closing_angle_bracket(trailing_bracket)?,
3510        ))
3511    }
3512
3513    /// Duckdb Struct Data Type <https://duckdb.org/docs/sql/data_types/struct.html#retrieving-from-structs>
3514    fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3515        self.expect_keyword_is(Keyword::STRUCT)?;
3516        self.expect_token(&Token::LParen)?;
3517        let struct_body = self.parse_comma_separated(|parser| {
3518            let field_name = parser.parse_identifier()?;
3519            let field_type = parser.parse_data_type()?;
3520
3521            Ok(StructField {
3522                field_name: Some(field_name),
3523                field_type,
3524                options: None,
3525            })
3526        });
3527        self.expect_token(&Token::RParen)?;
3528        struct_body
3529    }
3530
3531    /// Parse a field definition in a [struct] or [tuple].
3532    /// Syntax:
3533    ///
3534    /// ```sql
3535    /// [field_name] field_type
3536    /// field_name: field_type
3537    /// ```
3538    ///
3539    /// [struct]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#declaring_a_struct_type
3540    /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
3541    /// [databricks]: https://docs.databricks.com/en/sql/language-manual/data-types/struct-type.html
3542    fn parse_struct_field_def(
3543        &mut self,
3544    ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3545        // Look beyond the next item to infer whether both field name
3546        // and type are specified.
3547        let is_named_field = matches!(
3548            (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3549            (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3550        );
3551
3552        let field_name = if is_named_field {
3553            let name = self.parse_identifier()?;
3554            let _ = self.consume_token(&Token::Colon);
3555            Some(name)
3556        } else {
3557            None
3558        };
3559
3560        let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3561
3562        let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3563        Ok((
3564            StructField {
3565                field_name,
3566                field_type,
3567                options,
3568            },
3569            trailing_bracket,
3570        ))
3571    }
3572
3573    /// DuckDB specific: Parse a Union type definition as a sequence of field-value pairs.
3574    ///
3575    /// Syntax:
3576    ///
3577    /// ```sql
3578    /// UNION(field_name field_type[,...])
3579    /// ```
3580    ///
3581    /// [1]: https://duckdb.org/docs/sql/data_types/union.html
3582    fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3583        self.expect_keyword_is(Keyword::UNION)?;
3584
3585        self.expect_token(&Token::LParen)?;
3586
3587        let fields = self.parse_comma_separated(|p| {
3588            Ok(UnionField {
3589                field_name: p.parse_identifier()?,
3590                field_type: p.parse_data_type()?,
3591            })
3592        })?;
3593
3594        self.expect_token(&Token::RParen)?;
3595
3596        Ok(fields)
3597    }
3598
3599    /// DuckDB and ClickHouse specific: Parse a duckdb [dictionary] or a clickhouse [map] setting
3600    ///
3601    /// Syntax:
3602    ///
3603    /// ```sql
3604    /// {'field_name': expr1[, ... ]}
3605    /// ```
3606    ///
3607    /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
3608    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
3609    fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3610        self.expect_token(&Token::LBrace)?;
3611
3612        let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3613
3614        self.expect_token(&Token::RBrace)?;
3615
3616        Ok(Expr::Dictionary(fields))
3617    }
3618
3619    /// Parse a field for a duckdb [dictionary] or a clickhouse [map] setting
3620    ///
3621    /// Syntax
3622    ///
3623    /// ```sql
3624    /// 'name': expr
3625    /// ```
3626    ///
3627    /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
3628    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
3629    fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3630        let key = self.parse_identifier()?;
3631
3632        self.expect_token(&Token::Colon)?;
3633
3634        let expr = self.parse_expr()?;
3635
3636        Ok(DictionaryField {
3637            key,
3638            value: Box::new(expr),
3639        })
3640    }
3641
3642    /// DuckDB specific: Parse a duckdb [map]
3643    ///
3644    /// Syntax:
3645    ///
3646    /// ```sql
3647    /// Map {key1: value1[, ... ]}
3648    /// ```
3649    ///
3650    /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
3651    fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3652        self.expect_token(&Token::LBrace)?;
3653        let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3654        self.expect_token(&Token::RBrace)?;
3655        Ok(Expr::Map(Map { entries: fields }))
3656    }
3657
3658    /// Parse a field for a duckdb [map]
3659    ///
3660    /// Syntax
3661    ///
3662    /// ```sql
3663    /// key: value
3664    /// ```
3665    ///
3666    /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
3667    fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3668        // Stop before `:` so it can act as a key/value separator
3669        let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3670
3671        self.expect_token(&Token::Colon)?;
3672
3673        let value = self.parse_expr()?;
3674
3675        Ok(MapEntry {
3676            key: Box::new(key),
3677            value: Box::new(value),
3678        })
3679    }
3680
3681    /// Parse clickhouse [map]
3682    ///
3683    /// Syntax
3684    ///
3685    /// ```sql
3686    /// Map(key_data_type, value_data_type)
3687    /// ```
3688    ///
3689    /// [map]: https://clickhouse.com/docs/en/sql-reference/data-types/map
3690    fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3691        self.expect_keyword_is(Keyword::MAP)?;
3692        self.expect_token(&Token::LParen)?;
3693        let key_data_type = self.parse_data_type()?;
3694        self.expect_token(&Token::Comma)?;
3695        let value_data_type = self.parse_data_type()?;
3696        self.expect_token(&Token::RParen)?;
3697
3698        Ok((key_data_type, value_data_type))
3699    }
3700
3701    /// Parse clickhouse [tuple]
3702    ///
3703    /// Syntax
3704    ///
3705    /// ```sql
3706    /// Tuple([field_name] field_type, ...)
3707    /// ```
3708    ///
3709    /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
3710    fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3711        self.expect_keyword_is(Keyword::TUPLE)?;
3712        self.expect_token(&Token::LParen)?;
3713        let mut field_defs = vec![];
3714        loop {
3715            let (def, _) = self.parse_struct_field_def()?;
3716            field_defs.push(def);
3717            if !self.consume_token(&Token::Comma) {
3718                break;
3719            }
3720        }
3721        self.expect_token(&Token::RParen)?;
3722
3723        Ok(field_defs)
3724    }
3725
3726    /// For nested types that use the angle bracket syntax, this matches either
3727    /// `>`, `>>` or nothing depending on which variant is expected (specified by the previously
3728    /// matched `trailing_bracket` argument). It returns whether there is a trailing
3729    /// left to be matched - (i.e. if '>>' was matched).
3730    fn expect_closing_angle_bracket(
3731        &mut self,
3732        trailing_bracket: MatchedTrailingBracket,
3733    ) -> Result<MatchedTrailingBracket, ParserError> {
3734        let trailing_bracket = if !trailing_bracket.0 {
3735            match &self.peek_token_ref().token {
3736                Token::Gt => {
3737                    self.next_token();
3738                    false.into()
3739                }
3740                Token::ShiftRight => {
3741                    self.next_token();
3742                    true.into()
3743                }
3744                _ => return self.expected_ref(">", self.peek_token_ref()),
3745            }
3746        } else {
3747            false.into()
3748        };
3749
3750        Ok(trailing_bracket)
3751    }
3752
3753    /// Parse an operator following an expression
3754    pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3755        // allow the dialect to override infix parsing
3756        if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3757            return infix;
3758        }
3759
3760        let dialect = self.dialect;
3761
3762        self.advance_token();
3763        let tok = self.get_current_token();
3764        debug!("infix: {tok:?}");
3765        let tok_index = self.get_current_index();
3766        let span = tok.span;
3767        let regular_binary_operator = match &tok.token {
3768            Token::Spaceship => Some(BinaryOperator::Spaceship),
3769            Token::DoubleEq => Some(BinaryOperator::Eq),
3770            Token::Assignment => Some(BinaryOperator::Assignment),
3771            Token::Eq => Some(BinaryOperator::Eq),
3772            Token::Neq => Some(BinaryOperator::NotEq),
3773            Token::Gt => Some(BinaryOperator::Gt),
3774            Token::GtEq => Some(BinaryOperator::GtEq),
3775            Token::Lt => Some(BinaryOperator::Lt),
3776            Token::LtEq => Some(BinaryOperator::LtEq),
3777            Token::Plus => Some(BinaryOperator::Plus),
3778            Token::Minus => Some(BinaryOperator::Minus),
3779            Token::Mul => Some(BinaryOperator::Multiply),
3780            Token::Mod => Some(BinaryOperator::Modulo),
3781            Token::StringConcat => Some(BinaryOperator::StringConcat),
3782            Token::Pipe => Some(BinaryOperator::BitwiseOr),
3783            Token::Caret => {
3784                // In PostgreSQL, ^ stands for the exponentiation operation,
3785                // and # stands for XOR. See https://www.postgresql.org/docs/current/functions-math.html
3786                if dialect_is!(dialect is PostgreSqlDialect) {
3787                    Some(BinaryOperator::PGExp)
3788                } else {
3789                    Some(BinaryOperator::BitwiseXor)
3790                }
3791            }
3792            Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3793            Token::Div => Some(BinaryOperator::Divide),
3794            Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3795                Some(BinaryOperator::DuckIntegerDivide)
3796            }
3797            Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3798                Some(BinaryOperator::PGBitwiseShiftLeft)
3799            }
3800            Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3801                Some(BinaryOperator::PGBitwiseShiftRight)
3802            }
3803            Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3804                Some(BinaryOperator::PGBitwiseXor)
3805            }
3806            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3807                Some(BinaryOperator::PGOverlap)
3808            }
3809            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3810                Some(BinaryOperator::PGOverlap)
3811            }
3812            Token::Overlap if dialect.supports_double_ampersand_operator() => {
3813                Some(BinaryOperator::And)
3814            }
3815            Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3816                Some(BinaryOperator::PGStartsWith)
3817            }
3818            Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3819            Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3820            Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3821            Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3822            Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3823            Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3824            Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3825            Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3826            Token::Arrow => Some(BinaryOperator::Arrow),
3827            Token::LongArrow => Some(BinaryOperator::LongArrow),
3828            Token::HashArrow => Some(BinaryOperator::HashArrow),
3829            Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3830            Token::AtArrow => Some(BinaryOperator::AtArrow),
3831            Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3832            Token::HashMinus => Some(BinaryOperator::HashMinus),
3833            Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3834            Token::AtAt => Some(BinaryOperator::AtAt),
3835            Token::Question => Some(BinaryOperator::Question),
3836            Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3837            Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3838            Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3839            Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3840                Some(BinaryOperator::DoubleHash)
3841            }
3842
3843            Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3844                Some(BinaryOperator::AndLt)
3845            }
3846            Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3847                Some(BinaryOperator::AndGt)
3848            }
3849            Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3850                Some(BinaryOperator::QuestionDash)
3851            }
3852            Token::AmpersandLeftAngleBracketVerticalBar
3853                if self.dialect.supports_geometric_types() =>
3854            {
3855                Some(BinaryOperator::AndLtPipe)
3856            }
3857            Token::VerticalBarAmpersandRightAngleBracket
3858                if self.dialect.supports_geometric_types() =>
3859            {
3860                Some(BinaryOperator::PipeAndGt)
3861            }
3862            Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3863                Some(BinaryOperator::LtDashGt)
3864            }
3865            Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3866                Some(BinaryOperator::LtCaret)
3867            }
3868            Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3869                Some(BinaryOperator::GtCaret)
3870            }
3871            Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3872                Some(BinaryOperator::QuestionHash)
3873            }
3874            Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3875                Some(BinaryOperator::QuestionDoublePipe)
3876            }
3877            Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3878                Some(BinaryOperator::QuestionDashPipe)
3879            }
3880            Token::TildeEqual if self.dialect.supports_geometric_types() => {
3881                Some(BinaryOperator::TildeEq)
3882            }
3883            Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3884                Some(BinaryOperator::LtLtPipe)
3885            }
3886            Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3887                Some(BinaryOperator::PipeGtGt)
3888            }
3889            Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3890
3891            Token::Word(w) => match w.keyword {
3892                Keyword::AND => Some(BinaryOperator::And),
3893                Keyword::OR => Some(BinaryOperator::Or),
3894                Keyword::XOR => Some(BinaryOperator::Xor),
3895                Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3896                Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3897                    self.expect_token(&Token::LParen)?;
3898                    // there are special rules for operator names in
3899                    // postgres so we can not use 'parse_object'
3900                    // or similar.
3901                    // See https://www.postgresql.org/docs/current/sql-createoperator.html
3902                    let mut idents = vec![];
3903                    loop {
3904                        self.advance_token();
3905                        idents.push(self.get_current_token().to_string());
3906                        if !self.consume_token(&Token::Period) {
3907                            break;
3908                        }
3909                    }
3910                    self.expect_token(&Token::RParen)?;
3911                    Some(BinaryOperator::PGCustomBinaryOperator(idents))
3912                }
3913                _ => None,
3914            },
3915            _ => None,
3916        };
3917
3918        let tok = self.token_at(tok_index);
3919        if let Some(op) = regular_binary_operator {
3920            if let Some(keyword) =
3921                self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
3922            {
3923                self.expect_token(&Token::LParen)?;
3924                let right = if self.peek_sub_query() {
3925                    // We have a subquery ahead (SELECT\WITH ...) need to rewind and
3926                    // use the parenthesis for parsing the subquery as an expression.
3927                    self.prev_token(); // LParen
3928                    self.parse_subexpr(precedence)?
3929                } else {
3930                    // Non-subquery expression
3931                    let right = self.parse_subexpr(precedence)?;
3932                    self.expect_token(&Token::RParen)?;
3933                    right
3934                };
3935
3936                if !matches!(
3937                    op,
3938                    BinaryOperator::Gt
3939                        | BinaryOperator::Lt
3940                        | BinaryOperator::GtEq
3941                        | BinaryOperator::LtEq
3942                        | BinaryOperator::Eq
3943                        | BinaryOperator::NotEq
3944                        | BinaryOperator::PGRegexMatch
3945                        | BinaryOperator::PGRegexIMatch
3946                        | BinaryOperator::PGRegexNotMatch
3947                        | BinaryOperator::PGRegexNotIMatch
3948                        | BinaryOperator::PGLikeMatch
3949                        | BinaryOperator::PGILikeMatch
3950                        | BinaryOperator::PGNotLikeMatch
3951                        | BinaryOperator::PGNotILikeMatch
3952                ) {
3953                    return parser_err!(
3954                        format!(
3955                        "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
3956                    ),
3957                        span.start
3958                    );
3959                };
3960
3961                Ok(match keyword {
3962                    Keyword::ALL => Expr::AllOp {
3963                        left: Box::new(expr),
3964                        compare_op: op,
3965                        right: Box::new(right),
3966                    },
3967                    Keyword::ANY | Keyword::SOME => Expr::AnyOp {
3968                        left: Box::new(expr),
3969                        compare_op: op,
3970                        right: Box::new(right),
3971                        is_some: keyword == Keyword::SOME,
3972                    },
3973                    unexpected_keyword => return Err(ParserError::ParserError(
3974                        format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
3975                    )),
3976                })
3977            } else {
3978                Ok(Expr::BinaryOp {
3979                    left: Box::new(expr),
3980                    op,
3981                    right: Box::new(self.parse_subexpr(precedence)?),
3982                })
3983            }
3984        } else if let Token::Word(w) = &tok.token {
3985            match w.keyword {
3986                Keyword::IS => {
3987                    if self.parse_keyword(Keyword::NULL) {
3988                        Ok(Expr::IsNull(Box::new(expr)))
3989                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
3990                        Ok(Expr::IsNotNull(Box::new(expr)))
3991                    } else if self.parse_keywords(&[Keyword::TRUE]) {
3992                        Ok(Expr::IsTrue(Box::new(expr)))
3993                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
3994                        Ok(Expr::IsNotTrue(Box::new(expr)))
3995                    } else if self.parse_keywords(&[Keyword::FALSE]) {
3996                        Ok(Expr::IsFalse(Box::new(expr)))
3997                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
3998                        Ok(Expr::IsNotFalse(Box::new(expr)))
3999                    } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
4000                        Ok(Expr::IsUnknown(Box::new(expr)))
4001                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
4002                        Ok(Expr::IsNotUnknown(Box::new(expr)))
4003                    } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
4004                        let expr2 = self.parse_expr()?;
4005                        Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
4006                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
4007                    {
4008                        let expr2 = self.parse_expr()?;
4009                        Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
4010                    } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
4011                        Ok(is_normalized)
4012                    } else {
4013                        self.expected_ref(
4014                            "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS",
4015                            self.peek_token_ref(),
4016                        )
4017                    }
4018                }
4019                Keyword::AT => {
4020                    self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4021                    Ok(Expr::AtTimeZone {
4022                        timestamp: Box::new(expr),
4023                        time_zone: Box::new(self.parse_subexpr(precedence)?),
4024                    })
4025                }
4026                Keyword::NOT
4027                | Keyword::IN
4028                | Keyword::BETWEEN
4029                | Keyword::LIKE
4030                | Keyword::ILIKE
4031                | Keyword::SIMILAR
4032                | Keyword::REGEXP
4033                | Keyword::RLIKE => {
4034                    self.prev_token();
4035                    let negated = self.parse_keyword(Keyword::NOT);
4036                    let regexp = self.parse_keyword(Keyword::REGEXP);
4037                    let rlike = self.parse_keyword(Keyword::RLIKE);
4038                    let null = if !self.in_column_definition_state() {
4039                        self.parse_keyword(Keyword::NULL)
4040                    } else {
4041                        false
4042                    };
4043                    if regexp || rlike {
4044                        Ok(Expr::RLike {
4045                            negated,
4046                            expr: Box::new(expr),
4047                            pattern: Box::new(
4048                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4049                            ),
4050                            regexp,
4051                        })
4052                    } else if negated && null {
4053                        Ok(Expr::IsNotNull(Box::new(expr)))
4054                    } else if self.parse_keyword(Keyword::IN) {
4055                        self.parse_in(expr, negated)
4056                    } else if self.parse_keyword(Keyword::BETWEEN) {
4057                        self.parse_between(expr, negated)
4058                    } else if self.parse_keyword(Keyword::LIKE) {
4059                        Ok(Expr::Like {
4060                            negated,
4061                            any: self.parse_keyword(Keyword::ANY),
4062                            expr: Box::new(expr),
4063                            pattern: Box::new(
4064                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4065                            ),
4066                            escape_char: self.parse_escape_char()?,
4067                        })
4068                    } else if self.parse_keyword(Keyword::ILIKE) {
4069                        Ok(Expr::ILike {
4070                            negated,
4071                            any: self.parse_keyword(Keyword::ANY),
4072                            expr: Box::new(expr),
4073                            pattern: Box::new(
4074                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4075                            ),
4076                            escape_char: self.parse_escape_char()?,
4077                        })
4078                    } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4079                        Ok(Expr::SimilarTo {
4080                            negated,
4081                            expr: Box::new(expr),
4082                            pattern: Box::new(
4083                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4084                            ),
4085                            escape_char: self.parse_escape_char()?,
4086                        })
4087                    } else {
4088                        self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4089                    }
4090                }
4091                Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4092                    Ok(Expr::IsNotNull(Box::new(expr)))
4093                }
4094                Keyword::MEMBER => {
4095                    if self.parse_keyword(Keyword::OF) {
4096                        self.expect_token(&Token::LParen)?;
4097                        let array = self.parse_expr()?;
4098                        self.expect_token(&Token::RParen)?;
4099                        Ok(Expr::MemberOf(MemberOf {
4100                            value: Box::new(expr),
4101                            array: Box::new(array),
4102                        }))
4103                    } else {
4104                        self.expected_ref("OF after MEMBER", self.peek_token_ref())
4105                    }
4106                }
4107                // Can only happen if `get_next_precedence` got out of sync with this function
4108                _ => parser_err!(
4109                    format!("No infix parser for token {:?}", tok.token),
4110                    tok.span.start
4111                ),
4112            }
4113        } else if Token::DoubleColon == *tok {
4114            Ok(Expr::Cast {
4115                kind: CastKind::DoubleColon,
4116                expr: Box::new(expr),
4117                data_type: self.parse_data_type()?,
4118                array: false,
4119                format: None,
4120            })
4121        } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4122            Ok(Expr::UnaryOp {
4123                op: UnaryOperator::PGPostfixFactorial,
4124                expr: Box::new(expr),
4125            })
4126        } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4127            || (Token::Colon == *tok)
4128        {
4129            self.prev_token();
4130            self.parse_json_access(expr)
4131        } else {
4132            // Can only happen if `get_next_precedence` got out of sync with this function
4133            parser_err!(
4134                format!("No infix parser for token {:?}", tok.token),
4135                tok.span.start
4136            )
4137        }
4138    }
4139
4140    /// Parse the `ESCAPE CHAR` portion of `LIKE`, `ILIKE`, and `SIMILAR TO`
4141    pub fn parse_escape_char(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
4142        if self.parse_keyword(Keyword::ESCAPE) {
4143            Ok(Some(self.parse_value()?))
4144        } else {
4145            Ok(None)
4146        }
4147    }
4148
4149    /// Parses an array subscript like
4150    /// * `[:]`
4151    /// * `[l]`
4152    /// * `[l:]`
4153    /// * `[:u]`
4154    /// * `[l:u]`
4155    /// * `[l:u:s]`
4156    ///
4157    /// Parser is right after `[`
4158    fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4159        // at either `<lower>:(rest)` or `:(rest)]`
4160        let lower_bound = if self.consume_token(&Token::Colon) {
4161            None
4162        } else {
4163            // parse expr until we hit a colon (or any token with lower precedence)
4164            Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4165        };
4166
4167        // check for end
4168        if self.consume_token(&Token::RBracket) {
4169            if let Some(lower_bound) = lower_bound {
4170                return Ok(Subscript::Index { index: lower_bound });
4171            };
4172            return Ok(Subscript::Slice {
4173                lower_bound,
4174                upper_bound: None,
4175                stride: None,
4176            });
4177        }
4178
4179        // consume the `:`
4180        if lower_bound.is_some() {
4181            self.expect_token(&Token::Colon)?;
4182        }
4183
4184        // we are now at either `]`, `<upper>(rest)]`
4185        let upper_bound = if self.consume_token(&Token::RBracket) {
4186            return Ok(Subscript::Slice {
4187                lower_bound,
4188                upper_bound: None,
4189                stride: None,
4190            });
4191        } else {
4192            // parse expr until we hit a colon (or any token with lower precedence)
4193            Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4194        };
4195
4196        // check for end
4197        if self.consume_token(&Token::RBracket) {
4198            return Ok(Subscript::Slice {
4199                lower_bound,
4200                upper_bound,
4201                stride: None,
4202            });
4203        }
4204
4205        // we are now at `:]` or `:stride]`
4206        self.expect_token(&Token::Colon)?;
4207        let stride = if self.consume_token(&Token::RBracket) {
4208            None
4209        } else {
4210            Some(self.parse_expr()?)
4211        };
4212
4213        if stride.is_some() {
4214            self.expect_token(&Token::RBracket)?;
4215        }
4216
4217        Ok(Subscript::Slice {
4218            lower_bound,
4219            upper_bound,
4220            stride,
4221        })
4222    }
4223
4224    /// Parse a multi-dimension array accessing like `[1:3][1][1]`
4225    pub fn parse_multi_dim_subscript(
4226        &mut self,
4227        chain: &mut Vec<AccessExpr>,
4228    ) -> Result<(), ParserError> {
4229        while self.consume_token(&Token::LBracket) {
4230            self.parse_subscript(chain)?;
4231        }
4232        Ok(())
4233    }
4234
4235    /// Parses an array subscript like `[1:3]`
4236    ///
4237    /// Parser is right after `[`
4238    fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4239        let subscript = self.parse_subscript_inner()?;
4240        chain.push(AccessExpr::Subscript(subscript));
4241        Ok(())
4242    }
4243
4244    fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4245        let token = self.next_token();
4246        match token.token {
4247            Token::Word(Word {
4248                value,
4249                // path segments in SF dot notation can be unquoted or double-quoted;
4250                // Databricks also supports backtick-quoted identifiers
4251                quote_style: quote_style @ (Some('"') | Some('`') | None),
4252                // some experimentation suggests that snowflake permits
4253                // any keyword here unquoted.
4254                keyword: _,
4255            }) => Ok(JsonPathElem::Dot {
4256                key: value,
4257                quoted: quote_style.is_some(),
4258            }),
4259
4260            // This token should never be generated on snowflake or generic
4261            // dialects, but we handle it just in case this is used on future
4262            // dialects.
4263            Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4264
4265            _ => self.expected("variant object key name", token),
4266        }
4267    }
4268
4269    fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4270        let path = self.parse_json_path()?;
4271        Ok(Expr::JsonAccess {
4272            value: Box::new(expr),
4273            path,
4274        })
4275    }
4276
4277    fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4278        let mut path = Vec::new();
4279        loop {
4280            match self.next_token().token {
4281                Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4282                    self.next_token();
4283                    let key = self.parse_wildcard_expr()?;
4284                    self.expect_token(&Token::RBracket)?;
4285                    path.push(JsonPathElem::ColonBracket { key });
4286                }
4287                Token::Colon if path.is_empty() => {
4288                    path.push(self.parse_json_path_object_key()?);
4289                }
4290                Token::Period if !path.is_empty() => {
4291                    path.push(self.parse_json_path_object_key()?);
4292                }
4293                Token::LBracket => {
4294                    let key = self.parse_wildcard_expr()?;
4295                    self.expect_token(&Token::RBracket)?;
4296
4297                    path.push(JsonPathElem::Bracket { key });
4298                }
4299                _ => {
4300                    self.prev_token();
4301                    break;
4302                }
4303            };
4304        }
4305
4306        debug_assert!(!path.is_empty());
4307        Ok(JsonPath { path })
4308    }
4309
4310    /// Parses the parens following the `[ NOT ] IN` operator.
4311    pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4312        // BigQuery allows `IN UNNEST(array_expression)`
4313        // https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#in_operators
4314        if self.parse_keyword(Keyword::UNNEST) {
4315            self.expect_token(&Token::LParen)?;
4316            let array_expr = self.parse_expr()?;
4317            self.expect_token(&Token::RParen)?;
4318            return Ok(Expr::InUnnest {
4319                expr: Box::new(expr),
4320                array_expr: Box::new(array_expr),
4321                negated,
4322            });
4323        }
4324        self.expect_token(&Token::LParen)?;
4325        let in_op = match self.maybe_parse(|p| p.parse_query())? {
4326            Some(subquery) => Expr::InSubquery {
4327                expr: Box::new(expr),
4328                subquery,
4329                negated,
4330            },
4331            None => Expr::InList {
4332                expr: Box::new(expr),
4333                list: if self.dialect.supports_in_empty_list() {
4334                    self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4335                } else {
4336                    self.parse_comma_separated(Parser::parse_expr)?
4337                },
4338                negated,
4339            },
4340        };
4341        self.expect_token(&Token::RParen)?;
4342        Ok(in_op)
4343    }
4344
4345    /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed.
4346    pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4347        // Stop parsing subexpressions for <low> and <high> on tokens with
4348        // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
4349        let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4350        self.expect_keyword_is(Keyword::AND)?;
4351        let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4352        Ok(Expr::Between {
4353            expr: Box::new(expr),
4354            negated,
4355            low: Box::new(low),
4356            high: Box::new(high),
4357        })
4358    }
4359
4360    /// Parse a PostgreSQL casting style which is in the form of `expr::datatype`.
4361    pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4362        Ok(Expr::Cast {
4363            kind: CastKind::DoubleColon,
4364            expr: Box::new(expr),
4365            data_type: self.parse_data_type()?,
4366            array: false,
4367            format: None,
4368        })
4369    }
4370
4371    /// Get the precedence of the next token
4372    pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4373        self.dialect.get_next_precedence_default(self)
4374    }
4375
4376    /// Return the token at the given location, or EOF if the index is beyond
4377    /// the length of the current set of tokens.
4378    pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4379        self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4380    }
4381
4382    /// Return the first non-whitespace token that has not yet been processed
4383    /// or Token::EOF
4384    ///
4385    /// See [`Self::peek_token_ref`] to avoid the copy.
4386    pub fn peek_token(&self) -> TokenWithSpan {
4387        self.peek_nth_token(0)
4388    }
4389
4390    /// Return a reference to the first non-whitespace token that has not yet
4391    /// been processed or Token::EOF
4392    pub fn peek_token_ref(&self) -> &TokenWithSpan {
4393        self.peek_nth_token_ref(0)
4394    }
4395
4396    /// Returns the `N` next non-whitespace tokens that have not yet been
4397    /// processed.
4398    ///
4399    /// Example:
4400    /// ```rust
4401    /// # use sqlparser::dialect::GenericDialect;
4402    /// # use sqlparser::parser::Parser;
4403    /// # use sqlparser::keywords::Keyword;
4404    /// # use sqlparser::tokenizer::{Token, Word};
4405    /// let dialect = GenericDialect {};
4406    /// let mut parser = Parser::new(&dialect).try_with_sql("ORDER BY foo, bar").unwrap();
4407    ///
4408    /// // Note that Rust infers the number of tokens to peek based on the
4409    /// // length of the slice pattern!
4410    /// assert!(matches!(
4411    ///     parser.peek_tokens(),
4412    ///     [
4413    ///         Token::Word(Word { keyword: Keyword::ORDER, .. }),
4414    ///         Token::Word(Word { keyword: Keyword::BY, .. }),
4415    ///     ]
4416    /// ));
4417    /// ```
4418    pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4419        self.peek_tokens_with_location()
4420            .map(|with_loc| with_loc.token)
4421    }
4422
4423    /// Returns the `N` next non-whitespace tokens with locations that have not
4424    /// yet been processed.
4425    ///
4426    /// See [`Self::peek_token`] for an example.
4427    pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4428        let mut index = self.index;
4429        core::array::from_fn(|_| loop {
4430            let token = self.tokens.get(index);
4431            index += 1;
4432            if let Some(TokenWithSpan {
4433                token: Token::Whitespace(_),
4434                span: _,
4435            }) = token
4436            {
4437                continue;
4438            }
4439            break token.cloned().unwrap_or(TokenWithSpan {
4440                token: Token::EOF,
4441                span: Span::empty(),
4442            });
4443        })
4444    }
4445
4446    /// Returns references to the `N` next non-whitespace tokens
4447    /// that have not yet been processed.
4448    ///
4449    /// See [`Self::peek_tokens`] for an example.
4450    pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4451        let mut index = self.index;
4452        core::array::from_fn(|_| loop {
4453            let token = self.tokens.get(index);
4454            index += 1;
4455            if let Some(TokenWithSpan {
4456                token: Token::Whitespace(_),
4457                span: _,
4458            }) = token
4459            {
4460                continue;
4461            }
4462            break token.unwrap_or(&EOF_TOKEN);
4463        })
4464    }
4465
4466    /// Return nth non-whitespace token that has not yet been processed
4467    pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4468        self.peek_nth_token_ref(n).clone()
4469    }
4470
4471    /// Return nth non-whitespace token that has not yet been processed
4472    pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4473        let mut index = self.index;
4474        loop {
4475            index += 1;
4476            match self.tokens.get(index - 1) {
4477                Some(TokenWithSpan {
4478                    token: Token::Whitespace(_),
4479                    span: _,
4480                }) => continue,
4481                non_whitespace => {
4482                    if n == 0 {
4483                        return non_whitespace.unwrap_or(&EOF_TOKEN);
4484                    }
4485                    n -= 1;
4486                }
4487            }
4488        }
4489    }
4490
4491    /// Return the first token, possibly whitespace, that has not yet been processed
4492    /// (or None if reached end-of-file).
4493    pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4494        self.peek_nth_token_no_skip(0)
4495    }
4496
4497    /// Return nth token, possibly whitespace, that has not yet been processed.
4498    pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4499        self.tokens
4500            .get(self.index + n)
4501            .cloned()
4502            .unwrap_or(TokenWithSpan {
4503                token: Token::EOF,
4504                span: Span::empty(),
4505            })
4506    }
4507
4508    /// Return nth token, possibly whitespace, that has not yet been processed.
4509    fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4510        self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4511    }
4512
4513    /// Return true if the next tokens exactly `expected`
4514    ///
4515    /// Does not advance the current token.
4516    fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4517        let index = self.index;
4518        let matched = self.parse_keywords(expected);
4519        self.index = index;
4520        matched
4521    }
4522
4523    /// Advances to the next non-whitespace token and returns a copy.
4524    ///
4525    /// Please use [`Self::advance_token`] and [`Self::get_current_token`] to
4526    /// avoid the copy.
4527    pub fn next_token(&mut self) -> TokenWithSpan {
4528        self.advance_token();
4529        self.get_current_token().clone()
4530    }
4531
4532    /// Returns the index of the current token
4533    ///
4534    /// This can be used with APIs that expect an index, such as
4535    /// [`Self::token_at`]
4536    pub fn get_current_index(&self) -> usize {
4537        self.index.saturating_sub(1)
4538    }
4539
4540    /// Return the next unprocessed token, possibly whitespace.
4541    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4542        self.index += 1;
4543        self.tokens.get(self.index - 1)
4544    }
4545
4546    /// Advances the current token to the next non-whitespace token
4547    ///
4548    /// See [`Self::get_current_token`] to get the current token after advancing
4549    pub fn advance_token(&mut self) {
4550        loop {
4551            self.index += 1;
4552            match self.tokens.get(self.index - 1) {
4553                Some(TokenWithSpan {
4554                    token: Token::Whitespace(_),
4555                    span: _,
4556                }) => continue,
4557                _ => break,
4558            }
4559        }
4560    }
4561
4562    /// Returns a reference to the current token
4563    ///
4564    /// Does not advance the current token.
4565    pub fn get_current_token(&self) -> &TokenWithSpan {
4566        self.token_at(self.index.saturating_sub(1))
4567    }
4568
4569    /// Returns a reference to the previous token
4570    ///
4571    /// Does not advance the current token.
4572    pub fn get_previous_token(&self) -> &TokenWithSpan {
4573        self.token_at(self.index.saturating_sub(2))
4574    }
4575
4576    /// Returns a reference to the next token
4577    ///
4578    /// Does not advance the current token.
4579    pub fn get_next_token(&self) -> &TokenWithSpan {
4580        self.token_at(self.index)
4581    }
4582
4583    /// Seek back the last one non-whitespace token.
4584    ///
4585    /// Must be called after `next_token()`, otherwise might panic. OK to call
4586    /// after `next_token()` indicates an EOF.
4587    ///
4588    // TODO rename to backup_token and deprecate prev_token?
4589    pub fn prev_token(&mut self) {
4590        loop {
4591            assert!(self.index > 0);
4592            self.index -= 1;
4593            if let Some(TokenWithSpan {
4594                token: Token::Whitespace(_),
4595                span: _,
4596            }) = self.tokens.get(self.index)
4597            {
4598                continue;
4599            }
4600            return;
4601        }
4602    }
4603
4604    /// Report `found` was encountered instead of `expected`
4605    pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4606        parser_err!(
4607            format!("Expected: {expected}, found: {found}"),
4608            found.span.start
4609        )
4610    }
4611
4612    /// report `found` was encountered instead of `expected`
4613    pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4614        parser_err!(
4615            format!("Expected: {expected}, found: {found}"),
4616            found.span.start
4617        )
4618    }
4619
4620    /// Report that the token at `index` was found instead of `expected`.
4621    pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4622        let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4623        parser_err!(
4624            format!("Expected: {expected}, found: {found}"),
4625            found.span.start
4626        )
4627    }
4628
4629    /// If the current token is the `expected` keyword, consume it and returns
4630    /// true. Otherwise, no tokens are consumed and returns false.
4631    #[must_use]
4632    pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4633        if self.peek_keyword(expected) {
4634            self.advance_token();
4635            true
4636        } else {
4637            false
4638        }
4639    }
4640
4641    #[must_use]
4642    /// Check if the current token is the expected keyword without consuming it.
4643    ///
4644    /// Returns true if the current token matches the expected keyword.
4645    pub fn peek_keyword(&self, expected: Keyword) -> bool {
4646        matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4647    }
4648
4649    /// If the current token is the `expected` keyword followed by
4650    /// specified tokens, consume them and returns true.
4651    /// Otherwise, no tokens are consumed and returns false.
4652    ///
4653    /// Note that if the length of `tokens` is too long, this function will
4654    /// not be efficient as it does a loop on the tokens with `peek_nth_token`
4655    /// each time.
4656    pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4657        self.keyword_with_tokens(expected, tokens, true)
4658    }
4659
4660    /// Peeks to see if the current token is the `expected` keyword followed by specified tokens
4661    /// without consuming them.
4662    ///
4663    /// See [Self::parse_keyword_with_tokens] for details.
4664    pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4665        self.keyword_with_tokens(expected, tokens, false)
4666    }
4667
4668    fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4669        match &self.peek_token_ref().token {
4670            Token::Word(w) if expected == w.keyword => {
4671                for (idx, token) in tokens.iter().enumerate() {
4672                    if self.peek_nth_token_ref(idx + 1).token != *token {
4673                        return false;
4674                    }
4675                }
4676
4677                if consume {
4678                    for _ in 0..(tokens.len() + 1) {
4679                        self.advance_token();
4680                    }
4681                }
4682
4683                true
4684            }
4685            _ => false,
4686        }
4687    }
4688
4689    /// If the current and subsequent tokens exactly match the `keywords`
4690    /// sequence, consume them and returns true. Otherwise, no tokens are
4691    /// consumed and returns false
4692    #[must_use]
4693    pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4694        self.parse_keywords_indexed(keywords).is_some()
4695    }
4696
4697    /// Just like [Self::parse_keywords], but - upon success - returns the
4698    /// token index of the first keyword.
4699    #[must_use]
4700    fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4701        let start_index = self.index;
4702        let mut first_keyword_index = None;
4703        for &keyword in keywords {
4704            if !self.parse_keyword(keyword) {
4705                self.index = start_index;
4706                return None;
4707            }
4708            if first_keyword_index.is_none() {
4709                first_keyword_index = Some(self.index.saturating_sub(1));
4710            }
4711        }
4712        first_keyword_index
4713    }
4714
4715    /// If the current token is one of the given `keywords`, returns the keyword
4716    /// that matches, without consuming the token. Otherwise, returns [`None`].
4717    #[must_use]
4718    pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4719        for keyword in keywords {
4720            if self.peek_keyword(*keyword) {
4721                return Some(*keyword);
4722            }
4723        }
4724        None
4725    }
4726
4727    /// If the current token is one of the given `keywords`, consume the token
4728    /// and return the keyword that matches. Otherwise, no tokens are consumed
4729    /// and returns [`None`].
4730    #[must_use]
4731    pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4732        match &self.peek_token_ref().token {
4733            Token::Word(w) => {
4734                keywords
4735                    .iter()
4736                    .find(|keyword| **keyword == w.keyword)
4737                    .map(|keyword| {
4738                        self.advance_token();
4739                        *keyword
4740                    })
4741            }
4742            _ => None,
4743        }
4744    }
4745
4746    /// If the current token is one of the expected keywords, consume the token
4747    /// and return the keyword that matches. Otherwise, return an error.
4748    pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4749        if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4750            Ok(keyword)
4751        } else {
4752            let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4753            self.expected_ref(
4754                &format!("one of {}", keywords.join(" or ")),
4755                self.peek_token_ref(),
4756            )
4757        }
4758    }
4759
4760    /// If the current token is the `expected` keyword, consume the token.
4761    /// Otherwise, return an error.
4762    ///
4763    // todo deprecate in favor of expected_keyword_is
4764    pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4765        if self.parse_keyword(expected) {
4766            Ok(self.get_current_token().clone())
4767        } else {
4768            self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4769        }
4770    }
4771
4772    /// If the current token is the `expected` keyword, consume the token.
4773    /// Otherwise, return an error.
4774    ///
4775    /// This differs from expect_keyword only in that the matched keyword
4776    /// token is not returned.
4777    pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4778        if self.parse_keyword(expected) {
4779            Ok(())
4780        } else {
4781            self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4782        }
4783    }
4784
4785    /// If the current and subsequent tokens exactly match the `keywords`
4786    /// sequence, consume them and returns Ok. Otherwise, return an Error.
4787    pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4788        for &kw in expected {
4789            self.expect_keyword_is(kw)?;
4790        }
4791        Ok(())
4792    }
4793
4794    /// Consume the next token if it matches the expected token, otherwise return false
4795    ///
4796    /// See [Self::advance_token] to consume the token unconditionally
4797    #[must_use]
4798    pub fn consume_token(&mut self, expected: &Token) -> bool {
4799        if self.peek_token_ref() == expected {
4800            self.advance_token();
4801            true
4802        } else {
4803            false
4804        }
4805    }
4806
4807    /// If the current and subsequent tokens exactly match the `tokens`
4808    /// sequence, consume them and returns true. Otherwise, no tokens are
4809    /// consumed and returns false
4810    #[must_use]
4811    pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4812        let index = self.index;
4813        for token in tokens {
4814            if !self.consume_token(token) {
4815                self.index = index;
4816                return false;
4817            }
4818        }
4819        true
4820    }
4821
4822    /// Bail out if the current token is not an expected keyword, or consume it if it is
4823    pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4824        if self.peek_token_ref() == expected {
4825            Ok(self.next_token())
4826        } else {
4827            self.expected_ref(&expected.to_string(), self.peek_token_ref())
4828        }
4829    }
4830
4831    fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4832    where
4833        <T as FromStr>::Err: Display,
4834    {
4835        s.parse::<T>().map_err(|e| {
4836            ParserError::ParserError(format!(
4837                "Could not parse '{s}' as {}: {e}{loc}",
4838                core::any::type_name::<T>()
4839            ))
4840        })
4841    }
4842
4843    /// Parse a comma-separated list of 1+ SelectItem
4844    pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4845        // BigQuery and Snowflake allow trailing commas, but only in project lists
4846        // e.g. `SELECT 1, 2, FROM t`
4847        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#trailing_commas
4848        // https://docs.snowflake.com/en/release-notes/2024/8_11#select-supports-trailing-commas
4849
4850        let trailing_commas =
4851            self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4852
4853        self.parse_comma_separated_with_trailing_commas(
4854            |p| p.parse_select_item(),
4855            trailing_commas,
4856            Self::is_reserved_for_column_alias,
4857        )
4858    }
4859
4860    /// Parse a list of actions for `GRANT` statements.
4861    pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4862        let mut values = vec![];
4863        loop {
4864            values.push(self.parse_grant_permission()?);
4865            if !self.consume_token(&Token::Comma) {
4866                break;
4867            } else if self.options.trailing_commas {
4868                match &self.peek_token_ref().token {
4869                    Token::Word(kw) if kw.keyword == Keyword::ON => {
4870                        break;
4871                    }
4872                    Token::RParen
4873                    | Token::SemiColon
4874                    | Token::EOF
4875                    | Token::RBracket
4876                    | Token::RBrace => break,
4877                    _ => continue,
4878                }
4879            }
4880        }
4881        Ok(values)
4882    }
4883
4884    /// Parse a list of [TableWithJoins]
4885    fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4886        let trailing_commas = self.dialect.supports_from_trailing_commas();
4887
4888        self.parse_comma_separated_with_trailing_commas(
4889            Parser::parse_table_and_joins,
4890            trailing_commas,
4891            |kw, parser| !self.dialect.is_table_factor(kw, parser),
4892        )
4893    }
4894
4895    /// Parse the comma of a comma-separated syntax element.
4896    /// `R` is a predicate that should return true if the next
4897    /// keyword is a reserved keyword.
4898    /// Allows for control over trailing commas
4899    ///
4900    /// Returns true if there is a next element
4901    fn is_parse_comma_separated_end_with_trailing_commas<R>(
4902        &mut self,
4903        trailing_commas: bool,
4904        is_reserved_keyword: &R,
4905    ) -> bool
4906    where
4907        R: Fn(&Keyword, &mut Parser) -> bool,
4908    {
4909        if !self.consume_token(&Token::Comma) {
4910            true
4911        } else if trailing_commas {
4912            let token = self.next_token().token;
4913            let is_end = match token {
4914                Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
4915                Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
4916                    true
4917                }
4918                _ => false,
4919            };
4920            self.prev_token();
4921
4922            is_end
4923        } else {
4924            false
4925        }
4926    }
4927
4928    /// Parse the comma of a comma-separated syntax element.
4929    /// Returns true if there is a next element
4930    fn is_parse_comma_separated_end(&mut self) -> bool {
4931        self.is_parse_comma_separated_end_with_trailing_commas(
4932            self.options.trailing_commas,
4933            &Self::is_reserved_for_column_alias,
4934        )
4935    }
4936
4937    /// Parse a comma-separated list of 1+ items accepted by `F`
4938    pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
4939    where
4940        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4941    {
4942        self.parse_comma_separated_with_trailing_commas(
4943            f,
4944            self.options.trailing_commas,
4945            Self::is_reserved_for_column_alias,
4946        )
4947    }
4948
4949    /// Parse a comma-separated list of 1+ items accepted by `F`.
4950    /// `R` is a predicate that should return true if the next
4951    /// keyword is a reserved keyword.
4952    /// Allows for control over trailing commas.
4953    fn parse_comma_separated_with_trailing_commas<T, F, R>(
4954        &mut self,
4955        mut f: F,
4956        trailing_commas: bool,
4957        is_reserved_keyword: R,
4958    ) -> Result<Vec<T>, ParserError>
4959    where
4960        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4961        R: Fn(&Keyword, &mut Parser) -> bool,
4962    {
4963        let mut values = vec![];
4964        loop {
4965            values.push(f(self)?);
4966            if self.is_parse_comma_separated_end_with_trailing_commas(
4967                trailing_commas,
4968                &is_reserved_keyword,
4969            ) {
4970                break;
4971            }
4972        }
4973        Ok(values)
4974    }
4975
4976    /// Parse a period-separated list of 1+ items accepted by `F`
4977    fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
4978    where
4979        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4980    {
4981        let mut values = vec![];
4982        loop {
4983            values.push(f(self)?);
4984            if !self.consume_token(&Token::Period) {
4985                break;
4986            }
4987        }
4988        Ok(values)
4989    }
4990
4991    /// Parse a keyword-separated list of 1+ items accepted by `F`
4992    pub fn parse_keyword_separated<T, F>(
4993        &mut self,
4994        keyword: Keyword,
4995        mut f: F,
4996    ) -> Result<Vec<T>, ParserError>
4997    where
4998        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4999    {
5000        let mut values = vec![];
5001        loop {
5002            values.push(f(self)?);
5003            if !self.parse_keyword(keyword) {
5004                break;
5005            }
5006        }
5007        Ok(values)
5008    }
5009
5010    /// Parse an expression enclosed in parentheses.
5011    pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5012    where
5013        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5014    {
5015        self.expect_token(&Token::LParen)?;
5016        let res = f(self)?;
5017        self.expect_token(&Token::RParen)?;
5018        Ok(res)
5019    }
5020
5021    /// Parse a comma-separated list of 0+ items accepted by `F`
5022    /// * `end_token` - expected end token for the closure (e.g. [Token::RParen], [Token::RBrace] ...)
5023    pub fn parse_comma_separated0<T, F>(
5024        &mut self,
5025        f: F,
5026        end_token: Token,
5027    ) -> Result<Vec<T>, ParserError>
5028    where
5029        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5030    {
5031        if self.peek_token_ref().token == end_token {
5032            return Ok(vec![]);
5033        }
5034
5035        if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5036            let _ = self.consume_token(&Token::Comma);
5037            return Ok(vec![]);
5038        }
5039
5040        self.parse_comma_separated(f)
5041    }
5042
5043    /// Parses 0 or more statements, each followed by a semicolon.
5044    /// If the next token is any of `terminal_keywords` then no more
5045    /// statements will be parsed.
5046    pub(crate) fn parse_statement_list(
5047        &mut self,
5048        terminal_keywords: &[Keyword],
5049    ) -> Result<Vec<Statement>, ParserError> {
5050        let mut values = vec![];
5051        loop {
5052            match &self.peek_nth_token_ref(0).token {
5053                Token::EOF => break,
5054                Token::Word(w)
5055                    if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5056                {
5057                    break;
5058                }
5059                _ => {}
5060            }
5061
5062            values.push(self.parse_statement()?);
5063            self.expect_token(&Token::SemiColon)?;
5064        }
5065        Ok(values)
5066    }
5067
5068    /// Default implementation of a predicate that returns true if
5069    /// the specified keyword is reserved for column alias.
5070    /// See [Dialect::is_column_alias]
5071    fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5072        !parser.dialect.is_column_alias(kw, parser)
5073    }
5074
5075    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
5076    /// Returns `ParserError::RecursionLimitExceeded` if `f` returns a `RecursionLimitExceeded`.
5077    /// Returns `Ok(None)` if `f` returns any other error.
5078    pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5079    where
5080        F: FnMut(&mut Parser) -> Result<T, ParserError>,
5081    {
5082        match self.try_parse(f) {
5083            Ok(t) => Ok(Some(t)),
5084            Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5085            _ => Ok(None),
5086        }
5087    }
5088
5089    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
5090    pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5091    where
5092        F: FnMut(&mut Parser) -> Result<T, ParserError>,
5093    {
5094        let index = self.index;
5095        match f(self) {
5096            Ok(t) => Ok(t),
5097            Err(e) => {
5098                // Unwind stack if limit exceeded
5099                self.index = index;
5100                Err(e)
5101            }
5102        }
5103    }
5104
5105    /// Parse either `ALL`, `DISTINCT` or `DISTINCT ON (...)`. Returns [`None`] if `ALL` is parsed
5106    /// and results in a [`ParserError`] if both `ALL` and `DISTINCT` are found.
5107    pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5108        let loc = self.peek_token_ref().span.start;
5109        let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5110            Some(Keyword::ALL) => {
5111                if self.peek_keyword(Keyword::DISTINCT) {
5112                    return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5113                }
5114                Some(Distinct::All)
5115            }
5116            Some(Keyword::DISTINCT) => {
5117                if self.peek_keyword(Keyword::ALL) {
5118                    return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5119                }
5120                Some(Distinct::Distinct)
5121            }
5122            None => return Ok(None),
5123            _ => return parser_err!("ALL or DISTINCT", loc),
5124        };
5125
5126        let Some(Distinct::Distinct) = distinct else {
5127            return Ok(distinct);
5128        };
5129        if !self.parse_keyword(Keyword::ON) {
5130            return Ok(Some(Distinct::Distinct));
5131        }
5132
5133        self.expect_token(&Token::LParen)?;
5134        let col_names = if self.consume_token(&Token::RParen) {
5135            self.prev_token();
5136            Vec::new()
5137        } else {
5138            self.parse_comma_separated(Parser::parse_expr)?
5139        };
5140        self.expect_token(&Token::RParen)?;
5141        Ok(Some(Distinct::On(col_names)))
5142    }
5143
5144    /// Parse a SQL CREATE statement
5145    pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5146        let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5147        let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5148        let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5149        let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5150        let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5151        let global: Option<bool> = if global {
5152            Some(true)
5153        } else if local {
5154            Some(false)
5155        } else {
5156            None
5157        };
5158        let temporary = self
5159            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5160            .is_some();
5161        let persistent = dialect_of!(self is DuckDbDialect)
5162            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5163        let create_view_params = self.parse_create_view_params()?;
5164        if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5165            self.parse_create_snapshot_table().map(Into::into)
5166        } else if self.parse_keyword(Keyword::TABLE) {
5167            self.parse_create_table(or_replace, temporary, global, transient)
5168                .map(Into::into)
5169        } else if self.peek_keyword(Keyword::MATERIALIZED)
5170            || self.peek_keyword(Keyword::VIEW)
5171            || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5172            || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5173        {
5174            self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5175                .map(Into::into)
5176        } else if self.parse_keyword(Keyword::POLICY) {
5177            self.parse_create_policy().map(Into::into)
5178        } else if self.parse_keyword(Keyword::EXTERNAL) {
5179            self.parse_create_external_table(or_replace).map(Into::into)
5180        } else if self.parse_keyword(Keyword::FUNCTION) {
5181            self.parse_create_function(or_alter, or_replace, temporary)
5182        } else if self.parse_keyword(Keyword::DOMAIN) {
5183            self.parse_create_domain().map(Into::into)
5184        } else if self.parse_keyword(Keyword::TRIGGER) {
5185            self.parse_create_trigger(temporary, or_alter, or_replace, false)
5186                .map(Into::into)
5187        } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5188            self.parse_create_trigger(temporary, or_alter, or_replace, true)
5189                .map(Into::into)
5190        } else if self.parse_keyword(Keyword::MACRO) {
5191            self.parse_create_macro(or_replace, temporary)
5192        } else if self.parse_keyword(Keyword::SECRET) {
5193            self.parse_create_secret(or_replace, temporary, persistent)
5194        } else if self.parse_keyword(Keyword::USER) {
5195            if self.parse_keyword(Keyword::MAPPING) {
5196                self.parse_create_user_mapping().map(Into::into)
5197            } else {
5198                self.parse_create_user(or_replace).map(Into::into)
5199            }
5200        } else if self.parse_keyword(Keyword::AGGREGATE) {
5201            self.parse_create_aggregate(or_replace).map(Into::into)
5202        } else if self.peek_keyword(Keyword::TRUSTED)
5203            || self.peek_keyword(Keyword::PROCEDURAL)
5204            || self.peek_keyword(Keyword::LANGUAGE)
5205        {
5206            let trusted = self.parse_keyword(Keyword::TRUSTED);
5207            let procedural = self.parse_keyword(Keyword::PROCEDURAL);
5208            if self.parse_keyword(Keyword::LANGUAGE) {
5209                self.parse_create_language(or_replace, trusted, procedural)
5210                    .map(Into::into)
5211            } else {
5212                self.expected_ref(
5213                    "LANGUAGE after TRUSTED or PROCEDURAL",
5214                    self.peek_token_ref(),
5215                )
5216            }
5217        } else if self.parse_keyword(Keyword::TRANSFORM) {
5218            self.parse_create_transform(or_replace).map(Into::into)
5219        } else if or_replace {
5220            self.expected_ref(
5221                "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5222                self.peek_token_ref(),
5223            )
5224        } else if self.parse_keyword(Keyword::CAST) {
5225            self.parse_create_cast().map(Into::into)
5226        } else if self.parse_keyword(Keyword::CONVERSION) {
5227            self.parse_create_conversion(false).map(Into::into)
5228        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CONVERSION]) {
5229            self.parse_create_conversion(true).map(Into::into)
5230        } else if self.parse_keyword(Keyword::RULE) {
5231            self.parse_create_rule().map(Into::into)
5232        } else if self.parse_keyword(Keyword::EXTENSION) {
5233            self.parse_create_extension().map(Into::into)
5234        } else if self.parse_keyword(Keyword::INDEX) {
5235            self.parse_create_index(false).map(Into::into)
5236        } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5237            self.parse_create_index(true).map(Into::into)
5238        } else if self.parse_keyword(Keyword::VIRTUAL) {
5239            self.parse_create_virtual_table()
5240        } else if self.parse_keyword(Keyword::SCHEMA) {
5241            self.parse_create_schema()
5242        } else if self.parse_keyword(Keyword::DATABASE) {
5243            self.parse_create_database()
5244        } else if self.parse_keyword(Keyword::ROLE) {
5245            self.parse_create_role().map(Into::into)
5246        } else if self.parse_keyword(Keyword::SEQUENCE) {
5247            self.parse_create_sequence(temporary)
5248        } else if self.parse_keyword(Keyword::COLLATION) {
5249            self.parse_create_collation().map(Into::into)
5250        } else if self.parse_keyword(Keyword::TYPE) {
5251            self.parse_create_type()
5252        } else if self.parse_keyword(Keyword::PROCEDURE) {
5253            self.parse_create_procedure(or_alter)
5254        } else if self.parse_keyword(Keyword::CONNECTOR) {
5255            self.parse_create_connector().map(Into::into)
5256        } else if self.parse_keyword(Keyword::OPERATOR) {
5257            // Check if this is CREATE OPERATOR FAMILY or CREATE OPERATOR CLASS
5258            if self.parse_keyword(Keyword::FAMILY) {
5259                self.parse_create_operator_family().map(Into::into)
5260            } else if self.parse_keyword(Keyword::CLASS) {
5261                self.parse_create_operator_class().map(Into::into)
5262            } else {
5263                self.parse_create_operator().map(Into::into)
5264            }
5265        } else if self.parse_keyword(Keyword::SERVER) {
5266            self.parse_pg_create_server()
5267        } else if self.parse_keyword(Keyword::FOREIGN) {
5268            if self.parse_keywords(&[Keyword::DATA, Keyword::WRAPPER]) {
5269                self.parse_create_foreign_data_wrapper().map(Into::into)
5270            } else if self.parse_keyword(Keyword::TABLE) {
5271                self.parse_create_foreign_table().map(Into::into)
5272            } else {
5273                self.expected_ref(
5274                    "DATA WRAPPER or TABLE after CREATE FOREIGN",
5275                    self.peek_token_ref(),
5276                )
5277            }
5278        } else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5279            self.parse_create_text_search()
5280        } else if self.parse_keyword(Keyword::PUBLICATION) {
5281            self.parse_create_publication().map(Into::into)
5282        } else if self.parse_keyword(Keyword::SUBSCRIPTION) {
5283            self.parse_create_subscription().map(Into::into)
5284        } else if self.parse_keyword(Keyword::STATISTICS) {
5285            self.parse_create_statistics().map(Into::into)
5286        } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::METHOD]) {
5287            self.parse_create_access_method().map(Into::into)
5288        } else if self.parse_keywords(&[Keyword::EVENT, Keyword::TRIGGER]) {
5289            self.parse_create_event_trigger().map(Into::into)
5290        } else if self.parse_keyword(Keyword::TABLESPACE) {
5291            self.parse_create_tablespace().map(Into::into)
5292        } else {
5293            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5294        }
5295    }
5296
5297    fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5298        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5299        let name = self.parse_identifier()?;
5300        let options = self
5301            .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5302            .options;
5303        let with_tags = self.parse_keyword(Keyword::WITH);
5304        let tags = if self.parse_keyword(Keyword::TAG) {
5305            self.parse_key_value_options(true, &[])?.options
5306        } else {
5307            vec![]
5308        };
5309        Ok(CreateUser {
5310            or_replace,
5311            if_not_exists,
5312            name,
5313            options: KeyValueOptions {
5314                options,
5315                delimiter: KeyValueOptionsDelimiter::Space,
5316            },
5317            with_tags,
5318            tags: KeyValueOptions {
5319                options: tags,
5320                delimiter: KeyValueOptionsDelimiter::Comma,
5321            },
5322        })
5323    }
5324
5325    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
5326    pub fn parse_create_secret(
5327        &mut self,
5328        or_replace: bool,
5329        temporary: bool,
5330        persistent: bool,
5331    ) -> Result<Statement, ParserError> {
5332        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5333
5334        let mut storage_specifier = None;
5335        let mut name = None;
5336        if self.peek_token_ref().token != Token::LParen {
5337            if self.parse_keyword(Keyword::IN) {
5338                storage_specifier = self.parse_identifier().ok()
5339            } else {
5340                name = self.parse_identifier().ok();
5341            }
5342
5343            // Storage specifier may follow the name
5344            if storage_specifier.is_none()
5345                && self.peek_token_ref().token != Token::LParen
5346                && self.parse_keyword(Keyword::IN)
5347            {
5348                storage_specifier = self.parse_identifier().ok();
5349            }
5350        }
5351
5352        self.expect_token(&Token::LParen)?;
5353        self.expect_keyword_is(Keyword::TYPE)?;
5354        let secret_type = self.parse_identifier()?;
5355
5356        let mut options = Vec::new();
5357        if self.consume_token(&Token::Comma) {
5358            options.append(&mut self.parse_comma_separated(|p| {
5359                let key = p.parse_identifier()?;
5360                let value = p.parse_identifier()?;
5361                Ok(SecretOption { key, value })
5362            })?);
5363        }
5364        self.expect_token(&Token::RParen)?;
5365
5366        let temp = match (temporary, persistent) {
5367            (true, false) => Some(true),
5368            (false, true) => Some(false),
5369            (false, false) => None,
5370            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5371        };
5372
5373        Ok(Statement::CreateSecret {
5374            or_replace,
5375            temporary: temp,
5376            if_not_exists,
5377            name,
5378            storage_specifier,
5379            secret_type,
5380            options,
5381        })
5382    }
5383
5384    /// Parse a CACHE TABLE statement
5385    pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5386        let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5387        if self.parse_keyword(Keyword::TABLE) {
5388            let table_name = self.parse_object_name(false)?;
5389            if self.peek_token_ref().token != Token::EOF {
5390                if let Token::Word(word) = &self.peek_token_ref().token {
5391                    if word.keyword == Keyword::OPTIONS {
5392                        options = self.parse_options(Keyword::OPTIONS)?
5393                    }
5394                };
5395
5396                if self.peek_token_ref().token != Token::EOF {
5397                    let (a, q) = self.parse_as_query()?;
5398                    has_as = a;
5399                    query = Some(q);
5400                }
5401
5402                Ok(Statement::Cache {
5403                    table_flag,
5404                    table_name,
5405                    has_as,
5406                    options,
5407                    query,
5408                })
5409            } else {
5410                Ok(Statement::Cache {
5411                    table_flag,
5412                    table_name,
5413                    has_as,
5414                    options,
5415                    query,
5416                })
5417            }
5418        } else {
5419            table_flag = Some(self.parse_object_name(false)?);
5420            if self.parse_keyword(Keyword::TABLE) {
5421                let table_name = self.parse_object_name(false)?;
5422                if self.peek_token_ref().token != Token::EOF {
5423                    if let Token::Word(word) = &self.peek_token_ref().token {
5424                        if word.keyword == Keyword::OPTIONS {
5425                            options = self.parse_options(Keyword::OPTIONS)?
5426                        }
5427                    };
5428
5429                    if self.peek_token_ref().token != Token::EOF {
5430                        let (a, q) = self.parse_as_query()?;
5431                        has_as = a;
5432                        query = Some(q);
5433                    }
5434
5435                    Ok(Statement::Cache {
5436                        table_flag,
5437                        table_name,
5438                        has_as,
5439                        options,
5440                        query,
5441                    })
5442                } else {
5443                    Ok(Statement::Cache {
5444                        table_flag,
5445                        table_name,
5446                        has_as,
5447                        options,
5448                        query,
5449                    })
5450                }
5451            } else {
5452                if self.peek_token_ref().token == Token::EOF {
5453                    self.prev_token();
5454                }
5455                self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5456            }
5457        }
5458    }
5459
5460    /// Parse 'AS' before as query,such as `WITH XXX AS SELECT XXX` oer `CACHE TABLE AS SELECT XXX`
5461    pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5462        match &self.peek_token_ref().token {
5463            Token::Word(word) => match word.keyword {
5464                Keyword::AS => {
5465                    self.next_token();
5466                    Ok((true, self.parse_query()?))
5467                }
5468                _ => Ok((false, self.parse_query()?)),
5469            },
5470            _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5471        }
5472    }
5473
5474    /// Parse a UNCACHE TABLE statement
5475    pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5476        self.expect_keyword_is(Keyword::TABLE)?;
5477        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5478        let table_name = self.parse_object_name(false)?;
5479        Ok(Statement::UNCache {
5480            table_name,
5481            if_exists,
5482        })
5483    }
5484
5485    /// SQLite-specific `CREATE VIRTUAL TABLE`
5486    pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5487        self.expect_keyword_is(Keyword::TABLE)?;
5488        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5489        let table_name = self.parse_object_name(false)?;
5490        self.expect_keyword_is(Keyword::USING)?;
5491        let module_name = self.parse_identifier()?;
5492        // SQLite docs note that module "arguments syntax is sufficiently
5493        // general that the arguments can be made to appear as column
5494        // definitions in a traditional CREATE TABLE statement", but
5495        // we don't implement that.
5496        let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5497        Ok(Statement::CreateVirtualTable {
5498            name: table_name,
5499            if_not_exists,
5500            module_name,
5501            module_args,
5502        })
5503    }
5504
5505    /// Parse a `CREATE SCHEMA` statement.
5506    pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5507        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5508
5509        let schema_name = self.parse_schema_name()?;
5510
5511        let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5512            Some(self.parse_expr()?)
5513        } else {
5514            None
5515        };
5516
5517        let with = if self.peek_keyword(Keyword::WITH) {
5518            Some(self.parse_options(Keyword::WITH)?)
5519        } else {
5520            None
5521        };
5522
5523        let options = if self.peek_keyword(Keyword::OPTIONS) {
5524            Some(self.parse_options(Keyword::OPTIONS)?)
5525        } else {
5526            None
5527        };
5528
5529        let clone = if self.parse_keyword(Keyword::CLONE) {
5530            Some(self.parse_object_name(false)?)
5531        } else {
5532            None
5533        };
5534
5535        Ok(Statement::CreateSchema {
5536            schema_name,
5537            if_not_exists,
5538            with,
5539            options,
5540            default_collate_spec,
5541            clone,
5542        })
5543    }
5544
5545    fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5546        if self.parse_keyword(Keyword::AUTHORIZATION) {
5547            Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5548        } else {
5549            let name = self.parse_object_name(false)?;
5550
5551            if self.parse_keyword(Keyword::AUTHORIZATION) {
5552                Ok(SchemaName::NamedAuthorization(
5553                    name,
5554                    self.parse_identifier()?,
5555                ))
5556            } else {
5557                Ok(SchemaName::Simple(name))
5558            }
5559        }
5560    }
5561
5562    /// Parse a `CREATE DATABASE` statement.
5563    pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5564        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5565        let db_name = self.parse_object_name(false)?;
5566        let mut location = None;
5567        let mut managed_location = None;
5568        loop {
5569            match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5570                Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5571                Some(Keyword::MANAGEDLOCATION) => {
5572                    managed_location = Some(self.parse_literal_string()?)
5573                }
5574                _ => break,
5575            }
5576        }
5577        let clone = if self.parse_keyword(Keyword::CLONE) {
5578            Some(self.parse_object_name(false)?)
5579        } else {
5580            None
5581        };
5582
5583        // Parse MySQL-style [DEFAULT] CHARACTER SET and [DEFAULT] COLLATE options
5584        //
5585        // Note: The docs only mention `CHARACTER SET`, but `CHARSET` is also supported.
5586        // Furthermore, MySQL will only accept one character set, raising an error if there is more
5587        // than one, but will accept multiple collations and use the last one.
5588        //
5589        // <https://dev.mysql.com/doc/refman/8.4/en/create-database.html>
5590        let mut default_charset = None;
5591        let mut default_collation = None;
5592        loop {
5593            let has_default = self.parse_keyword(Keyword::DEFAULT);
5594            if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5595                || self.parse_keyword(Keyword::CHARSET)
5596            {
5597                let _ = self.consume_token(&Token::Eq);
5598                default_charset = Some(self.parse_identifier()?.value);
5599            } else if self.parse_keyword(Keyword::COLLATE) {
5600                let _ = self.consume_token(&Token::Eq);
5601                default_collation = Some(self.parse_identifier()?.value);
5602            } else if has_default {
5603                // DEFAULT keyword not followed by CHARACTER SET, CHARSET, or COLLATE
5604                self.prev_token();
5605                break;
5606            } else {
5607                break;
5608            }
5609        }
5610
5611        Ok(Statement::CreateDatabase {
5612            db_name,
5613            if_not_exists: ine,
5614            location,
5615            managed_location,
5616            or_replace: false,
5617            transient: false,
5618            clone,
5619            data_retention_time_in_days: None,
5620            max_data_extension_time_in_days: None,
5621            external_volume: None,
5622            catalog: None,
5623            replace_invalid_characters: None,
5624            default_ddl_collation: None,
5625            storage_serialization_policy: None,
5626            comment: None,
5627            default_charset,
5628            default_collation,
5629            catalog_sync: None,
5630            catalog_sync_namespace_mode: None,
5631            catalog_sync_namespace_flatten_delimiter: None,
5632            with_tags: None,
5633            with_contacts: None,
5634        })
5635    }
5636
5637    /// Parse an optional `USING` clause for `CREATE FUNCTION`.
5638    pub fn parse_optional_create_function_using(
5639        &mut self,
5640    ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5641        if !self.parse_keyword(Keyword::USING) {
5642            return Ok(None);
5643        };
5644        let keyword =
5645            self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5646
5647        let uri = self.parse_literal_string()?;
5648
5649        match keyword {
5650            Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5651            Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5652            Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5653            _ => self.expected(
5654                "JAR, FILE or ARCHIVE, got {:?}",
5655                TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5656            ),
5657        }
5658    }
5659
5660    /// Parse a `CREATE FUNCTION` statement.
5661    pub fn parse_create_function(
5662        &mut self,
5663        or_alter: bool,
5664        or_replace: bool,
5665        temporary: bool,
5666    ) -> Result<Statement, ParserError> {
5667        if dialect_of!(self is HiveDialect) {
5668            self.parse_hive_create_function(or_replace, temporary)
5669                .map(Into::into)
5670        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5671            self.parse_postgres_create_function(or_replace, temporary)
5672                .map(Into::into)
5673        } else if dialect_of!(self is DuckDbDialect) {
5674            self.parse_create_macro(or_replace, temporary)
5675        } else if dialect_of!(self is BigQueryDialect) {
5676            self.parse_bigquery_create_function(or_replace, temporary)
5677                .map(Into::into)
5678        } else if dialect_of!(self is MsSqlDialect) {
5679            self.parse_mssql_create_function(or_alter, or_replace, temporary)
5680                .map(Into::into)
5681        } else {
5682            self.prev_token();
5683            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5684        }
5685    }
5686
5687    /// Parse `CREATE FUNCTION` for [PostgreSQL]
5688    ///
5689    /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
5690    fn parse_postgres_create_function(
5691        &mut self,
5692        or_replace: bool,
5693        temporary: bool,
5694    ) -> Result<CreateFunction, ParserError> {
5695        let name = self.parse_object_name(false)?;
5696
5697        self.expect_token(&Token::LParen)?;
5698        let args = if Token::RParen != self.peek_token_ref().token {
5699            self.parse_comma_separated(Parser::parse_function_arg)?
5700        } else {
5701            vec![]
5702        };
5703        self.expect_token(&Token::RParen)?;
5704
5705        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5706            Some(self.parse_function_return_type()?)
5707        } else {
5708            None
5709        };
5710
5711        #[derive(Default)]
5712        struct Body {
5713            language: Option<Ident>,
5714            behavior: Option<FunctionBehavior>,
5715            function_body: Option<CreateFunctionBody>,
5716            called_on_null: Option<FunctionCalledOnNull>,
5717            parallel: Option<FunctionParallel>,
5718            security: Option<FunctionSecurity>,
5719        }
5720        let mut body = Body::default();
5721        let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5722        loop {
5723            fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5724                if field.is_some() {
5725                    return Err(ParserError::ParserError(format!(
5726                        "{name} specified more than once",
5727                    )));
5728                }
5729                Ok(())
5730            }
5731            if self.parse_keyword(Keyword::AS) {
5732                ensure_not_set(&body.function_body, "AS")?;
5733                body.function_body = Some(self.parse_create_function_body_string()?);
5734            } else if self.parse_keyword(Keyword::LANGUAGE) {
5735                ensure_not_set(&body.language, "LANGUAGE")?;
5736                body.language = Some(self.parse_identifier()?);
5737            } else if self.parse_keyword(Keyword::IMMUTABLE) {
5738                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5739                body.behavior = Some(FunctionBehavior::Immutable);
5740            } else if self.parse_keyword(Keyword::STABLE) {
5741                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5742                body.behavior = Some(FunctionBehavior::Stable);
5743            } else if self.parse_keyword(Keyword::VOLATILE) {
5744                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5745                body.behavior = Some(FunctionBehavior::Volatile);
5746            } else if self.parse_keywords(&[
5747                Keyword::CALLED,
5748                Keyword::ON,
5749                Keyword::NULL,
5750                Keyword::INPUT,
5751            ]) {
5752                ensure_not_set(
5753                    &body.called_on_null,
5754                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5755                )?;
5756                body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5757            } else if self.parse_keywords(&[
5758                Keyword::RETURNS,
5759                Keyword::NULL,
5760                Keyword::ON,
5761                Keyword::NULL,
5762                Keyword::INPUT,
5763            ]) {
5764                ensure_not_set(
5765                    &body.called_on_null,
5766                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5767                )?;
5768                body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5769            } else if self.parse_keyword(Keyword::STRICT) {
5770                ensure_not_set(
5771                    &body.called_on_null,
5772                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5773                )?;
5774                body.called_on_null = Some(FunctionCalledOnNull::Strict);
5775            } else if self.parse_keyword(Keyword::PARALLEL) {
5776                ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5777                if self.parse_keyword(Keyword::UNSAFE) {
5778                    body.parallel = Some(FunctionParallel::Unsafe);
5779                } else if self.parse_keyword(Keyword::RESTRICTED) {
5780                    body.parallel = Some(FunctionParallel::Restricted);
5781                } else if self.parse_keyword(Keyword::SAFE) {
5782                    body.parallel = Some(FunctionParallel::Safe);
5783                } else {
5784                    return self
5785                        .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5786                }
5787            } else if self.parse_keyword(Keyword::SECURITY) {
5788                ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5789                if self.parse_keyword(Keyword::DEFINER) {
5790                    body.security = Some(FunctionSecurity::Definer);
5791                } else if self.parse_keyword(Keyword::INVOKER) {
5792                    body.security = Some(FunctionSecurity::Invoker);
5793                } else {
5794                    return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5795                }
5796            } else if self.parse_keyword(Keyword::SET) {
5797                let name = self.parse_object_name(false)?;
5798                let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5799                    FunctionSetValue::FromCurrent
5800                } else {
5801                    if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5802                        return self.expected_ref("= or TO", self.peek_token_ref());
5803                    }
5804                    if self.parse_keyword(Keyword::DEFAULT) {
5805                        FunctionSetValue::Default
5806                    } else {
5807                        let values = self.parse_comma_separated(Parser::parse_expr)?;
5808                        FunctionSetValue::Values(values)
5809                    }
5810                };
5811                set_params.push(FunctionDefinitionSetParam { name, value });
5812            } else if self.parse_keyword(Keyword::RETURN) {
5813                ensure_not_set(&body.function_body, "RETURN")?;
5814                body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5815            } else {
5816                break;
5817            }
5818        }
5819
5820        Ok(CreateFunction {
5821            or_alter: false,
5822            or_replace,
5823            temporary,
5824            name,
5825            args: Some(args),
5826            return_type,
5827            behavior: body.behavior,
5828            called_on_null: body.called_on_null,
5829            parallel: body.parallel,
5830            security: body.security,
5831            set_params,
5832            language: body.language,
5833            function_body: body.function_body,
5834            if_not_exists: false,
5835            using: None,
5836            determinism_specifier: None,
5837            options: None,
5838            remote_connection: None,
5839        })
5840    }
5841
5842    /// Parse `CREATE FUNCTION` for [Hive]
5843    ///
5844    /// [Hive]: https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-Create/Drop/ReloadFunction
5845    fn parse_hive_create_function(
5846        &mut self,
5847        or_replace: bool,
5848        temporary: bool,
5849    ) -> Result<CreateFunction, ParserError> {
5850        let name = self.parse_object_name(false)?;
5851        self.expect_keyword_is(Keyword::AS)?;
5852
5853        let body = self.parse_create_function_body_string()?;
5854        let using = self.parse_optional_create_function_using()?;
5855
5856        Ok(CreateFunction {
5857            or_alter: false,
5858            or_replace,
5859            temporary,
5860            name,
5861            function_body: Some(body),
5862            using,
5863            if_not_exists: false,
5864            args: None,
5865            return_type: None,
5866            behavior: None,
5867            called_on_null: None,
5868            parallel: None,
5869            security: None,
5870            set_params: vec![],
5871            language: None,
5872            determinism_specifier: None,
5873            options: None,
5874            remote_connection: None,
5875        })
5876    }
5877
5878    /// Parse `CREATE FUNCTION` for [BigQuery]
5879    ///
5880    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement
5881    fn parse_bigquery_create_function(
5882        &mut self,
5883        or_replace: bool,
5884        temporary: bool,
5885    ) -> Result<CreateFunction, ParserError> {
5886        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5887        let (name, args) = self.parse_create_function_name_and_params()?;
5888
5889        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5890            Some(self.parse_function_return_type()?)
5891        } else {
5892            None
5893        };
5894
5895        let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
5896            Some(FunctionDeterminismSpecifier::Deterministic)
5897        } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
5898            Some(FunctionDeterminismSpecifier::NotDeterministic)
5899        } else {
5900            None
5901        };
5902
5903        let language = if self.parse_keyword(Keyword::LANGUAGE) {
5904            Some(self.parse_identifier()?)
5905        } else {
5906            None
5907        };
5908
5909        let remote_connection =
5910            if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
5911                Some(self.parse_object_name(false)?)
5912            } else {
5913                None
5914            };
5915
5916        // `OPTIONS` may come before of after the function body but
5917        // may be specified at most once.
5918        let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
5919
5920        let function_body = if remote_connection.is_none() {
5921            self.expect_keyword_is(Keyword::AS)?;
5922            let expr = self.parse_expr()?;
5923            if options.is_none() {
5924                options = self.maybe_parse_options(Keyword::OPTIONS)?;
5925                Some(CreateFunctionBody::AsBeforeOptions {
5926                    body: expr,
5927                    link_symbol: None,
5928                })
5929            } else {
5930                Some(CreateFunctionBody::AsAfterOptions(expr))
5931            }
5932        } else {
5933            None
5934        };
5935
5936        Ok(CreateFunction {
5937            or_alter: false,
5938            or_replace,
5939            temporary,
5940            if_not_exists,
5941            name,
5942            args: Some(args),
5943            return_type,
5944            function_body,
5945            language,
5946            determinism_specifier,
5947            options,
5948            remote_connection,
5949            using: None,
5950            behavior: None,
5951            called_on_null: None,
5952            parallel: None,
5953            security: None,
5954            set_params: vec![],
5955        })
5956    }
5957
5958    /// Parse `CREATE FUNCTION` for [MsSql]
5959    ///
5960    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
5961    fn parse_mssql_create_function(
5962        &mut self,
5963        or_alter: bool,
5964        or_replace: bool,
5965        temporary: bool,
5966    ) -> Result<CreateFunction, ParserError> {
5967        let (name, args) = self.parse_create_function_name_and_params()?;
5968
5969        self.expect_keyword(Keyword::RETURNS)?;
5970
5971        let return_table = self.maybe_parse(|p| {
5972            let return_table_name = p.parse_identifier()?;
5973
5974            p.expect_keyword_is(Keyword::TABLE)?;
5975            p.prev_token();
5976
5977            let table_column_defs = match p.parse_data_type()? {
5978                DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5979                    table_column_defs
5980                }
5981                _ => parser_err!(
5982                    "Expected table column definitions after TABLE keyword",
5983                    p.peek_token_ref().span.start
5984                )?,
5985            };
5986
5987            Ok(DataType::NamedTable {
5988                name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5989                columns: table_column_defs,
5990            })
5991        })?;
5992
5993        let data_type = match return_table {
5994            Some(table_type) => table_type,
5995            None => self.parse_data_type()?,
5996        };
5997        let return_type = Some(FunctionReturnType::DataType(data_type));
5998
5999        let _ = self.parse_keyword(Keyword::AS);
6000
6001        let function_body = if self.peek_keyword(Keyword::BEGIN) {
6002            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
6003            let statements = self.parse_statement_list(&[Keyword::END])?;
6004            let end_token = self.expect_keyword(Keyword::END)?;
6005
6006            Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
6007                begin_token: AttachedToken(begin_token),
6008                statements,
6009                end_token: AttachedToken(end_token),
6010            }))
6011        } else if self.parse_keyword(Keyword::RETURN) {
6012            if self.peek_token_ref().token == Token::LParen {
6013                Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
6014            } else if self.peek_keyword(Keyword::SELECT) {
6015                let select = self.parse_select()?;
6016                Some(CreateFunctionBody::AsReturnSelect(select))
6017            } else {
6018                parser_err!(
6019                    "Expected a subquery (or bare SELECT statement) after RETURN",
6020                    self.peek_token_ref().span.start
6021                )?
6022            }
6023        } else {
6024            parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
6025        };
6026
6027        Ok(CreateFunction {
6028            or_alter,
6029            or_replace,
6030            temporary,
6031            if_not_exists: false,
6032            name,
6033            args: Some(args),
6034            return_type,
6035            function_body,
6036            language: None,
6037            determinism_specifier: None,
6038            options: None,
6039            remote_connection: None,
6040            using: None,
6041            behavior: None,
6042            called_on_null: None,
6043            parallel: None,
6044            security: None,
6045            set_params: vec![],
6046        })
6047    }
6048
6049    fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
6050        if self.parse_keyword(Keyword::SETOF) {
6051            Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
6052        } else {
6053            Ok(FunctionReturnType::DataType(self.parse_data_type()?))
6054        }
6055    }
6056
6057    fn parse_create_function_name_and_params(
6058        &mut self,
6059    ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
6060        let name = self.parse_object_name(false)?;
6061        let parse_function_param =
6062            |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
6063                let name = parser.parse_identifier()?;
6064                let data_type = parser.parse_data_type()?;
6065                let default_expr = if parser.consume_token(&Token::Eq) {
6066                    Some(parser.parse_expr()?)
6067                } else {
6068                    None
6069                };
6070
6071                Ok(OperateFunctionArg {
6072                    mode: None,
6073                    name: Some(name),
6074                    data_type,
6075                    default_expr,
6076                })
6077            };
6078        self.expect_token(&Token::LParen)?;
6079        let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6080        self.expect_token(&Token::RParen)?;
6081        Ok((name, args))
6082    }
6083
6084    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6085        let mode = if self.parse_keyword(Keyword::IN) {
6086            Some(ArgMode::In)
6087        } else if self.parse_keyword(Keyword::OUT) {
6088            Some(ArgMode::Out)
6089        } else if self.parse_keyword(Keyword::INOUT) {
6090            Some(ArgMode::InOut)
6091        } else if self.parse_keyword(Keyword::VARIADIC) {
6092            Some(ArgMode::Variadic)
6093        } else {
6094            None
6095        };
6096
6097        // parse: [ argname ] argtype
6098        let mut name = None;
6099        let mut data_type = self.parse_data_type()?;
6100
6101        // To check whether the first token is a name or a type, we need to
6102        // peek the next token, which if it is another type keyword, then the
6103        // first token is a name and not a type in itself.
6104        let data_type_idx = self.get_current_index();
6105
6106        // DEFAULT will be parsed as `DataType::Custom`, which is undesirable in this context
6107        fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6108            if parser.peek_keyword(Keyword::DEFAULT) {
6109                // This dummy error is ignored in `maybe_parse`
6110                parser_err!(
6111                    "The DEFAULT keyword is not a type",
6112                    parser.peek_token_ref().span.start
6113                )
6114            } else {
6115                parser.parse_data_type()
6116            }
6117        }
6118
6119        if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6120            let token = self.token_at(data_type_idx);
6121
6122            // We ensure that the token is a `Word` token, and not other special tokens.
6123            if !matches!(token.token, Token::Word(_)) {
6124                return self.expected("a name or type", token.clone());
6125            }
6126
6127            name = Some(Ident::new(token.to_string()));
6128            data_type = next_data_type;
6129        }
6130
6131        let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6132        {
6133            Some(self.parse_expr()?)
6134        } else {
6135            None
6136        };
6137        Ok(OperateFunctionArg {
6138            mode,
6139            name,
6140            data_type,
6141            default_expr,
6142        })
6143    }
6144
6145    fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6146        let mode = if self.parse_keyword(Keyword::IN) {
6147            Some(ArgMode::In)
6148        } else {
6149            if self
6150                .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6151                .is_some()
6152            {
6153                return self.expected_ref(
6154                    "IN or argument type in aggregate signature",
6155                    self.peek_token_ref(),
6156                );
6157            }
6158            None
6159        };
6160
6161        // Parse: [ argname ] argtype, but do not consume ORDER from
6162        // `... argtype ORDER BY ...` as a type-name disambiguator.
6163        let mut name = None;
6164        let mut data_type = self.parse_data_type()?;
6165        let data_type_idx = self.get_current_index();
6166
6167        fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6168            if parser.peek_keyword(Keyword::DEFAULT)
6169                || parser.peek_keyword(Keyword::ORDER)
6170                || parser.peek_token_ref().token == Token::Comma
6171                || parser.peek_token_ref().token == Token::RParen
6172            {
6173                // Dummy error ignored by maybe_parse
6174                parser_err!(
6175                    "The current token cannot start an aggregate argument type",
6176                    parser.peek_token_ref().span.start
6177                )
6178            } else {
6179                parser.parse_data_type()
6180            }
6181        }
6182
6183        if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6184            let token = self.token_at(data_type_idx);
6185            if !matches!(token.token, Token::Word(_)) {
6186                return self.expected("a name or type", token.clone());
6187            }
6188
6189            name = Some(Ident::new(token.to_string()));
6190            data_type = next_data_type;
6191        }
6192
6193        if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6194            return self.expected_ref(
6195                "',' or ')' or ORDER BY after aggregate argument type",
6196                self.peek_token_ref(),
6197            );
6198        }
6199
6200        Ok(OperateFunctionArg {
6201            mode,
6202            name,
6203            data_type,
6204            default_expr: None,
6205        })
6206    }
6207
6208    /// Parse statements of the DropTrigger type such as:
6209    ///
6210    /// ```sql
6211    /// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
6212    /// ```
6213    pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6214        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6215        {
6216            self.prev_token();
6217            return self.expected_ref("an object type after DROP", self.peek_token_ref());
6218        }
6219        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6220        let trigger_name = self.parse_object_name(false)?;
6221        let table_name = if self.parse_keyword(Keyword::ON) {
6222            Some(self.parse_object_name(false)?)
6223        } else {
6224            None
6225        };
6226        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6227            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6228            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6229            Some(unexpected_keyword) => return Err(ParserError::ParserError(
6230                format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6231            )),
6232            None => None,
6233        };
6234        Ok(DropTrigger {
6235            if_exists,
6236            trigger_name,
6237            table_name,
6238            option,
6239        })
6240    }
6241
6242    /// Parse a `CREATE TRIGGER` statement.
6243    pub fn parse_create_trigger(
6244        &mut self,
6245        temporary: bool,
6246        or_alter: bool,
6247        or_replace: bool,
6248        is_constraint: bool,
6249    ) -> Result<CreateTrigger, ParserError> {
6250        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6251        {
6252            self.prev_token();
6253            return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6254        }
6255
6256        let name = self.parse_object_name(false)?;
6257        let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6258
6259        let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6260        self.expect_keyword_is(Keyword::ON)?;
6261        let table_name = self.parse_object_name(false)?;
6262
6263        let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6264            self.parse_object_name(true).ok()
6265        } else {
6266            None
6267        };
6268
6269        let characteristics = self.parse_constraint_characteristics()?;
6270
6271        let mut referencing = vec![];
6272        if self.parse_keyword(Keyword::REFERENCING) {
6273            while let Some(refer) = self.parse_trigger_referencing()? {
6274                referencing.push(refer);
6275            }
6276        }
6277
6278        let trigger_object = if self.parse_keyword(Keyword::FOR) {
6279            let include_each = self.parse_keyword(Keyword::EACH);
6280            let trigger_object =
6281                match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6282                    Keyword::ROW => TriggerObject::Row,
6283                    Keyword::STATEMENT => TriggerObject::Statement,
6284                    unexpected_keyword => return Err(ParserError::ParserError(
6285                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6286                    )),
6287                };
6288
6289            Some(if include_each {
6290                TriggerObjectKind::ForEach(trigger_object)
6291            } else {
6292                TriggerObjectKind::For(trigger_object)
6293            })
6294        } else {
6295            let _ = self.parse_keyword(Keyword::FOR);
6296
6297            None
6298        };
6299
6300        let condition = self
6301            .parse_keyword(Keyword::WHEN)
6302            .then(|| self.parse_expr())
6303            .transpose()?;
6304
6305        let mut exec_body = None;
6306        let mut statements = None;
6307        if self.parse_keyword(Keyword::EXECUTE) {
6308            exec_body = Some(self.parse_trigger_exec_body()?);
6309        } else {
6310            statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6311        }
6312
6313        Ok(CreateTrigger {
6314            or_alter,
6315            temporary,
6316            or_replace,
6317            is_constraint,
6318            name,
6319            period,
6320            period_before_table: true,
6321            events,
6322            table_name,
6323            referenced_table_name,
6324            referencing,
6325            trigger_object,
6326            condition,
6327            exec_body,
6328            statements_as: false,
6329            statements,
6330            characteristics,
6331        })
6332    }
6333
6334    /// Parse the period part of a trigger (`BEFORE`, `AFTER`, etc.).
6335    pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6336        Ok(
6337            match self.expect_one_of_keywords(&[
6338                Keyword::FOR,
6339                Keyword::BEFORE,
6340                Keyword::AFTER,
6341                Keyword::INSTEAD,
6342            ])? {
6343                Keyword::FOR => TriggerPeriod::For,
6344                Keyword::BEFORE => TriggerPeriod::Before,
6345                Keyword::AFTER => TriggerPeriod::After,
6346                Keyword::INSTEAD => self
6347                    .expect_keyword_is(Keyword::OF)
6348                    .map(|_| TriggerPeriod::InsteadOf)?,
6349                unexpected_keyword => return Err(ParserError::ParserError(
6350                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6351                )),
6352            },
6353        )
6354    }
6355
6356    /// Parse the event part of a trigger (`INSERT`, `UPDATE`, etc.).
6357    pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6358        Ok(
6359            match self.expect_one_of_keywords(&[
6360                Keyword::INSERT,
6361                Keyword::UPDATE,
6362                Keyword::DELETE,
6363                Keyword::TRUNCATE,
6364            ])? {
6365                Keyword::INSERT => TriggerEvent::Insert,
6366                Keyword::UPDATE => {
6367                    if self.parse_keyword(Keyword::OF) {
6368                        let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6369                        TriggerEvent::Update(cols)
6370                    } else {
6371                        TriggerEvent::Update(vec![])
6372                    }
6373                }
6374                Keyword::DELETE => TriggerEvent::Delete,
6375                Keyword::TRUNCATE => TriggerEvent::Truncate,
6376                unexpected_keyword => return Err(ParserError::ParserError(
6377                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6378                )),
6379            },
6380        )
6381    }
6382
6383    /// Parse the `REFERENCING` clause of a trigger.
6384    pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6385        let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6386            Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6387                TriggerReferencingType::OldTable
6388            }
6389            Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6390                TriggerReferencingType::NewTable
6391            }
6392            _ => {
6393                return Ok(None);
6394            }
6395        };
6396
6397        let is_as = self.parse_keyword(Keyword::AS);
6398        let transition_relation_name = self.parse_object_name(false)?;
6399        Ok(Some(TriggerReferencing {
6400            refer_type,
6401            is_as,
6402            transition_relation_name,
6403        }))
6404    }
6405
6406    /// Parse the execution body of a trigger (`FUNCTION` or `PROCEDURE`).
6407    ///
6408    /// Unlike CREATE FUNCTION, trigger EXECUTE clauses take call-site
6409    /// expressions as arguments (e.g. string literals), not parameter
6410    /// declarations.  We therefore parse the name separately and then
6411    /// parse each argument as a full expression.
6412    pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6413        let exec_type = match self
6414            .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6415        {
6416            Keyword::FUNCTION => TriggerExecBodyType::Function,
6417            Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6418            unexpected_keyword => {
6419                return Err(ParserError::ParserError(format!(
6420                    "Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"
6421                )))
6422            }
6423        };
6424
6425        let func_name = self.parse_object_name(false)?;
6426
6427        let args = if self.consume_token(&Token::LParen) {
6428            if self.consume_token(&Token::RParen) {
6429                Some(vec![])
6430            } else {
6431                let exprs = self.parse_comma_separated(Parser::parse_expr)?;
6432                self.expect_token(&Token::RParen)?;
6433                Some(exprs)
6434            }
6435        } else {
6436            None
6437        };
6438
6439        Ok(TriggerExecBody {
6440            exec_type,
6441            func_name,
6442            args,
6443        })
6444    }
6445
6446    /// Parse a `CREATE MACRO` statement.
6447    pub fn parse_create_macro(
6448        &mut self,
6449        or_replace: bool,
6450        temporary: bool,
6451    ) -> Result<Statement, ParserError> {
6452        if dialect_of!(self is DuckDbDialect |  GenericDialect) {
6453            let name = self.parse_object_name(false)?;
6454            self.expect_token(&Token::LParen)?;
6455            let args = if self.consume_token(&Token::RParen) {
6456                self.prev_token();
6457                None
6458            } else {
6459                Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6460            };
6461
6462            self.expect_token(&Token::RParen)?;
6463            self.expect_keyword_is(Keyword::AS)?;
6464
6465            Ok(Statement::CreateMacro {
6466                or_replace,
6467                temporary,
6468                name,
6469                args,
6470                definition: if self.parse_keyword(Keyword::TABLE) {
6471                    MacroDefinition::Table(self.parse_query()?)
6472                } else {
6473                    MacroDefinition::Expr(self.parse_expr()?)
6474                },
6475            })
6476        } else {
6477            self.prev_token();
6478            self.expected_ref("an object type after CREATE", self.peek_token_ref())
6479        }
6480    }
6481
6482    fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6483        let name = self.parse_identifier()?;
6484
6485        let default_expr =
6486            if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6487                Some(self.parse_expr()?)
6488            } else {
6489                None
6490            };
6491        Ok(MacroArg { name, default_expr })
6492    }
6493
6494    /// Parse a `CREATE EXTERNAL TABLE` statement.
6495    pub fn parse_create_external_table(
6496        &mut self,
6497        or_replace: bool,
6498    ) -> Result<CreateTable, ParserError> {
6499        self.expect_keyword_is(Keyword::TABLE)?;
6500        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6501        let table_name = self.parse_object_name(false)?;
6502        let (columns, constraints) = self.parse_columns()?;
6503
6504        let hive_distribution = self.parse_hive_distribution()?;
6505        let hive_formats = self.parse_hive_formats()?;
6506
6507        let file_format = if let Some(ref hf) = hive_formats {
6508            if let Some(ref ff) = hf.storage {
6509                match ff {
6510                    HiveIOFormat::FileFormat { format } => Some(*format),
6511                    _ => None,
6512                }
6513            } else {
6514                None
6515            }
6516        } else {
6517            None
6518        };
6519        let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6520        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6521        let table_options = if !table_properties.is_empty() {
6522            CreateTableOptions::TableProperties(table_properties)
6523        } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6524            CreateTableOptions::Options(options)
6525        } else {
6526            CreateTableOptions::None
6527        };
6528        Ok(CreateTableBuilder::new(table_name)
6529            .columns(columns)
6530            .constraints(constraints)
6531            .hive_distribution(hive_distribution)
6532            .hive_formats(hive_formats)
6533            .table_options(table_options)
6534            .or_replace(or_replace)
6535            .if_not_exists(if_not_exists)
6536            .external(true)
6537            .file_format(file_format)
6538            .location(location)
6539            .build())
6540    }
6541
6542    /// Parse `CREATE SNAPSHOT TABLE` statement.
6543    ///
6544    /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_snapshot_table_statement>
6545    pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6546        self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6547        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6548        let table_name = self.parse_object_name(true)?;
6549
6550        self.expect_keyword_is(Keyword::CLONE)?;
6551        let clone = Some(self.parse_object_name(true)?);
6552
6553        let version =
6554            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6555            {
6556                Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6557            } else {
6558                None
6559            };
6560
6561        let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6562            CreateTableOptions::Options(options)
6563        } else {
6564            CreateTableOptions::None
6565        };
6566
6567        Ok(CreateTableBuilder::new(table_name)
6568            .snapshot(true)
6569            .if_not_exists(if_not_exists)
6570            .clone_clause(clone)
6571            .version(version)
6572            .table_options(table_options)
6573            .build())
6574    }
6575
6576    /// Parse a file format for external tables.
6577    pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6578        let next_token = self.next_token();
6579        match &next_token.token {
6580            Token::Word(w) => match w.keyword {
6581                Keyword::AVRO => Ok(FileFormat::AVRO),
6582                Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6583                Keyword::ORC => Ok(FileFormat::ORC),
6584                Keyword::PARQUET => Ok(FileFormat::PARQUET),
6585                Keyword::RCFILE => Ok(FileFormat::RCFILE),
6586                Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6587                Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6588                _ => self.expected("fileformat", next_token),
6589            },
6590            _ => self.expected("fileformat", next_token),
6591        }
6592    }
6593
6594    fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6595        if self.consume_token(&Token::Eq) {
6596            Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6597        } else {
6598            Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6599        }
6600    }
6601
6602    /// Parse an `ANALYZE FORMAT`.
6603    pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6604        let next_token = self.next_token();
6605        match &next_token.token {
6606            Token::Word(w) => match w.keyword {
6607                Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6608                Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6609                Keyword::JSON => Ok(AnalyzeFormat::JSON),
6610                Keyword::TREE => Ok(AnalyzeFormat::TREE),
6611                _ => self.expected("fileformat", next_token),
6612            },
6613            _ => self.expected("fileformat", next_token),
6614        }
6615    }
6616
6617    /// Parse a `CREATE VIEW` statement.
6618    pub fn parse_create_view(
6619        &mut self,
6620        or_alter: bool,
6621        or_replace: bool,
6622        temporary: bool,
6623        create_view_params: Option<CreateViewParams>,
6624    ) -> Result<CreateView, ParserError> {
6625        let secure = self.parse_keyword(Keyword::SECURE);
6626        let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6627        self.expect_keyword_is(Keyword::VIEW)?;
6628        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6629        // Tries to parse IF NOT EXISTS either before name or after name
6630        // Name before IF NOT EXISTS is supported by snowflake but undocumented
6631        let if_not_exists_first =
6632            self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6633        let name = self.parse_object_name(allow_unquoted_hyphen)?;
6634        let name_before_not_exists = !if_not_exists_first
6635            && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6636        let if_not_exists = if_not_exists_first || name_before_not_exists;
6637        let copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6638        // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
6639        // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
6640        let columns = self.parse_view_columns()?;
6641        let mut options = CreateTableOptions::None;
6642        let with_options = self.parse_options(Keyword::WITH)?;
6643        if !with_options.is_empty() {
6644            options = CreateTableOptions::With(with_options);
6645        }
6646
6647        let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6648            self.expect_keyword_is(Keyword::BY)?;
6649            self.parse_parenthesized_column_list(Optional, false)?
6650        } else {
6651            vec![]
6652        };
6653
6654        if dialect_of!(self is BigQueryDialect | GenericDialect) {
6655            if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6656                if !opts.is_empty() {
6657                    options = CreateTableOptions::Options(opts);
6658                }
6659            };
6660        }
6661
6662        let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6663            && self.parse_keyword(Keyword::TO)
6664        {
6665            Some(self.parse_object_name(false)?)
6666        } else {
6667            None
6668        };
6669
6670        let comment = if self.dialect.supports_create_view_comment_syntax()
6671            && self.parse_keyword(Keyword::COMMENT)
6672        {
6673            self.expect_token(&Token::Eq)?;
6674            Some(self.parse_comment_value()?)
6675        } else {
6676            None
6677        };
6678
6679        self.expect_keyword_is(Keyword::AS)?;
6680        let query = self.parse_query()?;
6681        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
6682
6683        let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6684            && self.parse_keywords(&[
6685                Keyword::WITH,
6686                Keyword::NO,
6687                Keyword::SCHEMA,
6688                Keyword::BINDING,
6689            ]);
6690
6691        // PostgreSQL: optional WITH [NO] DATA clause on materialized views.
6692        // pg_dump emits this clause; parse it so corpus schemas round-trip cleanly.
6693        let with_data = if materialized && self.parse_keyword(Keyword::WITH) {
6694            if self.parse_keyword(Keyword::NO) {
6695                self.expect_keyword_is(Keyword::DATA)?;
6696                Some(false)
6697            } else {
6698                self.expect_keyword_is(Keyword::DATA)?;
6699                Some(true)
6700            }
6701        } else {
6702            None
6703        };
6704
6705        Ok(CreateView {
6706            or_alter,
6707            name,
6708            columns,
6709            query,
6710            materialized,
6711            secure,
6712            or_replace,
6713            options,
6714            cluster_by,
6715            comment,
6716            with_no_schema_binding,
6717            if_not_exists,
6718            temporary,
6719            copy_grants,
6720            to,
6721            params: create_view_params,
6722            name_before_not_exists,
6723            with_data,
6724        })
6725    }
6726
6727    /// Parse optional parameters for the `CREATE VIEW` statement supported by [MySQL].
6728    ///
6729    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/create-view.html
6730    fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6731        let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6732            self.expect_token(&Token::Eq)?;
6733            Some(
6734                match self.expect_one_of_keywords(&[
6735                    Keyword::UNDEFINED,
6736                    Keyword::MERGE,
6737                    Keyword::TEMPTABLE,
6738                ])? {
6739                    Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6740                    Keyword::MERGE => CreateViewAlgorithm::Merge,
6741                    Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6742                    _ => {
6743                        self.prev_token();
6744                        let found = self.next_token();
6745                        return self
6746                            .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6747                    }
6748                },
6749            )
6750        } else {
6751            None
6752        };
6753        let definer = if self.parse_keyword(Keyword::DEFINER) {
6754            self.expect_token(&Token::Eq)?;
6755            Some(self.parse_grantee_name()?)
6756        } else {
6757            None
6758        };
6759        let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6760            Some(
6761                match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6762                    Keyword::DEFINER => CreateViewSecurity::Definer,
6763                    Keyword::INVOKER => CreateViewSecurity::Invoker,
6764                    _ => {
6765                        self.prev_token();
6766                        let found = self.next_token();
6767                        return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6768                    }
6769                },
6770            )
6771        } else {
6772            None
6773        };
6774        if algorithm.is_some() || definer.is_some() || security.is_some() {
6775            Ok(Some(CreateViewParams {
6776                algorithm,
6777                definer,
6778                security,
6779            }))
6780        } else {
6781            Ok(None)
6782        }
6783    }
6784
6785    /// Parse a `CREATE ROLE` statement.
6786    pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6787        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6788        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6789
6790        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
6791
6792        let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6793            vec![Keyword::AUTHORIZATION]
6794        } else if dialect_of!(self is PostgreSqlDialect) {
6795            vec![
6796                Keyword::LOGIN,
6797                Keyword::NOLOGIN,
6798                Keyword::INHERIT,
6799                Keyword::NOINHERIT,
6800                Keyword::BYPASSRLS,
6801                Keyword::NOBYPASSRLS,
6802                Keyword::PASSWORD,
6803                Keyword::CREATEDB,
6804                Keyword::NOCREATEDB,
6805                Keyword::CREATEROLE,
6806                Keyword::NOCREATEROLE,
6807                Keyword::SUPERUSER,
6808                Keyword::NOSUPERUSER,
6809                Keyword::REPLICATION,
6810                Keyword::NOREPLICATION,
6811                Keyword::CONNECTION,
6812                Keyword::VALID,
6813                Keyword::IN,
6814                Keyword::ROLE,
6815                Keyword::ADMIN,
6816                Keyword::USER,
6817            ]
6818        } else {
6819            vec![]
6820        };
6821
6822        // MSSQL
6823        let mut authorization_owner = None;
6824        // Postgres
6825        let mut login = None;
6826        let mut inherit = None;
6827        let mut bypassrls = None;
6828        let mut password = None;
6829        let mut create_db = None;
6830        let mut create_role = None;
6831        let mut superuser = None;
6832        let mut replication = None;
6833        let mut connection_limit = None;
6834        let mut valid_until = None;
6835        let mut in_role = vec![];
6836        let mut in_group = vec![];
6837        let mut role = vec![];
6838        let mut user = vec![];
6839        let mut admin = vec![];
6840
6841        while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6842            let loc = self
6843                .tokens
6844                .get(self.index - 1)
6845                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6846            match keyword {
6847                Keyword::AUTHORIZATION => {
6848                    if authorization_owner.is_some() {
6849                        parser_err!("Found multiple AUTHORIZATION", loc)
6850                    } else {
6851                        authorization_owner = Some(self.parse_object_name(false)?);
6852                        Ok(())
6853                    }
6854                }
6855                Keyword::LOGIN | Keyword::NOLOGIN => {
6856                    if login.is_some() {
6857                        parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6858                    } else {
6859                        login = Some(keyword == Keyword::LOGIN);
6860                        Ok(())
6861                    }
6862                }
6863                Keyword::INHERIT | Keyword::NOINHERIT => {
6864                    if inherit.is_some() {
6865                        parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6866                    } else {
6867                        inherit = Some(keyword == Keyword::INHERIT);
6868                        Ok(())
6869                    }
6870                }
6871                Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6872                    if bypassrls.is_some() {
6873                        parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6874                    } else {
6875                        bypassrls = Some(keyword == Keyword::BYPASSRLS);
6876                        Ok(())
6877                    }
6878                }
6879                Keyword::CREATEDB | Keyword::NOCREATEDB => {
6880                    if create_db.is_some() {
6881                        parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6882                    } else {
6883                        create_db = Some(keyword == Keyword::CREATEDB);
6884                        Ok(())
6885                    }
6886                }
6887                Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6888                    if create_role.is_some() {
6889                        parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6890                    } else {
6891                        create_role = Some(keyword == Keyword::CREATEROLE);
6892                        Ok(())
6893                    }
6894                }
6895                Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6896                    if superuser.is_some() {
6897                        parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6898                    } else {
6899                        superuser = Some(keyword == Keyword::SUPERUSER);
6900                        Ok(())
6901                    }
6902                }
6903                Keyword::REPLICATION | Keyword::NOREPLICATION => {
6904                    if replication.is_some() {
6905                        parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6906                    } else {
6907                        replication = Some(keyword == Keyword::REPLICATION);
6908                        Ok(())
6909                    }
6910                }
6911                Keyword::PASSWORD => {
6912                    if password.is_some() {
6913                        parser_err!("Found multiple PASSWORD", loc)
6914                    } else {
6915                        password = if self.parse_keyword(Keyword::NULL) {
6916                            Some(Password::NullPassword)
6917                        } else {
6918                            Some(Password::Password(Expr::Value(self.parse_value()?)))
6919                        };
6920                        Ok(())
6921                    }
6922                }
6923                Keyword::CONNECTION => {
6924                    self.expect_keyword_is(Keyword::LIMIT)?;
6925                    if connection_limit.is_some() {
6926                        parser_err!("Found multiple CONNECTION LIMIT", loc)
6927                    } else {
6928                        connection_limit = Some(Expr::Value(self.parse_number_value()?));
6929                        Ok(())
6930                    }
6931                }
6932                Keyword::VALID => {
6933                    self.expect_keyword_is(Keyword::UNTIL)?;
6934                    if valid_until.is_some() {
6935                        parser_err!("Found multiple VALID UNTIL", loc)
6936                    } else {
6937                        valid_until = Some(Expr::Value(self.parse_value()?));
6938                        Ok(())
6939                    }
6940                }
6941                Keyword::IN => {
6942                    if self.parse_keyword(Keyword::ROLE) {
6943                        if !in_role.is_empty() {
6944                            parser_err!("Found multiple IN ROLE", loc)
6945                        } else {
6946                            in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
6947                            Ok(())
6948                        }
6949                    } else if self.parse_keyword(Keyword::GROUP) {
6950                        if !in_group.is_empty() {
6951                            parser_err!("Found multiple IN GROUP", loc)
6952                        } else {
6953                            in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
6954                            Ok(())
6955                        }
6956                    } else {
6957                        self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
6958                    }
6959                }
6960                Keyword::ROLE => {
6961                    if !role.is_empty() {
6962                        parser_err!("Found multiple ROLE", loc)
6963                    } else {
6964                        role = self.parse_comma_separated(|p| p.parse_identifier())?;
6965                        Ok(())
6966                    }
6967                }
6968                Keyword::USER => {
6969                    if !user.is_empty() {
6970                        parser_err!("Found multiple USER", loc)
6971                    } else {
6972                        user = self.parse_comma_separated(|p| p.parse_identifier())?;
6973                        Ok(())
6974                    }
6975                }
6976                Keyword::ADMIN => {
6977                    if !admin.is_empty() {
6978                        parser_err!("Found multiple ADMIN", loc)
6979                    } else {
6980                        admin = self.parse_comma_separated(|p| p.parse_identifier())?;
6981                        Ok(())
6982                    }
6983                }
6984                _ => break,
6985            }?
6986        }
6987
6988        Ok(CreateRole {
6989            names,
6990            if_not_exists,
6991            login,
6992            inherit,
6993            bypassrls,
6994            password,
6995            create_db,
6996            create_role,
6997            replication,
6998            superuser,
6999            connection_limit,
7000            valid_until,
7001            in_role,
7002            in_group,
7003            role,
7004            user,
7005            admin,
7006            authorization_owner,
7007        })
7008    }
7009
7010    /// Parse an `OWNER` clause.
7011    pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
7012        let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
7013            Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
7014            Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
7015            Some(Keyword::SESSION_USER) => Owner::SessionUser,
7016            Some(unexpected_keyword) => return Err(ParserError::ParserError(
7017                format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
7018            )),
7019            None => {
7020                match self.parse_identifier() {
7021                    Ok(ident) => Owner::Ident(ident),
7022                    Err(e) => {
7023                        return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
7024                    }
7025                }
7026            }
7027        };
7028        Ok(owner)
7029    }
7030
7031    /// Parses a [Statement::CreateDomain] statement.
7032    fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
7033        let name = self.parse_object_name(false)?;
7034        self.expect_keyword_is(Keyword::AS)?;
7035        let data_type = self.parse_data_type()?;
7036        let collation = if self.parse_keyword(Keyword::COLLATE) {
7037            Some(self.parse_identifier()?)
7038        } else {
7039            None
7040        };
7041        let default = if self.parse_keyword(Keyword::DEFAULT) {
7042            Some(self.parse_expr()?)
7043        } else {
7044            None
7045        };
7046        let mut constraints = Vec::new();
7047        while let Some(constraint) = self.parse_optional_table_constraint()? {
7048            constraints.push(constraint);
7049        }
7050
7051        Ok(CreateDomain {
7052            name,
7053            data_type,
7054            collation,
7055            default,
7056            constraints,
7057        })
7058    }
7059
7060    /// ```sql
7061    ///     CREATE POLICY name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ]
7062    ///     [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
7063    ///     [ TO { role_name | PUBLIC | CURRENT_USER | CURRENT_ROLE | SESSION_USER } [, ...] ]
7064    ///     [ USING ( using_expression ) ]
7065    ///     [ WITH CHECK ( with_check_expression ) ]
7066    /// ```
7067    ///
7068    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createpolicy.html)
7069    pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
7070        let name = self.parse_identifier()?;
7071        self.expect_keyword_is(Keyword::ON)?;
7072        let table_name = self.parse_object_name(false)?;
7073
7074        let policy_type = if self.parse_keyword(Keyword::AS) {
7075            let keyword =
7076                self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
7077            Some(match keyword {
7078                Keyword::PERMISSIVE => CreatePolicyType::Permissive,
7079                Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
7080                unexpected_keyword => return Err(ParserError::ParserError(
7081                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
7082                )),
7083            })
7084        } else {
7085            None
7086        };
7087
7088        let command = if self.parse_keyword(Keyword::FOR) {
7089            let keyword = self.expect_one_of_keywords(&[
7090                Keyword::ALL,
7091                Keyword::SELECT,
7092                Keyword::INSERT,
7093                Keyword::UPDATE,
7094                Keyword::DELETE,
7095            ])?;
7096            Some(match keyword {
7097                Keyword::ALL => CreatePolicyCommand::All,
7098                Keyword::SELECT => CreatePolicyCommand::Select,
7099                Keyword::INSERT => CreatePolicyCommand::Insert,
7100                Keyword::UPDATE => CreatePolicyCommand::Update,
7101                Keyword::DELETE => CreatePolicyCommand::Delete,
7102                unexpected_keyword => return Err(ParserError::ParserError(
7103                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7104                )),
7105            })
7106        } else {
7107            None
7108        };
7109
7110        let to = if self.parse_keyword(Keyword::TO) {
7111            Some(self.parse_comma_separated(|p| p.parse_owner())?)
7112        } else {
7113            None
7114        };
7115
7116        let using = if self.parse_keyword(Keyword::USING) {
7117            self.expect_token(&Token::LParen)?;
7118            let expr = self.parse_expr()?;
7119            self.expect_token(&Token::RParen)?;
7120            Some(expr)
7121        } else {
7122            None
7123        };
7124
7125        let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7126            self.expect_token(&Token::LParen)?;
7127            let expr = self.parse_expr()?;
7128            self.expect_token(&Token::RParen)?;
7129            Some(expr)
7130        } else {
7131            None
7132        };
7133
7134        Ok(CreatePolicy {
7135            name,
7136            table_name,
7137            policy_type,
7138            command,
7139            to,
7140            using,
7141            with_check,
7142        })
7143    }
7144
7145    /// ```sql
7146    /// CREATE CONNECTOR [IF NOT EXISTS] connector_name
7147    /// [TYPE datasource_type]
7148    /// [URL datasource_url]
7149    /// [COMMENT connector_comment]
7150    /// [WITH DCPROPERTIES(property_name=property_value, ...)]
7151    /// ```
7152    ///
7153    /// [Hive Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
7154    pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7155        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7156        let name = self.parse_identifier()?;
7157
7158        let connector_type = if self.parse_keyword(Keyword::TYPE) {
7159            Some(self.parse_literal_string()?)
7160        } else {
7161            None
7162        };
7163
7164        let url = if self.parse_keyword(Keyword::URL) {
7165            Some(self.parse_literal_string()?)
7166        } else {
7167            None
7168        };
7169
7170        let comment = self.parse_optional_inline_comment()?;
7171
7172        let with_dcproperties =
7173            match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7174                properties if !properties.is_empty() => Some(properties),
7175                _ => None,
7176            };
7177
7178        Ok(CreateConnector {
7179            name,
7180            if_not_exists,
7181            connector_type,
7182            url,
7183            comment,
7184            with_dcproperties,
7185        })
7186    }
7187
7188    /// Parse an operator name, which can contain special characters like +, -, <, >, =
7189    /// that are tokenized as operator tokens rather than identifiers.
7190    /// This is used for PostgreSQL CREATE OPERATOR statements.
7191    ///
7192    /// Examples: `+`, `myschema.+`, `pg_catalog.<=`
7193    fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7194        let mut parts = vec![];
7195        loop {
7196            // Guard against EOF (or a truncated statement) so we error with an
7197            // "operator name" diagnostic instead of stuffing the literal "EOF"
7198            // string into an identifier and failing later on a missing token.
7199            if matches!(self.peek_token_ref().token, Token::EOF) {
7200                return self.expected("operator name", self.peek_token());
7201            }
7202            parts.push(ObjectNamePart::Identifier(Ident::new(
7203                self.next_token().to_string(),
7204            )));
7205            if !self.consume_token(&Token::Period) {
7206                break;
7207            }
7208        }
7209        Ok(ObjectName(parts))
7210    }
7211
7212    /// Parse a [Statement::CreateOperator]
7213    ///
7214    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createoperator.html)
7215    pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7216        let name = self.parse_operator_name()?;
7217        self.expect_token(&Token::LParen)?;
7218
7219        let mut function: Option<ObjectName> = None;
7220        let mut is_procedure = false;
7221        let mut left_arg: Option<DataType> = None;
7222        let mut right_arg: Option<DataType> = None;
7223        let mut options: Vec<OperatorOption> = Vec::new();
7224
7225        loop {
7226            let keyword = self.expect_one_of_keywords(&[
7227                Keyword::FUNCTION,
7228                Keyword::PROCEDURE,
7229                Keyword::LEFTARG,
7230                Keyword::RIGHTARG,
7231                Keyword::COMMUTATOR,
7232                Keyword::NEGATOR,
7233                Keyword::RESTRICT,
7234                Keyword::JOIN,
7235                Keyword::HASHES,
7236                Keyword::MERGES,
7237            ])?;
7238
7239            match keyword {
7240                Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7241                    options.push(OperatorOption::Hashes);
7242                }
7243                Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7244                    options.push(OperatorOption::Merges);
7245                }
7246                Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7247                    self.expect_token(&Token::Eq)?;
7248                    function = Some(self.parse_object_name(false)?);
7249                    is_procedure = keyword == Keyword::PROCEDURE;
7250                }
7251                Keyword::LEFTARG if left_arg.is_none() => {
7252                    self.expect_token(&Token::Eq)?;
7253                    left_arg = Some(self.parse_data_type()?);
7254                }
7255                Keyword::RIGHTARG if right_arg.is_none() => {
7256                    self.expect_token(&Token::Eq)?;
7257                    right_arg = Some(self.parse_data_type()?);
7258                }
7259                Keyword::COMMUTATOR
7260                    if !options
7261                        .iter()
7262                        .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7263                {
7264                    self.expect_token(&Token::Eq)?;
7265                    if self.parse_keyword(Keyword::OPERATOR) {
7266                        self.expect_token(&Token::LParen)?;
7267                        let op = self.parse_operator_name()?;
7268                        self.expect_token(&Token::RParen)?;
7269                        options.push(OperatorOption::Commutator(op));
7270                    } else {
7271                        options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7272                    }
7273                }
7274                Keyword::NEGATOR
7275                    if !options
7276                        .iter()
7277                        .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7278                {
7279                    self.expect_token(&Token::Eq)?;
7280                    if self.parse_keyword(Keyword::OPERATOR) {
7281                        self.expect_token(&Token::LParen)?;
7282                        let op = self.parse_operator_name()?;
7283                        self.expect_token(&Token::RParen)?;
7284                        options.push(OperatorOption::Negator(op));
7285                    } else {
7286                        options.push(OperatorOption::Negator(self.parse_operator_name()?));
7287                    }
7288                }
7289                Keyword::RESTRICT
7290                    if !options
7291                        .iter()
7292                        .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7293                {
7294                    self.expect_token(&Token::Eq)?;
7295                    options.push(OperatorOption::Restrict(Some(
7296                        self.parse_object_name(false)?,
7297                    )));
7298                }
7299                Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7300                    self.expect_token(&Token::Eq)?;
7301                    options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7302                }
7303                _ => {
7304                    return Err(ParserError::ParserError(format!(
7305                        "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7306                        keyword
7307                    )))
7308                }
7309            }
7310
7311            if !self.consume_token(&Token::Comma) {
7312                break;
7313            }
7314        }
7315
7316        // Expect closing parenthesis
7317        self.expect_token(&Token::RParen)?;
7318
7319        // FUNCTION is required
7320        let function = function.ok_or_else(|| {
7321            ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7322        })?;
7323
7324        Ok(CreateOperator {
7325            name,
7326            function,
7327            is_procedure,
7328            left_arg,
7329            right_arg,
7330            options,
7331        })
7332    }
7333
7334    /// Parse a [Statement::CreateAggregate]
7335    ///
7336    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createaggregate.html)
7337    pub fn parse_create_aggregate(
7338        &mut self,
7339        or_replace: bool,
7340    ) -> Result<CreateAggregate, ParserError> {
7341        let name = self.parse_object_name(false)?;
7342
7343        // Argument type list: `(input_data_type [, ...])` or `(*)` for zero-arg.
7344        self.expect_token(&Token::LParen)?;
7345        let args = if self.consume_token(&Token::Mul) {
7346            // zero-argument aggregate written as `(*)` — treat as empty arg list.
7347            vec![]
7348        } else if self.consume_token(&Token::RParen) {
7349            self.prev_token();
7350            vec![]
7351        } else {
7352            self.parse_comma_separated(|p| p.parse_data_type())?
7353        };
7354        self.expect_token(&Token::RParen)?;
7355
7356        // Options block: `( SFUNC = ..., STYPE = ..., ... )`
7357        self.expect_token(&Token::LParen)?;
7358        let mut options: Vec<CreateAggregateOption> = Vec::new();
7359        loop {
7360            let token = self.next_token();
7361            match &token.token {
7362                Token::RParen => break,
7363                Token::Comma => continue,
7364                Token::Word(word) => {
7365                    let option = self.parse_create_aggregate_option(&word.value.to_uppercase())?;
7366                    options.push(option);
7367                }
7368                other => {
7369                    return Err(ParserError::ParserError(format!(
7370                        "Unexpected token in CREATE AGGREGATE options: {other:?}"
7371                    )));
7372                }
7373            }
7374        }
7375
7376        Ok(CreateAggregate {
7377            or_replace,
7378            name,
7379            args,
7380            options,
7381        })
7382    }
7383
7384    fn parse_create_aggregate_option(
7385        &mut self,
7386        key: &str,
7387    ) -> Result<CreateAggregateOption, ParserError> {
7388        match key {
7389            "SFUNC" => {
7390                self.expect_token(&Token::Eq)?;
7391                Ok(CreateAggregateOption::Sfunc(self.parse_object_name(false)?))
7392            }
7393            "STYPE" => {
7394                self.expect_token(&Token::Eq)?;
7395                Ok(CreateAggregateOption::Stype(self.parse_data_type()?))
7396            }
7397            "SSPACE" => {
7398                self.expect_token(&Token::Eq)?;
7399                let size = self.parse_literal_uint()?;
7400                Ok(CreateAggregateOption::Sspace(size))
7401            }
7402            "FINALFUNC" => {
7403                self.expect_token(&Token::Eq)?;
7404                Ok(CreateAggregateOption::Finalfunc(
7405                    self.parse_object_name(false)?,
7406                ))
7407            }
7408            "FINALFUNC_EXTRA" => Ok(CreateAggregateOption::FinalfuncExtra),
7409            "FINALFUNC_MODIFY" => {
7410                self.expect_token(&Token::Eq)?;
7411                Ok(CreateAggregateOption::FinalfuncModify(
7412                    self.parse_aggregate_modify_kind()?,
7413                ))
7414            }
7415            "COMBINEFUNC" => {
7416                self.expect_token(&Token::Eq)?;
7417                Ok(CreateAggregateOption::Combinefunc(
7418                    self.parse_object_name(false)?,
7419                ))
7420            }
7421            "SERIALFUNC" => {
7422                self.expect_token(&Token::Eq)?;
7423                Ok(CreateAggregateOption::Serialfunc(
7424                    self.parse_object_name(false)?,
7425                ))
7426            }
7427            "DESERIALFUNC" => {
7428                self.expect_token(&Token::Eq)?;
7429                Ok(CreateAggregateOption::Deserialfunc(
7430                    self.parse_object_name(false)?,
7431                ))
7432            }
7433            "INITCOND" => {
7434                self.expect_token(&Token::Eq)?;
7435                Ok(CreateAggregateOption::Initcond(self.parse_value()?.value))
7436            }
7437            "MSFUNC" => {
7438                self.expect_token(&Token::Eq)?;
7439                Ok(CreateAggregateOption::Msfunc(
7440                    self.parse_object_name(false)?,
7441                ))
7442            }
7443            "MINVFUNC" => {
7444                self.expect_token(&Token::Eq)?;
7445                Ok(CreateAggregateOption::Minvfunc(
7446                    self.parse_object_name(false)?,
7447                ))
7448            }
7449            "MSTYPE" => {
7450                self.expect_token(&Token::Eq)?;
7451                Ok(CreateAggregateOption::Mstype(self.parse_data_type()?))
7452            }
7453            "MSSPACE" => {
7454                self.expect_token(&Token::Eq)?;
7455                let size = self.parse_literal_uint()?;
7456                Ok(CreateAggregateOption::Msspace(size))
7457            }
7458            "MFINALFUNC" => {
7459                self.expect_token(&Token::Eq)?;
7460                Ok(CreateAggregateOption::Mfinalfunc(
7461                    self.parse_object_name(false)?,
7462                ))
7463            }
7464            "MFINALFUNC_EXTRA" => Ok(CreateAggregateOption::MfinalfuncExtra),
7465            "MFINALFUNC_MODIFY" => {
7466                self.expect_token(&Token::Eq)?;
7467                Ok(CreateAggregateOption::MfinalfuncModify(
7468                    self.parse_aggregate_modify_kind()?,
7469                ))
7470            }
7471            "MINITCOND" => {
7472                self.expect_token(&Token::Eq)?;
7473                Ok(CreateAggregateOption::Minitcond(self.parse_value()?.value))
7474            }
7475            "SORTOP" => {
7476                self.expect_token(&Token::Eq)?;
7477                Ok(CreateAggregateOption::Sortop(
7478                    self.parse_object_name(false)?,
7479                ))
7480            }
7481            "PARALLEL" => {
7482                self.expect_token(&Token::Eq)?;
7483                let parallel = match self.expect_one_of_keywords(&[
7484                    Keyword::SAFE,
7485                    Keyword::RESTRICTED,
7486                    Keyword::UNSAFE,
7487                ])? {
7488                    Keyword::SAFE => FunctionParallel::Safe,
7489                    Keyword::RESTRICTED => FunctionParallel::Restricted,
7490                    Keyword::UNSAFE => FunctionParallel::Unsafe,
7491                    other => {
7492                        return Err(ParserError::ParserError(format!(
7493                            "Internal parser error: unexpected keyword `{other}` for PARALLEL"
7494                        )))
7495                    }
7496                };
7497                Ok(CreateAggregateOption::Parallel(parallel))
7498            }
7499            "HYPOTHETICAL" => Ok(CreateAggregateOption::Hypothetical),
7500            other => Err(ParserError::ParserError(format!(
7501                "Unknown CREATE AGGREGATE option: {other}"
7502            ))),
7503        }
7504    }
7505
7506    fn parse_aggregate_modify_kind(&mut self) -> Result<AggregateModifyKind, ParserError> {
7507        let token = self.next_token();
7508        match &token.token {
7509            Token::Word(word) => match word.value.to_uppercase().as_str() {
7510                "READ_ONLY" => Ok(AggregateModifyKind::ReadOnly),
7511                "SHAREABLE" => Ok(AggregateModifyKind::Shareable),
7512                "READ_WRITE" => Ok(AggregateModifyKind::ReadWrite),
7513                other => Err(ParserError::ParserError(format!(
7514                    "Expected READ_ONLY, SHAREABLE, or READ_WRITE, got: {other}"
7515                ))),
7516            },
7517            other => Err(ParserError::ParserError(format!(
7518                "Expected READ_ONLY, SHAREABLE, or READ_WRITE, got: {other:?}"
7519            ))),
7520        }
7521    }
7522
7523    /// Parse a [Statement::CreateOperatorFamily]
7524    ///
7525    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopfamily.html)
7526    pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7527        let name = self.parse_object_name(false)?;
7528        self.expect_keyword(Keyword::USING)?;
7529        let using = self.parse_identifier()?;
7530
7531        Ok(CreateOperatorFamily { name, using })
7532    }
7533
7534    /// Parse a [Statement::CreateOperatorClass]
7535    ///
7536    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopclass.html)
7537    pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7538        let name = self.parse_object_name(false)?;
7539        let default = self.parse_keyword(Keyword::DEFAULT);
7540        self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7541        let for_type = self.parse_data_type()?;
7542        self.expect_keyword(Keyword::USING)?;
7543        let using = self.parse_identifier()?;
7544
7545        let family = if self.parse_keyword(Keyword::FAMILY) {
7546            Some(self.parse_object_name(false)?)
7547        } else {
7548            None
7549        };
7550
7551        self.expect_keyword(Keyword::AS)?;
7552
7553        let mut items = vec![];
7554        loop {
7555            if self.parse_keyword(Keyword::OPERATOR) {
7556                let strategy_number = self.parse_literal_uint()?;
7557                let operator_name = self.parse_operator_name()?;
7558
7559                // Optional operator argument types
7560                let op_types = if self.consume_token(&Token::LParen) {
7561                    let left = self.parse_data_type()?;
7562                    self.expect_token(&Token::Comma)?;
7563                    let right = self.parse_data_type()?;
7564                    self.expect_token(&Token::RParen)?;
7565                    Some(OperatorArgTypes { left, right })
7566                } else {
7567                    None
7568                };
7569
7570                // Optional purpose
7571                let purpose = if self.parse_keyword(Keyword::FOR) {
7572                    if self.parse_keyword(Keyword::SEARCH) {
7573                        Some(OperatorPurpose::ForSearch)
7574                    } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7575                        let sort_family = self.parse_object_name(false)?;
7576                        Some(OperatorPurpose::ForOrderBy { sort_family })
7577                    } else {
7578                        return self
7579                            .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7580                    }
7581                } else {
7582                    None
7583                };
7584
7585                items.push(OperatorClassItem::Operator {
7586                    strategy_number,
7587                    operator_name,
7588                    op_types,
7589                    purpose,
7590                });
7591            } else if self.parse_keyword(Keyword::FUNCTION) {
7592                let support_number = self.parse_literal_uint()?;
7593
7594                // Optional operator types
7595                let op_types = if self.consume_token(&Token::LParen)
7596                    && self.peek_token_ref().token != Token::RParen
7597                {
7598                    let mut types = vec![];
7599                    loop {
7600                        types.push(self.parse_data_type()?);
7601                        if !self.consume_token(&Token::Comma) {
7602                            break;
7603                        }
7604                    }
7605                    self.expect_token(&Token::RParen)?;
7606                    Some(types)
7607                } else if self.consume_token(&Token::LParen) {
7608                    self.expect_token(&Token::RParen)?;
7609                    Some(vec![])
7610                } else {
7611                    None
7612                };
7613
7614                let function_name = self.parse_object_name(false)?;
7615
7616                // Function argument types
7617                let argument_types = if self.consume_token(&Token::LParen) {
7618                    let mut types = vec![];
7619                    loop {
7620                        if self.peek_token_ref().token == Token::RParen {
7621                            break;
7622                        }
7623                        types.push(self.parse_data_type()?);
7624                        if !self.consume_token(&Token::Comma) {
7625                            break;
7626                        }
7627                    }
7628                    self.expect_token(&Token::RParen)?;
7629                    types
7630                } else {
7631                    vec![]
7632                };
7633
7634                items.push(OperatorClassItem::Function {
7635                    support_number,
7636                    op_types,
7637                    function_name,
7638                    argument_types,
7639                });
7640            } else if self.parse_keyword(Keyword::STORAGE) {
7641                let storage_type = self.parse_data_type()?;
7642                items.push(OperatorClassItem::Storage { storage_type });
7643            } else {
7644                break;
7645            }
7646
7647            // Check for comma separator
7648            if !self.consume_token(&Token::Comma) {
7649                break;
7650            }
7651        }
7652
7653        Ok(CreateOperatorClass {
7654            name,
7655            default,
7656            for_type,
7657            using,
7658            family,
7659            items,
7660        })
7661    }
7662
7663    /// Parse a `DROP` statement.
7664    pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7665        // MySQL dialect supports `TEMPORARY`
7666        let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7667            && self.parse_keyword(Keyword::TEMPORARY);
7668        let persistent = dialect_of!(self is DuckDbDialect)
7669            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7670
7671        let object_type = if self.parse_keyword(Keyword::TABLE) {
7672            ObjectType::Table
7673        } else if self.parse_keyword(Keyword::COLLATION) {
7674            ObjectType::Collation
7675        } else if self.parse_keyword(Keyword::VIEW) {
7676            ObjectType::View
7677        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7678            ObjectType::MaterializedView
7679        } else if self.parse_keyword(Keyword::INDEX) {
7680            ObjectType::Index
7681        } else if self.parse_keyword(Keyword::ROLE) {
7682            ObjectType::Role
7683        } else if self.parse_keyword(Keyword::SCHEMA) {
7684            ObjectType::Schema
7685        } else if self.parse_keyword(Keyword::DATABASE) {
7686            ObjectType::Database
7687        } else if self.parse_keyword(Keyword::SEQUENCE) {
7688            ObjectType::Sequence
7689        } else if self.parse_keyword(Keyword::STAGE) {
7690            ObjectType::Stage
7691        } else if self.parse_keyword(Keyword::TYPE) {
7692            ObjectType::Type
7693        } else if self.parse_keyword(Keyword::USER) {
7694            ObjectType::User
7695        } else if self.parse_keyword(Keyword::STREAM) {
7696            ObjectType::Stream
7697        } else if self.parse_keyword(Keyword::FUNCTION) {
7698            return self.parse_drop_function().map(Into::into);
7699        } else if self.parse_keyword(Keyword::POLICY) {
7700            return self.parse_drop_policy().map(Into::into);
7701        } else if self.parse_keyword(Keyword::CONNECTOR) {
7702            return self.parse_drop_connector();
7703        } else if self.parse_keyword(Keyword::DOMAIN) {
7704            return self.parse_drop_domain().map(Into::into);
7705        } else if self.parse_keyword(Keyword::PROCEDURE) {
7706            return self.parse_drop_procedure();
7707        } else if self.parse_keyword(Keyword::SECRET) {
7708            return self.parse_drop_secret(temporary, persistent);
7709        } else if self.parse_keyword(Keyword::TRIGGER) {
7710            return self.parse_drop_trigger().map(Into::into);
7711        } else if self.parse_keyword(Keyword::EXTENSION) {
7712            return self.parse_drop_extension();
7713        } else if self.parse_keyword(Keyword::OPERATOR) {
7714            // Check if this is DROP OPERATOR FAMILY or DROP OPERATOR CLASS
7715            return if self.parse_keyword(Keyword::FAMILY) {
7716                self.parse_drop_operator_family()
7717            } else if self.parse_keyword(Keyword::CLASS) {
7718                self.parse_drop_operator_class()
7719            } else {
7720                self.parse_drop_operator()
7721            };
7722        } else {
7723            return self.expected_ref(
7724                "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7725                self.peek_token_ref(),
7726            );
7727        };
7728        // Many dialects support the non-standard `IF EXISTS` clause and allow
7729        // specifying multiple objects to delete in a single statement
7730        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7731        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7732
7733        let loc = self.peek_token_ref().span.start;
7734        let cascade = self.parse_keyword(Keyword::CASCADE);
7735        let restrict = self.parse_keyword(Keyword::RESTRICT);
7736        let purge = self.parse_keyword(Keyword::PURGE);
7737        if cascade && restrict {
7738            return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7739        }
7740        if object_type == ObjectType::Role && (cascade || restrict || purge) {
7741            return parser_err!(
7742                "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7743                loc
7744            );
7745        }
7746        let table = if self.parse_keyword(Keyword::ON) {
7747            Some(self.parse_object_name(false)?)
7748        } else {
7749            None
7750        };
7751        Ok(Statement::Drop {
7752            object_type,
7753            if_exists,
7754            names,
7755            cascade,
7756            restrict,
7757            purge,
7758            temporary,
7759            table,
7760        })
7761    }
7762
7763    fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7764        match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7765            Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7766            Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7767            _ => None,
7768        }
7769    }
7770
7771    /// ```sql
7772    /// DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7773    /// [ CASCADE | RESTRICT ]
7774    /// ```
7775    fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7776        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7777        let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7778        let drop_behavior = self.parse_optional_drop_behavior();
7779        Ok(DropFunction {
7780            if_exists,
7781            func_desc,
7782            drop_behavior,
7783        })
7784    }
7785
7786    /// ```sql
7787    /// DROP POLICY [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
7788    /// ```
7789    ///
7790    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-droppolicy.html)
7791    fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7792        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7793        let name = self.parse_identifier()?;
7794        self.expect_keyword_is(Keyword::ON)?;
7795        let table_name = self.parse_object_name(false)?;
7796        let drop_behavior = self.parse_optional_drop_behavior();
7797        Ok(DropPolicy {
7798            if_exists,
7799            name,
7800            table_name,
7801            drop_behavior,
7802        })
7803    }
7804    /// ```sql
7805    /// DROP CONNECTOR [IF EXISTS] name
7806    /// ```
7807    ///
7808    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-DropConnector)
7809    fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7810        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7811        let name = self.parse_identifier()?;
7812        Ok(Statement::DropConnector { if_exists, name })
7813    }
7814
7815    /// ```sql
7816    /// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
7817    /// ```
7818    fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7819        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7820        let name = self.parse_object_name(false)?;
7821        let drop_behavior = self.parse_optional_drop_behavior();
7822        Ok(DropDomain {
7823            if_exists,
7824            name,
7825            drop_behavior,
7826        })
7827    }
7828
7829    /// ```sql
7830    /// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7831    /// [ CASCADE | RESTRICT ]
7832    /// ```
7833    fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7834        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7835        let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7836        let drop_behavior = self.parse_optional_drop_behavior();
7837        Ok(Statement::DropProcedure {
7838            if_exists,
7839            proc_desc,
7840            drop_behavior,
7841        })
7842    }
7843
7844    fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7845        let name = self.parse_object_name(false)?;
7846
7847        let args = if self.consume_token(&Token::LParen) {
7848            if self.consume_token(&Token::RParen) {
7849                Some(vec![])
7850            } else {
7851                let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7852                self.expect_token(&Token::RParen)?;
7853                Some(args)
7854            }
7855        } else {
7856            None
7857        };
7858
7859        Ok(FunctionDesc { name, args })
7860    }
7861
7862    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
7863    fn parse_drop_secret(
7864        &mut self,
7865        temporary: bool,
7866        persistent: bool,
7867    ) -> Result<Statement, ParserError> {
7868        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7869        let name = self.parse_identifier()?;
7870        let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7871            self.parse_identifier().ok()
7872        } else {
7873            None
7874        };
7875        let temp = match (temporary, persistent) {
7876            (true, false) => Some(true),
7877            (false, true) => Some(false),
7878            (false, false) => None,
7879            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7880        };
7881
7882        Ok(Statement::DropSecret {
7883            if_exists,
7884            temporary: temp,
7885            name,
7886            storage_specifier,
7887        })
7888    }
7889
7890    /// Parse a `DECLARE` statement.
7891    ///
7892    /// ```sql
7893    /// DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
7894    ///     CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
7895    /// ```
7896    ///
7897    /// The syntax can vary significantly between warehouses. See the grammar
7898    /// on the warehouse specific function in such cases.
7899    pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7900        if dialect_of!(self is BigQueryDialect) {
7901            return self.parse_big_query_declare();
7902        }
7903        if dialect_of!(self is SnowflakeDialect) {
7904            return self.parse_snowflake_declare();
7905        }
7906        if dialect_of!(self is MsSqlDialect) {
7907            return self.parse_mssql_declare();
7908        }
7909
7910        let name = self.parse_identifier()?;
7911
7912        let binary = Some(self.parse_keyword(Keyword::BINARY));
7913        let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7914            Some(true)
7915        } else if self.parse_keyword(Keyword::ASENSITIVE) {
7916            Some(false)
7917        } else {
7918            None
7919        };
7920        let scroll = if self.parse_keyword(Keyword::SCROLL) {
7921            Some(true)
7922        } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7923            Some(false)
7924        } else {
7925            None
7926        };
7927
7928        self.expect_keyword_is(Keyword::CURSOR)?;
7929        let declare_type = Some(DeclareType::Cursor);
7930
7931        let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7932            Some(keyword) => {
7933                self.expect_keyword_is(Keyword::HOLD)?;
7934
7935                match keyword {
7936                    Keyword::WITH => Some(true),
7937                    Keyword::WITHOUT => Some(false),
7938                    unexpected_keyword => return Err(ParserError::ParserError(
7939                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7940                    )),
7941                }
7942            }
7943            None => None,
7944        };
7945
7946        self.expect_keyword_is(Keyword::FOR)?;
7947
7948        let query = Some(self.parse_query()?);
7949
7950        Ok(Statement::Declare {
7951            stmts: vec![Declare {
7952                names: vec![name],
7953                data_type: None,
7954                assignment: None,
7955                declare_type,
7956                binary,
7957                sensitive,
7958                scroll,
7959                hold,
7960                for_query: query,
7961            }],
7962        })
7963    }
7964
7965    /// Parse a [BigQuery] `DECLARE` statement.
7966    ///
7967    /// Syntax:
7968    /// ```text
7969    /// DECLARE variable_name[, ...] [{ <variable_type> | <DEFAULT expression> }];
7970    /// ```
7971    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#declare
7972    pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7973        let names = self.parse_comma_separated(Parser::parse_identifier)?;
7974
7975        let data_type = match &self.peek_token_ref().token {
7976            Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7977            _ => Some(self.parse_data_type()?),
7978        };
7979
7980        let expr = if data_type.is_some() {
7981            if self.parse_keyword(Keyword::DEFAULT) {
7982                Some(self.parse_expr()?)
7983            } else {
7984                None
7985            }
7986        } else {
7987            // If no variable type - default expression must be specified, per BQ docs.
7988            // i.e `DECLARE foo;` is invalid.
7989            self.expect_keyword_is(Keyword::DEFAULT)?;
7990            Some(self.parse_expr()?)
7991        };
7992
7993        Ok(Statement::Declare {
7994            stmts: vec![Declare {
7995                names,
7996                data_type,
7997                assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7998                declare_type: None,
7999                binary: None,
8000                sensitive: None,
8001                scroll: None,
8002                hold: None,
8003                for_query: None,
8004            }],
8005        })
8006    }
8007
8008    /// Parse a [Snowflake] `DECLARE` statement.
8009    ///
8010    /// Syntax:
8011    /// ```text
8012    /// DECLARE
8013    ///   [{ <variable_declaration>
8014    ///      | <cursor_declaration>
8015    ///      | <resultset_declaration>
8016    ///      | <exception_declaration> }; ... ]
8017    ///
8018    /// <variable_declaration>
8019    /// <variable_name> [<type>] [ { DEFAULT | := } <expression>]
8020    ///
8021    /// <cursor_declaration>
8022    /// <cursor_name> CURSOR FOR <query>
8023    ///
8024    /// <resultset_declaration>
8025    /// <resultset_name> RESULTSET [ { DEFAULT | := } ( <query> ) ] ;
8026    ///
8027    /// <exception_declaration>
8028    /// <exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
8029    /// ```
8030    ///
8031    /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare
8032    pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
8033        let mut stmts = vec![];
8034        loop {
8035            let name = self.parse_identifier()?;
8036            let (declare_type, for_query, assigned_expr, data_type) =
8037                if self.parse_keyword(Keyword::CURSOR) {
8038                    self.expect_keyword_is(Keyword::FOR)?;
8039                    match &self.peek_token_ref().token {
8040                        Token::Word(w) if w.keyword == Keyword::SELECT => (
8041                            Some(DeclareType::Cursor),
8042                            Some(self.parse_query()?),
8043                            None,
8044                            None,
8045                        ),
8046                        _ => (
8047                            Some(DeclareType::Cursor),
8048                            None,
8049                            Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
8050                            None,
8051                        ),
8052                    }
8053                } else if self.parse_keyword(Keyword::RESULTSET) {
8054                    let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
8055                        self.parse_snowflake_variable_declaration_expression()?
8056                    } else {
8057                        // Nothing more to do. The statement has no further parameters.
8058                        None
8059                    };
8060
8061                    (Some(DeclareType::ResultSet), None, assigned_expr, None)
8062                } else if self.parse_keyword(Keyword::EXCEPTION) {
8063                    let assigned_expr = if self.peek_token_ref().token == Token::LParen {
8064                        Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
8065                    } else {
8066                        // Nothing more to do. The statement has no further parameters.
8067                        None
8068                    };
8069
8070                    (Some(DeclareType::Exception), None, assigned_expr, None)
8071                } else {
8072                    // Without an explicit keyword, the only valid option is variable declaration.
8073                    let (assigned_expr, data_type) = if let Some(assigned_expr) =
8074                        self.parse_snowflake_variable_declaration_expression()?
8075                    {
8076                        (Some(assigned_expr), None)
8077                    } else if let Token::Word(_) = &self.peek_token_ref().token {
8078                        let data_type = self.parse_data_type()?;
8079                        (
8080                            self.parse_snowflake_variable_declaration_expression()?,
8081                            Some(data_type),
8082                        )
8083                    } else {
8084                        (None, None)
8085                    };
8086                    (None, None, assigned_expr, data_type)
8087                };
8088            let stmt = Declare {
8089                names: vec![name],
8090                data_type,
8091                assignment: assigned_expr,
8092                declare_type,
8093                binary: None,
8094                sensitive: None,
8095                scroll: None,
8096                hold: None,
8097                for_query,
8098            };
8099
8100            stmts.push(stmt);
8101            if self.consume_token(&Token::SemiColon) {
8102                match &self.peek_token_ref().token {
8103                    Token::Word(w)
8104                        if ALL_KEYWORDS
8105                            .binary_search(&w.value.to_uppercase().as_str())
8106                            .is_err() =>
8107                    {
8108                        // Not a keyword - start of a new declaration.
8109                        continue;
8110                    }
8111                    _ => {
8112                        // Put back the semicolon, this is the end of the DECLARE statement.
8113                        self.prev_token();
8114                    }
8115                }
8116            }
8117
8118            break;
8119        }
8120
8121        Ok(Statement::Declare { stmts })
8122    }
8123
8124    /// Parse a [MsSql] `DECLARE` statement.
8125    ///
8126    /// Syntax:
8127    /// ```text
8128    /// DECLARE
8129    // {
8130    //   { @local_variable [AS] data_type [ = value ] }
8131    //   | { @cursor_variable_name CURSOR [ FOR ] }
8132    // } [ ,...n ]
8133    /// ```
8134    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
8135    pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
8136        let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
8137
8138        Ok(Statement::Declare { stmts })
8139    }
8140
8141    /// Parse the body of a [MsSql] `DECLARE`statement.
8142    ///
8143    /// Syntax:
8144    /// ```text
8145    // {
8146    //   { @local_variable [AS] data_type [ = value ] }
8147    //   | { @cursor_variable_name CURSOR [ FOR ]}
8148    // } [ ,...n ]
8149    /// ```
8150    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
8151    pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
8152        let name = {
8153            let ident = self.parse_identifier()?;
8154            if !ident.value.starts_with('@')
8155                && !matches!(
8156                    &self.peek_token_ref().token,
8157                    Token::Word(w) if w.keyword == Keyword::CURSOR
8158                )
8159            {
8160                Err(ParserError::TokenizerError(
8161                    "Invalid MsSql variable declaration.".to_string(),
8162                ))
8163            } else {
8164                Ok(ident)
8165            }
8166        }?;
8167
8168        let (declare_type, data_type) = match &self.peek_token_ref().token {
8169            Token::Word(w) => match w.keyword {
8170                Keyword::CURSOR => {
8171                    self.next_token();
8172                    (Some(DeclareType::Cursor), None)
8173                }
8174                Keyword::AS => {
8175                    self.next_token();
8176                    (None, Some(self.parse_data_type()?))
8177                }
8178                _ => (None, Some(self.parse_data_type()?)),
8179            },
8180            _ => (None, Some(self.parse_data_type()?)),
8181        };
8182
8183        let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
8184            self.next_token();
8185            let query = Some(self.parse_query()?);
8186            (query, None)
8187        } else {
8188            let assignment = self.parse_mssql_variable_declaration_expression()?;
8189            (None, assignment)
8190        };
8191
8192        Ok(Declare {
8193            names: vec![name],
8194            data_type,
8195            assignment,
8196            declare_type,
8197            binary: None,
8198            sensitive: None,
8199            scroll: None,
8200            hold: None,
8201            for_query,
8202        })
8203    }
8204
8205    /// Parses the assigned expression in a variable declaration.
8206    ///
8207    /// Syntax:
8208    /// ```text
8209    /// [ { DEFAULT | := } <expression>]
8210    /// ```
8211    /// <https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare#variable-declaration-syntax>
8212    pub fn parse_snowflake_variable_declaration_expression(
8213        &mut self,
8214    ) -> Result<Option<DeclareAssignment>, ParserError> {
8215        Ok(match &self.peek_token_ref().token {
8216            Token::Word(w) if w.keyword == Keyword::DEFAULT => {
8217                self.next_token(); // Skip `DEFAULT`
8218                Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
8219            }
8220            Token::Assignment => {
8221                self.next_token(); // Skip `:=`
8222                Some(DeclareAssignment::DuckAssignment(Box::new(
8223                    self.parse_expr()?,
8224                )))
8225            }
8226            _ => None,
8227        })
8228    }
8229
8230    /// Parses the assigned expression in a variable declaration.
8231    ///
8232    /// Syntax:
8233    /// ```text
8234    /// [ = <expression>]
8235    /// ```
8236    pub fn parse_mssql_variable_declaration_expression(
8237        &mut self,
8238    ) -> Result<Option<DeclareAssignment>, ParserError> {
8239        Ok(match &self.peek_token_ref().token {
8240            Token::Eq => {
8241                self.next_token(); // Skip `=`
8242                Some(DeclareAssignment::MsSqlAssignment(Box::new(
8243                    self.parse_expr()?,
8244                )))
8245            }
8246            _ => None,
8247        })
8248    }
8249
8250    /// Parse `FETCH [direction] { FROM | IN } cursor INTO target;` statement.
8251    pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
8252        let direction = if self.parse_keyword(Keyword::NEXT) {
8253            FetchDirection::Next
8254        } else if self.parse_keyword(Keyword::PRIOR) {
8255            FetchDirection::Prior
8256        } else if self.parse_keyword(Keyword::FIRST) {
8257            FetchDirection::First
8258        } else if self.parse_keyword(Keyword::LAST) {
8259            FetchDirection::Last
8260        } else if self.parse_keyword(Keyword::ABSOLUTE) {
8261            FetchDirection::Absolute {
8262                limit: self.parse_number_value()?,
8263            }
8264        } else if self.parse_keyword(Keyword::RELATIVE) {
8265            FetchDirection::Relative {
8266                limit: self.parse_number_value()?,
8267            }
8268        } else if self.parse_keyword(Keyword::FORWARD) {
8269            if self.parse_keyword(Keyword::ALL) {
8270                FetchDirection::ForwardAll
8271            } else {
8272                FetchDirection::Forward {
8273                    // TODO: Support optional
8274                    limit: Some(self.parse_number_value()?),
8275                }
8276            }
8277        } else if self.parse_keyword(Keyword::BACKWARD) {
8278            if self.parse_keyword(Keyword::ALL) {
8279                FetchDirection::BackwardAll
8280            } else {
8281                FetchDirection::Backward {
8282                    // TODO: Support optional
8283                    limit: Some(self.parse_number_value()?),
8284                }
8285            }
8286        } else if self.parse_keyword(Keyword::ALL) {
8287            FetchDirection::All
8288        } else {
8289            FetchDirection::Count {
8290                limit: self.parse_number_value()?,
8291            }
8292        };
8293
8294        let position = if self.peek_keyword(Keyword::FROM) {
8295            self.expect_keyword(Keyword::FROM)?;
8296            FetchPosition::From
8297        } else if self.peek_keyword(Keyword::IN) {
8298            self.expect_keyword(Keyword::IN)?;
8299            FetchPosition::In
8300        } else {
8301            return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8302        };
8303
8304        let name = self.parse_identifier()?;
8305
8306        let into = if self.parse_keyword(Keyword::INTO) {
8307            Some(self.parse_object_name(false)?)
8308        } else {
8309            None
8310        };
8311
8312        Ok(Statement::Fetch {
8313            name,
8314            direction,
8315            position,
8316            into,
8317        })
8318    }
8319
8320    /// Parse a `DISCARD` statement.
8321    pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8322        let object_type = if self.parse_keyword(Keyword::ALL) {
8323            DiscardObject::ALL
8324        } else if self.parse_keyword(Keyword::PLANS) {
8325            DiscardObject::PLANS
8326        } else if self.parse_keyword(Keyword::SEQUENCES) {
8327            DiscardObject::SEQUENCES
8328        } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8329            DiscardObject::TEMP
8330        } else {
8331            return self.expected_ref(
8332                "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8333                self.peek_token_ref(),
8334            );
8335        };
8336        Ok(Statement::Discard { object_type })
8337    }
8338
8339    /// Parse a `CREATE INDEX` statement.
8340    pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8341        let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8342        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8343
8344        let mut using = None;
8345
8346        let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8347            let index_name = self.parse_object_name(false)?;
8348            // MySQL allows `USING index_type` either before or after `ON table_name`
8349            using = self.parse_optional_using_then_index_type()?;
8350            self.expect_keyword_is(Keyword::ON)?;
8351            Some(index_name)
8352        } else {
8353            None
8354        };
8355
8356        let table_name = self.parse_object_name(false)?;
8357
8358        // MySQL allows having two `USING` clauses.
8359        // In that case, the second clause overwrites the first.
8360        using = self.parse_optional_using_then_index_type()?.or(using);
8361
8362        let columns = self.parse_parenthesized_index_column_list()?;
8363
8364        let include = if self.parse_keyword(Keyword::INCLUDE) {
8365            self.expect_token(&Token::LParen)?;
8366            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8367            self.expect_token(&Token::RParen)?;
8368            columns
8369        } else {
8370            vec![]
8371        };
8372
8373        let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8374            let not = self.parse_keyword(Keyword::NOT);
8375            self.expect_keyword_is(Keyword::DISTINCT)?;
8376            Some(!not)
8377        } else {
8378            None
8379        };
8380
8381        let with = if self.dialect.supports_create_index_with_clause()
8382            && self.parse_keyword(Keyword::WITH)
8383        {
8384            self.expect_token(&Token::LParen)?;
8385            let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8386            self.expect_token(&Token::RParen)?;
8387            with_params
8388        } else {
8389            Vec::new()
8390        };
8391
8392        let predicate = if self.parse_keyword(Keyword::WHERE) {
8393            Some(self.parse_expr()?)
8394        } else {
8395            None
8396        };
8397
8398        // MySQL options (including the modern style of `USING` after the column list instead of
8399        // before, which is deprecated) shouldn't conflict with other preceding options (e.g. `WITH
8400        // PARSER` won't be caught by the above `WITH` clause parsing because MySQL doesn't set that
8401        // support flag). This is probably invalid syntax for other dialects, but it is simpler to
8402        // parse it anyway (as we do inside `ALTER TABLE` and `CREATE TABLE` parsing).
8403        let index_options = self.parse_index_options()?;
8404
8405        // MySQL allows `ALGORITHM` and `LOCK` options. Unlike in `ALTER TABLE`, they need not be comma separated.
8406        let mut alter_options = Vec::new();
8407        while self
8408            .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8409            .is_some()
8410        {
8411            alter_options.push(self.parse_alter_table_operation()?)
8412        }
8413
8414        Ok(CreateIndex {
8415            name: index_name,
8416            table_name,
8417            using,
8418            columns,
8419            unique,
8420            concurrently,
8421            if_not_exists,
8422            include,
8423            nulls_distinct,
8424            with,
8425            predicate,
8426            index_options,
8427            alter_options,
8428        })
8429    }
8430
8431    /// Parse a `CREATE EXTENSION` statement.
8432    pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8433        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8434        let name = self.parse_identifier()?;
8435
8436        let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8437            let schema = if self.parse_keyword(Keyword::SCHEMA) {
8438                Some(self.parse_identifier()?)
8439            } else {
8440                None
8441            };
8442
8443            let version = if self.parse_keyword(Keyword::VERSION) {
8444                Some(self.parse_identifier()?)
8445            } else {
8446                None
8447            };
8448
8449            let cascade = self.parse_keyword(Keyword::CASCADE);
8450
8451            (schema, version, cascade)
8452        } else {
8453            (None, None, false)
8454        };
8455
8456        Ok(CreateExtension {
8457            name,
8458            if_not_exists,
8459            schema,
8460            version,
8461            cascade,
8462        })
8463    }
8464
8465    /// Parse a PostgreSQL-specific [Statement::CreateCollation] statement.
8466    pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8467        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8468        let name = self.parse_object_name(false)?;
8469
8470        let definition = if self.parse_keyword(Keyword::FROM) {
8471            CreateCollationDefinition::From(self.parse_object_name(false)?)
8472        } else if self.consume_token(&Token::LParen) {
8473            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8474            self.expect_token(&Token::RParen)?;
8475            CreateCollationDefinition::Options(options)
8476        } else {
8477            return self.expected_ref(
8478                "FROM or parenthesized option list after CREATE COLLATION name",
8479                self.peek_token_ref(),
8480            );
8481        };
8482
8483        Ok(CreateCollation {
8484            if_not_exists,
8485            name,
8486            definition,
8487        })
8488    }
8489
8490    /// Parse a PostgreSQL-specific `CREATE TEXT SEARCH CONFIGURATION | DICTIONARY | PARSER | TEMPLATE` statement.
8491    pub fn parse_create_text_search(&mut self) -> Result<Statement, ParserError> {
8492        if self.parse_keyword(Keyword::CONFIGURATION) {
8493            let name = self.parse_object_name(false)?;
8494            self.expect_token(&Token::LParen)?;
8495            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8496            self.expect_token(&Token::RParen)?;
8497            Ok(Statement::CreateTextSearchConfiguration(
8498                CreateTextSearchConfiguration { name, options },
8499            ))
8500        } else if self.parse_keyword(Keyword::DICTIONARY) {
8501            let name = self.parse_object_name(false)?;
8502            self.expect_token(&Token::LParen)?;
8503            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8504            self.expect_token(&Token::RParen)?;
8505            Ok(Statement::CreateTextSearchDictionary(
8506                CreateTextSearchDictionary { name, options },
8507            ))
8508        } else if self.parse_keyword(Keyword::PARSER) {
8509            let name = self.parse_object_name(false)?;
8510            self.expect_token(&Token::LParen)?;
8511            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8512            self.expect_token(&Token::RParen)?;
8513            Ok(Statement::CreateTextSearchParser(CreateTextSearchParser {
8514                name,
8515                options,
8516            }))
8517        } else if self.parse_keyword(Keyword::TEMPLATE) {
8518            let name = self.parse_object_name(false)?;
8519            self.expect_token(&Token::LParen)?;
8520            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8521            self.expect_token(&Token::RParen)?;
8522            Ok(Statement::CreateTextSearchTemplate(
8523                CreateTextSearchTemplate { name, options },
8524            ))
8525        } else {
8526            self.expected_ref(
8527                "CONFIGURATION, DICTIONARY, PARSER, or TEMPLATE after CREATE TEXT SEARCH",
8528                self.peek_token_ref(),
8529            )
8530        }
8531    }
8532
8533    /// Parse a PostgreSQL-specific [Statement::DropExtension] statement.
8534    pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8535        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8536        let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8537        let cascade_or_restrict =
8538            self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8539        Ok(Statement::DropExtension(DropExtension {
8540            names,
8541            if_exists,
8542            cascade_or_restrict: cascade_or_restrict
8543                .map(|k| match k {
8544                    Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8545                    Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8546                    _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8547                })
8548                .transpose()?,
8549        }))
8550    }
8551
8552    /// Parse a[Statement::DropOperator] statement.
8553    ///
8554    pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8555        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8556        let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8557        let drop_behavior = self.parse_optional_drop_behavior();
8558        Ok(Statement::DropOperator(DropOperator {
8559            if_exists,
8560            operators,
8561            drop_behavior,
8562        }))
8563    }
8564
8565    /// Parse an operator signature for a [Statement::DropOperator]
8566    /// Format: `name ( { left_type | NONE } , right_type )`
8567    fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8568        let name = self.parse_operator_name()?;
8569        self.expect_token(&Token::LParen)?;
8570        let left_type = self.parse_operator_arg_type_or_none()?;
8571        self.expect_token(&Token::Comma)?;
8572        let right_type = self.parse_data_type()?;
8573        self.expect_token(&Token::RParen)?;
8574
8575        Ok(DropOperatorSignature {
8576            name,
8577            left_type,
8578            right_type,
8579        })
8580    }
8581
8582    /// Parse one slot of a PostgreSQL operator signature: a `DataType` or the
8583    /// keyword `NONE`. Used by `DROP OPERATOR` and `COMMENT ON OPERATOR`.
8584    fn parse_operator_arg_type_or_none(&mut self) -> Result<Option<DataType>, ParserError> {
8585        if self.parse_keyword(Keyword::NONE) {
8586            Ok(None)
8587        } else {
8588            Ok(Some(self.parse_data_type()?))
8589        }
8590    }
8591
8592    /// Parse a [Statement::DropOperatorFamily]
8593    ///
8594    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopfamily.html)
8595    pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8596        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8597        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8598        self.expect_keyword(Keyword::USING)?;
8599        let using = self.parse_identifier()?;
8600        let drop_behavior = self.parse_optional_drop_behavior();
8601        Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8602            if_exists,
8603            names,
8604            using,
8605            drop_behavior,
8606        }))
8607    }
8608
8609    /// Parse a [Statement::DropOperatorClass]
8610    ///
8611    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopclass.html)
8612    pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8613        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8614        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8615        self.expect_keyword(Keyword::USING)?;
8616        let using = self.parse_identifier()?;
8617        let drop_behavior = self.parse_optional_drop_behavior();
8618        Ok(Statement::DropOperatorClass(DropOperatorClass {
8619            if_exists,
8620            names,
8621            using,
8622            drop_behavior,
8623        }))
8624    }
8625
8626    /// Parse Hive distribution style.
8627    ///
8628    /// TODO: Support parsing for `SKEWED` distribution style.
8629    pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8630        if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8631            self.expect_token(&Token::LParen)?;
8632            let columns =
8633                self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8634            self.expect_token(&Token::RParen)?;
8635            Ok(HiveDistributionStyle::PARTITIONED { columns })
8636        } else {
8637            Ok(HiveDistributionStyle::NONE)
8638        }
8639    }
8640
8641    /// Parse Redshift `DISTSTYLE { AUTO | EVEN | KEY | ALL }`.
8642    ///
8643    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
8644    fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8645        let token = self.next_token();
8646        match &token.token {
8647            Token::Word(w) => match w.keyword {
8648                Keyword::AUTO => Ok(DistStyle::Auto),
8649                Keyword::EVEN => Ok(DistStyle::Even),
8650                Keyword::KEY => Ok(DistStyle::Key),
8651                Keyword::ALL => Ok(DistStyle::All),
8652                _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8653            },
8654            _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8655        }
8656    }
8657
8658    /// Parse Hive formats.
8659    pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8660        let mut hive_format: Option<HiveFormat> = None;
8661        loop {
8662            match self.parse_one_of_keywords(&[
8663                Keyword::ROW,
8664                Keyword::STORED,
8665                Keyword::LOCATION,
8666                Keyword::WITH,
8667            ]) {
8668                Some(Keyword::ROW) => {
8669                    hive_format
8670                        .get_or_insert_with(HiveFormat::default)
8671                        .row_format = Some(self.parse_row_format()?);
8672                }
8673                Some(Keyword::STORED) => {
8674                    self.expect_keyword_is(Keyword::AS)?;
8675                    if self.parse_keyword(Keyword::INPUTFORMAT) {
8676                        let input_format = self.parse_expr()?;
8677                        self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8678                        let output_format = self.parse_expr()?;
8679                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8680                            Some(HiveIOFormat::IOF {
8681                                input_format,
8682                                output_format,
8683                            });
8684                    } else {
8685                        let format = self.parse_file_format()?;
8686                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8687                            Some(HiveIOFormat::FileFormat { format });
8688                    }
8689                }
8690                Some(Keyword::LOCATION) => {
8691                    hive_format.get_or_insert_with(HiveFormat::default).location =
8692                        Some(self.parse_literal_string()?);
8693                }
8694                Some(Keyword::WITH) => {
8695                    self.prev_token();
8696                    let properties = self
8697                        .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8698                    if !properties.is_empty() {
8699                        hive_format
8700                            .get_or_insert_with(HiveFormat::default)
8701                            .serde_properties = Some(properties);
8702                    } else {
8703                        break;
8704                    }
8705                }
8706                None => break,
8707                _ => break,
8708            }
8709        }
8710
8711        Ok(hive_format)
8712    }
8713
8714    /// Parse Hive row format.
8715    pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8716        self.expect_keyword_is(Keyword::FORMAT)?;
8717        match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8718            Some(Keyword::SERDE) => {
8719                let class = self.parse_literal_string()?;
8720                Ok(HiveRowFormat::SERDE { class })
8721            }
8722            _ => {
8723                let mut row_delimiters = vec![];
8724
8725                loop {
8726                    match self.parse_one_of_keywords(&[
8727                        Keyword::FIELDS,
8728                        Keyword::COLLECTION,
8729                        Keyword::MAP,
8730                        Keyword::LINES,
8731                        Keyword::NULL,
8732                    ]) {
8733                        Some(Keyword::FIELDS)
8734                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8735                        {
8736                            row_delimiters.push(HiveRowDelimiter {
8737                                delimiter: HiveDelimiter::FieldsTerminatedBy,
8738                                char: self.parse_identifier()?,
8739                            });
8740
8741                            if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8742                                row_delimiters.push(HiveRowDelimiter {
8743                                    delimiter: HiveDelimiter::FieldsEscapedBy,
8744                                    char: self.parse_identifier()?,
8745                                });
8746                            }
8747                        }
8748                        Some(Keyword::COLLECTION)
8749                            if self.parse_keywords(&[
8750                                Keyword::ITEMS,
8751                                Keyword::TERMINATED,
8752                                Keyword::BY,
8753                            ]) =>
8754                        {
8755                            row_delimiters.push(HiveRowDelimiter {
8756                                delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8757                                char: self.parse_identifier()?,
8758                            });
8759                        }
8760                        Some(Keyword::MAP)
8761                            if self.parse_keywords(&[
8762                                Keyword::KEYS,
8763                                Keyword::TERMINATED,
8764                                Keyword::BY,
8765                            ]) =>
8766                        {
8767                            row_delimiters.push(HiveRowDelimiter {
8768                                delimiter: HiveDelimiter::MapKeysTerminatedBy,
8769                                char: self.parse_identifier()?,
8770                            });
8771                        }
8772                        Some(Keyword::LINES)
8773                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8774                        {
8775                            row_delimiters.push(HiveRowDelimiter {
8776                                delimiter: HiveDelimiter::LinesTerminatedBy,
8777                                char: self.parse_identifier()?,
8778                            });
8779                        }
8780                        Some(Keyword::NULL)
8781                            if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8782                        {
8783                            row_delimiters.push(HiveRowDelimiter {
8784                                delimiter: HiveDelimiter::NullDefinedAs,
8785                                char: self.parse_identifier()?,
8786                            });
8787                        }
8788                        _ => {
8789                            break;
8790                        }
8791                    }
8792                }
8793
8794                Ok(HiveRowFormat::DELIMITED {
8795                    delimiters: row_delimiters,
8796                })
8797            }
8798        }
8799    }
8800
8801    fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8802        if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8803            Ok(Some(self.parse_identifier()?))
8804        } else {
8805            Ok(None)
8806        }
8807    }
8808
8809    /// Parse `CREATE TABLE` statement.
8810    pub fn parse_create_table(
8811        &mut self,
8812        or_replace: bool,
8813        temporary: bool,
8814        global: Option<bool>,
8815        transient: bool,
8816    ) -> Result<CreateTable, ParserError> {
8817        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8818        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8819        let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8820
8821        // Note: This is a PostgreSQL-specific feature, but the dialect check was intentionally
8822        // removed to allow GenericDialect and other dialects to parse this syntax. This enables
8823        // multi-dialect SQL tools to work with PostgreSQL-specific DDL statements.
8824        //
8825        // PARTITION OF can be combined with other table definition clauses in the AST,
8826        // though PostgreSQL itself prohibits PARTITION OF with AS SELECT or LIKE clauses.
8827        // The parser accepts these combinations for flexibility; semantic validation
8828        // is left to downstream tools.
8829        // Child partitions can have their own constraints and indexes.
8830        let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8831            Some(self.parse_object_name(allow_unquoted_hyphen)?)
8832        } else {
8833            None
8834        };
8835
8836        // Clickhouse has `ON CLUSTER 'cluster'` syntax for DDLs
8837        let on_cluster = self.parse_optional_on_cluster()?;
8838
8839        let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8840
8841        let clone = if self.parse_keyword(Keyword::CLONE) {
8842            self.parse_object_name(allow_unquoted_hyphen).ok()
8843        } else {
8844            None
8845        };
8846
8847        // parse optional column list (schema)
8848        let (columns, constraints) = self.parse_columns()?;
8849        let comment_after_column_def =
8850            if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8851                let next_token = self.next_token();
8852                match next_token.token {
8853                    Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8854                    _ => self.expected("comment", next_token)?,
8855                }
8856            } else {
8857                None
8858            };
8859
8860        // PostgreSQL PARTITION OF: partition bound specification
8861        let for_values = if partition_of.is_some() {
8862            if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8863                Some(self.parse_partition_for_values()?)
8864            } else {
8865                return self.expected_ref(
8866                    "FOR VALUES or DEFAULT after PARTITION OF",
8867                    self.peek_token_ref(),
8868                );
8869            }
8870        } else {
8871            None
8872        };
8873
8874        // SQLite supports `WITHOUT ROWID` at the end of `CREATE TABLE`
8875        let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8876
8877        let hive_distribution = self.parse_hive_distribution()?;
8878        let clustered_by = self.parse_optional_clustered_by()?;
8879        let hive_formats = self.parse_hive_formats()?;
8880
8881        let create_table_config = self.parse_optional_create_table_config()?;
8882
8883        // ClickHouse supports `PRIMARY KEY`, before `ORDER BY`
8884        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#primary-key
8885        let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8886            && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8887        {
8888            Some(Box::new(self.parse_expr()?))
8889        } else {
8890            None
8891        };
8892
8893        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8894            if self.consume_token(&Token::LParen) {
8895                let columns = if self.peek_token_ref().token != Token::RParen {
8896                    self.parse_comma_separated(|p| p.parse_expr())?
8897                } else {
8898                    vec![]
8899                };
8900                self.expect_token(&Token::RParen)?;
8901                Some(OneOrManyWithParens::Many(columns))
8902            } else {
8903                Some(OneOrManyWithParens::One(self.parse_expr()?))
8904            }
8905        } else {
8906            None
8907        };
8908
8909        let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8910            Some(self.parse_create_table_on_commit()?)
8911        } else {
8912            None
8913        };
8914
8915        let strict = self.parse_keyword(Keyword::STRICT);
8916
8917        // Redshift: BACKUP YES|NO
8918        let backup = if self.parse_keyword(Keyword::BACKUP) {
8919            let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8920            Some(keyword == Keyword::YES)
8921        } else {
8922            None
8923        };
8924
8925        // Redshift: DISTSTYLE, DISTKEY, SORTKEY
8926        let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8927            Some(self.parse_dist_style()?)
8928        } else {
8929            None
8930        };
8931        let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8932            self.expect_token(&Token::LParen)?;
8933            let expr = self.parse_expr()?;
8934            self.expect_token(&Token::RParen)?;
8935            Some(expr)
8936        } else {
8937            None
8938        };
8939        let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8940            self.expect_token(&Token::LParen)?;
8941            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8942            self.expect_token(&Token::RParen)?;
8943            Some(columns)
8944        } else {
8945            None
8946        };
8947
8948        // Parse optional `AS ( query )`
8949        let query = if self.parse_keyword(Keyword::AS) {
8950            Some(self.parse_query()?)
8951        } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8952        {
8953            // rewind the SELECT keyword
8954            self.prev_token();
8955            Some(self.parse_query()?)
8956        } else {
8957            None
8958        };
8959
8960        Ok(CreateTableBuilder::new(table_name)
8961            .temporary(temporary)
8962            .columns(columns)
8963            .constraints(constraints)
8964            .or_replace(or_replace)
8965            .if_not_exists(if_not_exists)
8966            .transient(transient)
8967            .hive_distribution(hive_distribution)
8968            .hive_formats(hive_formats)
8969            .global(global)
8970            .query(query)
8971            .without_rowid(without_rowid)
8972            .like(like)
8973            .clone_clause(clone)
8974            .comment_after_column_def(comment_after_column_def)
8975            .order_by(order_by)
8976            .on_commit(on_commit)
8977            .on_cluster(on_cluster)
8978            .clustered_by(clustered_by)
8979            .partition_by(create_table_config.partition_by)
8980            .cluster_by(create_table_config.cluster_by)
8981            .inherits(create_table_config.inherits)
8982            .partition_of(partition_of)
8983            .for_values(for_values)
8984            .table_options(create_table_config.table_options)
8985            .primary_key(primary_key)
8986            .strict(strict)
8987            .backup(backup)
8988            .diststyle(diststyle)
8989            .distkey(distkey)
8990            .sortkey(sortkey)
8991            .build())
8992    }
8993
8994    fn maybe_parse_create_table_like(
8995        &mut self,
8996        allow_unquoted_hyphen: bool,
8997    ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8998        let like = if self.dialect.supports_create_table_like_parenthesized()
8999            && self.consume_token(&Token::LParen)
9000        {
9001            if self.parse_keyword(Keyword::LIKE) {
9002                let name = self.parse_object_name(allow_unquoted_hyphen)?;
9003                let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
9004                    Some(CreateTableLikeDefaults::Including)
9005                } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
9006                    Some(CreateTableLikeDefaults::Excluding)
9007                } else {
9008                    None
9009                };
9010                self.expect_token(&Token::RParen)?;
9011                Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
9012                    name,
9013                    defaults,
9014                }))
9015            } else {
9016                // Rollback the '(' it's probably the columns list
9017                self.prev_token();
9018                None
9019            }
9020        } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
9021            let name = self.parse_object_name(allow_unquoted_hyphen)?;
9022            Some(CreateTableLikeKind::Plain(CreateTableLike {
9023                name,
9024                defaults: None,
9025            }))
9026        } else {
9027            None
9028        };
9029        Ok(like)
9030    }
9031
9032    pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
9033        if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
9034            Ok(OnCommit::DeleteRows)
9035        } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
9036            Ok(OnCommit::PreserveRows)
9037        } else if self.parse_keywords(&[Keyword::DROP]) {
9038            Ok(OnCommit::Drop)
9039        } else {
9040            parser_err!(
9041                "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
9042                self.peek_token_ref()
9043            )
9044        }
9045    }
9046
9047    /// Parse [ForValues] of a `PARTITION OF` clause.
9048    ///
9049    /// Parses: `FOR VALUES partition_bound_spec | DEFAULT`
9050    ///
9051    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtable.html)
9052    fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
9053        if self.parse_keyword(Keyword::DEFAULT) {
9054            return Ok(ForValues::Default);
9055        }
9056
9057        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
9058
9059        if self.parse_keyword(Keyword::IN) {
9060            // FOR VALUES IN (expr, ...)
9061            self.expect_token(&Token::LParen)?;
9062            if self.peek_token_ref().token == Token::RParen {
9063                return self.expected_ref("at least one value", self.peek_token_ref());
9064            }
9065            let values = self.parse_comma_separated(Parser::parse_expr)?;
9066            self.expect_token(&Token::RParen)?;
9067            Ok(ForValues::In(values))
9068        } else if self.parse_keyword(Keyword::FROM) {
9069            // FOR VALUES FROM (...) TO (...)
9070            self.expect_token(&Token::LParen)?;
9071            if self.peek_token_ref().token == Token::RParen {
9072                return self.expected_ref("at least one value", self.peek_token_ref());
9073            }
9074            let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9075            self.expect_token(&Token::RParen)?;
9076            self.expect_keyword(Keyword::TO)?;
9077            self.expect_token(&Token::LParen)?;
9078            if self.peek_token_ref().token == Token::RParen {
9079                return self.expected_ref("at least one value", self.peek_token_ref());
9080            }
9081            let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9082            self.expect_token(&Token::RParen)?;
9083            Ok(ForValues::From { from, to })
9084        } else if self.parse_keyword(Keyword::WITH) {
9085            // FOR VALUES WITH (MODULUS n, REMAINDER r)
9086            self.expect_token(&Token::LParen)?;
9087            self.expect_keyword(Keyword::MODULUS)?;
9088            let modulus = self.parse_literal_uint()?;
9089            self.expect_token(&Token::Comma)?;
9090            self.expect_keyword(Keyword::REMAINDER)?;
9091            let remainder = self.parse_literal_uint()?;
9092            self.expect_token(&Token::RParen)?;
9093            Ok(ForValues::With { modulus, remainder })
9094        } else {
9095            self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
9096        }
9097    }
9098
9099    /// Parse a single partition bound value (MINVALUE, MAXVALUE, or expression).
9100    fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
9101        if self.parse_keyword(Keyword::MINVALUE) {
9102            Ok(PartitionBoundValue::MinValue)
9103        } else if self.parse_keyword(Keyword::MAXVALUE) {
9104            Ok(PartitionBoundValue::MaxValue)
9105        } else {
9106            Ok(PartitionBoundValue::Expr(self.parse_expr()?))
9107        }
9108    }
9109
9110    /// Parse configuration like inheritance, partitioning, clustering information during the table creation.
9111    ///
9112    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2)
9113    /// [PostgreSQL](https://www.postgresql.org/docs/current/ddl-partitioning.html)
9114    /// [MySql](https://dev.mysql.com/doc/refman/8.4/en/create-table.html)
9115    fn parse_optional_create_table_config(
9116        &mut self,
9117    ) -> Result<CreateTableConfiguration, ParserError> {
9118        let mut table_options = CreateTableOptions::None;
9119
9120        let inherits = if self.parse_keyword(Keyword::INHERITS) {
9121            Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
9122        } else {
9123            None
9124        };
9125
9126        // PostgreSQL supports `WITH ( options )`, before `AS`
9127        let with_options = self.parse_options(Keyword::WITH)?;
9128        if !with_options.is_empty() {
9129            table_options = CreateTableOptions::With(with_options)
9130        }
9131
9132        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
9133        if !table_properties.is_empty() {
9134            table_options = CreateTableOptions::TableProperties(table_properties);
9135        }
9136        let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
9137            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
9138        {
9139            Some(Box::new(self.parse_expr()?))
9140        } else {
9141            None
9142        };
9143
9144        let mut cluster_by = None;
9145        if dialect_of!(self is BigQueryDialect | GenericDialect) {
9146            if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
9147                cluster_by = Some(WrappedCollection::NoWrapping(
9148                    self.parse_comma_separated(|p| p.parse_expr())?,
9149                ));
9150            };
9151
9152            if let Token::Word(word) = &self.peek_token_ref().token {
9153                if word.keyword == Keyword::OPTIONS {
9154                    table_options =
9155                        CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
9156                }
9157            };
9158        }
9159
9160        if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
9161            let plain_options = self.parse_plain_options()?;
9162            if !plain_options.is_empty() {
9163                table_options = CreateTableOptions::Plain(plain_options)
9164            }
9165        };
9166
9167        Ok(CreateTableConfiguration {
9168            partition_by,
9169            cluster_by,
9170            inherits,
9171            table_options,
9172        })
9173    }
9174
9175    fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
9176        // Single parameter option
9177        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9178        if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
9179            return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
9180        }
9181
9182        // Custom option
9183        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9184        if self.parse_keywords(&[Keyword::COMMENT]) {
9185            let has_eq = self.consume_token(&Token::Eq);
9186            let value = self.next_token();
9187
9188            let comment = match (has_eq, value.token) {
9189                (true, Token::SingleQuotedString(s)) => {
9190                    Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
9191                }
9192                (false, Token::SingleQuotedString(s)) => {
9193                    Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
9194                }
9195                (_, token) => {
9196                    self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
9197                }
9198            };
9199            return comment;
9200        }
9201
9202        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9203        // <https://clickhouse.com/docs/sql-reference/statements/create/table>
9204        if self.parse_keywords(&[Keyword::ENGINE]) {
9205            let _ = self.consume_token(&Token::Eq);
9206            let value = self.next_token();
9207
9208            let engine = match value.token {
9209                Token::Word(w) => {
9210                    let parameters = if self.peek_token_ref().token == Token::LParen {
9211                        self.parse_parenthesized_identifiers()?
9212                    } else {
9213                        vec![]
9214                    };
9215
9216                    Ok(Some(SqlOption::NamedParenthesizedList(
9217                        NamedParenthesizedList {
9218                            key: Ident::new("ENGINE"),
9219                            name: Some(Ident::new(w.value)),
9220                            values: parameters,
9221                        },
9222                    )))
9223                }
9224                _ => {
9225                    return self.expected("Token::Word", value)?;
9226                }
9227            };
9228
9229            return engine;
9230        }
9231
9232        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9233        if self.parse_keywords(&[Keyword::TABLESPACE]) {
9234            let _ = self.consume_token(&Token::Eq);
9235            let value = self.next_token();
9236
9237            let tablespace = match value.token {
9238                Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
9239                    let storage = match self.parse_keyword(Keyword::STORAGE) {
9240                        true => {
9241                            let _ = self.consume_token(&Token::Eq);
9242                            let storage_token = self.next_token();
9243                            match &storage_token.token {
9244                                Token::Word(w) => match w.value.to_uppercase().as_str() {
9245                                    "DISK" => Some(StorageType::Disk),
9246                                    "MEMORY" => Some(StorageType::Memory),
9247                                    _ => self
9248                                        .expected("Storage type (DISK or MEMORY)", storage_token)?,
9249                                },
9250                                _ => self.expected("Token::Word", storage_token)?,
9251                            }
9252                        }
9253                        false => None,
9254                    };
9255
9256                    Ok(Some(SqlOption::TableSpace(TablespaceOption {
9257                        name,
9258                        storage,
9259                    })))
9260                }
9261                _ => {
9262                    return self.expected("Token::Word", value)?;
9263                }
9264            };
9265
9266            return tablespace;
9267        }
9268
9269        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9270        if self.parse_keyword(Keyword::UNION) {
9271            let _ = self.consume_token(&Token::Eq);
9272            let value = self.next_token();
9273
9274            match value.token {
9275                Token::LParen => {
9276                    let tables: Vec<Ident> =
9277                        self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9278                    self.expect_token(&Token::RParen)?;
9279
9280                    return Ok(Some(SqlOption::NamedParenthesizedList(
9281                        NamedParenthesizedList {
9282                            key: Ident::new("UNION"),
9283                            name: None,
9284                            values: tables,
9285                        },
9286                    )));
9287                }
9288                _ => {
9289                    return self.expected("Token::LParen", value)?;
9290                }
9291            }
9292        }
9293
9294        // Key/Value parameter option
9295        let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9296            Ident::new("DEFAULT CHARSET")
9297        } else if self.parse_keyword(Keyword::CHARSET) {
9298            Ident::new("CHARSET")
9299        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9300            Ident::new("DEFAULT CHARACTER SET")
9301        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9302            Ident::new("CHARACTER SET")
9303        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9304            Ident::new("DEFAULT COLLATE")
9305        } else if self.parse_keyword(Keyword::COLLATE) {
9306            Ident::new("COLLATE")
9307        } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9308            Ident::new("DATA DIRECTORY")
9309        } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9310            Ident::new("INDEX DIRECTORY")
9311        } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9312            Ident::new("KEY_BLOCK_SIZE")
9313        } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9314            Ident::new("ROW_FORMAT")
9315        } else if self.parse_keyword(Keyword::PACK_KEYS) {
9316            Ident::new("PACK_KEYS")
9317        } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9318            Ident::new("STATS_AUTO_RECALC")
9319        } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9320            Ident::new("STATS_PERSISTENT")
9321        } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9322            Ident::new("STATS_SAMPLE_PAGES")
9323        } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9324            Ident::new("DELAY_KEY_WRITE")
9325        } else if self.parse_keyword(Keyword::COMPRESSION) {
9326            Ident::new("COMPRESSION")
9327        } else if self.parse_keyword(Keyword::ENCRYPTION) {
9328            Ident::new("ENCRYPTION")
9329        } else if self.parse_keyword(Keyword::MAX_ROWS) {
9330            Ident::new("MAX_ROWS")
9331        } else if self.parse_keyword(Keyword::MIN_ROWS) {
9332            Ident::new("MIN_ROWS")
9333        } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9334            Ident::new("AUTOEXTEND_SIZE")
9335        } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9336            Ident::new("AVG_ROW_LENGTH")
9337        } else if self.parse_keyword(Keyword::CHECKSUM) {
9338            Ident::new("CHECKSUM")
9339        } else if self.parse_keyword(Keyword::CONNECTION) {
9340            Ident::new("CONNECTION")
9341        } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9342            Ident::new("ENGINE_ATTRIBUTE")
9343        } else if self.parse_keyword(Keyword::PASSWORD) {
9344            Ident::new("PASSWORD")
9345        } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9346            Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9347        } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9348            Ident::new("INSERT_METHOD")
9349        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9350            Ident::new("AUTO_INCREMENT")
9351        } else {
9352            return Ok(None);
9353        };
9354
9355        let _ = self.consume_token(&Token::Eq);
9356
9357        let value = match self
9358            .maybe_parse(|parser| parser.parse_value())?
9359            .map(Expr::Value)
9360        {
9361            Some(expr) => expr,
9362            None => Expr::Identifier(self.parse_identifier()?),
9363        };
9364
9365        Ok(Some(SqlOption::KeyValue { key, value }))
9366    }
9367
9368    /// Parse plain options.
9369    pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9370        let mut options = Vec::new();
9371
9372        while let Some(option) = self.parse_plain_option()? {
9373            options.push(option);
9374            // Some dialects support comma-separated options; it shouldn't introduce ambiguity to
9375            // consume it for all dialects.
9376            let _ = self.consume_token(&Token::Comma);
9377        }
9378
9379        Ok(options)
9380    }
9381
9382    /// Parse optional inline comment.
9383    pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9384        let comment = if self.parse_keyword(Keyword::COMMENT) {
9385            let has_eq = self.consume_token(&Token::Eq);
9386            let comment = self.parse_comment_value()?;
9387            Some(if has_eq {
9388                CommentDef::WithEq(comment)
9389            } else {
9390                CommentDef::WithoutEq(comment)
9391            })
9392        } else {
9393            None
9394        };
9395        Ok(comment)
9396    }
9397
9398    /// Parse comment value.
9399    pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9400        let next_token = self.next_token();
9401        let value = match next_token.token {
9402            Token::SingleQuotedString(str) => str,
9403            Token::DollarQuotedString(str) => str.value,
9404            _ => self.expected("string literal", next_token)?,
9405        };
9406        Ok(value)
9407    }
9408
9409    /// Parse optional procedure parameters.
9410    pub fn parse_optional_procedure_parameters(
9411        &mut self,
9412    ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9413        let mut params = vec![];
9414        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9415            return Ok(Some(params));
9416        }
9417        loop {
9418            if let Token::Word(_) = &self.peek_token_ref().token {
9419                params.push(self.parse_procedure_param()?)
9420            }
9421            let comma = self.consume_token(&Token::Comma);
9422            if self.consume_token(&Token::RParen) {
9423                // allow a trailing comma, even though it's not in standard
9424                break;
9425            } else if !comma {
9426                return self.expected_ref(
9427                    "',' or ')' after parameter definition",
9428                    self.peek_token_ref(),
9429                );
9430            }
9431        }
9432        Ok(Some(params))
9433    }
9434
9435    /// Parse columns and constraints.
9436    pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9437        let mut columns = vec![];
9438        let mut constraints = vec![];
9439        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9440            return Ok((columns, constraints));
9441        }
9442
9443        loop {
9444            if let Some(constraint) = self.parse_optional_table_constraint()? {
9445                constraints.push(constraint);
9446            } else if let Token::Word(_) = &self.peek_token_ref().token {
9447                columns.push(self.parse_column_def()?);
9448            } else {
9449                return self.expected_ref(
9450                    "column name or constraint definition",
9451                    self.peek_token_ref(),
9452                );
9453            }
9454
9455            let comma = self.consume_token(&Token::Comma);
9456            let rparen = self.peek_token_ref().token == Token::RParen;
9457
9458            if !comma && !rparen {
9459                return self
9460                    .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9461            };
9462
9463            if rparen
9464                && (!comma
9465                    || self.dialect.supports_column_definition_trailing_commas()
9466                    || self.options.trailing_commas)
9467            {
9468                let _ = self.consume_token(&Token::RParen);
9469                break;
9470            }
9471        }
9472
9473        Ok((columns, constraints))
9474    }
9475
9476    /// Parse procedure parameter.
9477    pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9478        let mode = if self.parse_keyword(Keyword::IN) {
9479            Some(ArgMode::In)
9480        } else if self.parse_keyword(Keyword::OUT) {
9481            Some(ArgMode::Out)
9482        } else if self.parse_keyword(Keyword::INOUT) {
9483            Some(ArgMode::InOut)
9484        } else {
9485            None
9486        };
9487        let name = self.parse_identifier()?;
9488        let data_type = self.parse_data_type()?;
9489        let default = if self.consume_token(&Token::Eq) {
9490            Some(self.parse_expr()?)
9491        } else {
9492            None
9493        };
9494
9495        Ok(ProcedureParam {
9496            name,
9497            data_type,
9498            mode,
9499            default,
9500        })
9501    }
9502
9503    /// Parse column definition.
9504    pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9505        self.parse_column_def_inner(false)
9506    }
9507
9508    fn parse_column_def_inner(
9509        &mut self,
9510        optional_data_type: bool,
9511    ) -> Result<ColumnDef, ParserError> {
9512        let col_name = self.parse_identifier()?;
9513        let data_type = if self.is_column_type_sqlite_unspecified() {
9514            DataType::Unspecified
9515        } else if optional_data_type {
9516            self.maybe_parse(|parser| parser.parse_data_type())?
9517                .unwrap_or(DataType::Unspecified)
9518        } else {
9519            self.parse_data_type()?
9520        };
9521        let mut options = vec![];
9522        loop {
9523            if self.parse_keyword(Keyword::CONSTRAINT) {
9524                let name = Some(self.parse_identifier()?);
9525                if let Some(option) = self.parse_optional_column_option()? {
9526                    options.push(ColumnOptionDef { name, option });
9527                } else {
9528                    return self.expected_ref(
9529                        "constraint details after CONSTRAINT <name>",
9530                        self.peek_token_ref(),
9531                    );
9532                }
9533            } else if let Some(option) = self.parse_optional_column_option()? {
9534                options.push(ColumnOptionDef { name: None, option });
9535            } else {
9536                break;
9537            };
9538        }
9539        Ok(ColumnDef {
9540            name: col_name,
9541            data_type,
9542            options,
9543        })
9544    }
9545
9546    fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9547        if dialect_of!(self is SQLiteDialect) {
9548            match &self.peek_token_ref().token {
9549                Token::Word(word) => matches!(
9550                    word.keyword,
9551                    Keyword::CONSTRAINT
9552                        | Keyword::PRIMARY
9553                        | Keyword::NOT
9554                        | Keyword::UNIQUE
9555                        | Keyword::CHECK
9556                        | Keyword::DEFAULT
9557                        | Keyword::COLLATE
9558                        | Keyword::REFERENCES
9559                        | Keyword::GENERATED
9560                        | Keyword::AS
9561                ),
9562                _ => true, // e.g. comma immediately after column name
9563            }
9564        } else {
9565            false
9566        }
9567    }
9568
9569    /// Parse optional column option.
9570    pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9571        if let Some(option) = self.dialect.parse_column_option(self)? {
9572            return option;
9573        }
9574
9575        self.with_state(
9576            ColumnDefinition,
9577            |parser| -> Result<Option<ColumnOption>, ParserError> {
9578                parser.parse_optional_column_option_inner()
9579            },
9580        )
9581    }
9582
9583    fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9584        if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9585            Ok(Some(ColumnOption::CharacterSet(
9586                self.parse_object_name(false)?,
9587            )))
9588        } else if self.parse_keywords(&[Keyword::COLLATE]) {
9589            Ok(Some(ColumnOption::Collation(
9590                self.parse_object_name(false)?,
9591            )))
9592        } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9593            Ok(Some(ColumnOption::NotNull))
9594        } else if self.parse_keywords(&[Keyword::COMMENT]) {
9595            Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9596        } else if self.parse_keyword(Keyword::NULL) {
9597            Ok(Some(ColumnOption::Null))
9598        } else if self.parse_keyword(Keyword::DEFAULT) {
9599            Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9600        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9601            && self.parse_keyword(Keyword::MATERIALIZED)
9602        {
9603            Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9604        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9605            && self.parse_keyword(Keyword::ALIAS)
9606        {
9607            Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9608        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9609            && self.parse_keyword(Keyword::EPHEMERAL)
9610        {
9611            // The expression is optional for the EPHEMERAL syntax, so we need to check
9612            // if the column definition has remaining tokens before parsing the expression.
9613            if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9614                Ok(Some(ColumnOption::Ephemeral(None)))
9615            } else {
9616                Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9617            }
9618        } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9619            let characteristics = self.parse_constraint_characteristics()?;
9620            Ok(Some(
9621                PrimaryKeyConstraint {
9622                    name: None,
9623                    index_name: None,
9624                    index_type: None,
9625                    columns: vec![],
9626                    index_options: vec![],
9627                    characteristics,
9628                }
9629                .into(),
9630            ))
9631        } else if self.parse_keyword(Keyword::UNIQUE) {
9632            let index_type_display =
9633                if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9634                    KeyOrIndexDisplay::Key
9635                } else {
9636                    KeyOrIndexDisplay::None
9637                };
9638            let characteristics = self.parse_constraint_characteristics()?;
9639            Ok(Some(
9640                UniqueConstraint {
9641                    name: None,
9642                    index_name: None,
9643                    index_type_display,
9644                    index_type: None,
9645                    columns: vec![],
9646                    index_options: vec![],
9647                    characteristics,
9648                    nulls_distinct: NullsDistinctOption::None,
9649                }
9650                .into(),
9651            ))
9652        } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9653            // In MySQL, `KEY` in a column definition is shorthand for `PRIMARY KEY`.
9654            // See: https://dev.mysql.com/doc/refman/8.4/en/create-table.html
9655            let characteristics = self.parse_constraint_characteristics()?;
9656            Ok(Some(
9657                PrimaryKeyConstraint {
9658                    name: None,
9659                    index_name: None,
9660                    index_type: None,
9661                    columns: vec![],
9662                    index_options: vec![],
9663                    characteristics,
9664                }
9665                .into(),
9666            ))
9667        } else if self.parse_keyword(Keyword::REFERENCES) {
9668            let foreign_table = self.parse_object_name(false)?;
9669            // PostgreSQL allows omitting the column list and
9670            // uses the primary key column of the foreign table by default
9671            let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9672            let mut match_kind = None;
9673            let mut on_delete = None;
9674            let mut on_update = None;
9675            loop {
9676                if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9677                    match_kind = Some(self.parse_match_kind()?);
9678                } else if on_delete.is_none()
9679                    && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9680                {
9681                    on_delete = Some(self.parse_referential_action()?);
9682                } else if on_update.is_none()
9683                    && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9684                {
9685                    on_update = Some(self.parse_referential_action()?);
9686                } else {
9687                    break;
9688                }
9689            }
9690            let characteristics = self.parse_constraint_characteristics()?;
9691
9692            Ok(Some(
9693                ForeignKeyConstraint {
9694                    name: None,       // Column-level constraints don't have names
9695                    index_name: None, // Not applicable for column-level constraints
9696                    columns: vec![],  // Not applicable for column-level constraints
9697                    foreign_table,
9698                    referred_columns,
9699                    on_delete,
9700                    on_update,
9701                    match_kind,
9702                    characteristics,
9703                }
9704                .into(),
9705            ))
9706        } else if self.parse_keyword(Keyword::CHECK) {
9707            self.expect_token(&Token::LParen)?;
9708            // since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
9709            let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9710            self.expect_token(&Token::RParen)?;
9711
9712            let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9713                Some(true)
9714            } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9715                Some(false)
9716            } else {
9717                None
9718            };
9719
9720            Ok(Some(
9721                CheckConstraint {
9722                    name: None, // Column-level check constraints don't have names
9723                    expr: Box::new(expr),
9724                    enforced,
9725                }
9726                .into(),
9727            ))
9728        } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9729            && dialect_of!(self is MySqlDialect | GenericDialect)
9730        {
9731            // Support AUTO_INCREMENT for MySQL
9732            Ok(Some(ColumnOption::DialectSpecific(vec![
9733                Token::make_keyword("AUTO_INCREMENT"),
9734            ])))
9735        } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9736            && dialect_of!(self is SQLiteDialect |  GenericDialect)
9737        {
9738            // Support AUTOINCREMENT for SQLite
9739            Ok(Some(ColumnOption::DialectSpecific(vec![
9740                Token::make_keyword("AUTOINCREMENT"),
9741            ])))
9742        } else if self.parse_keyword(Keyword::ASC)
9743            && self.dialect.supports_asc_desc_in_column_definition()
9744        {
9745            // Support ASC for SQLite
9746            Ok(Some(ColumnOption::DialectSpecific(vec![
9747                Token::make_keyword("ASC"),
9748            ])))
9749        } else if self.parse_keyword(Keyword::DESC)
9750            && self.dialect.supports_asc_desc_in_column_definition()
9751        {
9752            // Support DESC for SQLite
9753            Ok(Some(ColumnOption::DialectSpecific(vec![
9754                Token::make_keyword("DESC"),
9755            ])))
9756        } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9757            && dialect_of!(self is MySqlDialect | GenericDialect)
9758        {
9759            let expr = self.parse_expr()?;
9760            Ok(Some(ColumnOption::OnUpdate(expr)))
9761        } else if self.parse_keyword(Keyword::GENERATED) {
9762            self.parse_optional_column_option_generated()
9763        } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9764            && self.parse_keyword(Keyword::OPTIONS)
9765        {
9766            self.prev_token();
9767            Ok(Some(ColumnOption::Options(
9768                self.parse_options(Keyword::OPTIONS)?,
9769            )))
9770        } else if self.parse_keyword(Keyword::AS)
9771            && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9772        {
9773            self.parse_optional_column_option_as()
9774        } else if self.parse_keyword(Keyword::SRID)
9775            && dialect_of!(self is MySqlDialect | GenericDialect)
9776        {
9777            Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9778        } else if self.parse_keyword(Keyword::IDENTITY)
9779            && dialect_of!(self is MsSqlDialect | GenericDialect)
9780        {
9781            let parameters = if self.consume_token(&Token::LParen) {
9782                let seed = self.parse_number()?;
9783                self.expect_token(&Token::Comma)?;
9784                let increment = self.parse_number()?;
9785                self.expect_token(&Token::RParen)?;
9786
9787                Some(IdentityPropertyFormatKind::FunctionCall(
9788                    IdentityParameters { seed, increment },
9789                ))
9790            } else {
9791                None
9792            };
9793            Ok(Some(ColumnOption::Identity(
9794                IdentityPropertyKind::Identity(IdentityProperty {
9795                    parameters,
9796                    order: None,
9797                }),
9798            )))
9799        } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9800            && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9801        {
9802            // Support ON CONFLICT for SQLite
9803            Ok(Some(ColumnOption::OnConflict(
9804                self.expect_one_of_keywords(&[
9805                    Keyword::ROLLBACK,
9806                    Keyword::ABORT,
9807                    Keyword::FAIL,
9808                    Keyword::IGNORE,
9809                    Keyword::REPLACE,
9810                ])?,
9811            )))
9812        } else if self.parse_keyword(Keyword::INVISIBLE) {
9813            Ok(Some(ColumnOption::Invisible))
9814        } else {
9815            Ok(None)
9816        }
9817    }
9818
9819    pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9820        let name = self.parse_object_name(false)?;
9821        self.expect_token(&Token::Eq)?;
9822        let value = self.parse_literal_string()?;
9823
9824        Ok(Tag::new(name, value))
9825    }
9826
9827    fn parse_optional_column_option_generated(
9828        &mut self,
9829    ) -> Result<Option<ColumnOption>, ParserError> {
9830        if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9831            let mut sequence_options = vec![];
9832            if self.expect_token(&Token::LParen).is_ok() {
9833                sequence_options = self.parse_create_sequence_options()?;
9834                self.expect_token(&Token::RParen)?;
9835            }
9836            Ok(Some(ColumnOption::Generated {
9837                generated_as: GeneratedAs::Always,
9838                sequence_options: Some(sequence_options),
9839                generation_expr: None,
9840                generation_expr_mode: None,
9841                generated_keyword: true,
9842            }))
9843        } else if self.parse_keywords(&[
9844            Keyword::BY,
9845            Keyword::DEFAULT,
9846            Keyword::AS,
9847            Keyword::IDENTITY,
9848        ]) {
9849            let mut sequence_options = vec![];
9850            if self.expect_token(&Token::LParen).is_ok() {
9851                sequence_options = self.parse_create_sequence_options()?;
9852                self.expect_token(&Token::RParen)?;
9853            }
9854            Ok(Some(ColumnOption::Generated {
9855                generated_as: GeneratedAs::ByDefault,
9856                sequence_options: Some(sequence_options),
9857                generation_expr: None,
9858                generation_expr_mode: None,
9859                generated_keyword: true,
9860            }))
9861        } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9862            if self.expect_token(&Token::LParen).is_ok() {
9863                let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9864                self.expect_token(&Token::RParen)?;
9865                let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9866                    Ok((
9867                        GeneratedAs::ExpStored,
9868                        Some(GeneratedExpressionMode::Stored),
9869                    ))
9870                } else if dialect_of!(self is PostgreSqlDialect) {
9871                    // Postgres' AS IDENTITY branches are above, this one needs STORED
9872                    self.expected_ref("STORED", self.peek_token_ref())
9873                } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9874                    Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9875                } else {
9876                    Ok((GeneratedAs::Always, None))
9877                }?;
9878
9879                Ok(Some(ColumnOption::Generated {
9880                    generated_as: gen_as,
9881                    sequence_options: None,
9882                    generation_expr: Some(expr),
9883                    generation_expr_mode: expr_mode,
9884                    generated_keyword: true,
9885                }))
9886            } else {
9887                Ok(None)
9888            }
9889        } else {
9890            Ok(None)
9891        }
9892    }
9893
9894    fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9895        // Some DBs allow 'AS (expr)', shorthand for GENERATED ALWAYS AS
9896        self.expect_token(&Token::LParen)?;
9897        let expr = self.parse_expr()?;
9898        self.expect_token(&Token::RParen)?;
9899
9900        let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9901            (
9902                GeneratedAs::ExpStored,
9903                Some(GeneratedExpressionMode::Stored),
9904            )
9905        } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9906            (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9907        } else {
9908            (GeneratedAs::Always, None)
9909        };
9910
9911        Ok(Some(ColumnOption::Generated {
9912            generated_as: gen_as,
9913            sequence_options: None,
9914            generation_expr: Some(expr),
9915            generation_expr_mode: expr_mode,
9916            generated_keyword: false,
9917        }))
9918    }
9919
9920    /// Parse optional `CLUSTERED BY` clause for Hive/Generic dialects.
9921    pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9922        let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9923            && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9924        {
9925            let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9926
9927            let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9928                self.expect_token(&Token::LParen)?;
9929                let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9930                self.expect_token(&Token::RParen)?;
9931                Some(sorted_by_columns)
9932            } else {
9933                None
9934            };
9935
9936            self.expect_keyword_is(Keyword::INTO)?;
9937            let num_buckets = self.parse_number_value()?.value;
9938            self.expect_keyword_is(Keyword::BUCKETS)?;
9939            Some(ClusteredBy {
9940                columns,
9941                sorted_by,
9942                num_buckets,
9943            })
9944        } else {
9945            None
9946        };
9947        Ok(clustered_by)
9948    }
9949
9950    /// Parse a referential action used in foreign key clauses.
9951    ///
9952    /// Recognized forms: `RESTRICT`, `CASCADE`, `SET NULL`, `NO ACTION`, `SET DEFAULT`.
9953    pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9954        if self.parse_keyword(Keyword::RESTRICT) {
9955            Ok(ReferentialAction::Restrict)
9956        } else if self.parse_keyword(Keyword::CASCADE) {
9957            Ok(ReferentialAction::Cascade)
9958        } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9959            Ok(ReferentialAction::SetNull)
9960        } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9961            Ok(ReferentialAction::NoAction)
9962        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9963            Ok(ReferentialAction::SetDefault)
9964        } else {
9965            self.expected_ref(
9966                "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9967                self.peek_token_ref(),
9968            )
9969        }
9970    }
9971
9972    /// Parse a `MATCH` kind for constraint references: `FULL`, `PARTIAL`, or `SIMPLE`.
9973    pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9974        if self.parse_keyword(Keyword::FULL) {
9975            Ok(ConstraintReferenceMatchKind::Full)
9976        } else if self.parse_keyword(Keyword::PARTIAL) {
9977            Ok(ConstraintReferenceMatchKind::Partial)
9978        } else if self.parse_keyword(Keyword::SIMPLE) {
9979            Ok(ConstraintReferenceMatchKind::Simple)
9980        } else {
9981            self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9982        }
9983    }
9984
9985    /// Parse `index_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
9986    /// after `{ PRIMARY KEY | UNIQUE } USING INDEX`.
9987    fn parse_constraint_using_index(
9988        &mut self,
9989        name: Option<Ident>,
9990    ) -> Result<ConstraintUsingIndex, ParserError> {
9991        let index_name = self.parse_identifier()?;
9992        let characteristics = self.parse_constraint_characteristics()?;
9993        Ok(ConstraintUsingIndex {
9994            name,
9995            index_name,
9996            characteristics,
9997        })
9998    }
9999
10000    /// Parse optional constraint characteristics such as `DEFERRABLE`, `INITIALLY` and `ENFORCED`.
10001    pub fn parse_constraint_characteristics(
10002        &mut self,
10003    ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
10004        let mut cc = ConstraintCharacteristics::default();
10005
10006        loop {
10007            if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
10008            {
10009                cc.deferrable = Some(false);
10010            } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
10011                cc.deferrable = Some(true);
10012            } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
10013                if self.parse_keyword(Keyword::DEFERRED) {
10014                    cc.initially = Some(DeferrableInitial::Deferred);
10015                } else if self.parse_keyword(Keyword::IMMEDIATE) {
10016                    cc.initially = Some(DeferrableInitial::Immediate);
10017                } else {
10018                    self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
10019                }
10020            } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
10021                cc.enforced = Some(true);
10022            } else if cc.enforced.is_none()
10023                && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
10024            {
10025                cc.enforced = Some(false);
10026            } else {
10027                break;
10028            }
10029        }
10030
10031        if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
10032            Ok(Some(cc))
10033        } else {
10034            Ok(None)
10035        }
10036    }
10037
10038    /// Parse an optional table constraint (e.g. `PRIMARY KEY`, `UNIQUE`, `FOREIGN KEY`, `CHECK`).
10039    pub fn parse_optional_table_constraint(
10040        &mut self,
10041    ) -> Result<Option<TableConstraint>, ParserError> {
10042        let name = if self.parse_keyword(Keyword::CONSTRAINT) {
10043            if self.dialect.supports_constraint_keyword_without_name()
10044                && self
10045                    .peek_one_of_keywords(&[
10046                        Keyword::CHECK,
10047                        Keyword::PRIMARY,
10048                        Keyword::UNIQUE,
10049                        Keyword::FOREIGN,
10050                    ])
10051                    .is_some()
10052            {
10053                None
10054            } else {
10055                Some(self.parse_identifier()?)
10056            }
10057        } else {
10058            None
10059        };
10060
10061        // FULLTEXT and SPATIAL are MySQL-specific table constraint keywords. For
10062        // dialects that don't support them (e.g. PostgreSQL) they are valid
10063        // identifiers and must not be consumed here — the caller will parse them
10064        // as column names instead.
10065        if name.is_none()
10066            && self
10067                .peek_one_of_keywords(&[Keyword::FULLTEXT, Keyword::SPATIAL])
10068                .is_some()
10069            && !dialect_of!(self is GenericDialect | MySqlDialect)
10070        {
10071            return Ok(None);
10072        }
10073
10074        let next_token = self.next_token();
10075        match next_token.token {
10076            Token::Word(w) if w.keyword == Keyword::UNIQUE => {
10077                // PostgreSQL: UNIQUE USING INDEX index_name
10078                // https://www.postgresql.org/docs/current/sql-altertable.html
10079                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10080                    return Ok(Some(TableConstraint::UniqueUsingIndex(
10081                        self.parse_constraint_using_index(name)?,
10082                    )));
10083                }
10084
10085                let index_type_display = self.parse_index_type_display();
10086                if !dialect_of!(self is GenericDialect | MySqlDialect)
10087                    && !index_type_display.is_none()
10088                {
10089                    return self.expected_ref(
10090                        "`index_name` or `(column_name [, ...])`",
10091                        self.peek_token_ref(),
10092                    );
10093                }
10094
10095                let nulls_distinct = self.parse_optional_nulls_distinct()?;
10096
10097                // optional index name
10098                let index_name = self.parse_optional_ident()?;
10099                let index_type = self.parse_optional_using_then_index_type()?;
10100
10101                let columns = self.parse_parenthesized_index_column_list()?;
10102                let index_options = self.parse_index_options()?;
10103                let characteristics = self.parse_constraint_characteristics()?;
10104                Ok(Some(
10105                    UniqueConstraint {
10106                        name,
10107                        index_name,
10108                        index_type_display,
10109                        index_type,
10110                        columns,
10111                        index_options,
10112                        characteristics,
10113                        nulls_distinct,
10114                    }
10115                    .into(),
10116                ))
10117            }
10118            Token::Word(w) if w.keyword == Keyword::PRIMARY => {
10119                // after `PRIMARY` always stay `KEY`
10120                self.expect_keyword_is(Keyword::KEY)?;
10121
10122                // PostgreSQL: PRIMARY KEY USING INDEX index_name
10123                // https://www.postgresql.org/docs/current/sql-altertable.html
10124                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10125                    return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
10126                        self.parse_constraint_using_index(name)?,
10127                    )));
10128                }
10129
10130                // optional index name
10131                let index_name = self.parse_optional_ident()?;
10132                let index_type = self.parse_optional_using_then_index_type()?;
10133
10134                let columns = self.parse_parenthesized_index_column_list()?;
10135                let index_options = self.parse_index_options()?;
10136                let characteristics = self.parse_constraint_characteristics()?;
10137                Ok(Some(
10138                    PrimaryKeyConstraint {
10139                        name,
10140                        index_name,
10141                        index_type,
10142                        columns,
10143                        index_options,
10144                        characteristics,
10145                    }
10146                    .into(),
10147                ))
10148            }
10149            Token::Word(w) if w.keyword == Keyword::FOREIGN => {
10150                self.expect_keyword_is(Keyword::KEY)?;
10151                let index_name = self.parse_optional_ident()?;
10152                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
10153                self.expect_keyword_is(Keyword::REFERENCES)?;
10154                let foreign_table = self.parse_object_name(false)?;
10155                let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
10156                let mut match_kind = None;
10157                let mut on_delete = None;
10158                let mut on_update = None;
10159                loop {
10160                    if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
10161                        match_kind = Some(self.parse_match_kind()?);
10162                    } else if on_delete.is_none()
10163                        && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
10164                    {
10165                        on_delete = Some(self.parse_referential_action()?);
10166                    } else if on_update.is_none()
10167                        && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
10168                    {
10169                        on_update = Some(self.parse_referential_action()?);
10170                    } else {
10171                        break;
10172                    }
10173                }
10174
10175                let characteristics = self.parse_constraint_characteristics()?;
10176
10177                Ok(Some(
10178                    ForeignKeyConstraint {
10179                        name,
10180                        index_name,
10181                        columns,
10182                        foreign_table,
10183                        referred_columns,
10184                        on_delete,
10185                        on_update,
10186                        match_kind,
10187                        characteristics,
10188                    }
10189                    .into(),
10190                ))
10191            }
10192            Token::Word(w) if w.keyword == Keyword::CHECK => {
10193                self.expect_token(&Token::LParen)?;
10194                let expr = Box::new(self.parse_expr()?);
10195                self.expect_token(&Token::RParen)?;
10196
10197                let enforced = if self.parse_keyword(Keyword::ENFORCED) {
10198                    Some(true)
10199                } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
10200                    Some(false)
10201                } else {
10202                    None
10203                };
10204
10205                Ok(Some(
10206                    CheckConstraint {
10207                        name,
10208                        expr,
10209                        enforced,
10210                    }
10211                    .into(),
10212                ))
10213            }
10214            Token::Word(w)
10215                if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
10216                    && dialect_of!(self is GenericDialect | MySqlDialect)
10217                    && name.is_none() =>
10218            {
10219                let display_as_key = w.keyword == Keyword::KEY;
10220
10221                let name = match &self.peek_token_ref().token {
10222                    Token::Word(word) if word.keyword == Keyword::USING => None,
10223                    _ => self.parse_optional_ident()?,
10224                };
10225
10226                let index_type = self.parse_optional_using_then_index_type()?;
10227                let columns = self.parse_parenthesized_index_column_list()?;
10228                let index_options = self.parse_index_options()?;
10229
10230                Ok(Some(
10231                    IndexConstraint {
10232                        display_as_key,
10233                        name,
10234                        index_type,
10235                        columns,
10236                        index_options,
10237                    }
10238                    .into(),
10239                ))
10240            }
10241            Token::Word(w)
10242                if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
10243                    && dialect_of!(self is GenericDialect | MySqlDialect) =>
10244            {
10245                if let Some(name) = name {
10246                    return self.expected(
10247                        "FULLTEXT or SPATIAL option without constraint name",
10248                        TokenWithSpan {
10249                            token: Token::make_keyword(&name.to_string()),
10250                            span: next_token.span,
10251                        },
10252                    );
10253                }
10254
10255                let fulltext = w.keyword == Keyword::FULLTEXT;
10256
10257                let index_type_display = self.parse_index_type_display();
10258
10259                let opt_index_name = self.parse_optional_ident()?;
10260
10261                let columns = self.parse_parenthesized_index_column_list()?;
10262
10263                Ok(Some(
10264                    FullTextOrSpatialConstraint {
10265                        fulltext,
10266                        index_type_display,
10267                        opt_index_name,
10268                        columns,
10269                    }
10270                    .into(),
10271                ))
10272            }
10273            Token::Word(w) if w.keyword == Keyword::EXCLUDE => {
10274                let index_method = if self.parse_keyword(Keyword::USING) {
10275                    Some(self.parse_identifier()?)
10276                } else {
10277                    None
10278                };
10279
10280                self.expect_token(&Token::LParen)?;
10281                let elements = self.parse_comma_separated(|p| p.parse_exclusion_element())?;
10282                self.expect_token(&Token::RParen)?;
10283
10284                let include = if self.parse_keyword(Keyword::INCLUDE) {
10285                    self.expect_token(&Token::LParen)?;
10286                    let cols = self.parse_comma_separated(|p| p.parse_identifier())?;
10287                    self.expect_token(&Token::RParen)?;
10288                    cols
10289                } else {
10290                    vec![]
10291                };
10292
10293                let where_clause = if self.parse_keyword(Keyword::WHERE) {
10294                    self.expect_token(&Token::LParen)?;
10295                    let predicate = self.parse_expr()?;
10296                    self.expect_token(&Token::RParen)?;
10297                    Some(Box::new(predicate))
10298                } else {
10299                    None
10300                };
10301
10302                let characteristics = self.parse_constraint_characteristics()?;
10303
10304                Ok(Some(
10305                    ExclusionConstraint {
10306                        name,
10307                        index_method,
10308                        elements,
10309                        include,
10310                        where_clause,
10311                        characteristics,
10312                    }
10313                    .into(),
10314                ))
10315            }
10316            _ => {
10317                if name.is_some() {
10318                    self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
10319                } else {
10320                    self.prev_token();
10321                    Ok(None)
10322                }
10323            }
10324        }
10325    }
10326
10327    fn parse_exclusion_element(&mut self) -> Result<ExclusionElement, ParserError> {
10328        let expr = self.parse_expr()?;
10329        self.expect_keyword_is(Keyword::WITH)?;
10330        let operator_token = self.next_token();
10331        let operator = operator_token.token.to_string();
10332        Ok(ExclusionElement { expr, operator })
10333    }
10334
10335    fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10336        Ok(if self.parse_keyword(Keyword::NULLS) {
10337            let not = self.parse_keyword(Keyword::NOT);
10338            self.expect_keyword_is(Keyword::DISTINCT)?;
10339            if not {
10340                NullsDistinctOption::NotDistinct
10341            } else {
10342                NullsDistinctOption::Distinct
10343            }
10344        } else {
10345            NullsDistinctOption::None
10346        })
10347    }
10348
10349    /// Optionally parse a parenthesized list of `SqlOption`s introduced by `keyword`.
10350    pub fn maybe_parse_options(
10351        &mut self,
10352        keyword: Keyword,
10353    ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10354        if let Token::Word(word) = &self.peek_token_ref().token {
10355            if word.keyword == keyword {
10356                return Ok(Some(self.parse_options(keyword)?));
10357            }
10358        };
10359        Ok(None)
10360    }
10361
10362    /// Parse a parenthesized list of `SqlOption`s following `keyword`, or return an empty vec.
10363    pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10364        if self.parse_keyword(keyword) {
10365            self.expect_token(&Token::LParen)?;
10366            let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10367            self.expect_token(&Token::RParen)?;
10368            Ok(options)
10369        } else {
10370            Ok(vec![])
10371        }
10372    }
10373
10374    /// Parse options introduced by one of `keywords` followed by a parenthesized list.
10375    pub fn parse_options_with_keywords(
10376        &mut self,
10377        keywords: &[Keyword],
10378    ) -> Result<Vec<SqlOption>, ParserError> {
10379        if self.parse_keywords(keywords) {
10380            self.expect_token(&Token::LParen)?;
10381            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10382            self.expect_token(&Token::RParen)?;
10383            Ok(options)
10384        } else {
10385            Ok(vec![])
10386        }
10387    }
10388
10389    /// Parse an index type token (e.g. `BTREE`, `HASH`, or a custom identifier).
10390    pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10391        Ok(if self.parse_keyword(Keyword::BTREE) {
10392            IndexType::BTree
10393        } else if self.parse_keyword(Keyword::HASH) {
10394            IndexType::Hash
10395        } else if self.parse_keyword(Keyword::GIN) {
10396            IndexType::GIN
10397        } else if self.parse_keyword(Keyword::GIST) {
10398            IndexType::GiST
10399        } else if self.parse_keyword(Keyword::SPGIST) {
10400            IndexType::SPGiST
10401        } else if self.parse_keyword(Keyword::BRIN) {
10402            IndexType::BRIN
10403        } else if self.parse_keyword(Keyword::BLOOM) {
10404            IndexType::Bloom
10405        } else {
10406            IndexType::Custom(self.parse_identifier()?)
10407        })
10408    }
10409
10410    /// Optionally parse the `USING` keyword, followed by an [IndexType]
10411    /// Example:
10412    /// ```sql
10413    //// USING BTREE (name, age DESC)
10414    /// ```
10415    /// Optionally parse `USING <index_type>` and return the parsed `IndexType` if present.
10416    pub fn parse_optional_using_then_index_type(
10417        &mut self,
10418    ) -> Result<Option<IndexType>, ParserError> {
10419        if self.parse_keyword(Keyword::USING) {
10420            Ok(Some(self.parse_index_type()?))
10421        } else {
10422            Ok(None)
10423        }
10424    }
10425
10426    /// Parse `[ident]`, mostly `ident` is name, like:
10427    /// `window_name`, `index_name`, ...
10428    /// Parse an optional identifier, returning `Some(Ident)` if present.
10429    pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10430        self.maybe_parse(|parser| parser.parse_identifier())
10431    }
10432
10433    #[must_use]
10434    /// Parse optional `KEY` or `INDEX` display tokens used in index/constraint declarations.
10435    pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10436        if self.parse_keyword(Keyword::KEY) {
10437            KeyOrIndexDisplay::Key
10438        } else if self.parse_keyword(Keyword::INDEX) {
10439            KeyOrIndexDisplay::Index
10440        } else {
10441            KeyOrIndexDisplay::None
10442        }
10443    }
10444
10445    /// Parse an optional index option such as `USING <type>` or `COMMENT <string>`.
10446    pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10447        if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10448            Ok(Some(IndexOption::Using(index_type)))
10449        } else if self.parse_keyword(Keyword::COMMENT) {
10450            let s = self.parse_literal_string()?;
10451            Ok(Some(IndexOption::Comment(s)))
10452        } else {
10453            Ok(None)
10454        }
10455    }
10456
10457    /// Parse zero or more index options and return them as a vector.
10458    pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10459        let mut options = Vec::new();
10460
10461        loop {
10462            match self.parse_optional_index_option()? {
10463                Some(index_option) => options.push(index_option),
10464                None => return Ok(options),
10465            }
10466        }
10467    }
10468
10469    /// Parse a single `SqlOption` used by various dialect-specific DDL statements.
10470    pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10471        let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10472
10473        match &self.peek_token_ref().token {
10474            Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10475                Ok(SqlOption::Ident(self.parse_identifier()?))
10476            }
10477            Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10478                self.parse_option_partition()
10479            }
10480            Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10481                self.parse_option_clustered()
10482            }
10483            _ => {
10484                let name = self.parse_identifier()?;
10485                self.expect_token(&Token::Eq)?;
10486                let value = self.parse_expr()?;
10487
10488                Ok(SqlOption::KeyValue { key: name, value })
10489            }
10490        }
10491    }
10492
10493    /// Parse a `CLUSTERED` table option (MSSQL-specific syntaxes supported).
10494    pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10495        if self.parse_keywords(&[
10496            Keyword::CLUSTERED,
10497            Keyword::COLUMNSTORE,
10498            Keyword::INDEX,
10499            Keyword::ORDER,
10500        ]) {
10501            Ok(SqlOption::Clustered(
10502                TableOptionsClustered::ColumnstoreIndexOrder(
10503                    self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10504                ),
10505            ))
10506        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10507            Ok(SqlOption::Clustered(
10508                TableOptionsClustered::ColumnstoreIndex,
10509            ))
10510        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10511            self.expect_token(&Token::LParen)?;
10512
10513            let columns = self.parse_comma_separated(|p| {
10514                let name = p.parse_identifier()?;
10515                let asc = p.parse_asc_desc();
10516
10517                Ok(ClusteredIndex { name, asc })
10518            })?;
10519
10520            self.expect_token(&Token::RParen)?;
10521
10522            Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10523        } else {
10524            Err(ParserError::ParserError(
10525                "invalid CLUSTERED sequence".to_string(),
10526            ))
10527        }
10528    }
10529
10530    /// Parse a `PARTITION(...) FOR VALUES(...)` table option.
10531    pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10532        self.expect_keyword_is(Keyword::PARTITION)?;
10533        self.expect_token(&Token::LParen)?;
10534        let column_name = self.parse_identifier()?;
10535
10536        self.expect_keyword_is(Keyword::RANGE)?;
10537        let range_direction = if self.parse_keyword(Keyword::LEFT) {
10538            Some(PartitionRangeDirection::Left)
10539        } else if self.parse_keyword(Keyword::RIGHT) {
10540            Some(PartitionRangeDirection::Right)
10541        } else {
10542            None
10543        };
10544
10545        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10546        self.expect_token(&Token::LParen)?;
10547
10548        let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10549
10550        self.expect_token(&Token::RParen)?;
10551        self.expect_token(&Token::RParen)?;
10552
10553        Ok(SqlOption::Partition {
10554            column_name,
10555            range_direction,
10556            for_values,
10557        })
10558    }
10559
10560    /// Parse a parenthesized list of partition expressions and return a `Partition` value.
10561    pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10562        self.expect_token(&Token::LParen)?;
10563        let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10564        self.expect_token(&Token::RParen)?;
10565        Ok(Partition::Partitions(partitions))
10566    }
10567
10568    /// Parse a parenthesized `SELECT` projection used for projection-based operations.
10569    pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10570        self.expect_token(&Token::LParen)?;
10571        self.expect_keyword_is(Keyword::SELECT)?;
10572        let projection = self.parse_projection()?;
10573        let group_by = self.parse_optional_group_by()?;
10574        let order_by = self.parse_optional_order_by()?;
10575        self.expect_token(&Token::RParen)?;
10576        Ok(ProjectionSelect {
10577            projection,
10578            group_by,
10579            order_by,
10580        })
10581    }
10582    /// Parse `ALTER TABLE ... ADD PROJECTION ...` operation.
10583    pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10584        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10585        let name = self.parse_identifier()?;
10586        let query = self.parse_projection_select()?;
10587        Ok(AlterTableOperation::AddProjection {
10588            if_not_exists,
10589            name,
10590            select: query,
10591        })
10592    }
10593
10594    /// Parse Redshift `ALTER SORTKEY (column_list)`.
10595    ///
10596    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html>
10597    fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10598        self.expect_keyword_is(Keyword::ALTER)?;
10599        self.expect_keyword_is(Keyword::SORTKEY)?;
10600        self.expect_token(&Token::LParen)?;
10601        let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10602        self.expect_token(&Token::RParen)?;
10603        Ok(AlterTableOperation::AlterSortKey { columns })
10604    }
10605
10606    /// Parse a single `ALTER TABLE` operation and return an `AlterTableOperation`.
10607    pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10608        let operation = if self.parse_keyword(Keyword::ADD) {
10609            if let Some(constraint) = self.parse_optional_table_constraint()? {
10610                let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10611                AlterTableOperation::AddConstraint {
10612                    constraint,
10613                    not_valid,
10614                }
10615            } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10616                && self.parse_keyword(Keyword::PROJECTION)
10617            {
10618                return self.parse_alter_table_add_projection();
10619            } else {
10620                let if_not_exists =
10621                    self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10622                let mut new_partitions = vec![];
10623                loop {
10624                    if self.parse_keyword(Keyword::PARTITION) {
10625                        new_partitions.push(self.parse_partition()?);
10626                    } else {
10627                        break;
10628                    }
10629                }
10630                if !new_partitions.is_empty() {
10631                    AlterTableOperation::AddPartitions {
10632                        if_not_exists,
10633                        new_partitions,
10634                    }
10635                } else {
10636                    let column_keyword = self.parse_keyword(Keyword::COLUMN);
10637
10638                    let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10639                    {
10640                        self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10641                            || if_not_exists
10642                    } else {
10643                        false
10644                    };
10645
10646                    let column_def = self.parse_column_def()?;
10647
10648                    let column_position = self.parse_column_position()?;
10649
10650                    AlterTableOperation::AddColumn {
10651                        column_keyword,
10652                        if_not_exists,
10653                        column_def,
10654                        column_position,
10655                    }
10656                }
10657            }
10658        } else if self.parse_keyword(Keyword::RENAME) {
10659            if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10660                let old_name = self.parse_identifier()?;
10661                self.expect_keyword_is(Keyword::TO)?;
10662                let new_name = self.parse_identifier()?;
10663                AlterTableOperation::RenameConstraint { old_name, new_name }
10664            } else if self.parse_keyword(Keyword::TO) {
10665                let table_name = self.parse_object_name(false)?;
10666                AlterTableOperation::RenameTable {
10667                    table_name: RenameTableNameKind::To(table_name),
10668                }
10669            } else if self.parse_keyword(Keyword::AS) {
10670                let table_name = self.parse_object_name(false)?;
10671                AlterTableOperation::RenameTable {
10672                    table_name: RenameTableNameKind::As(table_name),
10673                }
10674            } else {
10675                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10676                let old_column_name = self.parse_identifier()?;
10677                self.expect_keyword_is(Keyword::TO)?;
10678                let new_column_name = self.parse_identifier()?;
10679                AlterTableOperation::RenameColumn {
10680                    old_column_name,
10681                    new_column_name,
10682                }
10683            }
10684        } else if self.parse_keyword(Keyword::DISABLE) {
10685            if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10686                AlterTableOperation::DisableRowLevelSecurity {}
10687            } else if self.parse_keyword(Keyword::RULE) {
10688                let name = self.parse_identifier()?;
10689                AlterTableOperation::DisableRule { name }
10690            } else if self.parse_keyword(Keyword::TRIGGER) {
10691                let name = self.parse_identifier()?;
10692                AlterTableOperation::DisableTrigger { name }
10693            } else {
10694                return self.expected_ref(
10695                    "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10696                    self.peek_token_ref(),
10697                );
10698            }
10699        } else if self.parse_keyword(Keyword::ENABLE) {
10700            if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10701                let name = self.parse_identifier()?;
10702                AlterTableOperation::EnableAlwaysRule { name }
10703            } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10704                let name = self.parse_identifier()?;
10705                AlterTableOperation::EnableAlwaysTrigger { name }
10706            } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10707                AlterTableOperation::EnableRowLevelSecurity {}
10708            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10709                let name = self.parse_identifier()?;
10710                AlterTableOperation::EnableReplicaRule { name }
10711            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10712                let name = self.parse_identifier()?;
10713                AlterTableOperation::EnableReplicaTrigger { name }
10714            } else if self.parse_keyword(Keyword::RULE) {
10715                let name = self.parse_identifier()?;
10716                AlterTableOperation::EnableRule { name }
10717            } else if self.parse_keyword(Keyword::TRIGGER) {
10718                let name = self.parse_identifier()?;
10719                AlterTableOperation::EnableTrigger { name }
10720            } else {
10721                return self.expected_ref(
10722                    "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10723                    self.peek_token_ref(),
10724                );
10725            }
10726        } else if self.parse_keywords(&[
10727            Keyword::FORCE,
10728            Keyword::ROW,
10729            Keyword::LEVEL,
10730            Keyword::SECURITY,
10731        ]) {
10732            AlterTableOperation::ForceRowLevelSecurity
10733        } else if self.parse_keywords(&[
10734            Keyword::NO,
10735            Keyword::FORCE,
10736            Keyword::ROW,
10737            Keyword::LEVEL,
10738            Keyword::SECURITY,
10739        ]) {
10740            AlterTableOperation::NoForceRowLevelSecurity
10741        } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10742            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10743        {
10744            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10745            let name = self.parse_identifier()?;
10746            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10747                Some(self.parse_identifier()?)
10748            } else {
10749                None
10750            };
10751            AlterTableOperation::ClearProjection {
10752                if_exists,
10753                name,
10754                partition,
10755            }
10756        } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10757            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10758        {
10759            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10760            let name = self.parse_identifier()?;
10761            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10762                Some(self.parse_identifier()?)
10763            } else {
10764                None
10765            };
10766            AlterTableOperation::MaterializeProjection {
10767                if_exists,
10768                name,
10769                partition,
10770            }
10771        } else if self.parse_keyword(Keyword::DROP) {
10772            if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10773                self.expect_token(&Token::LParen)?;
10774                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10775                self.expect_token(&Token::RParen)?;
10776                AlterTableOperation::DropPartitions {
10777                    partitions,
10778                    if_exists: true,
10779                }
10780            } else if self.parse_keyword(Keyword::PARTITION) {
10781                self.expect_token(&Token::LParen)?;
10782                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10783                self.expect_token(&Token::RParen)?;
10784                AlterTableOperation::DropPartitions {
10785                    partitions,
10786                    if_exists: false,
10787                }
10788            } else if self.parse_keyword(Keyword::CONSTRAINT) {
10789                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10790                let name = self.parse_identifier()?;
10791                let drop_behavior = self.parse_optional_drop_behavior();
10792                AlterTableOperation::DropConstraint {
10793                    if_exists,
10794                    name,
10795                    drop_behavior,
10796                }
10797            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10798                let drop_behavior = self.parse_optional_drop_behavior();
10799                AlterTableOperation::DropPrimaryKey { drop_behavior }
10800            } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10801                let name = self.parse_identifier()?;
10802                let drop_behavior = self.parse_optional_drop_behavior();
10803                AlterTableOperation::DropForeignKey {
10804                    name,
10805                    drop_behavior,
10806                }
10807            } else if self.parse_keyword(Keyword::INDEX) {
10808                let name = self.parse_identifier()?;
10809                AlterTableOperation::DropIndex { name }
10810            } else if self.parse_keyword(Keyword::PROJECTION)
10811                && dialect_of!(self is ClickHouseDialect|GenericDialect)
10812            {
10813                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10814                let name = self.parse_identifier()?;
10815                AlterTableOperation::DropProjection { if_exists, name }
10816            } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10817                AlterTableOperation::DropClusteringKey
10818            } else {
10819                let has_column_keyword = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10820                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10821                let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10822                    self.parse_comma_separated(Parser::parse_identifier)?
10823                } else {
10824                    vec![self.parse_identifier()?]
10825                };
10826                let drop_behavior = self.parse_optional_drop_behavior();
10827                AlterTableOperation::DropColumn {
10828                    has_column_keyword,
10829                    column_names,
10830                    if_exists,
10831                    drop_behavior,
10832                }
10833            }
10834        } else if self.parse_keyword(Keyword::PARTITION) {
10835            self.expect_token(&Token::LParen)?;
10836            let before = self.parse_comma_separated(Parser::parse_expr)?;
10837            self.expect_token(&Token::RParen)?;
10838            self.expect_keyword_is(Keyword::RENAME)?;
10839            self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10840            self.expect_token(&Token::LParen)?;
10841            let renames = self.parse_comma_separated(Parser::parse_expr)?;
10842            self.expect_token(&Token::RParen)?;
10843            AlterTableOperation::RenamePartitions {
10844                old_partitions: before,
10845                new_partitions: renames,
10846            }
10847        } else if self.parse_keyword(Keyword::CHANGE) {
10848            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10849            let old_name = self.parse_identifier()?;
10850            let new_name = self.parse_identifier()?;
10851            let data_type = self.parse_data_type()?;
10852            let mut options = vec![];
10853            while let Some(option) = self.parse_optional_column_option()? {
10854                options.push(option);
10855            }
10856
10857            let column_position = self.parse_column_position()?;
10858
10859            AlterTableOperation::ChangeColumn {
10860                old_name,
10861                new_name,
10862                data_type,
10863                options,
10864                column_position,
10865            }
10866        } else if self.parse_keyword(Keyword::MODIFY) {
10867            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10868            let col_name = self.parse_identifier()?;
10869            let data_type = self.parse_data_type()?;
10870            let mut options = vec![];
10871            while let Some(option) = self.parse_optional_column_option()? {
10872                options.push(option);
10873            }
10874
10875            let column_position = self.parse_column_position()?;
10876
10877            AlterTableOperation::ModifyColumn {
10878                col_name,
10879                data_type,
10880                options,
10881                column_position,
10882            }
10883        } else if self.parse_keyword(Keyword::ALTER) {
10884            if self.peek_keyword(Keyword::SORTKEY) {
10885                self.prev_token();
10886                return self.parse_alter_sort_key();
10887            }
10888
10889            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10890            let column_name = self.parse_identifier()?;
10891            let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10892
10893            let op: AlterColumnOperation = if self.parse_keywords(&[
10894                Keyword::SET,
10895                Keyword::NOT,
10896                Keyword::NULL,
10897            ]) {
10898                AlterColumnOperation::SetNotNull {}
10899            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10900                AlterColumnOperation::DropNotNull {}
10901            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10902                AlterColumnOperation::SetDefault {
10903                    value: self.parse_expr()?,
10904                }
10905            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10906                AlterColumnOperation::DropDefault {}
10907            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10908                self.parse_set_data_type(true)?
10909            } else if self.parse_keyword(Keyword::TYPE) {
10910                self.parse_set_data_type(false)?
10911            } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10912                let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10913                    Some(GeneratedAs::Always)
10914                } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10915                    Some(GeneratedAs::ByDefault)
10916                } else {
10917                    None
10918                };
10919
10920                self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10921
10922                let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10923
10924                if self.peek_token_ref().token == Token::LParen {
10925                    self.expect_token(&Token::LParen)?;
10926                    sequence_options = Some(self.parse_create_sequence_options()?);
10927                    self.expect_token(&Token::RParen)?;
10928                }
10929
10930                AlterColumnOperation::AddGenerated {
10931                    generated_as,
10932                    sequence_options,
10933                }
10934            } else {
10935                let message = if is_postgresql {
10936                    "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10937                } else {
10938                    "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10939                };
10940
10941                return self.expected_ref(message, self.peek_token_ref());
10942            };
10943            AlterTableOperation::AlterColumn { column_name, op }
10944        } else if self.parse_keyword(Keyword::SWAP) {
10945            self.expect_keyword_is(Keyword::WITH)?;
10946            let table_name = self.parse_object_name(false)?;
10947            AlterTableOperation::SwapWith { table_name }
10948        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10949            && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10950        {
10951            let new_owner = self.parse_owner()?;
10952            AlterTableOperation::OwnerTo { new_owner }
10953        } else if dialect_of!(self is PostgreSqlDialect)
10954            && self.parse_keywords(&[Keyword::ATTACH, Keyword::PARTITION])
10955        {
10956            let partition_name = self.parse_object_name(false)?;
10957            let partition_bound = self.parse_partition_for_values()?;
10958            AlterTableOperation::AttachPartitionOf {
10959                partition_name,
10960                partition_bound,
10961            }
10962        } else if dialect_of!(self is PostgreSqlDialect)
10963            && self.parse_keywords(&[Keyword::DETACH, Keyword::PARTITION])
10964        {
10965            let partition_name = self.parse_object_name(false)?;
10966            let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
10967            let finalize = self.parse_keyword(Keyword::FINALIZE);
10968            AlterTableOperation::DetachPartitionOf {
10969                partition_name,
10970                concurrently,
10971                finalize,
10972            }
10973        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10974            && self.parse_keyword(Keyword::ATTACH)
10975        {
10976            AlterTableOperation::AttachPartition {
10977                partition: self.parse_part_or_partition()?,
10978            }
10979        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10980            && self.parse_keyword(Keyword::DETACH)
10981        {
10982            AlterTableOperation::DetachPartition {
10983                partition: self.parse_part_or_partition()?,
10984            }
10985        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10986            && self.parse_keyword(Keyword::FREEZE)
10987        {
10988            let partition = self.parse_part_or_partition()?;
10989            let with_name = if self.parse_keyword(Keyword::WITH) {
10990                self.expect_keyword_is(Keyword::NAME)?;
10991                Some(self.parse_identifier()?)
10992            } else {
10993                None
10994            };
10995            AlterTableOperation::FreezePartition {
10996                partition,
10997                with_name,
10998            }
10999        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11000            && self.parse_keyword(Keyword::UNFREEZE)
11001        {
11002            let partition = self.parse_part_or_partition()?;
11003            let with_name = if self.parse_keyword(Keyword::WITH) {
11004                self.expect_keyword_is(Keyword::NAME)?;
11005                Some(self.parse_identifier()?)
11006            } else {
11007                None
11008            };
11009            AlterTableOperation::UnfreezePartition {
11010                partition,
11011                with_name,
11012            }
11013        } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
11014            self.expect_token(&Token::LParen)?;
11015            let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
11016            self.expect_token(&Token::RParen)?;
11017            AlterTableOperation::ClusterBy { exprs }
11018        } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
11019            AlterTableOperation::SuspendRecluster
11020        } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
11021            AlterTableOperation::ResumeRecluster
11022        } else if self.parse_keyword(Keyword::LOCK) {
11023            let equals = self.consume_token(&Token::Eq);
11024            let lock = match self.parse_one_of_keywords(&[
11025                Keyword::DEFAULT,
11026                Keyword::EXCLUSIVE,
11027                Keyword::NONE,
11028                Keyword::SHARED,
11029            ]) {
11030                Some(Keyword::DEFAULT) => AlterTableLock::Default,
11031                Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
11032                Some(Keyword::NONE) => AlterTableLock::None,
11033                Some(Keyword::SHARED) => AlterTableLock::Shared,
11034                _ => self.expected_ref(
11035                    "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
11036                    self.peek_token_ref(),
11037                )?,
11038            };
11039            AlterTableOperation::Lock { equals, lock }
11040        } else if self.parse_keyword(Keyword::ALGORITHM) {
11041            let equals = self.consume_token(&Token::Eq);
11042            let algorithm = match self.parse_one_of_keywords(&[
11043                Keyword::DEFAULT,
11044                Keyword::INSTANT,
11045                Keyword::INPLACE,
11046                Keyword::COPY,
11047            ]) {
11048                Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
11049                Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
11050                Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
11051                Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
11052                _ => self.expected_ref(
11053                    "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
11054                    self.peek_token_ref(),
11055                )?,
11056            };
11057            AlterTableOperation::Algorithm { equals, algorithm }
11058        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
11059            let equals = self.consume_token(&Token::Eq);
11060            let value = self.parse_number_value()?;
11061            AlterTableOperation::AutoIncrement { equals, value }
11062        } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
11063            let identity = if self.parse_keyword(Keyword::NOTHING) {
11064                ReplicaIdentity::Nothing
11065            } else if self.parse_keyword(Keyword::FULL) {
11066                ReplicaIdentity::Full
11067            } else if self.parse_keyword(Keyword::DEFAULT) {
11068                ReplicaIdentity::Default
11069            } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
11070                ReplicaIdentity::Index(self.parse_identifier()?)
11071            } else {
11072                return self.expected_ref(
11073                    "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
11074                    self.peek_token_ref(),
11075                );
11076            };
11077
11078            AlterTableOperation::ReplicaIdentity { identity }
11079        } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11080            let name = self.parse_identifier()?;
11081            AlterTableOperation::ValidateConstraint { name }
11082        } else if self.parse_keywords(&[Keyword::SET, Keyword::TABLESPACE]) {
11083            let tablespace_name = self.parse_identifier()?;
11084            AlterTableOperation::SetTablespace { tablespace_name }
11085        } else {
11086            let mut options =
11087                self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
11088            if !options.is_empty() {
11089                AlterTableOperation::SetTblProperties {
11090                    table_properties: options,
11091                }
11092            } else {
11093                options = self.parse_options(Keyword::SET)?;
11094                if !options.is_empty() {
11095                    AlterTableOperation::SetOptionsParens { options }
11096                } else {
11097                    return self.expected_ref(
11098                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
11099                    self.peek_token_ref(),
11100                  );
11101                }
11102            }
11103        };
11104        Ok(operation)
11105    }
11106
11107    fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
11108        let data_type = self.parse_data_type()?;
11109        let using = if self.dialect.supports_alter_column_type_using()
11110            && self.parse_keyword(Keyword::USING)
11111        {
11112            Some(self.parse_expr()?)
11113        } else {
11114            None
11115        };
11116        Ok(AlterColumnOperation::SetDataType {
11117            data_type,
11118            using,
11119            had_set,
11120        })
11121    }
11122
11123    fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
11124        let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
11125        match keyword {
11126            Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
11127            Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
11128            // unreachable because expect_one_of_keywords used above
11129            unexpected_keyword => Err(ParserError::ParserError(
11130                format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
11131            )),
11132        }
11133    }
11134
11135    /// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
11136    pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
11137        let object_type = self.expect_one_of_keywords(&[
11138            Keyword::VIEW,
11139            Keyword::TYPE,
11140            Keyword::COLLATION,
11141            Keyword::TABLE,
11142            Keyword::INDEX,
11143            Keyword::FUNCTION,
11144            Keyword::AGGREGATE,
11145            Keyword::ROLE,
11146            Keyword::POLICY,
11147            Keyword::CONNECTOR,
11148            Keyword::ICEBERG,
11149            Keyword::SCHEMA,
11150            Keyword::USER,
11151            Keyword::OPERATOR,
11152            Keyword::DOMAIN,
11153            Keyword::TRIGGER,
11154            Keyword::EXTENSION,
11155            Keyword::PROCEDURE,
11156            Keyword::DEFAULT,
11157        ])?;
11158        match object_type {
11159            Keyword::SCHEMA => {
11160                self.prev_token();
11161                self.prev_token();
11162                self.parse_alter_schema()
11163            }
11164            Keyword::VIEW => self.parse_alter_view(),
11165            Keyword::TYPE => self.parse_alter_type(),
11166            Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
11167            Keyword::TABLE => self.parse_alter_table(false),
11168            Keyword::ICEBERG => {
11169                self.expect_keyword(Keyword::TABLE)?;
11170                self.parse_alter_table(true)
11171            }
11172            Keyword::DEFAULT => self.parse_alter_default_privileges().map(Into::into),
11173            Keyword::INDEX => {
11174                let index_name = self.parse_object_name(false)?;
11175                let operation = if self.parse_keyword(Keyword::RENAME) {
11176                    if self.parse_keyword(Keyword::TO) {
11177                        let index_name = self.parse_object_name(false)?;
11178                        AlterIndexOperation::RenameIndex { index_name }
11179                    } else {
11180                        return self.expected_ref("TO after RENAME", self.peek_token_ref());
11181                    }
11182                } else if self.parse_keywords(&[Keyword::SET, Keyword::TABLESPACE]) {
11183                    let tablespace_name = self.parse_identifier()?;
11184                    AlterIndexOperation::SetTablespace { tablespace_name }
11185                } else {
11186                    return self.expected_ref(
11187                        "RENAME or SET TABLESPACE after ALTER INDEX",
11188                        self.peek_token_ref(),
11189                    );
11190                };
11191
11192                Ok(Statement::AlterIndex {
11193                    name: index_name,
11194                    operation,
11195                })
11196            }
11197            Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
11198            Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
11199            Keyword::PROCEDURE => self.parse_alter_function(AlterFunctionKind::Procedure),
11200            Keyword::OPERATOR => {
11201                if self.parse_keyword(Keyword::FAMILY) {
11202                    self.parse_alter_operator_family().map(Into::into)
11203                } else if self.parse_keyword(Keyword::CLASS) {
11204                    self.parse_alter_operator_class().map(Into::into)
11205                } else {
11206                    self.parse_alter_operator().map(Into::into)
11207                }
11208            }
11209            Keyword::ROLE => self.parse_alter_role(),
11210            Keyword::POLICY => self.parse_alter_policy().map(Into::into),
11211            Keyword::CONNECTOR => self.parse_alter_connector(),
11212            Keyword::USER => self.parse_alter_user().map(Into::into),
11213            Keyword::DOMAIN => self.parse_alter_domain(),
11214            Keyword::TRIGGER => self.parse_alter_trigger(),
11215            Keyword::EXTENSION => self.parse_alter_extension(),
11216            // unreachable because expect_one_of_keywords used above
11217            unexpected_keyword => Err(ParserError::ParserError(
11218                format!("Internal parser error: expected any of {{VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR, DOMAIN, TRIGGER, EXTENSION, PROCEDURE, DEFAULT}}, got {unexpected_keyword:?}"),
11219            )),
11220        }
11221    }
11222
11223    fn parse_alter_aggregate_signature(
11224        &mut self,
11225    ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
11226        let name = self.parse_object_name(false)?;
11227        self.expect_token(&Token::LParen)?;
11228
11229        if self.consume_token(&Token::Mul) {
11230            self.expect_token(&Token::RParen)?;
11231            return Ok((
11232                FunctionDesc {
11233                    name,
11234                    args: Some(vec![]),
11235                },
11236                true,
11237                None,
11238            ));
11239        }
11240
11241        let args =
11242            if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
11243                vec![]
11244            } else {
11245                self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
11246            };
11247
11248        let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11249            Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
11250        } else {
11251            None
11252        };
11253
11254        self.expect_token(&Token::RParen)?;
11255        Ok((
11256            FunctionDesc {
11257                name,
11258                args: Some(args),
11259            },
11260            false,
11261            aggregate_order_by,
11262        ))
11263    }
11264
11265    fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
11266        let action = if self.parse_keywords(&[
11267            Keyword::CALLED,
11268            Keyword::ON,
11269            Keyword::NULL,
11270            Keyword::INPUT,
11271        ]) {
11272            Some(AlterFunctionAction::CalledOnNull(
11273                FunctionCalledOnNull::CalledOnNullInput,
11274            ))
11275        } else if self.parse_keywords(&[
11276            Keyword::RETURNS,
11277            Keyword::NULL,
11278            Keyword::ON,
11279            Keyword::NULL,
11280            Keyword::INPUT,
11281        ]) {
11282            Some(AlterFunctionAction::CalledOnNull(
11283                FunctionCalledOnNull::ReturnsNullOnNullInput,
11284            ))
11285        } else if self.parse_keyword(Keyword::STRICT) {
11286            Some(AlterFunctionAction::CalledOnNull(
11287                FunctionCalledOnNull::Strict,
11288            ))
11289        } else if self.parse_keyword(Keyword::IMMUTABLE) {
11290            Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
11291        } else if self.parse_keyword(Keyword::STABLE) {
11292            Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
11293        } else if self.parse_keyword(Keyword::VOLATILE) {
11294            Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
11295        } else if self.parse_keyword(Keyword::NOT) {
11296            self.expect_keyword(Keyword::LEAKPROOF)?;
11297            Some(AlterFunctionAction::Leakproof(false))
11298        } else if self.parse_keyword(Keyword::LEAKPROOF) {
11299            Some(AlterFunctionAction::Leakproof(true))
11300        } else if self.parse_keyword(Keyword::EXTERNAL) {
11301            self.expect_keyword(Keyword::SECURITY)?;
11302            let security = if self.parse_keyword(Keyword::DEFINER) {
11303                FunctionSecurity::Definer
11304            } else if self.parse_keyword(Keyword::INVOKER) {
11305                FunctionSecurity::Invoker
11306            } else {
11307                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11308            };
11309            Some(AlterFunctionAction::Security {
11310                external: true,
11311                security,
11312            })
11313        } else if self.parse_keyword(Keyword::SECURITY) {
11314            let security = if self.parse_keyword(Keyword::DEFINER) {
11315                FunctionSecurity::Definer
11316            } else if self.parse_keyword(Keyword::INVOKER) {
11317                FunctionSecurity::Invoker
11318            } else {
11319                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11320            };
11321            Some(AlterFunctionAction::Security {
11322                external: false,
11323                security,
11324            })
11325        } else if self.parse_keyword(Keyword::PARALLEL) {
11326            let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11327                FunctionParallel::Unsafe
11328            } else if self.parse_keyword(Keyword::RESTRICTED) {
11329                FunctionParallel::Restricted
11330            } else if self.parse_keyword(Keyword::SAFE) {
11331                FunctionParallel::Safe
11332            } else {
11333                return self
11334                    .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11335            };
11336            Some(AlterFunctionAction::Parallel(parallel))
11337        } else if self.parse_keyword(Keyword::COST) {
11338            Some(AlterFunctionAction::Cost(self.parse_number()?))
11339        } else if self.parse_keyword(Keyword::ROWS) {
11340            Some(AlterFunctionAction::Rows(self.parse_number()?))
11341        } else if self.parse_keyword(Keyword::SUPPORT) {
11342            Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11343        } else if self.parse_keyword(Keyword::SET) {
11344            let name = self.parse_object_name(false)?;
11345            let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11346                FunctionSetValue::FromCurrent
11347            } else {
11348                if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11349                    return self.expected_ref("= or TO", self.peek_token_ref());
11350                }
11351                if self.parse_keyword(Keyword::DEFAULT) {
11352                    FunctionSetValue::Default
11353                } else {
11354                    FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11355                }
11356            };
11357            Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11358                name,
11359                value,
11360            }))
11361        } else if self.parse_keyword(Keyword::RESET) {
11362            let reset_config = if self.parse_keyword(Keyword::ALL) {
11363                ResetConfig::ALL
11364            } else {
11365                ResetConfig::ConfigName(self.parse_object_name(false)?)
11366            };
11367            Some(AlterFunctionAction::Reset(reset_config))
11368        } else {
11369            None
11370        };
11371
11372        Ok(action)
11373    }
11374
11375    fn parse_alter_function_actions(
11376        &mut self,
11377    ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11378        let mut actions = vec![];
11379        while let Some(action) = self.parse_alter_function_action()? {
11380            actions.push(action);
11381        }
11382        if actions.is_empty() {
11383            return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11384        }
11385        let restrict = self.parse_keyword(Keyword::RESTRICT);
11386        Ok((actions, restrict))
11387    }
11388
11389    /// Parse an `ALTER FUNCTION` or `ALTER AGGREGATE` statement.
11390    pub fn parse_alter_function(
11391        &mut self,
11392        kind: AlterFunctionKind,
11393    ) -> Result<Statement, ParserError> {
11394        let (function, aggregate_star, aggregate_order_by) = match kind {
11395            AlterFunctionKind::Function | AlterFunctionKind::Procedure => {
11396                (self.parse_function_desc()?, false, None)
11397            }
11398            AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11399        };
11400
11401        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11402            let new_name = self.parse_identifier()?;
11403            AlterFunctionOperation::RenameTo { new_name }
11404        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11405            AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11406        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11407            AlterFunctionOperation::SetSchema {
11408                schema_name: self.parse_object_name(false)?,
11409            }
11410        } else if matches!(
11411            kind,
11412            AlterFunctionKind::Function | AlterFunctionKind::Procedure
11413        ) && self.parse_keyword(Keyword::NO)
11414        {
11415            if !self.parse_keyword(Keyword::DEPENDS) {
11416                return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11417            }
11418            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11419            AlterFunctionOperation::DependsOnExtension {
11420                no: true,
11421                extension_name: self.parse_object_name(false)?,
11422            }
11423        } else if matches!(
11424            kind,
11425            AlterFunctionKind::Function | AlterFunctionKind::Procedure
11426        ) && self.parse_keyword(Keyword::DEPENDS)
11427        {
11428            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11429            AlterFunctionOperation::DependsOnExtension {
11430                no: false,
11431                extension_name: self.parse_object_name(false)?,
11432            }
11433        } else if matches!(
11434            kind,
11435            AlterFunctionKind::Function | AlterFunctionKind::Procedure
11436        ) {
11437            let (actions, restrict) = self.parse_alter_function_actions()?;
11438            AlterFunctionOperation::Actions { actions, restrict }
11439        } else {
11440            return self.expected_ref(
11441                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11442                self.peek_token_ref(),
11443            );
11444        };
11445
11446        Ok(Statement::AlterFunction(AlterFunction {
11447            kind,
11448            function,
11449            aggregate_order_by,
11450            aggregate_star,
11451            operation,
11452        }))
11453    }
11454
11455    /// Parse an `ALTER DOMAIN` statement.
11456    pub fn parse_alter_domain(&mut self) -> Result<Statement, ParserError> {
11457        let name = self.parse_object_name(false)?;
11458
11459        let operation = if self.parse_keyword(Keyword::ADD) {
11460            if let Some(constraint) = self.parse_optional_table_constraint()? {
11461                let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
11462                AlterDomainOperation::AddConstraint {
11463                    constraint,
11464                    not_valid,
11465                }
11466            } else {
11467                return self.expected_ref("constraint after ADD", self.peek_token_ref());
11468            }
11469        } else if self.parse_keywords(&[Keyword::DROP, Keyword::CONSTRAINT]) {
11470            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11471            let name = self.parse_identifier()?;
11472            let drop_behavior = self.parse_optional_drop_behavior();
11473            AlterDomainOperation::DropConstraint {
11474                if_exists,
11475                name,
11476                drop_behavior,
11477            }
11478        } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
11479            AlterDomainOperation::DropDefault
11480        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::CONSTRAINT]) {
11481            let old_name = self.parse_identifier()?;
11482            self.expect_keyword_is(Keyword::TO)?;
11483            let new_name = self.parse_identifier()?;
11484            AlterDomainOperation::RenameConstraint { old_name, new_name }
11485        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11486            let new_name = self.parse_identifier()?;
11487            AlterDomainOperation::RenameTo { new_name }
11488        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11489            AlterDomainOperation::OwnerTo(self.parse_owner()?)
11490        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11491            AlterDomainOperation::SetSchema {
11492                schema_name: self.parse_object_name(false)?,
11493            }
11494        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
11495            AlterDomainOperation::SetDefault {
11496                default: self.parse_expr()?,
11497            }
11498        } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11499            let name = self.parse_identifier()?;
11500            AlterDomainOperation::ValidateConstraint { name }
11501        } else {
11502            return self.expected_ref(
11503                "ADD, DROP, RENAME, OWNER TO, SET, VALIDATE after ALTER DOMAIN",
11504                self.peek_token_ref(),
11505            );
11506        };
11507
11508        Ok(AlterDomain { name, operation }.into())
11509    }
11510
11511    /// Parse an `ALTER TRIGGER` statement.
11512    pub fn parse_alter_trigger(&mut self) -> Result<Statement, ParserError> {
11513        let name = self.parse_identifier()?;
11514        self.expect_keyword_is(Keyword::ON)?;
11515        let table_name = self.parse_object_name(false)?;
11516
11517        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11518            let new_name = self.parse_identifier()?;
11519            AlterTriggerOperation::RenameTo { new_name }
11520        } else {
11521            return self.expected_ref(
11522                "RENAME TO after ALTER TRIGGER ... ON ...",
11523                self.peek_token_ref(),
11524            );
11525        };
11526
11527        Ok(AlterTrigger {
11528            name,
11529            table_name,
11530            operation,
11531        }
11532        .into())
11533    }
11534
11535    /// Parse an `ALTER EXTENSION` statement.
11536    pub fn parse_alter_extension(&mut self) -> Result<Statement, ParserError> {
11537        let name = self.parse_identifier()?;
11538
11539        let operation = if self.parse_keyword(Keyword::UPDATE) {
11540            let version = if self.parse_keyword(Keyword::TO) {
11541                Some(self.parse_identifier()?)
11542            } else {
11543                None
11544            };
11545            AlterExtensionOperation::UpdateTo { version }
11546        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11547            AlterExtensionOperation::SetSchema {
11548                schema_name: self.parse_object_name(false)?,
11549            }
11550        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11551            AlterExtensionOperation::OwnerTo(self.parse_owner()?)
11552        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11553            let new_name = self.parse_identifier()?;
11554            AlterExtensionOperation::RenameTo { new_name }
11555        } else {
11556            return self.expected_ref(
11557                "UPDATE, SET SCHEMA, OWNER TO, or RENAME TO after ALTER EXTENSION",
11558                self.peek_token_ref(),
11559            );
11560        };
11561
11562        Ok(AlterExtension { name, operation }.into())
11563    }
11564
11565    /// Parse a [Statement::AlterTable]
11566    pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11567        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11568        let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
11569        let table_name = self.parse_object_name(false)?;
11570        let on_cluster = self.parse_optional_on_cluster()?;
11571        let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11572
11573        let mut location = None;
11574        if self.parse_keyword(Keyword::LOCATION) {
11575            location = Some(HiveSetLocation {
11576                has_set: false,
11577                location: self.parse_identifier()?,
11578            });
11579        } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11580            location = Some(HiveSetLocation {
11581                has_set: true,
11582                location: self.parse_identifier()?,
11583            });
11584        }
11585
11586        let end_token = if self.peek_token_ref().token == Token::SemiColon {
11587            self.peek_token_ref().clone()
11588        } else {
11589            self.get_current_token().clone()
11590        };
11591
11592        Ok(AlterTable {
11593            name: table_name,
11594            if_exists,
11595            only,
11596            operations,
11597            location,
11598            on_cluster,
11599            table_type: if iceberg {
11600                Some(AlterTableType::Iceberg)
11601            } else {
11602                None
11603            },
11604            end_token: AttachedToken(end_token),
11605        }
11606        .into())
11607    }
11608
11609    /// Parse an `ALTER VIEW` statement.
11610    pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11611        let name = self.parse_object_name(false)?;
11612        let columns = self.parse_parenthesized_column_list(Optional, false)?;
11613
11614        let with_options = self.parse_options(Keyword::WITH)?;
11615
11616        self.expect_keyword_is(Keyword::AS)?;
11617        let query = self.parse_query()?;
11618
11619        Ok(Statement::AlterView {
11620            name,
11621            columns,
11622            query,
11623            with_options,
11624        })
11625    }
11626
11627    /// Parse a [Statement::AlterType]
11628    pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11629        let name = self.parse_object_name(false)?;
11630
11631        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11632            let new_name = self.parse_identifier()?;
11633            AlterTypeOperation::Rename(AlterTypeRename { new_name })
11634        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11635            let existing_enum_value = self.parse_identifier()?;
11636            self.expect_keyword(Keyword::TO)?;
11637            let new_enum_value = self.parse_identifier()?;
11638            AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11639                from: existing_enum_value,
11640                to: new_enum_value,
11641            })
11642        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::ATTRIBUTE]) {
11643            let old_name = self.parse_identifier()?;
11644            self.expect_keyword(Keyword::TO)?;
11645            let new_name = self.parse_identifier()?;
11646            let drop_behavior = self.parse_optional_drop_behavior();
11647            AlterTypeOperation::RenameAttribute {
11648                old_name,
11649                new_name,
11650                drop_behavior,
11651            }
11652        } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11653            let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11654            let new_enum_value = self.parse_identifier()?;
11655            let position = if self.parse_keyword(Keyword::BEFORE) {
11656                Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11657            } else if self.parse_keyword(Keyword::AFTER) {
11658                Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11659            } else {
11660                None
11661            };
11662            AlterTypeOperation::AddValue(AlterTypeAddValue {
11663                if_not_exists,
11664                value: new_enum_value,
11665                position,
11666            })
11667        } else if self.parse_keywords(&[Keyword::ADD, Keyword::ATTRIBUTE]) {
11668            let attr_name = self.parse_identifier()?;
11669            let data_type = self.parse_data_type()?;
11670            let collation = if self.parse_keyword(Keyword::COLLATE) {
11671                Some(self.parse_object_name(false)?)
11672            } else {
11673                None
11674            };
11675            let drop_behavior = self.parse_optional_drop_behavior();
11676            AlterTypeOperation::AddAttribute {
11677                name: attr_name,
11678                data_type,
11679                collation,
11680                drop_behavior,
11681            }
11682        } else if self.parse_keywords(&[Keyword::DROP, Keyword::ATTRIBUTE]) {
11683            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11684            let attr_name = self.parse_identifier()?;
11685            let drop_behavior = self.parse_optional_drop_behavior();
11686            AlterTypeOperation::DropAttribute {
11687                if_exists,
11688                name: attr_name,
11689                drop_behavior,
11690            }
11691        } else if self.parse_keywords(&[Keyword::ALTER, Keyword::ATTRIBUTE]) {
11692            let attr_name = self.parse_identifier()?;
11693            // PostgreSQL accepts both `ALTER ATTRIBUTE x TYPE ...` and the
11694            // verbose `ALTER ATTRIBUTE x SET DATA TYPE ...`; consume the
11695            // optional `SET DATA` and canonicalize to the bare form.
11696            let _ = self.parse_keywords(&[Keyword::SET, Keyword::DATA]);
11697            self.expect_keyword(Keyword::TYPE)?;
11698            let data_type = self.parse_data_type()?;
11699            let collation = if self.parse_keyword(Keyword::COLLATE) {
11700                Some(self.parse_object_name(false)?)
11701            } else {
11702                None
11703            };
11704            let drop_behavior = self.parse_optional_drop_behavior();
11705            AlterTypeOperation::AlterAttribute {
11706                name: attr_name,
11707                data_type,
11708                collation,
11709                drop_behavior,
11710            }
11711        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11712            let new_owner = self.parse_owner()?;
11713            AlterTypeOperation::OwnerTo { new_owner }
11714        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11715            let new_schema = self.parse_object_name(false)?;
11716            AlterTypeOperation::SetSchema { new_schema }
11717        } else {
11718            return self.expected_ref(
11719                "{RENAME TO | RENAME VALUE | RENAME ATTRIBUTE | ADD VALUE | \
11720                 ADD ATTRIBUTE | DROP ATTRIBUTE | ALTER ATTRIBUTE | OWNER TO | SET SCHEMA}",
11721                self.peek_token_ref(),
11722            );
11723        };
11724
11725        Ok(Statement::AlterType(AlterType { name, operation }))
11726    }
11727
11728    /// Parse a [Statement::AlterDefaultPrivileges].
11729    ///
11730    /// The leading `ALTER DEFAULT` keyword sequence has already been consumed by
11731    /// [`Self::parse_alter`].
11732    ///
11733    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-alterdefaultprivileges.html)
11734    pub fn parse_alter_default_privileges(
11735        &mut self,
11736    ) -> Result<AlterDefaultPrivileges, ParserError> {
11737        self.expect_keyword(Keyword::PRIVILEGES)?;
11738
11739        let for_roles = if self.parse_keyword(Keyword::FOR) {
11740            // PostgreSQL accepts ROLE or USER as synonyms here.
11741            self.expect_one_of_keywords(&[Keyword::ROLE, Keyword::USER])?;
11742            self.parse_comma_separated(Parser::parse_identifier)?
11743        } else {
11744            Vec::new()
11745        };
11746
11747        let in_schemas = if self.parse_keywords(&[Keyword::IN, Keyword::SCHEMA]) {
11748            self.parse_comma_separated(Parser::parse_identifier)?
11749        } else {
11750            Vec::new()
11751        };
11752
11753        let action = self.parse_alter_default_privileges_action()?;
11754
11755        Ok(AlterDefaultPrivileges {
11756            for_roles,
11757            in_schemas,
11758            action,
11759        })
11760    }
11761
11762    fn parse_alter_default_privileges_action(
11763        &mut self,
11764    ) -> Result<AlterDefaultPrivilegesAction, ParserError> {
11765        let kw = self.expect_one_of_keywords(&[Keyword::GRANT, Keyword::REVOKE])?;
11766        match kw {
11767            Keyword::GRANT => {
11768                let privileges = self.parse_alter_default_privileges_privileges()?;
11769                self.expect_keyword(Keyword::ON)?;
11770                let object_type = self.parse_alter_default_privileges_object_type()?;
11771                self.expect_keyword(Keyword::TO)?;
11772                let grantees = self.parse_grantees()?;
11773                let with_grant_option =
11774                    self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
11775                Ok(AlterDefaultPrivilegesAction::Grant {
11776                    privileges,
11777                    object_type,
11778                    grantees,
11779                    with_grant_option,
11780                })
11781            }
11782            Keyword::REVOKE => {
11783                let grant_option_for =
11784                    self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
11785                let privileges = self.parse_alter_default_privileges_privileges()?;
11786                self.expect_keyword(Keyword::ON)?;
11787                let object_type = self.parse_alter_default_privileges_object_type()?;
11788                self.expect_keyword(Keyword::FROM)?;
11789                let grantees = self.parse_grantees()?;
11790                let cascade = self.parse_cascade_option();
11791                Ok(AlterDefaultPrivilegesAction::Revoke {
11792                    grant_option_for,
11793                    privileges,
11794                    object_type,
11795                    grantees,
11796                    cascade,
11797                })
11798            }
11799            unexpected_keyword => Err(ParserError::ParserError(format!(
11800                "Internal parser error: expected GRANT or REVOKE, got {unexpected_keyword:?}"
11801            ))),
11802        }
11803    }
11804
11805    fn parse_alter_default_privileges_privileges(&mut self) -> Result<Privileges, ParserError> {
11806        if self.parse_keyword(Keyword::ALL) {
11807            Ok(Privileges::All {
11808                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
11809            })
11810        } else {
11811            Ok(Privileges::Actions(self.parse_actions_list()?))
11812        }
11813    }
11814
11815    fn parse_alter_default_privileges_object_type(
11816        &mut self,
11817    ) -> Result<AlterDefaultPrivilegesObjectType, ParserError> {
11818        let kw = self.expect_one_of_keywords(&[
11819            Keyword::TABLES,
11820            Keyword::SEQUENCES,
11821            Keyword::FUNCTIONS,
11822            Keyword::ROUTINES,
11823            Keyword::TYPES,
11824            Keyword::SCHEMAS,
11825        ])?;
11826        match kw {
11827            Keyword::TABLES => Ok(AlterDefaultPrivilegesObjectType::Tables),
11828            Keyword::SEQUENCES => Ok(AlterDefaultPrivilegesObjectType::Sequences),
11829            Keyword::FUNCTIONS => Ok(AlterDefaultPrivilegesObjectType::Functions),
11830            Keyword::ROUTINES => Ok(AlterDefaultPrivilegesObjectType::Routines),
11831            Keyword::TYPES => Ok(AlterDefaultPrivilegesObjectType::Types),
11832            Keyword::SCHEMAS => Ok(AlterDefaultPrivilegesObjectType::Schemas),
11833            unexpected_keyword => Err(ParserError::ParserError(format!(
11834                "Internal parser error: expected one of {{TABLES, SEQUENCES, FUNCTIONS, ROUTINES, TYPES, SCHEMAS}}, got {unexpected_keyword:?}"
11835            ))),
11836        }
11837    }
11838
11839    /// Parse a [Statement::AlterCollation].
11840    ///
11841    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-altercollation.html)
11842    pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11843        let name = self.parse_object_name(false)?;
11844        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11845            AlterCollationOperation::RenameTo {
11846                new_name: self.parse_identifier()?,
11847            }
11848        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11849            AlterCollationOperation::OwnerTo(self.parse_owner()?)
11850        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11851            AlterCollationOperation::SetSchema {
11852                schema_name: self.parse_object_name(false)?,
11853            }
11854        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11855            AlterCollationOperation::RefreshVersion
11856        } else {
11857            return self.expected_ref(
11858                "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11859                self.peek_token_ref(),
11860            );
11861        };
11862
11863        Ok(AlterCollation { name, operation })
11864    }
11865
11866    /// Parse a [Statement::AlterOperator]
11867    ///
11868    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-alteroperator.html)
11869    pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11870        let name = self.parse_operator_name()?;
11871
11872        // Parse (left_type, right_type)
11873        self.expect_token(&Token::LParen)?;
11874
11875        let left_type = if self.parse_keyword(Keyword::NONE) {
11876            None
11877        } else {
11878            Some(self.parse_data_type()?)
11879        };
11880
11881        self.expect_token(&Token::Comma)?;
11882        let right_type = self.parse_data_type()?;
11883        self.expect_token(&Token::RParen)?;
11884
11885        // Parse the operation
11886        let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11887            let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11888                Owner::CurrentRole
11889            } else if self.parse_keyword(Keyword::CURRENT_USER) {
11890                Owner::CurrentUser
11891            } else if self.parse_keyword(Keyword::SESSION_USER) {
11892                Owner::SessionUser
11893            } else {
11894                Owner::Ident(self.parse_identifier()?)
11895            };
11896            AlterOperatorOperation::OwnerTo(owner)
11897        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11898            let schema_name = self.parse_object_name(false)?;
11899            AlterOperatorOperation::SetSchema { schema_name }
11900        } else if self.parse_keyword(Keyword::SET) {
11901            self.expect_token(&Token::LParen)?;
11902
11903            let mut options = Vec::new();
11904            loop {
11905                let keyword = self.expect_one_of_keywords(&[
11906                    Keyword::RESTRICT,
11907                    Keyword::JOIN,
11908                    Keyword::COMMUTATOR,
11909                    Keyword::NEGATOR,
11910                    Keyword::HASHES,
11911                    Keyword::MERGES,
11912                ])?;
11913
11914                match keyword {
11915                    Keyword::RESTRICT => {
11916                        self.expect_token(&Token::Eq)?;
11917                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11918                            None
11919                        } else {
11920                            Some(self.parse_object_name(false)?)
11921                        };
11922                        options.push(OperatorOption::Restrict(proc_name));
11923                    }
11924                    Keyword::JOIN => {
11925                        self.expect_token(&Token::Eq)?;
11926                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11927                            None
11928                        } else {
11929                            Some(self.parse_object_name(false)?)
11930                        };
11931                        options.push(OperatorOption::Join(proc_name));
11932                    }
11933                    Keyword::COMMUTATOR => {
11934                        self.expect_token(&Token::Eq)?;
11935                        let op_name = self.parse_operator_name()?;
11936                        options.push(OperatorOption::Commutator(op_name));
11937                    }
11938                    Keyword::NEGATOR => {
11939                        self.expect_token(&Token::Eq)?;
11940                        let op_name = self.parse_operator_name()?;
11941                        options.push(OperatorOption::Negator(op_name));
11942                    }
11943                    Keyword::HASHES => {
11944                        options.push(OperatorOption::Hashes);
11945                    }
11946                    Keyword::MERGES => {
11947                        options.push(OperatorOption::Merges);
11948                    }
11949                    unexpected_keyword => return Err(ParserError::ParserError(
11950                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11951                    )),
11952                }
11953
11954                if !self.consume_token(&Token::Comma) {
11955                    break;
11956                }
11957            }
11958
11959            self.expect_token(&Token::RParen)?;
11960            AlterOperatorOperation::Set { options }
11961        } else {
11962            return self.expected_ref(
11963                "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11964                self.peek_token_ref(),
11965            );
11966        };
11967
11968        Ok(AlterOperator {
11969            name,
11970            left_type,
11971            right_type,
11972            operation,
11973        })
11974    }
11975
11976    /// Parse an operator item for ALTER OPERATOR FAMILY ADD operations
11977    fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11978        let strategy_number = self.parse_literal_uint()?;
11979        let operator_name = self.parse_operator_name()?;
11980
11981        // Operator argument types (required for ALTER OPERATOR FAMILY)
11982        self.expect_token(&Token::LParen)?;
11983        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11984        self.expect_token(&Token::RParen)?;
11985
11986        // Optional purpose
11987        let purpose = if self.parse_keyword(Keyword::FOR) {
11988            if self.parse_keyword(Keyword::SEARCH) {
11989                Some(OperatorPurpose::ForSearch)
11990            } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11991                let sort_family = self.parse_object_name(false)?;
11992                Some(OperatorPurpose::ForOrderBy { sort_family })
11993            } else {
11994                return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11995            }
11996        } else {
11997            None
11998        };
11999
12000        Ok(OperatorFamilyItem::Operator {
12001            strategy_number,
12002            operator_name,
12003            op_types,
12004            purpose,
12005        })
12006    }
12007
12008    /// Parse a function item for ALTER OPERATOR FAMILY ADD operations
12009    fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
12010        let support_number = self.parse_literal_uint()?;
12011
12012        // Optional operator types
12013        let op_types =
12014            if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
12015                let types = self.parse_comma_separated(Parser::parse_data_type)?;
12016                self.expect_token(&Token::RParen)?;
12017                Some(types)
12018            } else if self.consume_token(&Token::LParen) {
12019                self.expect_token(&Token::RParen)?;
12020                Some(vec![])
12021            } else {
12022                None
12023            };
12024
12025        let function_name = self.parse_object_name(false)?;
12026
12027        // Function argument types
12028        let argument_types = if self.consume_token(&Token::LParen) {
12029            if self.peek_token_ref().token == Token::RParen {
12030                self.expect_token(&Token::RParen)?;
12031                vec![]
12032            } else {
12033                let types = self.parse_comma_separated(Parser::parse_data_type)?;
12034                self.expect_token(&Token::RParen)?;
12035                types
12036            }
12037        } else {
12038            vec![]
12039        };
12040
12041        Ok(OperatorFamilyItem::Function {
12042            support_number,
12043            op_types,
12044            function_name,
12045            argument_types,
12046        })
12047    }
12048
12049    /// Parse an operator item for ALTER OPERATOR FAMILY DROP operations
12050    fn parse_operator_family_drop_operator(
12051        &mut self,
12052    ) -> Result<OperatorFamilyDropItem, ParserError> {
12053        let strategy_number = self.parse_literal_uint()?;
12054
12055        // Operator argument types (required for DROP)
12056        self.expect_token(&Token::LParen)?;
12057        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
12058        self.expect_token(&Token::RParen)?;
12059
12060        Ok(OperatorFamilyDropItem::Operator {
12061            strategy_number,
12062            op_types,
12063        })
12064    }
12065
12066    /// Parse a function item for ALTER OPERATOR FAMILY DROP operations
12067    fn parse_operator_family_drop_function(
12068        &mut self,
12069    ) -> Result<OperatorFamilyDropItem, ParserError> {
12070        let support_number = self.parse_literal_uint()?;
12071
12072        // Operator types (required for DROP)
12073        self.expect_token(&Token::LParen)?;
12074        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
12075        self.expect_token(&Token::RParen)?;
12076
12077        Ok(OperatorFamilyDropItem::Function {
12078            support_number,
12079            op_types,
12080        })
12081    }
12082
12083    /// Parse an operator family item for ADD operations (dispatches to operator or function parsing)
12084    fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
12085        if self.parse_keyword(Keyword::OPERATOR) {
12086            self.parse_operator_family_add_operator()
12087        } else if self.parse_keyword(Keyword::FUNCTION) {
12088            self.parse_operator_family_add_function()
12089        } else {
12090            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
12091        }
12092    }
12093
12094    /// Parse an operator family item for DROP operations (dispatches to operator or function parsing)
12095    fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
12096        if self.parse_keyword(Keyword::OPERATOR) {
12097            self.parse_operator_family_drop_operator()
12098        } else if self.parse_keyword(Keyword::FUNCTION) {
12099            self.parse_operator_family_drop_function()
12100        } else {
12101            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
12102        }
12103    }
12104
12105    /// Parse a [Statement::AlterOperatorFamily]
12106    /// See <https://www.postgresql.org/docs/current/sql-alteropfamily.html>
12107    pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
12108        let name = self.parse_object_name(false)?;
12109        self.expect_keyword(Keyword::USING)?;
12110        let using = self.parse_identifier()?;
12111
12112        let operation = if self.parse_keyword(Keyword::ADD) {
12113            let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
12114            AlterOperatorFamilyOperation::Add { items }
12115        } else if self.parse_keyword(Keyword::DROP) {
12116            let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
12117            AlterOperatorFamilyOperation::Drop { items }
12118        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
12119            let new_name = self.parse_object_name(false)?;
12120            AlterOperatorFamilyOperation::RenameTo { new_name }
12121        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
12122            let owner = self.parse_owner()?;
12123            AlterOperatorFamilyOperation::OwnerTo(owner)
12124        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
12125            let schema_name = self.parse_object_name(false)?;
12126            AlterOperatorFamilyOperation::SetSchema { schema_name }
12127        } else {
12128            return self.expected_ref(
12129                "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
12130                self.peek_token_ref(),
12131            );
12132        };
12133
12134        Ok(AlterOperatorFamily {
12135            name,
12136            using,
12137            operation,
12138        })
12139    }
12140
12141    /// Parse an `ALTER OPERATOR CLASS` statement.
12142    ///
12143    /// Handles operations like `RENAME TO`, `OWNER TO`, and `SET SCHEMA`.
12144    pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
12145        let name = self.parse_object_name(false)?;
12146        self.expect_keyword(Keyword::USING)?;
12147        let using = self.parse_identifier()?;
12148
12149        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
12150            let new_name = self.parse_object_name(false)?;
12151            AlterOperatorClassOperation::RenameTo { new_name }
12152        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
12153            let owner = self.parse_owner()?;
12154            AlterOperatorClassOperation::OwnerTo(owner)
12155        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
12156            let schema_name = self.parse_object_name(false)?;
12157            AlterOperatorClassOperation::SetSchema { schema_name }
12158        } else {
12159            return self.expected_ref(
12160                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
12161                self.peek_token_ref(),
12162            );
12163        };
12164
12165        Ok(AlterOperatorClass {
12166            name,
12167            using,
12168            operation,
12169        })
12170    }
12171
12172    /// Parse an `ALTER SCHEMA` statement.
12173    ///
12174    /// Supports operations such as setting options, renaming, adding/dropping replicas, and changing owner.
12175    pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
12176        self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
12177        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
12178        let name = self.parse_object_name(false)?;
12179        let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
12180            self.prev_token();
12181            let options = self.parse_options(Keyword::OPTIONS)?;
12182            AlterSchemaOperation::SetOptionsParens { options }
12183        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
12184            let collate = self.parse_expr()?;
12185            AlterSchemaOperation::SetDefaultCollate { collate }
12186        } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
12187            let replica = self.parse_identifier()?;
12188            let options = if self.peek_keyword(Keyword::OPTIONS) {
12189                Some(self.parse_options(Keyword::OPTIONS)?)
12190            } else {
12191                None
12192            };
12193            AlterSchemaOperation::AddReplica { replica, options }
12194        } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
12195            let replica = self.parse_identifier()?;
12196            AlterSchemaOperation::DropReplica { replica }
12197        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
12198            let new_name = self.parse_object_name(false)?;
12199            AlterSchemaOperation::Rename { name: new_name }
12200        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
12201            let owner = self.parse_owner()?;
12202            AlterSchemaOperation::OwnerTo { owner }
12203        } else {
12204            return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
12205        };
12206        Ok(Statement::AlterSchema(AlterSchema {
12207            name,
12208            if_exists,
12209            operations: vec![operation],
12210        }))
12211    }
12212
12213    /// Parse a `CALL procedure_name(arg1, arg2, ...)`
12214    /// or `CALL procedure_name` statement
12215    pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
12216        let object_name = self.parse_object_name(false)?;
12217        if self.peek_token_ref().token == Token::LParen {
12218            match self.parse_function(object_name)? {
12219                Expr::Function(f) => Ok(Statement::Call(f)),
12220                other => parser_err!(
12221                    format!("Expected a simple procedure call but found: {other}"),
12222                    self.peek_token_ref().span.start
12223                ),
12224            }
12225        } else {
12226            Ok(Statement::Call(Function {
12227                name: object_name,
12228                uses_odbc_syntax: false,
12229                parameters: FunctionArguments::None,
12230                args: FunctionArguments::None,
12231                over: None,
12232                filter: None,
12233                null_treatment: None,
12234                within_group: vec![],
12235            }))
12236        }
12237    }
12238
12239    /// Parse a copy statement
12240    pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
12241        let source;
12242        if self.consume_token(&Token::LParen) {
12243            source = CopySource::Query(self.parse_query()?);
12244            self.expect_token(&Token::RParen)?;
12245        } else {
12246            let table_name = self.parse_object_name(false)?;
12247            let columns = self.parse_parenthesized_column_list(Optional, false)?;
12248            source = CopySource::Table {
12249                table_name,
12250                columns,
12251            };
12252        }
12253        let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
12254            Some(Keyword::FROM) => false,
12255            Some(Keyword::TO) => true,
12256            _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
12257        };
12258        if !to {
12259            // Use a separate if statement to prevent Rust compiler from complaining about
12260            // "if statement in this position is unstable: https://github.com/rust-lang/rust/issues/53667"
12261            if let CopySource::Query(_) = source {
12262                return Err(ParserError::ParserError(
12263                    "COPY ... FROM does not support query as a source".to_string(),
12264                ));
12265            }
12266        }
12267        let target = if self.parse_keyword(Keyword::STDIN) {
12268            CopyTarget::Stdin
12269        } else if self.parse_keyword(Keyword::STDOUT) {
12270            CopyTarget::Stdout
12271        } else if self.parse_keyword(Keyword::PROGRAM) {
12272            CopyTarget::Program {
12273                command: self.parse_literal_string()?,
12274            }
12275        } else {
12276            CopyTarget::File {
12277                filename: self.parse_literal_string()?,
12278            }
12279        };
12280        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
12281        let mut options = vec![];
12282        if self.consume_token(&Token::LParen) {
12283            options = self.parse_comma_separated(Parser::parse_copy_option)?;
12284            self.expect_token(&Token::RParen)?;
12285        }
12286        let mut legacy_options = vec![];
12287        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
12288            legacy_options.push(opt);
12289        }
12290        let values =
12291            if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
12292                self.expect_token(&Token::SemiColon)?;
12293                self.parse_tsv()
12294            } else {
12295                vec![]
12296            };
12297        Ok(Statement::Copy {
12298            source,
12299            to,
12300            target,
12301            options,
12302            legacy_options,
12303            values,
12304        })
12305    }
12306
12307    /// Parse [Statement::Open]
12308    fn parse_open(&mut self) -> Result<Statement, ParserError> {
12309        self.expect_keyword(Keyword::OPEN)?;
12310        Ok(Statement::Open(OpenStatement {
12311            cursor_name: self.parse_identifier()?,
12312        }))
12313    }
12314
12315    /// Parse a `CLOSE` cursor statement.
12316    pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
12317        let cursor = if self.parse_keyword(Keyword::ALL) {
12318            CloseCursor::All
12319        } else {
12320            let name = self.parse_identifier()?;
12321
12322            CloseCursor::Specific { name }
12323        };
12324
12325        Ok(Statement::Close { cursor })
12326    }
12327
12328    fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
12329        let ret = match self.parse_one_of_keywords(&[
12330            Keyword::FORMAT,
12331            Keyword::FREEZE,
12332            Keyword::DELIMITER,
12333            Keyword::NULL,
12334            Keyword::HEADER,
12335            Keyword::QUOTE,
12336            Keyword::ESCAPE,
12337            Keyword::FORCE_QUOTE,
12338            Keyword::FORCE_NOT_NULL,
12339            Keyword::FORCE_NULL,
12340            Keyword::ENCODING,
12341        ]) {
12342            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
12343            Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
12344                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12345                Some(Keyword::FALSE)
12346            )),
12347            Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
12348            Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
12349            Some(Keyword::HEADER) => CopyOption::Header(!matches!(
12350                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12351                Some(Keyword::FALSE)
12352            )),
12353            Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
12354            Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
12355            Some(Keyword::FORCE_QUOTE) => {
12356                CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
12357            }
12358            Some(Keyword::FORCE_NOT_NULL) => {
12359                CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12360            }
12361            Some(Keyword::FORCE_NULL) => {
12362                CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12363            }
12364            Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
12365            _ => self.expected_ref("option", self.peek_token_ref())?,
12366        };
12367        Ok(ret)
12368    }
12369
12370    fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
12371        // FORMAT \[ AS \] is optional
12372        if self.parse_keyword(Keyword::FORMAT) {
12373            let _ = self.parse_keyword(Keyword::AS);
12374        }
12375
12376        let ret = match self.parse_one_of_keywords(&[
12377            Keyword::ACCEPTANYDATE,
12378            Keyword::ACCEPTINVCHARS,
12379            Keyword::ADDQUOTES,
12380            Keyword::ALLOWOVERWRITE,
12381            Keyword::BINARY,
12382            Keyword::BLANKSASNULL,
12383            Keyword::BZIP2,
12384            Keyword::CLEANPATH,
12385            Keyword::COMPUPDATE,
12386            Keyword::CREDENTIALS,
12387            Keyword::CSV,
12388            Keyword::DATEFORMAT,
12389            Keyword::DELIMITER,
12390            Keyword::EMPTYASNULL,
12391            Keyword::ENCRYPTED,
12392            Keyword::ESCAPE,
12393            Keyword::EXTENSION,
12394            Keyword::FIXEDWIDTH,
12395            Keyword::GZIP,
12396            Keyword::HEADER,
12397            Keyword::IAM_ROLE,
12398            Keyword::IGNOREHEADER,
12399            Keyword::JSON,
12400            Keyword::MANIFEST,
12401            Keyword::MAXFILESIZE,
12402            Keyword::NULL,
12403            Keyword::PARALLEL,
12404            Keyword::PARQUET,
12405            Keyword::PARTITION,
12406            Keyword::REGION,
12407            Keyword::REMOVEQUOTES,
12408            Keyword::ROWGROUPSIZE,
12409            Keyword::STATUPDATE,
12410            Keyword::TIMEFORMAT,
12411            Keyword::TRUNCATECOLUMNS,
12412            Keyword::ZSTD,
12413        ]) {
12414            Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
12415            Some(Keyword::ACCEPTINVCHARS) => {
12416                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12417                let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12418                    Some(self.parse_literal_string()?)
12419                } else {
12420                    None
12421                };
12422                CopyLegacyOption::AcceptInvChars(ch)
12423            }
12424            Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
12425            Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
12426            Some(Keyword::BINARY) => CopyLegacyOption::Binary,
12427            Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
12428            Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
12429            Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
12430            Some(Keyword::COMPUPDATE) => {
12431                let preset = self.parse_keyword(Keyword::PRESET);
12432                let enabled = match self.parse_one_of_keywords(&[
12433                    Keyword::TRUE,
12434                    Keyword::FALSE,
12435                    Keyword::ON,
12436                    Keyword::OFF,
12437                ]) {
12438                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12439                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12440                    _ => None,
12441                };
12442                CopyLegacyOption::CompUpdate { preset, enabled }
12443            }
12444            Some(Keyword::CREDENTIALS) => {
12445                CopyLegacyOption::Credentials(self.parse_literal_string()?)
12446            }
12447            Some(Keyword::CSV) => CopyLegacyOption::Csv({
12448                let mut opts = vec![];
12449                while let Some(opt) =
12450                    self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
12451                {
12452                    opts.push(opt);
12453                }
12454                opts
12455            }),
12456            Some(Keyword::DATEFORMAT) => {
12457                let _ = self.parse_keyword(Keyword::AS);
12458                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12459                    Some(self.parse_literal_string()?)
12460                } else {
12461                    None
12462                };
12463                CopyLegacyOption::DateFormat(fmt)
12464            }
12465            Some(Keyword::DELIMITER) => {
12466                let _ = self.parse_keyword(Keyword::AS);
12467                CopyLegacyOption::Delimiter(self.parse_literal_char()?)
12468            }
12469            Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
12470            Some(Keyword::ENCRYPTED) => {
12471                let auto = self.parse_keyword(Keyword::AUTO);
12472                CopyLegacyOption::Encrypted { auto }
12473            }
12474            Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
12475            Some(Keyword::EXTENSION) => {
12476                let ext = self.parse_literal_string()?;
12477                CopyLegacyOption::Extension(ext)
12478            }
12479            Some(Keyword::FIXEDWIDTH) => {
12480                let spec = self.parse_literal_string()?;
12481                CopyLegacyOption::FixedWidth(spec)
12482            }
12483            Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
12484            Some(Keyword::HEADER) => CopyLegacyOption::Header,
12485            Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
12486            Some(Keyword::IGNOREHEADER) => {
12487                let _ = self.parse_keyword(Keyword::AS);
12488                let num_rows = self.parse_literal_uint()?;
12489                CopyLegacyOption::IgnoreHeader(num_rows)
12490            }
12491            Some(Keyword::JSON) => {
12492                let _ = self.parse_keyword(Keyword::AS);
12493                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12494                    Some(self.parse_literal_string()?)
12495                } else {
12496                    None
12497                };
12498                CopyLegacyOption::Json(fmt)
12499            }
12500            Some(Keyword::MANIFEST) => {
12501                let verbose = self.parse_keyword(Keyword::VERBOSE);
12502                CopyLegacyOption::Manifest { verbose }
12503            }
12504            Some(Keyword::MAXFILESIZE) => {
12505                let _ = self.parse_keyword(Keyword::AS);
12506                let size = self.parse_number_value()?;
12507                let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12508                    Some(Keyword::MB) => Some(FileSizeUnit::MB),
12509                    Some(Keyword::GB) => Some(FileSizeUnit::GB),
12510                    _ => None,
12511                };
12512                CopyLegacyOption::MaxFileSize(FileSize { size, unit })
12513            }
12514            Some(Keyword::NULL) => {
12515                let _ = self.parse_keyword(Keyword::AS);
12516                CopyLegacyOption::Null(self.parse_literal_string()?)
12517            }
12518            Some(Keyword::PARALLEL) => {
12519                let enabled = match self.parse_one_of_keywords(&[
12520                    Keyword::TRUE,
12521                    Keyword::FALSE,
12522                    Keyword::ON,
12523                    Keyword::OFF,
12524                ]) {
12525                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12526                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12527                    _ => None,
12528                };
12529                CopyLegacyOption::Parallel(enabled)
12530            }
12531            Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
12532            Some(Keyword::PARTITION) => {
12533                self.expect_keyword(Keyword::BY)?;
12534                let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
12535                let include = self.parse_keyword(Keyword::INCLUDE);
12536                CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
12537            }
12538            Some(Keyword::REGION) => {
12539                let _ = self.parse_keyword(Keyword::AS);
12540                let region = self.parse_literal_string()?;
12541                CopyLegacyOption::Region(region)
12542            }
12543            Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
12544            Some(Keyword::ROWGROUPSIZE) => {
12545                let _ = self.parse_keyword(Keyword::AS);
12546                let file_size = self.parse_file_size()?;
12547                CopyLegacyOption::RowGroupSize(file_size)
12548            }
12549            Some(Keyword::STATUPDATE) => {
12550                let enabled = match self.parse_one_of_keywords(&[
12551                    Keyword::TRUE,
12552                    Keyword::FALSE,
12553                    Keyword::ON,
12554                    Keyword::OFF,
12555                ]) {
12556                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12557                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12558                    _ => None,
12559                };
12560                CopyLegacyOption::StatUpdate(enabled)
12561            }
12562            Some(Keyword::TIMEFORMAT) => {
12563                let _ = self.parse_keyword(Keyword::AS);
12564                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12565                    Some(self.parse_literal_string()?)
12566                } else {
12567                    None
12568                };
12569                CopyLegacyOption::TimeFormat(fmt)
12570            }
12571            Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
12572            Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
12573            _ => self.expected_ref("option", self.peek_token_ref())?,
12574        };
12575        Ok(ret)
12576    }
12577
12578    fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
12579        let size = self.parse_number_value()?;
12580        let unit = self.maybe_parse_file_size_unit();
12581        Ok(FileSize { size, unit })
12582    }
12583
12584    fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
12585        match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12586            Some(Keyword::MB) => Some(FileSizeUnit::MB),
12587            Some(Keyword::GB) => Some(FileSizeUnit::GB),
12588            _ => None,
12589        }
12590    }
12591
12592    fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12593        if self.parse_keyword(Keyword::DEFAULT) {
12594            Ok(IamRoleKind::Default)
12595        } else {
12596            let arn = self.parse_literal_string()?;
12597            Ok(IamRoleKind::Arn(arn))
12598        }
12599    }
12600
12601    fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12602        let ret = match self.parse_one_of_keywords(&[
12603            Keyword::HEADER,
12604            Keyword::QUOTE,
12605            Keyword::ESCAPE,
12606            Keyword::FORCE,
12607        ]) {
12608            Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12609            Some(Keyword::QUOTE) => {
12610                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12611                CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12612            }
12613            Some(Keyword::ESCAPE) => {
12614                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12615                CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12616            }
12617            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12618                CopyLegacyCsvOption::ForceNotNull(
12619                    self.parse_comma_separated(|p| p.parse_identifier())?,
12620                )
12621            }
12622            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12623                CopyLegacyCsvOption::ForceQuote(
12624                    self.parse_comma_separated(|p| p.parse_identifier())?,
12625                )
12626            }
12627            _ => self.expected_ref("csv option", self.peek_token_ref())?,
12628        };
12629        Ok(ret)
12630    }
12631
12632    fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12633        let s = self.parse_literal_string()?;
12634        if s.len() != 1 {
12635            let loc = self
12636                .tokens
12637                .get(self.index - 1)
12638                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12639            return parser_err!(format!("Expect a char, found {s:?}"), loc);
12640        }
12641        Ok(s.chars().next().unwrap())
12642    }
12643
12644    /// Parse a tab separated values in
12645    /// COPY payload
12646    pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12647        self.parse_tab_value()
12648    }
12649
12650    /// Parse a single tab-separated value row used by `COPY` payload parsing.
12651    pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12652        let mut values = vec![];
12653        let mut content = String::new();
12654        while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12655            match t {
12656                Token::Whitespace(Whitespace::Tab) => {
12657                    values.push(Some(core::mem::take(&mut content)));
12658                }
12659                Token::Whitespace(Whitespace::Newline) => {
12660                    values.push(Some(core::mem::take(&mut content)));
12661                }
12662                Token::Backslash => {
12663                    if self.consume_token(&Token::Period) {
12664                        return values;
12665                    }
12666                    if let Token::Word(w) = self.next_token().token {
12667                        if w.value == "N" {
12668                            values.push(None);
12669                        }
12670                    }
12671                }
12672                _ => {
12673                    content.push_str(&t.to_string());
12674                }
12675            }
12676        }
12677        values
12678    }
12679
12680    /// Parse a literal value (numbers, strings, date/time, booleans)
12681    pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12682        let next_token = self.next_token();
12683        let span = next_token.span;
12684        let ok_value = |value: Value| Ok(value.with_span(span));
12685        match next_token.token {
12686            Token::Word(w) => match w.keyword {
12687                Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12688                    ok_value(Value::Boolean(true))
12689                }
12690                Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12691                    ok_value(Value::Boolean(false))
12692                }
12693                Keyword::NULL => ok_value(Value::Null),
12694                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12695                    Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12696                    Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12697                    _ => self.expected(
12698                        "A value?",
12699                        TokenWithSpan {
12700                            token: Token::Word(w),
12701                            span,
12702                        },
12703                    )?,
12704                },
12705                _ => self.expected(
12706                    "a concrete value",
12707                    TokenWithSpan {
12708                        token: Token::Word(w),
12709                        span,
12710                    },
12711                ),
12712            },
12713            // The call to n.parse() returns a bigdecimal when the
12714            // bigdecimal feature is enabled, and is otherwise a no-op
12715            // (i.e., it returns the input string).
12716            Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12717            Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12718                self.maybe_concat_string_literal(s.to_string()),
12719            )),
12720            Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12721                self.maybe_concat_string_literal(s.to_string()),
12722            )),
12723            Token::TripleSingleQuotedString(ref s) => {
12724                ok_value(Value::TripleSingleQuotedString(s.to_string()))
12725            }
12726            Token::TripleDoubleQuotedString(ref s) => {
12727                ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12728            }
12729            Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12730            Token::SingleQuotedByteStringLiteral(ref s) => {
12731                ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12732            }
12733            Token::DoubleQuotedByteStringLiteral(ref s) => {
12734                ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12735            }
12736            Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12737                ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12738            }
12739            Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12740                ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12741            }
12742            Token::SingleQuotedRawStringLiteral(ref s) => {
12743                ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12744            }
12745            Token::DoubleQuotedRawStringLiteral(ref s) => {
12746                ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12747            }
12748            Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12749                ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12750            }
12751            Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12752                ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12753            }
12754            Token::NationalStringLiteral(ref s) => {
12755                ok_value(Value::NationalStringLiteral(s.to_string()))
12756            }
12757            Token::QuoteDelimitedStringLiteral(v) => {
12758                ok_value(Value::QuoteDelimitedStringLiteral(v))
12759            }
12760            Token::NationalQuoteDelimitedStringLiteral(v) => {
12761                ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12762            }
12763            Token::EscapedStringLiteral(ref s) => {
12764                ok_value(Value::EscapedStringLiteral(s.to_string()))
12765            }
12766            Token::UnicodeStringLiteral(ref s) => {
12767                ok_value(Value::UnicodeStringLiteral(s.to_string()))
12768            }
12769            Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12770            Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12771            tok @ Token::Colon | tok @ Token::AtSign => {
12772                // 1. Not calling self.parse_identifier(false)?
12773                //    because only in placeholder we want to check
12774                //    numbers as idfentifies.  This because snowflake
12775                //    allows numbers as placeholders
12776                // 2. Not calling self.next_token() to enforce `tok`
12777                //    be followed immediately by a word/number, ie.
12778                //    without any whitespace in between
12779                let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12780                let ident = match next_token.token {
12781                    Token::Word(w) => Ok(w.into_ident(next_token.span)),
12782                    Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12783                    _ => self.expected("placeholder", next_token),
12784                }?;
12785                Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12786                    .with_span(Span::new(span.start, ident.span.end)))
12787            }
12788            unexpected => self.expected(
12789                "a value",
12790                TokenWithSpan {
12791                    token: unexpected,
12792                    span,
12793                },
12794            ),
12795        }
12796    }
12797
12798    fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12799        if self.dialect.supports_string_literal_concatenation() {
12800            while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12801                self.peek_token_ref().token
12802            {
12803                str.push_str(s);
12804                self.advance_token();
12805            }
12806        } else if self
12807            .dialect
12808            .supports_string_literal_concatenation_with_newline()
12809        {
12810            // We are iterating over tokens including whitespaces, to identify
12811            // string literals separated by newlines so we can concatenate them.
12812            let mut after_newline = false;
12813            loop {
12814                match self.peek_token_no_skip().token {
12815                    Token::Whitespace(Whitespace::Newline) => {
12816                        after_newline = true;
12817                        self.next_token_no_skip();
12818                    }
12819                    Token::Whitespace(_) => {
12820                        self.next_token_no_skip();
12821                    }
12822                    Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12823                        if after_newline =>
12824                    {
12825                        str.push_str(s.clone().as_str());
12826                        self.next_token_no_skip();
12827                        after_newline = false;
12828                    }
12829                    _ => break,
12830                }
12831            }
12832        }
12833
12834        str
12835    }
12836
12837    /// Parse an unsigned numeric literal
12838    pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12839        let value_wrapper = self.parse_value()?;
12840        match &value_wrapper.value {
12841            Value::Number(_, _) => Ok(value_wrapper),
12842            Value::Placeholder(_) => Ok(value_wrapper),
12843            _ => {
12844                self.prev_token();
12845                self.expected_ref("literal number", self.peek_token_ref())
12846            }
12847        }
12848    }
12849
12850    /// Parse a numeric literal as an expression. Returns a [`Expr::UnaryOp`] if the number is signed,
12851    /// otherwise returns a [`Expr::Value`]
12852    pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12853        let next_token = self.next_token();
12854        match next_token.token {
12855            Token::Plus => Ok(Expr::UnaryOp {
12856                op: UnaryOperator::Plus,
12857                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12858            }),
12859            Token::Minus => Ok(Expr::UnaryOp {
12860                op: UnaryOperator::Minus,
12861                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12862            }),
12863            _ => {
12864                self.prev_token();
12865                Ok(Expr::Value(self.parse_number_value()?))
12866            }
12867        }
12868    }
12869
12870    fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12871        let next_token = self.next_token();
12872        let span = next_token.span;
12873        match next_token.token {
12874            Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12875                Value::SingleQuotedString(s.to_string()).with_span(span),
12876            )),
12877            Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12878                Value::DoubleQuotedString(s.to_string()).with_span(span),
12879            )),
12880            Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12881                Value::HexStringLiteral(s.to_string()).with_span(span),
12882            )),
12883            unexpected => self.expected(
12884                "a string value",
12885                TokenWithSpan {
12886                    token: unexpected,
12887                    span,
12888                },
12889            ),
12890        }
12891    }
12892
12893    /// Parse an unsigned literal integer/long
12894    pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12895        let next_token = self.next_token();
12896        match next_token.token {
12897            Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12898            _ => self.expected("literal int", next_token),
12899        }
12900    }
12901
12902    /// Parse the body of a `CREATE FUNCTION` specified as a string.
12903    /// e.g. `CREATE FUNCTION ... AS $$ body $$`.
12904    fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12905        let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12906            let peek_token = parser.peek_token();
12907            let span = peek_token.span;
12908            match peek_token.token {
12909                Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12910                {
12911                    parser.next_token();
12912                    Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12913                }
12914                _ => Ok(Expr::Value(
12915                    Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12916                )),
12917            }
12918        };
12919
12920        Ok(CreateFunctionBody::AsBeforeOptions {
12921            body: parse_string_expr(self)?,
12922            link_symbol: if self.consume_token(&Token::Comma) {
12923                Some(parse_string_expr(self)?)
12924            } else {
12925                None
12926            },
12927        })
12928    }
12929
12930    /// Parse a literal string
12931    pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12932        let next_token = self.next_token();
12933        match next_token.token {
12934            Token::Word(Word {
12935                value,
12936                keyword: Keyword::NoKeyword,
12937                ..
12938            }) => Ok(value),
12939            Token::SingleQuotedString(s) => Ok(s),
12940            Token::DoubleQuotedString(s) => Ok(s),
12941            Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12942                Ok(s)
12943            }
12944            Token::UnicodeStringLiteral(s) => Ok(s),
12945            Token::DollarQuotedString(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12946                Ok(s.value)
12947            }
12948            _ => self.expected("literal string", next_token),
12949        }
12950    }
12951
12952    /// Parse a boolean string
12953    pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12954        match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12955            Some(Keyword::TRUE) => Ok(true),
12956            Some(Keyword::FALSE) => Ok(false),
12957            _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12958        }
12959    }
12960
12961    /// Parse a literal unicode normalization clause
12962    pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12963        let neg = self.parse_keyword(Keyword::NOT);
12964        let normalized_form = self.maybe_parse(|parser| {
12965            match parser.parse_one_of_keywords(&[
12966                Keyword::NFC,
12967                Keyword::NFD,
12968                Keyword::NFKC,
12969                Keyword::NFKD,
12970            ]) {
12971                Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12972                Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12973                Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12974                Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12975                _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12976            }
12977        })?;
12978        if self.parse_keyword(Keyword::NORMALIZED) {
12979            return Ok(Expr::IsNormalized {
12980                expr: Box::new(expr),
12981                form: normalized_form,
12982                negated: neg,
12983            });
12984        }
12985        self.expected_ref("unicode normalization form", self.peek_token_ref())
12986    }
12987
12988    /// Parse parenthesized enum members, used with `ENUM(...)` type definitions.
12989    pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12990        self.expect_token(&Token::LParen)?;
12991        let values = self.parse_comma_separated(|parser| {
12992            let name = parser.parse_literal_string()?;
12993            let e = if parser.consume_token(&Token::Eq) {
12994                let value = parser.parse_number()?;
12995                EnumMember::NamedValue(name, value)
12996            } else {
12997                EnumMember::Name(name)
12998            };
12999            Ok(e)
13000        })?;
13001        self.expect_token(&Token::RParen)?;
13002
13003        Ok(values)
13004    }
13005
13006    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
13007    pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
13008        let (ty, trailing_bracket) = self.parse_data_type_helper()?;
13009        if trailing_bracket.0 {
13010            return parser_err!(
13011                format!("unmatched > after parsing data type {ty}"),
13012                self.peek_token_ref()
13013            );
13014        }
13015
13016        Ok(ty)
13017    }
13018
13019    fn parse_data_type_helper(
13020        &mut self,
13021    ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
13022        let dialect = self.dialect;
13023        self.advance_token();
13024        let next_token = self.get_current_token();
13025        let next_token_index = self.get_current_index();
13026
13027        let mut trailing_bracket: MatchedTrailingBracket = false.into();
13028        let mut data = match &next_token.token {
13029            Token::Word(w) => match w.keyword {
13030                Keyword::BOOLEAN => Ok(DataType::Boolean),
13031                Keyword::BOOL => Ok(DataType::Bool),
13032                Keyword::FLOAT => {
13033                    let precision = self.parse_exact_number_optional_precision_scale()?;
13034
13035                    if self.parse_keyword(Keyword::UNSIGNED) {
13036                        Ok(DataType::FloatUnsigned(precision))
13037                    } else {
13038                        Ok(DataType::Float(precision))
13039                    }
13040                }
13041                Keyword::REAL => {
13042                    if self.parse_keyword(Keyword::UNSIGNED) {
13043                        Ok(DataType::RealUnsigned)
13044                    } else {
13045                        Ok(DataType::Real)
13046                    }
13047                }
13048                Keyword::FLOAT4 => Ok(DataType::Float4),
13049                Keyword::FLOAT32 => Ok(DataType::Float32),
13050                Keyword::FLOAT64 => Ok(DataType::Float64),
13051                Keyword::FLOAT8 => Ok(DataType::Float8),
13052                Keyword::DOUBLE => {
13053                    if self.parse_keyword(Keyword::PRECISION) {
13054                        if self.parse_keyword(Keyword::UNSIGNED) {
13055                            Ok(DataType::DoublePrecisionUnsigned)
13056                        } else {
13057                            Ok(DataType::DoublePrecision)
13058                        }
13059                    } else {
13060                        let precision = self.parse_exact_number_optional_precision_scale()?;
13061
13062                        if self.parse_keyword(Keyword::UNSIGNED) {
13063                            Ok(DataType::DoubleUnsigned(precision))
13064                        } else {
13065                            Ok(DataType::Double(precision))
13066                        }
13067                    }
13068                }
13069                Keyword::TINYINT => {
13070                    let optional_precision = self.parse_optional_precision();
13071                    if self.parse_keyword(Keyword::UNSIGNED) {
13072                        Ok(DataType::TinyIntUnsigned(optional_precision?))
13073                    } else {
13074                        if dialect.supports_data_type_signed_suffix() {
13075                            let _ = self.parse_keyword(Keyword::SIGNED);
13076                        }
13077                        Ok(DataType::TinyInt(optional_precision?))
13078                    }
13079                }
13080                Keyword::INT2 => {
13081                    let optional_precision = self.parse_optional_precision();
13082                    if self.parse_keyword(Keyword::UNSIGNED) {
13083                        Ok(DataType::Int2Unsigned(optional_precision?))
13084                    } else {
13085                        Ok(DataType::Int2(optional_precision?))
13086                    }
13087                }
13088                Keyword::SMALLINT => {
13089                    let optional_precision = self.parse_optional_precision();
13090                    if self.parse_keyword(Keyword::UNSIGNED) {
13091                        Ok(DataType::SmallIntUnsigned(optional_precision?))
13092                    } else {
13093                        if dialect.supports_data_type_signed_suffix() {
13094                            let _ = self.parse_keyword(Keyword::SIGNED);
13095                        }
13096                        Ok(DataType::SmallInt(optional_precision?))
13097                    }
13098                }
13099                Keyword::MEDIUMINT => {
13100                    let optional_precision = self.parse_optional_precision();
13101                    if self.parse_keyword(Keyword::UNSIGNED) {
13102                        Ok(DataType::MediumIntUnsigned(optional_precision?))
13103                    } else {
13104                        if dialect.supports_data_type_signed_suffix() {
13105                            let _ = self.parse_keyword(Keyword::SIGNED);
13106                        }
13107                        Ok(DataType::MediumInt(optional_precision?))
13108                    }
13109                }
13110                Keyword::INT => {
13111                    let optional_precision = self.parse_optional_precision();
13112                    if self.parse_keyword(Keyword::UNSIGNED) {
13113                        Ok(DataType::IntUnsigned(optional_precision?))
13114                    } else {
13115                        if dialect.supports_data_type_signed_suffix() {
13116                            let _ = self.parse_keyword(Keyword::SIGNED);
13117                        }
13118                        Ok(DataType::Int(optional_precision?))
13119                    }
13120                }
13121                Keyword::INT4 => {
13122                    let optional_precision = self.parse_optional_precision();
13123                    if self.parse_keyword(Keyword::UNSIGNED) {
13124                        Ok(DataType::Int4Unsigned(optional_precision?))
13125                    } else {
13126                        Ok(DataType::Int4(optional_precision?))
13127                    }
13128                }
13129                Keyword::INT8 => {
13130                    let optional_precision = self.parse_optional_precision();
13131                    if self.parse_keyword(Keyword::UNSIGNED) {
13132                        Ok(DataType::Int8Unsigned(optional_precision?))
13133                    } else {
13134                        Ok(DataType::Int8(optional_precision?))
13135                    }
13136                }
13137                Keyword::INT16 => Ok(DataType::Int16),
13138                Keyword::INT32 => Ok(DataType::Int32),
13139                Keyword::INT64 => Ok(DataType::Int64),
13140                Keyword::INT128 => Ok(DataType::Int128),
13141                Keyword::INT256 => Ok(DataType::Int256),
13142                Keyword::INTEGER => {
13143                    let optional_precision = self.parse_optional_precision();
13144                    if self.parse_keyword(Keyword::UNSIGNED) {
13145                        Ok(DataType::IntegerUnsigned(optional_precision?))
13146                    } else {
13147                        if dialect.supports_data_type_signed_suffix() {
13148                            let _ = self.parse_keyword(Keyword::SIGNED);
13149                        }
13150                        Ok(DataType::Integer(optional_precision?))
13151                    }
13152                }
13153                Keyword::BIGINT => {
13154                    let optional_precision = self.parse_optional_precision();
13155                    if self.parse_keyword(Keyword::UNSIGNED) {
13156                        Ok(DataType::BigIntUnsigned(optional_precision?))
13157                    } else {
13158                        if dialect.supports_data_type_signed_suffix() {
13159                            let _ = self.parse_keyword(Keyword::SIGNED);
13160                        }
13161                        Ok(DataType::BigInt(optional_precision?))
13162                    }
13163                }
13164                Keyword::HUGEINT => Ok(DataType::HugeInt),
13165                Keyword::UBIGINT => Ok(DataType::UBigInt),
13166                Keyword::UHUGEINT => Ok(DataType::UHugeInt),
13167                Keyword::USMALLINT => Ok(DataType::USmallInt),
13168                Keyword::UTINYINT => Ok(DataType::UTinyInt),
13169                Keyword::UINT8 => Ok(DataType::UInt8),
13170                Keyword::UINT16 => Ok(DataType::UInt16),
13171                Keyword::UINT32 => Ok(DataType::UInt32),
13172                Keyword::UINT64 => Ok(DataType::UInt64),
13173                Keyword::UINT128 => Ok(DataType::UInt128),
13174                Keyword::UINT256 => Ok(DataType::UInt256),
13175                Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
13176                Keyword::NVARCHAR => {
13177                    Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
13178                }
13179                Keyword::CHARACTER => {
13180                    if self.parse_keyword(Keyword::VARYING) {
13181                        Ok(DataType::CharacterVarying(
13182                            self.parse_optional_character_length()?,
13183                        ))
13184                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
13185                        Ok(DataType::CharacterLargeObject(
13186                            self.parse_optional_precision()?,
13187                        ))
13188                    } else {
13189                        Ok(DataType::Character(self.parse_optional_character_length()?))
13190                    }
13191                }
13192                Keyword::CHAR => {
13193                    if self.parse_keyword(Keyword::VARYING) {
13194                        Ok(DataType::CharVarying(
13195                            self.parse_optional_character_length()?,
13196                        ))
13197                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
13198                        Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
13199                    } else {
13200                        Ok(DataType::Char(self.parse_optional_character_length()?))
13201                    }
13202                }
13203                Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
13204                Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
13205                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
13206                Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
13207                Keyword::TINYBLOB => Ok(DataType::TinyBlob),
13208                Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
13209                Keyword::LONGBLOB => Ok(DataType::LongBlob),
13210                Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
13211                Keyword::BIT => {
13212                    if self.parse_keyword(Keyword::VARYING) {
13213                        Ok(DataType::BitVarying(self.parse_optional_precision()?))
13214                    } else {
13215                        Ok(DataType::Bit(self.parse_optional_precision()?))
13216                    }
13217                }
13218                Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
13219                Keyword::UUID => Ok(DataType::Uuid),
13220                Keyword::DATE => Ok(DataType::Date),
13221                Keyword::DATE32 => Ok(DataType::Date32),
13222                Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
13223                Keyword::DATETIME64 => {
13224                    self.prev_token();
13225                    let (precision, time_zone) = self.parse_datetime_64()?;
13226                    Ok(DataType::Datetime64(precision, time_zone))
13227                }
13228                Keyword::TIMESTAMP => {
13229                    let precision = self.parse_optional_precision()?;
13230                    let tz = if self.parse_keyword(Keyword::WITH) {
13231                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13232                        TimezoneInfo::WithTimeZone
13233                    } else if self.parse_keyword(Keyword::WITHOUT) {
13234                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13235                        TimezoneInfo::WithoutTimeZone
13236                    } else {
13237                        TimezoneInfo::None
13238                    };
13239                    Ok(DataType::Timestamp(precision, tz))
13240                }
13241                Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
13242                    self.parse_optional_precision()?,
13243                    TimezoneInfo::Tz,
13244                )),
13245                Keyword::TIMESTAMP_NTZ => {
13246                    Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
13247                }
13248                Keyword::TIME => {
13249                    let precision = self.parse_optional_precision()?;
13250                    let tz = if self.parse_keyword(Keyword::WITH) {
13251                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13252                        TimezoneInfo::WithTimeZone
13253                    } else if self.parse_keyword(Keyword::WITHOUT) {
13254                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13255                        TimezoneInfo::WithoutTimeZone
13256                    } else {
13257                        TimezoneInfo::None
13258                    };
13259                    Ok(DataType::Time(precision, tz))
13260                }
13261                Keyword::TIMETZ => Ok(DataType::Time(
13262                    self.parse_optional_precision()?,
13263                    TimezoneInfo::Tz,
13264                )),
13265                Keyword::INTERVAL => {
13266                    if self.dialect.supports_interval_options() {
13267                        let fields = self.maybe_parse_optional_interval_fields()?;
13268                        let precision = self.parse_optional_precision()?;
13269                        Ok(DataType::Interval { fields, precision })
13270                    } else {
13271                        Ok(DataType::Interval {
13272                            fields: None,
13273                            precision: None,
13274                        })
13275                    }
13276                }
13277                Keyword::JSON => Ok(DataType::JSON),
13278                Keyword::JSONB => Ok(DataType::JSONB),
13279                Keyword::REGCLASS => Ok(DataType::Regclass),
13280                Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
13281                Keyword::FIXEDSTRING => {
13282                    self.expect_token(&Token::LParen)?;
13283                    let character_length = self.parse_literal_uint()?;
13284                    self.expect_token(&Token::RParen)?;
13285                    Ok(DataType::FixedString(character_length))
13286                }
13287                Keyword::TEXT => Ok(DataType::Text),
13288                Keyword::TINYTEXT => Ok(DataType::TinyText),
13289                Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
13290                Keyword::LONGTEXT => Ok(DataType::LongText),
13291                Keyword::BYTEA => Ok(DataType::Bytea),
13292                Keyword::NUMERIC => Ok(DataType::Numeric(
13293                    self.parse_exact_number_optional_precision_scale()?,
13294                )),
13295                Keyword::DECIMAL => {
13296                    let precision = self.parse_exact_number_optional_precision_scale()?;
13297
13298                    if self.parse_keyword(Keyword::UNSIGNED) {
13299                        Ok(DataType::DecimalUnsigned(precision))
13300                    } else {
13301                        Ok(DataType::Decimal(precision))
13302                    }
13303                }
13304                Keyword::DEC => {
13305                    let precision = self.parse_exact_number_optional_precision_scale()?;
13306
13307                    if self.parse_keyword(Keyword::UNSIGNED) {
13308                        Ok(DataType::DecUnsigned(precision))
13309                    } else {
13310                        Ok(DataType::Dec(precision))
13311                    }
13312                }
13313                Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
13314                    self.parse_exact_number_optional_precision_scale()?,
13315                )),
13316                Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
13317                    self.parse_exact_number_optional_precision_scale()?,
13318                )),
13319                Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
13320                Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
13321                Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
13322                Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
13323                Keyword::ARRAY => {
13324                    if self.dialect.supports_array_typedef_without_element_type() {
13325                        Ok(DataType::Array(ArrayElemTypeDef::None))
13326                    } else if dialect_of!(self is ClickHouseDialect) {
13327                        Ok(self.parse_sub_type(|internal_type| {
13328                            DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
13329                        })?)
13330                    } else {
13331                        self.expect_token(&Token::Lt)?;
13332                        let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
13333                        trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13334                        Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
13335                            inside_type,
13336                        ))))
13337                    }
13338                }
13339                Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
13340                    self.prev_token();
13341                    let field_defs = self.parse_duckdb_struct_type_def()?;
13342                    Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
13343                }
13344                Keyword::STRUCT if dialect_is!(dialect is BigQueryDialect | DatabricksDialect | GenericDialect) =>
13345                {
13346                    self.prev_token();
13347                    let (field_defs, _trailing_bracket) =
13348                        self.parse_struct_type_def(Self::parse_struct_field_def)?;
13349                    trailing_bracket = _trailing_bracket;
13350                    Ok(DataType::Struct(
13351                        field_defs,
13352                        StructBracketKind::AngleBrackets,
13353                    ))
13354                }
13355                Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
13356                    self.prev_token();
13357                    let fields = self.parse_union_type_def()?;
13358                    Ok(DataType::Union(fields))
13359                }
13360                Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13361                    Ok(self.parse_sub_type(DataType::Nullable)?)
13362                }
13363                Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13364                    Ok(self.parse_sub_type(DataType::LowCardinality)?)
13365                }
13366                Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13367                    self.prev_token();
13368                    let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
13369                    Ok(DataType::Map(
13370                        Box::new(key_data_type),
13371                        Box::new(value_data_type),
13372                    ))
13373                }
13374                Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13375                    self.expect_token(&Token::LParen)?;
13376                    let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
13377                    self.expect_token(&Token::RParen)?;
13378                    Ok(DataType::Nested(field_defs))
13379                }
13380                Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13381                    self.prev_token();
13382                    let field_defs = self.parse_click_house_tuple_def()?;
13383                    Ok(DataType::Tuple(field_defs))
13384                }
13385                Keyword::TRIGGER => Ok(DataType::Trigger),
13386                Keyword::SETOF => {
13387                    let inner = self.parse_data_type()?;
13388                    Ok(DataType::SetOf(Box::new(inner)))
13389                }
13390                Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
13391                    let _ = self.parse_keyword(Keyword::TYPE);
13392                    Ok(DataType::AnyType)
13393                }
13394                Keyword::TABLE => {
13395                    // an LParen after the TABLE keyword indicates that table columns are being defined
13396                    // whereas no LParen indicates an anonymous table expression will be returned
13397                    if self.peek_token_ref().token == Token::LParen {
13398                        let columns = self.parse_returns_table_columns()?;
13399                        Ok(DataType::Table(Some(columns)))
13400                    } else {
13401                        Ok(DataType::Table(None))
13402                    }
13403                }
13404                Keyword::SIGNED => {
13405                    if self.parse_keyword(Keyword::INTEGER) {
13406                        Ok(DataType::SignedInteger)
13407                    } else {
13408                        Ok(DataType::Signed)
13409                    }
13410                }
13411                Keyword::UNSIGNED => {
13412                    if self.parse_keyword(Keyword::INTEGER) {
13413                        Ok(DataType::UnsignedInteger)
13414                    } else {
13415                        Ok(DataType::Unsigned)
13416                    }
13417                }
13418                Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13419                    Ok(DataType::TsVector)
13420                }
13421                Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13422                    Ok(DataType::TsQuery)
13423                }
13424                _ => {
13425                    self.prev_token();
13426                    let type_name = self.parse_object_name(false)?;
13427                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13428                        Ok(DataType::Custom(type_name, modifiers))
13429                    } else {
13430                        Ok(DataType::Custom(type_name, vec![]))
13431                    }
13432                }
13433            },
13434            _ => self.expected_at("a data type name", next_token_index),
13435        }?;
13436
13437        if self.dialect.supports_array_typedef_with_brackets() {
13438            while self.consume_token(&Token::LBracket) {
13439                // Parse optional array data type size
13440                let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13441                self.expect_token(&Token::RBracket)?;
13442                data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
13443            }
13444        }
13445        Ok((data, trailing_bracket))
13446    }
13447
13448    fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
13449        self.parse_column_def()
13450    }
13451
13452    fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
13453        self.expect_token(&Token::LParen)?;
13454        let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
13455        self.expect_token(&Token::RParen)?;
13456        Ok(columns)
13457    }
13458
13459    /// Parse a parenthesized, comma-separated list of single-quoted strings.
13460    pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
13461        self.expect_token(&Token::LParen)?;
13462        let mut values = Vec::new();
13463        loop {
13464            let next_token = self.next_token();
13465            match next_token.token {
13466                Token::SingleQuotedString(value) => values.push(value),
13467                _ => self.expected("a string", next_token)?,
13468            }
13469            let next_token = self.next_token();
13470            match next_token.token {
13471                Token::Comma => (),
13472                Token::RParen => break,
13473                _ => self.expected(", or }", next_token)?,
13474            }
13475        }
13476        Ok(values)
13477    }
13478
13479    /// Strictly parse `identifier AS identifier`
13480    pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13481        let ident = self.parse_identifier()?;
13482        self.expect_keyword_is(Keyword::AS)?;
13483        let alias = self.parse_identifier()?;
13484        Ok(IdentWithAlias { ident, alias })
13485    }
13486
13487    /// Parse `identifier [AS] identifier` where the AS keyword is optional
13488    fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13489        let ident = self.parse_identifier()?;
13490        let _after_as = self.parse_keyword(Keyword::AS);
13491        let alias = self.parse_identifier()?;
13492        Ok(IdentWithAlias { ident, alias })
13493    }
13494
13495    /// Parse comma-separated list of parenthesized queries for pipe operators
13496    fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
13497        self.parse_comma_separated(|parser| {
13498            parser.expect_token(&Token::LParen)?;
13499            let query = parser.parse_query()?;
13500            parser.expect_token(&Token::RParen)?;
13501            Ok(*query)
13502        })
13503    }
13504
13505    /// Parse set quantifier for pipe operators that require DISTINCT. E.g. INTERSECT and EXCEPT
13506    fn parse_distinct_required_set_quantifier(
13507        &mut self,
13508        operator_name: &str,
13509    ) -> Result<SetQuantifier, ParserError> {
13510        let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
13511        match quantifier {
13512            SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
13513            _ => Err(ParserError::ParserError(format!(
13514                "{operator_name} pipe operator requires DISTINCT modifier",
13515            ))),
13516        }
13517    }
13518
13519    /// Parse optional identifier alias (with or without AS keyword)
13520    fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13521        if self.parse_keyword(Keyword::AS) {
13522            Ok(Some(self.parse_identifier()?))
13523        } else {
13524            // Check if the next token is an identifier (implicit alias)
13525            self.maybe_parse(|parser| parser.parse_identifier())
13526        }
13527    }
13528
13529    /// Optionally parses an alias for a select list item
13530    fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13531        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13532            parser.dialect.is_select_item_alias(explicit, kw, parser)
13533        }
13534        self.parse_optional_alias_inner(None, validator)
13535    }
13536
13537    /// Optionally parses an alias for a table like in `... FROM generate_series(1, 10) AS t (col)`.
13538    /// In this case, the alias is allowed to optionally name the columns in the table, in
13539    /// addition to the table itself.
13540    pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
13541        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13542            parser.dialect.is_table_factor_alias(explicit, kw, parser)
13543        }
13544        let explicit = self.peek_keyword(Keyword::AS);
13545        match self.parse_optional_alias_inner(None, validator)? {
13546            Some(name) => {
13547                let columns = self.parse_table_alias_column_defs()?;
13548                Ok(Some(TableAlias {
13549                    explicit,
13550                    name,
13551                    columns,
13552                }))
13553            }
13554            None => Ok(None),
13555        }
13556    }
13557
13558    fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
13559        let mut hints = vec![];
13560        while let Some(hint_type) =
13561            self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
13562        {
13563            let hint_type = match hint_type {
13564                Keyword::USE => TableIndexHintType::Use,
13565                Keyword::IGNORE => TableIndexHintType::Ignore,
13566                Keyword::FORCE => TableIndexHintType::Force,
13567                _ => {
13568                    return self.expected_ref(
13569                        "expected to match USE/IGNORE/FORCE keyword",
13570                        self.peek_token_ref(),
13571                    )
13572                }
13573            };
13574            let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13575                Some(Keyword::INDEX) => TableIndexType::Index,
13576                Some(Keyword::KEY) => TableIndexType::Key,
13577                _ => {
13578                    return self
13579                        .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13580                }
13581            };
13582            let for_clause = if self.parse_keyword(Keyword::FOR) {
13583                let clause = if self.parse_keyword(Keyword::JOIN) {
13584                    TableIndexHintForClause::Join
13585                } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13586                    TableIndexHintForClause::OrderBy
13587                } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13588                    TableIndexHintForClause::GroupBy
13589                } else {
13590                    return self.expected_ref(
13591                        "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13592                        self.peek_token_ref(),
13593                    );
13594                };
13595                Some(clause)
13596            } else {
13597                None
13598            };
13599
13600            self.expect_token(&Token::LParen)?;
13601            let index_names = if self.peek_token_ref().token != Token::RParen {
13602                self.parse_comma_separated(Parser::parse_identifier)?
13603            } else {
13604                vec![]
13605            };
13606            self.expect_token(&Token::RParen)?;
13607            hints.push(TableIndexHints {
13608                hint_type,
13609                index_type,
13610                for_clause,
13611                index_names,
13612            });
13613        }
13614        Ok(hints)
13615    }
13616
13617    /// Wrapper for parse_optional_alias_inner, left for backwards-compatibility
13618    /// but new flows should use the context-specific methods such as `maybe_parse_select_item_alias`
13619    /// and `maybe_parse_table_alias`.
13620    pub fn parse_optional_alias(
13621        &mut self,
13622        reserved_kwds: &[Keyword],
13623    ) -> Result<Option<Ident>, ParserError> {
13624        fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13625            false
13626        }
13627        self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13628    }
13629
13630    /// Parses an optional alias after a SQL element such as a select list item
13631    /// or a table name.
13632    ///
13633    /// This method accepts an optional list of reserved keywords or a function
13634    /// to call to validate if a keyword should be parsed as an alias, to allow
13635    /// callers to customize the parsing logic based on their context.
13636    fn parse_optional_alias_inner<F>(
13637        &mut self,
13638        reserved_kwds: Option<&[Keyword]>,
13639        validator: F,
13640    ) -> Result<Option<Ident>, ParserError>
13641    where
13642        F: Fn(bool, &Keyword, &mut Parser) -> bool,
13643    {
13644        let after_as = self.parse_keyword(Keyword::AS);
13645
13646        let next_token = self.next_token();
13647        match next_token.token {
13648            // Accepts a keyword as an alias if the AS keyword explicitly indicate an alias or if the
13649            // caller provided a list of reserved keywords and the keyword is not on that list.
13650            Token::Word(w)
13651                if reserved_kwds.is_some()
13652                    && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13653            {
13654                Ok(Some(w.into_ident(next_token.span)))
13655            }
13656            // Accepts a keyword as alias based on the caller's context, such as to what SQL element
13657            // this word is a potential alias of using the validator call-back. This allows for
13658            // dialect-specific logic.
13659            Token::Word(w) if validator(after_as, &w.keyword, self) => {
13660                Ok(Some(w.into_ident(next_token.span)))
13661            }
13662            // For backwards-compatibility, we accept quoted strings as aliases regardless of the context.
13663            Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13664            Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13665            _ => {
13666                if after_as {
13667                    return self.expected("an identifier after AS", next_token);
13668                }
13669                self.prev_token();
13670                Ok(None) // no alias found
13671            }
13672        }
13673    }
13674
13675    /// Parse an optional `GROUP BY` clause, returning `Some(GroupByExpr)` when present.
13676    pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13677        if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13678            let expressions = if self.parse_keyword(Keyword::ALL) {
13679                None
13680            } else {
13681                Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13682            };
13683
13684            let mut modifiers = vec![];
13685            if self.dialect.supports_group_by_with_modifier() {
13686                loop {
13687                    if !self.parse_keyword(Keyword::WITH) {
13688                        break;
13689                    }
13690                    let keyword = self.expect_one_of_keywords(&[
13691                        Keyword::ROLLUP,
13692                        Keyword::CUBE,
13693                        Keyword::TOTALS,
13694                    ])?;
13695                    modifiers.push(match keyword {
13696                        Keyword::ROLLUP => GroupByWithModifier::Rollup,
13697                        Keyword::CUBE => GroupByWithModifier::Cube,
13698                        Keyword::TOTALS => GroupByWithModifier::Totals,
13699                        _ => {
13700                            return parser_err!(
13701                                "BUG: expected to match GroupBy modifier keyword",
13702                                self.peek_token_ref().span.start
13703                            )
13704                        }
13705                    });
13706                }
13707            }
13708            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13709                self.expect_token(&Token::LParen)?;
13710                let result = self.parse_comma_separated(|p| {
13711                    if p.peek_token_ref().token == Token::LParen {
13712                        p.parse_tuple(true, true)
13713                    } else {
13714                        Ok(vec![p.parse_expr()?])
13715                    }
13716                })?;
13717                self.expect_token(&Token::RParen)?;
13718                modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13719                    result,
13720                )));
13721            };
13722            let group_by = match expressions {
13723                None => GroupByExpr::All(modifiers),
13724                Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13725            };
13726            Ok(Some(group_by))
13727        } else {
13728            Ok(None)
13729        }
13730    }
13731
13732    /// Parse an optional `ORDER BY` clause, returning `Some(OrderBy)` when present.
13733    pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13734        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13735            let order_by =
13736                if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13737                    let order_by_options = self.parse_order_by_options()?;
13738                    OrderBy {
13739                        kind: OrderByKind::All(order_by_options),
13740                        interpolate: None,
13741                    }
13742                } else {
13743                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13744                    let interpolate = if self.dialect.supports_interpolate() {
13745                        self.parse_interpolations()?
13746                    } else {
13747                        None
13748                    };
13749                    OrderBy {
13750                        kind: OrderByKind::Expressions(exprs),
13751                        interpolate,
13752                    }
13753                };
13754            Ok(Some(order_by))
13755        } else {
13756            Ok(None)
13757        }
13758    }
13759
13760    fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13761        let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13762            Some(self.parse_offset()?)
13763        } else {
13764            None
13765        };
13766
13767        let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13768            let expr = self.parse_limit()?;
13769
13770            if self.dialect.supports_limit_comma()
13771                && offset.is_none()
13772                && expr.is_some() // ALL not supported with comma
13773                && self.consume_token(&Token::Comma)
13774            {
13775                let offset = expr.ok_or_else(|| {
13776                    ParserError::ParserError(
13777                        "Missing offset for LIMIT <offset>, <limit>".to_string(),
13778                    )
13779                })?;
13780                return Ok(Some(LimitClause::OffsetCommaLimit {
13781                    offset,
13782                    limit: self.parse_expr()?,
13783                }));
13784            }
13785
13786            let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13787                Some(self.parse_comma_separated(Parser::parse_expr)?)
13788            } else {
13789                None
13790            };
13791
13792            (Some(expr), limit_by)
13793        } else {
13794            (None, None)
13795        };
13796
13797        if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13798            offset = Some(self.parse_offset()?);
13799        }
13800
13801        if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13802            Ok(Some(LimitClause::LimitOffset {
13803                limit: limit.unwrap_or_default(),
13804                offset,
13805                limit_by: limit_by.unwrap_or_default(),
13806            }))
13807        } else {
13808            Ok(None)
13809        }
13810    }
13811
13812    /// Parse a table object for insertion
13813    /// e.g. `some_database.some_table` or `FUNCTION some_table_func(...)`
13814    pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13815        if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13816            let fn_name = self.parse_object_name(false)?;
13817            self.parse_function_call(fn_name)
13818                .map(TableObject::TableFunction)
13819        } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13820            self.parse_parenthesized(|p| p.parse_query())
13821                .map(TableObject::TableQuery)
13822        } else {
13823            self.parse_object_name(false).map(TableObject::TableName)
13824        }
13825    }
13826
13827    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13828    /// `foo` or `myschema."table"
13829    ///
13830    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13831    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13832    /// in this context on BigQuery.
13833    pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13834        self.parse_object_name_inner(in_table_clause, false)
13835    }
13836
13837    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13838    /// `foo` or `myschema."table"
13839    ///
13840    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13841    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13842    /// in this context on BigQuery.
13843    ///
13844    /// The `allow_wildcards` parameter indicates whether to allow for wildcards in the object name
13845    /// e.g. *, *.*, `foo`.*, or "foo"."bar"
13846    fn parse_object_name_inner(
13847        &mut self,
13848        in_table_clause: bool,
13849        allow_wildcards: bool,
13850    ) -> Result<ObjectName, ParserError> {
13851        let mut parts = vec![];
13852        if dialect_of!(self is BigQueryDialect) && in_table_clause {
13853            loop {
13854                let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13855                parts.push(ObjectNamePart::Identifier(ident));
13856                if !self.consume_token(&Token::Period) && !end_with_period {
13857                    break;
13858                }
13859            }
13860        } else {
13861            loop {
13862                if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13863                    let span = self.next_token().span;
13864                    parts.push(ObjectNamePart::Identifier(Ident {
13865                        value: Token::Mul.to_string(),
13866                        quote_style: None,
13867                        span,
13868                    }));
13869                } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13870                    let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13871                    parts.push(ObjectNamePart::Identifier(ident));
13872                    if !self.consume_token(&Token::Period) && !end_with_period {
13873                        break;
13874                    }
13875                } else if self.dialect.supports_object_name_double_dot_notation()
13876                    && parts.len() == 1
13877                    && matches!(self.peek_token_ref().token, Token::Period)
13878                {
13879                    // Empty string here means default schema
13880                    parts.push(ObjectNamePart::Identifier(Ident::new("")));
13881                } else {
13882                    let ident = self.parse_identifier()?;
13883                    let part = if self
13884                        .dialect
13885                        .is_identifier_generating_function_name(&ident, &parts)
13886                    {
13887                        self.expect_token(&Token::LParen)?;
13888                        let args: Vec<FunctionArg> =
13889                            self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13890                        self.expect_token(&Token::RParen)?;
13891                        ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13892                    } else {
13893                        ObjectNamePart::Identifier(ident)
13894                    };
13895                    parts.push(part);
13896                }
13897
13898                if !self.consume_token(&Token::Period) {
13899                    break;
13900                }
13901            }
13902        }
13903
13904        // BigQuery accepts any number of quoted identifiers of a table name.
13905        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
13906        if dialect_of!(self is BigQueryDialect)
13907            && parts.iter().any(|part| {
13908                part.as_ident()
13909                    .is_some_and(|ident| ident.value.contains('.'))
13910            })
13911        {
13912            parts = parts
13913                .into_iter()
13914                .flat_map(|part| match part.as_ident() {
13915                    Some(ident) => ident
13916                        .value
13917                        .split('.')
13918                        .map(|value| {
13919                            ObjectNamePart::Identifier(Ident {
13920                                value: value.into(),
13921                                quote_style: ident.quote_style,
13922                                span: ident.span,
13923                            })
13924                        })
13925                        .collect::<Vec<_>>(),
13926                    None => vec![part],
13927                })
13928                .collect()
13929        }
13930
13931        Ok(ObjectName(parts))
13932    }
13933
13934    /// Parse identifiers
13935    pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13936        let mut idents = vec![];
13937        loop {
13938            let token = self.peek_token_ref();
13939            match &token.token {
13940                Token::Word(w) => {
13941                    idents.push(w.to_ident(token.span));
13942                }
13943                Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13944                    break
13945                }
13946                _ => {}
13947            }
13948            self.advance_token();
13949        }
13950        Ok(idents)
13951    }
13952
13953    /// Parse identifiers of form ident1[.identN]*
13954    ///
13955    /// Similar in functionality to [parse_identifiers], with difference
13956    /// being this function is much more strict about parsing a valid multipart identifier, not
13957    /// allowing extraneous tokens to be parsed, otherwise it fails.
13958    ///
13959    /// For example:
13960    ///
13961    /// ```rust
13962    /// use sqlparser::ast::Ident;
13963    /// use sqlparser::dialect::GenericDialect;
13964    /// use sqlparser::parser::Parser;
13965    ///
13966    /// let dialect = GenericDialect {};
13967    /// let expected = vec![Ident::new("one"), Ident::new("two")];
13968    ///
13969    /// // expected usage
13970    /// let sql = "one.two";
13971    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13972    /// let actual = parser.parse_multipart_identifier().unwrap();
13973    /// assert_eq!(&actual, &expected);
13974    ///
13975    /// // parse_identifiers is more loose on what it allows, parsing successfully
13976    /// let sql = "one + two";
13977    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13978    /// let actual = parser.parse_identifiers().unwrap();
13979    /// assert_eq!(&actual, &expected);
13980    ///
13981    /// // expected to strictly fail due to + separator
13982    /// let sql = "one + two";
13983    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13984    /// let actual = parser.parse_multipart_identifier().unwrap_err();
13985    /// assert_eq!(
13986    ///     actual.to_string(),
13987    ///     "sql parser error: Unexpected token in identifier: +"
13988    /// );
13989    /// ```
13990    ///
13991    /// [parse_identifiers]: Parser::parse_identifiers
13992    pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13993        let mut idents = vec![];
13994
13995        // expecting at least one word for identifier
13996        let next_token = self.next_token();
13997        match next_token.token {
13998            Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13999            Token::EOF => {
14000                return Err(ParserError::ParserError(
14001                    "Empty input when parsing identifier".to_string(),
14002                ))?
14003            }
14004            token => {
14005                return Err(ParserError::ParserError(format!(
14006                    "Unexpected token in identifier: {token}"
14007                )))?
14008            }
14009        };
14010
14011        // parse optional next parts if exist
14012        loop {
14013            match self.next_token().token {
14014                // ensure that optional period is succeeded by another identifier
14015                Token::Period => {
14016                    let next_token = self.next_token();
14017                    match next_token.token {
14018                        Token::Word(w) => idents.push(w.into_ident(next_token.span)),
14019                        Token::EOF => {
14020                            return Err(ParserError::ParserError(
14021                                "Trailing period in identifier".to_string(),
14022                            ))?
14023                        }
14024                        token => {
14025                            return Err(ParserError::ParserError(format!(
14026                                "Unexpected token following period in identifier: {token}"
14027                            )))?
14028                        }
14029                    }
14030                }
14031                Token::EOF => break,
14032                token => {
14033                    return Err(ParserError::ParserError(format!(
14034                        "Unexpected token in identifier: {token}"
14035                    )))?;
14036                }
14037            }
14038        }
14039
14040        Ok(idents)
14041    }
14042
14043    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
14044    pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
14045        let next_token = self.next_token();
14046        match next_token.token {
14047            Token::Word(w) => Ok(w.into_ident(next_token.span)),
14048            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
14049            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
14050            _ => self.expected("identifier", next_token),
14051        }
14052    }
14053
14054    /// On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
14055    /// TABLE clause.
14056    ///
14057    /// The first segment must be an ordinary unquoted identifier, e.g. it must not start
14058    /// with a digit. Subsequent segments are either must either be valid identifiers or
14059    /// integers, e.g. foo-123 is allowed, but foo-123a is not.
14060    ///
14061    /// [BigQuery-lexical](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical)
14062    ///
14063    /// Return a tuple of the identifier and a boolean indicating it ends with a period.
14064    fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
14065        match self.peek_token().token {
14066            Token::Word(w) => {
14067                let quote_style_is_none = w.quote_style.is_none();
14068                let mut requires_whitespace = false;
14069                let mut ident = w.into_ident(self.next_token().span);
14070                if quote_style_is_none {
14071                    while matches!(self.peek_token_no_skip().token, Token::Minus) {
14072                        self.next_token();
14073                        ident.value.push('-');
14074
14075                        let token = self
14076                            .next_token_no_skip()
14077                            .cloned()
14078                            .unwrap_or(TokenWithSpan::wrap(Token::EOF));
14079                        requires_whitespace = match token.token {
14080                            Token::Word(next_word) if next_word.quote_style.is_none() => {
14081                                ident.value.push_str(&next_word.value);
14082                                false
14083                            }
14084                            Token::Number(s, false) => {
14085                                // A number token can represent a decimal value ending with a period, e.g., `Number('123.')`.
14086                                // However, for an [ObjectName], it is part of a hyphenated identifier, e.g., `foo-123.bar`.
14087                                //
14088                                // If a number token is followed by a period, it is part of an [ObjectName].
14089                                // Return the identifier with `true` if the number token is followed by a period, indicating that
14090                                // parsing should continue for the next part of the hyphenated identifier.
14091                                if s.ends_with('.') {
14092                                    let Some(s) = s.split('.').next().filter(|s| {
14093                                        !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
14094                                    }) else {
14095                                        return self.expected(
14096                                            "continuation of hyphenated identifier",
14097                                            TokenWithSpan::new(Token::Number(s, false), token.span),
14098                                        );
14099                                    };
14100                                    ident.value.push_str(s);
14101                                    return Ok((ident, true));
14102                                } else {
14103                                    ident.value.push_str(&s);
14104                                }
14105                                // If next token is period, then it is part of an ObjectName and we don't expect whitespace
14106                                // after the number.
14107                                !matches!(self.peek_token_ref().token, Token::Period)
14108                            }
14109                            _ => {
14110                                return self
14111                                    .expected("continuation of hyphenated identifier", token);
14112                            }
14113                        }
14114                    }
14115
14116                    // If the last segment was a number, we must check that it's followed by whitespace,
14117                    // otherwise foo-123a will be parsed as `foo-123` with the alias `a`.
14118                    if requires_whitespace {
14119                        let token = self.next_token();
14120                        if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
14121                            return self
14122                                .expected("whitespace following hyphenated identifier", token);
14123                        }
14124                    }
14125                }
14126                Ok((ident, false))
14127            }
14128            _ => Ok((self.parse_identifier()?, false)),
14129        }
14130    }
14131
14132    /// Parses a parenthesized, comma-separated list of column definitions within a view.
14133    fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
14134        if self.consume_token(&Token::LParen) {
14135            if self.peek_token_ref().token == Token::RParen {
14136                self.next_token();
14137                Ok(vec![])
14138            } else {
14139                let cols = self.parse_comma_separated_with_trailing_commas(
14140                    Parser::parse_view_column,
14141                    self.dialect.supports_column_definition_trailing_commas(),
14142                    Self::is_reserved_for_column_alias,
14143                )?;
14144                self.expect_token(&Token::RParen)?;
14145                Ok(cols)
14146            }
14147        } else {
14148            Ok(vec![])
14149        }
14150    }
14151
14152    /// Parses a column definition within a view.
14153    fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
14154        let name = self.parse_identifier()?;
14155        let options = self.parse_view_column_options()?;
14156        let data_type = if dialect_of!(self is ClickHouseDialect) {
14157            Some(self.parse_data_type()?)
14158        } else {
14159            None
14160        };
14161        Ok(ViewColumnDef {
14162            name,
14163            data_type,
14164            options,
14165        })
14166    }
14167
14168    fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
14169        let mut options = Vec::new();
14170        loop {
14171            let option = self.parse_optional_column_option()?;
14172            if let Some(option) = option {
14173                options.push(option);
14174            } else {
14175                break;
14176            }
14177        }
14178        if options.is_empty() {
14179            Ok(None)
14180        } else if self.dialect.supports_space_separated_column_options() {
14181            Ok(Some(ColumnOptions::SpaceSeparated(options)))
14182        } else {
14183            Ok(Some(ColumnOptions::CommaSeparated(options)))
14184        }
14185    }
14186
14187    /// Parses a parenthesized comma-separated list of unqualified, possibly quoted identifiers.
14188    /// For example: `(col1, "col 2", ...)`
14189    pub fn parse_parenthesized_column_list(
14190        &mut self,
14191        optional: IsOptional,
14192        allow_empty: bool,
14193    ) -> Result<Vec<Ident>, ParserError> {
14194        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
14195    }
14196
14197    /// Parse a parenthesized list of compound identifiers as expressions.
14198    pub fn parse_parenthesized_compound_identifier_list(
14199        &mut self,
14200        optional: IsOptional,
14201        allow_empty: bool,
14202    ) -> Result<Vec<Expr>, ParserError> {
14203        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14204            Ok(Expr::CompoundIdentifier(
14205                p.parse_period_separated(|p| p.parse_identifier())?,
14206            ))
14207        })
14208    }
14209
14210    /// Parses a parenthesized comma-separated list of index columns, which can be arbitrary
14211    /// expressions with ordering information (and an opclass in some dialects).
14212    fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
14213        self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
14214            p.parse_create_index_expr()
14215        })
14216    }
14217
14218    /// Parses a parenthesized comma-separated list of qualified, possibly quoted identifiers.
14219    /// For example: `(db1.sc1.tbl1.col1, db1.sc1.tbl1."col 2", ...)`
14220    pub fn parse_parenthesized_qualified_column_list(
14221        &mut self,
14222        optional: IsOptional,
14223        allow_empty: bool,
14224    ) -> Result<Vec<ObjectName>, ParserError> {
14225        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14226            p.parse_object_name(true)
14227        })
14228    }
14229
14230    /// Parses a parenthesized comma-separated list of columns using
14231    /// the provided function to parse each element.
14232    fn parse_parenthesized_column_list_inner<F, T>(
14233        &mut self,
14234        optional: IsOptional,
14235        allow_empty: bool,
14236        mut f: F,
14237    ) -> Result<Vec<T>, ParserError>
14238    where
14239        F: FnMut(&mut Parser) -> Result<T, ParserError>,
14240    {
14241        if self.consume_token(&Token::LParen) {
14242            if allow_empty && self.peek_token_ref().token == Token::RParen {
14243                self.next_token();
14244                Ok(vec![])
14245            } else {
14246                let cols = self.parse_comma_separated(|p| f(p))?;
14247                self.expect_token(&Token::RParen)?;
14248                Ok(cols)
14249            }
14250        } else if optional == Optional {
14251            Ok(vec![])
14252        } else {
14253            self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
14254        }
14255    }
14256
14257    /// Parses a parenthesized comma-separated list of table alias column definitions.
14258    fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
14259        if self.consume_token(&Token::LParen) {
14260            let cols = self.parse_comma_separated(|p| {
14261                let name = p.parse_identifier()?;
14262                let data_type = p.maybe_parse(|p| p.parse_data_type())?;
14263                Ok(TableAliasColumnDef { name, data_type })
14264            })?;
14265            self.expect_token(&Token::RParen)?;
14266            Ok(cols)
14267        } else {
14268            Ok(vec![])
14269        }
14270    }
14271
14272    /// Parse an unsigned precision value enclosed in parentheses, e.g. `(10)`.
14273    pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
14274        self.expect_token(&Token::LParen)?;
14275        let n = self.parse_literal_uint()?;
14276        self.expect_token(&Token::RParen)?;
14277        Ok(n)
14278    }
14279
14280    /// Parse an optional precision `(n)` and return it as `Some(n)` when present.
14281    pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
14282        if self.consume_token(&Token::LParen) {
14283            let n = self.parse_literal_uint()?;
14284            self.expect_token(&Token::RParen)?;
14285            Ok(Some(n))
14286        } else {
14287            Ok(None)
14288        }
14289    }
14290
14291    fn maybe_parse_optional_interval_fields(
14292        &mut self,
14293    ) -> Result<Option<IntervalFields>, ParserError> {
14294        match self.parse_one_of_keywords(&[
14295            // Can be followed by `TO` option
14296            Keyword::YEAR,
14297            Keyword::DAY,
14298            Keyword::HOUR,
14299            Keyword::MINUTE,
14300            // No `TO` option
14301            Keyword::MONTH,
14302            Keyword::SECOND,
14303        ]) {
14304            Some(Keyword::YEAR) => {
14305                if self.peek_keyword(Keyword::TO) {
14306                    self.expect_keyword(Keyword::TO)?;
14307                    self.expect_keyword(Keyword::MONTH)?;
14308                    Ok(Some(IntervalFields::YearToMonth))
14309                } else {
14310                    Ok(Some(IntervalFields::Year))
14311                }
14312            }
14313            Some(Keyword::DAY) => {
14314                if self.peek_keyword(Keyword::TO) {
14315                    self.expect_keyword(Keyword::TO)?;
14316                    match self.expect_one_of_keywords(&[
14317                        Keyword::HOUR,
14318                        Keyword::MINUTE,
14319                        Keyword::SECOND,
14320                    ])? {
14321                        Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
14322                        Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
14323                        Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
14324                        _ => {
14325                            self.prev_token();
14326                            self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
14327                        }
14328                    }
14329                } else {
14330                    Ok(Some(IntervalFields::Day))
14331                }
14332            }
14333            Some(Keyword::HOUR) => {
14334                if self.peek_keyword(Keyword::TO) {
14335                    self.expect_keyword(Keyword::TO)?;
14336                    match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
14337                        Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
14338                        Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
14339                        _ => {
14340                            self.prev_token();
14341                            self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
14342                        }
14343                    }
14344                } else {
14345                    Ok(Some(IntervalFields::Hour))
14346                }
14347            }
14348            Some(Keyword::MINUTE) => {
14349                if self.peek_keyword(Keyword::TO) {
14350                    self.expect_keyword(Keyword::TO)?;
14351                    self.expect_keyword(Keyword::SECOND)?;
14352                    Ok(Some(IntervalFields::MinuteToSecond))
14353                } else {
14354                    Ok(Some(IntervalFields::Minute))
14355                }
14356            }
14357            Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
14358            Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
14359            Some(_) => {
14360                self.prev_token();
14361                self.expected_ref(
14362                    "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
14363                    self.peek_token_ref(),
14364                )
14365            }
14366            None => Ok(None),
14367        }
14368    }
14369
14370    /// Parse datetime64 [1]
14371    /// Syntax
14372    /// ```sql
14373    /// DateTime64(precision[, timezone])
14374    /// ```
14375    ///
14376    /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/datetime64
14377    pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
14378        self.expect_keyword_is(Keyword::DATETIME64)?;
14379        self.expect_token(&Token::LParen)?;
14380        let precision = self.parse_literal_uint()?;
14381        let time_zone = if self.consume_token(&Token::Comma) {
14382            Some(self.parse_literal_string()?)
14383        } else {
14384            None
14385        };
14386        self.expect_token(&Token::RParen)?;
14387        Ok((precision, time_zone))
14388    }
14389
14390    /// Parse an optional character length specification `(n | MAX [CHARACTERS|OCTETS])`.
14391    pub fn parse_optional_character_length(
14392        &mut self,
14393    ) -> Result<Option<CharacterLength>, ParserError> {
14394        if self.consume_token(&Token::LParen) {
14395            let character_length = self.parse_character_length()?;
14396            self.expect_token(&Token::RParen)?;
14397            Ok(Some(character_length))
14398        } else {
14399            Ok(None)
14400        }
14401    }
14402
14403    /// Parse an optional binary length specification like `(n)`.
14404    pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
14405        if self.consume_token(&Token::LParen) {
14406            let binary_length = self.parse_binary_length()?;
14407            self.expect_token(&Token::RParen)?;
14408            Ok(Some(binary_length))
14409        } else {
14410            Ok(None)
14411        }
14412    }
14413
14414    /// Parse a character length, handling `MAX` or integer lengths with optional units.
14415    pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
14416        if self.parse_keyword(Keyword::MAX) {
14417            return Ok(CharacterLength::Max);
14418        }
14419        let length = self.parse_literal_uint()?;
14420        let unit = if self.parse_keyword(Keyword::CHARACTERS) {
14421            Some(CharLengthUnits::Characters)
14422        } else if self.parse_keyword(Keyword::OCTETS) {
14423            Some(CharLengthUnits::Octets)
14424        } else {
14425            None
14426        };
14427        Ok(CharacterLength::IntegerLength { length, unit })
14428    }
14429
14430    /// Parse a binary length specification, returning `BinaryLength`.
14431    pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
14432        if self.parse_keyword(Keyword::MAX) {
14433            return Ok(BinaryLength::Max);
14434        }
14435        let length = self.parse_literal_uint()?;
14436        Ok(BinaryLength::IntegerLength { length })
14437    }
14438
14439    /// Parse an optional `(precision[, scale])` and return `(Option<precision>, Option<scale>)`.
14440    pub fn parse_optional_precision_scale(
14441        &mut self,
14442    ) -> Result<(Option<u64>, Option<u64>), ParserError> {
14443        if self.consume_token(&Token::LParen) {
14444            let n = self.parse_literal_uint()?;
14445            let scale = if self.consume_token(&Token::Comma) {
14446                Some(self.parse_literal_uint()?)
14447            } else {
14448                None
14449            };
14450            self.expect_token(&Token::RParen)?;
14451            Ok((Some(n), scale))
14452        } else {
14453            Ok((None, None))
14454        }
14455    }
14456
14457    /// Parse exact-number precision/scale info like `(precision[, scale])` for decimal types.
14458    pub fn parse_exact_number_optional_precision_scale(
14459        &mut self,
14460    ) -> Result<ExactNumberInfo, ParserError> {
14461        if self.consume_token(&Token::LParen) {
14462            let precision = self.parse_literal_uint()?;
14463            let scale = if self.consume_token(&Token::Comma) {
14464                Some(self.parse_signed_integer()?)
14465            } else {
14466                None
14467            };
14468
14469            self.expect_token(&Token::RParen)?;
14470
14471            match scale {
14472                None => Ok(ExactNumberInfo::Precision(precision)),
14473                Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
14474            }
14475        } else {
14476            Ok(ExactNumberInfo::None)
14477        }
14478    }
14479
14480    /// Parse an optionally signed integer literal.
14481    fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
14482        let is_negative = self.consume_token(&Token::Minus);
14483
14484        if !is_negative {
14485            let _ = self.consume_token(&Token::Plus);
14486        }
14487
14488        let current_token = self.peek_token_ref();
14489        match &current_token.token {
14490            Token::Number(s, _) => {
14491                let s = s.clone();
14492                let span_start = current_token.span.start;
14493                self.advance_token();
14494                let value = Self::parse::<i64>(s, span_start)?;
14495                Ok(if is_negative { -value } else { value })
14496            }
14497            _ => self.expected_ref("number", current_token),
14498        }
14499    }
14500
14501    /// Parse optional type modifiers appearing in parentheses e.g. `(UNSIGNED, ZEROFILL)`.
14502    pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
14503        if self.consume_token(&Token::LParen) {
14504            let mut modifiers = Vec::new();
14505            loop {
14506                let next_token = self.next_token();
14507                match next_token.token {
14508                    Token::Word(w) => modifiers.push(w.to_string()),
14509                    Token::Number(n, _) => modifiers.push(n),
14510                    Token::SingleQuotedString(s) => modifiers.push(s),
14511
14512                    Token::Comma => {
14513                        continue;
14514                    }
14515                    Token::RParen => {
14516                        break;
14517                    }
14518                    _ => self.expected("type modifiers", next_token)?,
14519                }
14520            }
14521
14522            Ok(Some(modifiers))
14523        } else {
14524            Ok(None)
14525        }
14526    }
14527
14528    /// Parse a parenthesized sub data type
14529    fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
14530    where
14531        F: FnOnce(Box<DataType>) -> DataType,
14532    {
14533        self.expect_token(&Token::LParen)?;
14534        let inside_type = self.parse_data_type()?;
14535        self.expect_token(&Token::RParen)?;
14536        Ok(parent_type(inside_type.into()))
14537    }
14538
14539    /// Parse a DELETE statement, returning a `Box`ed SetExpr
14540    ///
14541    /// This is used to reduce the size of the stack frames in debug builds
14542    fn parse_delete_setexpr_boxed(
14543        &mut self,
14544        delete_token: TokenWithSpan,
14545    ) -> Result<Box<SetExpr>, ParserError> {
14546        Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
14547    }
14548
14549    /// Parse a `DELETE` statement and return `Statement::Delete`.
14550    pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
14551        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14552        let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
14553            // `FROM` keyword is optional in BigQuery SQL.
14554            // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
14555            if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
14556                (vec![], false)
14557            } else {
14558                let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
14559                self.expect_keyword_is(Keyword::FROM)?;
14560                (tables, true)
14561            }
14562        } else {
14563            (vec![], true)
14564        };
14565
14566        let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14567
14568        let output = self.maybe_parse_output_clause()?;
14569
14570        let using = if self.parse_keyword(Keyword::USING) {
14571            Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14572        } else {
14573            None
14574        };
14575        let selection = if self.parse_keyword(Keyword::WHERE) {
14576            Some(self.parse_expr()?)
14577        } else {
14578            None
14579        };
14580        let returning = if self.parse_keyword(Keyword::RETURNING) {
14581            Some(self.parse_comma_separated(Parser::parse_select_item)?)
14582        } else {
14583            None
14584        };
14585        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14586            self.parse_comma_separated(Parser::parse_order_by_expr)?
14587        } else {
14588            vec![]
14589        };
14590        let limit = if self.parse_keyword(Keyword::LIMIT) {
14591            self.parse_limit()?
14592        } else {
14593            None
14594        };
14595
14596        Ok(Statement::Delete(Delete {
14597            delete_token: delete_token.into(),
14598            optimizer_hints,
14599            tables,
14600            from: if with_from_keyword {
14601                FromTable::WithFromKeyword(from)
14602            } else {
14603                FromTable::WithoutKeyword(from)
14604            },
14605            using,
14606            selection,
14607            returning,
14608            output,
14609            order_by,
14610            limit,
14611        }))
14612    }
14613
14614    /// Parse a `KILL` statement, optionally specifying `CONNECTION`, `QUERY`, or `MUTATION`.
14615    /// KILL [CONNECTION | QUERY | MUTATION] processlist_id
14616    pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14617        let modifier_keyword =
14618            self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14619
14620        let id = self.parse_literal_uint()?;
14621
14622        let modifier = match modifier_keyword {
14623            Some(Keyword::CONNECTION) => Some(KillType::Connection),
14624            Some(Keyword::QUERY) => Some(KillType::Query),
14625            Some(Keyword::MUTATION) => {
14626                if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14627                    Some(KillType::Mutation)
14628                } else {
14629                    self.expected_ref(
14630                        "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14631                        self.peek_token_ref(),
14632                    )?
14633                }
14634            }
14635            _ => None,
14636        };
14637
14638        Ok(Statement::Kill { modifier, id })
14639    }
14640
14641    /// Parse an `EXPLAIN` statement, handling dialect-specific options and modifiers.
14642    pub fn parse_explain(
14643        &mut self,
14644        describe_alias: DescribeAlias,
14645    ) -> Result<Statement, ParserError> {
14646        let mut analyze = false;
14647        let mut verbose = false;
14648        let mut query_plan = false;
14649        let mut estimate = false;
14650        let mut format = None;
14651        let mut options = None;
14652
14653        // Note: DuckDB is compatible with PostgreSQL syntax for this statement,
14654        // although not all features may be implemented.
14655        if describe_alias == DescribeAlias::Explain
14656            && self.dialect.supports_explain_with_utility_options()
14657            && self.peek_token_ref().token == Token::LParen
14658        {
14659            options = Some(self.parse_utility_options()?)
14660        } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14661            query_plan = true;
14662        } else if self.parse_keyword(Keyword::ESTIMATE) {
14663            estimate = true;
14664        } else {
14665            analyze = self.parse_keyword(Keyword::ANALYZE);
14666            verbose = self.parse_keyword(Keyword::VERBOSE);
14667            if self.parse_keyword(Keyword::FORMAT) {
14668                format = Some(self.parse_analyze_format_kind()?);
14669            }
14670        }
14671
14672        match self.maybe_parse(|parser| parser.parse_statement())? {
14673            Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14674                ParserError::ParserError("Explain must be root of the plan".to_string()),
14675            ),
14676            Some(statement) => Ok(Statement::Explain {
14677                describe_alias,
14678                analyze,
14679                verbose,
14680                query_plan,
14681                estimate,
14682                statement: Box::new(statement),
14683                format,
14684                options,
14685            }),
14686            _ => {
14687                let hive_format =
14688                    match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14689                        Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14690                        Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14691                        _ => None,
14692                    };
14693
14694                let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14695                    // only allow to use TABLE keyword for DESC|DESCRIBE statement
14696                    self.parse_keyword(Keyword::TABLE)
14697                } else {
14698                    false
14699                };
14700
14701                let table_name = self.parse_object_name(false)?;
14702                Ok(Statement::ExplainTable {
14703                    describe_alias,
14704                    hive_format,
14705                    has_table_keyword,
14706                    table_name,
14707                })
14708            }
14709        }
14710    }
14711
14712    /// Parse a query expression, i.e. a `SELECT` statement optionally
14713    /// preceded with some `WITH` CTE declarations and optionally followed
14714    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
14715    /// expect the initial keyword to be already consumed
14716    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14717    pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14718        let _guard = self.recursion_counter.try_decrease()?;
14719        let with = if self.parse_keyword(Keyword::WITH) {
14720            let with_token = self.get_current_token();
14721            Some(With {
14722                with_token: with_token.clone().into(),
14723                recursive: self.parse_keyword(Keyword::RECURSIVE),
14724                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14725            })
14726        } else {
14727            None
14728        };
14729        if self.parse_keyword(Keyword::INSERT) {
14730            Ok(Query {
14731                with,
14732                body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14733                order_by: None,
14734                limit_clause: None,
14735                fetch: None,
14736                locks: vec![],
14737                for_clause: None,
14738                settings: None,
14739                format_clause: None,
14740                pipe_operators: vec![],
14741            }
14742            .into())
14743        } else if self.parse_keyword(Keyword::UPDATE) {
14744            Ok(Query {
14745                with,
14746                body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14747                order_by: None,
14748                limit_clause: None,
14749                fetch: None,
14750                locks: vec![],
14751                for_clause: None,
14752                settings: None,
14753                format_clause: None,
14754                pipe_operators: vec![],
14755            }
14756            .into())
14757        } else if self.parse_keyword(Keyword::DELETE) {
14758            Ok(Query {
14759                with,
14760                body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14761                limit_clause: None,
14762                order_by: None,
14763                fetch: None,
14764                locks: vec![],
14765                for_clause: None,
14766                settings: None,
14767                format_clause: None,
14768                pipe_operators: vec![],
14769            }
14770            .into())
14771        } else if self.parse_keyword(Keyword::MERGE) {
14772            Ok(Query {
14773                with,
14774                body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14775                limit_clause: None,
14776                order_by: None,
14777                fetch: None,
14778                locks: vec![],
14779                for_clause: None,
14780                settings: None,
14781                format_clause: None,
14782                pipe_operators: vec![],
14783            }
14784            .into())
14785        } else {
14786            let body = self.parse_query_body(self.dialect.prec_unknown())?;
14787
14788            let order_by = self.parse_optional_order_by()?;
14789
14790            let limit_clause = self.parse_optional_limit_clause()?;
14791
14792            let settings = self.parse_settings()?;
14793
14794            let fetch = if self.parse_keyword(Keyword::FETCH) {
14795                Some(self.parse_fetch()?)
14796            } else {
14797                None
14798            };
14799
14800            let mut for_clause = None;
14801            let mut locks = Vec::new();
14802            while self.parse_keyword(Keyword::FOR) {
14803                if let Some(parsed_for_clause) = self.parse_for_clause()? {
14804                    for_clause = Some(parsed_for_clause);
14805                    break;
14806                } else {
14807                    locks.push(self.parse_lock()?);
14808                }
14809            }
14810            let format_clause =
14811                if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14812                    if self.parse_keyword(Keyword::NULL) {
14813                        Some(FormatClause::Null)
14814                    } else {
14815                        let ident = self.parse_identifier()?;
14816                        Some(FormatClause::Identifier(ident))
14817                    }
14818                } else {
14819                    None
14820                };
14821
14822            let pipe_operators = if self.dialect.supports_pipe_operator() {
14823                self.parse_pipe_operators()?
14824            } else {
14825                Vec::new()
14826            };
14827
14828            Ok(Query {
14829                with,
14830                body,
14831                order_by,
14832                limit_clause,
14833                fetch,
14834                locks,
14835                for_clause,
14836                settings,
14837                format_clause,
14838                pipe_operators,
14839            }
14840            .into())
14841        }
14842    }
14843
14844    fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14845        let mut pipe_operators = Vec::new();
14846
14847        while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14848            let kw = self.expect_one_of_keywords(&[
14849                Keyword::SELECT,
14850                Keyword::EXTEND,
14851                Keyword::SET,
14852                Keyword::DROP,
14853                Keyword::AS,
14854                Keyword::WHERE,
14855                Keyword::LIMIT,
14856                Keyword::AGGREGATE,
14857                Keyword::ORDER,
14858                Keyword::TABLESAMPLE,
14859                Keyword::RENAME,
14860                Keyword::UNION,
14861                Keyword::INTERSECT,
14862                Keyword::EXCEPT,
14863                Keyword::CALL,
14864                Keyword::PIVOT,
14865                Keyword::UNPIVOT,
14866                Keyword::JOIN,
14867                Keyword::INNER,
14868                Keyword::LEFT,
14869                Keyword::RIGHT,
14870                Keyword::FULL,
14871                Keyword::CROSS,
14872            ])?;
14873            match kw {
14874                Keyword::SELECT => {
14875                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14876                    pipe_operators.push(PipeOperator::Select { exprs })
14877                }
14878                Keyword::EXTEND => {
14879                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14880                    pipe_operators.push(PipeOperator::Extend { exprs })
14881                }
14882                Keyword::SET => {
14883                    let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14884                    pipe_operators.push(PipeOperator::Set { assignments })
14885                }
14886                Keyword::DROP => {
14887                    let columns = self.parse_identifiers()?;
14888                    pipe_operators.push(PipeOperator::Drop { columns })
14889                }
14890                Keyword::AS => {
14891                    let alias = self.parse_identifier()?;
14892                    pipe_operators.push(PipeOperator::As { alias })
14893                }
14894                Keyword::WHERE => {
14895                    let expr = self.parse_expr()?;
14896                    pipe_operators.push(PipeOperator::Where { expr })
14897                }
14898                Keyword::LIMIT => {
14899                    let expr = self.parse_expr()?;
14900                    let offset = if self.parse_keyword(Keyword::OFFSET) {
14901                        Some(self.parse_expr()?)
14902                    } else {
14903                        None
14904                    };
14905                    pipe_operators.push(PipeOperator::Limit { expr, offset })
14906                }
14907                Keyword::AGGREGATE => {
14908                    let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14909                        vec![]
14910                    } else {
14911                        self.parse_comma_separated(|parser| {
14912                            parser.parse_expr_with_alias_and_order_by()
14913                        })?
14914                    };
14915
14916                    let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14917                        self.parse_comma_separated(|parser| {
14918                            parser.parse_expr_with_alias_and_order_by()
14919                        })?
14920                    } else {
14921                        vec![]
14922                    };
14923
14924                    pipe_operators.push(PipeOperator::Aggregate {
14925                        full_table_exprs,
14926                        group_by_expr,
14927                    })
14928                }
14929                Keyword::ORDER => {
14930                    self.expect_one_of_keywords(&[Keyword::BY])?;
14931                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14932                    pipe_operators.push(PipeOperator::OrderBy { exprs })
14933                }
14934                Keyword::TABLESAMPLE => {
14935                    let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14936                    pipe_operators.push(PipeOperator::TableSample { sample });
14937                }
14938                Keyword::RENAME => {
14939                    let mappings =
14940                        self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14941                    pipe_operators.push(PipeOperator::Rename { mappings });
14942                }
14943                Keyword::UNION => {
14944                    let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14945                    let queries = self.parse_pipe_operator_queries()?;
14946                    pipe_operators.push(PipeOperator::Union {
14947                        set_quantifier,
14948                        queries,
14949                    });
14950                }
14951                Keyword::INTERSECT => {
14952                    let set_quantifier =
14953                        self.parse_distinct_required_set_quantifier("INTERSECT")?;
14954                    let queries = self.parse_pipe_operator_queries()?;
14955                    pipe_operators.push(PipeOperator::Intersect {
14956                        set_quantifier,
14957                        queries,
14958                    });
14959                }
14960                Keyword::EXCEPT => {
14961                    let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14962                    let queries = self.parse_pipe_operator_queries()?;
14963                    pipe_operators.push(PipeOperator::Except {
14964                        set_quantifier,
14965                        queries,
14966                    });
14967                }
14968                Keyword::CALL => {
14969                    let function_name = self.parse_object_name(false)?;
14970                    let function_expr = self.parse_function(function_name)?;
14971                    if let Expr::Function(function) = function_expr {
14972                        let alias = self.parse_identifier_optional_alias()?;
14973                        pipe_operators.push(PipeOperator::Call { function, alias });
14974                    } else {
14975                        return Err(ParserError::ParserError(
14976                            "Expected function call after CALL".to_string(),
14977                        ));
14978                    }
14979                }
14980                Keyword::PIVOT => {
14981                    self.expect_token(&Token::LParen)?;
14982                    let aggregate_functions =
14983                        self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14984                    self.expect_keyword_is(Keyword::FOR)?;
14985                    let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14986                    self.expect_keyword_is(Keyword::IN)?;
14987
14988                    self.expect_token(&Token::LParen)?;
14989                    let value_source = if self.parse_keyword(Keyword::ANY) {
14990                        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14991                            self.parse_comma_separated(Parser::parse_order_by_expr)?
14992                        } else {
14993                            vec![]
14994                        };
14995                        PivotValueSource::Any(order_by)
14996                    } else if self.peek_sub_query() {
14997                        PivotValueSource::Subquery(self.parse_query()?)
14998                    } else {
14999                        PivotValueSource::List(
15000                            self.parse_comma_separated(Self::parse_expr_with_alias)?,
15001                        )
15002                    };
15003                    self.expect_token(&Token::RParen)?;
15004                    self.expect_token(&Token::RParen)?;
15005
15006                    let alias = self.parse_identifier_optional_alias()?;
15007
15008                    pipe_operators.push(PipeOperator::Pivot {
15009                        aggregate_functions,
15010                        value_column,
15011                        value_source,
15012                        alias,
15013                    });
15014                }
15015                Keyword::UNPIVOT => {
15016                    self.expect_token(&Token::LParen)?;
15017                    let value_column = self.parse_identifier()?;
15018                    self.expect_keyword(Keyword::FOR)?;
15019                    let name_column = self.parse_identifier()?;
15020                    self.expect_keyword(Keyword::IN)?;
15021
15022                    self.expect_token(&Token::LParen)?;
15023                    let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
15024                    self.expect_token(&Token::RParen)?;
15025
15026                    self.expect_token(&Token::RParen)?;
15027
15028                    let alias = self.parse_identifier_optional_alias()?;
15029
15030                    pipe_operators.push(PipeOperator::Unpivot {
15031                        value_column,
15032                        name_column,
15033                        unpivot_columns,
15034                        alias,
15035                    });
15036                }
15037                Keyword::JOIN
15038                | Keyword::INNER
15039                | Keyword::LEFT
15040                | Keyword::RIGHT
15041                | Keyword::FULL
15042                | Keyword::CROSS => {
15043                    self.prev_token();
15044                    let mut joins = self.parse_joins()?;
15045                    if joins.len() != 1 {
15046                        return Err(ParserError::ParserError(
15047                            "Join pipe operator must have a single join".to_string(),
15048                        ));
15049                    }
15050                    let join = joins.swap_remove(0);
15051                    pipe_operators.push(PipeOperator::Join(join))
15052                }
15053                unhandled => {
15054                    return Err(ParserError::ParserError(format!(
15055                    "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
15056                )))
15057                }
15058            }
15059        }
15060        Ok(pipe_operators)
15061    }
15062
15063    fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
15064        let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
15065        {
15066            let key_values = self.parse_comma_separated(|p| {
15067                let key = p.parse_identifier()?;
15068                p.expect_token(&Token::Eq)?;
15069                let value = p.parse_expr()?;
15070                Ok(Setting { key, value })
15071            })?;
15072            Some(key_values)
15073        } else {
15074            None
15075        };
15076        Ok(settings)
15077    }
15078
15079    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
15080    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
15081        if self.parse_keyword(Keyword::XML) {
15082            Ok(Some(self.parse_for_xml()?))
15083        } else if self.parse_keyword(Keyword::JSON) {
15084            Ok(Some(self.parse_for_json()?))
15085        } else if self.parse_keyword(Keyword::BROWSE) {
15086            Ok(Some(ForClause::Browse))
15087        } else {
15088            Ok(None)
15089        }
15090    }
15091
15092    /// Parse a mssql `FOR XML` clause
15093    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
15094        let for_xml = if self.parse_keyword(Keyword::RAW) {
15095            let mut element_name = None;
15096            if self.peek_token_ref().token == Token::LParen {
15097                self.expect_token(&Token::LParen)?;
15098                element_name = Some(self.parse_literal_string()?);
15099                self.expect_token(&Token::RParen)?;
15100            }
15101            ForXml::Raw(element_name)
15102        } else if self.parse_keyword(Keyword::AUTO) {
15103            ForXml::Auto
15104        } else if self.parse_keyword(Keyword::EXPLICIT) {
15105            ForXml::Explicit
15106        } else if self.parse_keyword(Keyword::PATH) {
15107            let mut element_name = None;
15108            if self.peek_token_ref().token == Token::LParen {
15109                self.expect_token(&Token::LParen)?;
15110                element_name = Some(self.parse_literal_string()?);
15111                self.expect_token(&Token::RParen)?;
15112            }
15113            ForXml::Path(element_name)
15114        } else {
15115            return Err(ParserError::ParserError(
15116                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
15117            ));
15118        };
15119        let mut elements = false;
15120        let mut binary_base64 = false;
15121        let mut root = None;
15122        let mut r#type = false;
15123        while self.peek_token_ref().token == Token::Comma {
15124            self.next_token();
15125            if self.parse_keyword(Keyword::ELEMENTS) {
15126                elements = true;
15127            } else if self.parse_keyword(Keyword::BINARY) {
15128                self.expect_keyword_is(Keyword::BASE64)?;
15129                binary_base64 = true;
15130            } else if self.parse_keyword(Keyword::ROOT) {
15131                self.expect_token(&Token::LParen)?;
15132                root = Some(self.parse_literal_string()?);
15133                self.expect_token(&Token::RParen)?;
15134            } else if self.parse_keyword(Keyword::TYPE) {
15135                r#type = true;
15136            }
15137        }
15138        Ok(ForClause::Xml {
15139            for_xml,
15140            elements,
15141            binary_base64,
15142            root,
15143            r#type,
15144        })
15145    }
15146
15147    /// Parse a mssql `FOR JSON` clause
15148    pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
15149        let for_json = if self.parse_keyword(Keyword::AUTO) {
15150            ForJson::Auto
15151        } else if self.parse_keyword(Keyword::PATH) {
15152            ForJson::Path
15153        } else {
15154            return Err(ParserError::ParserError(
15155                "Expected FOR JSON [AUTO | PATH ]".to_string(),
15156            ));
15157        };
15158        let mut root = None;
15159        let mut include_null_values = false;
15160        let mut without_array_wrapper = false;
15161        while self.peek_token_ref().token == Token::Comma {
15162            self.next_token();
15163            if self.parse_keyword(Keyword::ROOT) {
15164                self.expect_token(&Token::LParen)?;
15165                root = Some(self.parse_literal_string()?);
15166                self.expect_token(&Token::RParen)?;
15167            } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
15168                include_null_values = true;
15169            } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
15170                without_array_wrapper = true;
15171            }
15172        }
15173        Ok(ForClause::Json {
15174            for_json,
15175            root,
15176            include_null_values,
15177            without_array_wrapper,
15178        })
15179    }
15180
15181    /// Parse a CTE (`alias [( col1, col2, ... )] [AS] (subquery)`)
15182    pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
15183        let name = self.parse_identifier()?;
15184
15185        let as_optional = self.dialect.supports_cte_without_as();
15186
15187        // If AS is optional, first try to parse `name (query)` directly
15188        if as_optional && !self.peek_keyword(Keyword::AS) {
15189            if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
15190                p.expect_token(&Token::LParen)?;
15191                let query = p.parse_query()?;
15192                let closing_paren_token = p.expect_token(&Token::RParen)?;
15193                Ok((query, closing_paren_token))
15194            })? {
15195                let mut cte = Cte {
15196                    alias: TableAlias {
15197                        explicit: false,
15198                        name,
15199                        columns: vec![],
15200                    },
15201                    query,
15202                    from: None,
15203                    materialized: None,
15204                    closing_paren_token: closing_paren_token.into(),
15205                };
15206                if self.parse_keyword(Keyword::FROM) {
15207                    cte.from = Some(self.parse_identifier()?);
15208                }
15209                return Ok(cte);
15210            }
15211        }
15212
15213        // Determine column definitions and consume AS
15214        let columns = if self.parse_keyword(Keyword::AS) {
15215            vec![]
15216        } else {
15217            let columns = self.parse_table_alias_column_defs()?;
15218            if as_optional {
15219                let _ = self.parse_keyword(Keyword::AS);
15220            } else {
15221                self.expect_keyword_is(Keyword::AS)?;
15222            }
15223            columns
15224        };
15225
15226        let mut is_materialized = None;
15227        if dialect_of!(self is PostgreSqlDialect) {
15228            if self.parse_keyword(Keyword::MATERIALIZED) {
15229                is_materialized = Some(CteAsMaterialized::Materialized);
15230            } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
15231                is_materialized = Some(CteAsMaterialized::NotMaterialized);
15232            }
15233        }
15234
15235        self.expect_token(&Token::LParen)?;
15236        let query = self.parse_query()?;
15237        let closing_paren_token = self.expect_token(&Token::RParen)?;
15238
15239        let mut cte = Cte {
15240            alias: TableAlias {
15241                explicit: false,
15242                name,
15243                columns,
15244            },
15245            query,
15246            from: None,
15247            materialized: is_materialized,
15248            closing_paren_token: closing_paren_token.into(),
15249        };
15250        if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
15251            cte.from = Some(self.parse_identifier()?);
15252        }
15253        Ok(cte)
15254    }
15255
15256    /// Parse a "query body", which is an expression with roughly the
15257    /// following grammar:
15258    /// ```sql
15259    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
15260    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
15261    ///   subquery ::= query_body [ order_by_limit ]
15262    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
15263    /// ```
15264    pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
15265        // We parse the expression using a Pratt parser, as in `parse_expr()`.
15266        // Start by parsing a restricted SELECT or a `(subquery)`:
15267        let expr = if self.peek_keyword(Keyword::SELECT)
15268            || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
15269        {
15270            SetExpr::Select(self.parse_select().map(Box::new)?)
15271        } else if self.consume_token(&Token::LParen) {
15272            // CTEs are not allowed here, but the parser currently accepts them
15273            let subquery = self.parse_query()?;
15274            self.expect_token(&Token::RParen)?;
15275            SetExpr::Query(subquery)
15276        } else if self.parse_keyword(Keyword::VALUES) {
15277            let is_mysql = dialect_of!(self is MySqlDialect);
15278            SetExpr::Values(self.parse_values(is_mysql, false)?)
15279        } else if self.parse_keyword(Keyword::VALUE) {
15280            let is_mysql = dialect_of!(self is MySqlDialect);
15281            SetExpr::Values(self.parse_values(is_mysql, true)?)
15282        } else if self.parse_keyword(Keyword::TABLE) {
15283            SetExpr::Table(Box::new(self.parse_as_table()?))
15284        } else {
15285            return self.expected_ref(
15286                "SELECT, VALUES, or a subquery in the query body",
15287                self.peek_token_ref(),
15288            );
15289        };
15290
15291        self.parse_remaining_set_exprs(expr, precedence)
15292    }
15293
15294    /// Parse any extra set expressions that may be present in a query body
15295    ///
15296    /// (this is its own function to reduce required stack size in debug builds)
15297    fn parse_remaining_set_exprs(
15298        &mut self,
15299        mut expr: SetExpr,
15300        precedence: u8,
15301    ) -> Result<Box<SetExpr>, ParserError> {
15302        loop {
15303            // The query can be optionally followed by a set operator:
15304            let op = self.parse_set_operator(&self.peek_token().token);
15305            let next_precedence = match op {
15306                // UNION and EXCEPT have the same binding power and evaluate left-to-right
15307                Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
15308                    10
15309                }
15310                // INTERSECT has higher precedence than UNION/EXCEPT
15311                Some(SetOperator::Intersect) => 20,
15312                // Unexpected token or EOF => stop parsing the query body
15313                None => break,
15314            };
15315            if precedence >= next_precedence {
15316                break;
15317            }
15318            self.next_token(); // skip past the set operator
15319            let set_quantifier = self.parse_set_quantifier(&op);
15320            expr = SetExpr::SetOperation {
15321                left: Box::new(expr),
15322                op: op.unwrap(),
15323                set_quantifier,
15324                right: self.parse_query_body(next_precedence)?,
15325            };
15326        }
15327
15328        Ok(expr.into())
15329    }
15330
15331    /// Parse a set operator token into its `SetOperator` variant.
15332    pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
15333        match token {
15334            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
15335            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
15336            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
15337            Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
15338            _ => None,
15339        }
15340    }
15341
15342    /// Parse a set quantifier (e.g., `ALL`, `DISTINCT BY NAME`) for the given set operator.
15343    pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
15344        match op {
15345            Some(
15346                SetOperator::Except
15347                | SetOperator::Intersect
15348                | SetOperator::Union
15349                | SetOperator::Minus,
15350            ) => {
15351                if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
15352                    SetQuantifier::DistinctByName
15353                } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15354                    SetQuantifier::ByName
15355                } else if self.parse_keyword(Keyword::ALL) {
15356                    if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15357                        SetQuantifier::AllByName
15358                    } else {
15359                        SetQuantifier::All
15360                    }
15361                } else if self.parse_keyword(Keyword::DISTINCT) {
15362                    SetQuantifier::Distinct
15363                } else {
15364                    SetQuantifier::None
15365                }
15366            }
15367            _ => SetQuantifier::None,
15368        }
15369    }
15370
15371    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`)
15372    pub fn parse_select(&mut self) -> Result<Select, ParserError> {
15373        let mut from_first = None;
15374
15375        if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
15376            let from_token = self.expect_keyword(Keyword::FROM)?;
15377            let from = self.parse_table_with_joins()?;
15378            if !self.peek_keyword(Keyword::SELECT) {
15379                return Ok(Select {
15380                    select_token: AttachedToken(from_token),
15381                    optimizer_hints: vec![],
15382                    distinct: None,
15383                    select_modifiers: None,
15384                    top: None,
15385                    top_before_distinct: false,
15386                    projection: vec![],
15387                    exclude: None,
15388                    into: None,
15389                    from,
15390                    lateral_views: vec![],
15391                    prewhere: None,
15392                    selection: None,
15393                    group_by: GroupByExpr::Expressions(vec![], vec![]),
15394                    cluster_by: vec![],
15395                    distribute_by: vec![],
15396                    sort_by: vec![],
15397                    having: None,
15398                    named_window: vec![],
15399                    window_before_qualify: false,
15400                    qualify: None,
15401                    value_table_mode: None,
15402                    connect_by: vec![],
15403                    flavor: SelectFlavor::FromFirstNoSelect,
15404                });
15405            }
15406            from_first = Some(from);
15407        }
15408
15409        let select_token = self.expect_keyword(Keyword::SELECT)?;
15410        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
15411        let value_table_mode = self.parse_value_table_mode()?;
15412
15413        let (select_modifiers, distinct_select_modifier) =
15414            if self.dialect.supports_select_modifiers() {
15415                self.parse_select_modifiers()?
15416            } else {
15417                (None, None)
15418            };
15419
15420        let mut top_before_distinct = false;
15421        let mut top = None;
15422        if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15423            top = Some(self.parse_top()?);
15424            top_before_distinct = true;
15425        }
15426
15427        let distinct = if distinct_select_modifier.is_some() {
15428            distinct_select_modifier
15429        } else {
15430            self.parse_all_or_distinct()?
15431        };
15432
15433        if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15434            top = Some(self.parse_top()?);
15435        }
15436
15437        let projection =
15438            if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
15439                vec![]
15440            } else {
15441                self.parse_projection()?
15442            };
15443
15444        let exclude = if self.dialect.supports_select_exclude() {
15445            self.parse_optional_select_item_exclude()?
15446        } else {
15447            None
15448        };
15449
15450        let into = if self.parse_keyword(Keyword::INTO) {
15451            Some(self.parse_select_into()?)
15452        } else {
15453            None
15454        };
15455
15456        // Note that for keywords to be properly handled here, they need to be
15457        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
15458        // otherwise they may be parsed as an alias as part of the `projection`
15459        // or `from`.
15460
15461        let (from, from_first) = if let Some(from) = from_first.take() {
15462            (from, true)
15463        } else if self.parse_keyword(Keyword::FROM) {
15464            (self.parse_table_with_joins()?, false)
15465        } else {
15466            (vec![], false)
15467        };
15468
15469        let mut lateral_views = vec![];
15470        loop {
15471            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
15472                let outer = self.parse_keyword(Keyword::OUTER);
15473                let lateral_view = self.parse_expr()?;
15474                let lateral_view_name = self.parse_object_name(false)?;
15475                let lateral_col_alias = self
15476                    .parse_comma_separated(|parser| {
15477                        parser.parse_optional_alias(&[
15478                            Keyword::WHERE,
15479                            Keyword::GROUP,
15480                            Keyword::CLUSTER,
15481                            Keyword::HAVING,
15482                            Keyword::LATERAL,
15483                        ]) // This couldn't possibly be a bad idea
15484                    })?
15485                    .into_iter()
15486                    .flatten()
15487                    .collect();
15488
15489                lateral_views.push(LateralView {
15490                    lateral_view,
15491                    lateral_view_name,
15492                    lateral_col_alias,
15493                    outer,
15494                });
15495            } else {
15496                break;
15497            }
15498        }
15499
15500        let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
15501        {
15502            Some(self.parse_expr()?)
15503        } else {
15504            None
15505        };
15506
15507        let selection = if self.parse_keyword(Keyword::WHERE) {
15508            Some(self.parse_expr()?)
15509        } else {
15510            None
15511        };
15512
15513        let connect_by = self.maybe_parse_connect_by()?;
15514
15515        let group_by = self
15516            .parse_optional_group_by()?
15517            .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
15518
15519        let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
15520            self.parse_comma_separated(Parser::parse_expr)?
15521        } else {
15522            vec![]
15523        };
15524
15525        let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
15526            self.parse_comma_separated(Parser::parse_expr)?
15527        } else {
15528            vec![]
15529        };
15530
15531        let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
15532            self.parse_comma_separated(Parser::parse_order_by_expr)?
15533        } else {
15534            vec![]
15535        };
15536
15537        let having = if self.parse_keyword(Keyword::HAVING) {
15538            Some(self.parse_expr()?)
15539        } else {
15540            None
15541        };
15542
15543        // Accept QUALIFY and WINDOW in any order and flag accordingly.
15544        let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
15545        {
15546            let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
15547            if self.parse_keyword(Keyword::QUALIFY) {
15548                (named_windows, Some(self.parse_expr()?), true)
15549            } else {
15550                (named_windows, None, true)
15551            }
15552        } else if self.parse_keyword(Keyword::QUALIFY) {
15553            let qualify = Some(self.parse_expr()?);
15554            if self.parse_keyword(Keyword::WINDOW) {
15555                (
15556                    self.parse_comma_separated(Parser::parse_named_window)?,
15557                    qualify,
15558                    false,
15559                )
15560            } else {
15561                (Default::default(), qualify, false)
15562            }
15563        } else {
15564            Default::default()
15565        };
15566
15567        Ok(Select {
15568            select_token: AttachedToken(select_token),
15569            optimizer_hints,
15570            distinct,
15571            select_modifiers,
15572            top,
15573            top_before_distinct,
15574            projection,
15575            exclude,
15576            into,
15577            from,
15578            lateral_views,
15579            prewhere,
15580            selection,
15581            group_by,
15582            cluster_by,
15583            distribute_by,
15584            sort_by,
15585            having,
15586            named_window: named_windows,
15587            window_before_qualify,
15588            qualify,
15589            value_table_mode,
15590            connect_by,
15591            flavor: if from_first {
15592                SelectFlavor::FromFirst
15593            } else {
15594                SelectFlavor::Standard
15595            },
15596        })
15597    }
15598
15599    /// Parses optimizer hints at the current token position.
15600    ///
15601    /// Collects all `/*prefix+...*/` and `--prefix+...` patterns.
15602    /// The `prefix` is any run of ASCII alphanumeric characters between the
15603    /// comment marker and `+` (e.g. `""` for `/*+...*/`, `"abc"` for `/*abc+...*/`).
15604    ///
15605    /// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/optimizer-hints.html#optimizer-hints-overview)
15606    /// [Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E)
15607    fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15608        let supports_hints = self.dialect.supports_comment_optimizer_hint();
15609        if !supports_hints {
15610            return Ok(vec![]);
15611        }
15612        let mut hints = vec![];
15613        loop {
15614            let t = self.peek_nth_token_no_skip_ref(0);
15615            let Token::Whitespace(ws) = &t.token else {
15616                break;
15617            };
15618            match ws {
15619                Whitespace::SingleLineComment { comment, prefix } => {
15620                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15621                        hints.push(OptimizerHint {
15622                            prefix: hint_prefix,
15623                            text,
15624                            style: OptimizerHintStyle::SingleLine {
15625                                prefix: prefix.clone(),
15626                            },
15627                        });
15628                    }
15629                    self.next_token_no_skip();
15630                }
15631                Whitespace::MultiLineComment(comment) => {
15632                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15633                        hints.push(OptimizerHint {
15634                            prefix: hint_prefix,
15635                            text,
15636                            style: OptimizerHintStyle::MultiLine,
15637                        });
15638                    }
15639                    self.next_token_no_skip();
15640                }
15641                Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15642                    self.next_token_no_skip();
15643                }
15644            }
15645        }
15646        Ok(hints)
15647    }
15648
15649    /// Checks if a comment's content starts with `[ASCII-alphanumeric]*+`
15650    /// and returns `(prefix, text_after_plus)` if so.
15651    fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15652        let (before_plus, text) = comment.split_once('+')?;
15653        if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15654            Some((before_plus.to_string(), text.to_string()))
15655        } else {
15656            None
15657        }
15658    }
15659
15660    /// Parses MySQL SELECT modifiers and DISTINCT/ALL in any order.
15661    ///
15662    /// Manual testing shows odifiers can appear in any order, and modifiers other than DISTINCT/ALL
15663    /// can be repeated.
15664    ///
15665    /// <https://dev.mysql.com/doc/refman/8.4/en/select.html>
15666    fn parse_select_modifiers(
15667        &mut self,
15668    ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15669        let mut modifiers = SelectModifiers::default();
15670        let mut distinct = None;
15671
15672        let keywords = &[
15673            Keyword::ALL,
15674            Keyword::DISTINCT,
15675            Keyword::DISTINCTROW,
15676            Keyword::HIGH_PRIORITY,
15677            Keyword::STRAIGHT_JOIN,
15678            Keyword::SQL_SMALL_RESULT,
15679            Keyword::SQL_BIG_RESULT,
15680            Keyword::SQL_BUFFER_RESULT,
15681            Keyword::SQL_NO_CACHE,
15682            Keyword::SQL_CALC_FOUND_ROWS,
15683        ];
15684
15685        while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15686            match keyword {
15687                Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15688                    self.prev_token();
15689                    distinct = self.parse_all_or_distinct()?;
15690                }
15691                // DISTINCTROW is a MySQL-specific legacy (but not deprecated) alias for DISTINCT
15692                Keyword::DISTINCTROW if distinct.is_none() => {
15693                    distinct = Some(Distinct::Distinct);
15694                }
15695                Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15696                Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15697                Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15698                Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15699                Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15700                Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15701                Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15702                _ => {
15703                    self.prev_token();
15704                    return self.expected_ref(
15705                        "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15706                        self.peek_token_ref(),
15707                    );
15708                }
15709            }
15710        }
15711
15712        // Avoid polluting the AST with `Some(SelectModifiers::default())` empty value unless there
15713        // actually were some modifiers set.
15714        let select_modifiers = if modifiers.is_any_set() {
15715            Some(modifiers)
15716        } else {
15717            None
15718        };
15719        Ok((select_modifiers, distinct))
15720    }
15721
15722    fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15723        if !dialect_of!(self is BigQueryDialect) {
15724            return Ok(None);
15725        }
15726
15727        let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15728            Some(ValueTableMode::DistinctAsValue)
15729        } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15730            Some(ValueTableMode::DistinctAsStruct)
15731        } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15732            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15733        {
15734            Some(ValueTableMode::AsValue)
15735        } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15736            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15737        {
15738            Some(ValueTableMode::AsStruct)
15739        } else if self.parse_keyword(Keyword::AS) {
15740            self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15741        } else {
15742            None
15743        };
15744
15745        Ok(mode)
15746    }
15747
15748    /// Invoke `f` after first setting the parser's `ParserState` to `state`.
15749    ///
15750    /// Upon return, restores the parser's state to what it started at.
15751    fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15752    where
15753        F: FnMut(&mut Parser) -> Result<T, ParserError>,
15754    {
15755        let current_state = self.state;
15756        self.state = state;
15757        let res = f(self);
15758        self.state = current_state;
15759        res
15760    }
15761
15762    /// Parse a `CONNECT BY` clause (Oracle-style hierarchical query support).
15763    pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15764        let mut clauses = Vec::with_capacity(2);
15765        loop {
15766            if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15767                clauses.push(ConnectByKind::StartWith {
15768                    start_token: self.token_at(idx).clone().into(),
15769                    condition: self.parse_expr()?.into(),
15770                });
15771            } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15772            {
15773                clauses.push(ConnectByKind::ConnectBy {
15774                    connect_token: self.token_at(idx).clone().into(),
15775                    nocycle: self.parse_keyword(Keyword::NOCYCLE),
15776                    relationships: self.with_state(ParserState::ConnectBy, |parser| {
15777                        parser.parse_comma_separated(Parser::parse_expr)
15778                    })?,
15779                });
15780            } else {
15781                break;
15782            }
15783        }
15784        Ok(clauses)
15785    }
15786
15787    /// Parse `CREATE TABLE x AS TABLE y`
15788    pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15789        let token1 = self.next_token();
15790        let token2 = self.next_token();
15791        let token3 = self.next_token();
15792
15793        let table_name;
15794        let schema_name;
15795        if token2 == Token::Period {
15796            match token1.token {
15797                Token::Word(w) => {
15798                    schema_name = w.value;
15799                }
15800                _ => {
15801                    return self.expected("Schema name", token1);
15802                }
15803            }
15804            match token3.token {
15805                Token::Word(w) => {
15806                    table_name = w.value;
15807                }
15808                _ => {
15809                    return self.expected("Table name", token3);
15810                }
15811            }
15812            Ok(Table {
15813                table_name: Some(table_name),
15814                schema_name: Some(schema_name),
15815            })
15816        } else {
15817            match token1.token {
15818                Token::Word(w) => {
15819                    table_name = w.value;
15820                }
15821                _ => {
15822                    return self.expected("Table name", token1);
15823                }
15824            }
15825            Ok(Table {
15826                table_name: Some(table_name),
15827                schema_name: None,
15828            })
15829        }
15830    }
15831
15832    /// Parse a `SET ROLE` statement. Expects SET to be consumed already.
15833    fn parse_set_role(
15834        &mut self,
15835        modifier: Option<ContextModifier>,
15836    ) -> Result<Statement, ParserError> {
15837        self.expect_keyword_is(Keyword::ROLE)?;
15838
15839        let role_name = if self.parse_keyword(Keyword::NONE) {
15840            None
15841        } else {
15842            Some(self.parse_identifier()?)
15843        };
15844        Ok(Statement::Set(Set::SetRole {
15845            context_modifier: modifier,
15846            role_name,
15847        }))
15848    }
15849
15850    fn parse_set_values(
15851        &mut self,
15852        parenthesized_assignment: bool,
15853    ) -> Result<Vec<Expr>, ParserError> {
15854        let mut values = vec![];
15855
15856        if parenthesized_assignment {
15857            self.expect_token(&Token::LParen)?;
15858        }
15859
15860        loop {
15861            let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15862                expr
15863            } else if let Ok(expr) = self.parse_expr() {
15864                expr
15865            } else {
15866                self.expected_ref("variable value", self.peek_token_ref())?
15867            };
15868
15869            values.push(value);
15870            if self.consume_token(&Token::Comma) {
15871                continue;
15872            }
15873
15874            if parenthesized_assignment {
15875                self.expect_token(&Token::RParen)?;
15876            }
15877            return Ok(values);
15878        }
15879    }
15880
15881    fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15882        let modifier =
15883            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15884
15885        Self::keyword_to_modifier(modifier)
15886    }
15887
15888    /// Parse a single SET statement assignment `var = expr`.
15889    fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15890        let scope = self.parse_context_modifier();
15891
15892        let name = if self.dialect.supports_parenthesized_set_variables()
15893            && self.consume_token(&Token::LParen)
15894        {
15895            // Parenthesized assignments are handled in the `parse_set` function after
15896            // trying to parse list of assignments using this function.
15897            // If a dialect supports both, and we find a LParen, we early exit from this function.
15898            self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15899        } else {
15900            self.parse_object_name(false)?
15901        };
15902
15903        if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15904            return self.expected_ref("assignment operator", self.peek_token_ref());
15905        }
15906
15907        let value = self.parse_expr()?;
15908
15909        Ok(SetAssignment { scope, name, value })
15910    }
15911
15912    fn parse_set(&mut self) -> Result<Statement, ParserError> {
15913        let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15914
15915        // Modifier is either HIVEVAR: or a ContextModifier (LOCAL, SESSION, etc), not both
15916        let scope = if !hivevar {
15917            self.parse_context_modifier()
15918        } else {
15919            None
15920        };
15921
15922        if hivevar {
15923            self.expect_token(&Token::Colon)?;
15924        }
15925
15926        if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15927            return Ok(set_role_stmt);
15928        }
15929
15930        // Handle special cases first
15931        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15932            || self.parse_keyword(Keyword::TIMEZONE)
15933        {
15934            if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15935                return Ok(Set::SingleAssignment {
15936                    scope,
15937                    hivevar,
15938                    variable: ObjectName::from(vec!["TIMEZONE".into()]),
15939                    values: self.parse_set_values(false)?,
15940                }
15941                .into());
15942            } else {
15943                // A shorthand alias for SET TIME ZONE that doesn't require
15944                // the assignment operator. It's originally PostgreSQL specific,
15945                // but we allow it for all the dialects
15946                return Ok(Set::SetTimeZone {
15947                    local: scope == Some(ContextModifier::Local),
15948                    value: self.parse_expr()?,
15949                }
15950                .into());
15951            }
15952        } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15953            if self.parse_keyword(Keyword::DEFAULT) {
15954                return Ok(Set::SetNamesDefault {}.into());
15955            }
15956            let charset_name = self.parse_identifier()?;
15957            let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15958                Some(self.parse_literal_string()?)
15959            } else {
15960                None
15961            };
15962
15963            return Ok(Set::SetNames {
15964                charset_name,
15965                collation_name,
15966            }
15967            .into());
15968        } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15969            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15970            return Ok(Set::SetTransaction {
15971                modes: self.parse_transaction_modes()?,
15972                snapshot: None,
15973                session: true,
15974            }
15975            .into());
15976        } else if self.parse_keyword(Keyword::TRANSACTION) {
15977            if self.parse_keyword(Keyword::SNAPSHOT) {
15978                let snapshot_id = self.parse_value()?;
15979                return Ok(Set::SetTransaction {
15980                    modes: vec![],
15981                    snapshot: Some(snapshot_id),
15982                    session: false,
15983                }
15984                .into());
15985            }
15986            return Ok(Set::SetTransaction {
15987                modes: self.parse_transaction_modes()?,
15988                snapshot: None,
15989                session: false,
15990            }
15991            .into());
15992        } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15993            let scope = match scope {
15994                Some(s) => s,
15995                None => {
15996                    return self.expected_at(
15997                        "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15998                        self.get_current_index(),
15999                    )
16000                }
16001            };
16002            let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
16003                SetSessionAuthorizationParamKind::Default
16004            } else {
16005                let value = self.parse_identifier()?;
16006                SetSessionAuthorizationParamKind::User(value)
16007            };
16008            return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
16009                scope,
16010                kind: auth_value,
16011            })
16012            .into());
16013        }
16014
16015        if self.dialect.supports_comma_separated_set_assignments() {
16016            if scope.is_some() {
16017                self.prev_token();
16018            }
16019
16020            if let Some(assignments) = self
16021                .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
16022            {
16023                return if assignments.len() > 1 {
16024                    Ok(Set::MultipleAssignments { assignments }.into())
16025                } else {
16026                    let SetAssignment { scope, name, value } =
16027                        assignments.into_iter().next().ok_or_else(|| {
16028                            ParserError::ParserError("Expected at least one assignment".to_string())
16029                        })?;
16030
16031                    Ok(Set::SingleAssignment {
16032                        scope,
16033                        hivevar,
16034                        variable: name,
16035                        values: vec![value],
16036                    }
16037                    .into())
16038                };
16039            }
16040        }
16041
16042        let variables = if self.dialect.supports_parenthesized_set_variables()
16043            && self.consume_token(&Token::LParen)
16044        {
16045            let vars = OneOrManyWithParens::Many(
16046                self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
16047                    .into_iter()
16048                    .map(|ident| ObjectName::from(vec![ident]))
16049                    .collect(),
16050            );
16051            self.expect_token(&Token::RParen)?;
16052            vars
16053        } else {
16054            OneOrManyWithParens::One(self.parse_object_name(false)?)
16055        };
16056
16057        if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
16058            let stmt = match variables {
16059                OneOrManyWithParens::One(var) => Set::SingleAssignment {
16060                    scope,
16061                    hivevar,
16062                    variable: var,
16063                    values: self.parse_set_values(false)?,
16064                },
16065                OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
16066                    variables: vars,
16067                    values: self.parse_set_values(true)?,
16068                },
16069            };
16070
16071            return Ok(stmt.into());
16072        }
16073
16074        if self.dialect.supports_set_stmt_without_operator() {
16075            self.prev_token();
16076            return self.parse_set_session_params();
16077        };
16078
16079        self.expected_ref("equals sign or TO", self.peek_token_ref())
16080    }
16081
16082    /// Parse session parameter assignments after `SET` when no `=` or `TO` is present.
16083    pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
16084        if self.parse_keyword(Keyword::STATISTICS) {
16085            let topic = match self.parse_one_of_keywords(&[
16086                Keyword::IO,
16087                Keyword::PROFILE,
16088                Keyword::TIME,
16089                Keyword::XML,
16090            ]) {
16091                Some(Keyword::IO) => SessionParamStatsTopic::IO,
16092                Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
16093                Some(Keyword::TIME) => SessionParamStatsTopic::Time,
16094                Some(Keyword::XML) => SessionParamStatsTopic::Xml,
16095                _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
16096            };
16097            let value = self.parse_session_param_value()?;
16098            Ok(
16099                Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
16100                    topic,
16101                    value,
16102                }))
16103                .into(),
16104            )
16105        } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
16106            let obj = self.parse_object_name(false)?;
16107            let value = self.parse_session_param_value()?;
16108            Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
16109                SetSessionParamIdentityInsert { obj, value },
16110            ))
16111            .into())
16112        } else if self.parse_keyword(Keyword::OFFSETS) {
16113            let keywords = self.parse_comma_separated(|parser| {
16114                let next_token = parser.next_token();
16115                match &next_token.token {
16116                    Token::Word(w) => Ok(w.to_string()),
16117                    _ => parser.expected("SQL keyword", next_token),
16118                }
16119            })?;
16120            let value = self.parse_session_param_value()?;
16121            Ok(
16122                Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
16123                    keywords,
16124                    value,
16125                }))
16126                .into(),
16127            )
16128        } else {
16129            let names = self.parse_comma_separated(|parser| {
16130                let next_token = parser.next_token();
16131                match next_token.token {
16132                    Token::Word(w) => Ok(w.to_string()),
16133                    _ => parser.expected("Session param name", next_token),
16134                }
16135            })?;
16136            let value = self.parse_expr()?.to_string();
16137            Ok(
16138                Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
16139                    names,
16140                    value,
16141                }))
16142                .into(),
16143            )
16144        }
16145    }
16146
16147    fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
16148        if self.parse_keyword(Keyword::ON) {
16149            Ok(SessionParamValue::On)
16150        } else if self.parse_keyword(Keyword::OFF) {
16151            Ok(SessionParamValue::Off)
16152        } else {
16153            self.expected_ref("ON or OFF", self.peek_token_ref())
16154        }
16155    }
16156
16157    /// Parse a `SHOW` statement and dispatch to specific SHOW handlers.
16158    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
16159        let terse = self.parse_keyword(Keyword::TERSE);
16160        let extended = self.parse_keyword(Keyword::EXTENDED);
16161        let full = self.parse_keyword(Keyword::FULL);
16162        let session = self.parse_keyword(Keyword::SESSION);
16163        let global = self.parse_keyword(Keyword::GLOBAL);
16164        let external = self.parse_keyword(Keyword::EXTERNAL);
16165        if self
16166            .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
16167            .is_some()
16168        {
16169            Ok(self.parse_show_columns(extended, full)?)
16170        } else if self.parse_keyword(Keyword::TABLES) {
16171            Ok(self.parse_show_tables(terse, extended, full, external)?)
16172        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
16173            Ok(self.parse_show_views(terse, true)?)
16174        } else if self.parse_keyword(Keyword::VIEWS) {
16175            Ok(self.parse_show_views(terse, false)?)
16176        } else if self.parse_keyword(Keyword::FUNCTIONS) {
16177            Ok(self.parse_show_functions()?)
16178        } else if self.parse_keyword(Keyword::PROCESSLIST) {
16179            Ok(Statement::ShowProcessList { full })
16180        } else if extended || full {
16181            Err(ParserError::ParserError(
16182                "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
16183            ))
16184        } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
16185            Ok(self.parse_show_create()?)
16186        } else if self.parse_keyword(Keyword::COLLATION) {
16187            Ok(self.parse_show_collation()?)
16188        } else if self.parse_keyword(Keyword::VARIABLES)
16189            && dialect_of!(self is MySqlDialect | GenericDialect)
16190        {
16191            Ok(Statement::ShowVariables {
16192                filter: self.parse_show_statement_filter()?,
16193                session,
16194                global,
16195            })
16196        } else if self.parse_keyword(Keyword::STATUS)
16197            && dialect_of!(self is MySqlDialect | GenericDialect)
16198        {
16199            Ok(Statement::ShowStatus {
16200                filter: self.parse_show_statement_filter()?,
16201                session,
16202                global,
16203            })
16204        } else if self.parse_keyword(Keyword::CATALOGS) {
16205            self.parse_show_catalogs(terse)
16206        } else if self.parse_keyword(Keyword::DATABASES) {
16207            self.parse_show_databases(terse)
16208        } else if self.parse_keyword(Keyword::SCHEMAS) {
16209            self.parse_show_schemas(terse)
16210        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
16211            self.parse_show_charset(false)
16212        } else if self.parse_keyword(Keyword::CHARSET) {
16213            self.parse_show_charset(true)
16214        } else {
16215            Ok(Statement::ShowVariable {
16216                variable: self.parse_identifiers()?,
16217            })
16218        }
16219    }
16220
16221    fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
16222        // parse one of keywords
16223        Ok(Statement::ShowCharset(ShowCharset {
16224            is_shorthand,
16225            filter: self.parse_show_statement_filter()?,
16226        }))
16227    }
16228
16229    fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
16230        let history = self.parse_keyword(Keyword::HISTORY);
16231        let show_options = self.parse_show_stmt_options()?;
16232        Ok(Statement::ShowCatalogs {
16233            terse,
16234            history,
16235            show_options,
16236        })
16237    }
16238
16239    fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
16240        let history = self.parse_keyword(Keyword::HISTORY);
16241        let show_options = self.parse_show_stmt_options()?;
16242        Ok(Statement::ShowDatabases {
16243            terse,
16244            history,
16245            show_options,
16246        })
16247    }
16248
16249    fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
16250        let history = self.parse_keyword(Keyword::HISTORY);
16251        let show_options = self.parse_show_stmt_options()?;
16252        Ok(Statement::ShowSchemas {
16253            terse,
16254            history,
16255            show_options,
16256        })
16257    }
16258
16259    /// Parse `SHOW CREATE <object>` returning the corresponding `ShowCreate` statement.
16260    pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
16261        let obj_type = match self.expect_one_of_keywords(&[
16262            Keyword::TABLE,
16263            Keyword::TRIGGER,
16264            Keyword::FUNCTION,
16265            Keyword::PROCEDURE,
16266            Keyword::EVENT,
16267            Keyword::VIEW,
16268        ])? {
16269            Keyword::TABLE => Ok(ShowCreateObject::Table),
16270            Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
16271            Keyword::FUNCTION => Ok(ShowCreateObject::Function),
16272            Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
16273            Keyword::EVENT => Ok(ShowCreateObject::Event),
16274            Keyword::VIEW => Ok(ShowCreateObject::View),
16275            keyword => Err(ParserError::ParserError(format!(
16276                "Unable to map keyword to ShowCreateObject: {keyword:?}"
16277            ))),
16278        }?;
16279
16280        let obj_name = self.parse_object_name(false)?;
16281
16282        Ok(Statement::ShowCreate { obj_type, obj_name })
16283    }
16284
16285    /// Parse `SHOW COLUMNS`/`SHOW FIELDS` and return a `ShowColumns` statement.
16286    pub fn parse_show_columns(
16287        &mut self,
16288        extended: bool,
16289        full: bool,
16290    ) -> Result<Statement, ParserError> {
16291        let show_options = self.parse_show_stmt_options()?;
16292        Ok(Statement::ShowColumns {
16293            extended,
16294            full,
16295            show_options,
16296        })
16297    }
16298
16299    fn parse_show_tables(
16300        &mut self,
16301        terse: bool,
16302        extended: bool,
16303        full: bool,
16304        external: bool,
16305    ) -> Result<Statement, ParserError> {
16306        let history = !external && self.parse_keyword(Keyword::HISTORY);
16307        let show_options = self.parse_show_stmt_options()?;
16308        Ok(Statement::ShowTables {
16309            terse,
16310            history,
16311            extended,
16312            full,
16313            external,
16314            show_options,
16315        })
16316    }
16317
16318    fn parse_show_views(
16319        &mut self,
16320        terse: bool,
16321        materialized: bool,
16322    ) -> Result<Statement, ParserError> {
16323        let show_options = self.parse_show_stmt_options()?;
16324        Ok(Statement::ShowViews {
16325            materialized,
16326            terse,
16327            show_options,
16328        })
16329    }
16330
16331    /// Parse `SHOW FUNCTIONS` and optional filter.
16332    pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
16333        let filter = self.parse_show_statement_filter()?;
16334        Ok(Statement::ShowFunctions { filter })
16335    }
16336
16337    /// Parse `SHOW COLLATION` and optional filter.
16338    pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
16339        let filter = self.parse_show_statement_filter()?;
16340        Ok(Statement::ShowCollation { filter })
16341    }
16342
16343    /// Parse an optional filter used by `SHOW` statements (LIKE, ILIKE, WHERE, or literal).
16344    pub fn parse_show_statement_filter(
16345        &mut self,
16346    ) -> Result<Option<ShowStatementFilter>, ParserError> {
16347        if self.parse_keyword(Keyword::LIKE) {
16348            Ok(Some(ShowStatementFilter::Like(
16349                self.parse_literal_string()?,
16350            )))
16351        } else if self.parse_keyword(Keyword::ILIKE) {
16352            Ok(Some(ShowStatementFilter::ILike(
16353                self.parse_literal_string()?,
16354            )))
16355        } else if self.parse_keyword(Keyword::WHERE) {
16356            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
16357        } else {
16358            self.maybe_parse(|parser| -> Result<String, ParserError> {
16359                parser.parse_literal_string()
16360            })?
16361            .map_or(Ok(None), |filter| {
16362                Ok(Some(ShowStatementFilter::NoKeyword(filter)))
16363            })
16364        }
16365    }
16366
16367    /// Parse a `USE` statement (database/catalog/schema/warehouse/role selection).
16368    pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
16369        // Determine which keywords are recognized by the current dialect
16370        let parsed_keyword = if dialect_of!(self is HiveDialect) {
16371            // HiveDialect accepts USE DEFAULT; statement without any db specified
16372            if self.parse_keyword(Keyword::DEFAULT) {
16373                return Ok(Statement::Use(Use::Default));
16374            }
16375            None // HiveDialect doesn't expect any other specific keyword after `USE`
16376        } else if dialect_of!(self is DatabricksDialect) {
16377            self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
16378        } else if dialect_of!(self is SnowflakeDialect) {
16379            self.parse_one_of_keywords(&[
16380                Keyword::DATABASE,
16381                Keyword::SCHEMA,
16382                Keyword::WAREHOUSE,
16383                Keyword::ROLE,
16384                Keyword::SECONDARY,
16385            ])
16386        } else {
16387            None // No specific keywords for other dialects, including GenericDialect
16388        };
16389
16390        let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
16391            self.parse_secondary_roles()?
16392        } else {
16393            let obj_name = self.parse_object_name(false)?;
16394            match parsed_keyword {
16395                Some(Keyword::CATALOG) => Use::Catalog(obj_name),
16396                Some(Keyword::DATABASE) => Use::Database(obj_name),
16397                Some(Keyword::SCHEMA) => Use::Schema(obj_name),
16398                Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
16399                Some(Keyword::ROLE) => Use::Role(obj_name),
16400                _ => Use::Object(obj_name),
16401            }
16402        };
16403
16404        Ok(Statement::Use(result))
16405    }
16406
16407    fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
16408        self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
16409        if self.parse_keyword(Keyword::NONE) {
16410            Ok(Use::SecondaryRoles(SecondaryRoles::None))
16411        } else if self.parse_keyword(Keyword::ALL) {
16412            Ok(Use::SecondaryRoles(SecondaryRoles::All))
16413        } else {
16414            let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
16415            Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
16416        }
16417    }
16418
16419    /// Parse a table factor followed by any join clauses, returning `TableWithJoins`.
16420    pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
16421        let relation = self.parse_table_factor()?;
16422        // Note that for keywords to be properly handled here, they need to be
16423        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
16424        // a table alias.
16425        let joins = self.parse_joins()?;
16426        Ok(TableWithJoins { relation, joins })
16427    }
16428
16429    fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
16430        let mut joins = vec![];
16431        loop {
16432            let global = self.parse_keyword(Keyword::GLOBAL);
16433            let join = if self.parse_keyword(Keyword::CROSS) {
16434                let join_operator = if self.parse_keyword(Keyword::JOIN) {
16435                    JoinOperator::CrossJoin(JoinConstraint::None)
16436                } else if self.parse_keyword(Keyword::APPLY) {
16437                    // MSSQL extension, similar to CROSS JOIN LATERAL
16438                    JoinOperator::CrossApply
16439                } else {
16440                    return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
16441                };
16442                let relation = self.parse_table_factor()?;
16443                let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
16444                    && self.dialect.supports_cross_join_constraint()
16445                {
16446                    let constraint = self.parse_join_constraint(false)?;
16447                    JoinOperator::CrossJoin(constraint)
16448                } else {
16449                    join_operator
16450                };
16451                Join {
16452                    relation,
16453                    global,
16454                    join_operator,
16455                }
16456            } else if self.parse_keyword(Keyword::OUTER) {
16457                // MSSQL extension, similar to LEFT JOIN LATERAL .. ON 1=1
16458                self.expect_keyword_is(Keyword::APPLY)?;
16459                Join {
16460                    relation: self.parse_table_factor()?,
16461                    global,
16462                    join_operator: JoinOperator::OuterApply,
16463                }
16464            } else if self.parse_keyword(Keyword::ASOF) {
16465                self.expect_keyword_is(Keyword::JOIN)?;
16466                let relation = self.parse_table_factor()?;
16467                self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
16468                let match_condition = self.parse_parenthesized(Self::parse_expr)?;
16469                Join {
16470                    relation,
16471                    global,
16472                    join_operator: JoinOperator::AsOf {
16473                        match_condition,
16474                        constraint: self.parse_join_constraint(false)?,
16475                    },
16476                }
16477            } else {
16478                let natural = self.parse_keyword(Keyword::NATURAL);
16479                let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
16480                    w.keyword
16481                } else {
16482                    Keyword::NoKeyword
16483                };
16484
16485                let join_operator_type = match peek_keyword {
16486                    Keyword::INNER | Keyword::JOIN => {
16487                        let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
16488                        self.expect_keyword_is(Keyword::JOIN)?;
16489                        if inner {
16490                            JoinOperator::Inner
16491                        } else {
16492                            JoinOperator::Join
16493                        }
16494                    }
16495                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
16496                        let _ = self.next_token(); // consume LEFT/RIGHT
16497                        let is_left = kw == Keyword::LEFT;
16498                        let join_type = self.parse_one_of_keywords(&[
16499                            Keyword::OUTER,
16500                            Keyword::SEMI,
16501                            Keyword::ANTI,
16502                            Keyword::JOIN,
16503                        ]);
16504                        match join_type {
16505                            Some(Keyword::OUTER) => {
16506                                self.expect_keyword_is(Keyword::JOIN)?;
16507                                if is_left {
16508                                    JoinOperator::LeftOuter
16509                                } else {
16510                                    JoinOperator::RightOuter
16511                                }
16512                            }
16513                            Some(Keyword::SEMI) => {
16514                                self.expect_keyword_is(Keyword::JOIN)?;
16515                                if is_left {
16516                                    JoinOperator::LeftSemi
16517                                } else {
16518                                    JoinOperator::RightSemi
16519                                }
16520                            }
16521                            Some(Keyword::ANTI) => {
16522                                self.expect_keyword_is(Keyword::JOIN)?;
16523                                if is_left {
16524                                    JoinOperator::LeftAnti
16525                                } else {
16526                                    JoinOperator::RightAnti
16527                                }
16528                            }
16529                            Some(Keyword::JOIN) => {
16530                                if is_left {
16531                                    JoinOperator::Left
16532                                } else {
16533                                    JoinOperator::Right
16534                                }
16535                            }
16536                            _ => {
16537                                return Err(ParserError::ParserError(format!(
16538                                    "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16539                                )))
16540                            }
16541                        }
16542                    }
16543                    Keyword::ANTI => {
16544                        let _ = self.next_token(); // consume ANTI
16545                        self.expect_keyword_is(Keyword::JOIN)?;
16546                        JoinOperator::Anti
16547                    }
16548                    Keyword::SEMI => {
16549                        let _ = self.next_token(); // consume SEMI
16550                        self.expect_keyword_is(Keyword::JOIN)?;
16551                        JoinOperator::Semi
16552                    }
16553                    Keyword::FULL => {
16554                        let _ = self.next_token(); // consume FULL
16555                        let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
16556                        self.expect_keyword_is(Keyword::JOIN)?;
16557                        JoinOperator::FullOuter
16558                    }
16559                    Keyword::OUTER => {
16560                        return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16561                    }
16562                    Keyword::STRAIGHT_JOIN => {
16563                        let _ = self.next_token(); // consume STRAIGHT_JOIN
16564                        JoinOperator::StraightJoin
16565                    }
16566                    _ if natural => {
16567                        return self
16568                            .expected_ref("a join type after NATURAL", self.peek_token_ref());
16569                    }
16570                    _ => break,
16571                };
16572                let mut relation = self.parse_table_factor()?;
16573
16574                if !self
16575                    .dialect
16576                    .supports_left_associative_joins_without_parens()
16577                    && self.peek_parens_less_nested_join()
16578                {
16579                    let joins = self.parse_joins()?;
16580                    relation = TableFactor::NestedJoin {
16581                        table_with_joins: Box::new(TableWithJoins { relation, joins }),
16582                        alias: None,
16583                    };
16584                }
16585
16586                let join_constraint = self.parse_join_constraint(natural)?;
16587                Join {
16588                    relation,
16589                    global,
16590                    join_operator: join_operator_type(join_constraint),
16591                }
16592            };
16593            joins.push(join);
16594        }
16595        Ok(joins)
16596    }
16597
16598    fn peek_parens_less_nested_join(&self) -> bool {
16599        matches!(
16600            self.peek_token_ref().token,
16601            Token::Word(Word {
16602                keyword: Keyword::JOIN
16603                    | Keyword::INNER
16604                    | Keyword::LEFT
16605                    | Keyword::RIGHT
16606                    | Keyword::FULL,
16607                ..
16608            })
16609        )
16610    }
16611
16612    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
16613    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16614    pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16615        let _guard = self.recursion_counter.try_decrease()?;
16616        if self.parse_keyword(Keyword::LATERAL) {
16617            // LATERAL must always be followed by a subquery or table function.
16618            if self.consume_token(&Token::LParen) {
16619                self.parse_derived_table_factor(Lateral)
16620            } else {
16621                let name = self.parse_object_name(false)?;
16622                self.expect_token(&Token::LParen)?;
16623                let args = self.parse_optional_args()?;
16624                let alias = self.maybe_parse_table_alias()?;
16625                Ok(TableFactor::Function {
16626                    lateral: true,
16627                    name,
16628                    args,
16629                    alias,
16630                })
16631            }
16632        } else if self.parse_keyword(Keyword::TABLE) {
16633            // parse table function (SELECT * FROM TABLE (<expr>) [ AS <alias> ])
16634            self.expect_token(&Token::LParen)?;
16635            let expr = self.parse_expr()?;
16636            self.expect_token(&Token::RParen)?;
16637            let alias = self.maybe_parse_table_alias()?;
16638            Ok(TableFactor::TableFunction { expr, alias })
16639        } else if self.consume_token(&Token::LParen) {
16640            // A left paren introduces either a derived table (i.e., a subquery)
16641            // or a nested join. It's nearly impossible to determine ahead of
16642            // time which it is... so we just try to parse both.
16643            //
16644            // Here's an example that demonstrates the complexity:
16645            //                     /-------------------------------------------------------\
16646            //                     | /-----------------------------------\                 |
16647            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
16648            //                   ^ ^ ^ ^
16649            //                   | | | |
16650            //                   | | | |
16651            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
16652            //                   | | (3) starts a derived table (subquery)
16653            //                   | (2) starts a nested join
16654            //                   (1) an additional set of parens around a nested join
16655            //
16656
16657            // If the recently consumed '(' starts a derived table, the call to
16658            // `parse_derived_table_factor` below will return success after parsing the
16659            // subquery, followed by the closing ')', and the alias of the derived table.
16660            // In the example above this is case (3).
16661            if let Some(mut table) =
16662                self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))?
16663            {
16664                while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16665                {
16666                    table = match kw {
16667                        Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16668                        Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16669                        unexpected_keyword => return Err(ParserError::ParserError(
16670                            format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16671                        )),
16672                    }
16673                }
16674                return Ok(table);
16675            }
16676
16677            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
16678            // recently consumed does not start a derived table (cases 1, 2, or 4).
16679            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
16680
16681            // Inside the parentheses we expect to find an (A) table factor
16682            // followed by some joins or (B) another level of nesting.
16683            let mut table_and_joins = self.parse_table_and_joins()?;
16684
16685            #[allow(clippy::if_same_then_else)]
16686            if !table_and_joins.joins.is_empty() {
16687                self.expect_token(&Token::RParen)?;
16688                let alias = self.maybe_parse_table_alias()?;
16689                Ok(TableFactor::NestedJoin {
16690                    table_with_joins: Box::new(table_and_joins),
16691                    alias,
16692                }) // (A)
16693            } else if let TableFactor::NestedJoin {
16694                table_with_joins: _,
16695                alias: _,
16696            } = &table_and_joins.relation
16697            {
16698                // (B): `table_and_joins` (what we found inside the parentheses)
16699                // is a nested join `(foo JOIN bar)`, not followed by other joins.
16700                self.expect_token(&Token::RParen)?;
16701                let alias = self.maybe_parse_table_alias()?;
16702                Ok(TableFactor::NestedJoin {
16703                    table_with_joins: Box::new(table_and_joins),
16704                    alias,
16705                })
16706            } else if self.dialect.supports_parens_around_table_factor() {
16707                // Dialect-specific behavior: Snowflake diverges from the
16708                // standard and from most of the other implementations by
16709                // allowing extra parentheses not only around a join (B), but
16710                // around lone table names (e.g. `FROM (mytable [AS alias])`)
16711                // and around derived tables (e.g. `FROM ((SELECT ...)
16712                // [AS alias])`) as well.
16713                self.expect_token(&Token::RParen)?;
16714
16715                if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16716                    // Snowflake also allows specifying an alias *after* parens
16717                    // e.g. `FROM (mytable) AS alias`
16718                    match &mut table_and_joins.relation {
16719                        TableFactor::Derived { alias, .. }
16720                        | TableFactor::Table { alias, .. }
16721                        | TableFactor::Function { alias, .. }
16722                        | TableFactor::UNNEST { alias, .. }
16723                        | TableFactor::JsonTable { alias, .. }
16724                        | TableFactor::XmlTable { alias, .. }
16725                        | TableFactor::OpenJsonTable { alias, .. }
16726                        | TableFactor::TableFunction { alias, .. }
16727                        | TableFactor::Pivot { alias, .. }
16728                        | TableFactor::Unpivot { alias, .. }
16729                        | TableFactor::MatchRecognize { alias, .. }
16730                        | TableFactor::SemanticView { alias, .. }
16731                        | TableFactor::NestedJoin { alias, .. } => {
16732                            // but not `FROM (mytable AS alias1) AS alias2`.
16733                            if let Some(inner_alias) = alias {
16734                                return Err(ParserError::ParserError(format!(
16735                                    "duplicate alias {inner_alias}"
16736                                )));
16737                            }
16738                            // Act as if the alias was specified normally next
16739                            // to the table name: `(mytable) AS alias` ->
16740                            // `(mytable AS alias)`
16741                            alias.replace(outer_alias);
16742                        }
16743                    };
16744                }
16745                // Do not store the extra set of parens in the AST
16746                Ok(table_and_joins.relation)
16747            } else {
16748                // The SQL spec prohibits derived tables and bare tables from
16749                // appearing alone in parentheses (e.g. `FROM (mytable)`)
16750                self.expected_ref("joined table", self.peek_token_ref())
16751            }
16752        } else if self.dialect.supports_values_as_table_factor()
16753            && matches!(
16754                self.peek_tokens(),
16755                [
16756                    Token::Word(Word {
16757                        keyword: Keyword::VALUES,
16758                        ..
16759                    }),
16760                    Token::LParen
16761                ]
16762            )
16763        {
16764            self.expect_keyword_is(Keyword::VALUES)?;
16765
16766            // Snowflake and Databricks allow syntax like below:
16767            // SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
16768            // where there are no parentheses around the VALUES clause.
16769            let values = SetExpr::Values(self.parse_values(false, false)?);
16770            let alias = self.maybe_parse_table_alias()?;
16771            Ok(TableFactor::Derived {
16772                lateral: false,
16773                subquery: Box::new(Query {
16774                    with: None,
16775                    body: Box::new(values),
16776                    order_by: None,
16777                    limit_clause: None,
16778                    fetch: None,
16779                    locks: vec![],
16780                    for_clause: None,
16781                    settings: None,
16782                    format_clause: None,
16783                    pipe_operators: vec![],
16784                }),
16785                alias,
16786                sample: None,
16787            })
16788        } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16789            && self.parse_keyword(Keyword::UNNEST)
16790        {
16791            self.expect_token(&Token::LParen)?;
16792            let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16793            self.expect_token(&Token::RParen)?;
16794
16795            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16796            let alias = match self.maybe_parse_table_alias() {
16797                Ok(Some(alias)) => Some(alias),
16798                Ok(None) => None,
16799                Err(e) => return Err(e),
16800            };
16801
16802            let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16803                Ok(()) => true,
16804                Err(_) => false,
16805            };
16806
16807            let with_offset_alias = if with_offset {
16808                match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16809                    Ok(Some(alias)) => Some(alias),
16810                    Ok(None) => None,
16811                    Err(e) => return Err(e),
16812                }
16813            } else {
16814                None
16815            };
16816
16817            Ok(TableFactor::UNNEST {
16818                alias,
16819                array_exprs,
16820                with_offset,
16821                with_offset_alias,
16822                with_ordinality,
16823            })
16824        } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16825            let json_expr = self.parse_expr()?;
16826            self.expect_token(&Token::Comma)?;
16827            let json_path = self.parse_value()?;
16828            self.expect_keyword_is(Keyword::COLUMNS)?;
16829            self.expect_token(&Token::LParen)?;
16830            let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16831            self.expect_token(&Token::RParen)?;
16832            self.expect_token(&Token::RParen)?;
16833            let alias = self.maybe_parse_table_alias()?;
16834            Ok(TableFactor::JsonTable {
16835                json_expr,
16836                json_path,
16837                columns,
16838                alias,
16839            })
16840        } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16841            self.prev_token();
16842            self.parse_open_json_table_factor()
16843        } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16844            self.prev_token();
16845            self.parse_xml_table_factor()
16846        } else if self.dialect.supports_semantic_view_table_factor()
16847            && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16848        {
16849            self.parse_semantic_view_table_factor()
16850        } else if self.peek_token_ref().token == Token::AtSign {
16851            // Stage reference: @mystage or @namespace.stage (e.g. Snowflake)
16852            self.parse_snowflake_stage_table_factor()
16853        } else {
16854            let name = self.parse_object_name(true)?;
16855
16856            let json_path = match &self.peek_token_ref().token {
16857                Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16858                _ => None,
16859            };
16860
16861            let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16862                && self.parse_keyword(Keyword::PARTITION)
16863            {
16864                self.parse_parenthesized_identifiers()?
16865            } else {
16866                vec![]
16867            };
16868
16869            // Parse potential version qualifier
16870            let version = self.maybe_parse_table_version()?;
16871
16872            // Postgres, MSSQL, ClickHouse: table-valued functions:
16873            let args = if self.consume_token(&Token::LParen) {
16874                Some(self.parse_table_function_args()?)
16875            } else {
16876                None
16877            };
16878
16879            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16880
16881            let mut sample = None;
16882            if self.dialect.supports_table_sample_before_alias() {
16883                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16884                    sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16885                }
16886            }
16887
16888            let alias = self.maybe_parse_table_alias()?;
16889
16890            // MYSQL-specific table hints:
16891            let index_hints = if self.dialect.supports_table_hints() {
16892                self.maybe_parse(|p| p.parse_table_index_hints())?
16893                    .unwrap_or(vec![])
16894            } else {
16895                vec![]
16896            };
16897
16898            // MSSQL-specific table hints:
16899            let mut with_hints = vec![];
16900            if self.parse_keyword(Keyword::WITH) {
16901                if self.consume_token(&Token::LParen) {
16902                    with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16903                    self.expect_token(&Token::RParen)?;
16904                } else {
16905                    // rewind, as WITH may belong to the next statement's CTE
16906                    self.prev_token();
16907                }
16908            };
16909
16910            if !self.dialect.supports_table_sample_before_alias() {
16911                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16912                    sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16913                }
16914            }
16915
16916            let mut table = TableFactor::Table {
16917                name,
16918                alias,
16919                args,
16920                with_hints,
16921                version,
16922                partitions,
16923                with_ordinality,
16924                json_path,
16925                sample,
16926                index_hints,
16927            };
16928
16929            while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16930                table = match kw {
16931                    Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16932                    Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16933                    unexpected_keyword => return Err(ParserError::ParserError(
16934                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16935                    )),
16936                }
16937            }
16938
16939            if self.dialect.supports_match_recognize()
16940                && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16941            {
16942                table = self.parse_match_recognize(table)?;
16943            }
16944
16945            Ok(table)
16946        }
16947    }
16948
16949    /// Parse a Snowflake stage reference as a table factor.
16950    /// Handles syntax like: `@mystage1 (file_format => 'myformat', pattern => '...')`
16951    ///
16952    /// See: <https://docs.snowflake.com/en/user-guide/querying-stage>
16953    fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16954        // Parse the stage name starting with @
16955        let name = crate::dialect::parse_snowflake_stage_name(self)?;
16956
16957        // Parse optional stage options like (file_format => 'myformat', pattern => '...')
16958        let args = if self.consume_token(&Token::LParen) {
16959            Some(self.parse_table_function_args()?)
16960        } else {
16961            None
16962        };
16963
16964        let alias = self.maybe_parse_table_alias()?;
16965
16966        Ok(TableFactor::Table {
16967            name,
16968            alias,
16969            args,
16970            with_hints: vec![],
16971            version: None,
16972            partitions: vec![],
16973            with_ordinality: false,
16974            json_path: None,
16975            sample: None,
16976            index_hints: vec![],
16977        })
16978    }
16979
16980    fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16981        let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16982            TableSampleModifier::TableSample
16983        } else if self.parse_keyword(Keyword::SAMPLE) {
16984            TableSampleModifier::Sample
16985        } else {
16986            return Ok(None);
16987        };
16988        self.parse_table_sample(modifier).map(Some)
16989    }
16990
16991    fn parse_table_sample(
16992        &mut self,
16993        modifier: TableSampleModifier,
16994    ) -> Result<Box<TableSample>, ParserError> {
16995        let name = match self.parse_one_of_keywords(&[
16996            Keyword::BERNOULLI,
16997            Keyword::ROW,
16998            Keyword::SYSTEM,
16999            Keyword::BLOCK,
17000        ]) {
17001            Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
17002            Some(Keyword::ROW) => Some(TableSampleMethod::Row),
17003            Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
17004            Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
17005            _ => None,
17006        };
17007
17008        let parenthesized = self.consume_token(&Token::LParen);
17009
17010        let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
17011            let selected_bucket = self.parse_number_value()?;
17012            self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
17013            let total = self.parse_number_value()?;
17014            let on = if self.parse_keyword(Keyword::ON) {
17015                Some(self.parse_expr()?)
17016            } else {
17017                None
17018            };
17019            (
17020                None,
17021                Some(TableSampleBucket {
17022                    bucket: selected_bucket,
17023                    total,
17024                    on,
17025                }),
17026            )
17027        } else {
17028            let value = match self.maybe_parse(|p| p.parse_expr())? {
17029                Some(num) => num,
17030                None => {
17031                    let next_token = self.next_token();
17032                    if let Token::Word(w) = next_token.token {
17033                        Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
17034                    } else {
17035                        return parser_err!(
17036                            "Expecting number or byte length e.g. 100M",
17037                            self.peek_token_ref().span.start
17038                        );
17039                    }
17040                }
17041            };
17042            let unit = if self.parse_keyword(Keyword::ROWS) {
17043                Some(TableSampleUnit::Rows)
17044            } else if self.parse_keyword(Keyword::PERCENT) {
17045                Some(TableSampleUnit::Percent)
17046            } else {
17047                None
17048            };
17049            (
17050                Some(TableSampleQuantity {
17051                    parenthesized,
17052                    value,
17053                    unit,
17054                }),
17055                None,
17056            )
17057        };
17058        if parenthesized {
17059            self.expect_token(&Token::RParen)?;
17060        }
17061
17062        let seed = if self.parse_keyword(Keyword::REPEATABLE) {
17063            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
17064        } else if self.parse_keyword(Keyword::SEED) {
17065            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
17066        } else {
17067            None
17068        };
17069
17070        let offset = if self.parse_keyword(Keyword::OFFSET) {
17071            Some(self.parse_expr()?)
17072        } else {
17073            None
17074        };
17075
17076        Ok(Box::new(TableSample {
17077            modifier,
17078            name,
17079            quantity,
17080            seed,
17081            bucket,
17082            offset,
17083        }))
17084    }
17085
17086    fn parse_table_sample_seed(
17087        &mut self,
17088        modifier: TableSampleSeedModifier,
17089    ) -> Result<TableSampleSeed, ParserError> {
17090        self.expect_token(&Token::LParen)?;
17091        let value = self.parse_number_value()?;
17092        self.expect_token(&Token::RParen)?;
17093        Ok(TableSampleSeed { modifier, value })
17094    }
17095
17096    /// Parses `OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]` clause,
17097    /// assuming the `OPENJSON` keyword was already consumed.
17098    fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17099        self.expect_token(&Token::LParen)?;
17100        let json_expr = self.parse_expr()?;
17101        let json_path = if self.consume_token(&Token::Comma) {
17102            Some(self.parse_value()?)
17103        } else {
17104            None
17105        };
17106        self.expect_token(&Token::RParen)?;
17107        let columns = if self.parse_keyword(Keyword::WITH) {
17108            self.expect_token(&Token::LParen)?;
17109            let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
17110            self.expect_token(&Token::RParen)?;
17111            columns
17112        } else {
17113            Vec::new()
17114        };
17115        let alias = self.maybe_parse_table_alias()?;
17116        Ok(TableFactor::OpenJsonTable {
17117            json_expr,
17118            json_path,
17119            columns,
17120            alias,
17121        })
17122    }
17123
17124    fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17125        self.expect_token(&Token::LParen)?;
17126        let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
17127            self.expect_token(&Token::LParen)?;
17128            let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
17129            self.expect_token(&Token::RParen)?;
17130            self.expect_token(&Token::Comma)?;
17131            namespaces
17132        } else {
17133            vec![]
17134        };
17135        let row_expression = self.parse_expr()?;
17136        let passing = self.parse_xml_passing_clause()?;
17137        self.expect_keyword_is(Keyword::COLUMNS)?;
17138        let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
17139        self.expect_token(&Token::RParen)?;
17140        let alias = self.maybe_parse_table_alias()?;
17141        Ok(TableFactor::XmlTable {
17142            namespaces,
17143            row_expression,
17144            passing,
17145            columns,
17146            alias,
17147        })
17148    }
17149
17150    fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
17151        let uri = self.parse_expr()?;
17152        self.expect_keyword_is(Keyword::AS)?;
17153        let name = self.parse_identifier()?;
17154        Ok(XmlNamespaceDefinition { uri, name })
17155    }
17156
17157    fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
17158        let name = self.parse_identifier()?;
17159
17160        let option = if self.parse_keyword(Keyword::FOR) {
17161            self.expect_keyword(Keyword::ORDINALITY)?;
17162            XmlTableColumnOption::ForOrdinality
17163        } else {
17164            let r#type = self.parse_data_type()?;
17165            let mut path = None;
17166            let mut default = None;
17167
17168            if self.parse_keyword(Keyword::PATH) {
17169                path = Some(self.parse_expr()?);
17170            }
17171
17172            if self.parse_keyword(Keyword::DEFAULT) {
17173                default = Some(self.parse_expr()?);
17174            }
17175
17176            let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
17177            if !not_null {
17178                // NULL is the default but can be specified explicitly
17179                let _ = self.parse_keyword(Keyword::NULL);
17180            }
17181
17182            XmlTableColumnOption::NamedInfo {
17183                r#type,
17184                path,
17185                default,
17186                nullable: !not_null,
17187            }
17188        };
17189        Ok(XmlTableColumn { name, option })
17190    }
17191
17192    fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
17193        let mut arguments = vec![];
17194        if self.parse_keyword(Keyword::PASSING) {
17195            loop {
17196                let by_value =
17197                    self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
17198                let expr = self.parse_expr()?;
17199                let alias = if self.parse_keyword(Keyword::AS) {
17200                    Some(self.parse_identifier()?)
17201                } else {
17202                    None
17203                };
17204                arguments.push(XmlPassingArgument {
17205                    expr,
17206                    alias,
17207                    by_value,
17208                });
17209                if !self.consume_token(&Token::Comma) {
17210                    break;
17211                }
17212            }
17213        }
17214        Ok(XmlPassingClause { arguments })
17215    }
17216
17217    /// Parse a [TableFactor::SemanticView]
17218    fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17219        self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
17220        self.expect_token(&Token::LParen)?;
17221
17222        let name = self.parse_object_name(true)?;
17223
17224        // Parse DIMENSIONS, METRICS, FACTS and WHERE clauses in flexible order
17225        let mut dimensions = Vec::new();
17226        let mut metrics = Vec::new();
17227        let mut facts = Vec::new();
17228        let mut where_clause = None;
17229
17230        while self.peek_token_ref().token != Token::RParen {
17231            if self.parse_keyword(Keyword::DIMENSIONS) {
17232                if !dimensions.is_empty() {
17233                    return Err(ParserError::ParserError(
17234                        "DIMENSIONS clause can only be specified once".to_string(),
17235                    ));
17236                }
17237                dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17238            } else if self.parse_keyword(Keyword::METRICS) {
17239                if !metrics.is_empty() {
17240                    return Err(ParserError::ParserError(
17241                        "METRICS clause can only be specified once".to_string(),
17242                    ));
17243                }
17244                metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17245            } else if self.parse_keyword(Keyword::FACTS) {
17246                if !facts.is_empty() {
17247                    return Err(ParserError::ParserError(
17248                        "FACTS clause can only be specified once".to_string(),
17249                    ));
17250                }
17251                facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17252            } else if self.parse_keyword(Keyword::WHERE) {
17253                if where_clause.is_some() {
17254                    return Err(ParserError::ParserError(
17255                        "WHERE clause can only be specified once".to_string(),
17256                    ));
17257                }
17258                where_clause = Some(self.parse_expr()?);
17259            } else {
17260                let tok = self.peek_token_ref();
17261                return parser_err!(
17262                    format!(
17263                        "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
17264                        tok.token
17265                    ),
17266                    tok.span.start
17267                )?;
17268            }
17269        }
17270
17271        self.expect_token(&Token::RParen)?;
17272
17273        let alias = self.maybe_parse_table_alias()?;
17274
17275        Ok(TableFactor::SemanticView {
17276            name,
17277            dimensions,
17278            metrics,
17279            facts,
17280            where_clause,
17281            alias,
17282        })
17283    }
17284
17285    fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
17286        self.expect_token(&Token::LParen)?;
17287
17288        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
17289            self.parse_comma_separated(Parser::parse_expr)?
17290        } else {
17291            vec![]
17292        };
17293
17294        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17295            self.parse_comma_separated(Parser::parse_order_by_expr)?
17296        } else {
17297            vec![]
17298        };
17299
17300        let measures = if self.parse_keyword(Keyword::MEASURES) {
17301            self.parse_comma_separated(|p| {
17302                let expr = p.parse_expr()?;
17303                let _ = p.parse_keyword(Keyword::AS);
17304                let alias = p.parse_identifier()?;
17305                Ok(Measure { expr, alias })
17306            })?
17307        } else {
17308            vec![]
17309        };
17310
17311        let rows_per_match =
17312            if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
17313                Some(RowsPerMatch::OneRow)
17314            } else if self.parse_keywords(&[
17315                Keyword::ALL,
17316                Keyword::ROWS,
17317                Keyword::PER,
17318                Keyword::MATCH,
17319            ]) {
17320                Some(RowsPerMatch::AllRows(
17321                    if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
17322                        Some(EmptyMatchesMode::Show)
17323                    } else if self.parse_keywords(&[
17324                        Keyword::OMIT,
17325                        Keyword::EMPTY,
17326                        Keyword::MATCHES,
17327                    ]) {
17328                        Some(EmptyMatchesMode::Omit)
17329                    } else if self.parse_keywords(&[
17330                        Keyword::WITH,
17331                        Keyword::UNMATCHED,
17332                        Keyword::ROWS,
17333                    ]) {
17334                        Some(EmptyMatchesMode::WithUnmatched)
17335                    } else {
17336                        None
17337                    },
17338                ))
17339            } else {
17340                None
17341            };
17342
17343        let after_match_skip =
17344            if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
17345                if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
17346                    Some(AfterMatchSkip::PastLastRow)
17347                } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
17348                    Some(AfterMatchSkip::ToNextRow)
17349                } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
17350                    Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
17351                } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
17352                    Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
17353                } else {
17354                    let found = self.next_token();
17355                    return self.expected("after match skip option", found);
17356                }
17357            } else {
17358                None
17359            };
17360
17361        self.expect_keyword_is(Keyword::PATTERN)?;
17362        let pattern = self.parse_parenthesized(Self::parse_pattern)?;
17363
17364        self.expect_keyword_is(Keyword::DEFINE)?;
17365
17366        let symbols = self.parse_comma_separated(|p| {
17367            let symbol = p.parse_identifier()?;
17368            p.expect_keyword_is(Keyword::AS)?;
17369            let definition = p.parse_expr()?;
17370            Ok(SymbolDefinition { symbol, definition })
17371        })?;
17372
17373        self.expect_token(&Token::RParen)?;
17374
17375        let alias = self.maybe_parse_table_alias()?;
17376
17377        Ok(TableFactor::MatchRecognize {
17378            table: Box::new(table),
17379            partition_by,
17380            order_by,
17381            measures,
17382            rows_per_match,
17383            after_match_skip,
17384            pattern,
17385            symbols,
17386            alias,
17387        })
17388    }
17389
17390    fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17391        match self.next_token().token {
17392            Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
17393            Token::Placeholder(s) if s == "$" => {
17394                Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
17395            }
17396            Token::LBrace => {
17397                self.expect_token(&Token::Minus)?;
17398                let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
17399                self.expect_token(&Token::Minus)?;
17400                self.expect_token(&Token::RBrace)?;
17401                Ok(MatchRecognizePattern::Exclude(symbol))
17402            }
17403            Token::Word(Word {
17404                value,
17405                quote_style: None,
17406                ..
17407            }) if value == "PERMUTE" => {
17408                self.expect_token(&Token::LParen)?;
17409                let symbols = self.parse_comma_separated(|p| {
17410                    p.parse_identifier().map(MatchRecognizeSymbol::Named)
17411                })?;
17412                self.expect_token(&Token::RParen)?;
17413                Ok(MatchRecognizePattern::Permute(symbols))
17414            }
17415            Token::LParen => {
17416                let pattern = self.parse_pattern()?;
17417                self.expect_token(&Token::RParen)?;
17418                Ok(MatchRecognizePattern::Group(Box::new(pattern)))
17419            }
17420            _ => {
17421                self.prev_token();
17422                self.parse_identifier()
17423                    .map(MatchRecognizeSymbol::Named)
17424                    .map(MatchRecognizePattern::Symbol)
17425            }
17426        }
17427    }
17428
17429    fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17430        let mut pattern = self.parse_base_pattern()?;
17431        loop {
17432            let token = self.next_token();
17433            let quantifier = match token.token {
17434                Token::Mul => RepetitionQuantifier::ZeroOrMore,
17435                Token::Plus => RepetitionQuantifier::OneOrMore,
17436                Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
17437                Token::LBrace => {
17438                    // quantifier is a range like {n} or {n,} or {,m} or {n,m}
17439                    let token = self.next_token();
17440                    match token.token {
17441                        Token::Comma => {
17442                            let next_token = self.next_token();
17443                            let Token::Number(n, _) = next_token.token else {
17444                                return self.expected("literal number", next_token);
17445                            };
17446                            self.expect_token(&Token::RBrace)?;
17447                            RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
17448                        }
17449                        Token::Number(n, _) if self.consume_token(&Token::Comma) => {
17450                            let next_token = self.next_token();
17451                            match next_token.token {
17452                                Token::Number(m, _) => {
17453                                    self.expect_token(&Token::RBrace)?;
17454                                    RepetitionQuantifier::Range(
17455                                        Self::parse(n, token.span.start)?,
17456                                        Self::parse(m, token.span.start)?,
17457                                    )
17458                                }
17459                                Token::RBrace => {
17460                                    RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
17461                                }
17462                                _ => {
17463                                    return self.expected("} or upper bound", next_token);
17464                                }
17465                            }
17466                        }
17467                        Token::Number(n, _) => {
17468                            self.expect_token(&Token::RBrace)?;
17469                            RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
17470                        }
17471                        _ => return self.expected("quantifier range", token),
17472                    }
17473                }
17474                _ => {
17475                    self.prev_token();
17476                    break;
17477                }
17478            };
17479            pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
17480        }
17481        Ok(pattern)
17482    }
17483
17484    fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17485        let mut patterns = vec![self.parse_repetition_pattern()?];
17486        while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
17487            patterns.push(self.parse_repetition_pattern()?);
17488        }
17489        match <[MatchRecognizePattern; 1]>::try_from(patterns) {
17490            Ok([pattern]) => Ok(pattern),
17491            Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
17492        }
17493    }
17494
17495    fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17496        let pattern = self.parse_concat_pattern()?;
17497        if self.consume_token(&Token::Pipe) {
17498            match self.parse_pattern()? {
17499                // flatten nested alternations
17500                MatchRecognizePattern::Alternation(mut patterns) => {
17501                    patterns.insert(0, pattern);
17502                    Ok(MatchRecognizePattern::Alternation(patterns))
17503                }
17504                next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
17505            }
17506        } else {
17507            Ok(pattern)
17508        }
17509    }
17510
17511    /// Parses a the timestamp version specifier (i.e. query historical data)
17512    pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
17513        if self.dialect.supports_table_versioning() {
17514            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
17515            {
17516                let expr = self.parse_expr()?;
17517                return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
17518            } else if self.peek_keyword(Keyword::CHANGES) {
17519                return self.parse_table_version_changes().map(Some);
17520            } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
17521                let func_name = self.parse_object_name(true)?;
17522                let func = self.parse_function(func_name)?;
17523                return Ok(Some(TableVersion::Function(func)));
17524            } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
17525                let expr = self.parse_expr()?;
17526                return Ok(Some(TableVersion::TimestampAsOf(expr)));
17527            } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
17528                let expr = Expr::Value(self.parse_number_value()?);
17529                return Ok(Some(TableVersion::VersionAsOf(expr)));
17530            }
17531        }
17532        Ok(None)
17533    }
17534
17535    /// Parses the Snowflake `CHANGES` clause for change tracking queries.
17536    ///
17537    /// Syntax:
17538    /// ```sql
17539    /// CHANGES (INFORMATION => DEFAULT)
17540    ///   AT (TIMESTAMP => <expr>)
17541    ///   [END (TIMESTAMP => <expr>)]
17542    /// ```
17543    ///
17544    /// <https://docs.snowflake.com/en/sql-reference/constructs/changes>
17545    fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17546        let changes_name = self.parse_object_name(true)?;
17547        let changes = self.parse_function(changes_name)?;
17548        let at_name = self.parse_object_name(true)?;
17549        let at = self.parse_function(at_name)?;
17550        let end = if self.peek_keyword(Keyword::END) {
17551            let end_name = self.parse_object_name(true)?;
17552            Some(self.parse_function(end_name)?)
17553        } else {
17554            None
17555        };
17556        Ok(TableVersion::Changes { changes, at, end })
17557    }
17558
17559    /// Parses MySQL's JSON_TABLE column definition.
17560    /// For example: `id INT EXISTS PATH '$' DEFAULT '0' ON EMPTY ERROR ON ERROR`
17561    pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17562        if self.parse_keyword(Keyword::NESTED) {
17563            let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17564            let path = self.parse_value()?;
17565            self.expect_keyword_is(Keyword::COLUMNS)?;
17566            let columns = self.parse_parenthesized(|p| {
17567                p.parse_comma_separated(Self::parse_json_table_column_def)
17568            })?;
17569            return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17570                path,
17571                columns,
17572            }));
17573        }
17574        let name = self.parse_identifier()?;
17575        if self.parse_keyword(Keyword::FOR) {
17576            self.expect_keyword_is(Keyword::ORDINALITY)?;
17577            return Ok(JsonTableColumn::ForOrdinality(name));
17578        }
17579        let r#type = self.parse_data_type()?;
17580        let exists = self.parse_keyword(Keyword::EXISTS);
17581        self.expect_keyword_is(Keyword::PATH)?;
17582        let path = self.parse_value()?;
17583        let mut on_empty = None;
17584        let mut on_error = None;
17585        while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17586            if self.parse_keyword(Keyword::EMPTY) {
17587                on_empty = Some(error_handling);
17588            } else {
17589                self.expect_keyword_is(Keyword::ERROR)?;
17590                on_error = Some(error_handling);
17591            }
17592        }
17593        Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17594            name,
17595            r#type,
17596            path,
17597            exists,
17598            on_empty,
17599            on_error,
17600        }))
17601    }
17602
17603    /// Parses MSSQL's `OPENJSON WITH` column definition.
17604    ///
17605    /// ```sql
17606    /// colName type [ column_path ] [ AS JSON ]
17607    /// ```
17608    ///
17609    /// Reference: <https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver16#syntax>
17610    pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17611        let name = self.parse_identifier()?;
17612        let r#type = self.parse_data_type()?;
17613        let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17614            self.next_token();
17615            Some(path)
17616        } else {
17617            None
17618        };
17619        let as_json = self.parse_keyword(Keyword::AS);
17620        if as_json {
17621            self.expect_keyword_is(Keyword::JSON)?;
17622        }
17623        Ok(OpenJsonTableColumn {
17624            name,
17625            r#type,
17626            path,
17627            as_json,
17628        })
17629    }
17630
17631    fn parse_json_table_column_error_handling(
17632        &mut self,
17633    ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17634        let res = if self.parse_keyword(Keyword::NULL) {
17635            JsonTableColumnErrorHandling::Null
17636        } else if self.parse_keyword(Keyword::ERROR) {
17637            JsonTableColumnErrorHandling::Error
17638        } else if self.parse_keyword(Keyword::DEFAULT) {
17639            JsonTableColumnErrorHandling::Default(self.parse_value()?)
17640        } else {
17641            return Ok(None);
17642        };
17643        self.expect_keyword_is(Keyword::ON)?;
17644        Ok(Some(res))
17645    }
17646
17647    /// Parse a derived table factor (a parenthesized subquery), handling optional LATERAL.
17648    pub fn parse_derived_table_factor(
17649        &mut self,
17650        lateral: IsLateral,
17651    ) -> Result<TableFactor, ParserError> {
17652        let subquery = self.parse_query()?;
17653        self.expect_token(&Token::RParen)?;
17654        let alias = self.maybe_parse_table_alias()?;
17655
17656        // Parse optional SAMPLE clause after alias
17657        let sample = self
17658            .maybe_parse_table_sample()?
17659            .map(TableSampleKind::AfterTableAlias);
17660
17661        Ok(TableFactor::Derived {
17662            lateral: match lateral {
17663                Lateral => true,
17664                NotLateral => false,
17665            },
17666            subquery,
17667            alias,
17668            sample,
17669        })
17670    }
17671
17672    /// Parses an expression with an optional alias
17673    ///
17674    /// Examples:
17675    ///
17676    /// ```sql
17677    /// SUM(price) AS total_price
17678    /// ```
17679    /// ```sql
17680    /// SUM(price)
17681    /// ```
17682    ///
17683    /// Example
17684    /// ```
17685    /// # use sqlparser::parser::{Parser, ParserError};
17686    /// # use sqlparser::dialect::GenericDialect;
17687    /// # fn main() ->Result<(), ParserError> {
17688    /// let sql = r#"SUM("a") as "b""#;
17689    /// let mut parser = Parser::new(&GenericDialect).try_with_sql(sql)?;
17690    /// let expr_with_alias = parser.parse_expr_with_alias()?;
17691    /// assert_eq!(Some("b".to_string()), expr_with_alias.alias.map(|x|x.value));
17692    /// # Ok(())
17693    /// # }
17694    pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17695        let expr = self.parse_expr()?;
17696        let alias = if self.parse_keyword(Keyword::AS) {
17697            Some(self.parse_identifier()?)
17698        } else {
17699            None
17700        };
17701
17702        Ok(ExprWithAlias { expr, alias })
17703    }
17704
17705    /// Parse an expression followed by an optional alias; Unlike
17706    /// [Self::parse_expr_with_alias] the "AS" keyword between the expression
17707    /// and the alias is optional.
17708    fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17709        let expr = self.parse_expr()?;
17710        let alias = self.parse_identifier_optional_alias()?;
17711        Ok(ExprWithAlias { expr, alias })
17712    }
17713
17714    /// Parses a plain function call with an optional alias for the `PIVOT` clause
17715    fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17716        let function_name = match self.next_token().token {
17717            Token::Word(w) => Ok(w.value),
17718            _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17719        }?;
17720        let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17721        let alias = {
17722            fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17723                // ~ for a PIVOT aggregate function the alias must not be a "FOR"; in any dialect
17724                kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17725            }
17726            self.parse_optional_alias_inner(None, validator)?
17727        };
17728        Ok(ExprWithAlias { expr, alias })
17729    }
17730
17731    /// Parse a PIVOT table factor (ClickHouse/Oracle style pivot), returning a TableFactor.
17732    pub fn parse_pivot_table_factor(
17733        &mut self,
17734        table: TableFactor,
17735    ) -> Result<TableFactor, ParserError> {
17736        self.expect_token(&Token::LParen)?;
17737        let aggregate_functions =
17738            self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17739        self.expect_keyword_is(Keyword::FOR)?;
17740        let value_column = if self.peek_token_ref().token == Token::LParen {
17741            self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17742                p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17743            })?
17744        } else {
17745            vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17746        };
17747        self.expect_keyword_is(Keyword::IN)?;
17748
17749        self.expect_token(&Token::LParen)?;
17750        let value_source = if self.parse_keyword(Keyword::ANY) {
17751            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17752                self.parse_comma_separated(Parser::parse_order_by_expr)?
17753            } else {
17754                vec![]
17755            };
17756            PivotValueSource::Any(order_by)
17757        } else if self.peek_sub_query() {
17758            PivotValueSource::Subquery(self.parse_query()?)
17759        } else {
17760            PivotValueSource::List(
17761                self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17762            )
17763        };
17764        self.expect_token(&Token::RParen)?;
17765
17766        let default_on_null =
17767            if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17768                self.expect_token(&Token::LParen)?;
17769                let expr = self.parse_expr()?;
17770                self.expect_token(&Token::RParen)?;
17771                Some(expr)
17772            } else {
17773                None
17774            };
17775
17776        self.expect_token(&Token::RParen)?;
17777        let alias = self.maybe_parse_table_alias()?;
17778        Ok(TableFactor::Pivot {
17779            table: Box::new(table),
17780            aggregate_functions,
17781            value_column,
17782            value_source,
17783            default_on_null,
17784            alias,
17785        })
17786    }
17787
17788    /// Parse an UNPIVOT table factor, returning a TableFactor.
17789    pub fn parse_unpivot_table_factor(
17790        &mut self,
17791        table: TableFactor,
17792    ) -> Result<TableFactor, ParserError> {
17793        let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17794            self.expect_keyword_is(Keyword::NULLS)?;
17795            Some(NullInclusion::IncludeNulls)
17796        } else if self.parse_keyword(Keyword::EXCLUDE) {
17797            self.expect_keyword_is(Keyword::NULLS)?;
17798            Some(NullInclusion::ExcludeNulls)
17799        } else {
17800            None
17801        };
17802        self.expect_token(&Token::LParen)?;
17803        let value = self.parse_expr()?;
17804        self.expect_keyword_is(Keyword::FOR)?;
17805        let name = self.parse_identifier()?;
17806        self.expect_keyword_is(Keyword::IN)?;
17807        let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17808            p.parse_expr_with_alias()
17809        })?;
17810        self.expect_token(&Token::RParen)?;
17811        let alias = self.maybe_parse_table_alias()?;
17812        Ok(TableFactor::Unpivot {
17813            table: Box::new(table),
17814            value,
17815            null_inclusion,
17816            name,
17817            columns,
17818            alias,
17819        })
17820    }
17821
17822    /// Parse a JOIN constraint (`NATURAL`, `ON <expr>`, `USING (...)`, or no constraint).
17823    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17824        if natural {
17825            Ok(JoinConstraint::Natural)
17826        } else if self.parse_keyword(Keyword::ON) {
17827            let constraint = self.parse_expr()?;
17828            Ok(JoinConstraint::On(constraint))
17829        } else if self.parse_keyword(Keyword::USING) {
17830            let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17831            Ok(JoinConstraint::Using(columns))
17832        } else {
17833            Ok(JoinConstraint::None)
17834            //self.expected_ref("ON, or USING after JOIN", self.peek_token_ref())
17835        }
17836    }
17837
17838    /// Parse a GRANT statement.
17839    pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17840        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17841
17842        self.expect_keyword_is(Keyword::TO)?;
17843        let grantees = self.parse_grantees()?;
17844
17845        let with_grant_option =
17846            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17847
17848        let current_grants =
17849            if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17850                Some(CurrentGrantsKind::CopyCurrentGrants)
17851            } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17852                Some(CurrentGrantsKind::RevokeCurrentGrants)
17853            } else {
17854                None
17855            };
17856
17857        let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17858            Some(self.parse_identifier()?)
17859        } else {
17860            None
17861        };
17862
17863        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17864            Some(self.parse_identifier()?)
17865        } else {
17866            None
17867        };
17868
17869        Ok(Grant {
17870            privileges,
17871            objects,
17872            grantees,
17873            with_grant_option,
17874            as_grantor,
17875            granted_by,
17876            current_grants,
17877        })
17878    }
17879
17880    fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17881        let mut values = vec![];
17882        let mut grantee_type = GranteesType::None;
17883        loop {
17884            let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17885                GranteesType::Role
17886            } else if self.parse_keyword(Keyword::USER) {
17887                GranteesType::User
17888            } else if self.parse_keyword(Keyword::SHARE) {
17889                GranteesType::Share
17890            } else if self.parse_keyword(Keyword::GROUP) {
17891                GranteesType::Group
17892            } else if self.parse_keyword(Keyword::PUBLIC) {
17893                GranteesType::Public
17894            } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17895                GranteesType::DatabaseRole
17896            } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17897                GranteesType::ApplicationRole
17898            } else if self.parse_keyword(Keyword::APPLICATION) {
17899                GranteesType::Application
17900            } else {
17901                grantee_type.clone() // keep from previous iteraton, if not specified
17902            };
17903
17904            if self
17905                .dialect
17906                .get_reserved_grantees_types()
17907                .contains(&new_grantee_type)
17908            {
17909                self.prev_token();
17910            } else {
17911                grantee_type = new_grantee_type;
17912            }
17913
17914            let grantee = if grantee_type == GranteesType::Public {
17915                Grantee {
17916                    grantee_type: grantee_type.clone(),
17917                    name: None,
17918                }
17919            } else {
17920                let mut name = self.parse_grantee_name()?;
17921                if self.consume_token(&Token::Colon) {
17922                    // Redshift supports namespace prefix for external users and groups:
17923                    // <Namespace>:<GroupName> or <Namespace>:<UserName>
17924                    // https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html
17925                    let ident = self.parse_identifier()?;
17926                    if let GranteeName::ObjectName(namespace) = name {
17927                        name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17928                            format!("{namespace}:{ident}"),
17929                        )]));
17930                    };
17931                }
17932                Grantee {
17933                    grantee_type: grantee_type.clone(),
17934                    name: Some(name),
17935                }
17936            };
17937
17938            values.push(grantee);
17939
17940            if !self.consume_token(&Token::Comma) {
17941                break;
17942            }
17943        }
17944
17945        Ok(values)
17946    }
17947
17948    /// Parse privileges and optional target objects for GRANT/DENY/REVOKE statements.
17949    pub fn parse_grant_deny_revoke_privileges_objects(
17950        &mut self,
17951    ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17952        let privileges = if self.parse_keyword(Keyword::ALL) {
17953            Privileges::All {
17954                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17955            }
17956        } else {
17957            let actions = self.parse_actions_list()?;
17958            Privileges::Actions(actions)
17959        };
17960
17961        let objects = if self.parse_keyword(Keyword::ON) {
17962            if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17963                Some(GrantObjects::AllTablesInSchema {
17964                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17965                })
17966            } else if self.parse_keywords(&[
17967                Keyword::ALL,
17968                Keyword::EXTERNAL,
17969                Keyword::TABLES,
17970                Keyword::IN,
17971                Keyword::SCHEMA,
17972            ]) {
17973                Some(GrantObjects::AllExternalTablesInSchema {
17974                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17975                })
17976            } else if self.parse_keywords(&[
17977                Keyword::ALL,
17978                Keyword::VIEWS,
17979                Keyword::IN,
17980                Keyword::SCHEMA,
17981            ]) {
17982                Some(GrantObjects::AllViewsInSchema {
17983                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17984                })
17985            } else if self.parse_keywords(&[
17986                Keyword::ALL,
17987                Keyword::MATERIALIZED,
17988                Keyword::VIEWS,
17989                Keyword::IN,
17990                Keyword::SCHEMA,
17991            ]) {
17992                Some(GrantObjects::AllMaterializedViewsInSchema {
17993                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17994                })
17995            } else if self.parse_keywords(&[
17996                Keyword::ALL,
17997                Keyword::FUNCTIONS,
17998                Keyword::IN,
17999                Keyword::SCHEMA,
18000            ]) {
18001                Some(GrantObjects::AllFunctionsInSchema {
18002                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18003                })
18004            } else if self.parse_keywords(&[
18005                Keyword::FUTURE,
18006                Keyword::SCHEMAS,
18007                Keyword::IN,
18008                Keyword::DATABASE,
18009            ]) {
18010                Some(GrantObjects::FutureSchemasInDatabase {
18011                    databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18012                })
18013            } else if self.parse_keywords(&[
18014                Keyword::FUTURE,
18015                Keyword::TABLES,
18016                Keyword::IN,
18017                Keyword::SCHEMA,
18018            ]) {
18019                Some(GrantObjects::FutureTablesInSchema {
18020                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18021                })
18022            } else if self.parse_keywords(&[
18023                Keyword::FUTURE,
18024                Keyword::EXTERNAL,
18025                Keyword::TABLES,
18026                Keyword::IN,
18027                Keyword::SCHEMA,
18028            ]) {
18029                Some(GrantObjects::FutureExternalTablesInSchema {
18030                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18031                })
18032            } else if self.parse_keywords(&[
18033                Keyword::FUTURE,
18034                Keyword::VIEWS,
18035                Keyword::IN,
18036                Keyword::SCHEMA,
18037            ]) {
18038                Some(GrantObjects::FutureViewsInSchema {
18039                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18040                })
18041            } else if self.parse_keywords(&[
18042                Keyword::FUTURE,
18043                Keyword::MATERIALIZED,
18044                Keyword::VIEWS,
18045                Keyword::IN,
18046                Keyword::SCHEMA,
18047            ]) {
18048                Some(GrantObjects::FutureMaterializedViewsInSchema {
18049                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18050                })
18051            } else if self.parse_keywords(&[
18052                Keyword::ALL,
18053                Keyword::SEQUENCES,
18054                Keyword::IN,
18055                Keyword::SCHEMA,
18056            ]) {
18057                Some(GrantObjects::AllSequencesInSchema {
18058                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18059                })
18060            } else if self.parse_keywords(&[
18061                Keyword::FUTURE,
18062                Keyword::SEQUENCES,
18063                Keyword::IN,
18064                Keyword::SCHEMA,
18065            ]) {
18066                Some(GrantObjects::FutureSequencesInSchema {
18067                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18068                })
18069            } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
18070                Some(GrantObjects::ResourceMonitors(
18071                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
18072                ))
18073            } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18074                Some(GrantObjects::ComputePools(
18075                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
18076                ))
18077            } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18078                Some(GrantObjects::FailoverGroup(
18079                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
18080                ))
18081            } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18082                Some(GrantObjects::ReplicationGroup(
18083                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
18084                ))
18085            } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18086                Some(GrantObjects::ExternalVolumes(
18087                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
18088                ))
18089            } else {
18090                let object_type = self.parse_one_of_keywords(&[
18091                    Keyword::SEQUENCE,
18092                    Keyword::DATABASE,
18093                    Keyword::SCHEMA,
18094                    Keyword::TABLE,
18095                    Keyword::VIEW,
18096                    Keyword::WAREHOUSE,
18097                    Keyword::INTEGRATION,
18098                    Keyword::VIEW,
18099                    Keyword::WAREHOUSE,
18100                    Keyword::INTEGRATION,
18101                    Keyword::USER,
18102                    Keyword::CONNECTION,
18103                    Keyword::PROCEDURE,
18104                    Keyword::FUNCTION,
18105                    Keyword::TYPE,
18106                    Keyword::DOMAIN,
18107                ]);
18108                let objects =
18109                    self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
18110                match object_type {
18111                    Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
18112                    Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
18113                    Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
18114                    Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
18115                    Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
18116                    Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
18117                    Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
18118                    Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
18119                    Some(Keyword::TYPE) => Some(GrantObjects::Types(objects?)),
18120                    Some(Keyword::DOMAIN) => Some(GrantObjects::Domains(objects?)),
18121                    kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
18122                        if let Some(name) = objects?.first() {
18123                            self.parse_grant_procedure_or_function(name, &kw)?
18124                        } else {
18125                            self.expected_ref("procedure or function name", self.peek_token_ref())?
18126                        }
18127                    }
18128                    Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
18129                    Some(unexpected_keyword) => return Err(ParserError::ParserError(
18130                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
18131                    )),
18132                }
18133            }
18134        } else {
18135            None
18136        };
18137
18138        Ok((privileges, objects))
18139    }
18140
18141    fn parse_grant_procedure_or_function(
18142        &mut self,
18143        name: &ObjectName,
18144        kw: &Option<Keyword>,
18145    ) -> Result<Option<GrantObjects>, ParserError> {
18146        let arg_types = if self.consume_token(&Token::LParen) {
18147            let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
18148            self.expect_token(&Token::RParen)?;
18149            list
18150        } else {
18151            vec![]
18152        };
18153        match kw {
18154            Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
18155                name: name.clone(),
18156                arg_types,
18157            })),
18158            Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
18159                name: name.clone(),
18160                arg_types,
18161            })),
18162            _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
18163        }
18164    }
18165
18166    /// Parse a single grantable permission/action (used within GRANT statements).
18167    pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
18168        fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
18169            let columns = parser.parse_parenthesized_column_list(Optional, false)?;
18170            if columns.is_empty() {
18171                Ok(None)
18172            } else {
18173                Ok(Some(columns))
18174            }
18175        }
18176
18177        // Multi-word privileges
18178        if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
18179            Ok(Action::ImportedPrivileges)
18180        } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
18181            Ok(Action::AddSearchOptimization)
18182        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
18183            Ok(Action::AttachListing)
18184        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
18185            Ok(Action::AttachPolicy)
18186        } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
18187            Ok(Action::BindServiceEndpoint)
18188        } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
18189            let role = self.parse_object_name(false)?;
18190            Ok(Action::DatabaseRole { role })
18191        } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
18192            Ok(Action::EvolveSchema)
18193        } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
18194            Ok(Action::ImportShare)
18195        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
18196            Ok(Action::ManageVersions)
18197        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
18198            Ok(Action::ManageReleases)
18199        } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
18200            Ok(Action::OverrideShareRestrictions)
18201        } else if self.parse_keywords(&[
18202            Keyword::PURCHASE,
18203            Keyword::DATA,
18204            Keyword::EXCHANGE,
18205            Keyword::LISTING,
18206        ]) {
18207            Ok(Action::PurchaseDataExchangeListing)
18208        } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
18209            Ok(Action::ResolveAll)
18210        } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
18211            Ok(Action::ReadSession)
18212
18213        // Single-word privileges
18214        } else if self.parse_keyword(Keyword::APPLY) {
18215            let apply_type = self.parse_action_apply_type()?;
18216            Ok(Action::Apply { apply_type })
18217        } else if self.parse_keyword(Keyword::APPLYBUDGET) {
18218            Ok(Action::ApplyBudget)
18219        } else if self.parse_keyword(Keyword::AUDIT) {
18220            Ok(Action::Audit)
18221        } else if self.parse_keyword(Keyword::CONNECT) {
18222            Ok(Action::Connect)
18223        } else if self.parse_keyword(Keyword::CREATE) {
18224            let obj_type = self.maybe_parse_action_create_object_type();
18225            Ok(Action::Create { obj_type })
18226        } else if self.parse_keyword(Keyword::DELETE) {
18227            Ok(Action::Delete)
18228        } else if self.parse_keyword(Keyword::EXEC) {
18229            let obj_type = self.maybe_parse_action_execute_obj_type();
18230            Ok(Action::Exec { obj_type })
18231        } else if self.parse_keyword(Keyword::EXECUTE) {
18232            let obj_type = self.maybe_parse_action_execute_obj_type();
18233            Ok(Action::Execute { obj_type })
18234        } else if self.parse_keyword(Keyword::FAILOVER) {
18235            Ok(Action::Failover)
18236        } else if self.parse_keyword(Keyword::INSERT) {
18237            Ok(Action::Insert {
18238                columns: parse_columns(self)?,
18239            })
18240        } else if self.parse_keyword(Keyword::MANAGE) {
18241            let manage_type = self.parse_action_manage_type()?;
18242            Ok(Action::Manage { manage_type })
18243        } else if self.parse_keyword(Keyword::MODIFY) {
18244            let modify_type = self.parse_action_modify_type();
18245            Ok(Action::Modify { modify_type })
18246        } else if self.parse_keyword(Keyword::MONITOR) {
18247            let monitor_type = self.parse_action_monitor_type();
18248            Ok(Action::Monitor { monitor_type })
18249        } else if self.parse_keyword(Keyword::OPERATE) {
18250            Ok(Action::Operate)
18251        } else if self.parse_keyword(Keyword::REFERENCES) {
18252            Ok(Action::References {
18253                columns: parse_columns(self)?,
18254            })
18255        } else if self.parse_keyword(Keyword::READ) {
18256            Ok(Action::Read)
18257        } else if self.parse_keyword(Keyword::REPLICATE) {
18258            Ok(Action::Replicate)
18259        } else if self.parse_keyword(Keyword::ROLE) {
18260            let role = self.parse_object_name(false)?;
18261            Ok(Action::Role { role })
18262        } else if self.parse_keyword(Keyword::SELECT) {
18263            Ok(Action::Select {
18264                columns: parse_columns(self)?,
18265            })
18266        } else if self.parse_keyword(Keyword::TEMPORARY) {
18267            Ok(Action::Temporary)
18268        } else if self.parse_keyword(Keyword::TRIGGER) {
18269            Ok(Action::Trigger)
18270        } else if self.parse_keyword(Keyword::TRUNCATE) {
18271            Ok(Action::Truncate)
18272        } else if self.parse_keyword(Keyword::UPDATE) {
18273            Ok(Action::Update {
18274                columns: parse_columns(self)?,
18275            })
18276        } else if self.parse_keyword(Keyword::USAGE) {
18277            Ok(Action::Usage)
18278        } else if self.parse_keyword(Keyword::OWNERSHIP) {
18279            Ok(Action::Ownership)
18280        } else if self.parse_keyword(Keyword::DROP) {
18281            Ok(Action::Drop)
18282        } else {
18283            self.expected_ref("a privilege keyword", self.peek_token_ref())?
18284        }
18285    }
18286
18287    fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
18288        // Multi-word object types
18289        if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
18290            Some(ActionCreateObjectType::ApplicationPackage)
18291        } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18292            Some(ActionCreateObjectType::ComputePool)
18293        } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
18294            Some(ActionCreateObjectType::DataExchangeListing)
18295        } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18296            Some(ActionCreateObjectType::ExternalVolume)
18297        } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18298            Some(ActionCreateObjectType::FailoverGroup)
18299        } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
18300            Some(ActionCreateObjectType::NetworkPolicy)
18301        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
18302            Some(ActionCreateObjectType::OrganiationListing)
18303        } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18304            Some(ActionCreateObjectType::ReplicationGroup)
18305        }
18306        // Single-word object types
18307        else if self.parse_keyword(Keyword::ACCOUNT) {
18308            Some(ActionCreateObjectType::Account)
18309        } else if self.parse_keyword(Keyword::APPLICATION) {
18310            Some(ActionCreateObjectType::Application)
18311        } else if self.parse_keyword(Keyword::DATABASE) {
18312            Some(ActionCreateObjectType::Database)
18313        } else if self.parse_keyword(Keyword::INTEGRATION) {
18314            Some(ActionCreateObjectType::Integration)
18315        } else if self.parse_keyword(Keyword::ROLE) {
18316            Some(ActionCreateObjectType::Role)
18317        } else if self.parse_keyword(Keyword::SCHEMA) {
18318            Some(ActionCreateObjectType::Schema)
18319        } else if self.parse_keyword(Keyword::SHARE) {
18320            Some(ActionCreateObjectType::Share)
18321        } else if self.parse_keyword(Keyword::USER) {
18322            Some(ActionCreateObjectType::User)
18323        } else if self.parse_keyword(Keyword::WAREHOUSE) {
18324            Some(ActionCreateObjectType::Warehouse)
18325        } else {
18326            None
18327        }
18328    }
18329
18330    fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
18331        if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
18332            Ok(ActionApplyType::AggregationPolicy)
18333        } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
18334            Ok(ActionApplyType::AuthenticationPolicy)
18335        } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
18336            Ok(ActionApplyType::JoinPolicy)
18337        } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
18338            Ok(ActionApplyType::MaskingPolicy)
18339        } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
18340            Ok(ActionApplyType::PackagesPolicy)
18341        } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
18342            Ok(ActionApplyType::PasswordPolicy)
18343        } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
18344            Ok(ActionApplyType::ProjectionPolicy)
18345        } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
18346            Ok(ActionApplyType::RowAccessPolicy)
18347        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
18348            Ok(ActionApplyType::SessionPolicy)
18349        } else if self.parse_keyword(Keyword::TAG) {
18350            Ok(ActionApplyType::Tag)
18351        } else {
18352            self.expected_ref("GRANT APPLY type", self.peek_token_ref())
18353        }
18354    }
18355
18356    fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
18357        if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
18358            Some(ActionExecuteObjectType::DataMetricFunction)
18359        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
18360            Some(ActionExecuteObjectType::ManagedAlert)
18361        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
18362            Some(ActionExecuteObjectType::ManagedTask)
18363        } else if self.parse_keyword(Keyword::ALERT) {
18364            Some(ActionExecuteObjectType::Alert)
18365        } else if self.parse_keyword(Keyword::TASK) {
18366            Some(ActionExecuteObjectType::Task)
18367        } else {
18368            None
18369        }
18370    }
18371
18372    fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
18373        if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
18374            Ok(ActionManageType::AccountSupportCases)
18375        } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
18376            Ok(ActionManageType::EventSharing)
18377        } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
18378            Ok(ActionManageType::ListingAutoFulfillment)
18379        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
18380            Ok(ActionManageType::OrganizationSupportCases)
18381        } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
18382            Ok(ActionManageType::UserSupportCases)
18383        } else if self.parse_keyword(Keyword::GRANTS) {
18384            Ok(ActionManageType::Grants)
18385        } else if self.parse_keyword(Keyword::WAREHOUSES) {
18386            Ok(ActionManageType::Warehouses)
18387        } else {
18388            self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
18389        }
18390    }
18391
18392    fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
18393        if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
18394            Some(ActionModifyType::LogLevel)
18395        } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
18396            Some(ActionModifyType::TraceLevel)
18397        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
18398            Some(ActionModifyType::SessionLogLevel)
18399        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
18400            Some(ActionModifyType::SessionTraceLevel)
18401        } else {
18402            None
18403        }
18404    }
18405
18406    fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
18407        if self.parse_keyword(Keyword::EXECUTION) {
18408            Some(ActionMonitorType::Execution)
18409        } else if self.parse_keyword(Keyword::SECURITY) {
18410            Some(ActionMonitorType::Security)
18411        } else if self.parse_keyword(Keyword::USAGE) {
18412            Some(ActionMonitorType::Usage)
18413        } else {
18414            None
18415        }
18416    }
18417
18418    /// Parse a grantee name, possibly with a host qualifier (user@host).
18419    pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
18420        let mut name = self.parse_object_name(false)?;
18421        if self.dialect.supports_user_host_grantee()
18422            && name.0.len() == 1
18423            && name.0[0].as_ident().is_some()
18424            && self.consume_token(&Token::AtSign)
18425        {
18426            let user = name.0.pop().unwrap().as_ident().unwrap().clone();
18427            let host = self.parse_identifier()?;
18428            Ok(GranteeName::UserHost { user, host })
18429        } else {
18430            Ok(GranteeName::ObjectName(name))
18431        }
18432    }
18433
18434    /// Parse [`Statement::Deny`]
18435    pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
18436        self.expect_keyword(Keyword::DENY)?;
18437
18438        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18439        let objects = match objects {
18440            Some(o) => o,
18441            None => {
18442                return parser_err!(
18443                    "DENY statements must specify an object",
18444                    self.peek_token_ref().span.start
18445                )
18446            }
18447        };
18448
18449        self.expect_keyword_is(Keyword::TO)?;
18450        let grantees = self.parse_grantees()?;
18451        let cascade = self.parse_cascade_option();
18452        let granted_by = if self.parse_keywords(&[Keyword::AS]) {
18453            Some(self.parse_identifier()?)
18454        } else {
18455            None
18456        };
18457
18458        Ok(Statement::Deny(DenyStatement {
18459            privileges,
18460            objects,
18461            grantees,
18462            cascade,
18463            granted_by,
18464        }))
18465    }
18466
18467    /// Parse a REVOKE statement
18468    pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
18469        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18470
18471        self.expect_keyword_is(Keyword::FROM)?;
18472        let grantees = self.parse_grantees()?;
18473
18474        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
18475            Some(self.parse_identifier()?)
18476        } else {
18477            None
18478        };
18479
18480        let cascade = self.parse_cascade_option();
18481
18482        Ok(Revoke {
18483            privileges,
18484            objects,
18485            grantees,
18486            granted_by,
18487            cascade,
18488        })
18489    }
18490
18491    /// Parse an REPLACE statement
18492    pub fn parse_replace(
18493        &mut self,
18494        replace_token: TokenWithSpan,
18495    ) -> Result<Statement, ParserError> {
18496        if !dialect_of!(self is MySqlDialect | GenericDialect) {
18497            return parser_err!(
18498                "Unsupported statement REPLACE",
18499                self.peek_token_ref().span.start
18500            );
18501        }
18502
18503        let mut insert = self.parse_insert(replace_token)?;
18504        if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
18505            *replace_into = true;
18506        }
18507
18508        Ok(insert)
18509    }
18510
18511    /// Parse an INSERT statement, returning a `Box`ed SetExpr
18512    ///
18513    /// This is used to reduce the size of the stack frames in debug builds
18514    fn parse_insert_setexpr_boxed(
18515        &mut self,
18516        insert_token: TokenWithSpan,
18517    ) -> Result<Box<SetExpr>, ParserError> {
18518        Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
18519    }
18520
18521    /// Parse an INSERT statement
18522    pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
18523        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18524        let or = self.parse_conflict_clause();
18525        let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
18526            None
18527        } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
18528            Some(MysqlInsertPriority::LowPriority)
18529        } else if self.parse_keyword(Keyword::DELAYED) {
18530            Some(MysqlInsertPriority::Delayed)
18531        } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
18532            Some(MysqlInsertPriority::HighPriority)
18533        } else {
18534            None
18535        };
18536
18537        let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
18538            && self.parse_keyword(Keyword::IGNORE);
18539
18540        let replace_into = false;
18541
18542        let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18543        let into = self.parse_keyword(Keyword::INTO);
18544
18545        let local = self.parse_keyword(Keyword::LOCAL);
18546
18547        if self.parse_keyword(Keyword::DIRECTORY) {
18548            let path = self.parse_literal_string()?;
18549            let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18550                Some(self.parse_file_format()?)
18551            } else {
18552                None
18553            };
18554            let source = self.parse_query()?;
18555            Ok(Statement::Directory {
18556                local,
18557                path,
18558                overwrite,
18559                file_format,
18560                source,
18561            })
18562        } else {
18563            // Hive lets you put table here regardless
18564            let table = self.parse_keyword(Keyword::TABLE);
18565            let table_object = self.parse_table_object()?;
18566
18567            let table_alias = if self.dialect.supports_insert_table_alias()
18568                && !self.peek_sub_query()
18569                && self
18570                    .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18571                    .is_none()
18572            {
18573                if self.parse_keyword(Keyword::AS) {
18574                    Some(TableAliasWithoutColumns {
18575                        explicit: true,
18576                        alias: self.parse_identifier()?,
18577                    })
18578                } else {
18579                    self.maybe_parse(|parser| parser.parse_identifier())?
18580                        .map(|alias| TableAliasWithoutColumns {
18581                            explicit: false,
18582                            alias,
18583                        })
18584                }
18585            } else {
18586                None
18587            };
18588
18589            let is_mysql = dialect_of!(self is MySqlDialect);
18590
18591            let (columns, partitioned, after_columns, output, source, assignments) = if self
18592                .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18593            {
18594                (vec![], None, vec![], None, None, vec![])
18595            } else {
18596                let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18597                    let columns =
18598                        self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18599
18600                    let partitioned = self.parse_insert_partition()?;
18601                    // Hive allows you to specify columns after partitions as well if you want.
18602                    let after_columns = if dialect_of!(self is HiveDialect) {
18603                        self.parse_parenthesized_column_list(Optional, false)?
18604                    } else {
18605                        vec![]
18606                    };
18607                    (columns, partitioned, after_columns)
18608                } else {
18609                    Default::default()
18610                };
18611
18612                let output = self.maybe_parse_output_clause()?;
18613
18614                let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18615                    || self.peek_keyword(Keyword::SETTINGS)
18616                {
18617                    (None, vec![])
18618                } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18619                    (None, self.parse_comma_separated(Parser::parse_assignment)?)
18620                } else {
18621                    (Some(self.parse_query()?), vec![])
18622                };
18623
18624                (
18625                    columns,
18626                    partitioned,
18627                    after_columns,
18628                    output,
18629                    source,
18630                    assignments,
18631                )
18632            };
18633
18634            let (format_clause, settings) = if self.dialect.supports_insert_format() {
18635                // Settings always comes before `FORMAT` for ClickHouse:
18636                // <https://clickhouse.com/docs/en/sql-reference/statements/insert-into>
18637                let settings = self.parse_settings()?;
18638
18639                let format = if self.parse_keyword(Keyword::FORMAT) {
18640                    Some(self.parse_input_format_clause()?)
18641                } else {
18642                    None
18643                };
18644
18645                (format, settings)
18646            } else {
18647                Default::default()
18648            };
18649
18650            let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18651                && self.parse_keyword(Keyword::AS)
18652            {
18653                let row_alias = self.parse_object_name(false)?;
18654                let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18655                Some(InsertAliases {
18656                    row_alias,
18657                    col_aliases,
18658                })
18659            } else {
18660                None
18661            };
18662
18663            let on = if self.parse_keyword(Keyword::ON) {
18664                if self.parse_keyword(Keyword::CONFLICT) {
18665                    let conflict_target =
18666                        if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18667                            Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18668                        } else if self.peek_token_ref().token == Token::LParen {
18669                            Some(ConflictTarget::Columns(
18670                                self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18671                            ))
18672                        } else {
18673                            None
18674                        };
18675
18676                    self.expect_keyword_is(Keyword::DO)?;
18677                    let action = if self.parse_keyword(Keyword::NOTHING) {
18678                        OnConflictAction::DoNothing
18679                    } else {
18680                        self.expect_keyword_is(Keyword::UPDATE)?;
18681                        self.expect_keyword_is(Keyword::SET)?;
18682                        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18683                        let selection = if self.parse_keyword(Keyword::WHERE) {
18684                            Some(self.parse_expr()?)
18685                        } else {
18686                            None
18687                        };
18688                        OnConflictAction::DoUpdate(DoUpdate {
18689                            assignments,
18690                            selection,
18691                        })
18692                    };
18693
18694                    Some(OnInsert::OnConflict(OnConflict {
18695                        conflict_target,
18696                        action,
18697                    }))
18698                } else {
18699                    self.expect_keyword_is(Keyword::DUPLICATE)?;
18700                    self.expect_keyword_is(Keyword::KEY)?;
18701                    self.expect_keyword_is(Keyword::UPDATE)?;
18702                    let l = self.parse_comma_separated(Parser::parse_assignment)?;
18703
18704                    Some(OnInsert::DuplicateKeyUpdate(l))
18705                }
18706            } else {
18707                None
18708            };
18709
18710            let returning = if self.parse_keyword(Keyword::RETURNING) {
18711                Some(self.parse_comma_separated(Parser::parse_select_item)?)
18712            } else {
18713                None
18714            };
18715
18716            Ok(Insert {
18717                insert_token: insert_token.into(),
18718                optimizer_hints,
18719                or,
18720                table: table_object,
18721                table_alias,
18722                ignore,
18723                into,
18724                overwrite,
18725                partitioned,
18726                columns,
18727                after_columns,
18728                source,
18729                assignments,
18730                has_table_keyword: table,
18731                on,
18732                returning,
18733                output,
18734                replace_into,
18735                priority,
18736                insert_alias,
18737                settings,
18738                format_clause,
18739                multi_table_insert_type: None,
18740                multi_table_into_clauses: vec![],
18741                multi_table_when_clauses: vec![],
18742                multi_table_else_clause: None,
18743            }
18744            .into())
18745        }
18746    }
18747
18748    /// Parses input format clause used for ClickHouse.
18749    ///
18750    /// <https://clickhouse.com/docs/en/interfaces/formats>
18751    pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18752        let ident = self.parse_identifier()?;
18753        let values = self
18754            .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18755            .unwrap_or_default();
18756
18757        Ok(InputFormatClause { ident, values })
18758    }
18759
18760    /// Returns true if the immediate tokens look like the
18761    /// beginning of a subquery. `(SELECT ...`
18762    fn peek_subquery_start(&mut self) -> bool {
18763        matches!(
18764            self.peek_tokens_ref(),
18765            [
18766                TokenWithSpan {
18767                    token: Token::LParen,
18768                    ..
18769                },
18770                TokenWithSpan {
18771                    token: Token::Word(Word {
18772                        keyword: Keyword::SELECT,
18773                        ..
18774                    }),
18775                    ..
18776                },
18777            ]
18778        )
18779    }
18780
18781    /// Returns true if the immediate tokens look like the
18782    /// beginning of a subquery possibly preceded by CTEs;
18783    /// i.e. `(WITH ...` or `(SELECT ...`.
18784    fn peek_subquery_or_cte_start(&mut self) -> bool {
18785        matches!(
18786            self.peek_tokens_ref(),
18787            [
18788                TokenWithSpan {
18789                    token: Token::LParen,
18790                    ..
18791                },
18792                TokenWithSpan {
18793                    token: Token::Word(Word {
18794                        keyword: Keyword::SELECT | Keyword::WITH,
18795                        ..
18796                    }),
18797                    ..
18798                },
18799            ]
18800        )
18801    }
18802
18803    fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18804        if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18805            Some(SqliteOnConflict::Replace)
18806        } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18807            Some(SqliteOnConflict::Rollback)
18808        } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18809            Some(SqliteOnConflict::Abort)
18810        } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18811            Some(SqliteOnConflict::Fail)
18812        } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18813            Some(SqliteOnConflict::Ignore)
18814        } else if self.parse_keyword(Keyword::REPLACE) {
18815            Some(SqliteOnConflict::Replace)
18816        } else {
18817            None
18818        }
18819    }
18820
18821    /// Parse an optional `PARTITION (...)` clause for INSERT statements.
18822    pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18823        if self.parse_keyword(Keyword::PARTITION) {
18824            self.expect_token(&Token::LParen)?;
18825            let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18826            self.expect_token(&Token::RParen)?;
18827            Ok(partition_cols)
18828        } else {
18829            Ok(None)
18830        }
18831    }
18832
18833    /// Parse optional Hive `INPUTFORMAT ... SERDE ...` clause used by LOAD DATA.
18834    pub fn parse_load_data_table_format(
18835        &mut self,
18836    ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18837        if self.parse_keyword(Keyword::INPUTFORMAT) {
18838            let input_format = self.parse_expr()?;
18839            self.expect_keyword_is(Keyword::SERDE)?;
18840            let serde = self.parse_expr()?;
18841            Ok(Some(HiveLoadDataFormat {
18842                input_format,
18843                serde,
18844            }))
18845        } else {
18846            Ok(None)
18847        }
18848    }
18849
18850    /// Parse an UPDATE statement, returning a `Box`ed SetExpr
18851    ///
18852    /// This is used to reduce the size of the stack frames in debug builds
18853    fn parse_update_setexpr_boxed(
18854        &mut self,
18855        update_token: TokenWithSpan,
18856    ) -> Result<Box<SetExpr>, ParserError> {
18857        Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18858    }
18859
18860    /// Parse an `UPDATE` statement and return `Statement::Update`.
18861    pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18862        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18863        let or = self.parse_conflict_clause();
18864        let table = self.parse_table_and_joins()?;
18865        let from_before_set = if self.parse_keyword(Keyword::FROM) {
18866            Some(UpdateTableFromKind::BeforeSet(
18867                self.parse_table_with_joins()?,
18868            ))
18869        } else {
18870            None
18871        };
18872        self.expect_keyword(Keyword::SET)?;
18873        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18874
18875        let output = self.maybe_parse_output_clause()?;
18876
18877        let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18878            Some(UpdateTableFromKind::AfterSet(
18879                self.parse_table_with_joins()?,
18880            ))
18881        } else {
18882            from_before_set
18883        };
18884        let selection = if self.parse_keyword(Keyword::WHERE) {
18885            Some(self.parse_expr()?)
18886        } else {
18887            None
18888        };
18889        let returning = if self.parse_keyword(Keyword::RETURNING) {
18890            Some(self.parse_comma_separated(Parser::parse_select_item)?)
18891        } else {
18892            None
18893        };
18894        let order_by = if self.dialect.supports_update_order_by()
18895            && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18896        {
18897            self.parse_comma_separated(Parser::parse_order_by_expr)?
18898        } else {
18899            vec![]
18900        };
18901        let limit = if self.parse_keyword(Keyword::LIMIT) {
18902            Some(self.parse_expr()?)
18903        } else {
18904            None
18905        };
18906        Ok(Update {
18907            update_token: update_token.into(),
18908            optimizer_hints,
18909            table,
18910            assignments,
18911            from,
18912            selection,
18913            returning,
18914            output,
18915            or,
18916            order_by,
18917            limit,
18918        }
18919        .into())
18920    }
18921
18922    /// Parse a `var = expr` assignment, used in an UPDATE statement
18923    pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18924        let target = self.parse_assignment_target()?;
18925        self.expect_token(&Token::Eq)?;
18926        let value = self.parse_expr()?;
18927        Ok(Assignment { target, value })
18928    }
18929
18930    /// Parse the left-hand side of an assignment, used in an UPDATE statement
18931    pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18932        if self.consume_token(&Token::LParen) {
18933            let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18934            self.expect_token(&Token::RParen)?;
18935            Ok(AssignmentTarget::Tuple(columns))
18936        } else {
18937            let column = self.parse_object_name(false)?;
18938            Ok(AssignmentTarget::ColumnName(column))
18939        }
18940    }
18941
18942    /// Parse a single function argument, handling named and unnamed variants.
18943    pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18944        let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18945            self.maybe_parse(|p| {
18946                let name = p.parse_expr()?;
18947                let operator = p.parse_function_named_arg_operator()?;
18948                let arg = p.parse_wildcard_expr()?.into();
18949                Ok(FunctionArg::ExprNamed {
18950                    name,
18951                    arg,
18952                    operator,
18953                })
18954            })?
18955        } else {
18956            self.maybe_parse(|p| {
18957                let name = p.parse_identifier()?;
18958                let operator = p.parse_function_named_arg_operator()?;
18959                let arg = p.parse_wildcard_expr()?.into();
18960                Ok(FunctionArg::Named {
18961                    name,
18962                    arg,
18963                    operator,
18964                })
18965            })?
18966        };
18967        if let Some(arg) = arg {
18968            return Ok(arg);
18969        }
18970        let wildcard_expr = self.parse_wildcard_expr()?;
18971        let arg_expr: FunctionArgExpr = match wildcard_expr {
18972            Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18973                // Support `* EXCLUDE(col1, col2, ...)` inside function calls (e.g. Snowflake's
18974                // `HASH(* EXCLUDE(col))`).  Parse the options the same way SELECT items do.
18975                let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18976                if opts.opt_exclude.is_some()
18977                    || opts.opt_except.is_some()
18978                    || opts.opt_replace.is_some()
18979                    || opts.opt_rename.is_some()
18980                    || opts.opt_ilike.is_some()
18981                {
18982                    FunctionArgExpr::WildcardWithOptions(opts)
18983                } else {
18984                    wildcard_expr.into()
18985                }
18986            }
18987            other => other.into(),
18988        };
18989        Ok(FunctionArg::Unnamed(arg_expr))
18990    }
18991
18992    fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18993        if self.parse_keyword(Keyword::VALUE) {
18994            return Ok(FunctionArgOperator::Value);
18995        }
18996        let tok = self.next_token();
18997        match tok.token {
18998            Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18999                Ok(FunctionArgOperator::RightArrow)
19000            }
19001            Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
19002                Ok(FunctionArgOperator::Equals)
19003            }
19004            Token::Assignment
19005                if self
19006                    .dialect
19007                    .supports_named_fn_args_with_assignment_operator() =>
19008            {
19009                Ok(FunctionArgOperator::Assignment)
19010            }
19011            Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
19012                Ok(FunctionArgOperator::Colon)
19013            }
19014            _ => {
19015                self.prev_token();
19016                self.expected("argument operator", tok)
19017            }
19018        }
19019    }
19020
19021    /// Parse an optional, comma-separated list of function arguments (consumes closing paren).
19022    pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
19023        if self.consume_token(&Token::RParen) {
19024            Ok(vec![])
19025        } else {
19026            let args = self.parse_comma_separated(Parser::parse_function_args)?;
19027            self.expect_token(&Token::RParen)?;
19028            Ok(args)
19029        }
19030    }
19031
19032    fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
19033        if self.consume_token(&Token::RParen) {
19034            return Ok(TableFunctionArgs {
19035                args: vec![],
19036                settings: None,
19037            });
19038        }
19039        let mut args = vec![];
19040        let settings = loop {
19041            if let Some(settings) = self.parse_settings()? {
19042                break Some(settings);
19043            }
19044            args.push(self.parse_function_args()?);
19045            if self.is_parse_comma_separated_end() {
19046                break None;
19047            }
19048        };
19049        self.expect_token(&Token::RParen)?;
19050        Ok(TableFunctionArgs { args, settings })
19051    }
19052
19053    /// Parses a potentially empty list of arguments to a function
19054    /// (including the closing parenthesis).
19055    ///
19056    /// Examples:
19057    /// ```sql
19058    /// FIRST_VALUE(x ORDER BY 1,2,3);
19059    /// FIRST_VALUE(x IGNORE NULL);
19060    /// ```
19061    fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
19062        let mut clauses = vec![];
19063
19064        // Handle clauses that may exist with an empty argument list
19065
19066        if let Some(null_clause) = self.parse_json_null_clause() {
19067            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19068        }
19069
19070        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19071            clauses.push(FunctionArgumentClause::JsonReturningClause(
19072                json_returning_clause,
19073            ));
19074        }
19075
19076        if self.consume_token(&Token::RParen) {
19077            return Ok(FunctionArgumentList {
19078                duplicate_treatment: None,
19079                args: vec![],
19080                clauses,
19081            });
19082        }
19083
19084        let duplicate_treatment = self.parse_duplicate_treatment()?;
19085        let args = self.parse_comma_separated(Parser::parse_function_args)?;
19086
19087        if self.dialect.supports_window_function_null_treatment_arg() {
19088            if let Some(null_treatment) = self.parse_null_treatment()? {
19089                clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
19090            }
19091        }
19092
19093        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
19094            clauses.push(FunctionArgumentClause::OrderBy(
19095                self.parse_comma_separated(Parser::parse_order_by_expr)?,
19096            ));
19097        }
19098
19099        if self.parse_keyword(Keyword::LIMIT) {
19100            clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
19101        }
19102
19103        if dialect_of!(self is GenericDialect | BigQueryDialect)
19104            && self.parse_keyword(Keyword::HAVING)
19105        {
19106            let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
19107                Keyword::MIN => HavingBoundKind::Min,
19108                Keyword::MAX => HavingBoundKind::Max,
19109                unexpected_keyword => return Err(ParserError::ParserError(
19110                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
19111                )),
19112            };
19113            clauses.push(FunctionArgumentClause::Having(HavingBound(
19114                kind,
19115                self.parse_expr()?,
19116            )))
19117        }
19118
19119        if dialect_of!(self is GenericDialect | MySqlDialect)
19120            && self.parse_keyword(Keyword::SEPARATOR)
19121        {
19122            clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
19123        }
19124
19125        if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
19126            clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
19127        }
19128
19129        if let Some(null_clause) = self.parse_json_null_clause() {
19130            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19131        }
19132
19133        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19134            clauses.push(FunctionArgumentClause::JsonReturningClause(
19135                json_returning_clause,
19136            ));
19137        }
19138
19139        self.expect_token(&Token::RParen)?;
19140        Ok(FunctionArgumentList {
19141            duplicate_treatment,
19142            args,
19143            clauses,
19144        })
19145    }
19146
19147    fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
19148        if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
19149            Some(JsonNullClause::AbsentOnNull)
19150        } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
19151            Some(JsonNullClause::NullOnNull)
19152        } else {
19153            None
19154        }
19155    }
19156
19157    fn maybe_parse_json_returning_clause(
19158        &mut self,
19159    ) -> Result<Option<JsonReturningClause>, ParserError> {
19160        if self.parse_keyword(Keyword::RETURNING) {
19161            let data_type = self.parse_data_type()?;
19162            Ok(Some(JsonReturningClause { data_type }))
19163        } else {
19164            Ok(None)
19165        }
19166    }
19167
19168    fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
19169        let loc = self.peek_token_ref().span.start;
19170        match (
19171            self.parse_keyword(Keyword::ALL),
19172            self.parse_keyword(Keyword::DISTINCT),
19173        ) {
19174            (true, false) => Ok(Some(DuplicateTreatment::All)),
19175            (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
19176            (false, false) => Ok(None),
19177            (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
19178        }
19179    }
19180
19181    /// Parse a comma-delimited list of projections after SELECT
19182    pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
19183        let prefix = self
19184            .parse_one_of_keywords(
19185                self.dialect
19186                    .get_reserved_keywords_for_select_item_operator(),
19187            )
19188            .map(|keyword| Ident::new(format!("{keyword:?}")));
19189
19190        match self.parse_wildcard_expr()? {
19191            Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
19192                SelectItemQualifiedWildcardKind::ObjectName(prefix),
19193                self.parse_wildcard_additional_options(token.0)?,
19194            )),
19195            Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
19196                self.parse_wildcard_additional_options(token.0)?,
19197            )),
19198            Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
19199                parser_err!(
19200                    format!("Expected an expression, found: {}", v),
19201                    self.peek_token_ref().span.start
19202                )
19203            }
19204            Expr::BinaryOp {
19205                left,
19206                op: BinaryOperator::Eq,
19207                right,
19208            } if self.dialect.supports_eq_alias_assignment()
19209                && matches!(left.as_ref(), Expr::Identifier(_)) =>
19210            {
19211                let Expr::Identifier(alias) = *left else {
19212                    return parser_err!(
19213                        "BUG: expected identifier expression as alias",
19214                        self.peek_token_ref().span.start
19215                    );
19216                };
19217                Ok(SelectItem::ExprWithAlias {
19218                    expr: *right,
19219                    alias,
19220                })
19221            }
19222            expr if self.dialect.supports_select_expr_star()
19223                && self.consume_tokens(&[Token::Period, Token::Mul]) =>
19224            {
19225                let wildcard_token = self.get_previous_token().clone();
19226                Ok(SelectItem::QualifiedWildcard(
19227                    SelectItemQualifiedWildcardKind::Expr(expr),
19228                    self.parse_wildcard_additional_options(wildcard_token)?,
19229                ))
19230            }
19231            expr if self.dialect.supports_select_item_multi_column_alias()
19232                && self.peek_keyword(Keyword::AS)
19233                && self.peek_nth_token(1).token == Token::LParen =>
19234            {
19235                self.expect_keyword(Keyword::AS)?;
19236                self.expect_token(&Token::LParen)?;
19237                let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
19238                self.expect_token(&Token::RParen)?;
19239                Ok(SelectItem::ExprWithAliases {
19240                    expr: maybe_prefixed_expr(expr, prefix),
19241                    aliases,
19242                })
19243            }
19244            expr => self
19245                .maybe_parse_select_item_alias()
19246                .map(|alias| match alias {
19247                    Some(alias) => SelectItem::ExprWithAlias {
19248                        expr: maybe_prefixed_expr(expr, prefix),
19249                        alias,
19250                    },
19251                    None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
19252                }),
19253        }
19254    }
19255
19256    /// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
19257    ///
19258    /// If it is not possible to parse it, will return an option.
19259    pub fn parse_wildcard_additional_options(
19260        &mut self,
19261        wildcard_token: TokenWithSpan,
19262    ) -> Result<WildcardAdditionalOptions, ParserError> {
19263        let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
19264            self.parse_optional_select_item_ilike()?
19265        } else {
19266            None
19267        };
19268        let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
19269        {
19270            self.parse_optional_select_item_exclude()?
19271        } else {
19272            None
19273        };
19274        let opt_except = if self.dialect.supports_select_wildcard_except() {
19275            self.parse_optional_select_item_except()?
19276        } else {
19277            None
19278        };
19279        let opt_replace = if self.dialect.supports_select_wildcard_replace() {
19280            self.parse_optional_select_item_replace()?
19281        } else {
19282            None
19283        };
19284        let opt_rename = if self.dialect.supports_select_wildcard_rename() {
19285            self.parse_optional_select_item_rename()?
19286        } else {
19287            None
19288        };
19289
19290        let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
19291            self.maybe_parse_select_item_alias()?
19292        } else {
19293            None
19294        };
19295
19296        Ok(WildcardAdditionalOptions {
19297            wildcard_token: wildcard_token.into(),
19298            opt_ilike,
19299            opt_exclude,
19300            opt_except,
19301            opt_rename,
19302            opt_replace,
19303            opt_alias,
19304        })
19305    }
19306
19307    /// Parse an [`Ilike`](IlikeSelectItem) information for wildcard select items.
19308    ///
19309    /// If it is not possible to parse it, will return an option.
19310    pub fn parse_optional_select_item_ilike(
19311        &mut self,
19312    ) -> Result<Option<IlikeSelectItem>, ParserError> {
19313        let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
19314            let next_token = self.next_token();
19315            let pattern = match next_token.token {
19316                Token::SingleQuotedString(s) => s,
19317                _ => return self.expected("ilike pattern", next_token),
19318            };
19319            Some(IlikeSelectItem { pattern })
19320        } else {
19321            None
19322        };
19323        Ok(opt_ilike)
19324    }
19325
19326    /// Parse an [`Exclude`](ExcludeSelectItem) information for wildcard select items.
19327    ///
19328    /// If it is not possible to parse it, will return an option.
19329    pub fn parse_optional_select_item_exclude(
19330        &mut self,
19331    ) -> Result<Option<ExcludeSelectItem>, ParserError> {
19332        let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
19333            if self.consume_token(&Token::LParen) {
19334                let columns =
19335                    self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
19336                self.expect_token(&Token::RParen)?;
19337                Some(ExcludeSelectItem::Multiple(columns))
19338            } else {
19339                let column = self.parse_object_name(false)?;
19340                Some(ExcludeSelectItem::Single(column))
19341            }
19342        } else {
19343            None
19344        };
19345
19346        Ok(opt_exclude)
19347    }
19348
19349    /// Parse an [`Except`](ExceptSelectItem) information for wildcard select items.
19350    ///
19351    /// If it is not possible to parse it, will return an option.
19352    pub fn parse_optional_select_item_except(
19353        &mut self,
19354    ) -> Result<Option<ExceptSelectItem>, ParserError> {
19355        let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
19356            if self.peek_token_ref().token == Token::LParen {
19357                let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
19358                match &idents[..] {
19359                    [] => {
19360                        return self.expected_ref(
19361                            "at least one column should be parsed by the expect clause",
19362                            self.peek_token_ref(),
19363                        )?;
19364                    }
19365                    [first, idents @ ..] => Some(ExceptSelectItem {
19366                        first_element: first.clone(),
19367                        additional_elements: idents.to_vec(),
19368                    }),
19369                }
19370            } else {
19371                // Clickhouse allows EXCEPT column_name
19372                let ident = self.parse_identifier()?;
19373                Some(ExceptSelectItem {
19374                    first_element: ident,
19375                    additional_elements: vec![],
19376                })
19377            }
19378        } else {
19379            None
19380        };
19381
19382        Ok(opt_except)
19383    }
19384
19385    /// Parse a [`Rename`](RenameSelectItem) information for wildcard select items.
19386    pub fn parse_optional_select_item_rename(
19387        &mut self,
19388    ) -> Result<Option<RenameSelectItem>, ParserError> {
19389        let opt_rename = if self.parse_keyword(Keyword::RENAME) {
19390            if self.consume_token(&Token::LParen) {
19391                let idents =
19392                    self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
19393                self.expect_token(&Token::RParen)?;
19394                Some(RenameSelectItem::Multiple(idents))
19395            } else {
19396                let ident = self.parse_identifier_with_alias()?;
19397                Some(RenameSelectItem::Single(ident))
19398            }
19399        } else {
19400            None
19401        };
19402
19403        Ok(opt_rename)
19404    }
19405
19406    /// Parse a [`Replace`](ReplaceSelectItem) information for wildcard select items.
19407    pub fn parse_optional_select_item_replace(
19408        &mut self,
19409    ) -> Result<Option<ReplaceSelectItem>, ParserError> {
19410        let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
19411            if self.consume_token(&Token::LParen) {
19412                let items = self.parse_comma_separated(|parser| {
19413                    Ok(Box::new(parser.parse_replace_elements()?))
19414                })?;
19415                self.expect_token(&Token::RParen)?;
19416                Some(ReplaceSelectItem { items })
19417            } else {
19418                let tok = self.next_token();
19419                return self.expected("( after REPLACE but", tok);
19420            }
19421        } else {
19422            None
19423        };
19424
19425        Ok(opt_replace)
19426    }
19427    /// Parse a single element of a `REPLACE (...)` select-item clause.
19428    pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
19429        let expr = self.parse_expr()?;
19430        let as_keyword = self.parse_keyword(Keyword::AS);
19431        let ident = self.parse_identifier()?;
19432        Ok(ReplaceSelectElement {
19433            expr,
19434            column_name: ident,
19435            as_keyword,
19436        })
19437    }
19438
19439    /// Parse ASC or DESC, returns an Option with true if ASC, false of DESC or `None` if none of
19440    /// them.
19441    pub fn parse_asc_desc(&mut self) -> Option<bool> {
19442        if self.parse_keyword(Keyword::ASC) {
19443            Some(true)
19444        } else if self.parse_keyword(Keyword::DESC) {
19445            Some(false)
19446        } else {
19447            None
19448        }
19449    }
19450
19451    /// Parse an [OrderByExpr] expression.
19452    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
19453        self.parse_order_by_expr_inner(false)
19454            .map(|(order_by, _)| order_by)
19455    }
19456
19457    /// Parse an [IndexColumn].
19458    pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
19459        self.parse_order_by_expr_inner(true)
19460            .map(|(column, operator_class)| IndexColumn {
19461                column,
19462                operator_class,
19463            })
19464    }
19465
19466    fn parse_order_by_expr_inner(
19467        &mut self,
19468        with_operator_class: bool,
19469    ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
19470        let expr = self.parse_expr()?;
19471
19472        let operator_class: Option<ObjectName> = if with_operator_class {
19473            // We check that if non of the following keywords are present, then we parse an
19474            // identifier as operator class.
19475            if self
19476                .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
19477                .is_some()
19478            {
19479                None
19480            } else {
19481                self.maybe_parse(|parser| parser.parse_object_name(false))?
19482            }
19483        } else {
19484            None
19485        };
19486
19487        let options = self.parse_order_by_options()?;
19488
19489        let with_fill = if self.dialect.supports_with_fill()
19490            && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
19491        {
19492            Some(self.parse_with_fill()?)
19493        } else {
19494            None
19495        };
19496
19497        Ok((
19498            OrderByExpr {
19499                expr,
19500                options,
19501                with_fill,
19502            },
19503            operator_class,
19504        ))
19505    }
19506
19507    fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19508        let asc = self.parse_asc_desc();
19509
19510        let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19511            Some(true)
19512        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19513            Some(false)
19514        } else {
19515            None
19516        };
19517
19518        Ok(OrderByOptions { asc, nulls_first })
19519    }
19520
19521    // Parse a WITH FILL clause (ClickHouse dialect)
19522    // that follow the WITH FILL keywords in a ORDER BY clause
19523    /// Parse a `WITH FILL` clause used in ORDER BY (ClickHouse dialect).
19524    pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19525        let from = if self.parse_keyword(Keyword::FROM) {
19526            Some(self.parse_expr()?)
19527        } else {
19528            None
19529        };
19530
19531        let to = if self.parse_keyword(Keyword::TO) {
19532            Some(self.parse_expr()?)
19533        } else {
19534            None
19535        };
19536
19537        let step = if self.parse_keyword(Keyword::STEP) {
19538            Some(self.parse_expr()?)
19539        } else {
19540            None
19541        };
19542
19543        Ok(WithFill { from, to, step })
19544    }
19545
19546    /// Parse a set of comma separated INTERPOLATE expressions (ClickHouse dialect)
19547    /// that follow the INTERPOLATE keyword in an ORDER BY clause with the WITH FILL modifier
19548    pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19549        if !self.parse_keyword(Keyword::INTERPOLATE) {
19550            return Ok(None);
19551        }
19552
19553        if self.consume_token(&Token::LParen) {
19554            let interpolations =
19555                self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19556            self.expect_token(&Token::RParen)?;
19557            // INTERPOLATE () and INTERPOLATE ( ... ) variants
19558            return Ok(Some(Interpolate {
19559                exprs: Some(interpolations),
19560            }));
19561        }
19562
19563        // INTERPOLATE
19564        Ok(Some(Interpolate { exprs: None }))
19565    }
19566
19567    /// Parse a INTERPOLATE expression (ClickHouse dialect)
19568    pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19569        let column = self.parse_identifier()?;
19570        let expr = if self.parse_keyword(Keyword::AS) {
19571            Some(self.parse_expr()?)
19572        } else {
19573            None
19574        };
19575        Ok(InterpolateExpr { column, expr })
19576    }
19577
19578    /// Parse a TOP clause, MSSQL equivalent of LIMIT,
19579    /// that follows after `SELECT [DISTINCT]`.
19580    pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19581        let quantity = if self.consume_token(&Token::LParen) {
19582            let quantity = self.parse_expr()?;
19583            self.expect_token(&Token::RParen)?;
19584            Some(TopQuantity::Expr(quantity))
19585        } else {
19586            let next_token = self.next_token();
19587            let quantity = match next_token.token {
19588                Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19589                _ => self.expected("literal int", next_token)?,
19590            };
19591            Some(TopQuantity::Constant(quantity))
19592        };
19593
19594        let percent = self.parse_keyword(Keyword::PERCENT);
19595
19596        let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19597
19598        Ok(Top {
19599            with_ties,
19600            percent,
19601            quantity,
19602        })
19603    }
19604
19605    /// Parse a LIMIT clause
19606    pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19607        if self.parse_keyword(Keyword::ALL) {
19608            Ok(None)
19609        } else {
19610            Ok(Some(self.parse_expr()?))
19611        }
19612    }
19613
19614    /// Parse an OFFSET clause
19615    pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19616        let value = self.parse_expr()?;
19617        let rows = if self.parse_keyword(Keyword::ROW) {
19618            OffsetRows::Row
19619        } else if self.parse_keyword(Keyword::ROWS) {
19620            OffsetRows::Rows
19621        } else {
19622            OffsetRows::None
19623        };
19624        Ok(Offset { value, rows })
19625    }
19626
19627    /// Parse a FETCH clause
19628    pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19629        let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19630
19631        let (quantity, percent) = if self
19632            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19633            .is_some()
19634        {
19635            (None, false)
19636        } else {
19637            let quantity = Expr::Value(self.parse_value()?);
19638            let percent = self.parse_keyword(Keyword::PERCENT);
19639            let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19640            (Some(quantity), percent)
19641        };
19642
19643        let with_ties = if self.parse_keyword(Keyword::ONLY) {
19644            false
19645        } else {
19646            self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19647        };
19648
19649        Ok(Fetch {
19650            with_ties,
19651            percent,
19652            quantity,
19653        })
19654    }
19655
19656    /// Parse a FOR UPDATE/FOR SHARE clause
19657    pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19658        let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19659            Keyword::UPDATE => LockType::Update,
19660            Keyword::SHARE => LockType::Share,
19661            unexpected_keyword => return Err(ParserError::ParserError(
19662                format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19663            )),
19664        };
19665        let of = if self.parse_keyword(Keyword::OF) {
19666            Some(self.parse_object_name(false)?)
19667        } else {
19668            None
19669        };
19670        let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19671            Some(NonBlock::Nowait)
19672        } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19673            Some(NonBlock::SkipLocked)
19674        } else {
19675            None
19676        };
19677        Ok(LockClause {
19678            lock_type,
19679            of,
19680            nonblock,
19681        })
19682    }
19683
19684    /// Parse a PostgreSQL `LOCK` statement.
19685    pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19686        self.expect_keyword(Keyword::LOCK)?;
19687
19688        if self.peek_keyword(Keyword::TABLES) {
19689            return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19690        }
19691
19692        let _ = self.parse_keyword(Keyword::TABLE);
19693        let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19694        let lock_mode = if self.parse_keyword(Keyword::IN) {
19695            let lock_mode = self.parse_lock_table_mode()?;
19696            self.expect_keyword(Keyword::MODE)?;
19697            Some(lock_mode)
19698        } else {
19699            None
19700        };
19701        let nowait = self.parse_keyword(Keyword::NOWAIT);
19702
19703        Ok(Lock {
19704            tables,
19705            lock_mode,
19706            nowait,
19707        })
19708    }
19709
19710    fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19711        let only = self.parse_keyword(Keyword::ONLY);
19712        let name = self.parse_object_name(false)?;
19713        let has_asterisk = self.consume_token(&Token::Mul);
19714
19715        Ok(LockTableTarget {
19716            name,
19717            only,
19718            has_asterisk,
19719        })
19720    }
19721
19722    fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19723        if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19724            Ok(LockTableMode::AccessShare)
19725        } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19726            Ok(LockTableMode::AccessExclusive)
19727        } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19728            Ok(LockTableMode::RowShare)
19729        } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19730            Ok(LockTableMode::RowExclusive)
19731        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19732            Ok(LockTableMode::ShareUpdateExclusive)
19733        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19734            Ok(LockTableMode::ShareRowExclusive)
19735        } else if self.parse_keyword(Keyword::SHARE) {
19736            Ok(LockTableMode::Share)
19737        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19738            Ok(LockTableMode::Exclusive)
19739        } else {
19740            self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19741        }
19742    }
19743
19744    /// Parse a VALUES clause
19745    pub fn parse_values(
19746        &mut self,
19747        allow_empty: bool,
19748        value_keyword: bool,
19749    ) -> Result<Values, ParserError> {
19750        let mut explicit_row = false;
19751
19752        let rows = self.parse_comma_separated(|parser| {
19753            if parser.parse_keyword(Keyword::ROW) {
19754                explicit_row = true;
19755            }
19756
19757            parser.expect_token(&Token::LParen)?;
19758            if allow_empty && parser.peek_token().token == Token::RParen {
19759                parser.next_token();
19760                Ok(vec![])
19761            } else {
19762                let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
19763                parser.expect_token(&Token::RParen)?;
19764                Ok(exprs)
19765            }
19766        })?;
19767        Ok(Values {
19768            explicit_row,
19769            rows,
19770            value_keyword,
19771        })
19772    }
19773
19774    /// Parse a 'START TRANSACTION' statement
19775    pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19776        self.expect_keyword_is(Keyword::TRANSACTION)?;
19777        Ok(Statement::StartTransaction {
19778            modes: self.parse_transaction_modes()?,
19779            begin: false,
19780            transaction: Some(BeginTransactionKind::Transaction),
19781            modifier: None,
19782            statements: vec![],
19783            exception: None,
19784            has_end_keyword: false,
19785        })
19786    }
19787
19788    /// Parse a transaction modifier keyword that can follow a `BEGIN` statement.
19789    pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19790        if !self.dialect.supports_start_transaction_modifier() {
19791            None
19792        } else if self.parse_keyword(Keyword::DEFERRED) {
19793            Some(TransactionModifier::Deferred)
19794        } else if self.parse_keyword(Keyword::IMMEDIATE) {
19795            Some(TransactionModifier::Immediate)
19796        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19797            Some(TransactionModifier::Exclusive)
19798        } else if self.parse_keyword(Keyword::TRY) {
19799            Some(TransactionModifier::Try)
19800        } else if self.parse_keyword(Keyword::CATCH) {
19801            Some(TransactionModifier::Catch)
19802        } else {
19803            None
19804        }
19805    }
19806
19807    /// Parse a 'BEGIN' statement
19808    pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19809        let modifier = self.parse_transaction_modifier();
19810        let transaction =
19811            match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19812            {
19813                Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19814                Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19815                Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19816                _ => None,
19817            };
19818        Ok(Statement::StartTransaction {
19819            modes: self.parse_transaction_modes()?,
19820            begin: true,
19821            transaction,
19822            modifier,
19823            statements: vec![],
19824            exception: None,
19825            has_end_keyword: false,
19826        })
19827    }
19828
19829    /// Parse a 'BEGIN ... EXCEPTION ... END' block
19830    pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19831        let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19832
19833        let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19834            let mut when = Vec::new();
19835
19836            // We can have multiple `WHEN` arms so we consume all cases until `END`
19837            while !self.peek_keyword(Keyword::END) {
19838                self.expect_keyword(Keyword::WHEN)?;
19839
19840                // Each `WHEN` case can have one or more conditions, e.g.
19841                // WHEN EXCEPTION_1 [OR EXCEPTION_2] THEN
19842                // So we parse identifiers until the `THEN` keyword.
19843                let mut idents = Vec::new();
19844
19845                while !self.parse_keyword(Keyword::THEN) {
19846                    let ident = self.parse_identifier()?;
19847                    idents.push(ident);
19848
19849                    self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19850                }
19851
19852                let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19853
19854                when.push(ExceptionWhen { idents, statements });
19855            }
19856
19857            Some(when)
19858        } else {
19859            None
19860        };
19861
19862        self.expect_keyword(Keyword::END)?;
19863
19864        Ok(Statement::StartTransaction {
19865            begin: true,
19866            statements,
19867            exception,
19868            has_end_keyword: true,
19869            transaction: None,
19870            modifier: None,
19871            modes: Default::default(),
19872        })
19873    }
19874
19875    /// Parse an 'END' statement
19876    pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19877        let modifier = if !self.dialect.supports_end_transaction_modifier() {
19878            None
19879        } else if self.parse_keyword(Keyword::TRY) {
19880            Some(TransactionModifier::Try)
19881        } else if self.parse_keyword(Keyword::CATCH) {
19882            Some(TransactionModifier::Catch)
19883        } else {
19884            None
19885        };
19886        Ok(Statement::Commit {
19887            chain: self.parse_commit_rollback_chain()?,
19888            end: true,
19889            modifier,
19890        })
19891    }
19892
19893    /// Parse a list of transaction modes
19894    pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19895        let mut modes = vec![];
19896        let mut required = false;
19897        loop {
19898            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19899                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19900                    TransactionIsolationLevel::ReadUncommitted
19901                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19902                    TransactionIsolationLevel::ReadCommitted
19903                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19904                    TransactionIsolationLevel::RepeatableRead
19905                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19906                    TransactionIsolationLevel::Serializable
19907                } else if self.parse_keyword(Keyword::SNAPSHOT) {
19908                    TransactionIsolationLevel::Snapshot
19909                } else {
19910                    self.expected_ref("isolation level", self.peek_token_ref())?
19911                };
19912                TransactionMode::IsolationLevel(iso_level)
19913            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19914                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19915            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19916                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19917            } else if required {
19918                self.expected_ref("transaction mode", self.peek_token_ref())?
19919            } else {
19920                break;
19921            };
19922            modes.push(mode);
19923            // ANSI requires a comma after each transaction mode, but
19924            // PostgreSQL, for historical reasons, does not. We follow
19925            // PostgreSQL in making the comma optional, since that is strictly
19926            // more general.
19927            required = self.consume_token(&Token::Comma);
19928        }
19929        Ok(modes)
19930    }
19931
19932    /// Parse a 'COMMIT' statement
19933    pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19934        Ok(Statement::Commit {
19935            chain: self.parse_commit_rollback_chain()?,
19936            end: false,
19937            modifier: None,
19938        })
19939    }
19940
19941    /// Parse a 'ROLLBACK' statement
19942    pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19943        let chain = self.parse_commit_rollback_chain()?;
19944        let savepoint = self.parse_rollback_savepoint()?;
19945
19946        Ok(Statement::Rollback { chain, savepoint })
19947    }
19948
19949    /// Parse an optional `AND [NO] CHAIN` clause for `COMMIT` and `ROLLBACK` statements
19950    pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19951        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19952        if self.parse_keyword(Keyword::AND) {
19953            let chain = !self.parse_keyword(Keyword::NO);
19954            self.expect_keyword_is(Keyword::CHAIN)?;
19955            Ok(chain)
19956        } else {
19957            Ok(false)
19958        }
19959    }
19960
19961    /// Parse an optional 'TO SAVEPOINT savepoint_name' clause for ROLLBACK statements
19962    pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19963        if self.parse_keyword(Keyword::TO) {
19964            let _ = self.parse_keyword(Keyword::SAVEPOINT);
19965            let savepoint = self.parse_identifier()?;
19966
19967            Ok(Some(savepoint))
19968        } else {
19969            Ok(None)
19970        }
19971    }
19972
19973    /// Parse a 'RAISERROR' statement
19974    pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19975        self.expect_token(&Token::LParen)?;
19976        let message = Box::new(self.parse_expr()?);
19977        self.expect_token(&Token::Comma)?;
19978        let severity = Box::new(self.parse_expr()?);
19979        self.expect_token(&Token::Comma)?;
19980        let state = Box::new(self.parse_expr()?);
19981        let arguments = if self.consume_token(&Token::Comma) {
19982            self.parse_comma_separated(Parser::parse_expr)?
19983        } else {
19984            vec![]
19985        };
19986        self.expect_token(&Token::RParen)?;
19987        let options = if self.parse_keyword(Keyword::WITH) {
19988            self.parse_comma_separated(Parser::parse_raiserror_option)?
19989        } else {
19990            vec![]
19991        };
19992        Ok(Statement::RaisError {
19993            message,
19994            severity,
19995            state,
19996            arguments,
19997            options,
19998        })
19999    }
20000
20001    /// Parse a single `RAISERROR` option
20002    pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
20003        match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
20004            Keyword::LOG => Ok(RaisErrorOption::Log),
20005            Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
20006            Keyword::SETERROR => Ok(RaisErrorOption::SetError),
20007            _ => self.expected_ref(
20008                "LOG, NOWAIT OR SETERROR raiserror option",
20009                self.peek_token_ref(),
20010            ),
20011        }
20012    }
20013
20014    /// Parse a MSSQL `THROW` statement.
20015    ///
20016    /// See [Statement::Throw]
20017    pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
20018        self.expect_keyword_is(Keyword::THROW)?;
20019
20020        let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
20021        let (message, state) = if error_number.is_some() {
20022            self.expect_token(&Token::Comma)?;
20023            let message = Box::new(self.parse_expr()?);
20024            self.expect_token(&Token::Comma)?;
20025            let state = Box::new(self.parse_expr()?);
20026            (Some(message), Some(state))
20027        } else {
20028            (None, None)
20029        };
20030
20031        Ok(ThrowStatement {
20032            error_number,
20033            message,
20034            state,
20035        })
20036    }
20037
20038    /// Parse a SQL `DEALLOCATE` statement
20039    pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
20040        let prepare = self.parse_keyword(Keyword::PREPARE);
20041        let name = self.parse_identifier()?;
20042        Ok(Statement::Deallocate { name, prepare })
20043    }
20044
20045    /// Parse a SQL `EXECUTE` statement
20046    pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
20047        let immediate =
20048            self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
20049
20050        // When `EXEC` is immediately followed by `(`, the content is a dynamic-SQL
20051        // expression — e.g. `EXEC (@sql)`, `EXEC ('SELECT ...')`, or
20052        // `EXEC ('SELECT ... FROM ' + @tbl + ' WHERE ...')`.
20053        // Skip name parsing; the expression ends up in `parameters` via the
20054        // `has_parentheses` path below, consistent with `EXECUTE IMMEDIATE <expr>`.
20055        let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
20056            None
20057        } else {
20058            Some(self.parse_object_name(false)?)
20059        };
20060
20061        let has_parentheses = self.consume_token(&Token::LParen);
20062
20063        let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
20064        let end_token = match (has_parentheses, self.peek_token().token) {
20065            (true, _) => Token::RParen,
20066            (false, Token::EOF) => Token::EOF,
20067            (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
20068            (false, _) => Token::SemiColon,
20069        };
20070
20071        let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
20072
20073        if has_parentheses {
20074            self.expect_token(&Token::RParen)?;
20075        }
20076
20077        let into = if self.parse_keyword(Keyword::INTO) {
20078            self.parse_comma_separated(Self::parse_identifier)?
20079        } else {
20080            vec![]
20081        };
20082
20083        let using = if self.parse_keyword(Keyword::USING) {
20084            self.parse_comma_separated(Self::parse_expr_with_alias)?
20085        } else {
20086            vec![]
20087        };
20088
20089        let output = self.parse_keyword(Keyword::OUTPUT);
20090
20091        let default = self.parse_keyword(Keyword::DEFAULT);
20092
20093        Ok(Statement::Execute {
20094            immediate,
20095            name,
20096            parameters,
20097            has_parentheses,
20098            into,
20099            using,
20100            output,
20101            default,
20102        })
20103    }
20104
20105    /// Parse a SQL `PREPARE` statement
20106    pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
20107        let name = self.parse_identifier()?;
20108
20109        let mut data_types = vec![];
20110        if self.consume_token(&Token::LParen) {
20111            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
20112            self.expect_token(&Token::RParen)?;
20113        }
20114
20115        self.expect_keyword_is(Keyword::AS)?;
20116        let statement = Box::new(self.parse_statement()?);
20117        Ok(Statement::Prepare {
20118            name,
20119            data_types,
20120            statement,
20121        })
20122    }
20123
20124    /// Parse a SQL `UNLOAD` statement
20125    pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
20126        self.expect_keyword(Keyword::UNLOAD)?;
20127        self.expect_token(&Token::LParen)?;
20128        let (query, query_text) =
20129            if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
20130                (None, Some(self.parse_literal_string()?))
20131            } else {
20132                (Some(self.parse_query()?), None)
20133            };
20134        self.expect_token(&Token::RParen)?;
20135
20136        self.expect_keyword_is(Keyword::TO)?;
20137        let to = self.parse_identifier()?;
20138        let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
20139            Some(self.parse_iam_role_kind()?)
20140        } else {
20141            None
20142        };
20143        let with = self.parse_options(Keyword::WITH)?;
20144        let mut options = vec![];
20145        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
20146            options.push(opt);
20147        }
20148        Ok(Statement::Unload {
20149            query,
20150            query_text,
20151            to,
20152            auth,
20153            with,
20154            options,
20155        })
20156    }
20157
20158    fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
20159        let temporary = self
20160            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
20161            .is_some();
20162        let unlogged = self.parse_keyword(Keyword::UNLOGGED);
20163        let table = self.parse_keyword(Keyword::TABLE);
20164        let name = self.parse_object_name(false)?;
20165
20166        Ok(SelectInto {
20167            temporary,
20168            unlogged,
20169            table,
20170            name,
20171        })
20172    }
20173
20174    fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
20175        let v = self.parse_value()?;
20176        match &v.value {
20177            Value::SingleQuotedString(_) => Ok(v),
20178            Value::DoubleQuotedString(_) => Ok(v),
20179            Value::Number(_, _) => Ok(v),
20180            Value::Placeholder(_) => Ok(v),
20181            _ => {
20182                self.prev_token();
20183                self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
20184            }
20185        }
20186    }
20187
20188    /// PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
20189    pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
20190        let name = self.parse_object_name(false)?;
20191        if self.consume_token(&Token::LParen) {
20192            let value = self.parse_pragma_value()?;
20193            self.expect_token(&Token::RParen)?;
20194            Ok(Statement::Pragma {
20195                name,
20196                value: Some(value),
20197                is_eq: false,
20198            })
20199        } else if self.consume_token(&Token::Eq) {
20200            Ok(Statement::Pragma {
20201                name,
20202                value: Some(self.parse_pragma_value()?),
20203                is_eq: true,
20204            })
20205        } else {
20206            Ok(Statement::Pragma {
20207                name,
20208                value: None,
20209                is_eq: false,
20210            })
20211        }
20212    }
20213
20214    /// `INSTALL [extension_name]`
20215    pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
20216        let extension_name = self.parse_identifier()?;
20217
20218        Ok(Statement::Install { extension_name })
20219    }
20220
20221    /// Parse a SQL LOAD statement
20222    pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
20223        if self.dialect.supports_load_extension() {
20224            let extension_name = self.parse_identifier()?;
20225            Ok(Statement::Load { extension_name })
20226        } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
20227            let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
20228            self.expect_keyword_is(Keyword::INPATH)?;
20229            let inpath = self.parse_literal_string()?;
20230            let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
20231            self.expect_keyword_is(Keyword::INTO)?;
20232            self.expect_keyword_is(Keyword::TABLE)?;
20233            let table_name = self.parse_object_name(false)?;
20234            let partitioned = self.parse_insert_partition()?;
20235            let table_format = self.parse_load_data_table_format()?;
20236            Ok(Statement::LoadData {
20237                local,
20238                inpath,
20239                overwrite,
20240                table_name,
20241                partitioned,
20242                table_format,
20243            })
20244        } else {
20245            self.expected_ref(
20246                "`DATA` or an extension name after `LOAD`",
20247                self.peek_token_ref(),
20248            )
20249        }
20250    }
20251
20252    /// ClickHouse:
20253    /// ```sql
20254    /// OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]
20255    /// ```
20256    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/optimize)
20257    ///
20258    /// Databricks:
20259    /// ```sql
20260    /// OPTIMIZE table_name [WHERE predicate] [ZORDER BY (col_name1 [, ...])]
20261    /// ```
20262    /// [Databricks](https://docs.databricks.com/en/sql/language-manual/delta-optimize.html)
20263    pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
20264        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
20265
20266        let name = self.parse_object_name(false)?;
20267
20268        // ClickHouse-specific options
20269        let on_cluster = self.parse_optional_on_cluster()?;
20270
20271        let partition = if self.parse_keyword(Keyword::PARTITION) {
20272            if self.parse_keyword(Keyword::ID) {
20273                Some(Partition::Identifier(self.parse_identifier()?))
20274            } else {
20275                Some(Partition::Expr(self.parse_expr()?))
20276            }
20277        } else {
20278            None
20279        };
20280
20281        let include_final = self.parse_keyword(Keyword::FINAL);
20282
20283        let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
20284            if self.parse_keyword(Keyword::BY) {
20285                Some(Deduplicate::ByExpression(self.parse_expr()?))
20286            } else {
20287                Some(Deduplicate::All)
20288            }
20289        } else {
20290            None
20291        };
20292
20293        // Databricks-specific options
20294        let predicate = if self.parse_keyword(Keyword::WHERE) {
20295            Some(self.parse_expr()?)
20296        } else {
20297            None
20298        };
20299
20300        let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
20301            self.expect_token(&Token::LParen)?;
20302            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
20303            self.expect_token(&Token::RParen)?;
20304            Some(columns)
20305        } else {
20306            None
20307        };
20308
20309        Ok(Statement::OptimizeTable {
20310            name,
20311            has_table_keyword,
20312            on_cluster,
20313            partition,
20314            include_final,
20315            deduplicate,
20316            predicate,
20317            zorder,
20318        })
20319    }
20320
20321    /// ```sql
20322    /// CREATE [ { TEMPORARY | TEMP } ] SEQUENCE [ IF NOT EXISTS ] <sequence_name>
20323    /// ```
20324    ///
20325    /// See [Postgres docs](https://www.postgresql.org/docs/current/sql-createsequence.html) for more details.
20326    pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
20327        //[ IF NOT EXISTS ]
20328        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20329        //name
20330        let name = self.parse_object_name(false)?;
20331        //[ AS data_type ]
20332        let mut data_type: Option<DataType> = None;
20333        if self.parse_keywords(&[Keyword::AS]) {
20334            data_type = Some(self.parse_data_type()?)
20335        }
20336        let sequence_options = self.parse_create_sequence_options()?;
20337        // [ OWNED BY { table_name.column_name | NONE } ]
20338        let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
20339            if self.parse_keywords(&[Keyword::NONE]) {
20340                Some(ObjectName::from(vec![Ident::new("NONE")]))
20341            } else {
20342                Some(self.parse_object_name(false)?)
20343            }
20344        } else {
20345            None
20346        };
20347        Ok(Statement::CreateSequence {
20348            temporary,
20349            if_not_exists,
20350            name,
20351            data_type,
20352            sequence_options,
20353            owned_by,
20354        })
20355    }
20356
20357    fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
20358        let mut sequence_options = vec![];
20359        //[ INCREMENT [ BY ] increment ]
20360        if self.parse_keywords(&[Keyword::INCREMENT]) {
20361            if self.parse_keywords(&[Keyword::BY]) {
20362                sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
20363            } else {
20364                sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
20365            }
20366        }
20367        //[ MINVALUE minvalue | NO MINVALUE ]
20368        if self.parse_keyword(Keyword::MINVALUE) {
20369            sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
20370        } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
20371            sequence_options.push(SequenceOptions::MinValue(None));
20372        }
20373        //[ MAXVALUE maxvalue | NO MAXVALUE ]
20374        if self.parse_keywords(&[Keyword::MAXVALUE]) {
20375            sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
20376        } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
20377            sequence_options.push(SequenceOptions::MaxValue(None));
20378        }
20379
20380        //[ START [ WITH ] start ]
20381        if self.parse_keywords(&[Keyword::START]) {
20382            if self.parse_keywords(&[Keyword::WITH]) {
20383                sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
20384            } else {
20385                sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
20386            }
20387        }
20388        //[ CACHE cache ]
20389        if self.parse_keywords(&[Keyword::CACHE]) {
20390            sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
20391        }
20392        // [ [ NO ] CYCLE ]
20393        if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
20394            sequence_options.push(SequenceOptions::Cycle(true));
20395        } else if self.parse_keywords(&[Keyword::CYCLE]) {
20396            sequence_options.push(SequenceOptions::Cycle(false));
20397        }
20398
20399        Ok(sequence_options)
20400    }
20401
20402    ///   Parse a `CREATE SERVER` statement.
20403    ///
20404    ///  See [Statement::CreateServer]
20405    pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
20406        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20407        let name = self.parse_object_name(false)?;
20408
20409        let server_type = if self.parse_keyword(Keyword::TYPE) {
20410            Some(self.parse_identifier()?)
20411        } else {
20412            None
20413        };
20414
20415        let version = if self.parse_keyword(Keyword::VERSION) {
20416            Some(self.parse_identifier()?)
20417        } else {
20418            None
20419        };
20420
20421        self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
20422        let foreign_data_wrapper = self.parse_object_name(false)?;
20423
20424        let mut options = None;
20425        if self.parse_keyword(Keyword::OPTIONS) {
20426            self.expect_token(&Token::LParen)?;
20427            options = Some(self.parse_comma_separated(|p| {
20428                let key = p.parse_identifier()?;
20429                let value = p.parse_identifier()?;
20430                Ok(CreateServerOption { key, value })
20431            })?);
20432            self.expect_token(&Token::RParen)?;
20433        }
20434
20435        Ok(Statement::CreateServer(CreateServerStatement {
20436            name,
20437            if_not_exists: ine,
20438            server_type,
20439            version,
20440            foreign_data_wrapper,
20441            options,
20442        }))
20443    }
20444
20445    /// Parse a `CREATE FOREIGN DATA WRAPPER` statement.
20446    ///
20447    /// See <https://www.postgresql.org/docs/current/sql-createforeigndatawrapper.html>
20448    pub fn parse_create_foreign_data_wrapper(
20449        &mut self,
20450    ) -> Result<CreateForeignDataWrapper, ParserError> {
20451        let name = self.parse_identifier()?;
20452
20453        let handler = if self.parse_keyword(Keyword::HANDLER) {
20454            Some(FdwRoutineClause::Function(self.parse_object_name(false)?))
20455        } else if self.parse_keywords(&[Keyword::NO, Keyword::HANDLER]) {
20456            Some(FdwRoutineClause::NoFunction)
20457        } else {
20458            None
20459        };
20460
20461        let validator = if self.parse_keyword(Keyword::VALIDATOR) {
20462            Some(FdwRoutineClause::Function(self.parse_object_name(false)?))
20463        } else if self.parse_keywords(&[Keyword::NO, Keyword::VALIDATOR]) {
20464            Some(FdwRoutineClause::NoFunction)
20465        } else {
20466            None
20467        };
20468
20469        let options = if self.parse_keyword(Keyword::OPTIONS) {
20470            self.expect_token(&Token::LParen)?;
20471            let opts = self.parse_comma_separated(|p| {
20472                let key = p.parse_identifier()?;
20473                let value = p.parse_identifier()?;
20474                Ok(CreateServerOption { key, value })
20475            })?;
20476            self.expect_token(&Token::RParen)?;
20477            Some(opts)
20478        } else {
20479            None
20480        };
20481
20482        Ok(CreateForeignDataWrapper {
20483            name,
20484            handler,
20485            validator,
20486            options,
20487        })
20488    }
20489
20490    /// Parse a `CREATE FOREIGN TABLE` statement.
20491    ///
20492    /// See <https://www.postgresql.org/docs/current/sql-createforeigntable.html>
20493    pub fn parse_create_foreign_table(&mut self) -> Result<CreateForeignTable, ParserError> {
20494        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20495        let name = self.parse_object_name(false)?;
20496        let (columns, _constraints) = self.parse_columns()?;
20497        self.expect_keyword_is(Keyword::SERVER)?;
20498        let server_name = self.parse_identifier()?;
20499
20500        let options = if self.parse_keyword(Keyword::OPTIONS) {
20501            self.expect_token(&Token::LParen)?;
20502            let opts = self.parse_comma_separated(|p| {
20503                let key = p.parse_identifier()?;
20504                let value = p.parse_identifier()?;
20505                Ok(CreateServerOption { key, value })
20506            })?;
20507            self.expect_token(&Token::RParen)?;
20508            Some(opts)
20509        } else {
20510            None
20511        };
20512
20513        Ok(CreateForeignTable {
20514            name,
20515            if_not_exists,
20516            columns,
20517            server_name,
20518            options,
20519        })
20520    }
20521
20522    /// Parse a `CREATE PUBLICATION` statement.
20523    ///
20524    /// See <https://www.postgresql.org/docs/current/sql-createpublication.html>
20525    pub fn parse_create_publication(&mut self) -> Result<CreatePublication, ParserError> {
20526        let name = self.parse_identifier()?;
20527
20528        let target = if self.parse_keyword(Keyword::FOR) {
20529            if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES]) {
20530                Some(PublicationTarget::AllTables)
20531            } else if self.parse_keyword(Keyword::TABLE) {
20532                let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
20533                Some(PublicationTarget::Tables(tables))
20534            } else if self.parse_keywords(&[Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
20535                let schemas = self.parse_comma_separated(|p| p.parse_identifier())?;
20536                Some(PublicationTarget::TablesInSchema(schemas))
20537            } else {
20538                return self.expected_ref(
20539                    "ALL TABLES, TABLE, or TABLES IN SCHEMA after FOR",
20540                    self.peek_token_ref(),
20541                );
20542            }
20543        } else {
20544            None
20545        };
20546
20547        let with_options = self.parse_options(Keyword::WITH)?;
20548
20549        Ok(CreatePublication {
20550            name,
20551            target,
20552            with_options,
20553        })
20554    }
20555
20556    /// Parse a `CREATE SUBSCRIPTION` statement.
20557    ///
20558    /// See <https://www.postgresql.org/docs/current/sql-createsubscription.html>
20559    pub fn parse_create_subscription(&mut self) -> Result<CreateSubscription, ParserError> {
20560        let name = self.parse_identifier()?;
20561        self.expect_keyword_is(Keyword::CONNECTION)?;
20562        let connection = self.parse_value()?.value;
20563        self.expect_keyword_is(Keyword::PUBLICATION)?;
20564        let publications = self.parse_comma_separated(|p| p.parse_identifier())?;
20565        let with_options = self.parse_options(Keyword::WITH)?;
20566
20567        Ok(CreateSubscription {
20568            name,
20569            connection,
20570            publications,
20571            with_options,
20572        })
20573    }
20574
20575    /// Parse a `CREATE CAST` statement.
20576    ///
20577    /// See <https://www.postgresql.org/docs/current/sql-createcast.html>
20578    pub fn parse_create_cast(&mut self) -> Result<CreateCast, ParserError> {
20579        self.expect_token(&Token::LParen)?;
20580        let source_type = self.parse_data_type()?;
20581        self.expect_keyword_is(Keyword::AS)?;
20582        let target_type = self.parse_data_type()?;
20583        self.expect_token(&Token::RParen)?;
20584
20585        let function_kind = if self.parse_keywords(&[Keyword::WITHOUT, Keyword::FUNCTION]) {
20586            CastFunctionKind::WithoutFunction
20587        } else if self.parse_keywords(&[Keyword::WITH, Keyword::INOUT]) {
20588            CastFunctionKind::WithInout
20589        } else if self.parse_keywords(&[Keyword::WITH, Keyword::FUNCTION]) {
20590            let function_name = self.parse_object_name(false)?;
20591            let argument_types = if self.peek_token_ref().token == Token::LParen {
20592                self.expect_token(&Token::LParen)?;
20593                let types = if self.peek_token_ref().token == Token::RParen {
20594                    vec![]
20595                } else {
20596                    self.parse_comma_separated(|p| p.parse_data_type())?
20597                };
20598                self.expect_token(&Token::RParen)?;
20599                types
20600            } else {
20601                vec![]
20602            };
20603            CastFunctionKind::WithFunction {
20604                function_name,
20605                argument_types,
20606            }
20607        } else {
20608            return self.expected_ref(
20609                "WITH FUNCTION, WITHOUT FUNCTION, or WITH INOUT",
20610                self.peek_token_ref(),
20611            );
20612        };
20613
20614        let cast_context = if self.parse_keyword(Keyword::AS) {
20615            if self.parse_keyword(Keyword::ASSIGNMENT) {
20616                CastContext::Assignment
20617            } else if self.parse_keyword(Keyword::IMPLICIT) {
20618                CastContext::Implicit
20619            } else {
20620                return self.expected_ref("ASSIGNMENT or IMPLICIT after AS", self.peek_token_ref());
20621            }
20622        } else {
20623            CastContext::Explicit
20624        };
20625
20626        Ok(CreateCast {
20627            source_type,
20628            target_type,
20629            function_kind,
20630            cast_context,
20631        })
20632    }
20633
20634    /// Parse a `CREATE [DEFAULT] CONVERSION` statement.
20635    ///
20636    /// See <https://www.postgresql.org/docs/current/sql-createconversion.html>
20637    pub fn parse_create_conversion(
20638        &mut self,
20639        is_default: bool,
20640    ) -> Result<CreateConversion, ParserError> {
20641        let name = self.parse_object_name(false)?;
20642        self.expect_keyword_is(Keyword::FOR)?;
20643        let source_encoding = self.parse_literal_string()?;
20644        self.expect_keyword_is(Keyword::TO)?;
20645        let destination_encoding = self.parse_literal_string()?;
20646        self.expect_keyword_is(Keyword::FROM)?;
20647        let function_name = self.parse_object_name(false)?;
20648
20649        Ok(CreateConversion {
20650            name,
20651            is_default,
20652            source_encoding,
20653            destination_encoding,
20654            function_name,
20655        })
20656    }
20657
20658    /// Parse a `CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE` statement.
20659    ///
20660    /// See <https://www.postgresql.org/docs/current/sql-createlanguage.html>
20661    pub fn parse_create_language(
20662        &mut self,
20663        or_replace: bool,
20664        trusted: bool,
20665        procedural: bool,
20666    ) -> Result<CreateLanguage, ParserError> {
20667        let name = self.parse_identifier()?;
20668
20669        let handler = if self.parse_keyword(Keyword::HANDLER) {
20670            Some(self.parse_object_name(false)?)
20671        } else {
20672            None
20673        };
20674
20675        let inline_handler = if self.parse_keyword(Keyword::INLINE) {
20676            Some(self.parse_object_name(false)?)
20677        } else {
20678            None
20679        };
20680
20681        let validator = if self.parse_keywords(&[Keyword::NO, Keyword::VALIDATOR]) {
20682            None
20683        } else if self.parse_keyword(Keyword::VALIDATOR) {
20684            Some(self.parse_object_name(false)?)
20685        } else {
20686            None
20687        };
20688
20689        Ok(CreateLanguage {
20690            name,
20691            or_replace,
20692            trusted,
20693            procedural,
20694            handler,
20695            inline_handler,
20696            validator,
20697        })
20698    }
20699
20700    /// Parse a `CREATE RULE` statement.
20701    ///
20702    /// See <https://www.postgresql.org/docs/current/sql-createrule.html>
20703    pub fn parse_create_rule(&mut self) -> Result<CreateRule, ParserError> {
20704        let name = self.parse_identifier()?;
20705        self.expect_keyword_is(Keyword::AS)?;
20706        self.expect_keyword_is(Keyword::ON)?;
20707
20708        let event = if self.parse_keyword(Keyword::SELECT) {
20709            RuleEvent::Select
20710        } else if self.parse_keyword(Keyword::INSERT) {
20711            RuleEvent::Insert
20712        } else if self.parse_keyword(Keyword::UPDATE) {
20713            RuleEvent::Update
20714        } else if self.parse_keyword(Keyword::DELETE) {
20715            RuleEvent::Delete
20716        } else {
20717            return self.expected_ref(
20718                "SELECT, INSERT, UPDATE, or DELETE after ON",
20719                self.peek_token_ref(),
20720            );
20721        };
20722
20723        self.expect_keyword_is(Keyword::TO)?;
20724        let table = self.parse_object_name(false)?;
20725
20726        let condition = if self.parse_keyword(Keyword::WHERE) {
20727            Some(self.parse_expr()?)
20728        } else {
20729            None
20730        };
20731
20732        self.expect_keyword_is(Keyword::DO)?;
20733
20734        let instead = self.parse_keyword(Keyword::INSTEAD);
20735        if !instead {
20736            // ALSO is the explicit-default form; consume the optional keyword without effect.
20737            let _ = self.parse_keyword(Keyword::ALSO);
20738        }
20739
20740        let action = if self.parse_keyword(Keyword::NOTHING) {
20741            RuleAction::Nothing
20742        } else if self.peek_token_ref().token == Token::LParen {
20743            self.expect_token(&Token::LParen)?;
20744            let mut stmts = Vec::new();
20745            loop {
20746                stmts.push(self.parse_statement()?);
20747                if !self.consume_token(&Token::SemiColon) {
20748                    break;
20749                }
20750                if self.peek_token_ref().token == Token::RParen {
20751                    break;
20752                }
20753            }
20754            self.expect_token(&Token::RParen)?;
20755            RuleAction::Statements(stmts)
20756        } else {
20757            let stmt = self.parse_statement()?;
20758            RuleAction::Statements(vec![stmt])
20759        };
20760
20761        Ok(CreateRule {
20762            name,
20763            event,
20764            table,
20765            condition,
20766            instead,
20767            action,
20768        })
20769    }
20770
20771    /// Parse a `CREATE STATISTICS` statement.
20772    ///
20773    /// See <https://www.postgresql.org/docs/current/sql-createstatistics.html>
20774    pub fn parse_create_statistics(&mut self) -> Result<CreateStatistics, ParserError> {
20775        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20776        let name = self.parse_object_name(false)?;
20777
20778        let kinds = if self.consume_token(&Token::LParen) {
20779            let kinds = self.parse_comma_separated(|p| {
20780                let ident = p.parse_identifier()?;
20781                match ident.value.to_lowercase().as_str() {
20782                    "ndistinct" => Ok(StatisticsKind::NDistinct),
20783                    "dependencies" => Ok(StatisticsKind::Dependencies),
20784                    "mcv" => Ok(StatisticsKind::Mcv),
20785                    other => Err(ParserError::ParserError(format!(
20786                        "Unknown statistics kind: {other}"
20787                    ))),
20788                }
20789            })?;
20790            self.expect_token(&Token::RParen)?;
20791            kinds
20792        } else {
20793            vec![]
20794        };
20795
20796        self.expect_keyword_is(Keyword::ON)?;
20797        let on = self.parse_comma_separated(Parser::parse_expr)?;
20798        self.expect_keyword_is(Keyword::FROM)?;
20799        let from = self.parse_object_name(false)?;
20800
20801        Ok(CreateStatistics {
20802            if_not_exists,
20803            name,
20804            kinds,
20805            on,
20806            from,
20807        })
20808    }
20809
20810    /// Parse a `CREATE ACCESS METHOD` statement.
20811    ///
20812    /// See <https://www.postgresql.org/docs/current/sql-create-access-method.html>
20813    pub fn parse_create_access_method(&mut self) -> Result<CreateAccessMethod, ParserError> {
20814        let name = self.parse_identifier()?;
20815        self.expect_keyword_is(Keyword::TYPE)?;
20816        let method_type = if self.parse_keyword(Keyword::INDEX) {
20817            AccessMethodType::Index
20818        } else if self.parse_keyword(Keyword::TABLE) {
20819            AccessMethodType::Table
20820        } else {
20821            return self.expected_ref("INDEX or TABLE after TYPE", self.peek_token_ref());
20822        };
20823        self.expect_keyword_is(Keyword::HANDLER)?;
20824        let handler = self.parse_object_name(false)?;
20825
20826        Ok(CreateAccessMethod {
20827            name,
20828            method_type,
20829            handler,
20830        })
20831    }
20832
20833    /// Parse a `CREATE EVENT TRIGGER` statement.
20834    ///
20835    /// See <https://www.postgresql.org/docs/current/sql-createeventtrigger.html>
20836    pub fn parse_create_event_trigger(&mut self) -> Result<CreateEventTrigger, ParserError> {
20837        let name = self.parse_identifier()?;
20838        self.expect_keyword_is(Keyword::ON)?;
20839        let event_ident = self.parse_identifier()?;
20840        let event = match event_ident.value.to_lowercase().as_str() {
20841            "ddl_command_start" => EventTriggerEvent::DdlCommandStart,
20842            "ddl_command_end" => EventTriggerEvent::DdlCommandEnd,
20843            "table_rewrite" => EventTriggerEvent::TableRewrite,
20844            "sql_drop" => EventTriggerEvent::SqlDrop,
20845            other => {
20846                return Err(ParserError::ParserError(format!(
20847                    "Unknown event trigger event: {other}"
20848                )))
20849            }
20850        };
20851
20852        let when_tags = if self.parse_keyword(Keyword::WHEN) {
20853            self.expect_keyword_is(Keyword::TAG)?;
20854            self.expect_keyword_is(Keyword::IN)?;
20855            self.expect_token(&Token::LParen)?;
20856            let tags = self.parse_comma_separated(|p| p.parse_value().map(|v| v.value))?;
20857            self.expect_token(&Token::RParen)?;
20858            Some(tags)
20859        } else {
20860            None
20861        };
20862
20863        self.expect_keyword_is(Keyword::EXECUTE)?;
20864        let is_procedure = if self.parse_keyword(Keyword::FUNCTION) {
20865            false
20866        } else if self.parse_keyword(Keyword::PROCEDURE) {
20867            true
20868        } else {
20869            return self.expected_ref("FUNCTION or PROCEDURE after EXECUTE", self.peek_token_ref());
20870        };
20871        let execute = self.parse_object_name(false)?;
20872        self.expect_token(&Token::LParen)?;
20873        self.expect_token(&Token::RParen)?;
20874
20875        Ok(CreateEventTrigger {
20876            name,
20877            event,
20878            when_tags,
20879            execute,
20880            is_procedure,
20881        })
20882    }
20883
20884    /// Parse a `CREATE [OR REPLACE] TRANSFORM` statement.
20885    ///
20886    /// See <https://www.postgresql.org/docs/current/sql-createtransform.html>
20887    pub fn parse_create_transform(
20888        &mut self,
20889        or_replace: bool,
20890    ) -> Result<CreateTransform, ParserError> {
20891        self.expect_keyword_is(Keyword::FOR)?;
20892        let type_name = self.parse_data_type()?;
20893        self.expect_keyword_is(Keyword::LANGUAGE)?;
20894        let language = self.parse_identifier()?;
20895        self.expect_token(&Token::LParen)?;
20896        let elements = self.parse_comma_separated(|p| {
20897            let is_from = if p.parse_keyword(Keyword::FROM) {
20898                true
20899            } else {
20900                p.expect_keyword_is(Keyword::TO)?;
20901                false
20902            };
20903            p.expect_keyword_is(Keyword::SQL)?;
20904            p.expect_keyword_is(Keyword::WITH)?;
20905            p.expect_keyword_is(Keyword::FUNCTION)?;
20906            let function = p.parse_object_name(false)?;
20907            p.expect_token(&Token::LParen)?;
20908            let arg_types = if p.peek_token().token == Token::RParen {
20909                vec![]
20910            } else {
20911                p.parse_comma_separated(|p| p.parse_data_type())?
20912            };
20913            p.expect_token(&Token::RParen)?;
20914            Ok(TransformElement {
20915                is_from,
20916                function,
20917                arg_types,
20918            })
20919        })?;
20920        self.expect_token(&Token::RParen)?;
20921
20922        Ok(CreateTransform {
20923            or_replace,
20924            type_name,
20925            language,
20926            elements,
20927        })
20928    }
20929
20930    /// Parse a `SECURITY LABEL` statement.
20931    ///
20932    /// See <https://www.postgresql.org/docs/current/sql-securitylabel.html>
20933    pub fn parse_security_label(&mut self) -> Result<SecurityLabel, ParserError> {
20934        self.expect_keyword_is(Keyword::LABEL)?;
20935
20936        let provider = if self.parse_keyword(Keyword::FOR) {
20937            Some(self.parse_identifier()?)
20938        } else {
20939            None
20940        };
20941
20942        self.expect_keyword_is(Keyword::ON)?;
20943
20944        let object_kind = if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
20945            SecurityLabelObjectKind::MaterializedView
20946        } else if self.parse_keyword(Keyword::TABLE) {
20947            SecurityLabelObjectKind::Table
20948        } else if self.parse_keyword(Keyword::COLUMN) {
20949            SecurityLabelObjectKind::Column
20950        } else if self.parse_keyword(Keyword::DATABASE) {
20951            SecurityLabelObjectKind::Database
20952        } else if self.parse_keyword(Keyword::DOMAIN) {
20953            SecurityLabelObjectKind::Domain
20954        } else if self.parse_keyword(Keyword::FUNCTION) {
20955            SecurityLabelObjectKind::Function
20956        } else if self.parse_keyword(Keyword::ROLE) {
20957            SecurityLabelObjectKind::Role
20958        } else if self.parse_keyword(Keyword::SCHEMA) {
20959            SecurityLabelObjectKind::Schema
20960        } else if self.parse_keyword(Keyword::SEQUENCE) {
20961            SecurityLabelObjectKind::Sequence
20962        } else if self.parse_keyword(Keyword::TYPE) {
20963            SecurityLabelObjectKind::Type
20964        } else if self.parse_keyword(Keyword::VIEW) {
20965            SecurityLabelObjectKind::View
20966        } else {
20967            return self.expected_ref(
20968                "TABLE, COLUMN, DATABASE, DOMAIN, FUNCTION, MATERIALIZED VIEW, ROLE, SCHEMA, SEQUENCE, TYPE, or VIEW after ON",
20969                self.peek_token_ref(),
20970            );
20971        };
20972
20973        let object_name = self.parse_object_name(false)?;
20974
20975        self.expect_keyword_is(Keyword::IS)?;
20976
20977        let label = if self.parse_keyword(Keyword::NULL) {
20978            None
20979        } else {
20980            Some(self.parse_value()?.value)
20981        };
20982
20983        Ok(SecurityLabel {
20984            provider,
20985            object_kind,
20986            object_name,
20987            label,
20988        })
20989    }
20990
20991    /// Parse a `CREATE USER MAPPING` statement.
20992    ///
20993    /// See <https://www.postgresql.org/docs/current/sql-createusermapping.html>
20994    pub fn parse_create_user_mapping(&mut self) -> Result<CreateUserMapping, ParserError> {
20995        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20996
20997        self.expect_keyword_is(Keyword::FOR)?;
20998
20999        let user = if self.parse_keyword(Keyword::CURRENT_ROLE) {
21000            UserMappingUser::CurrentRole
21001        } else if self.parse_keyword(Keyword::CURRENT_USER) {
21002            UserMappingUser::CurrentUser
21003        } else if self.parse_keyword(Keyword::PUBLIC) {
21004            UserMappingUser::Public
21005        } else if self.parse_keyword(Keyword::USER) {
21006            UserMappingUser::User
21007        } else {
21008            UserMappingUser::Ident(self.parse_identifier()?)
21009        };
21010
21011        self.expect_keyword_is(Keyword::SERVER)?;
21012        let server_name = self.parse_identifier()?;
21013
21014        let options = if self.parse_keyword(Keyword::OPTIONS) {
21015            self.expect_token(&Token::LParen)?;
21016            let opts = self.parse_comma_separated(|p| {
21017                let key = p.parse_identifier()?;
21018                let value = p.parse_identifier()?;
21019                Ok(CreateServerOption { key, value })
21020            })?;
21021            self.expect_token(&Token::RParen)?;
21022            Some(opts)
21023        } else {
21024            None
21025        };
21026
21027        Ok(CreateUserMapping {
21028            if_not_exists,
21029            user,
21030            server_name,
21031            options,
21032        })
21033    }
21034
21035    /// Parse a `CREATE TABLESPACE` statement.
21036    ///
21037    /// See <https://www.postgresql.org/docs/current/sql-createtablespace.html>
21038    pub fn parse_create_tablespace(&mut self) -> Result<CreateTablespace, ParserError> {
21039        let name = self.parse_identifier()?;
21040
21041        let owner = if self.parse_keyword(Keyword::OWNER) {
21042            Some(self.parse_identifier()?)
21043        } else {
21044            None
21045        };
21046
21047        self.expect_keyword_is(Keyword::LOCATION)?;
21048        let location = self.parse_value()?.value;
21049
21050        let with_options = self.parse_options(Keyword::WITH)?;
21051
21052        Ok(CreateTablespace {
21053            name,
21054            owner,
21055            location,
21056            with_options,
21057        })
21058    }
21059
21060    /// The index of the first unprocessed token.
21061    pub fn index(&self) -> usize {
21062        self.index
21063    }
21064
21065    /// Parse a named window definition.
21066    pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
21067        let ident = self.parse_identifier()?;
21068        self.expect_keyword_is(Keyword::AS)?;
21069
21070        let window_expr = if self.consume_token(&Token::LParen) {
21071            NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
21072        } else if self.dialect.supports_window_clause_named_window_reference() {
21073            NamedWindowExpr::NamedWindow(self.parse_identifier()?)
21074        } else {
21075            return self.expected_ref("(", self.peek_token_ref());
21076        };
21077
21078        Ok(NamedWindowDefinition(ident, window_expr))
21079    }
21080
21081    /// Parse `CREATE PROCEDURE` statement.
21082    pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
21083        let name = self.parse_object_name(false)?;
21084        let params = self.parse_optional_procedure_parameters()?;
21085
21086        let language = if self.parse_keyword(Keyword::LANGUAGE) {
21087            Some(self.parse_identifier()?)
21088        } else {
21089            None
21090        };
21091
21092        self.expect_keyword_is(Keyword::AS)?;
21093
21094        let body = self.parse_conditional_statements(&[Keyword::END])?;
21095
21096        Ok(Statement::CreateProcedure {
21097            name,
21098            or_alter,
21099            params,
21100            language,
21101            body,
21102        })
21103    }
21104
21105    /// Parse a window specification.
21106    pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
21107        let window_name = match &self.peek_token_ref().token {
21108            Token::Word(word) if word.keyword == Keyword::NoKeyword => {
21109                self.parse_optional_ident()?
21110            }
21111            _ => None,
21112        };
21113
21114        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
21115            self.parse_comma_separated(Parser::parse_expr)?
21116        } else {
21117            vec![]
21118        };
21119        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
21120            self.parse_comma_separated(Parser::parse_order_by_expr)?
21121        } else {
21122            vec![]
21123        };
21124
21125        let window_frame = if !self.consume_token(&Token::RParen) {
21126            let window_frame = self.parse_window_frame()?;
21127            self.expect_token(&Token::RParen)?;
21128            Some(window_frame)
21129        } else {
21130            None
21131        };
21132        Ok(WindowSpec {
21133            window_name,
21134            partition_by,
21135            order_by,
21136            window_frame,
21137        })
21138    }
21139
21140    /// Parse `CREATE TYPE` statement.
21141    pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
21142        let name = self.parse_object_name(false)?;
21143
21144        // Check if we have AS keyword
21145        let has_as = self.parse_keyword(Keyword::AS);
21146
21147        if !has_as {
21148            // Two cases: CREATE TYPE name; or CREATE TYPE name (options);
21149            if self.consume_token(&Token::LParen) {
21150                // CREATE TYPE name (options) - SQL definition without AS
21151                let options = self.parse_create_type_sql_definition_options()?;
21152                self.expect_token(&Token::RParen)?;
21153                return Ok(Statement::CreateType {
21154                    name,
21155                    representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
21156                });
21157            }
21158
21159            // CREATE TYPE name; - no representation
21160            return Ok(Statement::CreateType {
21161                name,
21162                representation: None,
21163            });
21164        }
21165
21166        // We have AS keyword
21167        if self.parse_keyword(Keyword::ENUM) {
21168            // CREATE TYPE name AS ENUM (labels)
21169            self.parse_create_type_enum(name)
21170        } else if self.parse_keyword(Keyword::RANGE) {
21171            // CREATE TYPE name AS RANGE (options)
21172            self.parse_create_type_range(name)
21173        } else if self.consume_token(&Token::LParen) {
21174            // CREATE TYPE name AS (attributes) - Composite
21175            self.parse_create_type_composite(name)
21176        } else {
21177            self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
21178        }
21179    }
21180
21181    /// Parse remainder of `CREATE TYPE AS (attributes)` statement (composite type)
21182    ///
21183    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
21184    fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
21185        if self.consume_token(&Token::RParen) {
21186            // Empty composite type
21187            return Ok(Statement::CreateType {
21188                name,
21189                representation: Some(UserDefinedTypeRepresentation::Composite {
21190                    attributes: vec![],
21191                }),
21192            });
21193        }
21194
21195        let mut attributes = vec![];
21196        loop {
21197            let attr_name = self.parse_identifier()?;
21198            let attr_data_type = self.parse_data_type()?;
21199            let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
21200                Some(self.parse_object_name(false)?)
21201            } else {
21202                None
21203            };
21204            attributes.push(UserDefinedTypeCompositeAttributeDef {
21205                name: attr_name,
21206                data_type: attr_data_type,
21207                collation: attr_collation,
21208            });
21209
21210            if !self.consume_token(&Token::Comma) {
21211                break;
21212            }
21213        }
21214        self.expect_token(&Token::RParen)?;
21215
21216        Ok(Statement::CreateType {
21217            name,
21218            representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
21219        })
21220    }
21221
21222    /// Parse remainder of `CREATE TYPE AS ENUM` statement (see [Statement::CreateType] and [Self::parse_create_type])
21223    ///
21224    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
21225    pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
21226        self.expect_token(&Token::LParen)?;
21227        let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
21228        self.expect_token(&Token::RParen)?;
21229
21230        Ok(Statement::CreateType {
21231            name,
21232            representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
21233        })
21234    }
21235
21236    /// Parse remainder of `CREATE TYPE AS RANGE` statement
21237    ///
21238    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
21239    fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
21240        self.expect_token(&Token::LParen)?;
21241        let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
21242        self.expect_token(&Token::RParen)?;
21243
21244        Ok(Statement::CreateType {
21245            name,
21246            representation: Some(UserDefinedTypeRepresentation::Range { options }),
21247        })
21248    }
21249
21250    /// Parse a single range option for a `CREATE TYPE AS RANGE` statement
21251    fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
21252        let keyword = self.parse_one_of_keywords(&[
21253            Keyword::SUBTYPE,
21254            Keyword::SUBTYPE_OPCLASS,
21255            Keyword::COLLATION,
21256            Keyword::CANONICAL,
21257            Keyword::SUBTYPE_DIFF,
21258            Keyword::MULTIRANGE_TYPE_NAME,
21259        ]);
21260
21261        match keyword {
21262            Some(Keyword::SUBTYPE) => {
21263                self.expect_token(&Token::Eq)?;
21264                let data_type = self.parse_data_type()?;
21265                Ok(UserDefinedTypeRangeOption::Subtype(data_type))
21266            }
21267            Some(Keyword::SUBTYPE_OPCLASS) => {
21268                self.expect_token(&Token::Eq)?;
21269                let name = self.parse_object_name(false)?;
21270                Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
21271            }
21272            Some(Keyword::COLLATION) => {
21273                self.expect_token(&Token::Eq)?;
21274                let name = self.parse_object_name(false)?;
21275                Ok(UserDefinedTypeRangeOption::Collation(name))
21276            }
21277            Some(Keyword::CANONICAL) => {
21278                self.expect_token(&Token::Eq)?;
21279                let name = self.parse_object_name(false)?;
21280                Ok(UserDefinedTypeRangeOption::Canonical(name))
21281            }
21282            Some(Keyword::SUBTYPE_DIFF) => {
21283                self.expect_token(&Token::Eq)?;
21284                let name = self.parse_object_name(false)?;
21285                Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
21286            }
21287            Some(Keyword::MULTIRANGE_TYPE_NAME) => {
21288                self.expect_token(&Token::Eq)?;
21289                let name = self.parse_object_name(false)?;
21290                Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
21291            }
21292            _ => self.expected_ref("range option keyword", self.peek_token_ref()),
21293        }
21294    }
21295
21296    /// Parse SQL definition options for CREATE TYPE (options)
21297    fn parse_create_type_sql_definition_options(
21298        &mut self,
21299    ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
21300        self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
21301    }
21302
21303    /// Parse a single SQL definition option for CREATE TYPE (options)
21304    fn parse_sql_definition_option(
21305        &mut self,
21306    ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
21307        let keyword = self.parse_one_of_keywords(&[
21308            Keyword::INPUT,
21309            Keyword::OUTPUT,
21310            Keyword::RECEIVE,
21311            Keyword::SEND,
21312            Keyword::TYPMOD_IN,
21313            Keyword::TYPMOD_OUT,
21314            Keyword::ANALYZE,
21315            Keyword::SUBSCRIPT,
21316            Keyword::INTERNALLENGTH,
21317            Keyword::PASSEDBYVALUE,
21318            Keyword::ALIGNMENT,
21319            Keyword::STORAGE,
21320            Keyword::LIKE,
21321            Keyword::CATEGORY,
21322            Keyword::PREFERRED,
21323            Keyword::DEFAULT,
21324            Keyword::ELEMENT,
21325            Keyword::DELIMITER,
21326            Keyword::COLLATABLE,
21327        ]);
21328
21329        match keyword {
21330            Some(Keyword::INPUT) => {
21331                self.expect_token(&Token::Eq)?;
21332                let name = self.parse_object_name(false)?;
21333                Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
21334            }
21335            Some(Keyword::OUTPUT) => {
21336                self.expect_token(&Token::Eq)?;
21337                let name = self.parse_object_name(false)?;
21338                Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
21339            }
21340            Some(Keyword::RECEIVE) => {
21341                self.expect_token(&Token::Eq)?;
21342                let name = self.parse_object_name(false)?;
21343                Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
21344            }
21345            Some(Keyword::SEND) => {
21346                self.expect_token(&Token::Eq)?;
21347                let name = self.parse_object_name(false)?;
21348                Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
21349            }
21350            Some(Keyword::TYPMOD_IN) => {
21351                self.expect_token(&Token::Eq)?;
21352                let name = self.parse_object_name(false)?;
21353                Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
21354            }
21355            Some(Keyword::TYPMOD_OUT) => {
21356                self.expect_token(&Token::Eq)?;
21357                let name = self.parse_object_name(false)?;
21358                Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
21359            }
21360            Some(Keyword::ANALYZE) => {
21361                self.expect_token(&Token::Eq)?;
21362                let name = self.parse_object_name(false)?;
21363                Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
21364            }
21365            Some(Keyword::SUBSCRIPT) => {
21366                self.expect_token(&Token::Eq)?;
21367                let name = self.parse_object_name(false)?;
21368                Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
21369            }
21370            Some(Keyword::INTERNALLENGTH) => {
21371                self.expect_token(&Token::Eq)?;
21372                if self.parse_keyword(Keyword::VARIABLE) {
21373                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
21374                        UserDefinedTypeInternalLength::Variable,
21375                    ))
21376                } else {
21377                    let value = self.parse_literal_uint()?;
21378                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
21379                        UserDefinedTypeInternalLength::Fixed(value),
21380                    ))
21381                }
21382            }
21383            Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
21384            Some(Keyword::ALIGNMENT) => {
21385                self.expect_token(&Token::Eq)?;
21386                let align_keyword = self.parse_one_of_keywords(&[
21387                    Keyword::CHAR,
21388                    Keyword::INT2,
21389                    Keyword::INT4,
21390                    Keyword::DOUBLE,
21391                ]);
21392                match align_keyword {
21393                    Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21394                        Alignment::Char,
21395                    )),
21396                    Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21397                        Alignment::Int2,
21398                    )),
21399                    Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21400                        Alignment::Int4,
21401                    )),
21402                    Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21403                        Alignment::Double,
21404                    )),
21405                    _ => self.expected_ref(
21406                        "alignment value (char, int2, int4, or double)",
21407                        self.peek_token_ref(),
21408                    ),
21409                }
21410            }
21411            Some(Keyword::STORAGE) => {
21412                self.expect_token(&Token::Eq)?;
21413                let storage_keyword = self.parse_one_of_keywords(&[
21414                    Keyword::PLAIN,
21415                    Keyword::EXTERNAL,
21416                    Keyword::EXTENDED,
21417                    Keyword::MAIN,
21418                ]);
21419                match storage_keyword {
21420                    Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21421                        UserDefinedTypeStorage::Plain,
21422                    )),
21423                    Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21424                        UserDefinedTypeStorage::External,
21425                    )),
21426                    Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21427                        UserDefinedTypeStorage::Extended,
21428                    )),
21429                    Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21430                        UserDefinedTypeStorage::Main,
21431                    )),
21432                    _ => self.expected_ref(
21433                        "storage value (plain, external, extended, or main)",
21434                        self.peek_token_ref(),
21435                    ),
21436                }
21437            }
21438            Some(Keyword::LIKE) => {
21439                self.expect_token(&Token::Eq)?;
21440                let name = self.parse_object_name(false)?;
21441                Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
21442            }
21443            Some(Keyword::CATEGORY) => {
21444                self.expect_token(&Token::Eq)?;
21445                let category_str = self.parse_literal_string()?;
21446                let category_char = category_str.chars().next().ok_or_else(|| {
21447                    ParserError::ParserError(
21448                        "CATEGORY value must be a single character".to_string(),
21449                    )
21450                })?;
21451                Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
21452            }
21453            Some(Keyword::PREFERRED) => {
21454                self.expect_token(&Token::Eq)?;
21455                let value =
21456                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
21457                Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
21458            }
21459            Some(Keyword::DEFAULT) => {
21460                self.expect_token(&Token::Eq)?;
21461                let expr = self.parse_expr()?;
21462                Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
21463            }
21464            Some(Keyword::ELEMENT) => {
21465                self.expect_token(&Token::Eq)?;
21466                let data_type = self.parse_data_type()?;
21467                Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
21468            }
21469            Some(Keyword::DELIMITER) => {
21470                self.expect_token(&Token::Eq)?;
21471                let delimiter = self.parse_literal_string()?;
21472                Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
21473            }
21474            Some(Keyword::COLLATABLE) => {
21475                self.expect_token(&Token::Eq)?;
21476                let value =
21477                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
21478                Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
21479            }
21480            _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
21481        }
21482    }
21483
21484    fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
21485        self.expect_token(&Token::LParen)?;
21486        let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
21487        self.expect_token(&Token::RParen)?;
21488        Ok(idents)
21489    }
21490
21491    fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
21492        if dialect_of!(self is MySqlDialect | GenericDialect) {
21493            if self.parse_keyword(Keyword::FIRST) {
21494                Ok(Some(MySQLColumnPosition::First))
21495            } else if self.parse_keyword(Keyword::AFTER) {
21496                let ident = self.parse_identifier()?;
21497                Ok(Some(MySQLColumnPosition::After(ident)))
21498            } else {
21499                Ok(None)
21500            }
21501        } else {
21502            Ok(None)
21503        }
21504    }
21505
21506    /// Parse [Statement::Print]
21507    fn parse_print(&mut self) -> Result<Statement, ParserError> {
21508        Ok(Statement::Print(PrintStatement {
21509            message: Box::new(self.parse_expr()?),
21510        }))
21511    }
21512
21513    /// Parse [Statement::WaitFor]
21514    ///
21515    /// See: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/waitfor-transact-sql>
21516    fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
21517        let wait_type = if self.parse_keyword(Keyword::DELAY) {
21518            WaitForType::Delay
21519        } else if self.parse_keyword(Keyword::TIME) {
21520            WaitForType::Time
21521        } else {
21522            return self.expected_ref("DELAY or TIME", self.peek_token_ref());
21523        };
21524        let expr = self.parse_expr()?;
21525        Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
21526    }
21527
21528    /// Parse [Statement::Return]
21529    fn parse_return(&mut self) -> Result<Statement, ParserError> {
21530        match self.maybe_parse(|p| p.parse_expr())? {
21531            Some(expr) => Ok(Statement::Return(ReturnStatement {
21532                value: Some(ReturnStatementValue::Expr(expr)),
21533            })),
21534            None => Ok(Statement::Return(ReturnStatement { value: None })),
21535        }
21536    }
21537
21538    /// /// Parse a `EXPORT DATA` statement.
21539    ///
21540    /// See [Statement::ExportData]
21541    fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
21542        self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
21543
21544        let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
21545            Some(self.parse_object_name(false)?)
21546        } else {
21547            None
21548        };
21549        self.expect_keyword(Keyword::OPTIONS)?;
21550        self.expect_token(&Token::LParen)?;
21551        let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
21552        self.expect_token(&Token::RParen)?;
21553        self.expect_keyword(Keyword::AS)?;
21554        let query = self.parse_query()?;
21555        Ok(Statement::ExportData(ExportData {
21556            options,
21557            query,
21558            connection,
21559        }))
21560    }
21561
21562    fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
21563        self.expect_keyword(Keyword::VACUUM)?;
21564        let full = self.parse_keyword(Keyword::FULL);
21565        let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
21566        let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
21567        let reindex = self.parse_keyword(Keyword::REINDEX);
21568        let recluster = self.parse_keyword(Keyword::RECLUSTER);
21569        let (table_name, threshold, boost) =
21570            match self.maybe_parse(|p| p.parse_object_name(false))? {
21571                Some(table_name) => {
21572                    let threshold = if self.parse_keyword(Keyword::TO) {
21573                        let value = self.parse_value()?;
21574                        self.expect_keyword(Keyword::PERCENT)?;
21575                        Some(value)
21576                    } else {
21577                        None
21578                    };
21579                    let boost = self.parse_keyword(Keyword::BOOST);
21580                    (Some(table_name), threshold, boost)
21581                }
21582                _ => (None, None, false),
21583            };
21584        Ok(Statement::Vacuum(VacuumStatement {
21585            full,
21586            sort_only,
21587            delete_only,
21588            reindex,
21589            recluster,
21590            table_name,
21591            threshold,
21592            boost,
21593        }))
21594    }
21595
21596    /// Consume the parser and return its underlying token buffer
21597    pub fn into_tokens(self) -> Vec<TokenWithSpan> {
21598        self.tokens
21599    }
21600
21601    /// Returns true if the next keyword indicates a sub query, i.e. SELECT or WITH
21602    fn peek_sub_query(&mut self) -> bool {
21603        self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
21604            .is_some()
21605    }
21606
21607    pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
21608        let show_in;
21609        let mut filter_position = None;
21610        if self.dialect.supports_show_like_before_in() {
21611            if let Some(filter) = self.parse_show_statement_filter()? {
21612                filter_position = Some(ShowStatementFilterPosition::Infix(filter));
21613            }
21614            show_in = self.maybe_parse_show_stmt_in()?;
21615        } else {
21616            show_in = self.maybe_parse_show_stmt_in()?;
21617            if let Some(filter) = self.parse_show_statement_filter()? {
21618                filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
21619            }
21620        }
21621        let starts_with = self.maybe_parse_show_stmt_starts_with()?;
21622        let limit = self.maybe_parse_show_stmt_limit()?;
21623        let from = self.maybe_parse_show_stmt_from()?;
21624        Ok(ShowStatementOptions {
21625            filter_position,
21626            show_in,
21627            starts_with,
21628            limit,
21629            limit_from: from,
21630        })
21631    }
21632
21633    fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
21634        let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
21635            Some(Keyword::FROM) => ShowStatementInClause::FROM,
21636            Some(Keyword::IN) => ShowStatementInClause::IN,
21637            None => return Ok(None),
21638            _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
21639        };
21640
21641        let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
21642            Keyword::ACCOUNT,
21643            Keyword::DATABASE,
21644            Keyword::SCHEMA,
21645            Keyword::TABLE,
21646            Keyword::VIEW,
21647        ]) {
21648            // If we see these next keywords it means we don't have a parent name
21649            Some(Keyword::DATABASE)
21650                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21651                    | self.peek_keyword(Keyword::LIMIT) =>
21652            {
21653                (Some(ShowStatementInParentType::Database), None)
21654            }
21655            Some(Keyword::SCHEMA)
21656                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21657                    | self.peek_keyword(Keyword::LIMIT) =>
21658            {
21659                (Some(ShowStatementInParentType::Schema), None)
21660            }
21661            Some(parent_kw) => {
21662                // The parent name here is still optional, for example:
21663                // SHOW TABLES IN ACCOUNT, so parsing the object name
21664                // may fail because the statement ends.
21665                let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
21666                match parent_kw {
21667                    Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
21668                    Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
21669                    Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
21670                    Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
21671                    Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
21672                    _ => {
21673                        return self.expected_ref(
21674                            "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
21675                            self.peek_token_ref(),
21676                        )
21677                    }
21678                }
21679            }
21680            None => {
21681                // Parsing MySQL style FROM tbl_name FROM db_name
21682                // which is equivalent to FROM tbl_name.db_name
21683                let mut parent_name = self.parse_object_name(false)?;
21684                if self
21685                    .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
21686                    .is_some()
21687                {
21688                    parent_name
21689                        .0
21690                        .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
21691                }
21692                (None, Some(parent_name))
21693            }
21694        };
21695
21696        Ok(Some(ShowStatementIn {
21697            clause,
21698            parent_type,
21699            parent_name,
21700        }))
21701    }
21702
21703    fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21704        if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
21705            Ok(Some(self.parse_value()?))
21706        } else {
21707            Ok(None)
21708        }
21709    }
21710
21711    fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
21712        if self.parse_keyword(Keyword::LIMIT) {
21713            Ok(self.parse_limit()?)
21714        } else {
21715            Ok(None)
21716        }
21717    }
21718
21719    fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21720        if self.parse_keyword(Keyword::FROM) {
21721            Ok(Some(self.parse_value()?))
21722        } else {
21723            Ok(None)
21724        }
21725    }
21726
21727    pub(crate) fn in_column_definition_state(&self) -> bool {
21728        matches!(self.state, ColumnDefinition)
21729    }
21730
21731    /// Parses options provided in key-value format.
21732    ///
21733    /// * `parenthesized` - true if the options are enclosed in parenthesis
21734    /// * `end_words` - a list of keywords that any of them indicates the end of the options section
21735    pub(crate) fn parse_key_value_options(
21736        &mut self,
21737        parenthesized: bool,
21738        end_words: &[Keyword],
21739    ) -> Result<KeyValueOptions, ParserError> {
21740        let mut options: Vec<KeyValueOption> = Vec::new();
21741        let mut delimiter = KeyValueOptionsDelimiter::Space;
21742        if parenthesized {
21743            self.expect_token(&Token::LParen)?;
21744        }
21745        loop {
21746            match self.next_token().token {
21747                Token::RParen => {
21748                    if parenthesized {
21749                        break;
21750                    } else {
21751                        return self.expected_ref(" another option or EOF", self.peek_token_ref());
21752                    }
21753                }
21754                Token::EOF | Token::SemiColon => break,
21755                Token::Comma => {
21756                    delimiter = KeyValueOptionsDelimiter::Comma;
21757                    continue;
21758                }
21759                Token::Word(w) if !end_words.contains(&w.keyword) => {
21760                    options.push(self.parse_key_value_option(&w)?)
21761                }
21762                Token::Word(w) if end_words.contains(&w.keyword) => {
21763                    self.prev_token();
21764                    break;
21765                }
21766                _ => {
21767                    return self.expected_ref(
21768                        "another option, EOF, SemiColon, Comma or ')'",
21769                        self.peek_token_ref(),
21770                    )
21771                }
21772            };
21773        }
21774
21775        Ok(KeyValueOptions { delimiter, options })
21776    }
21777
21778    /// Parses a `KEY = VALUE` construct based on the specified key
21779    pub(crate) fn parse_key_value_option(
21780        &mut self,
21781        key: &Word,
21782    ) -> Result<KeyValueOption, ParserError> {
21783        self.expect_token(&Token::Eq)?;
21784        let peeked_token = self.peek_token();
21785        match peeked_token.token {
21786            Token::SingleQuotedString(_) => Ok(KeyValueOption {
21787                option_name: key.value.clone(),
21788                option_value: KeyValueOptionKind::Single(self.parse_value()?),
21789            }),
21790            Token::Word(word)
21791                if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
21792            {
21793                Ok(KeyValueOption {
21794                    option_name: key.value.clone(),
21795                    option_value: KeyValueOptionKind::Single(self.parse_value()?),
21796                })
21797            }
21798            Token::Number(..) => Ok(KeyValueOption {
21799                option_name: key.value.clone(),
21800                option_value: KeyValueOptionKind::Single(self.parse_value()?),
21801            }),
21802            Token::Word(word) => {
21803                self.next_token();
21804                Ok(KeyValueOption {
21805                    option_name: key.value.clone(),
21806                    option_value: KeyValueOptionKind::Single(
21807                        Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
21808                    ),
21809                })
21810            }
21811            Token::LParen => {
21812                // Can be a list of values or a list of key value properties.
21813                // Try to parse a list of values and if that fails, try to parse
21814                // a list of key-value properties.
21815                match self.maybe_parse(|parser| {
21816                    parser.expect_token(&Token::LParen)?;
21817                    let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
21818                    parser.expect_token(&Token::RParen)?;
21819                    values
21820                })? {
21821                    Some(values) => Ok(KeyValueOption {
21822                        option_name: key.value.clone(),
21823                        option_value: KeyValueOptionKind::Multi(values),
21824                    }),
21825                    None => Ok(KeyValueOption {
21826                        option_name: key.value.clone(),
21827                        option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
21828                            self.parse_key_value_options(true, &[])?,
21829                        )),
21830                    }),
21831                }
21832            }
21833            _ => self.expected_ref("expected option value", self.peek_token_ref()),
21834        }
21835    }
21836
21837    /// Parses a RESET statement
21838    fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
21839        if self.parse_keyword(Keyword::ALL) {
21840            return Ok(ResetStatement { reset: Reset::ALL });
21841        }
21842
21843        let obj = self.parse_object_name(false)?;
21844        Ok(ResetStatement {
21845            reset: Reset::ConfigurationParameter(obj),
21846        })
21847    }
21848}
21849
21850fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
21851    if let Some(prefix) = prefix {
21852        Expr::Prefixed {
21853            prefix,
21854            value: Box::new(expr),
21855        }
21856    } else {
21857        expr
21858    }
21859}
21860
21861impl Word {
21862    /// Convert a reference to this word into an [`Ident`] by cloning the value.
21863    ///
21864    /// Use this method when you need to keep the original `Word` around.
21865    /// If you can consume the `Word`, prefer [`into_ident`](Self::into_ident) instead
21866    /// to avoid cloning.
21867    pub fn to_ident(&self, span: Span) -> Ident {
21868        Ident {
21869            value: self.value.clone(),
21870            quote_style: self.quote_style,
21871            span,
21872        }
21873    }
21874
21875    /// Convert this word into an [`Ident`] identifier, consuming the `Word`.
21876    ///
21877    /// This avoids cloning the string value. If you need to keep the original
21878    /// `Word`, use [`to_ident`](Self::to_ident) instead.
21879    pub fn into_ident(self, span: Span) -> Ident {
21880        Ident {
21881            value: self.value,
21882            quote_style: self.quote_style,
21883            span,
21884        }
21885    }
21886}
21887
21888#[cfg(test)]
21889mod tests {
21890    use crate::test_utils::{all_dialects, TestedDialects};
21891
21892    use super::*;
21893
21894    #[test]
21895    fn test_prev_index() {
21896        let sql = "SELECT version";
21897        all_dialects().run_parser_method(sql, |parser| {
21898            assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
21899            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21900            parser.prev_token();
21901            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21902            assert_eq!(parser.next_token(), Token::make_word("version", None));
21903            parser.prev_token();
21904            assert_eq!(parser.peek_token(), Token::make_word("version", None));
21905            assert_eq!(parser.next_token(), Token::make_word("version", None));
21906            assert_eq!(parser.peek_token(), Token::EOF);
21907            parser.prev_token();
21908            assert_eq!(parser.next_token(), Token::make_word("version", None));
21909            assert_eq!(parser.next_token(), Token::EOF);
21910            assert_eq!(parser.next_token(), Token::EOF);
21911            parser.prev_token();
21912        });
21913    }
21914
21915    #[test]
21916    fn test_peek_tokens() {
21917        all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
21918            assert!(matches!(
21919                parser.peek_tokens(),
21920                [Token::Word(Word {
21921                    keyword: Keyword::SELECT,
21922                    ..
21923                })]
21924            ));
21925
21926            assert!(matches!(
21927                parser.peek_tokens(),
21928                [
21929                    Token::Word(Word {
21930                        keyword: Keyword::SELECT,
21931                        ..
21932                    }),
21933                    Token::Word(_),
21934                    Token::Word(Word {
21935                        keyword: Keyword::AS,
21936                        ..
21937                    }),
21938                ]
21939            ));
21940
21941            for _ in 0..4 {
21942                parser.next_token();
21943            }
21944
21945            assert!(matches!(
21946                parser.peek_tokens(),
21947                [
21948                    Token::Word(Word {
21949                        keyword: Keyword::FROM,
21950                        ..
21951                    }),
21952                    Token::Word(_),
21953                    Token::EOF,
21954                    Token::EOF,
21955                ]
21956            ))
21957        })
21958    }
21959
21960    #[cfg(test)]
21961    mod test_parse_data_type {
21962        use crate::ast::{
21963            CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
21964        };
21965        use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
21966        use crate::test_utils::TestedDialects;
21967
21968        macro_rules! test_parse_data_type {
21969            ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
21970                $dialect.run_parser_method(&*$input, |parser| {
21971                    let data_type = parser.parse_data_type().unwrap();
21972                    assert_eq!($expected_type, data_type);
21973                    assert_eq!($input.to_string(), data_type.to_string());
21974                });
21975            }};
21976        }
21977
21978        #[test]
21979        fn test_ansii_character_string_types() {
21980            // Character string types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-string-type>
21981            let dialect =
21982                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21983
21984            test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
21985
21986            test_parse_data_type!(
21987                dialect,
21988                "CHARACTER(20)",
21989                DataType::Character(Some(CharacterLength::IntegerLength {
21990                    length: 20,
21991                    unit: None
21992                }))
21993            );
21994
21995            test_parse_data_type!(
21996                dialect,
21997                "CHARACTER(20 CHARACTERS)",
21998                DataType::Character(Some(CharacterLength::IntegerLength {
21999                    length: 20,
22000                    unit: Some(CharLengthUnits::Characters)
22001                }))
22002            );
22003
22004            test_parse_data_type!(
22005                dialect,
22006                "CHARACTER(20 OCTETS)",
22007                DataType::Character(Some(CharacterLength::IntegerLength {
22008                    length: 20,
22009                    unit: Some(CharLengthUnits::Octets)
22010                }))
22011            );
22012
22013            test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
22014
22015            test_parse_data_type!(
22016                dialect,
22017                "CHAR(20)",
22018                DataType::Char(Some(CharacterLength::IntegerLength {
22019                    length: 20,
22020                    unit: None
22021                }))
22022            );
22023
22024            test_parse_data_type!(
22025                dialect,
22026                "CHAR(20 CHARACTERS)",
22027                DataType::Char(Some(CharacterLength::IntegerLength {
22028                    length: 20,
22029                    unit: Some(CharLengthUnits::Characters)
22030                }))
22031            );
22032
22033            test_parse_data_type!(
22034                dialect,
22035                "CHAR(20 OCTETS)",
22036                DataType::Char(Some(CharacterLength::IntegerLength {
22037                    length: 20,
22038                    unit: Some(CharLengthUnits::Octets)
22039                }))
22040            );
22041
22042            test_parse_data_type!(
22043                dialect,
22044                "CHARACTER VARYING(20)",
22045                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
22046                    length: 20,
22047                    unit: None
22048                }))
22049            );
22050
22051            test_parse_data_type!(
22052                dialect,
22053                "CHARACTER VARYING(20 CHARACTERS)",
22054                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
22055                    length: 20,
22056                    unit: Some(CharLengthUnits::Characters)
22057                }))
22058            );
22059
22060            test_parse_data_type!(
22061                dialect,
22062                "CHARACTER VARYING(20 OCTETS)",
22063                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
22064                    length: 20,
22065                    unit: Some(CharLengthUnits::Octets)
22066                }))
22067            );
22068
22069            test_parse_data_type!(
22070                dialect,
22071                "CHAR VARYING(20)",
22072                DataType::CharVarying(Some(CharacterLength::IntegerLength {
22073                    length: 20,
22074                    unit: None
22075                }))
22076            );
22077
22078            test_parse_data_type!(
22079                dialect,
22080                "CHAR VARYING(20 CHARACTERS)",
22081                DataType::CharVarying(Some(CharacterLength::IntegerLength {
22082                    length: 20,
22083                    unit: Some(CharLengthUnits::Characters)
22084                }))
22085            );
22086
22087            test_parse_data_type!(
22088                dialect,
22089                "CHAR VARYING(20 OCTETS)",
22090                DataType::CharVarying(Some(CharacterLength::IntegerLength {
22091                    length: 20,
22092                    unit: Some(CharLengthUnits::Octets)
22093                }))
22094            );
22095
22096            test_parse_data_type!(
22097                dialect,
22098                "VARCHAR(20)",
22099                DataType::Varchar(Some(CharacterLength::IntegerLength {
22100                    length: 20,
22101                    unit: None
22102                }))
22103            );
22104        }
22105
22106        #[test]
22107        fn test_ansii_character_large_object_types() {
22108            // Character large object types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-length>
22109            let dialect =
22110                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
22111
22112            test_parse_data_type!(
22113                dialect,
22114                "CHARACTER LARGE OBJECT",
22115                DataType::CharacterLargeObject(None)
22116            );
22117            test_parse_data_type!(
22118                dialect,
22119                "CHARACTER LARGE OBJECT(20)",
22120                DataType::CharacterLargeObject(Some(20))
22121            );
22122
22123            test_parse_data_type!(
22124                dialect,
22125                "CHAR LARGE OBJECT",
22126                DataType::CharLargeObject(None)
22127            );
22128            test_parse_data_type!(
22129                dialect,
22130                "CHAR LARGE OBJECT(20)",
22131                DataType::CharLargeObject(Some(20))
22132            );
22133
22134            test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
22135            test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
22136        }
22137
22138        #[test]
22139        fn test_parse_custom_types() {
22140            let dialect =
22141                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
22142
22143            test_parse_data_type!(
22144                dialect,
22145                "GEOMETRY",
22146                DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
22147            );
22148
22149            test_parse_data_type!(
22150                dialect,
22151                "GEOMETRY(POINT)",
22152                DataType::Custom(
22153                    ObjectName::from(vec!["GEOMETRY".into()]),
22154                    vec!["POINT".to_string()]
22155                )
22156            );
22157
22158            test_parse_data_type!(
22159                dialect,
22160                "GEOMETRY(POINT, 4326)",
22161                DataType::Custom(
22162                    ObjectName::from(vec!["GEOMETRY".into()]),
22163                    vec!["POINT".to_string(), "4326".to_string()]
22164                )
22165            );
22166        }
22167
22168        #[test]
22169        fn test_ansii_exact_numeric_types() {
22170            // Exact numeric types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type>
22171            let dialect = TestedDialects::new(vec![
22172                Box::new(GenericDialect {}),
22173                Box::new(AnsiDialect {}),
22174                Box::new(PostgreSqlDialect {}),
22175            ]);
22176
22177            test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
22178
22179            test_parse_data_type!(
22180                dialect,
22181                "NUMERIC(2)",
22182                DataType::Numeric(ExactNumberInfo::Precision(2))
22183            );
22184
22185            test_parse_data_type!(
22186                dialect,
22187                "NUMERIC(2,10)",
22188                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
22189            );
22190
22191            test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
22192
22193            test_parse_data_type!(
22194                dialect,
22195                "DECIMAL(2)",
22196                DataType::Decimal(ExactNumberInfo::Precision(2))
22197            );
22198
22199            test_parse_data_type!(
22200                dialect,
22201                "DECIMAL(2,10)",
22202                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
22203            );
22204
22205            test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
22206
22207            test_parse_data_type!(
22208                dialect,
22209                "DEC(2)",
22210                DataType::Dec(ExactNumberInfo::Precision(2))
22211            );
22212
22213            test_parse_data_type!(
22214                dialect,
22215                "DEC(2,10)",
22216                DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
22217            );
22218
22219            // Test negative scale values.
22220            test_parse_data_type!(
22221                dialect,
22222                "NUMERIC(10,-2)",
22223                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
22224            );
22225
22226            test_parse_data_type!(
22227                dialect,
22228                "DECIMAL(1000,-10)",
22229                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
22230            );
22231
22232            test_parse_data_type!(
22233                dialect,
22234                "DEC(5,-1000)",
22235                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
22236            );
22237
22238            test_parse_data_type!(
22239                dialect,
22240                "NUMERIC(10,-5)",
22241                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
22242            );
22243
22244            test_parse_data_type!(
22245                dialect,
22246                "DECIMAL(20,-10)",
22247                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
22248            );
22249
22250            test_parse_data_type!(
22251                dialect,
22252                "DEC(5,-2)",
22253                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
22254            );
22255
22256            dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
22257                let data_type = parser.parse_data_type().unwrap();
22258                assert_eq!(
22259                    DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
22260                    data_type
22261                );
22262                // Note: Explicit '+' sign is not preserved in output, which is correct
22263                assert_eq!("NUMERIC(10,5)", data_type.to_string());
22264            });
22265        }
22266
22267        #[test]
22268        fn test_ansii_date_type() {
22269            // Datetime types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type>
22270            let dialect =
22271                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
22272
22273            test_parse_data_type!(dialect, "DATE", DataType::Date);
22274
22275            test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
22276
22277            test_parse_data_type!(
22278                dialect,
22279                "TIME(6)",
22280                DataType::Time(Some(6), TimezoneInfo::None)
22281            );
22282
22283            test_parse_data_type!(
22284                dialect,
22285                "TIME WITH TIME ZONE",
22286                DataType::Time(None, TimezoneInfo::WithTimeZone)
22287            );
22288
22289            test_parse_data_type!(
22290                dialect,
22291                "TIME(6) WITH TIME ZONE",
22292                DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
22293            );
22294
22295            test_parse_data_type!(
22296                dialect,
22297                "TIME WITHOUT TIME ZONE",
22298                DataType::Time(None, TimezoneInfo::WithoutTimeZone)
22299            );
22300
22301            test_parse_data_type!(
22302                dialect,
22303                "TIME(6) WITHOUT TIME ZONE",
22304                DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
22305            );
22306
22307            test_parse_data_type!(
22308                dialect,
22309                "TIMESTAMP",
22310                DataType::Timestamp(None, TimezoneInfo::None)
22311            );
22312
22313            test_parse_data_type!(
22314                dialect,
22315                "TIMESTAMP(22)",
22316                DataType::Timestamp(Some(22), TimezoneInfo::None)
22317            );
22318
22319            test_parse_data_type!(
22320                dialect,
22321                "TIMESTAMP(22) WITH TIME ZONE",
22322                DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
22323            );
22324
22325            test_parse_data_type!(
22326                dialect,
22327                "TIMESTAMP(33) WITHOUT TIME ZONE",
22328                DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
22329            );
22330        }
22331    }
22332
22333    #[test]
22334    fn test_parse_schema_name() {
22335        // The expected name should be identical as the input name, that's why I don't receive both
22336        macro_rules! test_parse_schema_name {
22337            ($input:expr, $expected_name:expr $(,)?) => {{
22338                all_dialects().run_parser_method(&*$input, |parser| {
22339                    let schema_name = parser.parse_schema_name().unwrap();
22340                    // Validate that the structure is the same as expected
22341                    assert_eq!(schema_name, $expected_name);
22342                    // Validate that the input and the expected structure serialization are the same
22343                    assert_eq!(schema_name.to_string(), $input.to_string());
22344                });
22345            }};
22346        }
22347
22348        let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
22349        let dummy_authorization = Ident::new("dummy_authorization");
22350
22351        test_parse_schema_name!(
22352            format!("{dummy_name}"),
22353            SchemaName::Simple(dummy_name.clone())
22354        );
22355
22356        test_parse_schema_name!(
22357            format!("AUTHORIZATION {dummy_authorization}"),
22358            SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
22359        );
22360        test_parse_schema_name!(
22361            format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
22362            SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
22363        );
22364    }
22365
22366    #[test]
22367    fn mysql_parse_index_table_constraint() {
22368        macro_rules! test_parse_table_constraint {
22369            ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
22370                $dialect.run_parser_method(&*$input, |parser| {
22371                    let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
22372                    // Validate that the structure is the same as expected
22373                    assert_eq!(constraint, $expected);
22374                    // Validate that the input and the expected structure serialization are the same
22375                    assert_eq!(constraint.to_string(), $input.to_string());
22376                });
22377            }};
22378        }
22379
22380        fn mk_expected_col(name: &str) -> IndexColumn {
22381            IndexColumn {
22382                column: OrderByExpr {
22383                    expr: Expr::Identifier(name.into()),
22384                    options: OrderByOptions {
22385                        asc: None,
22386                        nulls_first: None,
22387                    },
22388                    with_fill: None,
22389                },
22390                operator_class: None,
22391            }
22392        }
22393
22394        let dialect =
22395            TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
22396
22397        test_parse_table_constraint!(
22398            dialect,
22399            "INDEX (c1)",
22400            IndexConstraint {
22401                display_as_key: false,
22402                name: None,
22403                index_type: None,
22404                columns: vec![mk_expected_col("c1")],
22405                index_options: vec![],
22406            }
22407            .into()
22408        );
22409
22410        test_parse_table_constraint!(
22411            dialect,
22412            "KEY (c1)",
22413            IndexConstraint {
22414                display_as_key: true,
22415                name: None,
22416                index_type: None,
22417                columns: vec![mk_expected_col("c1")],
22418                index_options: vec![],
22419            }
22420            .into()
22421        );
22422
22423        test_parse_table_constraint!(
22424            dialect,
22425            "INDEX 'index' (c1, c2)",
22426            TableConstraint::Index(IndexConstraint {
22427                display_as_key: false,
22428                name: Some(Ident::with_quote('\'', "index")),
22429                index_type: None,
22430                columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
22431                index_options: vec![],
22432            })
22433        );
22434
22435        test_parse_table_constraint!(
22436            dialect,
22437            "INDEX USING BTREE (c1)",
22438            IndexConstraint {
22439                display_as_key: false,
22440                name: None,
22441                index_type: Some(IndexType::BTree),
22442                columns: vec![mk_expected_col("c1")],
22443                index_options: vec![],
22444            }
22445            .into()
22446        );
22447
22448        test_parse_table_constraint!(
22449            dialect,
22450            "INDEX USING HASH (c1)",
22451            IndexConstraint {
22452                display_as_key: false,
22453                name: None,
22454                index_type: Some(IndexType::Hash),
22455                columns: vec![mk_expected_col("c1")],
22456                index_options: vec![],
22457            }
22458            .into()
22459        );
22460
22461        test_parse_table_constraint!(
22462            dialect,
22463            "INDEX idx_name USING BTREE (c1)",
22464            IndexConstraint {
22465                display_as_key: false,
22466                name: Some(Ident::new("idx_name")),
22467                index_type: Some(IndexType::BTree),
22468                columns: vec![mk_expected_col("c1")],
22469                index_options: vec![],
22470            }
22471            .into()
22472        );
22473
22474        test_parse_table_constraint!(
22475            dialect,
22476            "INDEX idx_name USING HASH (c1)",
22477            IndexConstraint {
22478                display_as_key: false,
22479                name: Some(Ident::new("idx_name")),
22480                index_type: Some(IndexType::Hash),
22481                columns: vec![mk_expected_col("c1")],
22482                index_options: vec![],
22483            }
22484            .into()
22485        );
22486    }
22487
22488    #[test]
22489    fn test_tokenizer_error_loc() {
22490        let sql = "foo '";
22491        let ast = Parser::parse_sql(&GenericDialect, sql);
22492        assert_eq!(
22493            ast,
22494            Err(ParserError::TokenizerError(
22495                "Unterminated string literal at Line: 1, Column: 5".to_string()
22496            ))
22497        );
22498    }
22499
22500    #[test]
22501    fn test_parser_error_loc() {
22502        let sql = "SELECT this is a syntax error";
22503        let ast = Parser::parse_sql(&GenericDialect, sql);
22504        assert_eq!(
22505            ast,
22506            Err(ParserError::ParserError(
22507                "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
22508                    .to_string()
22509            ))
22510        );
22511    }
22512
22513    #[test]
22514    fn test_nested_explain_error() {
22515        let sql = "EXPLAIN EXPLAIN SELECT 1";
22516        let ast = Parser::parse_sql(&GenericDialect, sql);
22517        assert_eq!(
22518            ast,
22519            Err(ParserError::ParserError(
22520                "Explain must be root of the plan".to_string()
22521            ))
22522        );
22523    }
22524
22525    #[test]
22526    fn test_parse_multipart_identifier_positive() {
22527        let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
22528
22529        // parse multipart with quotes
22530        let expected = vec![
22531            Ident {
22532                value: "CATALOG".to_string(),
22533                quote_style: None,
22534                span: Span::empty(),
22535            },
22536            Ident {
22537                value: "F(o)o. \"bar".to_string(),
22538                quote_style: Some('"'),
22539                span: Span::empty(),
22540            },
22541            Ident {
22542                value: "table".to_string(),
22543                quote_style: None,
22544                span: Span::empty(),
22545            },
22546        ];
22547        dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
22548            let actual = parser.parse_multipart_identifier().unwrap();
22549            assert_eq!(expected, actual);
22550        });
22551
22552        // allow whitespace between ident parts
22553        let expected = vec![
22554            Ident {
22555                value: "CATALOG".to_string(),
22556                quote_style: None,
22557                span: Span::empty(),
22558            },
22559            Ident {
22560                value: "table".to_string(),
22561                quote_style: None,
22562                span: Span::empty(),
22563            },
22564        ];
22565        dialect.run_parser_method("CATALOG . table", |parser| {
22566            let actual = parser.parse_multipart_identifier().unwrap();
22567            assert_eq!(expected, actual);
22568        });
22569    }
22570
22571    #[test]
22572    fn test_parse_multipart_identifier_negative() {
22573        macro_rules! test_parse_multipart_identifier_error {
22574            ($input:expr, $expected_err:expr $(,)?) => {{
22575                all_dialects().run_parser_method(&*$input, |parser| {
22576                    let actual_err = parser.parse_multipart_identifier().unwrap_err();
22577                    assert_eq!(actual_err.to_string(), $expected_err);
22578                });
22579            }};
22580        }
22581
22582        test_parse_multipart_identifier_error!(
22583            "",
22584            "sql parser error: Empty input when parsing identifier",
22585        );
22586
22587        test_parse_multipart_identifier_error!(
22588            "*schema.table",
22589            "sql parser error: Unexpected token in identifier: *",
22590        );
22591
22592        test_parse_multipart_identifier_error!(
22593            "schema.table*",
22594            "sql parser error: Unexpected token in identifier: *",
22595        );
22596
22597        test_parse_multipart_identifier_error!(
22598            "schema.table.",
22599            "sql parser error: Trailing period in identifier",
22600        );
22601
22602        test_parse_multipart_identifier_error!(
22603            "schema.*",
22604            "sql parser error: Unexpected token following period in identifier: *",
22605        );
22606    }
22607
22608    #[test]
22609    fn test_mysql_partition_selection() {
22610        let sql = "SELECT * FROM employees PARTITION (p0, p2)";
22611        let expected = vec!["p0", "p2"];
22612
22613        let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
22614        assert_eq!(ast.len(), 1);
22615        if let Statement::Query(v) = &ast[0] {
22616            if let SetExpr::Select(select) = &*v.body {
22617                assert_eq!(select.from.len(), 1);
22618                let from: &TableWithJoins = &select.from[0];
22619                let table_factor = &from.relation;
22620                if let TableFactor::Table { partitions, .. } = table_factor {
22621                    let actual: Vec<&str> = partitions
22622                        .iter()
22623                        .map(|ident| ident.value.as_str())
22624                        .collect();
22625                    assert_eq!(expected, actual);
22626                }
22627            }
22628        } else {
22629            panic!("fail to parse mysql partition selection");
22630        }
22631    }
22632
22633    #[test]
22634    fn test_replace_into_placeholders() {
22635        let sql = "REPLACE INTO t (a) VALUES (&a)";
22636
22637        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22638    }
22639
22640    #[test]
22641    fn test_replace_into_set_placeholder() {
22642        let sql = "REPLACE INTO t SET ?";
22643
22644        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22645    }
22646
22647    #[test]
22648    fn test_replace_incomplete() {
22649        let sql = r#"REPLACE"#;
22650
22651        assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
22652    }
22653
22654    #[test]
22655    fn test_placeholder_invalid_whitespace() {
22656        for w in ["  ", "/*invalid*/"] {
22657            let sql = format!("\nSELECT\n  :{w}fooBar");
22658            assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
22659        }
22660    }
22661}