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    collections::{BTreeMap, BTreeSet},
19    format,
20    string::{String, ToString},
21    vec,
22    vec::Vec,
23};
24use core::{
25    fmt::{self, Display},
26    str::FromStr,
27};
28#[cfg(feature = "std")]
29use std::collections::{BTreeMap, BTreeSet};
30
31use helpers::attached_token::AttachedToken;
32
33use log::debug;
34
35use recursion::RecursionCounter;
36use IsLateral::*;
37use IsOptional::*;
38
39use crate::ast::*;
40use crate::ast::{
41    comments,
42    helpers::{
43        key_value_options::{
44            KeyValueOption, KeyValueOptionKind, KeyValueOptions, KeyValueOptionsDelimiter,
45        },
46        stmt_create_table::{CreateTableBuilder, CreateTableConfiguration},
47    },
48};
49use crate::dialect::*;
50use crate::keywords::{Keyword, ALL_KEYWORDS};
51use crate::tokenizer::*;
52use sqlparser::parser::ParserState::ColumnDefinition;
53
54/// Errors produced by the SQL parser.
55#[derive(Debug, Clone, PartialEq, Eq)]
56pub enum ParserError {
57    /// Error originating from the tokenizer with a message.
58    TokenizerError(String),
59    /// Generic parser error with a message.
60    ParserError(String),
61    /// Raised when a recursion depth limit is exceeded.
62    RecursionLimitExceeded,
63}
64
65// Use `Parser::expected` instead, if possible
66macro_rules! parser_err {
67    ($MSG:expr, $loc:expr) => {
68        Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
69    };
70}
71
72mod alter;
73mod merge;
74
75/// Implementation of [`RecursionCounter`].
76///
77/// Explicitly requires only `alloc` and `core`, so recursion is limited even
78/// when the "std" feature is disabled.
79mod recursion {
80    use alloc::rc::Rc;
81    use core::cell::Cell;
82
83    use super::ParserError;
84
85    /// Tracks remaining recursion depth. This value is decremented on
86    /// each call to [`RecursionCounter::try_decrease()`], when it reaches 0 an error will
87    /// be returned.
88    ///
89    /// Note: Uses an [`alloc::rc::Rc`] and [`core::cell::Cell`] in order to satisfy the Rust
90    /// borrow checker so the automatic [`DepthGuard`] decrement a
91    /// reference to the counter.
92    ///
93    /// Note: when "recursive-protection" feature is enabled, this crate uses additional stack overflow protection
94    /// for some of its recursive methods. See [`recursive::recursive`] for more information.
95    pub(crate) struct RecursionCounter {
96        remaining_depth: Rc<Cell<usize>>,
97    }
98
99    impl RecursionCounter {
100        /// Creates a [`RecursionCounter`] with the specified maximum
101        /// depth
102        pub fn new(remaining_depth: usize) -> Self {
103            Self {
104                remaining_depth: Rc::new(remaining_depth.into()),
105            }
106        }
107
108        /// Decreases the remaining depth by 1.
109        ///
110        /// Returns [`Err`] if the remaining depth falls to 0.
111        ///
112        /// Returns a [`DepthGuard`] which will adds 1 to the
113        /// remaining depth upon drop;
114        pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
115            let old_value = self.remaining_depth.get();
116            // ran out of space
117            if old_value == 0 {
118                Err(ParserError::RecursionLimitExceeded)
119            } else {
120                self.remaining_depth.set(old_value - 1);
121                Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
122            }
123        }
124    }
125
126    /// Guard that increases the remaining depth by 1 on drop
127    pub struct DepthGuard {
128        remaining_depth: Rc<Cell<usize>>,
129    }
130
131    impl DepthGuard {
132        fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
133            Self { remaining_depth }
134        }
135    }
136
137    impl Drop for DepthGuard {
138        fn drop(&mut self) {
139            let old_value = self.remaining_depth.get();
140            self.remaining_depth.set(old_value.saturating_add(1));
141        }
142    }
143}
144
145#[derive(PartialEq, Eq)]
146/// Indicates whether a parser element is optional or mandatory.
147pub enum IsOptional {
148    /// The element is optional.
149    Optional,
150    /// The element is mandatory.
151    Mandatory,
152}
153
154/// Indicates if a table expression is lateral.
155pub enum IsLateral {
156    /// The expression is lateral.
157    Lateral,
158    /// The expression is not lateral.
159    NotLateral,
160}
161
162/// Represents a wildcard expression used in SELECT lists.
163pub enum WildcardExpr {
164    /// A specific expression used instead of a wildcard.
165    Expr(Expr),
166    /// A qualified wildcard like `table.*`.
167    QualifiedWildcard(ObjectName),
168    /// An unqualified `*` wildcard.
169    Wildcard,
170}
171
172impl From<TokenizerError> for ParserError {
173    fn from(e: TokenizerError) -> Self {
174        ParserError::TokenizerError(e.to_string())
175    }
176}
177
178impl fmt::Display for ParserError {
179    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
180        write!(
181            f,
182            "sql parser error: {}",
183            match self {
184                ParserError::TokenizerError(s) => s,
185                ParserError::ParserError(s) => s,
186                ParserError::RecursionLimitExceeded => "recursion limit exceeded",
187            }
188        )
189    }
190}
191
192impl core::error::Error for ParserError {}
193
194// By default, allow expressions up to this deep before erroring
195const DEFAULT_REMAINING_DEPTH: usize = 50;
196
197// A constant EOF token that can be referenced.
198const EOF_TOKEN: TokenWithSpan = TokenWithSpan {
199    token: Token::EOF,
200    span: Span {
201        start: Location { line: 0, column: 0 },
202        end: Location { line: 0, column: 0 },
203    },
204};
205
206/// Composite types declarations using angle brackets syntax can be arbitrary
207/// nested such that the following declaration is possible:
208///      `ARRAY<ARRAY<INT>>`
209/// But the tokenizer recognizes the `>>` as a ShiftRight token.
210/// We work around that limitation when parsing a data type by accepting
211/// either a `>` or `>>` token in such cases, remembering which variant we
212/// matched.
213/// In the latter case having matched a `>>`, the parent type will not look to
214/// match its closing `>` as a result since that will have taken place at the
215/// child type.
216///
217/// See [Parser::parse_data_type] for details
218struct MatchedTrailingBracket(bool);
219
220impl From<bool> for MatchedTrailingBracket {
221    fn from(value: bool) -> Self {
222        Self(value)
223    }
224}
225
226/// Options that control how the [`Parser`] parses SQL text
227#[derive(Debug, Clone, PartialEq, Eq)]
228pub struct ParserOptions {
229    /// Allow trailing commas in lists (e.g. `a, b,`).
230    pub trailing_commas: bool,
231    /// Controls how literal values are unescaped. See
232    /// [`Tokenizer::with_unescape`] for more details.
233    pub unescape: bool,
234    /// Controls if the parser expects a semi-colon token
235    /// between statements. Default is `true`.
236    pub require_semicolon_stmt_delimiter: bool,
237}
238
239impl Default for ParserOptions {
240    fn default() -> Self {
241        Self {
242            trailing_commas: false,
243            unescape: true,
244            require_semicolon_stmt_delimiter: true,
245        }
246    }
247}
248
249impl ParserOptions {
250    /// Create a new [`ParserOptions`]
251    pub fn new() -> Self {
252        Default::default()
253    }
254
255    /// Set if trailing commas are allowed.
256    ///
257    /// If this option is `false` (the default), the following SQL will
258    /// not parse. If the option is `true`, the SQL will parse.
259    ///
260    /// ```sql
261    ///  SELECT
262    ///   foo,
263    ///   bar,
264    ///  FROM baz
265    /// ```
266    pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
267        self.trailing_commas = trailing_commas;
268        self
269    }
270
271    /// Set if literal values are unescaped. Defaults to true. See
272    /// [`Tokenizer::with_unescape`] for more details.
273    pub fn with_unescape(mut self, unescape: bool) -> Self {
274        self.unescape = unescape;
275        self
276    }
277}
278
279#[derive(Copy, Clone)]
280enum ParserState {
281    /// The default state of the parser.
282    Normal,
283    /// The state when parsing a CONNECT BY expression. This allows parsing
284    /// PRIOR expressions while still allowing prior as an identifier name
285    /// in other contexts.
286    ConnectBy,
287    /// The state when parsing column definitions.  This state prohibits
288    /// NOT NULL as an alias for IS NOT NULL.  For example:
289    /// ```sql
290    /// CREATE TABLE foo (abc BIGINT NOT NULL);
291    /// ```
292    ColumnDefinition,
293}
294
295/// A SQL Parser
296///
297/// This struct is the main entry point for parsing SQL queries.
298///
299/// # Functionality:
300/// * Parsing SQL: see examples on [`Parser::new`] and [`Parser::parse_sql`]
301/// * Controlling recursion: See [`Parser::with_recursion_limit`]
302/// * Controlling parser options: See [`Parser::with_options`]
303/// * Providing your own tokens: See [`Parser::with_tokens`]
304///
305/// # Internals
306///
307/// The parser uses a [`Tokenizer`] to tokenize the input SQL string into a
308/// `Vec` of [`TokenWithSpan`]s and maintains an `index` to the current token
309/// being processed. The token vec may contain multiple SQL statements.
310///
311/// * The "current" token is the token at `index - 1`
312/// * The "next" token is the token at `index`
313/// * The "previous" token is the token at `index - 2`
314///
315/// If `index` is equal to the length of the token stream, the 'next' token is
316/// [`Token::EOF`].
317///
318/// For example, the SQL string "SELECT * FROM foo" will be tokenized into
319/// following tokens:
320/// ```text
321///  [
322///    "SELECT", // token index 0
323///    " ",      // whitespace
324///    "*",
325///    " ",
326///    "FROM",
327///    " ",
328///    "foo"
329///   ]
330/// ```
331///
332///
333pub struct Parser<'a> {
334    /// The tokens
335    tokens: Vec<TokenWithSpan>,
336    /// The index of the first unprocessed token in [`Parser::tokens`].
337    index: usize,
338    /// The current state of the parser.
339    state: ParserState,
340    /// The SQL dialect to use.
341    dialect: &'a dyn Dialect,
342    /// Additional options that allow you to mix & match behavior
343    /// otherwise constrained to certain dialects (e.g. trailing
344    /// commas) and/or format of parse (e.g. unescaping).
345    options: ParserOptions,
346    /// Ensures the stack does not overflow by limiting recursion depth.
347    recursion_counter: RecursionCounter,
348    /// Cached failures from `parse_prefix` calls that returned `Err`. See
349    /// [`Parser::parse_prefix`] for the 2^N patterns this guards.
350    failed_prefix_positions: BTreeMap<usize, ExprPrefixError>,
351    /// Cached failures from the speculative reserved-word prefix arm. See
352    /// [`Parser::parse_prefix`] for the 2^N patterns this guards.
353    failed_reserved_word_prefix_positions: BTreeMap<usize, ExprPrefixError>,
354    /// Cached failures from the speculative derived-table arm of
355    /// `parse_table_factor`. See [`Parser::parse_table_factor`] for the 2^N
356    /// pattern this guards.
357    failed_derived_table_factor_positions: BTreeSet<usize>,
358}
359
360/// Copy marker for a [`ParserError`] cached by the `parse_prefix` failure
361/// memoization, so the caches hold no strings.
362#[derive(Debug, Clone, Copy)]
363enum ExprPrefixError {
364    RecursionLimitExceeded,
365    Err,
366}
367
368impl From<&ParserError> for ExprPrefixError {
369    fn from(e: &ParserError) -> Self {
370        match e {
371            ParserError::RecursionLimitExceeded => Self::RecursionLimitExceeded,
372            _ => Self::Err,
373        }
374    }
375}
376
377impl<'a> Parser<'a> {
378    /// Create a parser for a [`Dialect`]
379    ///
380    /// See also [`Parser::parse_sql`]
381    ///
382    /// Example:
383    /// ```
384    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
385    /// # fn main() -> Result<(), ParserError> {
386    /// let dialect = GenericDialect{};
387    /// let statements = Parser::new(&dialect)
388    ///   .try_with_sql("SELECT * FROM foo")?
389    ///   .parse_statements()?;
390    /// # Ok(())
391    /// # }
392    /// ```
393    pub fn new(dialect: &'a dyn Dialect) -> Self {
394        Self {
395            tokens: vec![],
396            index: 0,
397            state: ParserState::Normal,
398            dialect,
399            recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
400            options: ParserOptions::new().with_trailing_commas(dialect.supports_trailing_commas()),
401            failed_prefix_positions: BTreeMap::new(),
402            failed_reserved_word_prefix_positions: BTreeMap::new(),
403            failed_derived_table_factor_positions: BTreeSet::new(),
404        }
405    }
406
407    /// Specify the maximum recursion limit while parsing.
408    ///
409    /// [`Parser`] prevents stack overflows by returning
410    /// [`ParserError::RecursionLimitExceeded`] if the parser exceeds
411    /// this depth while processing the query.
412    ///
413    /// Example:
414    /// ```
415    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
416    /// # fn main() -> Result<(), ParserError> {
417    /// let dialect = GenericDialect{};
418    /// let result = Parser::new(&dialect)
419    ///   .with_recursion_limit(1)
420    ///   .try_with_sql("SELECT * FROM foo WHERE (a OR (b OR (c OR d)))")?
421    ///   .parse_statements();
422    ///   assert_eq!(result, Err(ParserError::RecursionLimitExceeded));
423    /// # Ok(())
424    /// # }
425    /// ```
426    ///
427    /// Note: Versions prior to `0.63.0` did not enforce any limit in builds
428    /// without the "std" feature.
429    ///
430    /// Note: when "recursive-protection" feature is enabled, this crate uses
431    /// additional stack overflow protection for some of its recursive methods.
432    /// See [`recursive::recursive`] for more information.
433    pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
434        self.recursion_counter = RecursionCounter::new(recursion_limit);
435        self
436    }
437
438    /// Specify additional parser options
439    ///
440    /// [`Parser`] supports additional options ([`ParserOptions`])
441    /// that allow you to mix & match behavior otherwise constrained
442    /// to certain dialects (e.g. trailing commas).
443    ///
444    /// Example:
445    /// ```
446    /// # use sqlparser::{parser::{Parser, ParserError, ParserOptions}, dialect::GenericDialect};
447    /// # fn main() -> Result<(), ParserError> {
448    /// let dialect = GenericDialect{};
449    /// let options = ParserOptions::new()
450    ///    .with_trailing_commas(true)
451    ///    .with_unescape(false);
452    /// let result = Parser::new(&dialect)
453    ///   .with_options(options)
454    ///   .try_with_sql("SELECT a, b, COUNT(*), FROM foo GROUP BY a, b,")?
455    ///   .parse_statements();
456    ///   assert!(matches!(result, Ok(_)));
457    /// # Ok(())
458    /// # }
459    /// ```
460    pub fn with_options(mut self, options: ParserOptions) -> Self {
461        self.options = options;
462        self
463    }
464
465    /// Reset this parser to parse the specified token stream
466    pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithSpan>) -> Self {
467        self.tokens = tokens;
468        self.index = 0;
469        self.failed_prefix_positions.clear();
470        self.failed_reserved_word_prefix_positions.clear();
471        self.failed_derived_table_factor_positions.clear();
472        self
473    }
474
475    /// Reset this parser state to parse the specified tokens
476    pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
477        // Put in dummy locations
478        let tokens_with_locations: Vec<TokenWithSpan> = tokens
479            .into_iter()
480            .map(|token| TokenWithSpan {
481                token,
482                span: Span::empty(),
483            })
484            .collect();
485        self.with_tokens_with_locations(tokens_with_locations)
486    }
487
488    /// Tokenize the sql string and sets this [`Parser`]'s state to
489    /// parse the resulting tokens
490    ///
491    /// Returns an error if there was an error tokenizing the SQL string.
492    ///
493    /// See example on [`Parser::new()`] for an example
494    pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
495        debug!("Parsing sql '{sql}'...");
496        let tokens = Tokenizer::new(self.dialect, sql)
497            .with_unescape(self.options.unescape)
498            .tokenize_with_location()?;
499        Ok(self.with_tokens_with_locations(tokens))
500    }
501
502    /// Parse potentially multiple statements
503    ///
504    /// Example
505    /// ```
506    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
507    /// # fn main() -> Result<(), ParserError> {
508    /// let dialect = GenericDialect{};
509    /// let statements = Parser::new(&dialect)
510    ///   // Parse a SQL string with 2 separate statements
511    ///   .try_with_sql("SELECT * FROM foo; SELECT * FROM bar;")?
512    ///   .parse_statements()?;
513    /// assert_eq!(statements.len(), 2);
514    /// # Ok(())
515    /// # }
516    /// ```
517    pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
518        let mut stmts = Vec::new();
519        let mut expecting_statement_delimiter = false;
520        loop {
521            // ignore empty statements (between successive statement delimiters)
522            while self.consume_token(&Token::SemiColon) {
523                expecting_statement_delimiter = false;
524            }
525
526            if !self.options.require_semicolon_stmt_delimiter {
527                expecting_statement_delimiter = false;
528            }
529
530            match &self.peek_token_ref().token {
531                Token::EOF => break,
532                // end of statement
533                Token::Word(word)
534                    if expecting_statement_delimiter && word.keyword == Keyword::END =>
535                {
536                    break;
537                }
538                _ => {}
539            }
540
541            if expecting_statement_delimiter {
542                return self.expected_ref("end of statement", self.peek_token_ref());
543            }
544
545            let statement = self.parse_statement()?;
546            stmts.push(statement);
547            expecting_statement_delimiter = true;
548        }
549        Ok(stmts)
550    }
551
552    /// Convenience method to parse a string with one or more SQL
553    /// statements into produce an Abstract Syntax Tree (AST).
554    ///
555    /// Example
556    /// ```
557    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
558    /// # fn main() -> Result<(), ParserError> {
559    /// let dialect = GenericDialect{};
560    /// let statements = Parser::parse_sql(
561    ///   &dialect, "SELECT * FROM foo"
562    /// )?;
563    /// assert_eq!(statements.len(), 1);
564    /// # Ok(())
565    /// # }
566    /// ```
567    pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
568        Parser::new(dialect).try_with_sql(sql)?.parse_statements()
569    }
570
571    /// Parses the given `sql` into an Abstract Syntax Tree (AST), returning
572    /// also encountered source code comments.
573    ///
574    /// See [Parser::parse_sql].
575    pub fn parse_sql_with_comments(
576        dialect: &'a dyn Dialect,
577        sql: &str,
578    ) -> Result<(Vec<Statement>, comments::Comments), ParserError> {
579        let mut p = Parser::new(dialect).try_with_sql(sql)?;
580        p.parse_statements().map(|stmts| (stmts, p.into_comments()))
581    }
582
583    /// Consumes this parser returning comments from the parsed token stream.
584    pub fn into_comments(self) -> comments::Comments {
585        let mut comments = comments::Comments::default();
586        for t in self.tokens.into_iter() {
587            match t.token {
588                Token::Whitespace(Whitespace::SingleLineComment { comment, prefix }) => {
589                    comments.offer(comments::CommentWithSpan {
590                        comment: comments::Comment::SingleLine {
591                            content: comment,
592                            prefix,
593                        },
594                        span: t.span,
595                    });
596                }
597                Token::Whitespace(Whitespace::MultiLineComment(comment)) => {
598                    comments.offer(comments::CommentWithSpan {
599                        comment: comments::Comment::MultiLine(comment),
600                        span: t.span,
601                    });
602                }
603                _ => {}
604            }
605        }
606        comments
607    }
608
609    /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.),
610    /// stopping before the statement separator, if any.
611    pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
612        let _guard = self.recursion_counter.try_decrease()?;
613
614        // allow the dialect to override statement parsing
615        if let Some(statement) = self.dialect.parse_statement(self) {
616            return statement;
617        }
618
619        let next_token = self.next_token();
620        match &next_token.token {
621            Token::Word(w) => match w.keyword {
622                Keyword::KILL => self.parse_kill(),
623                Keyword::FLUSH => self.parse_flush(),
624                Keyword::DESC => self.parse_explain(DescribeAlias::Desc),
625                Keyword::DESCRIBE => self.parse_explain(DescribeAlias::Describe),
626                Keyword::EXPLAIN => self.parse_explain(DescribeAlias::Explain),
627                Keyword::ANALYZE => self.parse_analyze().map(Into::into),
628                Keyword::CASE => {
629                    self.prev_token();
630                    self.parse_case_stmt().map(Into::into)
631                }
632                Keyword::IF => {
633                    self.prev_token();
634                    self.parse_if_stmt().map(Into::into)
635                }
636                Keyword::WHILE => {
637                    self.prev_token();
638                    self.parse_while().map(Into::into)
639                }
640                Keyword::RAISE => {
641                    self.prev_token();
642                    self.parse_raise_stmt().map(Into::into)
643                }
644                Keyword::SELECT | Keyword::WITH | Keyword::VALUES | Keyword::FROM => {
645                    self.prev_token();
646                    self.parse_query().map(Into::into)
647                }
648                Keyword::TRUNCATE => self.parse_truncate().map(Into::into),
649                Keyword::ATTACH => {
650                    if dialect_of!(self is DuckDbDialect) {
651                        self.parse_attach_duckdb_database()
652                    } else {
653                        self.parse_attach_database()
654                    }
655                }
656                Keyword::DETACH if self.dialect.supports_detach() => {
657                    self.parse_detach_duckdb_database()
658                }
659                Keyword::MSCK => self.parse_msck().map(Into::into),
660                Keyword::CREATE => self.parse_create(),
661                Keyword::CACHE => self.parse_cache_table(),
662                Keyword::DROP => self.parse_drop(),
663                Keyword::DISCARD => self.parse_discard(),
664                Keyword::DECLARE => self.parse_declare(),
665                Keyword::FETCH => self.parse_fetch_statement(),
666                Keyword::DELETE => self.parse_delete(next_token),
667                Keyword::INSERT => self.parse_insert(next_token),
668                Keyword::REPLACE => self.parse_replace(next_token),
669                Keyword::UNCACHE => self.parse_uncache_table(),
670                Keyword::UPDATE => self.parse_update(next_token),
671                Keyword::ALTER => self.parse_alter(),
672                Keyword::CALL => self.parse_call(),
673                Keyword::COPY => self.parse_copy(),
674                Keyword::OPEN => {
675                    self.prev_token();
676                    self.parse_open()
677                }
678                Keyword::CLOSE => self.parse_close(),
679                Keyword::SET => self.parse_set(),
680                Keyword::SHOW => self.parse_show(),
681                Keyword::USE => self.parse_use(),
682                Keyword::GRANT => self.parse_grant().map(Into::into),
683                Keyword::DENY => {
684                    self.prev_token();
685                    self.parse_deny()
686                }
687                Keyword::REVOKE => self.parse_revoke().map(Into::into),
688                Keyword::START => self.parse_start_transaction(),
689                Keyword::BEGIN => self.parse_begin(),
690                Keyword::END => self.parse_end(),
691                Keyword::SAVEPOINT => self.parse_savepoint(),
692                Keyword::RELEASE => self.parse_release(),
693                Keyword::COMMIT => self.parse_commit(),
694                Keyword::RAISERROR => Ok(self.parse_raiserror()?),
695                Keyword::THROW => {
696                    self.prev_token();
697                    self.parse_throw().map(Into::into)
698                }
699                Keyword::ROLLBACK => self.parse_rollback(),
700                Keyword::ABORT => self.parse_abort(),
701                Keyword::ASSERT => self.parse_assert(),
702                // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
703                // syntaxes. They are used for Postgres prepared statement.
704                Keyword::DEALLOCATE => self.parse_deallocate(),
705                Keyword::EXECUTE | Keyword::EXEC => self.parse_execute(),
706                Keyword::PREPARE => self.parse_prepare(),
707                Keyword::MERGE => self.parse_merge(next_token).map(Into::into),
708                // `LISTEN`, `UNLISTEN` and `NOTIFY` are Postgres-specific
709                // syntaxes. They are used for Postgres statement.
710                Keyword::LISTEN if self.dialect.supports_listen_notify() => self.parse_listen(),
711                Keyword::UNLISTEN if self.dialect.supports_listen_notify() => self.parse_unlisten(),
712                Keyword::NOTIFY if self.dialect.supports_listen_notify() => self.parse_notify(),
713                // `PRAGMA` is sqlite specific https://www.sqlite.org/pragma.html
714                Keyword::PRAGMA => self.parse_pragma(),
715                Keyword::UNLOAD => {
716                    self.prev_token();
717                    self.parse_unload()
718                }
719                Keyword::RENAME => self.parse_rename(),
720                // `INSTALL` is duckdb specific https://duckdb.org/docs/extensions/overview
721                Keyword::INSTALL if self.dialect.supports_install() => self.parse_install(),
722                Keyword::LOAD => self.parse_load(),
723                Keyword::LOCK => {
724                    self.prev_token();
725                    self.parse_lock_statement().map(Into::into)
726                }
727                Keyword::OPTIMIZE if self.dialect.supports_optimize_table() => {
728                    self.parse_optimize_table()
729                }
730                // `COMMENT` is snowflake specific https://docs.snowflake.com/en/sql-reference/sql/comment
731                Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
732                Keyword::PRINT => self.parse_print(),
733                // `WAITFOR` is MSSQL specific https://learn.microsoft.com/en-us/sql/t-sql/language-elements/waitfor-transact-sql
734                Keyword::WAITFOR => self.parse_waitfor(),
735                Keyword::RETURN => self.parse_return(),
736                Keyword::EXPORT => {
737                    self.prev_token();
738                    self.parse_export_data()
739                }
740                Keyword::VACUUM => {
741                    self.prev_token();
742                    self.parse_vacuum()
743                }
744                Keyword::RESET => self.parse_reset().map(Into::into),
745                _ => self.expected("an SQL statement", next_token),
746            },
747            Token::LParen => {
748                self.prev_token();
749                self.parse_query().map(Into::into)
750            }
751            _ => self.expected("an SQL statement", next_token),
752        }
753    }
754
755    /// Parse a `CASE` statement.
756    ///
757    /// See [Statement::Case]
758    pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
759        let case_token = self.expect_keyword(Keyword::CASE)?;
760
761        let match_expr = if self.peek_keyword(Keyword::WHEN) {
762            None
763        } else {
764            Some(self.parse_expr()?)
765        };
766
767        self.expect_keyword_is(Keyword::WHEN)?;
768        let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
769            parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
770        })?;
771
772        let else_block = if self.parse_keyword(Keyword::ELSE) {
773            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
774        } else {
775            None
776        };
777
778        let mut end_case_token = self.expect_keyword(Keyword::END)?;
779        if self.peek_keyword(Keyword::CASE) {
780            end_case_token = self.expect_keyword(Keyword::CASE)?;
781        }
782
783        Ok(CaseStatement {
784            case_token: AttachedToken(case_token),
785            match_expr,
786            when_blocks,
787            else_block,
788            end_case_token: AttachedToken(end_case_token),
789        })
790    }
791
792    /// Parse an `IF` statement.
793    ///
794    /// See [Statement::If]
795    pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
796        self.expect_keyword_is(Keyword::IF)?;
797        let if_block = self.parse_conditional_statement_block(&[
798            Keyword::ELSE,
799            Keyword::ELSEIF,
800            Keyword::END,
801        ])?;
802
803        let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
804            self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
805                parser.parse_conditional_statement_block(&[
806                    Keyword::ELSEIF,
807                    Keyword::ELSE,
808                    Keyword::END,
809                ])
810            })?
811        } else {
812            vec![]
813        };
814
815        let else_block = if self.parse_keyword(Keyword::ELSE) {
816            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
817        } else {
818            None
819        };
820
821        self.expect_keyword_is(Keyword::END)?;
822        let end_token = self.expect_keyword(Keyword::IF)?;
823
824        Ok(IfStatement {
825            if_block,
826            elseif_blocks,
827            else_block,
828            end_token: Some(AttachedToken(end_token)),
829        })
830    }
831
832    /// Parse a `WHILE` statement.
833    ///
834    /// See [Statement::While]
835    fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
836        self.expect_keyword_is(Keyword::WHILE)?;
837        let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
838
839        Ok(WhileStatement { while_block })
840    }
841
842    /// Parses an expression and associated list of statements
843    /// belonging to a conditional statement like `IF` or `WHEN` or `WHILE`.
844    ///
845    /// Example:
846    /// ```sql
847    /// IF condition THEN statement1; statement2;
848    /// ```
849    fn parse_conditional_statement_block(
850        &mut self,
851        terminal_keywords: &[Keyword],
852    ) -> Result<ConditionalStatementBlock, ParserError> {
853        let start_token = self.get_current_token().clone(); // self.expect_keyword(keyword)?;
854        let mut then_token = None;
855
856        let condition = match &start_token.token {
857            Token::Word(w) if w.keyword == Keyword::ELSE => None,
858            Token::Word(w) if w.keyword == Keyword::WHILE => {
859                let expr = self.parse_expr()?;
860                Some(expr)
861            }
862            _ => {
863                let expr = self.parse_expr()?;
864                then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
865                Some(expr)
866            }
867        };
868
869        let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
870
871        Ok(ConditionalStatementBlock {
872            start_token: AttachedToken(start_token),
873            condition,
874            then_token,
875            conditional_statements,
876        })
877    }
878
879    /// Parse a BEGIN/END block or a sequence of statements
880    /// This could be inside of a conditional (IF, CASE, WHILE etc.) or an object body defined optionally BEGIN/END and one or more statements.
881    pub(crate) fn parse_conditional_statements(
882        &mut self,
883        terminal_keywords: &[Keyword],
884    ) -> Result<ConditionalStatements, ParserError> {
885        let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
886            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
887            let statements = self.parse_statement_list(terminal_keywords)?;
888            let end_token = self.expect_keyword(Keyword::END)?;
889
890            ConditionalStatements::BeginEnd(BeginEndStatements {
891                begin_token: AttachedToken(begin_token),
892                statements,
893                end_token: AttachedToken(end_token),
894            })
895        } else {
896            ConditionalStatements::Sequence {
897                statements: self.parse_statement_list(terminal_keywords)?,
898            }
899        };
900        Ok(conditional_statements)
901    }
902
903    /// Parse a `RAISE` statement.
904    ///
905    /// See [Statement::Raise]
906    pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
907        self.expect_keyword_is(Keyword::RAISE)?;
908
909        let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
910            self.expect_token(&Token::Eq)?;
911            Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
912        } else {
913            self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
914        };
915
916        Ok(RaiseStatement { value })
917    }
918    /// Parse a COMMENT statement.
919    ///
920    /// See [Statement::Comment]
921    pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
922        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
923
924        self.expect_keyword_is(Keyword::ON)?;
925        let token = self.next_token();
926
927        let (object_type, object_name) = match token.token {
928            Token::Word(w) if w.keyword == Keyword::COLLATION => {
929                (CommentObject::Collation, self.parse_object_name(false)?)
930            }
931            Token::Word(w) if w.keyword == Keyword::COLUMN => {
932                (CommentObject::Column, self.parse_object_name(false)?)
933            }
934            Token::Word(w) if w.keyword == Keyword::DATABASE => {
935                (CommentObject::Database, self.parse_object_name(false)?)
936            }
937            Token::Word(w) if w.keyword == Keyword::DOMAIN => {
938                (CommentObject::Domain, self.parse_object_name(false)?)
939            }
940            Token::Word(w) if w.keyword == Keyword::EXTENSION => {
941                (CommentObject::Extension, self.parse_object_name(false)?)
942            }
943            Token::Word(w) if w.keyword == Keyword::FUNCTION => {
944                (CommentObject::Function, self.parse_object_name(false)?)
945            }
946            Token::Word(w) if w.keyword == Keyword::INDEX => {
947                (CommentObject::Index, self.parse_object_name(false)?)
948            }
949            Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
950                self.expect_keyword_is(Keyword::VIEW)?;
951                (
952                    CommentObject::MaterializedView,
953                    self.parse_object_name(false)?,
954                )
955            }
956            Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
957                (CommentObject::Procedure, self.parse_object_name(false)?)
958            }
959            Token::Word(w) if w.keyword == Keyword::ROLE => {
960                (CommentObject::Role, self.parse_object_name(false)?)
961            }
962            Token::Word(w) if w.keyword == Keyword::SCHEMA => {
963                (CommentObject::Schema, self.parse_object_name(false)?)
964            }
965            Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
966                (CommentObject::Sequence, self.parse_object_name(false)?)
967            }
968            Token::Word(w) if w.keyword == Keyword::TABLE => {
969                (CommentObject::Table, self.parse_object_name(false)?)
970            }
971            Token::Word(w) if w.keyword == Keyword::TYPE => {
972                (CommentObject::Type, self.parse_object_name(false)?)
973            }
974            Token::Word(w) if w.keyword == Keyword::USER => {
975                (CommentObject::User, self.parse_object_name(false)?)
976            }
977            Token::Word(w) if w.keyword == Keyword::VIEW => {
978                (CommentObject::View, self.parse_object_name(false)?)
979            }
980            _ => self.expected("comment object_type", token)?,
981        };
982
983        self.expect_keyword_is(Keyword::IS)?;
984        let comment = if self.parse_keyword(Keyword::NULL) {
985            None
986        } else {
987            Some(self.parse_literal_string()?)
988        };
989        Ok(Statement::Comment {
990            object_type,
991            object_name,
992            comment,
993            if_exists,
994        })
995    }
996
997    /// Parse `FLUSH` statement.
998    pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
999        let mut channel = None;
1000        let mut tables: Vec<ObjectName> = vec![];
1001        let mut read_lock = false;
1002        let mut export = false;
1003
1004        if !dialect_of!(self is MySqlDialect | GenericDialect) {
1005            return parser_err!(
1006                "Unsupported statement FLUSH",
1007                self.peek_token_ref().span.start
1008            );
1009        }
1010
1011        let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
1012            Some(FlushLocation::NoWriteToBinlog)
1013        } else if self.parse_keyword(Keyword::LOCAL) {
1014            Some(FlushLocation::Local)
1015        } else {
1016            None
1017        };
1018
1019        let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
1020            FlushType::BinaryLogs
1021        } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
1022            FlushType::EngineLogs
1023        } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1024            FlushType::ErrorLogs
1025        } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1026            FlushType::GeneralLogs
1027        } else if self.parse_keywords(&[Keyword::HOSTS]) {
1028            FlushType::Hosts
1029        } else if self.parse_keyword(Keyword::PRIVILEGES) {
1030            FlushType::Privileges
1031        } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1032            FlushType::OptimizerCosts
1033        } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1034            if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1035                channel = Some(self.parse_object_name(false)?.to_string());
1036            }
1037            FlushType::RelayLogs
1038        } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1039            FlushType::SlowLogs
1040        } else if self.parse_keyword(Keyword::STATUS) {
1041            FlushType::Status
1042        } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1043            FlushType::UserResources
1044        } else if self.parse_keywords(&[Keyword::LOGS]) {
1045            FlushType::Logs
1046        } else if self.parse_keywords(&[Keyword::TABLES]) {
1047            loop {
1048                let next_token = self.next_token();
1049                match &next_token.token {
1050                    Token::Word(w) => match w.keyword {
1051                        Keyword::WITH => {
1052                            read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1053                        }
1054                        Keyword::FOR => {
1055                            export = self.parse_keyword(Keyword::EXPORT);
1056                        }
1057                        Keyword::NoKeyword => {
1058                            self.prev_token();
1059                            tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1060                        }
1061                        _ => {}
1062                    },
1063                    _ => {
1064                        break;
1065                    }
1066                }
1067            }
1068
1069            FlushType::Tables
1070        } else {
1071            return self.expected_ref(
1072                "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1073                 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1074                self.peek_token_ref(),
1075            );
1076        };
1077
1078        Ok(Statement::Flush {
1079            object_type,
1080            location,
1081            channel,
1082            read_lock,
1083            export,
1084            tables,
1085        })
1086    }
1087
1088    /// Parse `MSCK` statement.
1089    pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1090        let repair = self.parse_keyword(Keyword::REPAIR);
1091        self.expect_keyword_is(Keyword::TABLE)?;
1092        let table_name = self.parse_object_name(false)?;
1093        let partition_action = self
1094            .maybe_parse(|parser| {
1095                let pa = match parser.parse_one_of_keywords(&[
1096                    Keyword::ADD,
1097                    Keyword::DROP,
1098                    Keyword::SYNC,
1099                ]) {
1100                    Some(Keyword::ADD) => Some(AddDropSync::ADD),
1101                    Some(Keyword::DROP) => Some(AddDropSync::DROP),
1102                    Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1103                    _ => None,
1104                };
1105                parser.expect_keyword_is(Keyword::PARTITIONS)?;
1106                Ok(pa)
1107            })?
1108            .unwrap_or_default();
1109        Ok(Msck {
1110            repair,
1111            table_name,
1112            partition_action,
1113        })
1114    }
1115
1116    /// Parse `TRUNCATE` statement.
1117    pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1118        let table = self.parse_keyword(Keyword::TABLE);
1119        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1120
1121        let table_names = self.parse_comma_separated(|p| {
1122            let only = p.parse_keyword(Keyword::ONLY);
1123            let name = p.parse_object_name(false)?;
1124            let has_asterisk = p.consume_token(&Token::Mul);
1125            Ok(TruncateTableTarget {
1126                name,
1127                only,
1128                has_asterisk,
1129            })
1130        })?;
1131
1132        let mut partitions = None;
1133        if self.parse_keyword(Keyword::PARTITION) {
1134            self.expect_token(&Token::LParen)?;
1135            partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1136            self.expect_token(&Token::RParen)?;
1137        }
1138
1139        let mut identity = None;
1140        let mut cascade = None;
1141
1142        if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1143            identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1144                Some(TruncateIdentityOption::Restart)
1145            } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1146                Some(TruncateIdentityOption::Continue)
1147            } else {
1148                None
1149            };
1150
1151            cascade = self.parse_cascade_option();
1152        };
1153
1154        let on_cluster = self.parse_optional_on_cluster()?;
1155
1156        Ok(Truncate {
1157            table_names,
1158            partitions,
1159            table,
1160            if_exists,
1161            identity,
1162            cascade,
1163            on_cluster,
1164        })
1165    }
1166
1167    fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1168        if self.parse_keyword(Keyword::CASCADE) {
1169            Some(CascadeOption::Cascade)
1170        } else if self.parse_keyword(Keyword::RESTRICT) {
1171            Some(CascadeOption::Restrict)
1172        } else {
1173            None
1174        }
1175    }
1176
1177    /// Parse options for `ATTACH DUCKDB DATABASE` statement.
1178    pub fn parse_attach_duckdb_database_options(
1179        &mut self,
1180    ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1181        if !self.consume_token(&Token::LParen) {
1182            return Ok(vec![]);
1183        }
1184
1185        let mut options = vec![];
1186        loop {
1187            if self.parse_keyword(Keyword::READ_ONLY) {
1188                let boolean = if self.parse_keyword(Keyword::TRUE) {
1189                    Some(true)
1190                } else if self.parse_keyword(Keyword::FALSE) {
1191                    Some(false)
1192                } else {
1193                    None
1194                };
1195                options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1196            } else if self.parse_keyword(Keyword::TYPE) {
1197                let ident = self.parse_identifier()?;
1198                options.push(AttachDuckDBDatabaseOption::Type(ident));
1199            } else {
1200                return self
1201                    .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1202            };
1203
1204            if self.consume_token(&Token::RParen) {
1205                return Ok(options);
1206            } else if self.consume_token(&Token::Comma) {
1207                continue;
1208            } else {
1209                return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1210            }
1211        }
1212    }
1213
1214    /// Parse `ATTACH DUCKDB DATABASE` statement.
1215    pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1216        let database = self.parse_keyword(Keyword::DATABASE);
1217        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1218        let database_path = self.parse_identifier()?;
1219        let database_alias = if self.parse_keyword(Keyword::AS) {
1220            Some(self.parse_identifier()?)
1221        } else {
1222            None
1223        };
1224
1225        let attach_options = self.parse_attach_duckdb_database_options()?;
1226        Ok(Statement::AttachDuckDBDatabase {
1227            if_not_exists,
1228            database,
1229            database_path,
1230            database_alias,
1231            attach_options,
1232        })
1233    }
1234
1235    /// Parse `DETACH DUCKDB DATABASE` statement.
1236    pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1237        let database = self.parse_keyword(Keyword::DATABASE);
1238        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1239        let database_alias = self.parse_identifier()?;
1240        Ok(Statement::DetachDuckDBDatabase {
1241            if_exists,
1242            database,
1243            database_alias,
1244        })
1245    }
1246
1247    /// Parse `ATTACH DATABASE` statement.
1248    pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1249        let database = self.parse_keyword(Keyword::DATABASE);
1250        let database_file_name = self.parse_expr()?;
1251        self.expect_keyword_is(Keyword::AS)?;
1252        let schema_name = self.parse_identifier()?;
1253        Ok(Statement::AttachDatabase {
1254            database,
1255            schema_name,
1256            database_file_name,
1257        })
1258    }
1259
1260    /// Parse `ANALYZE` statement.
1261    pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1262        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1263        let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1264        let mut for_columns = false;
1265        let mut cache_metadata = false;
1266        let mut noscan = false;
1267        let mut partitions = None;
1268        let mut compute_statistics = false;
1269        let mut columns = vec![];
1270
1271        // PostgreSQL syntax: ANALYZE t (col1, col2)
1272        if table_name.is_some() && self.consume_token(&Token::LParen) {
1273            columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1274            self.expect_token(&Token::RParen)?;
1275        }
1276
1277        loop {
1278            match self.parse_one_of_keywords(&[
1279                Keyword::PARTITION,
1280                Keyword::FOR,
1281                Keyword::CACHE,
1282                Keyword::NOSCAN,
1283                Keyword::COMPUTE,
1284            ]) {
1285                Some(Keyword::PARTITION) => {
1286                    self.expect_token(&Token::LParen)?;
1287                    partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1288                    self.expect_token(&Token::RParen)?;
1289                }
1290                Some(Keyword::NOSCAN) => noscan = true,
1291                Some(Keyword::FOR) => {
1292                    self.expect_keyword_is(Keyword::COLUMNS)?;
1293
1294                    columns = self
1295                        .maybe_parse(|parser| {
1296                            parser.parse_comma_separated(|p| p.parse_identifier())
1297                        })?
1298                        .unwrap_or_default();
1299                    for_columns = true
1300                }
1301                Some(Keyword::CACHE) => {
1302                    self.expect_keyword_is(Keyword::METADATA)?;
1303                    cache_metadata = true
1304                }
1305                Some(Keyword::COMPUTE) => {
1306                    self.expect_keyword_is(Keyword::STATISTICS)?;
1307                    compute_statistics = true
1308                }
1309                _ => break,
1310            }
1311        }
1312
1313        Ok(Analyze {
1314            has_table_keyword,
1315            table_name,
1316            for_columns,
1317            columns,
1318            partitions,
1319            cache_metadata,
1320            noscan,
1321            compute_statistics,
1322        })
1323    }
1324
1325    /// Parse a new expression including wildcard & qualified wildcard.
1326    pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1327        let index = self.index;
1328
1329        let next_token = self.next_token();
1330        match next_token.token {
1331            t @ (Token::Word(_) | Token::SingleQuotedString(_))
1332                if self.peek_token_ref().token == Token::Period =>
1333            {
1334                let mut id_parts: Vec<Ident> = vec![match t {
1335                    Token::Word(w) => w.into_ident(next_token.span),
1336                    Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1337                    _ => {
1338                        return Err(ParserError::ParserError(
1339                            "Internal parser error: unexpected token type".to_string(),
1340                        ))
1341                    }
1342                }];
1343
1344                while self.consume_token(&Token::Period) {
1345                    let next_token = self.next_token();
1346                    match next_token.token {
1347                        Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1348                        Token::SingleQuotedString(s) => {
1349                            // SQLite has single-quoted identifiers
1350                            id_parts.push(Ident::with_quote('\'', s))
1351                        }
1352                        Token::Placeholder(s) => {
1353                            // Snowflake uses $1, $2, etc. for positional column references
1354                            // in staged data queries like: SELECT t.$1 FROM @stage t
1355                            id_parts.push(Ident::new(s))
1356                        }
1357                        Token::Mul => {
1358                            return Ok(Expr::QualifiedWildcard(
1359                                ObjectName::from(id_parts),
1360                                AttachedToken(next_token),
1361                            ));
1362                        }
1363                        _ => {
1364                            return self.expected("an identifier or a '*' after '.'", next_token);
1365                        }
1366                    }
1367                }
1368            }
1369            Token::Mul => {
1370                return Ok(Expr::Wildcard(AttachedToken(next_token)));
1371            }
1372            // Handle parenthesized wildcard: (*)
1373            Token::LParen => {
1374                let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1375                if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1376                    let mul_token = self.next_token(); // consume Mul
1377                    self.next_token(); // consume RParen
1378                    return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1379                }
1380            }
1381            _ => (),
1382        };
1383
1384        self.index = index;
1385        self.parse_expr()
1386    }
1387
1388    /// Parse a new expression.
1389    pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1390        self.parse_subexpr(self.dialect.prec_unknown())
1391    }
1392
1393    /// Parse expression with optional alias and order by.
1394    pub fn parse_expr_with_alias_and_order_by(
1395        &mut self,
1396    ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1397        let expr = self.parse_expr()?;
1398
1399        fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1400            explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1401        }
1402        let alias = self.parse_optional_alias_inner(None, validator)?;
1403        let order_by = OrderByOptions {
1404            sort: self.parse_optional_order_by_sort(),
1405            nulls_first: None,
1406        };
1407        Ok(ExprWithAliasAndOrderBy {
1408            expr: ExprWithAlias { expr, alias },
1409            order_by,
1410        })
1411    }
1412
1413    /// Parse tokens until the precedence changes.
1414    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1415    pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1416        let _guard = self.recursion_counter.try_decrease()?;
1417        debug!("parsing expr");
1418        let mut expr = self.parse_prefix()?;
1419
1420        expr = self.parse_compound_expr(expr, vec![])?;
1421
1422        // Parse an optional collation cast operator following `expr`.
1423        //
1424        // For example (MSSQL): t1.a COLLATE Latin1_General_CI_AS
1425        if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1426            expr = Expr::Collate {
1427                expr: Box::new(expr),
1428                collation: self.parse_object_name(false)?,
1429            };
1430        }
1431
1432        debug!("prefix: {expr:?}");
1433        loop {
1434            let next_precedence = self.get_next_precedence()?;
1435            debug!("next precedence: {next_precedence:?}");
1436
1437            if precedence >= next_precedence {
1438                break;
1439            }
1440
1441            // The period operator is handled exclusively by the
1442            // compound field access parsing.
1443            if Token::Period == self.peek_token_ref().token {
1444                break;
1445            }
1446
1447            expr = self.parse_infix(expr, next_precedence)?;
1448        }
1449        Ok(expr)
1450    }
1451
1452    /// Parse `ASSERT` statement.
1453    pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1454        let condition = self.parse_expr()?;
1455        let message = if self.parse_keyword(Keyword::AS) {
1456            Some(self.parse_expr()?)
1457        } else {
1458            None
1459        };
1460
1461        Ok(Statement::Assert { condition, message })
1462    }
1463
1464    /// Parse `SAVEPOINT` statement.
1465    pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1466        let name = self.parse_identifier()?;
1467        Ok(Statement::Savepoint { name })
1468    }
1469
1470    /// Parse `RELEASE` statement.
1471    pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1472        let _ = self.parse_keyword(Keyword::SAVEPOINT);
1473        let name = self.parse_identifier()?;
1474
1475        Ok(Statement::ReleaseSavepoint { name })
1476    }
1477
1478    /// Parse `LISTEN` statement.
1479    pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1480        let channel = self.parse_identifier()?;
1481        Ok(Statement::LISTEN { channel })
1482    }
1483
1484    /// Parse `UNLISTEN` statement.
1485    pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1486        let channel = if self.consume_token(&Token::Mul) {
1487            Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1488        } else {
1489            match self.parse_identifier() {
1490                Ok(expr) => expr,
1491                _ => {
1492                    self.prev_token();
1493                    return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1494                }
1495            }
1496        };
1497        Ok(Statement::UNLISTEN { channel })
1498    }
1499
1500    /// Parse `NOTIFY` statement.
1501    pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1502        let channel = self.parse_identifier()?;
1503        let payload = if self.consume_token(&Token::Comma) {
1504            Some(self.parse_literal_string()?)
1505        } else {
1506            None
1507        };
1508        Ok(Statement::NOTIFY { channel, payload })
1509    }
1510
1511    /// Parses a `RENAME TABLE` statement. See [Statement::RenameTable]
1512    pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1513        if self.peek_keyword(Keyword::TABLE) {
1514            self.expect_keyword(Keyword::TABLE)?;
1515            let rename_tables = self.parse_comma_separated(|parser| {
1516                let old_name = parser.parse_object_name(false)?;
1517                parser.expect_keyword(Keyword::TO)?;
1518                let new_name = parser.parse_object_name(false)?;
1519
1520                Ok(RenameTable { old_name, new_name })
1521            })?;
1522            Ok(rename_tables.into())
1523        } else {
1524            self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1525        }
1526    }
1527
1528    /// Tries to parse an expression by matching the specified word to known keywords that have a special meaning in the dialect.
1529    /// Returns `None if no match is found.
1530    fn parse_expr_prefix_by_reserved_word(
1531        &mut self,
1532        w: &Word,
1533        w_span: Span,
1534    ) -> Result<Option<Expr>, ParserError> {
1535        match w.keyword {
1536            Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1537                self.prev_token();
1538                Ok(Some(Expr::Value(self.parse_value()?)))
1539            }
1540            Keyword::NULL => {
1541                self.prev_token();
1542                Ok(Some(Expr::Value(self.parse_value()?)))
1543            }
1544            Keyword::CURRENT_CATALOG
1545            | Keyword::CURRENT_USER
1546            | Keyword::SESSION_USER
1547            | Keyword::USER
1548            if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1549                {
1550                    Ok(Some(Expr::Function(Function {
1551                        name: ObjectName::from(vec![w.to_ident(w_span)]),
1552                        uses_odbc_syntax: false,
1553                        parameters: FunctionArguments::None,
1554                        args: FunctionArguments::None,
1555                        null_treatment: None,
1556                        filter: None,
1557                        over: None,
1558                        within_group: vec![],
1559                    })))
1560                }
1561            Keyword::CURRENT_TIMESTAMP
1562            | Keyword::CURRENT_TIME
1563            | Keyword::CURRENT_DATE
1564            | Keyword::LOCALTIME
1565            | Keyword::LOCALTIMESTAMP => {
1566                Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1567            }
1568            Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1569            Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1570            Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1571            Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1572            Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1573            Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1574            Keyword::EXISTS
1575            // Support parsing Databricks has a function named `exists`.
1576            if !dialect_of!(self is DatabricksDialect)
1577                || matches!(
1578                        self.peek_nth_token_ref(1).token,
1579                        Token::Word(Word {
1580                            keyword: Keyword::SELECT | Keyword::WITH,
1581                            ..
1582                        })
1583                    ) =>
1584                {
1585                    Ok(Some(self.parse_exists_expr(false)?))
1586                }
1587            Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1588            Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1589            Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1590            Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1591                Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1592            }
1593            Keyword::SUBSTR | Keyword::SUBSTRING => {
1594                self.prev_token();
1595                Ok(Some(self.parse_substring()?))
1596            }
1597            Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1598            Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1599            Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1600            // Treat ARRAY[1,2,3] as an array [1,2,3], otherwise try as subquery or a function call
1601            Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1602                self.expect_token(&Token::LBracket)?;
1603                Ok(Some(self.parse_array_expr(true)?))
1604            }
1605            Keyword::ARRAY
1606            if self.peek_token_ref().token == Token::LParen
1607                && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1608                {
1609                    self.expect_token(&Token::LParen)?;
1610                    let query = self.parse_query()?;
1611                    self.expect_token(&Token::RParen)?;
1612                    Ok(Some(Expr::Function(Function {
1613                        name: ObjectName::from(vec![w.to_ident(w_span)]),
1614                        uses_odbc_syntax: false,
1615                        parameters: FunctionArguments::None,
1616                        args: FunctionArguments::Subquery(query),
1617                        filter: None,
1618                        null_treatment: None,
1619                        over: None,
1620                        within_group: vec![],
1621                    })))
1622                }
1623            Keyword::NOT => Ok(Some(self.parse_not()?)),
1624            Keyword::MATCH if self.dialect.supports_match_against() => {
1625                Ok(Some(self.parse_match_against()?))
1626            }
1627            Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1628                let struct_expr = self.parse_struct_literal()?;
1629                Ok(Some(struct_expr))
1630            }
1631            Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1632                let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1633                Ok(Some(Expr::Prior(Box::new(expr))))
1634            }
1635            Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1636                Ok(Some(self.parse_duckdb_map_literal()?))
1637            }
1638            Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1639                Ok(Some(self.parse_lambda_expr()?))
1640            }
1641            _ if self.dialect.supports_geometric_types() => match w.keyword {
1642                Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1643                Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1644                Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1645                Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1646                Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1647                Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1648                Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1649                _ => Ok(None),
1650            },
1651            _ => Ok(None),
1652        }
1653    }
1654
1655    /// Tries to parse an expression by a word that is not known to have a special meaning in the dialect.
1656    fn parse_expr_prefix_by_unreserved_word(
1657        &mut self,
1658        w: &Word,
1659        w_span: Span,
1660    ) -> Result<Expr, ParserError> {
1661        let is_outer_join = self.peek_outer_join_operator();
1662        match &self.peek_token_ref().token {
1663            Token::LParen if !is_outer_join => {
1664                let id_parts = vec![w.to_ident(w_span)];
1665                self.parse_function(ObjectName::from(id_parts))
1666            }
1667            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
1668            Token::SingleQuotedString(_)
1669            | Token::DoubleQuotedString(_)
1670            | Token::HexStringLiteral(_)
1671                if w.value.starts_with('_') =>
1672            {
1673                Ok(Expr::Prefixed {
1674                    prefix: w.to_ident(w_span),
1675                    value: self.parse_introduced_string_expr()?.into(),
1676                })
1677            }
1678            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
1679            Token::SingleQuotedString(_)
1680            | Token::DoubleQuotedString(_)
1681            | Token::HexStringLiteral(_)
1682                if w.value.starts_with('_') =>
1683            {
1684                Ok(Expr::Prefixed {
1685                    prefix: w.to_ident(w_span),
1686                    value: self.parse_introduced_string_expr()?.into(),
1687                })
1688            }
1689            // An unreserved word (likely an identifier) is followed by an arrow,
1690            // which indicates a lambda function with a single, untyped parameter.
1691            // For example: `a -> a * 2`.
1692            Token::Arrow if self.dialect.supports_lambda_functions() => {
1693                self.expect_token(&Token::Arrow)?;
1694                Ok(Expr::Lambda(LambdaFunction {
1695                    params: OneOrManyWithParens::One(LambdaFunctionParameter {
1696                        name: w.to_ident(w_span),
1697                        data_type: None,
1698                    }),
1699                    body: Box::new(self.parse_expr()?),
1700                    syntax: LambdaSyntax::Arrow,
1701                }))
1702            }
1703            // An unreserved word (likely an identifier) that is followed by another word (likley a data type)
1704            // which is then followed by an arrow, which indicates a lambda function with a single, typed parameter.
1705            // For example: `a INT -> a * 2`.
1706            Token::Word(_)
1707                if self.dialect.supports_lambda_functions()
1708                    && self.peek_nth_token_ref(1).token == Token::Arrow =>
1709            {
1710                let data_type = self.parse_data_type()?;
1711                self.expect_token(&Token::Arrow)?;
1712                Ok(Expr::Lambda(LambdaFunction {
1713                    params: OneOrManyWithParens::One(LambdaFunctionParameter {
1714                        name: w.to_ident(w_span),
1715                        data_type: Some(data_type),
1716                    }),
1717                    body: Box::new(self.parse_expr()?),
1718                    syntax: LambdaSyntax::Arrow,
1719                }))
1720            }
1721            _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1722        }
1723    }
1724
1725    /// Returns true if the given [ObjectName] is a single unquoted
1726    /// identifier matching `expected` (case-insensitive).
1727    fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1728        if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1729            ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1730        } else {
1731            false
1732        }
1733    }
1734
1735    /// Parse an expression prefix.
1736    pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1737        // allow the dialect to override prefix parsing
1738        if let Some(prefix) = self.dialect.parse_prefix(self) {
1739            return prefix;
1740        }
1741
1742        // Memoize parse_prefix failures to break 2^N speculation when both
1743        // prefix arms fail at every level (e.g. `IF(current_time(...x`).
1744        // The per-arm cache in `parse_prefix_inner` complements this for
1745        // chains where the reserved arm fails but the unreserved fallback
1746        // succeeds (e.g. `case-case-...c`).
1747        let start_index = self.index;
1748        if let Some(&cached) = self.failed_prefix_positions.get(&start_index) {
1749            return self.cached_prefix_error(cached, self.peek_token_ref());
1750        }
1751        let result = self.parse_prefix_inner();
1752        if let Err(ref e) = result {
1753            self.failed_prefix_positions.insert(start_index, e.into());
1754        }
1755        result
1756    }
1757
1758    /// Rebuild the error for a cached prefix failure at the `found` token.
1759    fn cached_prefix_error<T>(
1760        &self,
1761        cached: ExprPrefixError,
1762        found: &TokenWithSpan,
1763    ) -> Result<T, ParserError> {
1764        match cached {
1765            ExprPrefixError::RecursionLimitExceeded => Err(ParserError::RecursionLimitExceeded),
1766            ExprPrefixError::Err => self.expected_ref("an expression", found),
1767        }
1768    }
1769
1770    fn parse_prefix_inner(&mut self) -> Result<Expr, ParserError> {
1771        // PostgreSQL allows any string literal to be preceded by a type name, indicating that the
1772        // string literal represents a literal of that type. Some examples:
1773        //
1774        //      DATE '2020-05-20'
1775        //      TIMESTAMP WITH TIME ZONE '2020-05-20 7:43:54'
1776        //      BOOL 'true'
1777        //
1778        // The first two are standard SQL, while the latter is a PostgreSQL extension. Complicating
1779        // matters is the fact that INTERVAL string literals may optionally be followed by special
1780        // keywords, e.g.:
1781        //
1782        //      INTERVAL '7' DAY
1783        //
1784        // Note also that naively `SELECT date` looks like a syntax error because the `date` type
1785        // name is not followed by a string literal, but in fact in PostgreSQL it is a valid
1786        // expression that should parse as the column name "date".
1787        let loc = self.peek_token_ref().span.start;
1788        let opt_expr = self.maybe_parse(|parser| {
1789            match parser.parse_data_type()? {
1790                DataType::Interval { .. } => parser.parse_interval(),
1791                // PostgreSQL allows almost any identifier to be used as custom data type name,
1792                // and we support that in `parse_data_type()`. But unlike Postgres we don't
1793                // have a list of globally reserved keywords (since they vary across dialects),
1794                // so given `NOT 'a' LIKE 'b'`, we'd accept `NOT` as a possible custom data type
1795                // name, resulting in `NOT 'a'` being recognized as a `TypedString` instead of
1796                // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we don't accept the
1797                // `type 'string'` syntax for the custom data types at all ...
1798                //
1799                // ... with the exception of `xml '...'` on dialects that support XML
1800                // expressions, which is a valid PostgreSQL typed string literal.
1801                DataType::Custom(ref name, ref modifiers)
1802                    if modifiers.is_empty()
1803                        && Self::is_simple_unquoted_object_name(name, "xml")
1804                        && parser.dialect.supports_xml_expressions() =>
1805                {
1806                    Ok(Expr::TypedString(TypedString {
1807                        data_type: DataType::Custom(name.clone(), modifiers.clone()),
1808                        value: parser.parse_value()?,
1809                        uses_odbc_syntax: false,
1810                    }))
1811                }
1812                DataType::Custom(..) => parser_err!("dummy", loc),
1813                // MySQL supports using the `BINARY` keyword as a cast to binary type.
1814                DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1815                    Ok(Expr::Cast {
1816                        kind: CastKind::Cast,
1817                        expr: Box::new(parser.parse_expr()?),
1818                        data_type: DataType::Binary(None),
1819                        format: None,
1820                    })
1821                }
1822                data_type => Ok(Expr::TypedString(TypedString {
1823                    data_type,
1824                    value: parser.parse_value()?,
1825                    uses_odbc_syntax: false,
1826                })),
1827            }
1828        })?;
1829
1830        if let Some(expr) = opt_expr {
1831            return Ok(expr);
1832        }
1833
1834        // Cache some dialect properties to avoid lifetime issues with the
1835        // next_token reference.
1836
1837        let dialect = self.dialect;
1838
1839        self.advance_token();
1840        let next_token_index = self.get_current_index();
1841        let next_token = self.get_current_token();
1842        let span = next_token.span;
1843        let expr = match &next_token.token {
1844            Token::Word(w) => {
1845                // The word we consumed may fall into one of two cases: it has a special meaning, or not.
1846                // For example, in Snowflake, the word `interval` may have two meanings depending on the context:
1847                // `SELECT CURRENT_DATE() + INTERVAL '1 DAY', MAX(interval) FROM tbl;`
1848                //                          ^^^^^^^^^^^^^^^^      ^^^^^^^^
1849                //                         interval expression   identifier
1850                //
1851                // We first try to parse the word and following tokens as a special expression, and if that fails,
1852                // we rollback and try to parse it as an identifier.
1853                let w = w.clone();
1854                // Memoize failed speculative reserved-word parses. When
1855                // the reserved arm (CASE, CURRENT_TIME, etc.) does
1856                // exponential work but the unreserved fallback ultimately
1857                // succeeds, the overall `parse_prefix` returns `Ok` and the
1858                // outer cache never fires. Chains like `case-case-...c`
1859                // need this per-arm cache to break the doubling.
1860                let try_parse_result = if let Some(&cached) = self
1861                    .failed_reserved_word_prefix_positions
1862                    .get(&next_token_index)
1863                {
1864                    self.cached_prefix_error(cached, self.get_current_token())
1865                } else {
1866                    self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span))
1867                };
1868                match try_parse_result {
1869                    // This word indicated an expression prefix and parsing was successful
1870                    Ok(Some(expr)) => Ok(expr),
1871
1872                    // No expression prefix associated with this word
1873                    Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1874
1875                    // If parsing of the word as a special expression failed, we are facing two options:
1876                    // 1. The statement is malformed, e.g. `SELECT INTERVAL '1 DAI` (`DAI` instead of `DAY`)
1877                    // 2. The word is used as an identifier, e.g. `SELECT MAX(interval) FROM tbl`
1878                    // We first try to parse the word as an identifier and if that fails
1879                    // we rollback and return the parsing error we got from trying to parse a
1880                    // special expression (to maintain backwards compatibility of parsing errors).
1881                    Err(e) => {
1882                        self.failed_reserved_word_prefix_positions
1883                            .insert(next_token_index, (&e).into());
1884                        if !self.dialect.is_reserved_for_identifier(w.keyword) {
1885                            if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1886                                parser.parse_expr_prefix_by_unreserved_word(&w, span)
1887                            }) {
1888                                return Ok(expr);
1889                            }
1890                        }
1891                        return Err(e);
1892                    }
1893                }
1894            } // End of Token::Word
1895            // array `[1, 2, 3]`
1896            Token::LBracket => self.parse_array_expr(false),
1897            tok @ Token::Minus | tok @ Token::Plus => {
1898                let op = if *tok == Token::Plus {
1899                    UnaryOperator::Plus
1900                } else {
1901                    UnaryOperator::Minus
1902                };
1903                Ok(Expr::UnaryOp {
1904                    op,
1905                    expr: Box::new(
1906                        self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1907                    ),
1908                })
1909            }
1910            Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1911                op: UnaryOperator::BangNot,
1912                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1913            }),
1914            tok @ Token::DoubleExclamationMark
1915            | tok @ Token::PGSquareRoot
1916            | tok @ Token::PGCubeRoot
1917            | tok @ Token::AtSign
1918                if dialect_is!(dialect is PostgreSqlDialect) =>
1919            {
1920                let op = match tok {
1921                    Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1922                    Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1923                    Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1924                    Token::AtSign => UnaryOperator::PGAbs,
1925                    _ => {
1926                        return Err(ParserError::ParserError(
1927                            "Internal parser error: unexpected unary operator token".to_string(),
1928                        ))
1929                    }
1930                };
1931                Ok(Expr::UnaryOp {
1932                    op,
1933                    expr: Box::new(
1934                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1935                    ),
1936                })
1937            }
1938            Token::Tilde => Ok(Expr::UnaryOp {
1939                op: UnaryOperator::BitwiseNot,
1940                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1941            }),
1942            tok @ Token::Sharp
1943            | tok @ Token::AtDashAt
1944            | tok @ Token::AtAt
1945            | tok @ Token::QuestionMarkDash
1946            | tok @ Token::QuestionPipe
1947                if self.dialect.supports_geometric_types() =>
1948            {
1949                let op = match tok {
1950                    Token::Sharp => UnaryOperator::Hash,
1951                    Token::AtDashAt => UnaryOperator::AtDashAt,
1952                    Token::AtAt => UnaryOperator::DoubleAt,
1953                    Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1954                    Token::QuestionPipe => UnaryOperator::QuestionPipe,
1955                    _ => {
1956                        return Err(ParserError::ParserError(format!(
1957                            "Unexpected token in unary operator parsing: {tok:?}"
1958                        )))
1959                    }
1960                };
1961                Ok(Expr::UnaryOp {
1962                    op,
1963                    expr: Box::new(
1964                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1965                    ),
1966                })
1967            }
1968            Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1969            {
1970                self.prev_token();
1971                Ok(Expr::Value(self.parse_value()?))
1972            }
1973            Token::UnicodeStringLiteral(_) => {
1974                self.prev_token();
1975                Ok(Expr::Value(self.parse_value()?))
1976            }
1977            Token::Number(_, _)
1978            | Token::SingleQuotedString(_)
1979            | Token::DoubleQuotedString(_)
1980            | Token::TripleSingleQuotedString(_)
1981            | Token::TripleDoubleQuotedString(_)
1982            | Token::DollarQuotedString(_)
1983            | Token::SingleQuotedByteStringLiteral(_)
1984            | Token::DoubleQuotedByteStringLiteral(_)
1985            | Token::TripleSingleQuotedByteStringLiteral(_)
1986            | Token::TripleDoubleQuotedByteStringLiteral(_)
1987            | Token::SingleQuotedRawStringLiteral(_)
1988            | Token::DoubleQuotedRawStringLiteral(_)
1989            | Token::TripleSingleQuotedRawStringLiteral(_)
1990            | Token::TripleDoubleQuotedRawStringLiteral(_)
1991            | Token::NationalStringLiteral(_)
1992            | Token::QuoteDelimitedStringLiteral(_)
1993            | Token::NationalQuoteDelimitedStringLiteral(_)
1994            | Token::HexStringLiteral(_) => {
1995                self.prev_token();
1996                Ok(Expr::Value(self.parse_value()?))
1997            }
1998            Token::LParen => {
1999                let expr =
2000                    if let Some(expr) = self.try_parse_expr_sub_query()? {
2001                        expr
2002                    } else if let Some(lambda) = self.try_parse_lambda()? {
2003                        return Ok(lambda);
2004                    } else {
2005                        // Parentheses in expressions switch to "normal" parsing state.
2006                        // This matters for dialects (SQLite, DuckDB) where `NOT NULL` can
2007                        // be an alias for `IS NOT NULL`. In column definitions like:
2008                        //
2009                        //   CREATE TABLE t (c INT DEFAULT (42 NOT NULL) NOT NULL)
2010                        //
2011                        // The `(42 NOT NULL)` is an expression with parens, so it parses
2012                        // as `IsNotNull(42)`. The trailing `NOT NULL` is outside those
2013                        // expression parens (the outer parens are CREATE TABLE syntax),
2014                        // so it remains a column constraint.
2015                        let exprs = self.with_state(ParserState::Normal, |p| {
2016                            p.parse_comma_separated(Parser::parse_expr)
2017                        })?;
2018                        match exprs.len() {
2019                            0 => return Err(ParserError::ParserError(
2020                                "Internal parser error: parse_comma_separated returned empty list"
2021                                    .to_string(),
2022                            )),
2023                            1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
2024                            _ => Expr::Tuple(exprs),
2025                        }
2026                    };
2027                self.expect_token(&Token::RParen)?;
2028                Ok(expr)
2029            }
2030            Token::Placeholder(_) | Token::Colon | Token::AtSign => {
2031                self.prev_token();
2032                Ok(Expr::Value(self.parse_value()?))
2033            }
2034            Token::LBrace => {
2035                self.prev_token();
2036                self.parse_lbrace_expr()
2037            }
2038            _ => self.expected_at("an expression", next_token_index),
2039        }?;
2040
2041        Ok(expr)
2042    }
2043
2044    fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
2045        Ok(Expr::TypedString(TypedString {
2046            data_type: DataType::GeometricType(kind),
2047            value: self.parse_value()?,
2048            uses_odbc_syntax: false,
2049        }))
2050    }
2051
2052    /// Try to parse an [Expr::CompoundFieldAccess] like `a.b.c` or `a.b[1].c`.
2053    /// If all the fields are `Expr::Identifier`s, return an [Expr::CompoundIdentifier] instead.
2054    /// If only the root exists, return the root.
2055    /// Parses compound expressions which may be delimited by period
2056    /// or bracket notation.
2057    /// For example: `a.b.c`, `a.b[1]`.
2058    pub fn parse_compound_expr(
2059        &mut self,
2060        root: Expr,
2061        mut chain: Vec<AccessExpr>,
2062    ) -> Result<Expr, ParserError> {
2063        let mut ending_wildcard: Option<TokenWithSpan> = None;
2064        loop {
2065            if self.consume_token(&Token::Period) {
2066                let next_token = self.peek_token_ref();
2067                match &next_token.token {
2068                    Token::Mul => {
2069                        // Postgres explicitly allows funcnm(tablenm.*) and the
2070                        // function array_agg traverses this control flow
2071                        if dialect_of!(self is PostgreSqlDialect) {
2072                            ending_wildcard = Some(self.next_token());
2073                        } else {
2074                            // Put back the consumed `.` tokens before exiting.
2075                            // If this expression is being parsed in the
2076                            // context of a projection, then the `.*` could imply
2077                            // a wildcard expansion. For example:
2078                            // `SELECT STRUCT('foo').* FROM T`
2079                            self.prev_token(); // .
2080                        }
2081
2082                        break;
2083                    }
2084                    Token::SingleQuotedString(s) => {
2085                        let expr =
2086                            Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2087                        chain.push(AccessExpr::Dot(expr));
2088                        self.advance_token(); // The consumed string
2089                    }
2090                    Token::Placeholder(s) => {
2091                        // Snowflake uses $1, $2, etc. for positional column references
2092                        // in staged data queries like: SELECT t.$1 FROM @stage t
2093                        let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2094                        chain.push(AccessExpr::Dot(expr));
2095                        self.advance_token(); // The consumed placeholder
2096                    }
2097                    // Parse a single field component, restricted to expression types valid
2098                    // after `.` (so e.g. `T.interval` is a compound identifier, not an
2099                    // interval expression). Using `parse_prefix` here rather than
2100                    // `parse_subexpr` avoids 2^N work on inputs like `IF a.b.c...x.#`:
2101                    // the outer loop already consumes successive `.field` segments, so a
2102                    // recursive `parse_subexpr` would re-walk the rest of the chain at
2103                    // every dot.
2104                    _ => {
2105                        // For a plain `Word` field (not followed by `(`), skip the
2106                        // speculative `parse_prefix`. The only result the validator
2107                        // below would accept is `Identifier`, which `parse_identifier`
2108                        // in the None branch produces directly. This avoids 2^N work
2109                        // on chains like `.not-b.not-b...` where `parse_prefix` would
2110                        // descend into `parse_not` and re-walk the remaining chain at
2111                        // every segment.
2112                        let word_field_no_lparen =
2113                            matches!(self.peek_token_ref().token, Token::Word(_))
2114                                && self.peek_nth_token_ref(1).token != Token::LParen;
2115
2116                        let expr = if word_field_no_lparen {
2117                            None
2118                        } else {
2119                            self.maybe_parse(|parser| {
2120                                let expr = parser.parse_prefix()?;
2121                                match &expr {
2122                                    Expr::CompoundFieldAccess { .. }
2123                                    | Expr::CompoundIdentifier(_)
2124                                    | Expr::Identifier(_)
2125                                    | Expr::Value(_)
2126                                    | Expr::Function(_) => Ok(expr),
2127                                    _ => parser.expected_ref(
2128                                        "an identifier or value",
2129                                        parser.peek_token_ref(),
2130                                    ),
2131                                }
2132                            })?
2133                        };
2134
2135                        match expr {
2136                            // If we get back a compound field access or identifier,
2137                            // we flatten the nested expression.
2138                            // For example if the current root is `foo`
2139                            // and we get back a compound identifier expression `bar.baz`
2140                            // The full expression should be `foo.bar.baz` (i.e.
2141                            // a root with an access chain with 2 entries) and not
2142                            // `foo.(bar.baz)` (i.e. a root with an access chain with
2143                            // 1 entry`).
2144                            Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2145                                chain.push(AccessExpr::Dot(*root));
2146                                chain.extend(access_chain);
2147                            }
2148                            Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2149                                parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2150                            ),
2151                            Some(expr) => {
2152                                chain.push(AccessExpr::Dot(expr));
2153                            }
2154                            // If the expression is not a valid suffix, fall back to
2155                            // parsing as an identifier. This handles cases like `T.interval`
2156                            // where `interval` is a keyword but should be treated as an identifier.
2157                            None => {
2158                                chain.push(AccessExpr::Dot(Expr::Identifier(
2159                                    self.parse_identifier()?,
2160                                )));
2161                            }
2162                        }
2163                    }
2164                }
2165            } else if !self.dialect.supports_partiql()
2166                && self.peek_token_ref().token == Token::LBracket
2167            {
2168                self.parse_multi_dim_subscript(&mut chain)?;
2169            } else {
2170                break;
2171            }
2172        }
2173
2174        let tok_index = self.get_current_index();
2175        if let Some(wildcard_token) = ending_wildcard {
2176            if !Self::is_all_ident(&root, &chain) {
2177                return self
2178                    .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2179            };
2180            Ok(Expr::QualifiedWildcard(
2181                ObjectName::from(Self::exprs_to_idents(root, chain)?),
2182                AttachedToken(wildcard_token),
2183            ))
2184        } else if self.maybe_parse_outer_join_operator() {
2185            if !Self::is_all_ident(&root, &chain) {
2186                return self.expected_at("column identifier before (+)", tok_index);
2187            };
2188            let expr = if chain.is_empty() {
2189                root
2190            } else {
2191                Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2192            };
2193            Ok(Expr::OuterJoin(expr.into()))
2194        } else {
2195            Self::build_compound_expr(root, chain)
2196        }
2197    }
2198
2199    /// Combines a root expression and access chain to form
2200    /// a compound expression. Which may be a [Expr::CompoundFieldAccess]
2201    /// or other special cased expressions like [Expr::CompoundIdentifier],
2202    /// [Expr::OuterJoin].
2203    fn build_compound_expr(
2204        root: Expr,
2205        mut access_chain: Vec<AccessExpr>,
2206    ) -> Result<Expr, ParserError> {
2207        if access_chain.is_empty() {
2208            return Ok(root);
2209        }
2210
2211        if Self::is_all_ident(&root, &access_chain) {
2212            return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2213                root,
2214                access_chain,
2215            )?));
2216        }
2217
2218        // Flatten qualified function calls.
2219        // For example, the expression `a.b.c.foo(1,2,3)` should
2220        // represent a function called `a.b.c.foo`, rather than
2221        // a composite expression.
2222        if matches!(root, Expr::Identifier(_))
2223            && matches!(
2224                access_chain.last(),
2225                Some(AccessExpr::Dot(Expr::Function(_)))
2226            )
2227            && access_chain
2228                .iter()
2229                .rev()
2230                .skip(1) // All except the Function
2231                .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2232        {
2233            let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2234                return parser_err!("expected function expression", root.span().start);
2235            };
2236
2237            let compound_func_name = [root]
2238                .into_iter()
2239                .chain(access_chain.into_iter().flat_map(|access| match access {
2240                    AccessExpr::Dot(expr) => Some(expr),
2241                    _ => None,
2242                }))
2243                .flat_map(|expr| match expr {
2244                    Expr::Identifier(ident) => Some(ident),
2245                    _ => None,
2246                })
2247                .map(ObjectNamePart::Identifier)
2248                .chain(func.name.0)
2249                .collect::<Vec<_>>();
2250            func.name = ObjectName(compound_func_name);
2251
2252            return Ok(Expr::Function(func));
2253        }
2254
2255        // Flatten qualified outer join expressions.
2256        // For example, the expression `T.foo(+)` should
2257        // represent an outer join on the column name `T.foo`
2258        // rather than a composite expression.
2259        if access_chain.len() == 1
2260            && matches!(
2261                access_chain.last(),
2262                Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2263            )
2264        {
2265            let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2266                return parser_err!("expected (+) expression", root.span().start);
2267            };
2268
2269            if !Self::is_all_ident(&root, &[]) {
2270                return parser_err!("column identifier before (+)", root.span().start);
2271            };
2272
2273            let token_start = root.span().start;
2274            let mut idents = Self::exprs_to_idents(root, vec![])?;
2275            match *inner_expr {
2276                Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2277                Expr::Identifier(suffix) => idents.push(suffix),
2278                _ => {
2279                    return parser_err!("column identifier before (+)", token_start);
2280                }
2281            }
2282
2283            return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2284        }
2285
2286        Ok(Expr::CompoundFieldAccess {
2287            root: Box::new(root),
2288            access_chain,
2289        })
2290    }
2291
2292    fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2293        match k {
2294            Keyword::LOCAL => Some(ContextModifier::Local),
2295            Keyword::GLOBAL => Some(ContextModifier::Global),
2296            Keyword::SESSION => Some(ContextModifier::Session),
2297            _ => None,
2298        }
2299    }
2300
2301    /// Check if the root is an identifier and all fields are identifiers.
2302    fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2303        if !matches!(root, Expr::Identifier(_)) {
2304            return false;
2305        }
2306        fields
2307            .iter()
2308            .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2309    }
2310
2311    /// Convert a root and a list of fields to a list of identifiers.
2312    fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2313        let mut idents = vec![];
2314        if let Expr::Identifier(root) = root {
2315            idents.push(root);
2316            for x in fields {
2317                if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2318                    idents.push(ident);
2319                } else {
2320                    return parser_err!(
2321                        format!("Expected identifier, found: {}", x),
2322                        x.span().start
2323                    );
2324                }
2325            }
2326            Ok(idents)
2327        } else {
2328            parser_err!(
2329                format!("Expected identifier, found: {}", root),
2330                root.span().start
2331            )
2332        }
2333    }
2334
2335    /// Returns true if the next tokens indicate the outer join operator `(+)`.
2336    fn peek_outer_join_operator(&mut self) -> bool {
2337        if !self.dialect.supports_outer_join_operator() {
2338            return false;
2339        }
2340
2341        let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2342        Token::LParen == maybe_lparen.token
2343            && Token::Plus == maybe_plus.token
2344            && Token::RParen == maybe_rparen.token
2345    }
2346
2347    /// If the next tokens indicates the outer join operator `(+)`, consume
2348    /// the tokens and return true.
2349    fn maybe_parse_outer_join_operator(&mut self) -> bool {
2350        self.dialect.supports_outer_join_operator()
2351            && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2352    }
2353
2354    /// Parse utility options in the form of `(option1, option2 arg2, option3 arg3, ...)`
2355    pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2356        self.expect_token(&Token::LParen)?;
2357        let options = self.parse_comma_separated(Self::parse_utility_option)?;
2358        self.expect_token(&Token::RParen)?;
2359
2360        Ok(options)
2361    }
2362
2363    fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2364        let name = self.parse_identifier()?;
2365
2366        let next_token = self.peek_token_ref();
2367        if next_token == &Token::Comma || next_token == &Token::RParen {
2368            return Ok(UtilityOption { name, arg: None });
2369        }
2370        let arg = self.parse_expr()?;
2371
2372        Ok(UtilityOption {
2373            name,
2374            arg: Some(arg),
2375        })
2376    }
2377
2378    fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2379        if !self.peek_sub_query() {
2380            return Ok(None);
2381        }
2382
2383        Ok(Some(Expr::Subquery(self.parse_query()?)))
2384    }
2385
2386    fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2387        if !self.dialect.supports_lambda_functions() {
2388            return Ok(None);
2389        }
2390        self.maybe_parse(|p| {
2391            let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2392            p.expect_token(&Token::RParen)?;
2393            p.expect_token(&Token::Arrow)?;
2394            let expr = p.parse_expr()?;
2395            Ok(Expr::Lambda(LambdaFunction {
2396                params: OneOrManyWithParens::Many(params),
2397                body: Box::new(expr),
2398                syntax: LambdaSyntax::Arrow,
2399            }))
2400        })
2401    }
2402
2403    /// Parses a lambda expression following the `LAMBDA` keyword syntax.
2404    ///
2405    /// Syntax: `LAMBDA <params> : <expr>`
2406    ///
2407    /// Examples:
2408    /// - `LAMBDA x : x + 1`
2409    /// - `LAMBDA x, i : x > i`
2410    ///
2411    /// See <https://duckdb.org/docs/stable/sql/functions/lambda>
2412    fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2413        // Parse the parameters: either a single identifier or comma-separated identifiers
2414        let params = self.parse_lambda_function_parameters()?;
2415        // Expect the colon separator
2416        self.expect_token(&Token::Colon)?;
2417        // Parse the body expression
2418        let body = self.parse_expr()?;
2419        Ok(Expr::Lambda(LambdaFunction {
2420            params,
2421            body: Box::new(body),
2422            syntax: LambdaSyntax::LambdaKeyword,
2423        }))
2424    }
2425
2426    /// Parses the parameters of a lambda function with optional typing.
2427    fn parse_lambda_function_parameters(
2428        &mut self,
2429    ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2430        // Parse the parameters: either a single identifier or comma-separated identifiers
2431        let params = if self.consume_token(&Token::LParen) {
2432            // Parenthesized parameters: (x, y)
2433            let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2434            self.expect_token(&Token::RParen)?;
2435            OneOrManyWithParens::Many(params)
2436        } else {
2437            // Unparenthesized parameters: x or x, y
2438            let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2439            if params.len() == 1 {
2440                OneOrManyWithParens::One(params.into_iter().next().unwrap())
2441            } else {
2442                OneOrManyWithParens::Many(params)
2443            }
2444        };
2445        Ok(params)
2446    }
2447
2448    /// Parses a single parameter of a lambda function, with optional typing.
2449    fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2450        let name = self.parse_identifier()?;
2451        let data_type = match &self.peek_token_ref().token {
2452            Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2453            _ => None,
2454        };
2455        Ok(LambdaFunctionParameter { name, data_type })
2456    }
2457
2458    /// Tries to parse the body of an [ODBC escaping sequence]
2459    /// i.e. without the enclosing braces
2460    /// Currently implemented:
2461    /// Scalar Function Calls
2462    /// Date, Time, and Timestamp Literals
2463    /// See <https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/escape-sequences-in-odbc?view=sql-server-2017>
2464    fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2465        // Attempt 1: Try to parse it as a function.
2466        if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2467            return Ok(Some(expr));
2468        }
2469        // Attempt 2: Try to parse it as a Date, Time or Timestamp Literal
2470        self.maybe_parse_odbc_body_datetime()
2471    }
2472
2473    /// Tries to parse the body of an [ODBC Date, Time, and Timestamp Literals] call.
2474    ///
2475    /// ```sql
2476    /// {d '2025-07-17'}
2477    /// {t '14:12:01'}
2478    /// {ts '2025-07-17 14:12:01'}
2479    /// ```
2480    ///
2481    /// [ODBC Date, Time, and Timestamp Literals]:
2482    /// https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/date-time-and-timestamp-literals?view=sql-server-2017
2483    fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2484        self.maybe_parse(|p| {
2485            let token = p.next_token().clone();
2486            let word_string = token.token.to_string();
2487            let data_type = match word_string.as_str() {
2488                "t" => DataType::Time(None, TimezoneInfo::None),
2489                "d" => DataType::Date,
2490                "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2491                _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2492            };
2493            let value = p.parse_value()?;
2494            Ok(Expr::TypedString(TypedString {
2495                data_type,
2496                value,
2497                uses_odbc_syntax: true,
2498            }))
2499        })
2500    }
2501
2502    /// Tries to parse the body of an [ODBC function] call.
2503    /// i.e. without the enclosing braces
2504    ///
2505    /// ```sql
2506    /// fn myfunc(1,2,3)
2507    /// ```
2508    ///
2509    /// [ODBC function]: https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/scalar-function-calls?view=sql-server-2017
2510    fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2511        self.maybe_parse(|p| {
2512            p.expect_keyword(Keyword::FN)?;
2513            let fn_name = p.parse_object_name(false)?;
2514            let mut fn_call = p.parse_function_call(fn_name)?;
2515            fn_call.uses_odbc_syntax = true;
2516            Ok(Expr::Function(fn_call))
2517        })
2518    }
2519
2520    /// Parse the argument list of `XMLPARSE({ DOCUMENT | CONTENT } value)`,
2521    /// including the closing parenthesis. The mode word becomes the name of the
2522    /// single argument, with no operator between it and the value.
2523    fn parse_xmlparse_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
2524        let arg = FunctionArg::Named {
2525            name: self.parse_identifier()?,
2526            arg: FunctionArgExpr::Expr(self.parse_expr()?),
2527            operator: FunctionArgOperator::Space,
2528        };
2529        self.expect_token(&Token::RParen)?;
2530        Ok(FunctionArgumentList {
2531            duplicate_treatment: None,
2532            args: vec![arg],
2533            clauses: vec![],
2534        })
2535    }
2536
2537    /// Parse a function call expression named by `name` and return it as an `Expr`.
2538    pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2539        self.parse_function_call(name).map(Expr::Function)
2540    }
2541
2542    fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2543        self.expect_token(&Token::LParen)?;
2544
2545        // Snowflake permits a subquery to be passed as an argument without
2546        // an enclosing set of parens if it's the only argument.
2547        if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2548            let subquery = self.parse_query()?;
2549            self.expect_token(&Token::RParen)?;
2550            return Ok(Function {
2551                name,
2552                uses_odbc_syntax: false,
2553                parameters: FunctionArguments::None,
2554                args: FunctionArguments::Subquery(subquery),
2555                filter: None,
2556                null_treatment: None,
2557                over: None,
2558                within_group: vec![],
2559            });
2560        }
2561
2562        let mut args = if self.dialect.supports_xml_expressions()
2563            && Self::is_simple_unquoted_object_name(&name, "xmlparse")
2564        {
2565            self.parse_xmlparse_argument_list()?
2566        } else {
2567            self.parse_function_argument_list()?
2568        };
2569        let mut parameters = FunctionArguments::None;
2570        // ClickHouse aggregations support parametric functions like `HISTOGRAM(0.5, 0.6)(x, y)`
2571        // which (0.5, 0.6) is a parameter to the function.
2572        if dialect_of!(self is ClickHouseDialect | GenericDialect)
2573            && self.consume_token(&Token::LParen)
2574        {
2575            parameters = FunctionArguments::List(args);
2576            args = self.parse_function_argument_list()?;
2577        }
2578
2579        let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2580            self.expect_token(&Token::LParen)?;
2581            self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2582            let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2583            self.expect_token(&Token::RParen)?;
2584            order_by
2585        } else {
2586            vec![]
2587        };
2588
2589        let filter = if self.dialect.supports_filter_during_aggregation()
2590            && self.parse_keyword(Keyword::FILTER)
2591            && self.consume_token(&Token::LParen)
2592            && self.parse_keyword(Keyword::WHERE)
2593        {
2594            let filter = Some(Box::new(self.parse_expr()?));
2595            self.expect_token(&Token::RParen)?;
2596            filter
2597        } else {
2598            None
2599        };
2600
2601        // Syntax for null treatment shows up either in the args list
2602        // or after the function call, but not both.
2603        let null_treatment = if args
2604            .clauses
2605            .iter()
2606            .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2607        {
2608            self.parse_null_treatment()?
2609        } else {
2610            None
2611        };
2612
2613        let over = if self.parse_keyword(Keyword::OVER) {
2614            if self.consume_token(&Token::LParen) {
2615                let window_spec = self.parse_window_spec()?;
2616                Some(WindowType::WindowSpec(window_spec))
2617            } else {
2618                Some(WindowType::NamedWindow(self.parse_identifier()?))
2619            }
2620        } else {
2621            None
2622        };
2623
2624        Ok(Function {
2625            name,
2626            uses_odbc_syntax: false,
2627            parameters,
2628            args: FunctionArguments::List(args),
2629            null_treatment,
2630            filter,
2631            over,
2632            within_group,
2633        })
2634    }
2635
2636    /// Optionally parses a null treatment clause.
2637    fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2638        match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2639            Some(keyword) => {
2640                self.expect_keyword_is(Keyword::NULLS)?;
2641
2642                Ok(match keyword {
2643                    Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2644                    Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2645                    _ => None,
2646                })
2647            }
2648            None => Ok(None),
2649        }
2650    }
2651
2652    /// Parse time-related function `name` possibly followed by `(...)` arguments.
2653    pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2654        let args = if self.consume_token(&Token::LParen) {
2655            FunctionArguments::List(self.parse_function_argument_list()?)
2656        } else {
2657            FunctionArguments::None
2658        };
2659        Ok(Expr::Function(Function {
2660            name,
2661            uses_odbc_syntax: false,
2662            parameters: FunctionArguments::None,
2663            args,
2664            filter: None,
2665            over: None,
2666            null_treatment: None,
2667            within_group: vec![],
2668        }))
2669    }
2670
2671    /// Parse window frame `UNITS` clause: `ROWS`, `RANGE`, or `GROUPS`.
2672    pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2673        let next_token = self.next_token();
2674        match &next_token.token {
2675            Token::Word(w) => match w.keyword {
2676                Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2677                Keyword::RANGE => Ok(WindowFrameUnits::Range),
2678                Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2679                _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2680            },
2681            _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2682        }
2683    }
2684
2685    /// Parse a `WINDOW` frame definition (units and bounds).
2686    pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2687        let units = self.parse_window_frame_units()?;
2688        let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2689            let start_bound = self.parse_window_frame_bound()?;
2690            self.expect_keyword_is(Keyword::AND)?;
2691            let end_bound = Some(self.parse_window_frame_bound()?);
2692            (start_bound, end_bound)
2693        } else {
2694            (self.parse_window_frame_bound()?, None)
2695        };
2696        Ok(WindowFrame {
2697            units,
2698            start_bound,
2699            end_bound,
2700        })
2701    }
2702
2703    /// Parse a window frame bound: `CURRENT ROW` or `<n> PRECEDING|FOLLOWING`.
2704    pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2705        if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2706            Ok(WindowFrameBound::CurrentRow)
2707        } else {
2708            let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2709                None
2710            } else {
2711                Some(Box::new(match &self.peek_token_ref().token {
2712                    Token::SingleQuotedString(_) => self.parse_interval()?,
2713                    _ => self.parse_expr()?,
2714                }))
2715            };
2716            if self.parse_keyword(Keyword::PRECEDING) {
2717                Ok(WindowFrameBound::Preceding(rows))
2718            } else if self.parse_keyword(Keyword::FOLLOWING) {
2719                Ok(WindowFrameBound::Following(rows))
2720            } else {
2721                self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2722            }
2723        }
2724    }
2725
2726    /// Parse a group by expr. Group by expr can be one of group sets, roll up, cube, or simple expr.
2727    fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2728        if self.dialect.supports_group_by_expr() {
2729            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2730                self.expect_token(&Token::LParen)?;
2731                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2732                self.expect_token(&Token::RParen)?;
2733                Ok(Expr::GroupingSets(result))
2734            } else if self.parse_keyword(Keyword::CUBE) {
2735                self.expect_token(&Token::LParen)?;
2736                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2737                self.expect_token(&Token::RParen)?;
2738                Ok(Expr::Cube(result))
2739            } else if self.parse_keyword(Keyword::ROLLUP) {
2740                self.expect_token(&Token::LParen)?;
2741                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2742                self.expect_token(&Token::RParen)?;
2743                Ok(Expr::Rollup(result))
2744            } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2745                // PostgreSQL allow to use empty tuple as a group by expression,
2746                // e.g. `GROUP BY (), name`. Please refer to GROUP BY Clause section in
2747                // [PostgreSQL](https://www.postgresql.org/docs/16/sql-select.html)
2748                Ok(Expr::Tuple(vec![]))
2749            } else {
2750                self.parse_expr()
2751            }
2752        } else {
2753            // TODO parse rollup for other dialects
2754            self.parse_expr()
2755        }
2756    }
2757
2758    /// Parse a tuple with `(` and `)`.
2759    /// If `lift_singleton` is true, then a singleton tuple is lifted to a tuple of length 1, otherwise it will fail.
2760    /// If `allow_empty` is true, then an empty tuple is allowed.
2761    fn parse_tuple(
2762        &mut self,
2763        lift_singleton: bool,
2764        allow_empty: bool,
2765    ) -> Result<Vec<Expr>, ParserError> {
2766        if lift_singleton {
2767            if self.consume_token(&Token::LParen) {
2768                let result = if allow_empty && self.consume_token(&Token::RParen) {
2769                    vec![]
2770                } else {
2771                    let result = self.parse_comma_separated(Parser::parse_expr)?;
2772                    self.expect_token(&Token::RParen)?;
2773                    result
2774                };
2775                Ok(result)
2776            } else {
2777                Ok(vec![self.parse_expr()?])
2778            }
2779        } else {
2780            self.expect_token(&Token::LParen)?;
2781            let result = if allow_empty && self.consume_token(&Token::RParen) {
2782                vec![]
2783            } else {
2784                let result = self.parse_comma_separated(Parser::parse_expr)?;
2785                self.expect_token(&Token::RParen)?;
2786                result
2787            };
2788            Ok(result)
2789        }
2790    }
2791
2792    /// Parse a `CASE` expression and return an [`Expr::Case`].
2793    pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2794        let case_token = AttachedToken(self.get_current_token().clone());
2795        let mut operand = None;
2796        if !self.parse_keyword(Keyword::WHEN) {
2797            operand = Some(Box::new(self.parse_expr()?));
2798            self.expect_keyword_is(Keyword::WHEN)?;
2799        }
2800        let mut conditions = vec![];
2801        loop {
2802            let condition = self.parse_expr()?;
2803            self.expect_keyword_is(Keyword::THEN)?;
2804            let result = self.parse_expr()?;
2805            conditions.push(CaseWhen { condition, result });
2806            if !self.parse_keyword(Keyword::WHEN) {
2807                break;
2808            }
2809        }
2810        let else_result = if self.parse_keyword(Keyword::ELSE) {
2811            Some(Box::new(self.parse_expr()?))
2812        } else {
2813            None
2814        };
2815        let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2816        Ok(Expr::Case {
2817            case_token,
2818            end_token,
2819            operand,
2820            conditions,
2821            else_result,
2822        })
2823    }
2824
2825    /// Parse an optional `FORMAT` clause for `CAST` expressions.
2826    pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2827        if self.parse_keyword(Keyword::FORMAT) {
2828            let value = self.parse_value()?;
2829            match self.parse_optional_time_zone()? {
2830                Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2831                None => Ok(Some(CastFormat::Value(value))),
2832            }
2833        } else {
2834            Ok(None)
2835        }
2836    }
2837
2838    /// Parse an optional `AT TIME ZONE` clause.
2839    pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2840        if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2841            self.parse_value().map(Some)
2842        } else {
2843            Ok(None)
2844        }
2845    }
2846
2847    /// mssql-like convert function
2848    fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2849        self.expect_token(&Token::LParen)?;
2850        let data_type = self.parse_data_type()?;
2851        self.expect_token(&Token::Comma)?;
2852        let expr = self.parse_expr()?;
2853        let styles = if self.consume_token(&Token::Comma) {
2854            self.parse_comma_separated(Parser::parse_expr)?
2855        } else {
2856            Default::default()
2857        };
2858        self.expect_token(&Token::RParen)?;
2859        Ok(Expr::Convert {
2860            is_try,
2861            expr: Box::new(expr),
2862            data_type: Some(data_type),
2863            charset: None,
2864            target_before_value: true,
2865            styles,
2866        })
2867    }
2868
2869    /// Parse a SQL CONVERT function:
2870    ///  - `CONVERT('héhé' USING utf8mb4)` (MySQL)
2871    ///  - `CONVERT('héhé', CHAR CHARACTER SET utf8mb4)` (MySQL)
2872    ///  - `CONVERT(DECIMAL(10, 5), 42)` (MSSQL) - the type comes first
2873    pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2874        if self.dialect.convert_type_before_value() {
2875            return self.parse_mssql_convert(is_try);
2876        }
2877        self.expect_token(&Token::LParen)?;
2878        let expr = self.parse_expr()?;
2879        if self.parse_keyword(Keyword::USING) {
2880            let charset = self.parse_object_name(false)?;
2881            self.expect_token(&Token::RParen)?;
2882            return Ok(Expr::Convert {
2883                is_try,
2884                expr: Box::new(expr),
2885                data_type: None,
2886                charset: Some(charset),
2887                target_before_value: false,
2888                styles: vec![],
2889            });
2890        }
2891        self.expect_token(&Token::Comma)?;
2892        let data_type = self.parse_data_type()?;
2893        let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2894            Some(self.parse_object_name(false)?)
2895        } else {
2896            None
2897        };
2898        self.expect_token(&Token::RParen)?;
2899        Ok(Expr::Convert {
2900            is_try,
2901            expr: Box::new(expr),
2902            data_type: Some(data_type),
2903            charset,
2904            target_before_value: false,
2905            styles: vec![],
2906        })
2907    }
2908
2909    /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
2910    pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2911        self.expect_token(&Token::LParen)?;
2912        let expr = self.parse_expr()?;
2913        self.expect_keyword_is(Keyword::AS)?;
2914        let data_type = self.parse_data_type()?;
2915        let format = self.parse_optional_cast_format()?;
2916        self.expect_token(&Token::RParen)?;
2917        Ok(Expr::Cast {
2918            kind,
2919            expr: Box::new(expr),
2920            data_type,
2921            format,
2922        })
2923    }
2924
2925    /// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
2926    pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2927        self.expect_token(&Token::LParen)?;
2928        let exists_node = Expr::Exists {
2929            negated,
2930            subquery: self.parse_query()?,
2931        };
2932        self.expect_token(&Token::RParen)?;
2933        Ok(exists_node)
2934    }
2935
2936    /// Parse a SQL `EXTRACT` expression e.g. `EXTRACT(YEAR FROM date)`.
2937    pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2938        self.expect_token(&Token::LParen)?;
2939        let field = self.parse_date_time_field()?;
2940
2941        let syntax = if self.parse_keyword(Keyword::FROM) {
2942            ExtractSyntax::From
2943        } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2944        {
2945            ExtractSyntax::Comma
2946        } else {
2947            return Err(ParserError::ParserError(
2948                "Expected 'FROM' or ','".to_string(),
2949            ));
2950        };
2951
2952        let expr = self.parse_expr()?;
2953        self.expect_token(&Token::RParen)?;
2954        Ok(Expr::Extract {
2955            field,
2956            expr: Box::new(expr),
2957            syntax,
2958        })
2959    }
2960
2961    /// Parse a `CEIL` or `FLOOR` expression.
2962    pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2963        self.expect_token(&Token::LParen)?;
2964        let expr = self.parse_expr()?;
2965        // Parse `CEIL/FLOOR(expr)`
2966        let field = if self.parse_keyword(Keyword::TO) {
2967            // Parse `CEIL/FLOOR(expr TO DateTimeField)`
2968            CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2969        } else if self.consume_token(&Token::Comma) {
2970            // Parse `CEIL/FLOOR(expr, scale)`
2971            let v = self.parse_value()?;
2972            if matches!(v.value, Value::Number(_, _)) {
2973                CeilFloorKind::Scale(v)
2974            } else {
2975                return Err(ParserError::ParserError(
2976                    "Scale field can only be of number type".to_string(),
2977                ));
2978            }
2979        } else {
2980            CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2981        };
2982        self.expect_token(&Token::RParen)?;
2983        if is_ceil {
2984            Ok(Expr::Ceil {
2985                expr: Box::new(expr),
2986                field,
2987            })
2988        } else {
2989            Ok(Expr::Floor {
2990                expr: Box::new(expr),
2991                field,
2992            })
2993        }
2994    }
2995
2996    /// Parse a `POSITION` expression.
2997    pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2998        let between_prec = self.dialect.prec_value(Precedence::Between);
2999        let position_expr = self.maybe_parse(|p| {
3000            // PARSE SELECT POSITION('@' in field)
3001            p.expect_token(&Token::LParen)?;
3002
3003            // Parse the subexpr till the IN keyword
3004            let expr = p.parse_subexpr(between_prec)?;
3005            p.expect_keyword_is(Keyword::IN)?;
3006            let from = p.parse_expr()?;
3007            p.expect_token(&Token::RParen)?;
3008            Ok(Expr::Position {
3009                expr: Box::new(expr),
3010                r#in: Box::new(from),
3011            })
3012        })?;
3013        match position_expr {
3014            Some(expr) => Ok(expr),
3015            // Snowflake supports `position` as an ordinary function call
3016            // without the special `IN` syntax.
3017            None => self.parse_function(ObjectName::from(vec![ident])),
3018        }
3019    }
3020
3021    /// Parse `SUBSTRING`/`SUBSTR` expressions: `SUBSTRING(expr FROM start FOR length)` or `SUBSTR(expr, start, length)`.
3022    pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
3023        let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
3024            Keyword::SUBSTR => true,
3025            Keyword::SUBSTRING => false,
3026            _ => {
3027                self.prev_token();
3028                return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
3029            }
3030        };
3031        self.expect_token(&Token::LParen)?;
3032        let expr = self.parse_expr()?;
3033        let mut from_expr = None;
3034        let special = self.consume_token(&Token::Comma);
3035        if special || self.parse_keyword(Keyword::FROM) {
3036            from_expr = Some(self.parse_expr()?);
3037        }
3038
3039        let mut to_expr = None;
3040        if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
3041            to_expr = Some(self.parse_expr()?);
3042        }
3043        self.expect_token(&Token::RParen)?;
3044
3045        Ok(Expr::Substring {
3046            expr: Box::new(expr),
3047            substring_from: from_expr.map(Box::new),
3048            substring_for: to_expr.map(Box::new),
3049            special,
3050            shorthand,
3051        })
3052    }
3053
3054    /// Parse an OVERLAY expression.
3055    ///
3056    /// See [Expr::Overlay]
3057    pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
3058        // PARSE OVERLAY (EXPR PLACING EXPR FROM 1 [FOR 3])
3059        self.expect_token(&Token::LParen)?;
3060        let expr = self.parse_expr()?;
3061        self.expect_keyword_is(Keyword::PLACING)?;
3062        let what_expr = self.parse_expr()?;
3063        self.expect_keyword_is(Keyword::FROM)?;
3064        let from_expr = self.parse_expr()?;
3065        let mut for_expr = None;
3066        if self.parse_keyword(Keyword::FOR) {
3067            for_expr = Some(self.parse_expr()?);
3068        }
3069        self.expect_token(&Token::RParen)?;
3070
3071        Ok(Expr::Overlay {
3072            expr: Box::new(expr),
3073            overlay_what: Box::new(what_expr),
3074            overlay_from: Box::new(from_expr),
3075            overlay_for: for_expr.map(Box::new),
3076        })
3077    }
3078
3079    /// ```sql
3080    /// TRIM ([WHERE] ['text' FROM] 'text')
3081    /// TRIM ('text')
3082    /// TRIM(<expr>, [, characters]) -- PostgreSQL, DuckDB, Snowflake, BigQuery, Generic
3083    /// ```
3084    pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
3085        self.expect_token(&Token::LParen)?;
3086        let mut trim_where = None;
3087        if let Token::Word(word) = &self.peek_token_ref().token {
3088            if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
3089                trim_where = Some(self.parse_trim_where()?);
3090            }
3091        }
3092        let expr = self.parse_expr()?;
3093        if self.parse_keyword(Keyword::FROM) {
3094            let trim_what = Box::new(expr);
3095            let expr = self.parse_expr()?;
3096            self.expect_token(&Token::RParen)?;
3097            Ok(Expr::Trim {
3098                expr: Box::new(expr),
3099                trim_where,
3100                trim_what: Some(trim_what),
3101                trim_characters: None,
3102            })
3103        } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
3104        {
3105            let characters = self.parse_comma_separated(Parser::parse_expr)?;
3106            self.expect_token(&Token::RParen)?;
3107            Ok(Expr::Trim {
3108                expr: Box::new(expr),
3109                trim_where: None,
3110                trim_what: None,
3111                trim_characters: Some(characters),
3112            })
3113        } else {
3114            self.expect_token(&Token::RParen)?;
3115            Ok(Expr::Trim {
3116                expr: Box::new(expr),
3117                trim_where,
3118                trim_what: None,
3119                trim_characters: None,
3120            })
3121        }
3122    }
3123
3124    /// Parse the `WHERE` field for a `TRIM` expression.
3125    ///
3126    /// See [TrimWhereField]
3127    pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3128        let next_token = self.next_token();
3129        match &next_token.token {
3130            Token::Word(w) => match w.keyword {
3131                Keyword::BOTH => Ok(TrimWhereField::Both),
3132                Keyword::LEADING => Ok(TrimWhereField::Leading),
3133                Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3134                _ => self.expected("trim_where field", next_token)?,
3135            },
3136            _ => self.expected("trim_where field", next_token),
3137        }
3138    }
3139
3140    /// Parses an array expression `[ex1, ex2, ..]`
3141    /// if `named` is `true`, came from an expression like  `ARRAY[ex1, ex2]`
3142    pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3143        let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3144        self.expect_token(&Token::RBracket)?;
3145        Ok(Expr::Array(Array { elem: exprs, named }))
3146    }
3147
3148    /// Parse the `ON OVERFLOW` clause for `LISTAGG`.
3149    ///
3150    /// See [`ListAggOnOverflow`]
3151    pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3152        if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3153            if self.parse_keyword(Keyword::ERROR) {
3154                Ok(Some(ListAggOnOverflow::Error))
3155            } else {
3156                self.expect_keyword_is(Keyword::TRUNCATE)?;
3157                let filler = match &self.peek_token_ref().token {
3158                    Token::Word(w)
3159                        if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3160                    {
3161                        None
3162                    }
3163                    Token::SingleQuotedString(_)
3164                    | Token::EscapedStringLiteral(_)
3165                    | Token::UnicodeStringLiteral(_)
3166                    | Token::NationalStringLiteral(_)
3167                    | Token::QuoteDelimitedStringLiteral(_)
3168                    | Token::NationalQuoteDelimitedStringLiteral(_)
3169                    | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3170                    _ => self.expected_ref(
3171                        "either filler, WITH, or WITHOUT in LISTAGG",
3172                        self.peek_token_ref(),
3173                    )?,
3174                };
3175                let with_count = self.parse_keyword(Keyword::WITH);
3176                if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3177                    self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3178                }
3179                self.expect_keyword_is(Keyword::COUNT)?;
3180                Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3181            }
3182        } else {
3183            Ok(None)
3184        }
3185    }
3186
3187    /// Parse a date/time field for `EXTRACT`, interval qualifiers, and ceil/floor operations.
3188    ///
3189    /// `EXTRACT` supports a wider set of date/time fields than interval qualifiers,
3190    /// so this function may need to be split in two.
3191    ///
3192    /// See [`DateTimeField`]
3193    pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3194        let next_token = self.next_token();
3195        match &next_token.token {
3196            Token::Word(w) => match w.keyword {
3197                Keyword::YEAR => Ok(DateTimeField::Year),
3198                Keyword::YEARS => Ok(DateTimeField::Years),
3199                Keyword::MONTH => Ok(DateTimeField::Month),
3200                Keyword::MONTHS => Ok(DateTimeField::Months),
3201                Keyword::WEEK => {
3202                    let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3203                        && self.consume_token(&Token::LParen)
3204                    {
3205                        let week_day = self.parse_identifier()?;
3206                        self.expect_token(&Token::RParen)?;
3207                        Some(week_day)
3208                    } else {
3209                        None
3210                    };
3211                    Ok(DateTimeField::Week(week_day))
3212                }
3213                Keyword::WEEKS => Ok(DateTimeField::Weeks),
3214                Keyword::DAY => Ok(DateTimeField::Day),
3215                Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3216                Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3217                Keyword::DAYS => Ok(DateTimeField::Days),
3218                Keyword::DATE => Ok(DateTimeField::Date),
3219                Keyword::DATETIME => Ok(DateTimeField::Datetime),
3220                Keyword::HOUR => Ok(DateTimeField::Hour),
3221                Keyword::HOURS => Ok(DateTimeField::Hours),
3222                Keyword::MINUTE => Ok(DateTimeField::Minute),
3223                Keyword::MINUTES => Ok(DateTimeField::Minutes),
3224                Keyword::SECOND => Ok(DateTimeField::Second),
3225                Keyword::SECONDS => Ok(DateTimeField::Seconds),
3226                Keyword::CENTURY => Ok(DateTimeField::Century),
3227                Keyword::DECADE => Ok(DateTimeField::Decade),
3228                Keyword::DOY => Ok(DateTimeField::Doy),
3229                Keyword::DOW => Ok(DateTimeField::Dow),
3230                Keyword::EPOCH => Ok(DateTimeField::Epoch),
3231                Keyword::ISODOW => Ok(DateTimeField::Isodow),
3232                Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3233                Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3234                Keyword::JULIAN => Ok(DateTimeField::Julian),
3235                Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3236                Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3237                Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3238                Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3239                Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3240                Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3241                Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3242                Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3243                Keyword::QUARTER => Ok(DateTimeField::Quarter),
3244                Keyword::TIME => Ok(DateTimeField::Time),
3245                Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3246                Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3247                Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3248                Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3249                Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3250                _ if self.dialect.allow_extract_custom() => {
3251                    self.prev_token();
3252                    let custom = self.parse_identifier()?;
3253                    Ok(DateTimeField::Custom(custom))
3254                }
3255                _ => self.expected("date/time field", next_token),
3256            },
3257            Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3258                self.prev_token();
3259                let custom = self.parse_identifier()?;
3260                Ok(DateTimeField::Custom(custom))
3261            }
3262            _ => self.expected("date/time field", next_token),
3263        }
3264    }
3265
3266    /// Parse a `NOT` expression.
3267    ///
3268    /// Represented in the AST as `Expr::UnaryOp` with `UnaryOperator::Not`.
3269    pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3270        match &self.peek_token_ref().token {
3271            Token::Word(w) => match w.keyword {
3272                Keyword::EXISTS => {
3273                    let negated = true;
3274                    let _ = self.parse_keyword(Keyword::EXISTS);
3275                    self.parse_exists_expr(negated)
3276                }
3277                _ => Ok(Expr::UnaryOp {
3278                    op: UnaryOperator::Not,
3279                    expr: Box::new(
3280                        self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3281                    ),
3282                }),
3283            },
3284            _ => Ok(Expr::UnaryOp {
3285                op: UnaryOperator::Not,
3286                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3287            }),
3288        }
3289    }
3290
3291    /// Parse expression types that start with a left brace '{'.
3292    /// Examples:
3293    /// ```sql
3294    /// -- Dictionary expr.
3295    /// {'key1': 'value1', 'key2': 'value2'}
3296    ///
3297    /// -- Function call using the ODBC syntax.
3298    /// { fn CONCAT('foo', 'bar') }
3299    /// ```
3300    fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3301        let token = self.expect_token(&Token::LBrace)?;
3302
3303        if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3304            self.expect_token(&Token::RBrace)?;
3305            return Ok(fn_expr);
3306        }
3307
3308        if self.dialect.supports_dictionary_syntax() {
3309            self.prev_token(); // Put back the '{'
3310            return self.parse_dictionary();
3311        }
3312
3313        self.expected("an expression", token)
3314    }
3315
3316    /// Parses fulltext expressions [`sqlparser::ast::Expr::MatchAgainst`]
3317    ///
3318    /// # Errors
3319    /// This method will raise an error if the column list is empty or with invalid identifiers,
3320    /// the match expression is not a literal string, or if the search modifier is not valid.
3321    pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3322        let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3323
3324        self.expect_keyword_is(Keyword::AGAINST)?;
3325
3326        self.expect_token(&Token::LParen)?;
3327
3328        // MySQL is too permissive about the value, IMO we can't validate it perfectly on syntax level.
3329        let match_value = self.parse_value()?;
3330
3331        let in_natural_language_mode_keywords = &[
3332            Keyword::IN,
3333            Keyword::NATURAL,
3334            Keyword::LANGUAGE,
3335            Keyword::MODE,
3336        ];
3337
3338        let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3339
3340        let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3341
3342        let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3343            if self.parse_keywords(with_query_expansion_keywords) {
3344                Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3345            } else {
3346                Some(SearchModifier::InNaturalLanguageMode)
3347            }
3348        } else if self.parse_keywords(in_boolean_mode_keywords) {
3349            Some(SearchModifier::InBooleanMode)
3350        } else if self.parse_keywords(with_query_expansion_keywords) {
3351            Some(SearchModifier::WithQueryExpansion)
3352        } else {
3353            None
3354        };
3355
3356        self.expect_token(&Token::RParen)?;
3357
3358        Ok(Expr::MatchAgainst {
3359            columns,
3360            match_value,
3361            opt_search_modifier,
3362        })
3363    }
3364
3365    /// Parse an `INTERVAL` expression.
3366    ///
3367    /// Some syntactically valid intervals:
3368    ///
3369    /// ```sql
3370    ///   1. INTERVAL '1' DAY
3371    ///   2. INTERVAL '1-1' YEAR TO MONTH
3372    ///   3. INTERVAL '1' SECOND
3373    ///   4. INTERVAL '1:1:1.1' HOUR (5) TO SECOND (5)
3374    ///   5. INTERVAL '1.1' SECOND (2, 2)
3375    ///   6. INTERVAL '1:1' HOUR (5) TO MINUTE (5)
3376    ///   7. (MySql & BigQuery only): INTERVAL 1 DAY
3377    /// ```
3378    ///
3379    /// Note that we do not currently attempt to parse the quoted value.
3380    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
3381    pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3382        let _guard = self.recursion_counter.try_decrease()?;
3383
3384        // The SQL standard allows an optional sign before the value string, but
3385        // it is not clear if any implementations support that syntax, so we
3386        // don't currently try to parse it. (The sign can instead be included
3387        // inside the value string.)
3388
3389        // to match the different flavours of INTERVAL syntax, we only allow expressions
3390        // if the dialect requires an interval qualifier,
3391        // see https://github.com/sqlparser-rs/sqlparser-rs/pull/1398 for more details
3392        let value = if self.dialect.require_interval_qualifier() {
3393            // parse a whole expression so `INTERVAL 1 + 1 DAY` is valid
3394            self.parse_expr()?
3395        } else {
3396            // parse a prefix expression so `INTERVAL 1 DAY` is valid, but `INTERVAL 1 + 1 DAY` is not
3397            // this also means that `INTERVAL '5 days' > INTERVAL '1 day'` treated properly
3398            self.parse_prefix()?
3399        };
3400
3401        // Following the string literal is a qualifier which indicates the units
3402        // of the duration specified in the string literal.
3403        //
3404        // Note that PostgreSQL allows omitting the qualifier, so we provide
3405        // this more general implementation.
3406        let leading_field = if self.next_token_is_temporal_unit() {
3407            Some(self.parse_date_time_field()?)
3408        } else if self.dialect.require_interval_qualifier() {
3409            return parser_err!(
3410                "INTERVAL requires a unit after the literal value",
3411                self.peek_token_ref().span.start
3412            );
3413        } else {
3414            None
3415        };
3416
3417        let (leading_precision, last_field, fsec_precision) =
3418            if leading_field == Some(DateTimeField::Second) {
3419                // SQL mandates special syntax for `SECOND TO SECOND` literals.
3420                // Instead of
3421                //     `SECOND [(<leading precision>)] TO SECOND[(<fractional seconds precision>)]`
3422                // one must use the special format:
3423                //     `SECOND [( <leading precision> [ , <fractional seconds precision>] )]`
3424                let last_field = None;
3425                let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3426                (leading_precision, last_field, fsec_precision)
3427            } else {
3428                let leading_precision = self.parse_optional_precision()?;
3429                if self.parse_keyword(Keyword::TO) {
3430                    let last_field = Some(self.parse_date_time_field()?);
3431                    let fsec_precision = if last_field == Some(DateTimeField::Second) {
3432                        self.parse_optional_precision()?
3433                    } else {
3434                        None
3435                    };
3436                    (leading_precision, last_field, fsec_precision)
3437                } else {
3438                    (leading_precision, None, None)
3439                }
3440            };
3441
3442        Ok(Expr::Interval(Interval {
3443            value: Box::new(value),
3444            leading_field,
3445            leading_precision,
3446            last_field,
3447            fractional_seconds_precision: fsec_precision,
3448        }))
3449    }
3450
3451    /// Peek at the next token and determine if it is a temporal unit
3452    /// like `second`.
3453    pub fn next_token_is_temporal_unit(&mut self) -> bool {
3454        if let Token::Word(word) = &self.peek_token_ref().token {
3455            matches!(
3456                word.keyword,
3457                Keyword::YEAR
3458                    | Keyword::YEARS
3459                    | Keyword::MONTH
3460                    | Keyword::MONTHS
3461                    | Keyword::WEEK
3462                    | Keyword::WEEKS
3463                    | Keyword::DAY
3464                    | Keyword::DAYS
3465                    | Keyword::HOUR
3466                    | Keyword::HOURS
3467                    | Keyword::MINUTE
3468                    | Keyword::MINUTES
3469                    | Keyword::SECOND
3470                    | Keyword::SECONDS
3471                    | Keyword::CENTURY
3472                    | Keyword::DECADE
3473                    | Keyword::DOW
3474                    | Keyword::DOY
3475                    | Keyword::EPOCH
3476                    | Keyword::ISODOW
3477                    | Keyword::ISOYEAR
3478                    | Keyword::JULIAN
3479                    | Keyword::MICROSECOND
3480                    | Keyword::MICROSECONDS
3481                    | Keyword::MILLENIUM
3482                    | Keyword::MILLENNIUM
3483                    | Keyword::MILLISECOND
3484                    | Keyword::MILLISECONDS
3485                    | Keyword::NANOSECOND
3486                    | Keyword::NANOSECONDS
3487                    | Keyword::QUARTER
3488                    | Keyword::TIMEZONE
3489                    | Keyword::TIMEZONE_HOUR
3490                    | Keyword::TIMEZONE_MINUTE
3491            )
3492        } else {
3493            false
3494        }
3495    }
3496
3497    /// Syntax
3498    /// ```sql
3499    /// -- typed
3500    /// STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
3501    /// -- typeless
3502    /// STRUCT( expr1 [AS field_name] [, ... ])
3503    /// ```
3504    fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3505        // Parse the fields definition if exist `<[field_name] field_type, ...>`
3506        self.prev_token();
3507        let (fields, trailing_bracket) =
3508            self.parse_struct_type_def(Self::parse_struct_field_def)?;
3509        if trailing_bracket.0 {
3510            return parser_err!(
3511                "unmatched > in STRUCT literal",
3512                self.peek_token_ref().span.start
3513            );
3514        }
3515
3516        // Parse the struct values `(expr1 [, ... ])`
3517        self.expect_token(&Token::LParen)?;
3518        let values = self
3519            .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3520        self.expect_token(&Token::RParen)?;
3521
3522        Ok(Expr::Struct { values, fields })
3523    }
3524
3525    /// Parse an expression value for a struct literal
3526    /// Syntax
3527    /// ```sql
3528    /// expr [AS name]
3529    /// ```
3530    ///
3531    /// For biquery [1], Parameter typed_syntax is set to true if the expression
3532    /// is to be parsed as a field expression declared using typed
3533    /// struct syntax [2], and false if using typeless struct syntax [3].
3534    ///
3535    /// [1]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct
3536    /// [2]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typed_struct_syntax
3537    /// [3]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax
3538    fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3539        let expr = self.parse_expr()?;
3540        if self.parse_keyword(Keyword::AS) {
3541            if typed_syntax {
3542                return parser_err!("Typed syntax does not allow AS", {
3543                    self.prev_token();
3544                    self.peek_token_ref().span.start
3545                });
3546            }
3547            let field_name = self.parse_identifier()?;
3548            Ok(Expr::Named {
3549                expr: expr.into(),
3550                name: field_name,
3551            })
3552        } else {
3553            Ok(expr)
3554        }
3555    }
3556
3557    /// Parse a Struct type definition as a sequence of field-value pairs.
3558    /// The syntax of the Struct elem differs by dialect so it is customised
3559    /// by the `elem_parser` argument.
3560    ///
3561    /// Syntax
3562    /// ```sql
3563    /// Hive:
3564    /// STRUCT<field_name: field_type>
3565    ///
3566    /// BigQuery:
3567    /// STRUCT<[field_name] field_type>
3568    /// ```
3569    fn parse_struct_type_def<F>(
3570        &mut self,
3571        mut elem_parser: F,
3572    ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3573    where
3574        F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3575    {
3576        self.expect_keyword_is(Keyword::STRUCT)?;
3577
3578        // Nothing to do if we have no type information.
3579        if self.peek_token_ref().token != Token::Lt {
3580            return Ok((Default::default(), false.into()));
3581        }
3582        self.next_token();
3583
3584        let mut field_defs = vec![];
3585        let trailing_bracket = loop {
3586            let (def, trailing_bracket) = elem_parser(self)?;
3587            field_defs.push(def);
3588            // The struct field definition is finished if it occurs `>>` or comma.
3589            if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3590                break trailing_bracket;
3591            }
3592        };
3593
3594        Ok((
3595            field_defs,
3596            self.expect_closing_angle_bracket(trailing_bracket)?,
3597        ))
3598    }
3599
3600    /// Duckdb Struct Data Type <https://duckdb.org/docs/sql/data_types/struct.html#retrieving-from-structs>
3601    fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3602        self.expect_keyword_is(Keyword::STRUCT)?;
3603        self.expect_token(&Token::LParen)?;
3604        let struct_body = self.parse_comma_separated(|parser| {
3605            let field_name = parser.parse_identifier()?;
3606            let field_type = parser.parse_data_type()?;
3607
3608            Ok(StructField {
3609                field_name: Some(field_name),
3610                field_type,
3611                options: None,
3612            })
3613        });
3614        self.expect_token(&Token::RParen)?;
3615        struct_body
3616    }
3617
3618    /// Parse a field definition in a [struct] or [tuple].
3619    /// Syntax:
3620    ///
3621    /// ```sql
3622    /// [field_name] field_type
3623    /// field_name: field_type
3624    /// ```
3625    ///
3626    /// [struct]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#declaring_a_struct_type
3627    /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
3628    /// [databricks]: https://docs.databricks.com/en/sql/language-manual/data-types/struct-type.html
3629    fn parse_struct_field_def(
3630        &mut self,
3631    ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3632        // Look beyond the next item to infer whether both field name
3633        // and type are specified.
3634        let is_named_field = matches!(
3635            (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3636            (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3637        );
3638
3639        let field_name = if is_named_field {
3640            let name = self.parse_identifier()?;
3641            let _ = self.consume_token(&Token::Colon);
3642            Some(name)
3643        } else {
3644            None
3645        };
3646
3647        let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3648
3649        let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3650        Ok((
3651            StructField {
3652                field_name,
3653                field_type,
3654                options,
3655            },
3656            trailing_bracket,
3657        ))
3658    }
3659
3660    /// DuckDB specific: Parse a Union type definition as a sequence of field-value pairs.
3661    ///
3662    /// Syntax:
3663    ///
3664    /// ```sql
3665    /// UNION(field_name field_type[,...])
3666    /// ```
3667    ///
3668    /// [1]: https://duckdb.org/docs/sql/data_types/union.html
3669    fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3670        self.expect_keyword_is(Keyword::UNION)?;
3671
3672        self.expect_token(&Token::LParen)?;
3673
3674        let fields = self.parse_comma_separated(|p| {
3675            Ok(UnionField {
3676                field_name: p.parse_identifier()?,
3677                field_type: p.parse_data_type()?,
3678            })
3679        })?;
3680
3681        self.expect_token(&Token::RParen)?;
3682
3683        Ok(fields)
3684    }
3685
3686    /// DuckDB and ClickHouse specific: Parse a duckdb [dictionary] or a clickhouse [map] setting
3687    ///
3688    /// Syntax:
3689    ///
3690    /// ```sql
3691    /// {'field_name': expr1[, ... ]}
3692    /// ```
3693    ///
3694    /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
3695    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
3696    fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3697        self.expect_token(&Token::LBrace)?;
3698
3699        let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3700
3701        self.expect_token(&Token::RBrace)?;
3702
3703        Ok(Expr::Dictionary(fields))
3704    }
3705
3706    /// Parse a field for a duckdb [dictionary] or a clickhouse [map] setting
3707    ///
3708    /// Syntax
3709    ///
3710    /// ```sql
3711    /// 'name': expr
3712    /// ```
3713    ///
3714    /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
3715    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
3716    fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3717        let key = self.parse_identifier()?;
3718
3719        self.expect_token(&Token::Colon)?;
3720
3721        let expr = self.parse_expr()?;
3722
3723        Ok(DictionaryField {
3724            key,
3725            value: Box::new(expr),
3726        })
3727    }
3728
3729    /// DuckDB specific: Parse a duckdb [map]
3730    ///
3731    /// Syntax:
3732    ///
3733    /// ```sql
3734    /// Map {key1: value1[, ... ]}
3735    /// ```
3736    ///
3737    /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
3738    fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3739        self.expect_token(&Token::LBrace)?;
3740        let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3741        self.expect_token(&Token::RBrace)?;
3742        Ok(Expr::Map(Map { entries: fields }))
3743    }
3744
3745    /// Parse a field for a duckdb [map]
3746    ///
3747    /// Syntax
3748    ///
3749    /// ```sql
3750    /// key: value
3751    /// ```
3752    ///
3753    /// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
3754    fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3755        // Stop before `:` so it can act as a key/value separator
3756        let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3757
3758        self.expect_token(&Token::Colon)?;
3759
3760        let value = self.parse_expr()?;
3761
3762        Ok(MapEntry {
3763            key: Box::new(key),
3764            value: Box::new(value),
3765        })
3766    }
3767
3768    /// Parse clickhouse [map]
3769    ///
3770    /// Syntax
3771    ///
3772    /// ```sql
3773    /// Map(key_data_type, value_data_type)
3774    /// ```
3775    ///
3776    /// [map]: https://clickhouse.com/docs/en/sql-reference/data-types/map
3777    fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3778        self.expect_keyword_is(Keyword::MAP)?;
3779        self.expect_token(&Token::LParen)?;
3780        let key_data_type = self.parse_data_type()?;
3781        self.expect_token(&Token::Comma)?;
3782        let value_data_type = self.parse_data_type()?;
3783        self.expect_token(&Token::RParen)?;
3784
3785        Ok((key_data_type, value_data_type))
3786    }
3787
3788    /// Parse clickhouse [tuple]
3789    ///
3790    /// Syntax
3791    ///
3792    /// ```sql
3793    /// Tuple([field_name] field_type, ...)
3794    /// ```
3795    ///
3796    /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
3797    fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3798        self.expect_keyword_is(Keyword::TUPLE)?;
3799        self.expect_token(&Token::LParen)?;
3800        let mut field_defs = vec![];
3801        loop {
3802            let (def, _) = self.parse_struct_field_def()?;
3803            field_defs.push(def);
3804            if !self.consume_token(&Token::Comma) {
3805                break;
3806            }
3807        }
3808        self.expect_token(&Token::RParen)?;
3809
3810        Ok(field_defs)
3811    }
3812
3813    /// For nested types that use the angle bracket syntax, this matches either
3814    /// `>`, `>>` or nothing depending on which variant is expected (specified by the previously
3815    /// matched `trailing_bracket` argument). It returns whether there is a trailing
3816    /// left to be matched - (i.e. if '>>' was matched).
3817    fn expect_closing_angle_bracket(
3818        &mut self,
3819        trailing_bracket: MatchedTrailingBracket,
3820    ) -> Result<MatchedTrailingBracket, ParserError> {
3821        let trailing_bracket = if !trailing_bracket.0 {
3822            match &self.peek_token_ref().token {
3823                Token::Gt => {
3824                    self.next_token();
3825                    false.into()
3826                }
3827                Token::ShiftRight => {
3828                    self.next_token();
3829                    true.into()
3830                }
3831                _ => return self.expected_ref(">", self.peek_token_ref()),
3832            }
3833        } else {
3834            false.into()
3835        };
3836
3837        Ok(trailing_bracket)
3838    }
3839
3840    /// Parse an operator following an expression
3841    pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3842        // allow the dialect to override infix parsing
3843        if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3844            return infix;
3845        }
3846
3847        let dialect = self.dialect;
3848
3849        self.advance_token();
3850        let tok = self.get_current_token();
3851        debug!("infix: {tok:?}");
3852        let tok_index = self.get_current_index();
3853        let span = tok.span;
3854        let regular_binary_operator = match &tok.token {
3855            Token::Spaceship => Some(BinaryOperator::Spaceship),
3856            Token::DoubleEq => Some(BinaryOperator::Eq),
3857            Token::Assignment => Some(BinaryOperator::Assignment),
3858            Token::Eq => Some(BinaryOperator::Eq),
3859            Token::Neq => Some(BinaryOperator::NotEq),
3860            Token::Gt => Some(BinaryOperator::Gt),
3861            Token::GtEq => Some(BinaryOperator::GtEq),
3862            Token::Lt => Some(BinaryOperator::Lt),
3863            Token::LtEq => Some(BinaryOperator::LtEq),
3864            Token::Plus => Some(BinaryOperator::Plus),
3865            Token::Minus => Some(BinaryOperator::Minus),
3866            Token::Mul => Some(BinaryOperator::Multiply),
3867            Token::Mod => Some(BinaryOperator::Modulo),
3868            Token::StringConcat => Some(BinaryOperator::StringConcat),
3869            Token::Pipe => Some(BinaryOperator::BitwiseOr),
3870            Token::Caret => {
3871                // In PostgreSQL, ^ stands for the exponentiation operation,
3872                // and # stands for XOR. See https://www.postgresql.org/docs/current/functions-math.html
3873                if dialect_is!(dialect is PostgreSqlDialect) {
3874                    Some(BinaryOperator::PGExp)
3875                } else {
3876                    Some(BinaryOperator::BitwiseXor)
3877                }
3878            }
3879            Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3880            Token::Div => Some(BinaryOperator::Divide),
3881            Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3882                Some(BinaryOperator::DuckIntegerDivide)
3883            }
3884            Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3885                Some(BinaryOperator::PGBitwiseShiftLeft)
3886            }
3887            Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3888                Some(BinaryOperator::PGBitwiseShiftRight)
3889            }
3890            Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3891                Some(BinaryOperator::PGBitwiseXor)
3892            }
3893            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3894                Some(BinaryOperator::PGOverlap)
3895            }
3896            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3897                Some(BinaryOperator::PGOverlap)
3898            }
3899            Token::Overlap if dialect.supports_double_ampersand_operator() => {
3900                Some(BinaryOperator::And)
3901            }
3902            Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3903                Some(BinaryOperator::PGStartsWith)
3904            }
3905            Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3906            Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3907            Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3908            Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3909            Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3910            Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3911            Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3912            Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3913            Token::Arrow => Some(BinaryOperator::Arrow),
3914            Token::LongArrow => Some(BinaryOperator::LongArrow),
3915            Token::HashArrow => Some(BinaryOperator::HashArrow),
3916            Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3917            Token::AtArrow => Some(BinaryOperator::AtArrow),
3918            Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3919            Token::HashMinus => Some(BinaryOperator::HashMinus),
3920            Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3921            Token::AtAt => Some(BinaryOperator::AtAt),
3922            Token::Question => Some(BinaryOperator::Question),
3923            Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3924            Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3925            Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3926            Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3927                Some(BinaryOperator::DoubleHash)
3928            }
3929
3930            Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3931                Some(BinaryOperator::AndLt)
3932            }
3933            Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3934                Some(BinaryOperator::AndGt)
3935            }
3936            Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3937                Some(BinaryOperator::QuestionDash)
3938            }
3939            Token::AmpersandLeftAngleBracketVerticalBar
3940                if self.dialect.supports_geometric_types() =>
3941            {
3942                Some(BinaryOperator::AndLtPipe)
3943            }
3944            Token::VerticalBarAmpersandRightAngleBracket
3945                if self.dialect.supports_geometric_types() =>
3946            {
3947                Some(BinaryOperator::PipeAndGt)
3948            }
3949            Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3950                Some(BinaryOperator::LtDashGt)
3951            }
3952            Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3953                Some(BinaryOperator::LtCaret)
3954            }
3955            Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3956                Some(BinaryOperator::GtCaret)
3957            }
3958            Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3959                Some(BinaryOperator::QuestionHash)
3960            }
3961            Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3962                Some(BinaryOperator::QuestionDoublePipe)
3963            }
3964            Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3965                Some(BinaryOperator::QuestionDashPipe)
3966            }
3967            Token::TildeEqual if self.dialect.supports_geometric_types() => {
3968                Some(BinaryOperator::TildeEq)
3969            }
3970            Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3971                Some(BinaryOperator::LtLtPipe)
3972            }
3973            Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3974                Some(BinaryOperator::PipeGtGt)
3975            }
3976            Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3977
3978            Token::Word(w) => match w.keyword {
3979                Keyword::AND => Some(BinaryOperator::And),
3980                Keyword::OR => Some(BinaryOperator::Or),
3981                Keyword::XOR => Some(BinaryOperator::Xor),
3982                Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3983                Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3984                    // there are special rules for operator names in
3985                    // postgres so we can not use 'parse_object'
3986                    // or similar.
3987                    // See https://www.postgresql.org/docs/current/sql-createoperator.html
3988                    Some(BinaryOperator::PGCustomBinaryOperator(
3989                        self.parse_pg_operator_ident_parts()?,
3990                    ))
3991                }
3992                _ => None,
3993            },
3994            _ => None,
3995        };
3996
3997        let tok = self.token_at(tok_index);
3998        if let Some(op) = regular_binary_operator {
3999            if let Some(keyword) =
4000                self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
4001            {
4002                self.expect_token(&Token::LParen)?;
4003                let right = if self.peek_sub_query() {
4004                    // We have a subquery ahead (SELECT\WITH ...) need to rewind and
4005                    // use the parenthesis for parsing the subquery as an expression.
4006                    self.prev_token(); // LParen
4007                    self.parse_subexpr(precedence)?
4008                } else {
4009                    // Non-subquery expression
4010                    let right = self.parse_subexpr(precedence)?;
4011                    self.expect_token(&Token::RParen)?;
4012                    right
4013                };
4014
4015                if !matches!(
4016                    op,
4017                    BinaryOperator::Gt
4018                        | BinaryOperator::Lt
4019                        | BinaryOperator::GtEq
4020                        | BinaryOperator::LtEq
4021                        | BinaryOperator::Eq
4022                        | BinaryOperator::NotEq
4023                        | BinaryOperator::PGRegexMatch
4024                        | BinaryOperator::PGRegexIMatch
4025                        | BinaryOperator::PGRegexNotMatch
4026                        | BinaryOperator::PGRegexNotIMatch
4027                        | BinaryOperator::PGLikeMatch
4028                        | BinaryOperator::PGILikeMatch
4029                        | BinaryOperator::PGNotLikeMatch
4030                        | BinaryOperator::PGNotILikeMatch
4031                ) {
4032                    return parser_err!(
4033                        format!(
4034                        "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
4035                    ),
4036                        span.start
4037                    );
4038                };
4039
4040                Ok(match keyword {
4041                    Keyword::ALL => Expr::AllOp {
4042                        left: Box::new(expr),
4043                        compare_op: op,
4044                        right: Box::new(right),
4045                    },
4046                    Keyword::ANY | Keyword::SOME => Expr::AnyOp {
4047                        left: Box::new(expr),
4048                        compare_op: op,
4049                        right: Box::new(right),
4050                        is_some: keyword == Keyword::SOME,
4051                    },
4052                    unexpected_keyword => return Err(ParserError::ParserError(
4053                        format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
4054                    )),
4055                })
4056            } else {
4057                Ok(Expr::BinaryOp {
4058                    left: Box::new(expr),
4059                    op,
4060                    right: Box::new(self.parse_subexpr(precedence)?),
4061                })
4062            }
4063        } else if let Token::Word(w) = &tok.token {
4064            match w.keyword {
4065                Keyword::IS => {
4066                    if self.parse_keyword(Keyword::NULL) {
4067                        Ok(Expr::IsNull(Box::new(expr)))
4068                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
4069                        Ok(Expr::IsNotNull(Box::new(expr)))
4070                    } else if self.parse_keywords(&[Keyword::TRUE]) {
4071                        Ok(Expr::IsTrue(Box::new(expr)))
4072                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
4073                        Ok(Expr::IsNotTrue(Box::new(expr)))
4074                    } else if self.parse_keywords(&[Keyword::FALSE]) {
4075                        Ok(Expr::IsFalse(Box::new(expr)))
4076                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
4077                        Ok(Expr::IsNotFalse(Box::new(expr)))
4078                    } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
4079                        Ok(Expr::IsUnknown(Box::new(expr)))
4080                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
4081                        Ok(Expr::IsNotUnknown(Box::new(expr)))
4082                    } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
4083                        // The right operand binds no more loosely than `IS`
4084                        // itself, so that e.g. `a IS DISTINCT FROM b AND c`
4085                        // parses as `(a IS DISTINCT FROM b) AND c`.
4086                        let expr2 = self.parse_subexpr(precedence)?;
4087                        Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
4088                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
4089                    {
4090                        let expr2 = self.parse_subexpr(precedence)?;
4091                        Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
4092                    } else if self.parse_keyword(Keyword::JSON) {
4093                        self.parse_is_json_predicate(expr, false)
4094                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::JSON]) {
4095                        self.parse_is_json_predicate(expr, true)
4096                    } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
4097                        Ok(is_normalized)
4098                    } else {
4099                        self.expected_ref(
4100                            "[NOT] NULL | TRUE | FALSE | DISTINCT | [NOT] JSON [VALUE | SCALAR | ARRAY | OBJECT] [WITH | WITHOUT UNIQUE [KEYS]] | [form] NORMALIZED FROM after IS",
4101                            self.peek_token_ref(),
4102                        )
4103                    }
4104                }
4105                Keyword::AT => {
4106                    self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4107                    Ok(Expr::AtTimeZone {
4108                        timestamp: Box::new(expr),
4109                        time_zone: Box::new(self.parse_subexpr(precedence)?),
4110                    })
4111                }
4112                Keyword::NOT
4113                | Keyword::IN
4114                | Keyword::BETWEEN
4115                | Keyword::LIKE
4116                | Keyword::ILIKE
4117                | Keyword::SIMILAR
4118                | Keyword::REGEXP
4119                | Keyword::RLIKE => {
4120                    self.prev_token();
4121                    let negated = self.parse_keyword(Keyword::NOT);
4122                    let regexp = self.parse_keyword(Keyword::REGEXP);
4123                    let rlike = self.parse_keyword(Keyword::RLIKE);
4124                    let null = if !self.in_column_definition_state() {
4125                        self.parse_keyword(Keyword::NULL)
4126                    } else {
4127                        false
4128                    };
4129                    if regexp || rlike {
4130                        Ok(Expr::RLike {
4131                            negated,
4132                            expr: Box::new(expr),
4133                            pattern: Box::new(
4134                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4135                            ),
4136                            regexp,
4137                        })
4138                    } else if negated && null {
4139                        Ok(Expr::IsNotNull(Box::new(expr)))
4140                    } else if self.parse_keyword(Keyword::IN) {
4141                        self.parse_in(expr, negated)
4142                    } else if self.parse_keyword(Keyword::BETWEEN) {
4143                        self.parse_between(expr, negated)
4144                    } else if self.parse_keyword(Keyword::LIKE) {
4145                        Ok(Expr::Like {
4146                            negated,
4147                            any: self.parse_keyword(Keyword::ANY),
4148                            expr: Box::new(expr),
4149                            pattern: Box::new(
4150                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4151                            ),
4152                            escape_char: self.parse_escape_char()?,
4153                        })
4154                    } else if self.parse_keyword(Keyword::ILIKE) {
4155                        Ok(Expr::ILike {
4156                            negated,
4157                            any: self.parse_keyword(Keyword::ANY),
4158                            expr: Box::new(expr),
4159                            pattern: Box::new(
4160                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4161                            ),
4162                            escape_char: self.parse_escape_char()?,
4163                        })
4164                    } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4165                        Ok(Expr::SimilarTo {
4166                            negated,
4167                            expr: Box::new(expr),
4168                            pattern: Box::new(
4169                                self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4170                            ),
4171                            escape_char: self.parse_escape_char()?,
4172                        })
4173                    } else {
4174                        self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4175                    }
4176                }
4177                Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4178                    Ok(Expr::IsNotNull(Box::new(expr)))
4179                }
4180                Keyword::MEMBER => {
4181                    if self.parse_keyword(Keyword::OF) {
4182                        self.expect_token(&Token::LParen)?;
4183                        let array = self.parse_expr()?;
4184                        self.expect_token(&Token::RParen)?;
4185                        Ok(Expr::MemberOf(MemberOf {
4186                            value: Box::new(expr),
4187                            array: Box::new(array),
4188                        }))
4189                    } else {
4190                        self.expected_ref("OF after MEMBER", self.peek_token_ref())
4191                    }
4192                }
4193                // Can only happen if `get_next_precedence` got out of sync with this function
4194                _ => parser_err!(
4195                    format!("No infix parser for token {:?}", tok.token),
4196                    tok.span.start
4197                ),
4198            }
4199        } else if Token::DoubleColon == *tok {
4200            Ok(Expr::Cast {
4201                kind: CastKind::DoubleColon,
4202                expr: Box::new(expr),
4203                data_type: self.parse_data_type()?,
4204                format: None,
4205            })
4206        } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4207            Ok(Expr::UnaryOp {
4208                op: UnaryOperator::PGPostfixFactorial,
4209                expr: Box::new(expr),
4210            })
4211        } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4212            || (Token::Colon == *tok)
4213        {
4214            self.prev_token();
4215            self.parse_json_access(expr)
4216        } else {
4217            // Can only happen if `get_next_precedence` got out of sync with this function
4218            parser_err!(
4219                format!("No infix parser for token {:?}", tok.token),
4220                tok.span.start
4221            )
4222        }
4223    }
4224
4225    /// Parse the `ESCAPE CHAR` portion of `LIKE`, `ILIKE`, and `SIMILAR TO`
4226    pub fn parse_escape_char(&mut self) -> Result<Option<Box<Expr>>, ParserError> {
4227        if self.parse_keyword(Keyword::ESCAPE) {
4228            Ok(Some(Box::new(self.parse_subexpr(
4229                self.dialect.prec_value(Precedence::Like),
4230            )?)))
4231        } else {
4232            Ok(None)
4233        }
4234    }
4235
4236    /// Parses an array subscript like
4237    /// * `[:]`
4238    /// * `[l]`
4239    /// * `[l:]`
4240    /// * `[:u]`
4241    /// * `[l:u]`
4242    /// * `[l:u:s]`
4243    ///
4244    /// Parser is right after `[`
4245    fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4246        // at either `<lower>:(rest)` or `:(rest)]`
4247        let lower_bound = if self.consume_token(&Token::Colon) {
4248            None
4249        } else {
4250            // parse expr until we hit a colon (or any token with lower precedence)
4251            Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4252        };
4253
4254        // check for end
4255        if self.consume_token(&Token::RBracket) {
4256            if let Some(lower_bound) = lower_bound {
4257                return Ok(Subscript::Index { index: lower_bound });
4258            };
4259            return Ok(Subscript::Slice {
4260                lower_bound,
4261                upper_bound: None,
4262                stride: None,
4263            });
4264        }
4265
4266        // consume the `:`
4267        if lower_bound.is_some() {
4268            self.expect_token(&Token::Colon)?;
4269        }
4270
4271        // we are now at either `]`, `<upper>(rest)]`
4272        let upper_bound = if self.consume_token(&Token::RBracket) {
4273            return Ok(Subscript::Slice {
4274                lower_bound,
4275                upper_bound: None,
4276                stride: None,
4277            });
4278        } else {
4279            // parse expr until we hit a colon (or any token with lower precedence)
4280            Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4281        };
4282
4283        // check for end
4284        if self.consume_token(&Token::RBracket) {
4285            return Ok(Subscript::Slice {
4286                lower_bound,
4287                upper_bound,
4288                stride: None,
4289            });
4290        }
4291
4292        // we are now at `:]` or `:stride]`
4293        self.expect_token(&Token::Colon)?;
4294        let stride = if self.consume_token(&Token::RBracket) {
4295            None
4296        } else {
4297            Some(self.parse_expr()?)
4298        };
4299
4300        if stride.is_some() {
4301            self.expect_token(&Token::RBracket)?;
4302        }
4303
4304        Ok(Subscript::Slice {
4305            lower_bound,
4306            upper_bound,
4307            stride,
4308        })
4309    }
4310
4311    /// Parse a multi-dimension array accessing like `[1:3][1][1]`
4312    pub fn parse_multi_dim_subscript(
4313        &mut self,
4314        chain: &mut Vec<AccessExpr>,
4315    ) -> Result<(), ParserError> {
4316        while self.consume_token(&Token::LBracket) {
4317            self.parse_subscript(chain)?;
4318        }
4319        Ok(())
4320    }
4321
4322    /// Parses an array subscript like `[1:3]`
4323    ///
4324    /// Parser is right after `[`
4325    fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4326        let subscript = self.parse_subscript_inner()?;
4327        chain.push(AccessExpr::Subscript(subscript));
4328        Ok(())
4329    }
4330
4331    fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4332        let token = self.next_token();
4333        match token.token {
4334            Token::Word(Word {
4335                value,
4336                // path segments in SF dot notation can be unquoted or double-quoted;
4337                // Databricks also supports backtick-quoted identifiers
4338                quote_style: quote_style @ (Some('"') | Some('`') | None),
4339                // some experimentation suggests that snowflake permits
4340                // any keyword here unquoted.
4341                keyword: _,
4342            }) => Ok(JsonPathElem::Dot {
4343                key: value,
4344                quoted: quote_style.is_some(),
4345            }),
4346
4347            // This token should never be generated on snowflake or generic
4348            // dialects, but we handle it just in case this is used on future
4349            // dialects.
4350            Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4351
4352            _ => self.expected("variant object key name", token),
4353        }
4354    }
4355
4356    fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4357        let path = self.parse_json_path()?;
4358        Ok(Expr::JsonAccess {
4359            value: Box::new(expr),
4360            path,
4361        })
4362    }
4363
4364    fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4365        let mut path = Vec::new();
4366        loop {
4367            match self.next_token().token {
4368                Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4369                    self.next_token();
4370                    let key = self.parse_wildcard_expr()?;
4371                    self.expect_token(&Token::RBracket)?;
4372                    path.push(JsonPathElem::ColonBracket { key });
4373                }
4374                Token::Colon if path.is_empty() => {
4375                    path.push(self.parse_json_path_object_key()?);
4376                }
4377                Token::Period if !path.is_empty() => {
4378                    path.push(self.parse_json_path_object_key()?);
4379                }
4380                Token::LBracket => {
4381                    let key = self.parse_wildcard_expr()?;
4382                    self.expect_token(&Token::RBracket)?;
4383
4384                    path.push(JsonPathElem::Bracket { key });
4385                }
4386                _ => {
4387                    self.prev_token();
4388                    break;
4389                }
4390            };
4391        }
4392
4393        debug_assert!(!path.is_empty());
4394        Ok(JsonPath { path })
4395    }
4396
4397    /// Parses the parens following the `[ NOT ] IN` operator.
4398    pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4399        // BigQuery allows `IN UNNEST(array_expression)`
4400        // https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#in_operators
4401        if self.parse_keyword(Keyword::UNNEST) {
4402            self.expect_token(&Token::LParen)?;
4403            let array_expr = self.parse_expr()?;
4404            self.expect_token(&Token::RParen)?;
4405            return Ok(Expr::InUnnest {
4406                expr: Box::new(expr),
4407                array_expr: Box::new(array_expr),
4408                negated,
4409            });
4410        }
4411        if self.dialect.supports_in_unparenthesized_expr()
4412            && self.peek_token_ref().token != Token::LParen
4413        {
4414            return Ok(Expr::InList {
4415                expr: Box::new(expr),
4416                list: vec![self.parse_expr()?],
4417                negated,
4418            });
4419        }
4420        self.expect_token(&Token::LParen)?;
4421        let in_op = match self.maybe_parse(|p| p.parse_query())? {
4422            Some(subquery) => Expr::InSubquery {
4423                expr: Box::new(expr),
4424                subquery,
4425                negated,
4426            },
4427            None => Expr::InList {
4428                expr: Box::new(expr),
4429                list: if self.dialect.supports_in_empty_list() {
4430                    self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4431                } else {
4432                    self.parse_comma_separated(Parser::parse_expr)?
4433                },
4434                negated,
4435            },
4436        };
4437        self.expect_token(&Token::RParen)?;
4438        Ok(in_op)
4439    }
4440
4441    /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed.
4442    pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4443        // Stop parsing subexpressions for <low> and <high> on tokens with
4444        // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
4445        let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4446        self.expect_keyword_is(Keyword::AND)?;
4447        let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4448        Ok(Expr::Between {
4449            expr: Box::new(expr),
4450            negated,
4451            low: Box::new(low),
4452            high: Box::new(high),
4453        })
4454    }
4455
4456    /// Parse a PostgreSQL casting style which is in the form of `expr::datatype`.
4457    pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4458        Ok(Expr::Cast {
4459            kind: CastKind::DoubleColon,
4460            expr: Box::new(expr),
4461            data_type: self.parse_data_type()?,
4462            format: None,
4463        })
4464    }
4465
4466    /// Get the precedence of the next token
4467    pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4468        self.dialect.get_next_precedence_default(self)
4469    }
4470
4471    /// Return the token at the given location, or EOF if the index is beyond
4472    /// the length of the current set of tokens.
4473    pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4474        self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4475    }
4476
4477    /// Return the first non-whitespace token that has not yet been processed
4478    /// or Token::EOF
4479    ///
4480    /// See [`Self::peek_token_ref`] to avoid the copy.
4481    pub fn peek_token(&self) -> TokenWithSpan {
4482        self.peek_nth_token(0)
4483    }
4484
4485    /// Return a reference to the first non-whitespace token that has not yet
4486    /// been processed or Token::EOF
4487    pub fn peek_token_ref(&self) -> &TokenWithSpan {
4488        self.peek_nth_token_ref(0)
4489    }
4490
4491    /// Returns the `N` next non-whitespace tokens that have not yet been
4492    /// processed.
4493    ///
4494    /// Example:
4495    /// ```rust
4496    /// # use sqlparser::dialect::GenericDialect;
4497    /// # use sqlparser::parser::Parser;
4498    /// # use sqlparser::keywords::Keyword;
4499    /// # use sqlparser::tokenizer::{Token, Word};
4500    /// let dialect = GenericDialect {};
4501    /// let mut parser = Parser::new(&dialect).try_with_sql("ORDER BY foo, bar").unwrap();
4502    ///
4503    /// // Note that Rust infers the number of tokens to peek based on the
4504    /// // length of the slice pattern!
4505    /// assert!(matches!(
4506    ///     parser.peek_tokens(),
4507    ///     [
4508    ///         Token::Word(Word { keyword: Keyword::ORDER, .. }),
4509    ///         Token::Word(Word { keyword: Keyword::BY, .. }),
4510    ///     ]
4511    /// ));
4512    /// ```
4513    pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4514        self.peek_tokens_with_location()
4515            .map(|with_loc| with_loc.token)
4516    }
4517
4518    /// Returns the `N` next non-whitespace tokens with locations that have not
4519    /// yet been processed.
4520    ///
4521    /// See [`Self::peek_token`] for an example.
4522    pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4523        let mut index = self.index;
4524        core::array::from_fn(|_| loop {
4525            let token = self.tokens.get(index);
4526            index += 1;
4527            if let Some(TokenWithSpan {
4528                token: Token::Whitespace(_),
4529                span: _,
4530            }) = token
4531            {
4532                continue;
4533            }
4534            break token.cloned().unwrap_or(TokenWithSpan {
4535                token: Token::EOF,
4536                span: Span::empty(),
4537            });
4538        })
4539    }
4540
4541    /// Returns references to the `N` next non-whitespace tokens
4542    /// that have not yet been processed.
4543    ///
4544    /// See [`Self::peek_tokens`] for an example.
4545    pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4546        let mut index = self.index;
4547        core::array::from_fn(|_| loop {
4548            let token = self.tokens.get(index);
4549            index += 1;
4550            if let Some(TokenWithSpan {
4551                token: Token::Whitespace(_),
4552                span: _,
4553            }) = token
4554            {
4555                continue;
4556            }
4557            break token.unwrap_or(&EOF_TOKEN);
4558        })
4559    }
4560
4561    /// Return nth non-whitespace token that has not yet been processed
4562    pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4563        self.peek_nth_token_ref(n).clone()
4564    }
4565
4566    /// Return nth non-whitespace token that has not yet been processed
4567    pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4568        let mut index = self.index;
4569        loop {
4570            index += 1;
4571            match self.tokens.get(index - 1) {
4572                Some(TokenWithSpan {
4573                    token: Token::Whitespace(_),
4574                    span: _,
4575                }) => continue,
4576                non_whitespace => {
4577                    if n == 0 {
4578                        return non_whitespace.unwrap_or(&EOF_TOKEN);
4579                    }
4580                    n -= 1;
4581                }
4582            }
4583        }
4584    }
4585
4586    /// Return the first token, possibly whitespace, that has not yet been processed
4587    /// (or None if reached end-of-file).
4588    pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4589        self.peek_nth_token_no_skip(0)
4590    }
4591
4592    /// Return nth token, possibly whitespace, that has not yet been processed.
4593    pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4594        self.tokens
4595            .get(self.index + n)
4596            .cloned()
4597            .unwrap_or(TokenWithSpan {
4598                token: Token::EOF,
4599                span: Span::empty(),
4600            })
4601    }
4602
4603    /// Return nth token, possibly whitespace, that has not yet been processed.
4604    fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4605        self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4606    }
4607
4608    /// Return true if the next tokens exactly `expected`
4609    ///
4610    /// Does not advance the current token.
4611    fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4612        let index = self.index;
4613        let matched = self.parse_keywords(expected);
4614        self.index = index;
4615        matched
4616    }
4617
4618    /// Advances to the next non-whitespace token and returns a copy.
4619    ///
4620    /// Please use [`Self::advance_token`] and [`Self::get_current_token`] to
4621    /// avoid the copy.
4622    pub fn next_token(&mut self) -> TokenWithSpan {
4623        self.advance_token();
4624        self.get_current_token().clone()
4625    }
4626
4627    /// Returns the index of the current token
4628    ///
4629    /// This can be used with APIs that expect an index, such as
4630    /// [`Self::token_at`]
4631    pub fn get_current_index(&self) -> usize {
4632        self.index.saturating_sub(1)
4633    }
4634
4635    /// Return the next unprocessed token, possibly whitespace.
4636    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4637        self.index += 1;
4638        self.tokens.get(self.index - 1)
4639    }
4640
4641    /// Advances the current token to the next non-whitespace token
4642    ///
4643    /// See [`Self::get_current_token`] to get the current token after advancing
4644    pub fn advance_token(&mut self) {
4645        loop {
4646            self.index += 1;
4647            match self.tokens.get(self.index - 1) {
4648                Some(TokenWithSpan {
4649                    token: Token::Whitespace(_),
4650                    span: _,
4651                }) => continue,
4652                _ => break,
4653            }
4654        }
4655    }
4656
4657    /// Returns a reference to the current token
4658    ///
4659    /// Does not advance the current token.
4660    pub fn get_current_token(&self) -> &TokenWithSpan {
4661        self.token_at(self.index.saturating_sub(1))
4662    }
4663
4664    /// Returns a reference to the previous token
4665    ///
4666    /// Does not advance the current token.
4667    pub fn get_previous_token(&self) -> &TokenWithSpan {
4668        self.token_at(self.index.saturating_sub(2))
4669    }
4670
4671    /// Returns a reference to the next token
4672    ///
4673    /// Does not advance the current token.
4674    pub fn get_next_token(&self) -> &TokenWithSpan {
4675        self.token_at(self.index)
4676    }
4677
4678    /// Seek back the last one non-whitespace token.
4679    ///
4680    /// Must be called after `next_token()`, otherwise might panic. OK to call
4681    /// after `next_token()` indicates an EOF.
4682    ///
4683    // TODO rename to backup_token and deprecate prev_token?
4684    pub fn prev_token(&mut self) {
4685        loop {
4686            assert!(self.index > 0);
4687            self.index -= 1;
4688            if let Some(TokenWithSpan {
4689                token: Token::Whitespace(_),
4690                span: _,
4691            }) = self.tokens.get(self.index)
4692            {
4693                continue;
4694            }
4695            return;
4696        }
4697    }
4698
4699    /// Report `found` was encountered instead of `expected`
4700    pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4701        parser_err!(
4702            format!("Expected: {expected}, found: {found}"),
4703            found.span.start
4704        )
4705    }
4706
4707    /// report `found` was encountered instead of `expected`
4708    pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4709        parser_err!(
4710            format!("Expected: {expected}, found: {found}"),
4711            found.span.start
4712        )
4713    }
4714
4715    /// Report that the token at `index` was found instead of `expected`.
4716    pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4717        let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4718        parser_err!(
4719            format!("Expected: {expected}, found: {found}"),
4720            found.span.start
4721        )
4722    }
4723
4724    /// If the current token is the `expected` keyword, consume it and returns
4725    /// true. Otherwise, no tokens are consumed and returns false.
4726    #[must_use]
4727    pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4728        if self.peek_keyword(expected) {
4729            self.advance_token();
4730            true
4731        } else {
4732            false
4733        }
4734    }
4735
4736    #[must_use]
4737    /// Check if the current token is the expected keyword without consuming it.
4738    ///
4739    /// Returns true if the current token matches the expected keyword.
4740    pub fn peek_keyword(&self, expected: Keyword) -> bool {
4741        matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4742    }
4743
4744    /// If the current token is the `expected` keyword followed by
4745    /// specified tokens, consume them and returns true.
4746    /// Otherwise, no tokens are consumed and returns false.
4747    ///
4748    /// Note that if the length of `tokens` is too long, this function will
4749    /// not be efficient as it does a loop on the tokens with `peek_nth_token`
4750    /// each time.
4751    pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4752        self.keyword_with_tokens(expected, tokens, true)
4753    }
4754
4755    /// Peeks to see if the current token is the `expected` keyword followed by specified tokens
4756    /// without consuming them.
4757    ///
4758    /// See [Self::parse_keyword_with_tokens] for details.
4759    pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4760        self.keyword_with_tokens(expected, tokens, false)
4761    }
4762
4763    fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4764        match &self.peek_token_ref().token {
4765            Token::Word(w) if expected == w.keyword => {
4766                for (idx, token) in tokens.iter().enumerate() {
4767                    if self.peek_nth_token_ref(idx + 1).token != *token {
4768                        return false;
4769                    }
4770                }
4771
4772                if consume {
4773                    for _ in 0..(tokens.len() + 1) {
4774                        self.advance_token();
4775                    }
4776                }
4777
4778                true
4779            }
4780            _ => false,
4781        }
4782    }
4783
4784    /// If the current and subsequent tokens exactly match the `keywords`
4785    /// sequence, consume them and returns true. Otherwise, no tokens are
4786    /// consumed and returns false
4787    #[must_use]
4788    pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4789        self.parse_keywords_indexed(keywords).is_some()
4790    }
4791
4792    /// Just like [Self::parse_keywords], but - upon success - returns the
4793    /// token index of the first keyword.
4794    #[must_use]
4795    fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4796        let start_index = self.index;
4797        let mut first_keyword_index = None;
4798        for &keyword in keywords {
4799            if !self.parse_keyword(keyword) {
4800                self.index = start_index;
4801                return None;
4802            }
4803            if first_keyword_index.is_none() {
4804                first_keyword_index = Some(self.index.saturating_sub(1));
4805            }
4806        }
4807        first_keyword_index
4808    }
4809
4810    /// If the current token is one of the given `keywords`, returns the keyword
4811    /// that matches, without consuming the token. Otherwise, returns [`None`].
4812    #[must_use]
4813    pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4814        for keyword in keywords {
4815            if self.peek_keyword(*keyword) {
4816                return Some(*keyword);
4817            }
4818        }
4819        None
4820    }
4821
4822    /// If the current token is one of the given `keywords`, consume the token
4823    /// and return the keyword that matches. Otherwise, no tokens are consumed
4824    /// and returns [`None`].
4825    #[must_use]
4826    pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4827        match &self.peek_token_ref().token {
4828            Token::Word(w) => {
4829                keywords
4830                    .iter()
4831                    .find(|keyword| **keyword == w.keyword)
4832                    .map(|keyword| {
4833                        self.advance_token();
4834                        *keyword
4835                    })
4836            }
4837            _ => None,
4838        }
4839    }
4840
4841    /// If the current token is one of the expected keywords, consume the token
4842    /// and return the keyword that matches. Otherwise, return an error.
4843    pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4844        if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4845            Ok(keyword)
4846        } else {
4847            let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4848            self.expected_ref(
4849                &format!("one of {}", keywords.join(" or ")),
4850                self.peek_token_ref(),
4851            )
4852        }
4853    }
4854
4855    /// If the current token is the `expected` keyword, consume the token.
4856    /// Otherwise, return an error.
4857    ///
4858    // todo deprecate in favor of expected_keyword_is
4859    pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4860        if self.parse_keyword(expected) {
4861            Ok(self.get_current_token().clone())
4862        } else {
4863            self.expected_ref(format!("{:?}", expected).as_str(), self.peek_token_ref())
4864        }
4865    }
4866
4867    /// If the current token is the `expected` keyword, consume the token.
4868    /// Otherwise, return an error.
4869    ///
4870    /// This differs from expect_keyword only in that the matched keyword
4871    /// token is not returned.
4872    pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4873        if self.parse_keyword(expected) {
4874            Ok(())
4875        } else {
4876            self.expected_ref(format!("{:?}", expected).as_str(), self.peek_token_ref())
4877        }
4878    }
4879
4880    /// If the current and subsequent tokens exactly match the `keywords`
4881    /// sequence, consume them and returns Ok. Otherwise, return an Error.
4882    pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4883        for &kw in expected {
4884            self.expect_keyword_is(kw)?;
4885        }
4886        Ok(())
4887    }
4888
4889    /// Consume the next token if it matches the expected token, otherwise return false
4890    ///
4891    /// See [Self::advance_token] to consume the token unconditionally
4892    #[must_use]
4893    pub fn consume_token(&mut self, expected: &Token) -> bool {
4894        if self.peek_token_ref() == expected {
4895            self.advance_token();
4896            true
4897        } else {
4898            false
4899        }
4900    }
4901
4902    /// If the current and subsequent tokens exactly match the `tokens`
4903    /// sequence, consume them and returns true. Otherwise, no tokens are
4904    /// consumed and returns false
4905    #[must_use]
4906    pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4907        let index = self.index;
4908        for token in tokens {
4909            if !self.consume_token(token) {
4910                self.index = index;
4911                return false;
4912            }
4913        }
4914        true
4915    }
4916
4917    /// Bail out if the current token is not an expected keyword, or consume it if it is
4918    pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4919        if self.peek_token_ref() == expected {
4920            Ok(self.next_token())
4921        } else {
4922            self.expected_ref(&expected.to_string(), self.peek_token_ref())
4923        }
4924    }
4925
4926    fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4927    where
4928        <T as FromStr>::Err: Display,
4929    {
4930        s.parse::<T>().map_err(|e| {
4931            ParserError::ParserError(format!(
4932                "Could not parse '{s}' as {}: {e}{loc}",
4933                core::any::type_name::<T>()
4934            ))
4935        })
4936    }
4937
4938    /// Parse a comma-separated list of 1+ SelectItem
4939    pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4940        // BigQuery and Snowflake allow trailing commas, but only in project lists
4941        // e.g. `SELECT 1, 2, FROM t`
4942        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#trailing_commas
4943        // https://docs.snowflake.com/en/release-notes/2024/8_11#select-supports-trailing-commas
4944
4945        let trailing_commas =
4946            self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4947
4948        self.parse_comma_separated_with_trailing_commas(
4949            |p| p.parse_select_item(),
4950            trailing_commas,
4951            Self::is_reserved_for_column_alias,
4952        )
4953    }
4954
4955    /// Parse a list of actions for `GRANT` statements.
4956    pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4957        let mut values = vec![];
4958        loop {
4959            values.push(self.parse_grant_permission()?);
4960            if !self.consume_token(&Token::Comma) {
4961                break;
4962            } else if self.options.trailing_commas {
4963                match &self.peek_token_ref().token {
4964                    Token::Word(kw) if kw.keyword == Keyword::ON => {
4965                        break;
4966                    }
4967                    Token::RParen
4968                    | Token::SemiColon
4969                    | Token::EOF
4970                    | Token::RBracket
4971                    | Token::RBrace => break,
4972                    _ => continue,
4973                }
4974            }
4975        }
4976        Ok(values)
4977    }
4978
4979    /// Parse a list of [TableWithJoins]
4980    fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4981        let trailing_commas = self.dialect.supports_from_trailing_commas();
4982
4983        self.parse_comma_separated_with_trailing_commas(
4984            Parser::parse_table_and_joins,
4985            trailing_commas,
4986            |kw, parser| !self.dialect.is_table_factor(kw, parser),
4987        )
4988    }
4989
4990    /// Parse the comma of a comma-separated syntax element.
4991    /// `R` is a predicate that should return true if the next
4992    /// keyword is a reserved keyword.
4993    /// Allows for control over trailing commas
4994    ///
4995    /// Returns true if there is a next element
4996    fn is_parse_comma_separated_end_with_trailing_commas<R>(
4997        &mut self,
4998        trailing_commas: bool,
4999        is_reserved_keyword: &R,
5000    ) -> bool
5001    where
5002        R: Fn(&Keyword, &mut Parser) -> bool,
5003    {
5004        if !self.consume_token(&Token::Comma) {
5005            true
5006        } else if trailing_commas {
5007            let token = self.next_token().token;
5008            let is_end = match token {
5009                Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
5010                Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
5011                    true
5012                }
5013                _ => false,
5014            };
5015            self.prev_token();
5016
5017            is_end
5018        } else {
5019            false
5020        }
5021    }
5022
5023    /// Parse the comma of a comma-separated syntax element.
5024    /// Returns true if there is a next element
5025    fn is_parse_comma_separated_end(&mut self) -> bool {
5026        self.is_parse_comma_separated_end_with_trailing_commas(
5027            self.options.trailing_commas,
5028            &Self::is_reserved_for_column_alias,
5029        )
5030    }
5031
5032    /// Parse a comma-separated list of 1+ items accepted by `F`
5033    pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
5034    where
5035        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5036    {
5037        self.parse_comma_separated_with_trailing_commas(
5038            f,
5039            self.options.trailing_commas,
5040            Self::is_reserved_for_column_alias,
5041        )
5042    }
5043
5044    /// Parse a comma-separated list of 1+ items accepted by `F`.
5045    /// `R` is a predicate that should return true if the next
5046    /// keyword is a reserved keyword.
5047    /// Allows for control over trailing commas.
5048    fn parse_comma_separated_with_trailing_commas<T, F, R>(
5049        &mut self,
5050        mut f: F,
5051        trailing_commas: bool,
5052        is_reserved_keyword: R,
5053    ) -> Result<Vec<T>, ParserError>
5054    where
5055        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5056        R: Fn(&Keyword, &mut Parser) -> bool,
5057    {
5058        let mut values = vec![];
5059        loop {
5060            values.push(f(self)?);
5061            if self.is_parse_comma_separated_end_with_trailing_commas(
5062                trailing_commas,
5063                &is_reserved_keyword,
5064            ) {
5065                break;
5066            }
5067        }
5068        Ok(values)
5069    }
5070
5071    /// Parse a period-separated list of 1+ items accepted by `F`
5072    fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
5073    where
5074        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5075    {
5076        let mut values = vec![];
5077        loop {
5078            values.push(f(self)?);
5079            if !self.consume_token(&Token::Period) {
5080                break;
5081            }
5082        }
5083        Ok(values)
5084    }
5085
5086    /// Parse a keyword-separated list of 1+ items accepted by `F`
5087    pub fn parse_keyword_separated<T, F>(
5088        &mut self,
5089        keyword: Keyword,
5090        mut f: F,
5091    ) -> Result<Vec<T>, ParserError>
5092    where
5093        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5094    {
5095        let mut values = vec![];
5096        loop {
5097            values.push(f(self)?);
5098            if !self.parse_keyword(keyword) {
5099                break;
5100            }
5101        }
5102        Ok(values)
5103    }
5104
5105    /// Parse an expression enclosed in parentheses.
5106    pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5107    where
5108        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5109    {
5110        self.expect_token(&Token::LParen)?;
5111        let res = f(self)?;
5112        self.expect_token(&Token::RParen)?;
5113        Ok(res)
5114    }
5115
5116    /// Parse a comma-separated list of 0+ items accepted by `F`
5117    /// * `end_token` - expected end token for the closure (e.g. [Token::RParen], [Token::RBrace] ...)
5118    pub fn parse_comma_separated0<T, F>(
5119        &mut self,
5120        f: F,
5121        end_token: Token,
5122    ) -> Result<Vec<T>, ParserError>
5123    where
5124        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5125    {
5126        if self.peek_token_ref().token == end_token {
5127            return Ok(vec![]);
5128        }
5129
5130        if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5131            let _ = self.consume_token(&Token::Comma);
5132            return Ok(vec![]);
5133        }
5134
5135        self.parse_comma_separated(f)
5136    }
5137
5138    /// Parses 0 or more statements, each followed by a semicolon.
5139    /// If the next token is any of `terminal_keywords` then no more
5140    /// statements will be parsed.
5141    pub(crate) fn parse_statement_list(
5142        &mut self,
5143        terminal_keywords: &[Keyword],
5144    ) -> Result<Vec<Statement>, ParserError> {
5145        let mut values = vec![];
5146        loop {
5147            match &self.peek_nth_token_ref(0).token {
5148                Token::EOF => break,
5149                Token::Word(w)
5150                    if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5151                {
5152                    break;
5153                }
5154                _ => {}
5155            }
5156
5157            values.push(self.parse_statement()?);
5158            self.expect_token(&Token::SemiColon)?;
5159        }
5160        Ok(values)
5161    }
5162
5163    /// Default implementation of a predicate that returns true if
5164    /// the specified keyword is reserved for column alias.
5165    /// See [Dialect::is_column_alias]
5166    fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5167        !parser.dialect.is_column_alias(kw, parser)
5168    }
5169
5170    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
5171    /// Returns `ParserError::RecursionLimitExceeded` if `f` returns a `RecursionLimitExceeded`.
5172    /// Returns `Ok(None)` if `f` returns any other error.
5173    pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5174    where
5175        F: FnMut(&mut Parser) -> Result<T, ParserError>,
5176    {
5177        match self.try_parse(f) {
5178            Ok(t) => Ok(Some(t)),
5179            Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5180            _ => Ok(None),
5181        }
5182    }
5183
5184    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
5185    pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5186    where
5187        F: FnMut(&mut Parser) -> Result<T, ParserError>,
5188    {
5189        let index = self.index;
5190        match f(self) {
5191            Ok(t) => Ok(t),
5192            Err(e) => {
5193                // Unwind stack if limit exceeded
5194                self.index = index;
5195                Err(e)
5196            }
5197        }
5198    }
5199
5200    /// Parse either `ALL`, `DISTINCT` or `DISTINCT ON (...)`. Returns [`None`] if `ALL` is parsed
5201    /// and results in a [`ParserError`] if both `ALL` and `DISTINCT` are found.
5202    pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5203        let loc = self.peek_token_ref().span.start;
5204        let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5205            Some(Keyword::ALL) => {
5206                if self.peek_keyword(Keyword::DISTINCT) {
5207                    return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5208                }
5209                Some(Distinct::All)
5210            }
5211            Some(Keyword::DISTINCT) => {
5212                if self.peek_keyword(Keyword::ALL) {
5213                    return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5214                }
5215                Some(Distinct::Distinct)
5216            }
5217            None => return Ok(None),
5218            _ => return parser_err!("ALL or DISTINCT", loc),
5219        };
5220
5221        let Some(Distinct::Distinct) = distinct else {
5222            return Ok(distinct);
5223        };
5224        if !self.parse_keyword(Keyword::ON) {
5225            return Ok(Some(Distinct::Distinct));
5226        }
5227
5228        self.expect_token(&Token::LParen)?;
5229        let col_names = if self.consume_token(&Token::RParen) {
5230            self.prev_token();
5231            Vec::new()
5232        } else {
5233            self.parse_comma_separated(Parser::parse_expr)?
5234        };
5235        self.expect_token(&Token::RParen)?;
5236        Ok(Some(Distinct::On(col_names)))
5237    }
5238
5239    /// Parse a SQL CREATE statement
5240    pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5241        let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5242        let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5243        let multiset = self.maybe_parse_multiset();
5244        let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5245        let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5246        let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5247        let global: Option<bool> = if global {
5248            Some(true)
5249        } else if local {
5250            Some(false)
5251        } else {
5252            None
5253        };
5254        let temporary = self
5255            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5256            .is_some();
5257        let volatile = self.parse_keyword(Keyword::VOLATILE);
5258        let unlogged = self.peek_keywords(&[Keyword::UNLOGGED, Keyword::TABLE]);
5259        if unlogged {
5260            self.expect_keyword(Keyword::UNLOGGED)?;
5261        }
5262        let persistent = dialect_of!(self is DuckDbDialect)
5263            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5264        let create_view_params = self.parse_create_view_params()?;
5265        if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5266            self.parse_create_snapshot_table().map(Into::into)
5267        } else if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5268            self.parse_create_text_search().map(Into::into)
5269        } else if self.parse_keyword(Keyword::TABLE) {
5270            self.parse_create_table(
5271                or_replace, temporary, unlogged, global, transient, volatile, multiset,
5272            )
5273            .map(Into::into)
5274        } else if self.peek_keyword(Keyword::MATERIALIZED)
5275            || self.peek_keyword(Keyword::VIEW)
5276            || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5277            || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5278        {
5279            self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5280                .map(Into::into)
5281        } else if self.parse_keyword(Keyword::POLICY) {
5282            self.parse_create_policy().map(Into::into)
5283        } else if self.parse_keyword(Keyword::EXTERNAL) {
5284            self.parse_create_external_table(or_replace).map(Into::into)
5285        } else if self.parse_keyword(Keyword::FUNCTION) {
5286            self.parse_create_function(or_alter, or_replace, temporary)
5287        } else if self.parse_keyword(Keyword::DOMAIN) {
5288            self.parse_create_domain().map(Into::into)
5289        } else if self.parse_keyword(Keyword::TRIGGER) {
5290            self.parse_create_trigger(temporary, or_alter, or_replace, false)
5291                .map(Into::into)
5292        } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5293            self.parse_create_trigger(temporary, or_alter, or_replace, true)
5294                .map(Into::into)
5295        } else if self.parse_keyword(Keyword::MACRO) {
5296            self.parse_create_macro(or_replace, temporary)
5297        } else if self.parse_keyword(Keyword::SECRET) {
5298            self.parse_create_secret(or_replace, temporary, persistent)
5299        } else if self.parse_keyword(Keyword::USER) {
5300            self.parse_create_user(or_replace).map(Into::into)
5301        } else if self.parse_keyword(Keyword::SCHEMA) {
5302            self.parse_create_schema(or_replace)
5303        } else if self.parse_keyword(Keyword::WAREHOUSE) {
5304            self.parse_create_warehouse(or_replace).map(Into::into)
5305        } else if or_replace {
5306            self.expected_ref(
5307                "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION or SCHEMA or WAREHOUSE after CREATE OR REPLACE",
5308                self.peek_token_ref(),
5309            )
5310        } else if self.parse_keyword(Keyword::EXTENSION) {
5311            self.parse_create_extension().map(Into::into)
5312        } else if self.parse_keyword(Keyword::INDEX) {
5313            self.parse_create_index(false).map(Into::into)
5314        } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5315            self.parse_create_index(true).map(Into::into)
5316        } else if self.parse_keyword(Keyword::VIRTUAL) {
5317            self.parse_create_virtual_table()
5318        } else if self.parse_keyword(Keyword::DATABASE) {
5319            self.parse_create_database()
5320        } else if self.parse_keyword(Keyword::ROLE) {
5321            self.parse_create_role().map(Into::into)
5322        } else if self.parse_keyword(Keyword::SEQUENCE) {
5323            self.parse_create_sequence(temporary)
5324        } else if self.parse_keyword(Keyword::COLLATION) {
5325            self.parse_create_collation().map(Into::into)
5326        } else if self.parse_keyword(Keyword::TYPE) {
5327            self.parse_create_type()
5328        } else if self.parse_keyword(Keyword::PROCEDURE) {
5329            self.parse_create_procedure(or_alter)
5330        } else if self.parse_keyword(Keyword::CONNECTOR) {
5331            self.parse_create_connector().map(Into::into)
5332        } else if self.parse_keyword(Keyword::OPERATOR) {
5333            // Check if this is CREATE OPERATOR FAMILY or CREATE OPERATOR CLASS
5334            if self.parse_keyword(Keyword::FAMILY) {
5335                self.parse_create_operator_family().map(Into::into)
5336            } else if self.parse_keyword(Keyword::CLASS) {
5337                self.parse_create_operator_class().map(Into::into)
5338            } else {
5339                self.parse_create_operator().map(Into::into)
5340            }
5341        } else if self.parse_keyword(Keyword::SERVER) {
5342            self.parse_pg_create_server()
5343        } else {
5344            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5345        }
5346    }
5347
5348    fn parse_text_search_object_type(&mut self) -> Result<TextSearchObjectType, ParserError> {
5349        match self.expect_one_of_keywords(&[
5350            Keyword::DICTIONARY,
5351            Keyword::CONFIGURATION,
5352            Keyword::TEMPLATE,
5353            Keyword::PARSER,
5354        ])? {
5355            Keyword::DICTIONARY => Ok(TextSearchObjectType::Dictionary),
5356            Keyword::CONFIGURATION => Ok(TextSearchObjectType::Configuration),
5357            Keyword::TEMPLATE => Ok(TextSearchObjectType::Template),
5358            Keyword::PARSER => Ok(TextSearchObjectType::Parser),
5359            unexpected_keyword => Err(ParserError::ParserError(format!(
5360                "Internal parser error: expected any of {{DICTIONARY, CONFIGURATION, TEMPLATE, PARSER}}, got {unexpected_keyword:?}"
5361            ))),
5362        }
5363    }
5364
5365    /// Parse a `CREATE TEXT SEARCH ...` statement.
5366    pub fn parse_create_text_search(&mut self) -> Result<CreateTextSearch, ParserError> {
5367        self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
5368        let object_type = self.parse_text_search_object_type()?;
5369        let name = self.parse_object_name(false)?;
5370        self.expect_token(&Token::LParen)?;
5371        let options = self.parse_comma_separated(Parser::parse_sql_option)?;
5372        self.expect_token(&Token::RParen)?;
5373        Ok(CreateTextSearch {
5374            object_type,
5375            name,
5376            options,
5377        })
5378    }
5379
5380    fn parse_alter_text_search_option(&mut self) -> Result<AlterTextSearchOption, ParserError> {
5381        let key = self.parse_identifier()?;
5382        let value = if self.consume_token(&Token::Eq) {
5383            Some(self.parse_expr()?)
5384        } else {
5385            None
5386        };
5387        Ok(AlterTextSearchOption { key, value })
5388    }
5389
5390    /// Parse an `ALTER TEXT SEARCH ...` statement.
5391    pub fn parse_alter_text_search(&mut self) -> Result<AlterTextSearch, ParserError> {
5392        self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
5393        let object_type = self.parse_text_search_object_type()?;
5394        let name = self.parse_object_name(false)?;
5395
5396        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5397            AlterTextSearchOperation::RenameTo {
5398                new_name: self.parse_identifier()?,
5399            }
5400        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
5401            AlterTextSearchOperation::OwnerTo(self.parse_owner()?)
5402        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5403            AlterTextSearchOperation::SetSchema {
5404                schema_name: self.parse_object_name(false)?,
5405            }
5406        } else if self.consume_token(&Token::LParen) {
5407            let options = self.parse_comma_separated(Parser::parse_alter_text_search_option)?;
5408            self.expect_token(&Token::RParen)?;
5409            AlterTextSearchOperation::SetOptions { options }
5410        } else {
5411            let expected = "RENAME TO, OWNER TO, SET SCHEMA, or (...) after ALTER TEXT SEARCH";
5412            return self.expected_ref(expected, self.peek_token_ref());
5413        };
5414
5415        Ok(AlterTextSearch {
5416            object_type,
5417            name,
5418            operation,
5419        })
5420    }
5421
5422    fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5423        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5424        let name = self.parse_identifier()?;
5425        let options = self
5426            .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5427            .options;
5428        let with_tags = self.parse_keyword(Keyword::WITH);
5429        let tags = if self.parse_keyword(Keyword::TAG) {
5430            self.parse_key_value_options(true, &[])?.options
5431        } else {
5432            vec![]
5433        };
5434        Ok(CreateUser {
5435            or_replace,
5436            if_not_exists,
5437            name,
5438            options: KeyValueOptions {
5439                options,
5440                delimiter: KeyValueOptionsDelimiter::Space,
5441            },
5442            with_tags,
5443            tags: KeyValueOptions {
5444                options: tags,
5445                delimiter: KeyValueOptionsDelimiter::Comma,
5446            },
5447        })
5448    }
5449
5450    /// Parse a `CREATE WAREHOUSE` statement.
5451    ///
5452    /// See <https://docs.snowflake.com/en/sql-reference/sql/create-warehouse>
5453    fn parse_create_warehouse(&mut self, or_replace: bool) -> Result<CreateWarehouse, ParserError> {
5454        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5455        let name = self.parse_object_name(false)?;
5456        let _ = self.parse_keyword(Keyword::WITH);
5457        let options = self.parse_key_value_options(false, &[])?;
5458        Ok(CreateWarehouse {
5459            or_replace,
5460            if_not_exists,
5461            name,
5462            options,
5463        })
5464    }
5465
5466    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
5467    pub fn parse_create_secret(
5468        &mut self,
5469        or_replace: bool,
5470        temporary: bool,
5471        persistent: bool,
5472    ) -> Result<Statement, ParserError> {
5473        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5474
5475        let mut storage_specifier = None;
5476        let mut name = None;
5477        if self.peek_token_ref().token != Token::LParen {
5478            if self.parse_keyword(Keyword::IN) {
5479                storage_specifier = self.parse_identifier().ok()
5480            } else {
5481                name = self.parse_identifier().ok();
5482            }
5483
5484            // Storage specifier may follow the name
5485            if storage_specifier.is_none()
5486                && self.peek_token_ref().token != Token::LParen
5487                && self.parse_keyword(Keyword::IN)
5488            {
5489                storage_specifier = self.parse_identifier().ok();
5490            }
5491        }
5492
5493        self.expect_token(&Token::LParen)?;
5494        self.expect_keyword_is(Keyword::TYPE)?;
5495        let secret_type = self.parse_identifier()?;
5496
5497        let mut options = Vec::new();
5498        if self.consume_token(&Token::Comma) {
5499            options.append(&mut self.parse_comma_separated(|p| {
5500                let key = p.parse_identifier()?;
5501                let value = p.parse_identifier()?;
5502                Ok(SecretOption { key, value })
5503            })?);
5504        }
5505        self.expect_token(&Token::RParen)?;
5506
5507        let temp = match (temporary, persistent) {
5508            (true, false) => Some(true),
5509            (false, true) => Some(false),
5510            (false, false) => None,
5511            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5512        };
5513
5514        Ok(Statement::CreateSecret {
5515            or_replace,
5516            temporary: temp,
5517            if_not_exists,
5518            name,
5519            storage_specifier,
5520            secret_type,
5521            options,
5522        })
5523    }
5524
5525    /// Parse a CACHE TABLE statement
5526    pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5527        let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5528        if self.parse_keyword(Keyword::TABLE) {
5529            let table_name = self.parse_object_name(false)?;
5530            if self.peek_token_ref().token != Token::EOF {
5531                if let Token::Word(word) = &self.peek_token_ref().token {
5532                    if word.keyword == Keyword::OPTIONS {
5533                        options = self.parse_options(Keyword::OPTIONS)?
5534                    }
5535                };
5536
5537                if self.peek_token_ref().token != Token::EOF {
5538                    let (a, q) = self.parse_as_query()?;
5539                    has_as = a;
5540                    query = Some(q);
5541                }
5542
5543                Ok(Statement::Cache {
5544                    table_flag,
5545                    table_name,
5546                    has_as,
5547                    options,
5548                    query,
5549                })
5550            } else {
5551                Ok(Statement::Cache {
5552                    table_flag,
5553                    table_name,
5554                    has_as,
5555                    options,
5556                    query,
5557                })
5558            }
5559        } else {
5560            table_flag = Some(self.parse_object_name(false)?);
5561            if self.parse_keyword(Keyword::TABLE) {
5562                let table_name = self.parse_object_name(false)?;
5563                if self.peek_token_ref().token != Token::EOF {
5564                    if let Token::Word(word) = &self.peek_token_ref().token {
5565                        if word.keyword == Keyword::OPTIONS {
5566                            options = self.parse_options(Keyword::OPTIONS)?
5567                        }
5568                    };
5569
5570                    if self.peek_token_ref().token != Token::EOF {
5571                        let (a, q) = self.parse_as_query()?;
5572                        has_as = a;
5573                        query = Some(q);
5574                    }
5575
5576                    Ok(Statement::Cache {
5577                        table_flag,
5578                        table_name,
5579                        has_as,
5580                        options,
5581                        query,
5582                    })
5583                } else {
5584                    Ok(Statement::Cache {
5585                        table_flag,
5586                        table_name,
5587                        has_as,
5588                        options,
5589                        query,
5590                    })
5591                }
5592            } else {
5593                if self.peek_token_ref().token == Token::EOF {
5594                    self.prev_token();
5595                }
5596                self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5597            }
5598        }
5599    }
5600
5601    /// Parse 'AS' before as query,such as `WITH XXX AS SELECT XXX` oer `CACHE TABLE AS SELECT XXX`
5602    pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5603        match &self.peek_token_ref().token {
5604            Token::Word(word) => match word.keyword {
5605                Keyword::AS => {
5606                    self.next_token();
5607                    Ok((true, self.parse_query()?))
5608                }
5609                _ => Ok((false, self.parse_query()?)),
5610            },
5611            _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5612        }
5613    }
5614
5615    /// Parse a UNCACHE TABLE statement
5616    pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5617        self.expect_keyword_is(Keyword::TABLE)?;
5618        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5619        let table_name = self.parse_object_name(false)?;
5620        Ok(Statement::UNCache {
5621            table_name,
5622            if_exists,
5623        })
5624    }
5625
5626    /// SQLite-specific `CREATE VIRTUAL TABLE`
5627    pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5628        self.expect_keyword_is(Keyword::TABLE)?;
5629        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5630        let table_name = self.parse_object_name(false)?;
5631        self.expect_keyword_is(Keyword::USING)?;
5632        let module_name = self.parse_identifier()?;
5633        // SQLite docs note that module "arguments syntax is sufficiently
5634        // general that the arguments can be made to appear as column
5635        // definitions in a traditional CREATE TABLE statement", but
5636        // we don't implement that.
5637        let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5638        Ok(Statement::CreateVirtualTable {
5639            name: table_name,
5640            if_not_exists,
5641            module_name,
5642            module_args,
5643        })
5644    }
5645
5646    /// Parse a `CREATE SCHEMA` statement.
5647    pub fn parse_create_schema(&mut self, or_replace: bool) -> Result<Statement, ParserError> {
5648        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5649
5650        let schema_name = self.parse_schema_name()?;
5651
5652        let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5653            Some(self.parse_expr()?)
5654        } else {
5655            None
5656        };
5657
5658        let with = if self.peek_keyword(Keyword::WITH) {
5659            Some(self.parse_options(Keyword::WITH)?)
5660        } else {
5661            None
5662        };
5663
5664        let options = if self.peek_keyword(Keyword::OPTIONS) {
5665            Some(self.parse_options(Keyword::OPTIONS)?)
5666        } else {
5667            None
5668        };
5669
5670        let clone = if self.parse_keyword(Keyword::CLONE) {
5671            Some(self.parse_object_name(false)?)
5672        } else {
5673            None
5674        };
5675
5676        Ok(Statement::CreateSchema {
5677            schema_name,
5678            or_replace,
5679            if_not_exists,
5680            with,
5681            options,
5682            default_collate_spec,
5683            clone,
5684        })
5685    }
5686
5687    fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5688        if self.parse_keyword(Keyword::AUTHORIZATION) {
5689            Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5690        } else {
5691            let name = self.parse_object_name(false)?;
5692
5693            if self.parse_keyword(Keyword::AUTHORIZATION) {
5694                Ok(SchemaName::NamedAuthorization(
5695                    name,
5696                    self.parse_identifier()?,
5697                ))
5698            } else {
5699                Ok(SchemaName::Simple(name))
5700            }
5701        }
5702    }
5703
5704    /// Parse a `CREATE DATABASE` statement.
5705    pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5706        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5707        let db_name = self.parse_object_name(false)?;
5708        let mut location = None;
5709        let mut managed_location = None;
5710        loop {
5711            match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5712                Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5713                Some(Keyword::MANAGEDLOCATION) => {
5714                    managed_location = Some(self.parse_literal_string()?)
5715                }
5716                _ => break,
5717            }
5718        }
5719        let clone = if self.parse_keyword(Keyword::CLONE) {
5720            Some(self.parse_object_name(false)?)
5721        } else {
5722            None
5723        };
5724
5725        // Parse MySQL-style [DEFAULT] CHARACTER SET and [DEFAULT] COLLATE options
5726        //
5727        // Note: The docs only mention `CHARACTER SET`, but `CHARSET` is also supported.
5728        // Furthermore, MySQL will only accept one character set, raising an error if there is more
5729        // than one, but will accept multiple collations and use the last one.
5730        //
5731        // <https://dev.mysql.com/doc/refman/8.4/en/create-database.html>
5732        let mut default_charset = None;
5733        let mut default_collation = None;
5734        loop {
5735            let has_default = self.parse_keyword(Keyword::DEFAULT);
5736            if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5737                || self.parse_keyword(Keyword::CHARSET)
5738            {
5739                let _ = self.consume_token(&Token::Eq);
5740                default_charset = Some(self.parse_identifier()?.value);
5741            } else if self.parse_keyword(Keyword::COLLATE) {
5742                let _ = self.consume_token(&Token::Eq);
5743                default_collation = Some(self.parse_identifier()?.value);
5744            } else if has_default {
5745                // DEFAULT keyword not followed by CHARACTER SET, CHARSET, or COLLATE
5746                self.prev_token();
5747                break;
5748            } else {
5749                break;
5750            }
5751        }
5752
5753        Ok(Statement::CreateDatabase {
5754            db_name,
5755            if_not_exists: ine,
5756            location,
5757            managed_location,
5758            or_replace: false,
5759            transient: false,
5760            clone,
5761            data_retention_time_in_days: None,
5762            max_data_extension_time_in_days: None,
5763            external_volume: None,
5764            catalog: None,
5765            replace_invalid_characters: None,
5766            default_ddl_collation: None,
5767            storage_serialization_policy: None,
5768            comment: None,
5769            default_charset,
5770            default_collation,
5771            catalog_sync: None,
5772            catalog_sync_namespace_mode: None,
5773            catalog_sync_namespace_flatten_delimiter: None,
5774            with_tags: None,
5775            with_contacts: None,
5776        })
5777    }
5778
5779    /// Parse an optional `USING` clause for `CREATE FUNCTION`.
5780    pub fn parse_optional_create_function_using(
5781        &mut self,
5782    ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5783        if !self.parse_keyword(Keyword::USING) {
5784            return Ok(None);
5785        };
5786        let keyword =
5787            self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5788
5789        let uri = self.parse_literal_string()?;
5790
5791        match keyword {
5792            Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5793            Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5794            Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5795            _ => self.expected(
5796                "JAR, FILE or ARCHIVE, got {:?}",
5797                TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5798            ),
5799        }
5800    }
5801
5802    /// Parse a `CREATE FUNCTION` statement.
5803    pub fn parse_create_function(
5804        &mut self,
5805        or_alter: bool,
5806        or_replace: bool,
5807        temporary: bool,
5808    ) -> Result<Statement, ParserError> {
5809        if dialect_of!(self is HiveDialect) {
5810            self.parse_hive_create_function(or_replace, temporary)
5811                .map(Into::into)
5812        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5813            self.parse_postgres_create_function(or_replace, temporary)
5814                .map(Into::into)
5815        } else if dialect_of!(self is DuckDbDialect) {
5816            self.parse_create_macro(or_replace, temporary)
5817        } else if dialect_of!(self is BigQueryDialect) {
5818            self.parse_bigquery_create_function(or_replace, temporary)
5819                .map(Into::into)
5820        } else if dialect_of!(self is MsSqlDialect) {
5821            self.parse_mssql_create_function(or_alter, or_replace, temporary)
5822                .map(Into::into)
5823        } else {
5824            self.prev_token();
5825            self.expected_ref("an object type after CREATE", self.peek_token_ref())
5826        }
5827    }
5828
5829    /// Parse `CREATE FUNCTION` for [PostgreSQL]
5830    ///
5831    /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
5832    fn parse_postgres_create_function(
5833        &mut self,
5834        or_replace: bool,
5835        temporary: bool,
5836    ) -> Result<CreateFunction, ParserError> {
5837        let name = self.parse_object_name(false)?;
5838
5839        self.expect_token(&Token::LParen)?;
5840        let args = if Token::RParen != self.peek_token_ref().token {
5841            self.parse_comma_separated(Parser::parse_function_arg)?
5842        } else {
5843            vec![]
5844        };
5845        self.expect_token(&Token::RParen)?;
5846
5847        let return_type = if self.parse_keyword(Keyword::RETURNS) {
5848            Some(self.parse_function_return_type()?)
5849        } else {
5850            None
5851        };
5852
5853        #[derive(Default)]
5854        struct Body {
5855            language: Option<Ident>,
5856            behavior: Option<FunctionBehavior>,
5857            function_body: Option<CreateFunctionBody>,
5858            called_on_null: Option<FunctionCalledOnNull>,
5859            parallel: Option<FunctionParallel>,
5860            security: Option<FunctionSecurity>,
5861        }
5862        let mut body = Body::default();
5863        let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5864        loop {
5865            fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5866                if field.is_some() {
5867                    return Err(ParserError::ParserError(format!(
5868                        "{name} specified more than once",
5869                    )));
5870                }
5871                Ok(())
5872            }
5873            if self.parse_keyword(Keyword::AS) {
5874                ensure_not_set(&body.function_body, "AS")?;
5875                body.function_body = Some(self.parse_create_function_body_string()?);
5876            } else if self.parse_keyword(Keyword::LANGUAGE) {
5877                ensure_not_set(&body.language, "LANGUAGE")?;
5878                body.language = Some(self.parse_identifier()?);
5879            } else if self.parse_keyword(Keyword::IMMUTABLE) {
5880                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5881                body.behavior = Some(FunctionBehavior::Immutable);
5882            } else if self.parse_keyword(Keyword::STABLE) {
5883                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5884                body.behavior = Some(FunctionBehavior::Stable);
5885            } else if self.parse_keyword(Keyword::VOLATILE) {
5886                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5887                body.behavior = Some(FunctionBehavior::Volatile);
5888            } else if self.parse_keywords(&[
5889                Keyword::CALLED,
5890                Keyword::ON,
5891                Keyword::NULL,
5892                Keyword::INPUT,
5893            ]) {
5894                ensure_not_set(
5895                    &body.called_on_null,
5896                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5897                )?;
5898                body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5899            } else if self.parse_keywords(&[
5900                Keyword::RETURNS,
5901                Keyword::NULL,
5902                Keyword::ON,
5903                Keyword::NULL,
5904                Keyword::INPUT,
5905            ]) {
5906                ensure_not_set(
5907                    &body.called_on_null,
5908                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5909                )?;
5910                body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5911            } else if self.parse_keyword(Keyword::STRICT) {
5912                ensure_not_set(
5913                    &body.called_on_null,
5914                    "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5915                )?;
5916                body.called_on_null = Some(FunctionCalledOnNull::Strict);
5917            } else if self.parse_keyword(Keyword::PARALLEL) {
5918                ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5919                if self.parse_keyword(Keyword::UNSAFE) {
5920                    body.parallel = Some(FunctionParallel::Unsafe);
5921                } else if self.parse_keyword(Keyword::RESTRICTED) {
5922                    body.parallel = Some(FunctionParallel::Restricted);
5923                } else if self.parse_keyword(Keyword::SAFE) {
5924                    body.parallel = Some(FunctionParallel::Safe);
5925                } else {
5926                    return self
5927                        .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5928                }
5929            } else if self.parse_keyword(Keyword::SECURITY) {
5930                ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5931                if self.parse_keyword(Keyword::DEFINER) {
5932                    body.security = Some(FunctionSecurity::Definer);
5933                } else if self.parse_keyword(Keyword::INVOKER) {
5934                    body.security = Some(FunctionSecurity::Invoker);
5935                } else {
5936                    return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5937                }
5938            } else if self.parse_keyword(Keyword::SET) {
5939                let name = self.parse_object_name(false)?;
5940                let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5941                    FunctionSetValue::FromCurrent
5942                } else {
5943                    if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5944                        return self.expected_ref("= or TO", self.peek_token_ref());
5945                    }
5946                    if self.parse_keyword(Keyword::DEFAULT) {
5947                        FunctionSetValue::Default
5948                    } else {
5949                        let values = self.parse_comma_separated(Parser::parse_expr)?;
5950                        FunctionSetValue::Values(values)
5951                    }
5952                };
5953                set_params.push(FunctionDefinitionSetParam { name, value });
5954            } else if self.parse_keyword(Keyword::RETURN) {
5955                ensure_not_set(&body.function_body, "RETURN")?;
5956                body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5957            } else {
5958                break;
5959            }
5960        }
5961
5962        Ok(CreateFunction {
5963            or_alter: false,
5964            or_replace,
5965            temporary,
5966            name,
5967            args: Some(args),
5968            return_type,
5969            behavior: body.behavior,
5970            called_on_null: body.called_on_null,
5971            parallel: body.parallel,
5972            security: body.security,
5973            set_params,
5974            language: body.language,
5975            function_body: body.function_body,
5976            if_not_exists: false,
5977            using: None,
5978            determinism_specifier: None,
5979            options: None,
5980            remote_connection: None,
5981        })
5982    }
5983
5984    /// Parse `CREATE FUNCTION` for [Hive]
5985    ///
5986    /// [Hive]: https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-Create/Drop/ReloadFunction
5987    fn parse_hive_create_function(
5988        &mut self,
5989        or_replace: bool,
5990        temporary: bool,
5991    ) -> Result<CreateFunction, ParserError> {
5992        let name = self.parse_object_name(false)?;
5993        self.expect_keyword_is(Keyword::AS)?;
5994
5995        let body = self.parse_create_function_body_string()?;
5996        let using = self.parse_optional_create_function_using()?;
5997
5998        Ok(CreateFunction {
5999            or_alter: false,
6000            or_replace,
6001            temporary,
6002            name,
6003            function_body: Some(body),
6004            using,
6005            if_not_exists: false,
6006            args: None,
6007            return_type: None,
6008            behavior: None,
6009            called_on_null: None,
6010            parallel: None,
6011            security: None,
6012            set_params: vec![],
6013            language: None,
6014            determinism_specifier: None,
6015            options: None,
6016            remote_connection: None,
6017        })
6018    }
6019
6020    /// Parse `CREATE FUNCTION` for [BigQuery]
6021    ///
6022    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement
6023    fn parse_bigquery_create_function(
6024        &mut self,
6025        or_replace: bool,
6026        temporary: bool,
6027    ) -> Result<CreateFunction, ParserError> {
6028        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6029        let (name, args) = self.parse_create_function_name_and_params()?;
6030
6031        let return_type = if self.parse_keyword(Keyword::RETURNS) {
6032            Some(self.parse_function_return_type()?)
6033        } else {
6034            None
6035        };
6036
6037        let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
6038            Some(FunctionDeterminismSpecifier::Deterministic)
6039        } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
6040            Some(FunctionDeterminismSpecifier::NotDeterministic)
6041        } else {
6042            None
6043        };
6044
6045        let language = if self.parse_keyword(Keyword::LANGUAGE) {
6046            Some(self.parse_identifier()?)
6047        } else {
6048            None
6049        };
6050
6051        let remote_connection =
6052            if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
6053                Some(self.parse_object_name(false)?)
6054            } else {
6055                None
6056            };
6057
6058        // `OPTIONS` may come before of after the function body but
6059        // may be specified at most once.
6060        let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
6061
6062        let function_body = if remote_connection.is_none() {
6063            self.expect_keyword_is(Keyword::AS)?;
6064            let expr = self.parse_expr()?;
6065            if options.is_none() {
6066                options = self.maybe_parse_options(Keyword::OPTIONS)?;
6067                Some(CreateFunctionBody::AsBeforeOptions {
6068                    body: expr,
6069                    link_symbol: None,
6070                })
6071            } else {
6072                Some(CreateFunctionBody::AsAfterOptions(expr))
6073            }
6074        } else {
6075            None
6076        };
6077
6078        Ok(CreateFunction {
6079            or_alter: false,
6080            or_replace,
6081            temporary,
6082            if_not_exists,
6083            name,
6084            args: Some(args),
6085            return_type,
6086            function_body,
6087            language,
6088            determinism_specifier,
6089            options,
6090            remote_connection,
6091            using: None,
6092            behavior: None,
6093            called_on_null: None,
6094            parallel: None,
6095            security: None,
6096            set_params: vec![],
6097        })
6098    }
6099
6100    /// Parse `CREATE FUNCTION` for [MsSql]
6101    ///
6102    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
6103    fn parse_mssql_create_function(
6104        &mut self,
6105        or_alter: bool,
6106        or_replace: bool,
6107        temporary: bool,
6108    ) -> Result<CreateFunction, ParserError> {
6109        let (name, args) = self.parse_create_function_name_and_params()?;
6110
6111        self.expect_keyword(Keyword::RETURNS)?;
6112
6113        let return_table = self.maybe_parse(|p| {
6114            let return_table_name = p.parse_identifier()?;
6115
6116            p.expect_keyword_is(Keyword::TABLE)?;
6117            p.prev_token();
6118
6119            let table_column_defs = match p.parse_data_type()? {
6120                DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
6121                    table_column_defs
6122                }
6123                _ => parser_err!(
6124                    "Expected table column definitions after TABLE keyword",
6125                    p.peek_token_ref().span.start
6126                )?,
6127            };
6128
6129            Ok(DataType::NamedTable {
6130                name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
6131                columns: table_column_defs,
6132            })
6133        })?;
6134
6135        let data_type = match return_table {
6136            Some(table_type) => table_type,
6137            None => self.parse_data_type()?,
6138        };
6139        let return_type = Some(FunctionReturnType::DataType(data_type));
6140
6141        let _ = self.parse_keyword(Keyword::AS);
6142
6143        let function_body = if self.peek_keyword(Keyword::BEGIN) {
6144            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
6145            let statements = self.parse_statement_list(&[Keyword::END])?;
6146            let end_token = self.expect_keyword(Keyword::END)?;
6147
6148            Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
6149                begin_token: AttachedToken(begin_token),
6150                statements,
6151                end_token: AttachedToken(end_token),
6152            }))
6153        } else if self.parse_keyword(Keyword::RETURN) {
6154            if self.peek_token_ref().token == Token::LParen {
6155                Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
6156            } else if self.peek_keyword(Keyword::SELECT) {
6157                let select = self.parse_select()?;
6158                Some(CreateFunctionBody::AsReturnSelect(select))
6159            } else {
6160                parser_err!(
6161                    "Expected a subquery (or bare SELECT statement) after RETURN",
6162                    self.peek_token_ref().span.start
6163                )?
6164            }
6165        } else {
6166            parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
6167        };
6168
6169        Ok(CreateFunction {
6170            or_alter,
6171            or_replace,
6172            temporary,
6173            if_not_exists: false,
6174            name,
6175            args: Some(args),
6176            return_type,
6177            function_body,
6178            language: None,
6179            determinism_specifier: None,
6180            options: None,
6181            remote_connection: None,
6182            using: None,
6183            behavior: None,
6184            called_on_null: None,
6185            parallel: None,
6186            security: None,
6187            set_params: vec![],
6188        })
6189    }
6190
6191    fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
6192        if self.parse_keyword(Keyword::SETOF) {
6193            Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
6194        } else {
6195            Ok(FunctionReturnType::DataType(self.parse_data_type()?))
6196        }
6197    }
6198
6199    fn parse_create_function_name_and_params(
6200        &mut self,
6201    ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
6202        let name = self.parse_object_name(false)?;
6203        let parse_function_param =
6204            |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
6205                let name = parser.parse_identifier()?;
6206                let data_type = parser.parse_data_type()?;
6207                let default_expr = if parser.consume_token(&Token::Eq) {
6208                    Some(parser.parse_expr()?)
6209                } else {
6210                    None
6211                };
6212
6213                Ok(OperateFunctionArg {
6214                    mode: None,
6215                    name: Some(name),
6216                    data_type,
6217                    default_expr,
6218                })
6219            };
6220        self.expect_token(&Token::LParen)?;
6221        let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6222        self.expect_token(&Token::RParen)?;
6223        Ok((name, args))
6224    }
6225
6226    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6227        let mode = if self.parse_keyword(Keyword::IN) {
6228            Some(ArgMode::In)
6229        } else if self.parse_keyword(Keyword::OUT) {
6230            Some(ArgMode::Out)
6231        } else if self.parse_keyword(Keyword::INOUT) {
6232            Some(ArgMode::InOut)
6233        } else if self.parse_keyword(Keyword::VARIADIC) {
6234            Some(ArgMode::Variadic)
6235        } else {
6236            None
6237        };
6238
6239        // parse: [ argname ] argtype
6240        let mut name = None;
6241        let mut data_type = self.parse_data_type()?;
6242
6243        // To check whether the first token is a name or a type, we need to
6244        // peek the next token, which if it is another type keyword, then the
6245        // first token is a name and not a type in itself.
6246        let data_type_idx = self.get_current_index();
6247
6248        // DEFAULT will be parsed as `DataType::Custom`, which is undesirable in this context
6249        fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6250            if parser.peek_keyword(Keyword::DEFAULT) {
6251                // This dummy error is ignored in `maybe_parse`
6252                parser_err!(
6253                    "The DEFAULT keyword is not a type",
6254                    parser.peek_token_ref().span.start
6255                )
6256            } else {
6257                parser.parse_data_type()
6258            }
6259        }
6260
6261        if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6262            let token = self.token_at(data_type_idx).clone();
6263
6264            // We ensure that the token is a `Word` token, and not other special tokens.
6265            match token.token {
6266                Token::Word(word) => name = Some(word.into_ident(token.span)),
6267                _ => return self.expected("a name or type", token),
6268            }
6269
6270            data_type = next_data_type;
6271        }
6272
6273        let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6274        {
6275            Some(self.parse_expr()?)
6276        } else {
6277            None
6278        };
6279        Ok(OperateFunctionArg {
6280            mode,
6281            name,
6282            data_type,
6283            default_expr,
6284        })
6285    }
6286
6287    fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6288        let mode = if self.parse_keyword(Keyword::IN) {
6289            Some(ArgMode::In)
6290        } else {
6291            if self
6292                .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6293                .is_some()
6294            {
6295                return self.expected_ref(
6296                    "IN or argument type in aggregate signature",
6297                    self.peek_token_ref(),
6298                );
6299            }
6300            None
6301        };
6302
6303        // Parse: [ argname ] argtype, but do not consume ORDER from
6304        // `... argtype ORDER BY ...` as a type-name disambiguator.
6305        let mut name = None;
6306        let mut data_type = self.parse_data_type()?;
6307        let data_type_idx = self.get_current_index();
6308
6309        fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6310            if parser.peek_keyword(Keyword::DEFAULT)
6311                || parser.peek_keyword(Keyword::ORDER)
6312                || parser.peek_token_ref().token == Token::Comma
6313                || parser.peek_token_ref().token == Token::RParen
6314            {
6315                // Dummy error ignored by maybe_parse
6316                parser_err!(
6317                    "The current token cannot start an aggregate argument type",
6318                    parser.peek_token_ref().span.start
6319                )
6320            } else {
6321                parser.parse_data_type()
6322            }
6323        }
6324
6325        if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6326            let token = self.token_at(data_type_idx).clone();
6327            match token.token {
6328                Token::Word(word) => name = Some(word.into_ident(token.span)),
6329                _ => return self.expected("a name or type", token),
6330            }
6331
6332            data_type = next_data_type;
6333        }
6334
6335        if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6336            return self.expected_ref(
6337                "',' or ')' or ORDER BY after aggregate argument type",
6338                self.peek_token_ref(),
6339            );
6340        }
6341
6342        Ok(OperateFunctionArg {
6343            mode,
6344            name,
6345            data_type,
6346            default_expr: None,
6347        })
6348    }
6349
6350    /// Parse statements of the DropTrigger type such as:
6351    ///
6352    /// ```sql
6353    /// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
6354    /// ```
6355    pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6356        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6357        {
6358            self.prev_token();
6359            return self.expected_ref("an object type after DROP", self.peek_token_ref());
6360        }
6361        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6362        let trigger_name = self.parse_object_name(false)?;
6363        let table_name = if self.parse_keyword(Keyword::ON) {
6364            Some(self.parse_object_name(false)?)
6365        } else {
6366            None
6367        };
6368        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6369            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6370            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6371            Some(unexpected_keyword) => return Err(ParserError::ParserError(
6372                format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6373            )),
6374            None => None,
6375        };
6376        Ok(DropTrigger {
6377            if_exists,
6378            trigger_name,
6379            table_name,
6380            option,
6381        })
6382    }
6383
6384    /// Parse a `CREATE TRIGGER` statement.
6385    pub fn parse_create_trigger(
6386        &mut self,
6387        temporary: bool,
6388        or_alter: bool,
6389        or_replace: bool,
6390        is_constraint: bool,
6391    ) -> Result<CreateTrigger, ParserError> {
6392        if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6393        {
6394            self.prev_token();
6395            return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6396        }
6397
6398        let name = self.parse_object_name(false)?;
6399        let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6400
6401        let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6402        self.expect_keyword_is(Keyword::ON)?;
6403        let table_name = self.parse_object_name(false)?;
6404
6405        let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6406            self.parse_object_name(true).ok()
6407        } else {
6408            None
6409        };
6410
6411        let characteristics = self.parse_constraint_characteristics()?;
6412
6413        let mut referencing = vec![];
6414        if self.parse_keyword(Keyword::REFERENCING) {
6415            while let Some(refer) = self.parse_trigger_referencing()? {
6416                referencing.push(refer);
6417            }
6418        }
6419
6420        let trigger_object = if self.parse_keyword(Keyword::FOR) {
6421            let include_each = self.parse_keyword(Keyword::EACH);
6422            let trigger_object =
6423                match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6424                    Keyword::ROW => TriggerObject::Row,
6425                    Keyword::STATEMENT => TriggerObject::Statement,
6426                    unexpected_keyword => return Err(ParserError::ParserError(
6427                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6428                    )),
6429                };
6430
6431            Some(if include_each {
6432                TriggerObjectKind::ForEach(trigger_object)
6433            } else {
6434                TriggerObjectKind::For(trigger_object)
6435            })
6436        } else {
6437            let _ = self.parse_keyword(Keyword::FOR);
6438
6439            None
6440        };
6441
6442        let condition = self
6443            .parse_keyword(Keyword::WHEN)
6444            .then(|| self.parse_expr())
6445            .transpose()?;
6446
6447        let mut exec_body = None;
6448        let mut statements = None;
6449        if self.parse_keyword(Keyword::EXECUTE) {
6450            exec_body = Some(self.parse_trigger_exec_body()?);
6451        } else {
6452            statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6453        }
6454
6455        Ok(CreateTrigger {
6456            or_alter,
6457            temporary,
6458            or_replace,
6459            is_constraint,
6460            name,
6461            period,
6462            period_before_table: true,
6463            events,
6464            table_name,
6465            referenced_table_name,
6466            referencing,
6467            trigger_object,
6468            condition,
6469            exec_body,
6470            statements_as: false,
6471            statements,
6472            characteristics,
6473        })
6474    }
6475
6476    /// Parse the period part of a trigger (`BEFORE`, `AFTER`, etc.).
6477    pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6478        Ok(
6479            match self.expect_one_of_keywords(&[
6480                Keyword::FOR,
6481                Keyword::BEFORE,
6482                Keyword::AFTER,
6483                Keyword::INSTEAD,
6484            ])? {
6485                Keyword::FOR => TriggerPeriod::For,
6486                Keyword::BEFORE => TriggerPeriod::Before,
6487                Keyword::AFTER => TriggerPeriod::After,
6488                Keyword::INSTEAD => self
6489                    .expect_keyword_is(Keyword::OF)
6490                    .map(|_| TriggerPeriod::InsteadOf)?,
6491                unexpected_keyword => return Err(ParserError::ParserError(
6492                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6493                )),
6494            },
6495        )
6496    }
6497
6498    /// Parse the event part of a trigger (`INSERT`, `UPDATE`, etc.).
6499    pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6500        Ok(
6501            match self.expect_one_of_keywords(&[
6502                Keyword::INSERT,
6503                Keyword::UPDATE,
6504                Keyword::DELETE,
6505                Keyword::TRUNCATE,
6506            ])? {
6507                Keyword::INSERT => TriggerEvent::Insert,
6508                Keyword::UPDATE => {
6509                    if self.parse_keyword(Keyword::OF) {
6510                        let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6511                        TriggerEvent::Update(cols)
6512                    } else {
6513                        TriggerEvent::Update(vec![])
6514                    }
6515                }
6516                Keyword::DELETE => TriggerEvent::Delete,
6517                Keyword::TRUNCATE => TriggerEvent::Truncate,
6518                unexpected_keyword => return Err(ParserError::ParserError(
6519                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6520                )),
6521            },
6522        )
6523    }
6524
6525    /// Parse the `REFERENCING` clause of a trigger.
6526    pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6527        let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6528            Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6529                TriggerReferencingType::OldTable
6530            }
6531            Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6532                TriggerReferencingType::NewTable
6533            }
6534            _ => {
6535                return Ok(None);
6536            }
6537        };
6538
6539        let is_as = self.parse_keyword(Keyword::AS);
6540        let transition_relation_name = self.parse_object_name(false)?;
6541        Ok(Some(TriggerReferencing {
6542            refer_type,
6543            is_as,
6544            transition_relation_name,
6545        }))
6546    }
6547
6548    /// Parse the execution body of a trigger (`FUNCTION` or `PROCEDURE`).
6549    pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6550        Ok(TriggerExecBody {
6551            exec_type: match self
6552                .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6553            {
6554                Keyword::FUNCTION => TriggerExecBodyType::Function,
6555                Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6556                unexpected_keyword => return Err(ParserError::ParserError(
6557                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6558                )),
6559            },
6560            func_desc: self.parse_function_desc()?,
6561        })
6562    }
6563
6564    /// Parse a `CREATE MACRO` statement.
6565    pub fn parse_create_macro(
6566        &mut self,
6567        or_replace: bool,
6568        temporary: bool,
6569    ) -> Result<Statement, ParserError> {
6570        if dialect_of!(self is DuckDbDialect |  GenericDialect) {
6571            let name = self.parse_object_name(false)?;
6572            self.expect_token(&Token::LParen)?;
6573            let args = if self.consume_token(&Token::RParen) {
6574                self.prev_token();
6575                None
6576            } else {
6577                Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6578            };
6579
6580            self.expect_token(&Token::RParen)?;
6581            self.expect_keyword_is(Keyword::AS)?;
6582
6583            Ok(Statement::CreateMacro {
6584                or_replace,
6585                temporary,
6586                name,
6587                args,
6588                definition: if self.parse_keyword(Keyword::TABLE) {
6589                    MacroDefinition::Table(self.parse_query()?)
6590                } else {
6591                    MacroDefinition::Expr(self.parse_expr()?)
6592                },
6593            })
6594        } else {
6595            self.prev_token();
6596            self.expected_ref("an object type after CREATE", self.peek_token_ref())
6597        }
6598    }
6599
6600    fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6601        let name = self.parse_identifier()?;
6602
6603        let default_expr =
6604            if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6605                Some(self.parse_expr()?)
6606            } else {
6607                None
6608            };
6609        Ok(MacroArg { name, default_expr })
6610    }
6611
6612    /// Parse a `CREATE EXTERNAL TABLE` statement.
6613    pub fn parse_create_external_table(
6614        &mut self,
6615        or_replace: bool,
6616    ) -> Result<CreateTable, ParserError> {
6617        self.expect_keyword_is(Keyword::TABLE)?;
6618        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6619        let table_name = self.parse_object_name(false)?;
6620        let (columns, constraints) = self.parse_columns()?;
6621
6622        let hive_distribution = self.parse_hive_distribution()?;
6623        let hive_formats = self.parse_hive_formats()?;
6624
6625        let file_format = if let Some(ref hf) = hive_formats {
6626            if let Some(ref ff) = hf.storage {
6627                match ff {
6628                    HiveIOFormat::FileFormat { format } => Some(*format),
6629                    _ => None,
6630                }
6631            } else {
6632                None
6633            }
6634        } else {
6635            None
6636        };
6637        let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6638
6639        let with_connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
6640            Some(self.parse_object_name(false)?)
6641        } else {
6642            None
6643        };
6644        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6645        let table_options = if !table_properties.is_empty() {
6646            CreateTableOptions::TableProperties(table_properties)
6647        } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6648            CreateTableOptions::Options(options)
6649        } else {
6650            CreateTableOptions::None
6651        };
6652        Ok(CreateTableBuilder::new(table_name)
6653            .columns(columns)
6654            .constraints(constraints)
6655            .hive_distribution(hive_distribution)
6656            .hive_formats(hive_formats)
6657            .table_options(table_options)
6658            .with_connection(with_connection)
6659            .or_replace(or_replace)
6660            .if_not_exists(if_not_exists)
6661            .external(true)
6662            .file_format(file_format)
6663            .location(location)
6664            .build())
6665    }
6666
6667    /// Parse `CREATE SNAPSHOT TABLE` statement.
6668    ///
6669    /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_snapshot_table_statement>
6670    pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6671        self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6672        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6673        let table_name = self.parse_object_name(true)?;
6674
6675        self.expect_keyword_is(Keyword::CLONE)?;
6676        let clone = Some(self.parse_object_name(true)?);
6677
6678        let version =
6679            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6680            {
6681                Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6682            } else {
6683                None
6684            };
6685
6686        let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6687            CreateTableOptions::Options(options)
6688        } else {
6689            CreateTableOptions::None
6690        };
6691
6692        Ok(CreateTableBuilder::new(table_name)
6693            .snapshot(true)
6694            .if_not_exists(if_not_exists)
6695            .clone_clause(clone)
6696            .version(version)
6697            .table_options(table_options)
6698            .build())
6699    }
6700
6701    /// Parse a file format for external tables.
6702    pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6703        let next_token = self.next_token();
6704        match &next_token.token {
6705            Token::Word(w) => match w.keyword {
6706                Keyword::AVRO => Ok(FileFormat::AVRO),
6707                Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6708                Keyword::ORC => Ok(FileFormat::ORC),
6709                Keyword::PARQUET => Ok(FileFormat::PARQUET),
6710                Keyword::RCFILE => Ok(FileFormat::RCFILE),
6711                Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6712                Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6713                _ => self.expected("fileformat", next_token),
6714            },
6715            _ => self.expected("fileformat", next_token),
6716        }
6717    }
6718
6719    fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6720        if self.consume_token(&Token::Eq) {
6721            Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6722        } else {
6723            Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6724        }
6725    }
6726
6727    /// Parse an `ANALYZE FORMAT`.
6728    pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6729        let next_token = self.next_token();
6730        match &next_token.token {
6731            Token::Word(w) => match w.keyword {
6732                Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6733                Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6734                Keyword::JSON => Ok(AnalyzeFormat::JSON),
6735                Keyword::TREE => Ok(AnalyzeFormat::TREE),
6736                _ => self.expected("fileformat", next_token),
6737            },
6738            _ => self.expected("fileformat", next_token),
6739        }
6740    }
6741
6742    /// Parse a `CREATE VIEW` statement.
6743    pub fn parse_create_view(
6744        &mut self,
6745        or_alter: bool,
6746        or_replace: bool,
6747        temporary: bool,
6748        create_view_params: Option<CreateViewParams>,
6749    ) -> Result<CreateView, ParserError> {
6750        let secure = self.parse_keyword(Keyword::SECURE);
6751        let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6752        self.expect_keyword_is(Keyword::VIEW)?;
6753        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6754        // Tries to parse IF NOT EXISTS either before name or after name
6755        // Name before IF NOT EXISTS is supported by snowflake but undocumented
6756        let if_not_exists_first =
6757            self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6758        let name = self.parse_object_name(allow_unquoted_hyphen)?;
6759        let name_before_not_exists = !if_not_exists_first
6760            && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6761        let if_not_exists = if_not_exists_first || name_before_not_exists;
6762        let mut copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6763        // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
6764        // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
6765        let columns = self.parse_view_columns()?;
6766        // Snowflake also documents `COPY GRANTS` *after* the column list; accept
6767        // either position, but not both.
6768        // <https://docs.snowflake.com/en/sql-reference/sql/create-view#syntax>
6769        if !copy_grants {
6770            copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6771        }
6772        let mut options = CreateTableOptions::None;
6773        let with_options = self.parse_options(Keyword::WITH)?;
6774        if !with_options.is_empty() {
6775            options = CreateTableOptions::With(with_options);
6776        }
6777
6778        let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6779            self.expect_keyword_is(Keyword::BY)?;
6780            self.parse_parenthesized_column_list(Optional, false)?
6781        } else {
6782            vec![]
6783        };
6784
6785        if dialect_of!(self is BigQueryDialect | GenericDialect) {
6786            if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6787                if !opts.is_empty() {
6788                    options = CreateTableOptions::Options(opts);
6789                }
6790            };
6791        }
6792
6793        let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6794            && self.parse_keyword(Keyword::TO)
6795        {
6796            Some(self.parse_object_name(false)?)
6797        } else {
6798            None
6799        };
6800
6801        let comment = if self.dialect.supports_create_view_comment_syntax()
6802            && self.parse_keyword(Keyword::COMMENT)
6803        {
6804            self.expect_token(&Token::Eq)?;
6805            Some(self.parse_comment_value()?)
6806        } else {
6807            None
6808        };
6809
6810        self.expect_keyword_is(Keyword::AS)?;
6811        let query = self.parse_query()?;
6812        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
6813
6814        let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6815            && self.parse_keywords(&[
6816                Keyword::WITH,
6817                Keyword::NO,
6818                Keyword::SCHEMA,
6819                Keyword::BINDING,
6820            ]);
6821
6822        Ok(CreateView {
6823            or_alter,
6824            name,
6825            columns,
6826            query,
6827            materialized,
6828            secure,
6829            or_replace,
6830            options,
6831            cluster_by,
6832            comment,
6833            with_no_schema_binding,
6834            if_not_exists,
6835            temporary,
6836            copy_grants,
6837            to,
6838            params: create_view_params,
6839            name_before_not_exists,
6840        })
6841    }
6842
6843    /// Parse optional parameters for the `CREATE VIEW` statement supported by [MySQL].
6844    ///
6845    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/create-view.html
6846    fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6847        let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6848            self.expect_token(&Token::Eq)?;
6849            Some(
6850                match self.expect_one_of_keywords(&[
6851                    Keyword::UNDEFINED,
6852                    Keyword::MERGE,
6853                    Keyword::TEMPTABLE,
6854                ])? {
6855                    Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6856                    Keyword::MERGE => CreateViewAlgorithm::Merge,
6857                    Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6858                    _ => {
6859                        self.prev_token();
6860                        let found = self.next_token();
6861                        return self
6862                            .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6863                    }
6864                },
6865            )
6866        } else {
6867            None
6868        };
6869        let definer = if self.parse_keyword(Keyword::DEFINER) {
6870            self.expect_token(&Token::Eq)?;
6871            Some(self.parse_grantee_name()?)
6872        } else {
6873            None
6874        };
6875        let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6876            Some(
6877                match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6878                    Keyword::DEFINER => CreateViewSecurity::Definer,
6879                    Keyword::INVOKER => CreateViewSecurity::Invoker,
6880                    _ => {
6881                        self.prev_token();
6882                        let found = self.next_token();
6883                        return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6884                    }
6885                },
6886            )
6887        } else {
6888            None
6889        };
6890        if algorithm.is_some() || definer.is_some() || security.is_some() {
6891            Ok(Some(CreateViewParams {
6892                algorithm,
6893                definer,
6894                security,
6895            }))
6896        } else {
6897            Ok(None)
6898        }
6899    }
6900
6901    /// Parse a `CREATE ROLE` statement.
6902    pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6903        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6904        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6905
6906        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
6907
6908        let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6909            vec![Keyword::AUTHORIZATION]
6910        } else if dialect_of!(self is PostgreSqlDialect) {
6911            vec![
6912                Keyword::LOGIN,
6913                Keyword::NOLOGIN,
6914                Keyword::INHERIT,
6915                Keyword::NOINHERIT,
6916                Keyword::BYPASSRLS,
6917                Keyword::NOBYPASSRLS,
6918                Keyword::PASSWORD,
6919                Keyword::CREATEDB,
6920                Keyword::NOCREATEDB,
6921                Keyword::CREATEROLE,
6922                Keyword::NOCREATEROLE,
6923                Keyword::SUPERUSER,
6924                Keyword::NOSUPERUSER,
6925                Keyword::REPLICATION,
6926                Keyword::NOREPLICATION,
6927                Keyword::CONNECTION,
6928                Keyword::VALID,
6929                Keyword::IN,
6930                Keyword::ROLE,
6931                Keyword::ADMIN,
6932                Keyword::USER,
6933            ]
6934        } else {
6935            vec![]
6936        };
6937
6938        // MSSQL
6939        let mut authorization_owner = None;
6940        // Postgres
6941        let mut login = None;
6942        let mut inherit = None;
6943        let mut bypassrls = None;
6944        let mut password = None;
6945        let mut create_db = None;
6946        let mut create_role = None;
6947        let mut superuser = None;
6948        let mut replication = None;
6949        let mut connection_limit = None;
6950        let mut valid_until = None;
6951        let mut in_role = vec![];
6952        let mut in_group = vec![];
6953        let mut role = vec![];
6954        let mut user = vec![];
6955        let mut admin = vec![];
6956
6957        while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6958            let loc = self
6959                .tokens
6960                .get(self.index - 1)
6961                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6962            match keyword {
6963                Keyword::AUTHORIZATION => {
6964                    if authorization_owner.is_some() {
6965                        parser_err!("Found multiple AUTHORIZATION", loc)
6966                    } else {
6967                        authorization_owner = Some(self.parse_object_name(false)?);
6968                        Ok(())
6969                    }
6970                }
6971                Keyword::LOGIN | Keyword::NOLOGIN => {
6972                    if login.is_some() {
6973                        parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6974                    } else {
6975                        login = Some(keyword == Keyword::LOGIN);
6976                        Ok(())
6977                    }
6978                }
6979                Keyword::INHERIT | Keyword::NOINHERIT => {
6980                    if inherit.is_some() {
6981                        parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6982                    } else {
6983                        inherit = Some(keyword == Keyword::INHERIT);
6984                        Ok(())
6985                    }
6986                }
6987                Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6988                    if bypassrls.is_some() {
6989                        parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6990                    } else {
6991                        bypassrls = Some(keyword == Keyword::BYPASSRLS);
6992                        Ok(())
6993                    }
6994                }
6995                Keyword::CREATEDB | Keyword::NOCREATEDB => {
6996                    if create_db.is_some() {
6997                        parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6998                    } else {
6999                        create_db = Some(keyword == Keyword::CREATEDB);
7000                        Ok(())
7001                    }
7002                }
7003                Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
7004                    if create_role.is_some() {
7005                        parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
7006                    } else {
7007                        create_role = Some(keyword == Keyword::CREATEROLE);
7008                        Ok(())
7009                    }
7010                }
7011                Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
7012                    if superuser.is_some() {
7013                        parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
7014                    } else {
7015                        superuser = Some(keyword == Keyword::SUPERUSER);
7016                        Ok(())
7017                    }
7018                }
7019                Keyword::REPLICATION | Keyword::NOREPLICATION => {
7020                    if replication.is_some() {
7021                        parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
7022                    } else {
7023                        replication = Some(keyword == Keyword::REPLICATION);
7024                        Ok(())
7025                    }
7026                }
7027                Keyword::PASSWORD => {
7028                    if password.is_some() {
7029                        parser_err!("Found multiple PASSWORD", loc)
7030                    } else {
7031                        password = if self.parse_keyword(Keyword::NULL) {
7032                            Some(Password::NullPassword)
7033                        } else {
7034                            Some(Password::Password(Expr::Value(self.parse_value()?)))
7035                        };
7036                        Ok(())
7037                    }
7038                }
7039                Keyword::CONNECTION => {
7040                    self.expect_keyword_is(Keyword::LIMIT)?;
7041                    if connection_limit.is_some() {
7042                        parser_err!("Found multiple CONNECTION LIMIT", loc)
7043                    } else {
7044                        connection_limit = Some(Expr::Value(self.parse_number_value()?));
7045                        Ok(())
7046                    }
7047                }
7048                Keyword::VALID => {
7049                    self.expect_keyword_is(Keyword::UNTIL)?;
7050                    if valid_until.is_some() {
7051                        parser_err!("Found multiple VALID UNTIL", loc)
7052                    } else {
7053                        valid_until = Some(Expr::Value(self.parse_value()?));
7054                        Ok(())
7055                    }
7056                }
7057                Keyword::IN => {
7058                    if self.parse_keyword(Keyword::ROLE) {
7059                        if !in_role.is_empty() {
7060                            parser_err!("Found multiple IN ROLE", loc)
7061                        } else {
7062                            in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
7063                            Ok(())
7064                        }
7065                    } else if self.parse_keyword(Keyword::GROUP) {
7066                        if !in_group.is_empty() {
7067                            parser_err!("Found multiple IN GROUP", loc)
7068                        } else {
7069                            in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
7070                            Ok(())
7071                        }
7072                    } else {
7073                        self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
7074                    }
7075                }
7076                Keyword::ROLE => {
7077                    if !role.is_empty() {
7078                        parser_err!("Found multiple ROLE", loc)
7079                    } else {
7080                        role = self.parse_comma_separated(|p| p.parse_identifier())?;
7081                        Ok(())
7082                    }
7083                }
7084                Keyword::USER => {
7085                    if !user.is_empty() {
7086                        parser_err!("Found multiple USER", loc)
7087                    } else {
7088                        user = self.parse_comma_separated(|p| p.parse_identifier())?;
7089                        Ok(())
7090                    }
7091                }
7092                Keyword::ADMIN => {
7093                    if !admin.is_empty() {
7094                        parser_err!("Found multiple ADMIN", loc)
7095                    } else {
7096                        admin = self.parse_comma_separated(|p| p.parse_identifier())?;
7097                        Ok(())
7098                    }
7099                }
7100                _ => break,
7101            }?
7102        }
7103
7104        Ok(CreateRole {
7105            names,
7106            if_not_exists,
7107            login,
7108            inherit,
7109            bypassrls,
7110            password,
7111            create_db,
7112            create_role,
7113            replication,
7114            superuser,
7115            connection_limit,
7116            valid_until,
7117            in_role,
7118            in_group,
7119            role,
7120            user,
7121            admin,
7122            authorization_owner,
7123        })
7124    }
7125
7126    /// Parse an `OWNER` clause.
7127    pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
7128        let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
7129            Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
7130            Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
7131            Some(Keyword::SESSION_USER) => Owner::SessionUser,
7132            Some(unexpected_keyword) => return Err(ParserError::ParserError(
7133                format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
7134            )),
7135            None => {
7136                match self.parse_identifier() {
7137                    Ok(ident) => Owner::Ident(ident),
7138                    Err(e) => {
7139                        return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
7140                    }
7141                }
7142            }
7143        };
7144        Ok(owner)
7145    }
7146
7147    /// Parses a [Statement::CreateDomain] statement.
7148    fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
7149        let name = self.parse_object_name(false)?;
7150        self.expect_keyword_is(Keyword::AS)?;
7151        let data_type = self.parse_data_type()?;
7152        let collation = if self.parse_keyword(Keyword::COLLATE) {
7153            Some(self.parse_identifier()?)
7154        } else {
7155            None
7156        };
7157        let default = if self.parse_keyword(Keyword::DEFAULT) {
7158            Some(self.parse_expr()?)
7159        } else {
7160            None
7161        };
7162        let mut constraints = Vec::new();
7163        while let Some(constraint) = self.parse_optional_table_constraint()? {
7164            constraints.push(constraint);
7165        }
7166
7167        Ok(CreateDomain {
7168            name,
7169            data_type,
7170            collation,
7171            default,
7172            constraints,
7173        })
7174    }
7175
7176    /// ```sql
7177    ///     CREATE POLICY name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ]
7178    ///     [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
7179    ///     [ TO { role_name | PUBLIC | CURRENT_USER | CURRENT_ROLE | SESSION_USER } [, ...] ]
7180    ///     [ USING ( using_expression ) ]
7181    ///     [ WITH CHECK ( with_check_expression ) ]
7182    /// ```
7183    ///
7184    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createpolicy.html)
7185    pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
7186        let name = self.parse_identifier()?;
7187        self.expect_keyword_is(Keyword::ON)?;
7188        let table_name = self.parse_object_name(false)?;
7189
7190        let policy_type = if self.parse_keyword(Keyword::AS) {
7191            let keyword =
7192                self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
7193            Some(match keyword {
7194                Keyword::PERMISSIVE => CreatePolicyType::Permissive,
7195                Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
7196                unexpected_keyword => return Err(ParserError::ParserError(
7197                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
7198                )),
7199            })
7200        } else {
7201            None
7202        };
7203
7204        let command = if self.parse_keyword(Keyword::FOR) {
7205            let keyword = self.expect_one_of_keywords(&[
7206                Keyword::ALL,
7207                Keyword::SELECT,
7208                Keyword::INSERT,
7209                Keyword::UPDATE,
7210                Keyword::DELETE,
7211            ])?;
7212            Some(match keyword {
7213                Keyword::ALL => CreatePolicyCommand::All,
7214                Keyword::SELECT => CreatePolicyCommand::Select,
7215                Keyword::INSERT => CreatePolicyCommand::Insert,
7216                Keyword::UPDATE => CreatePolicyCommand::Update,
7217                Keyword::DELETE => CreatePolicyCommand::Delete,
7218                unexpected_keyword => return Err(ParserError::ParserError(
7219                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7220                )),
7221            })
7222        } else {
7223            None
7224        };
7225
7226        let to = if self.parse_keyword(Keyword::TO) {
7227            Some(self.parse_comma_separated(|p| p.parse_owner())?)
7228        } else {
7229            None
7230        };
7231
7232        let using = if self.parse_keyword(Keyword::USING) {
7233            self.expect_token(&Token::LParen)?;
7234            let expr = self.parse_expr()?;
7235            self.expect_token(&Token::RParen)?;
7236            Some(expr)
7237        } else {
7238            None
7239        };
7240
7241        let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7242            self.expect_token(&Token::LParen)?;
7243            let expr = self.parse_expr()?;
7244            self.expect_token(&Token::RParen)?;
7245            Some(expr)
7246        } else {
7247            None
7248        };
7249
7250        Ok(CreatePolicy {
7251            name,
7252            table_name,
7253            policy_type,
7254            command,
7255            to,
7256            using,
7257            with_check,
7258        })
7259    }
7260
7261    /// ```sql
7262    /// CREATE CONNECTOR [IF NOT EXISTS] connector_name
7263    /// [TYPE datasource_type]
7264    /// [URL datasource_url]
7265    /// [COMMENT connector_comment]
7266    /// [WITH DCPROPERTIES(property_name=property_value, ...)]
7267    /// ```
7268    ///
7269    /// [Hive Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
7270    pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7271        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7272        let name = self.parse_identifier()?;
7273
7274        let connector_type = if self.parse_keyword(Keyword::TYPE) {
7275            Some(self.parse_literal_string()?)
7276        } else {
7277            None
7278        };
7279
7280        let url = if self.parse_keyword(Keyword::URL) {
7281            Some(self.parse_literal_string()?)
7282        } else {
7283            None
7284        };
7285
7286        let comment = self.parse_optional_inline_comment()?;
7287
7288        let with_dcproperties =
7289            match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7290                properties if !properties.is_empty() => Some(properties),
7291                _ => None,
7292            };
7293
7294        Ok(CreateConnector {
7295            name,
7296            if_not_exists,
7297            connector_type,
7298            url,
7299            comment,
7300            with_dcproperties,
7301        })
7302    }
7303
7304    /// Parse an operator name, which can contain special characters like +, -, <, >, =
7305    /// that are tokenized as operator tokens rather than identifiers.
7306    /// This is used for PostgreSQL CREATE OPERATOR statements.
7307    ///
7308    /// Examples: `+`, `myschema.+`, `pg_catalog.<=`
7309    fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7310        let mut parts = vec![];
7311        loop {
7312            parts.push(ObjectNamePart::Identifier(Ident::new(
7313                self.next_token().to_string(),
7314            )));
7315            if !self.consume_token(&Token::Period) {
7316                break;
7317            }
7318        }
7319        Ok(ObjectName(parts))
7320    }
7321
7322    /// Parse a [Statement::CreateOperator]
7323    ///
7324    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createoperator.html)
7325    pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7326        let name = self.parse_operator_name()?;
7327        self.expect_token(&Token::LParen)?;
7328
7329        let mut function: Option<ObjectName> = None;
7330        let mut is_procedure = false;
7331        let mut left_arg: Option<DataType> = None;
7332        let mut right_arg: Option<DataType> = None;
7333        let mut options: Vec<OperatorOption> = Vec::new();
7334
7335        loop {
7336            let keyword = self.expect_one_of_keywords(&[
7337                Keyword::FUNCTION,
7338                Keyword::PROCEDURE,
7339                Keyword::LEFTARG,
7340                Keyword::RIGHTARG,
7341                Keyword::COMMUTATOR,
7342                Keyword::NEGATOR,
7343                Keyword::RESTRICT,
7344                Keyword::JOIN,
7345                Keyword::HASHES,
7346                Keyword::MERGES,
7347            ])?;
7348
7349            match keyword {
7350                Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7351                    options.push(OperatorOption::Hashes);
7352                }
7353                Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7354                    options.push(OperatorOption::Merges);
7355                }
7356                Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7357                    self.expect_token(&Token::Eq)?;
7358                    function = Some(self.parse_object_name(false)?);
7359                    is_procedure = keyword == Keyword::PROCEDURE;
7360                }
7361                Keyword::LEFTARG if left_arg.is_none() => {
7362                    self.expect_token(&Token::Eq)?;
7363                    left_arg = Some(self.parse_data_type()?);
7364                }
7365                Keyword::RIGHTARG if right_arg.is_none() => {
7366                    self.expect_token(&Token::Eq)?;
7367                    right_arg = Some(self.parse_data_type()?);
7368                }
7369                Keyword::COMMUTATOR
7370                    if !options
7371                        .iter()
7372                        .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7373                {
7374                    self.expect_token(&Token::Eq)?;
7375                    if self.parse_keyword(Keyword::OPERATOR) {
7376                        self.expect_token(&Token::LParen)?;
7377                        let op = self.parse_operator_name()?;
7378                        self.expect_token(&Token::RParen)?;
7379                        options.push(OperatorOption::Commutator(op));
7380                    } else {
7381                        options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7382                    }
7383                }
7384                Keyword::NEGATOR
7385                    if !options
7386                        .iter()
7387                        .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7388                {
7389                    self.expect_token(&Token::Eq)?;
7390                    if self.parse_keyword(Keyword::OPERATOR) {
7391                        self.expect_token(&Token::LParen)?;
7392                        let op = self.parse_operator_name()?;
7393                        self.expect_token(&Token::RParen)?;
7394                        options.push(OperatorOption::Negator(op));
7395                    } else {
7396                        options.push(OperatorOption::Negator(self.parse_operator_name()?));
7397                    }
7398                }
7399                Keyword::RESTRICT
7400                    if !options
7401                        .iter()
7402                        .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7403                {
7404                    self.expect_token(&Token::Eq)?;
7405                    options.push(OperatorOption::Restrict(Some(
7406                        self.parse_object_name(false)?,
7407                    )));
7408                }
7409                Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7410                    self.expect_token(&Token::Eq)?;
7411                    options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7412                }
7413                _ => {
7414                    return Err(ParserError::ParserError(format!(
7415                        "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7416                        keyword
7417                    )))
7418                }
7419            }
7420
7421            if !self.consume_token(&Token::Comma) {
7422                break;
7423            }
7424        }
7425
7426        // Expect closing parenthesis
7427        self.expect_token(&Token::RParen)?;
7428
7429        // FUNCTION is required
7430        let function = function.ok_or_else(|| {
7431            ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7432        })?;
7433
7434        Ok(CreateOperator {
7435            name,
7436            function,
7437            is_procedure,
7438            left_arg,
7439            right_arg,
7440            options,
7441        })
7442    }
7443
7444    /// Parse a [Statement::CreateOperatorFamily]
7445    ///
7446    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopfamily.html)
7447    pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7448        let name = self.parse_object_name(false)?;
7449        self.expect_keyword(Keyword::USING)?;
7450        let using = self.parse_identifier()?;
7451
7452        Ok(CreateOperatorFamily { name, using })
7453    }
7454
7455    /// Parse a [Statement::CreateOperatorClass]
7456    ///
7457    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createopclass.html)
7458    pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7459        let name = self.parse_object_name(false)?;
7460        let default = self.parse_keyword(Keyword::DEFAULT);
7461        self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7462        let for_type = self.parse_data_type()?;
7463        self.expect_keyword(Keyword::USING)?;
7464        let using = self.parse_identifier()?;
7465
7466        let family = if self.parse_keyword(Keyword::FAMILY) {
7467            Some(self.parse_object_name(false)?)
7468        } else {
7469            None
7470        };
7471
7472        self.expect_keyword(Keyword::AS)?;
7473
7474        let mut items = vec![];
7475        loop {
7476            if self.parse_keyword(Keyword::OPERATOR) {
7477                let strategy_number = self.parse_literal_uint()?;
7478                let operator_name = self.parse_operator_name()?;
7479
7480                // Optional operator argument types
7481                let op_types = if self.consume_token(&Token::LParen) {
7482                    let left = self.parse_data_type()?;
7483                    self.expect_token(&Token::Comma)?;
7484                    let right = self.parse_data_type()?;
7485                    self.expect_token(&Token::RParen)?;
7486                    Some(OperatorArgTypes { left, right })
7487                } else {
7488                    None
7489                };
7490
7491                // Optional purpose
7492                let purpose = if self.parse_keyword(Keyword::FOR) {
7493                    if self.parse_keyword(Keyword::SEARCH) {
7494                        Some(OperatorPurpose::ForSearch)
7495                    } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7496                        let sort_family = self.parse_object_name(false)?;
7497                        Some(OperatorPurpose::ForOrderBy { sort_family })
7498                    } else {
7499                        return self
7500                            .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7501                    }
7502                } else {
7503                    None
7504                };
7505
7506                items.push(OperatorClassItem::Operator {
7507                    strategy_number,
7508                    operator_name,
7509                    op_types,
7510                    purpose,
7511                });
7512            } else if self.parse_keyword(Keyword::FUNCTION) {
7513                let support_number = self.parse_literal_uint()?;
7514
7515                // Optional operator types
7516                let op_types = if self.consume_token(&Token::LParen)
7517                    && self.peek_token_ref().token != Token::RParen
7518                {
7519                    let mut types = vec![];
7520                    loop {
7521                        types.push(self.parse_data_type()?);
7522                        if !self.consume_token(&Token::Comma) {
7523                            break;
7524                        }
7525                    }
7526                    self.expect_token(&Token::RParen)?;
7527                    Some(types)
7528                } else if self.consume_token(&Token::LParen) {
7529                    self.expect_token(&Token::RParen)?;
7530                    Some(vec![])
7531                } else {
7532                    None
7533                };
7534
7535                let function_name = self.parse_object_name(false)?;
7536
7537                // Function argument types
7538                let argument_types = if self.consume_token(&Token::LParen) {
7539                    let mut types = vec![];
7540                    loop {
7541                        if self.peek_token_ref().token == Token::RParen {
7542                            break;
7543                        }
7544                        types.push(self.parse_data_type()?);
7545                        if !self.consume_token(&Token::Comma) {
7546                            break;
7547                        }
7548                    }
7549                    self.expect_token(&Token::RParen)?;
7550                    types
7551                } else {
7552                    vec![]
7553                };
7554
7555                items.push(OperatorClassItem::Function {
7556                    support_number,
7557                    op_types,
7558                    function_name,
7559                    argument_types,
7560                });
7561            } else if self.parse_keyword(Keyword::STORAGE) {
7562                let storage_type = self.parse_data_type()?;
7563                items.push(OperatorClassItem::Storage { storage_type });
7564            } else {
7565                break;
7566            }
7567
7568            // Check for comma separator
7569            if !self.consume_token(&Token::Comma) {
7570                break;
7571            }
7572        }
7573
7574        Ok(CreateOperatorClass {
7575            name,
7576            default,
7577            for_type,
7578            using,
7579            family,
7580            items,
7581        })
7582    }
7583
7584    /// Parse a `DROP` statement.
7585    pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7586        // MySQL dialect supports `TEMPORARY`
7587        let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7588            && self.parse_keyword(Keyword::TEMPORARY);
7589        let persistent = dialect_of!(self is DuckDbDialect)
7590            && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7591
7592        let object_type = if self.parse_keyword(Keyword::TABLE) {
7593            ObjectType::Table
7594        } else if self.parse_keyword(Keyword::COLLATION) {
7595            ObjectType::Collation
7596        } else if self.parse_keyword(Keyword::VIEW) {
7597            ObjectType::View
7598        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7599            ObjectType::MaterializedView
7600        } else if self.parse_keyword(Keyword::INDEX) {
7601            ObjectType::Index
7602        } else if self.parse_keyword(Keyword::ROLE) {
7603            ObjectType::Role
7604        } else if self.parse_keyword(Keyword::SCHEMA) {
7605            ObjectType::Schema
7606        } else if self.parse_keyword(Keyword::DATABASE) {
7607            ObjectType::Database
7608        } else if self.parse_keyword(Keyword::SEQUENCE) {
7609            ObjectType::Sequence
7610        } else if self.parse_keyword(Keyword::STAGE) {
7611            ObjectType::Stage
7612        } else if self.parse_keyword(Keyword::TYPE) {
7613            ObjectType::Type
7614        } else if self.parse_keyword(Keyword::USER) {
7615            ObjectType::User
7616        } else if self.parse_keyword(Keyword::STREAM) {
7617            ObjectType::Stream
7618        } else if self.parse_keyword(Keyword::WAREHOUSE) {
7619            ObjectType::Warehouse
7620        } else if self.parse_keyword(Keyword::FUNCTION) {
7621            return self.parse_drop_function().map(Into::into);
7622        } else if self.parse_keyword(Keyword::POLICY) {
7623            return self.parse_drop_policy().map(Into::into);
7624        } else if self.parse_keyword(Keyword::CONNECTOR) {
7625            return self.parse_drop_connector();
7626        } else if self.parse_keyword(Keyword::DOMAIN) {
7627            return self.parse_drop_domain().map(Into::into);
7628        } else if self.parse_keyword(Keyword::PROCEDURE) {
7629            return self.parse_drop_procedure();
7630        } else if self.parse_keyword(Keyword::SECRET) {
7631            return self.parse_drop_secret(temporary, persistent);
7632        } else if self.parse_keyword(Keyword::TRIGGER) {
7633            return self.parse_drop_trigger().map(Into::into);
7634        } else if self.parse_keyword(Keyword::EXTENSION) {
7635            return self.parse_drop_extension();
7636        } else if self.parse_keyword(Keyword::OPERATOR) {
7637            // Check if this is DROP OPERATOR FAMILY or DROP OPERATOR CLASS
7638            return if self.parse_keyword(Keyword::FAMILY) {
7639                self.parse_drop_operator_family()
7640            } else if self.parse_keyword(Keyword::CLASS) {
7641                self.parse_drop_operator_class()
7642            } else {
7643                self.parse_drop_operator()
7644            };
7645        } else {
7646            return self.expected_ref(
7647                "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW, USER or WAREHOUSE after DROP",
7648                self.peek_token_ref(),
7649            );
7650        };
7651        // Many dialects support the non-standard `IF EXISTS` clause and allow
7652        // specifying multiple objects to delete in a single statement
7653        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7654        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7655
7656        let loc = self.peek_token_ref().span.start;
7657        let cascade = self.parse_keyword(Keyword::CASCADE);
7658        let restrict = self.parse_keyword(Keyword::RESTRICT);
7659        let purge = self.parse_keyword(Keyword::PURGE);
7660        if cascade && restrict {
7661            return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7662        }
7663        if object_type == ObjectType::Role && (cascade || restrict || purge) {
7664            return parser_err!(
7665                "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7666                loc
7667            );
7668        }
7669        let table = if self.parse_keyword(Keyword::ON) {
7670            Some(self.parse_object_name(false)?)
7671        } else {
7672            None
7673        };
7674        Ok(Statement::Drop {
7675            object_type,
7676            if_exists,
7677            names,
7678            cascade,
7679            restrict,
7680            purge,
7681            temporary,
7682            table,
7683        })
7684    }
7685
7686    fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7687        match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7688            Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7689            Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7690            _ => None,
7691        }
7692    }
7693
7694    /// ```sql
7695    /// DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7696    /// [ CASCADE | RESTRICT ]
7697    /// ```
7698    fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7699        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7700        let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7701        let drop_behavior = self.parse_optional_drop_behavior();
7702        Ok(DropFunction {
7703            if_exists,
7704            func_desc,
7705            drop_behavior,
7706        })
7707    }
7708
7709    /// ```sql
7710    /// DROP POLICY [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
7711    /// ```
7712    ///
7713    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-droppolicy.html)
7714    fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7715        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7716        let name = self.parse_identifier()?;
7717        self.expect_keyword_is(Keyword::ON)?;
7718        let table_name = self.parse_object_name(false)?;
7719        let drop_behavior = self.parse_optional_drop_behavior();
7720        Ok(DropPolicy {
7721            if_exists,
7722            name,
7723            table_name,
7724            drop_behavior,
7725        })
7726    }
7727    /// ```sql
7728    /// DROP CONNECTOR [IF EXISTS] name
7729    /// ```
7730    ///
7731    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-DropConnector)
7732    fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7733        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7734        let name = self.parse_identifier()?;
7735        Ok(Statement::DropConnector { if_exists, name })
7736    }
7737
7738    /// ```sql
7739    /// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
7740    /// ```
7741    fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7742        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7743        let name = self.parse_object_name(false)?;
7744        let drop_behavior = self.parse_optional_drop_behavior();
7745        Ok(DropDomain {
7746            if_exists,
7747            name,
7748            drop_behavior,
7749        })
7750    }
7751
7752    /// ```sql
7753    /// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
7754    /// [ CASCADE | RESTRICT ]
7755    /// ```
7756    fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7757        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7758        let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7759        let drop_behavior = self.parse_optional_drop_behavior();
7760        Ok(Statement::DropProcedure {
7761            if_exists,
7762            proc_desc,
7763            drop_behavior,
7764        })
7765    }
7766
7767    fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7768        let name = self.parse_object_name(false)?;
7769
7770        let args = if self.consume_token(&Token::LParen) {
7771            if self.consume_token(&Token::RParen) {
7772                Some(vec![])
7773            } else {
7774                let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7775                self.expect_token(&Token::RParen)?;
7776                Some(args)
7777            }
7778        } else {
7779            None
7780        };
7781
7782        Ok(FunctionDesc { name, args })
7783    }
7784
7785    /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
7786    fn parse_drop_secret(
7787        &mut self,
7788        temporary: bool,
7789        persistent: bool,
7790    ) -> Result<Statement, ParserError> {
7791        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7792        let name = self.parse_identifier()?;
7793        let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7794            self.parse_identifier().ok()
7795        } else {
7796            None
7797        };
7798        let temp = match (temporary, persistent) {
7799            (true, false) => Some(true),
7800            (false, true) => Some(false),
7801            (false, false) => None,
7802            _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7803        };
7804
7805        Ok(Statement::DropSecret {
7806            if_exists,
7807            temporary: temp,
7808            name,
7809            storage_specifier,
7810        })
7811    }
7812
7813    /// Parse a `DECLARE` statement.
7814    ///
7815    /// ```sql
7816    /// DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
7817    ///     CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
7818    /// ```
7819    ///
7820    /// The syntax can vary significantly between warehouses. See the grammar
7821    /// on the warehouse specific function in such cases.
7822    pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7823        if dialect_of!(self is BigQueryDialect) {
7824            return self.parse_big_query_declare();
7825        }
7826        if dialect_of!(self is SnowflakeDialect) {
7827            return self.parse_snowflake_declare();
7828        }
7829        if dialect_of!(self is MsSqlDialect) {
7830            return self.parse_mssql_declare();
7831        }
7832
7833        let name = self.parse_identifier()?;
7834
7835        let binary = Some(self.parse_keyword(Keyword::BINARY));
7836        let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7837            Some(true)
7838        } else if self.parse_keyword(Keyword::ASENSITIVE) {
7839            Some(false)
7840        } else {
7841            None
7842        };
7843        let scroll = if self.parse_keyword(Keyword::SCROLL) {
7844            Some(true)
7845        } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7846            Some(false)
7847        } else {
7848            None
7849        };
7850
7851        self.expect_keyword_is(Keyword::CURSOR)?;
7852        let declare_type = Some(DeclareType::Cursor);
7853
7854        let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7855            Some(keyword) => {
7856                self.expect_keyword_is(Keyword::HOLD)?;
7857
7858                match keyword {
7859                    Keyword::WITH => Some(true),
7860                    Keyword::WITHOUT => Some(false),
7861                    unexpected_keyword => return Err(ParserError::ParserError(
7862                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7863                    )),
7864                }
7865            }
7866            None => None,
7867        };
7868
7869        self.expect_keyword_is(Keyword::FOR)?;
7870
7871        let query = Some(self.parse_query()?);
7872
7873        Ok(Statement::Declare {
7874            stmts: vec![Declare {
7875                names: vec![name],
7876                data_type: None,
7877                assignment: None,
7878                declare_type,
7879                binary,
7880                sensitive,
7881                scroll,
7882                hold,
7883                for_query: query,
7884            }],
7885        })
7886    }
7887
7888    /// Parse a [BigQuery] `DECLARE` statement.
7889    ///
7890    /// Syntax:
7891    /// ```text
7892    /// DECLARE variable_name[, ...] [{ <variable_type> | <DEFAULT expression> }];
7893    /// ```
7894    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#declare
7895    pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7896        let names = self.parse_comma_separated(Parser::parse_identifier)?;
7897
7898        let data_type = match &self.peek_token_ref().token {
7899            Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7900            _ => Some(self.parse_data_type()?),
7901        };
7902
7903        let expr = if data_type.is_some() {
7904            if self.parse_keyword(Keyword::DEFAULT) {
7905                Some(self.parse_expr()?)
7906            } else {
7907                None
7908            }
7909        } else {
7910            // If no variable type - default expression must be specified, per BQ docs.
7911            // i.e `DECLARE foo;` is invalid.
7912            self.expect_keyword_is(Keyword::DEFAULT)?;
7913            Some(self.parse_expr()?)
7914        };
7915
7916        Ok(Statement::Declare {
7917            stmts: vec![Declare {
7918                names,
7919                data_type,
7920                assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7921                declare_type: None,
7922                binary: None,
7923                sensitive: None,
7924                scroll: None,
7925                hold: None,
7926                for_query: None,
7927            }],
7928        })
7929    }
7930
7931    /// Parse a [Snowflake] `DECLARE` statement.
7932    ///
7933    /// Syntax:
7934    /// ```text
7935    /// DECLARE
7936    ///   [{ <variable_declaration>
7937    ///      | <cursor_declaration>
7938    ///      | <resultset_declaration>
7939    ///      | <exception_declaration> }; ... ]
7940    ///
7941    /// <variable_declaration>
7942    /// <variable_name> [<type>] [ { DEFAULT | := } <expression>]
7943    ///
7944    /// <cursor_declaration>
7945    /// <cursor_name> CURSOR FOR <query>
7946    ///
7947    /// <resultset_declaration>
7948    /// <resultset_name> RESULTSET [ { DEFAULT | := } ( <query> ) ] ;
7949    ///
7950    /// <exception_declaration>
7951    /// <exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
7952    /// ```
7953    ///
7954    /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare
7955    pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7956        let mut stmts = vec![];
7957        loop {
7958            let name = self.parse_identifier()?;
7959            let (declare_type, for_query, assigned_expr, data_type) =
7960                if self.parse_keyword(Keyword::CURSOR) {
7961                    self.expect_keyword_is(Keyword::FOR)?;
7962                    match &self.peek_token_ref().token {
7963                        Token::Word(w) if w.keyword == Keyword::SELECT => (
7964                            Some(DeclareType::Cursor),
7965                            Some(self.parse_query()?),
7966                            None,
7967                            None,
7968                        ),
7969                        _ => (
7970                            Some(DeclareType::Cursor),
7971                            None,
7972                            Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7973                            None,
7974                        ),
7975                    }
7976                } else if self.parse_keyword(Keyword::RESULTSET) {
7977                    let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7978                        self.parse_snowflake_variable_declaration_expression()?
7979                    } else {
7980                        // Nothing more to do. The statement has no further parameters.
7981                        None
7982                    };
7983
7984                    (Some(DeclareType::ResultSet), None, assigned_expr, None)
7985                } else if self.parse_keyword(Keyword::EXCEPTION) {
7986                    let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7987                        Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7988                    } else {
7989                        // Nothing more to do. The statement has no further parameters.
7990                        None
7991                    };
7992
7993                    (Some(DeclareType::Exception), None, assigned_expr, None)
7994                } else {
7995                    // Without an explicit keyword, the only valid option is variable declaration.
7996                    let (assigned_expr, data_type) = if let Some(assigned_expr) =
7997                        self.parse_snowflake_variable_declaration_expression()?
7998                    {
7999                        (Some(assigned_expr), None)
8000                    } else if let Token::Word(_) = &self.peek_token_ref().token {
8001                        let data_type = self.parse_data_type()?;
8002                        (
8003                            self.parse_snowflake_variable_declaration_expression()?,
8004                            Some(data_type),
8005                        )
8006                    } else {
8007                        (None, None)
8008                    };
8009                    (None, None, assigned_expr, data_type)
8010                };
8011            let stmt = Declare {
8012                names: vec![name],
8013                data_type,
8014                assignment: assigned_expr,
8015                declare_type,
8016                binary: None,
8017                sensitive: None,
8018                scroll: None,
8019                hold: None,
8020                for_query,
8021            };
8022
8023            stmts.push(stmt);
8024            if self.consume_token(&Token::SemiColon) {
8025                match &self.peek_token_ref().token {
8026                    Token::Word(w)
8027                        if ALL_KEYWORDS
8028                            .binary_search(&w.value.to_uppercase().as_str())
8029                            .is_err() =>
8030                    {
8031                        // Not a keyword - start of a new declaration.
8032                        continue;
8033                    }
8034                    _ => {
8035                        // Put back the semicolon, this is the end of the DECLARE statement.
8036                        self.prev_token();
8037                    }
8038                }
8039            }
8040
8041            break;
8042        }
8043
8044        Ok(Statement::Declare { stmts })
8045    }
8046
8047    /// Parse a [MsSql] `DECLARE` statement.
8048    ///
8049    /// Syntax:
8050    /// ```text
8051    /// DECLARE
8052    // {
8053    //   { @local_variable [AS] data_type [ = value ] }
8054    //   | { @cursor_variable_name CURSOR [ FOR ] }
8055    // } [ ,...n ]
8056    /// ```
8057    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
8058    pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
8059        let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
8060
8061        Ok(Statement::Declare { stmts })
8062    }
8063
8064    /// Parse the body of a [MsSql] `DECLARE`statement.
8065    ///
8066    /// Syntax:
8067    /// ```text
8068    // {
8069    //   { @local_variable [AS] data_type [ = value ] }
8070    //   | { @cursor_variable_name CURSOR [ FOR ]}
8071    // } [ ,...n ]
8072    /// ```
8073    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
8074    pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
8075        let name = {
8076            let ident = self.parse_identifier()?;
8077            if !ident.value.starts_with('@')
8078                && !matches!(
8079                    &self.peek_token_ref().token,
8080                    Token::Word(w) if w.keyword == Keyword::CURSOR
8081                )
8082            {
8083                Err(ParserError::TokenizerError(
8084                    "Invalid MsSql variable declaration.".to_string(),
8085                ))
8086            } else {
8087                Ok(ident)
8088            }
8089        }?;
8090
8091        let (declare_type, data_type) = match &self.peek_token_ref().token {
8092            Token::Word(w) => match w.keyword {
8093                Keyword::CURSOR => {
8094                    self.next_token();
8095                    (Some(DeclareType::Cursor), None)
8096                }
8097                Keyword::AS => {
8098                    self.next_token();
8099                    (None, Some(self.parse_data_type()?))
8100                }
8101                _ => (None, Some(self.parse_data_type()?)),
8102            },
8103            _ => (None, Some(self.parse_data_type()?)),
8104        };
8105
8106        let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
8107            self.next_token();
8108            let query = Some(self.parse_query()?);
8109            (query, None)
8110        } else {
8111            let assignment = self.parse_mssql_variable_declaration_expression()?;
8112            (None, assignment)
8113        };
8114
8115        Ok(Declare {
8116            names: vec![name],
8117            data_type,
8118            assignment,
8119            declare_type,
8120            binary: None,
8121            sensitive: None,
8122            scroll: None,
8123            hold: None,
8124            for_query,
8125        })
8126    }
8127
8128    /// Parses the assigned expression in a variable declaration.
8129    ///
8130    /// Syntax:
8131    /// ```text
8132    /// [ { DEFAULT | := } <expression>]
8133    /// ```
8134    /// <https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare#variable-declaration-syntax>
8135    pub fn parse_snowflake_variable_declaration_expression(
8136        &mut self,
8137    ) -> Result<Option<DeclareAssignment>, ParserError> {
8138        Ok(match &self.peek_token_ref().token {
8139            Token::Word(w) if w.keyword == Keyword::DEFAULT => {
8140                self.next_token(); // Skip `DEFAULT`
8141                Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
8142            }
8143            Token::Assignment => {
8144                self.next_token(); // Skip `:=`
8145                Some(DeclareAssignment::DuckAssignment(Box::new(
8146                    self.parse_expr()?,
8147                )))
8148            }
8149            _ => None,
8150        })
8151    }
8152
8153    /// Parses the assigned expression in a variable declaration.
8154    ///
8155    /// Syntax:
8156    /// ```text
8157    /// [ = <expression>]
8158    /// ```
8159    pub fn parse_mssql_variable_declaration_expression(
8160        &mut self,
8161    ) -> Result<Option<DeclareAssignment>, ParserError> {
8162        Ok(match &self.peek_token_ref().token {
8163            Token::Eq => {
8164                self.next_token(); // Skip `=`
8165                Some(DeclareAssignment::MsSqlAssignment(Box::new(
8166                    self.parse_expr()?,
8167                )))
8168            }
8169            _ => None,
8170        })
8171    }
8172
8173    /// Parse `FETCH [direction] { FROM | IN } cursor INTO target;` statement.
8174    pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
8175        let direction = if self.parse_keyword(Keyword::NEXT) {
8176            FetchDirection::Next
8177        } else if self.parse_keyword(Keyword::PRIOR) {
8178            FetchDirection::Prior
8179        } else if self.parse_keyword(Keyword::FIRST) {
8180            FetchDirection::First
8181        } else if self.parse_keyword(Keyword::LAST) {
8182            FetchDirection::Last
8183        } else if self.parse_keyword(Keyword::ABSOLUTE) {
8184            FetchDirection::Absolute {
8185                limit: self.parse_number_value()?,
8186            }
8187        } else if self.parse_keyword(Keyword::RELATIVE) {
8188            FetchDirection::Relative {
8189                limit: self.parse_number_value()?,
8190            }
8191        } else if self.parse_keyword(Keyword::FORWARD) {
8192            if self.parse_keyword(Keyword::ALL) {
8193                FetchDirection::ForwardAll
8194            } else {
8195                FetchDirection::Forward {
8196                    // TODO: Support optional
8197                    limit: Some(self.parse_number_value()?),
8198                }
8199            }
8200        } else if self.parse_keyword(Keyword::BACKWARD) {
8201            if self.parse_keyword(Keyword::ALL) {
8202                FetchDirection::BackwardAll
8203            } else {
8204                FetchDirection::Backward {
8205                    // TODO: Support optional
8206                    limit: Some(self.parse_number_value()?),
8207                }
8208            }
8209        } else if self.parse_keyword(Keyword::ALL) {
8210            FetchDirection::All
8211        } else {
8212            FetchDirection::Count {
8213                limit: self.parse_number_value()?,
8214            }
8215        };
8216
8217        let position = if self.peek_keyword(Keyword::FROM) {
8218            self.expect_keyword(Keyword::FROM)?;
8219            FetchPosition::From
8220        } else if self.peek_keyword(Keyword::IN) {
8221            self.expect_keyword(Keyword::IN)?;
8222            FetchPosition::In
8223        } else {
8224            return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8225        };
8226
8227        let name = self.parse_identifier()?;
8228
8229        let into = if self.parse_keyword(Keyword::INTO) {
8230            Some(self.parse_object_name(false)?)
8231        } else {
8232            None
8233        };
8234
8235        Ok(Statement::Fetch {
8236            name,
8237            direction,
8238            position,
8239            into,
8240        })
8241    }
8242
8243    /// Parse a `DISCARD` statement.
8244    pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8245        let object_type = if self.parse_keyword(Keyword::ALL) {
8246            DiscardObject::ALL
8247        } else if self.parse_keyword(Keyword::PLANS) {
8248            DiscardObject::PLANS
8249        } else if self.parse_keyword(Keyword::SEQUENCES) {
8250            DiscardObject::SEQUENCES
8251        } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8252            DiscardObject::TEMP
8253        } else {
8254            return self.expected_ref(
8255                "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8256                self.peek_token_ref(),
8257            );
8258        };
8259        Ok(Statement::Discard { object_type })
8260    }
8261
8262    /// Parse a `CREATE INDEX` statement.
8263    pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8264        let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8265        let r#async = self.parse_keyword(Keyword::ASYNC);
8266        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8267
8268        let mut using = None;
8269
8270        let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8271            let index_name = self.parse_object_name(false)?;
8272            // MySQL allows `USING index_type` either before or after `ON table_name`
8273            using = self.parse_optional_using_then_index_type()?;
8274            self.expect_keyword_is(Keyword::ON)?;
8275            Some(index_name)
8276        } else {
8277            None
8278        };
8279
8280        let table_name = self.parse_object_name(false)?;
8281
8282        // MySQL allows having two `USING` clauses.
8283        // In that case, the second clause overwrites the first.
8284        using = self.parse_optional_using_then_index_type()?.or(using);
8285
8286        let columns = self.parse_parenthesized_index_column_list()?;
8287
8288        let include = if self.parse_keyword(Keyword::INCLUDE) {
8289            self.expect_token(&Token::LParen)?;
8290            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8291            self.expect_token(&Token::RParen)?;
8292            columns
8293        } else {
8294            vec![]
8295        };
8296
8297        let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8298            let not = self.parse_keyword(Keyword::NOT);
8299            self.expect_keyword_is(Keyword::DISTINCT)?;
8300            Some(!not)
8301        } else {
8302            None
8303        };
8304
8305        let with = if self.dialect.supports_create_index_with_clause()
8306            && self.parse_keyword(Keyword::WITH)
8307        {
8308            self.expect_token(&Token::LParen)?;
8309            let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8310            self.expect_token(&Token::RParen)?;
8311            with_params
8312        } else {
8313            Vec::new()
8314        };
8315
8316        let predicate = if self.parse_keyword(Keyword::WHERE) {
8317            Some(self.parse_expr()?)
8318        } else {
8319            None
8320        };
8321
8322        // MySQL options (including the modern style of `USING` after the column list instead of
8323        // before, which is deprecated) shouldn't conflict with other preceding options (e.g. `WITH
8324        // PARSER` won't be caught by the above `WITH` clause parsing because MySQL doesn't set that
8325        // support flag). This is probably invalid syntax for other dialects, but it is simpler to
8326        // parse it anyway (as we do inside `ALTER TABLE` and `CREATE TABLE` parsing).
8327        let index_options = self.parse_index_options()?;
8328
8329        // MySQL allows `ALGORITHM` and `LOCK` options. Unlike in `ALTER TABLE`, they need not be comma separated.
8330        let mut alter_options = Vec::new();
8331        while self
8332            .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8333            .is_some()
8334        {
8335            alter_options.push(self.parse_alter_table_operation()?)
8336        }
8337
8338        Ok(CreateIndex {
8339            name: index_name,
8340            table_name,
8341            using,
8342            columns,
8343            unique,
8344            concurrently,
8345            r#async,
8346            if_not_exists,
8347            include,
8348            nulls_distinct,
8349            with,
8350            predicate,
8351            index_options,
8352            alter_options,
8353        })
8354    }
8355
8356    /// Parse a `CREATE EXTENSION` statement.
8357    pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8358        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8359        let name = self.parse_identifier()?;
8360
8361        let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8362            let schema = if self.parse_keyword(Keyword::SCHEMA) {
8363                Some(self.parse_identifier()?)
8364            } else {
8365                None
8366            };
8367
8368            let version = if self.parse_keyword(Keyword::VERSION) {
8369                Some(self.parse_identifier()?)
8370            } else {
8371                None
8372            };
8373
8374            let cascade = self.parse_keyword(Keyword::CASCADE);
8375
8376            (schema, version, cascade)
8377        } else {
8378            (None, None, false)
8379        };
8380
8381        Ok(CreateExtension {
8382            name,
8383            if_not_exists,
8384            schema,
8385            version,
8386            cascade,
8387        })
8388    }
8389
8390    /// Parse a PostgreSQL-specific [Statement::CreateCollation] statement.
8391    pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8392        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8393        let name = self.parse_object_name(false)?;
8394
8395        let definition = if self.parse_keyword(Keyword::FROM) {
8396            CreateCollationDefinition::From(self.parse_object_name(false)?)
8397        } else if self.consume_token(&Token::LParen) {
8398            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8399            self.expect_token(&Token::RParen)?;
8400            CreateCollationDefinition::Options(options)
8401        } else {
8402            return self.expected_ref(
8403                "FROM or parenthesized option list after CREATE COLLATION name",
8404                self.peek_token_ref(),
8405            );
8406        };
8407
8408        Ok(CreateCollation {
8409            if_not_exists,
8410            name,
8411            definition,
8412        })
8413    }
8414
8415    /// Parse a PostgreSQL-specific [Statement::DropExtension] statement.
8416    pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8417        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8418        let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8419        let cascade_or_restrict =
8420            self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8421        Ok(Statement::DropExtension(DropExtension {
8422            names,
8423            if_exists,
8424            cascade_or_restrict: cascade_or_restrict
8425                .map(|k| match k {
8426                    Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8427                    Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8428                    _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8429                })
8430                .transpose()?,
8431        }))
8432    }
8433
8434    /// Parse a[Statement::DropOperator] statement.
8435    ///
8436    pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8437        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8438        let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8439        let drop_behavior = self.parse_optional_drop_behavior();
8440        Ok(Statement::DropOperator(DropOperator {
8441            if_exists,
8442            operators,
8443            drop_behavior,
8444        }))
8445    }
8446
8447    /// Parse an operator signature for a [Statement::DropOperator]
8448    /// Format: `name ( { left_type | NONE } , right_type )`
8449    fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8450        let name = self.parse_operator_name()?;
8451        self.expect_token(&Token::LParen)?;
8452
8453        // Parse left operand type (or NONE for prefix operators)
8454        let left_type = if self.parse_keyword(Keyword::NONE) {
8455            None
8456        } else {
8457            Some(self.parse_data_type()?)
8458        };
8459
8460        self.expect_token(&Token::Comma)?;
8461
8462        // Parse right operand type (always required)
8463        let right_type = self.parse_data_type()?;
8464
8465        self.expect_token(&Token::RParen)?;
8466
8467        Ok(DropOperatorSignature {
8468            name,
8469            left_type,
8470            right_type,
8471        })
8472    }
8473
8474    /// Parse a [Statement::DropOperatorFamily]
8475    ///
8476    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopfamily.html)
8477    pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8478        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8479        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8480        self.expect_keyword(Keyword::USING)?;
8481        let using = self.parse_identifier()?;
8482        let drop_behavior = self.parse_optional_drop_behavior();
8483        Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8484            if_exists,
8485            names,
8486            using,
8487            drop_behavior,
8488        }))
8489    }
8490
8491    /// Parse a [Statement::DropOperatorClass]
8492    ///
8493    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-dropopclass.html)
8494    pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8495        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8496        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8497        self.expect_keyword(Keyword::USING)?;
8498        let using = self.parse_identifier()?;
8499        let drop_behavior = self.parse_optional_drop_behavior();
8500        Ok(Statement::DropOperatorClass(DropOperatorClass {
8501            if_exists,
8502            names,
8503            using,
8504            drop_behavior,
8505        }))
8506    }
8507
8508    /// Parse Hive distribution style.
8509    ///
8510    /// TODO: Support parsing for `SKEWED` distribution style.
8511    pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8512        if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8513            self.expect_token(&Token::LParen)?;
8514            let columns =
8515                self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8516            self.expect_token(&Token::RParen)?;
8517            Ok(HiveDistributionStyle::PARTITIONED { columns })
8518        } else {
8519            Ok(HiveDistributionStyle::NONE)
8520        }
8521    }
8522
8523    /// Parse Redshift `DISTSTYLE { AUTO | EVEN | KEY | ALL }`.
8524    ///
8525    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
8526    fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8527        let token = self.next_token();
8528        match &token.token {
8529            Token::Word(w) => match w.keyword {
8530                Keyword::AUTO => Ok(DistStyle::Auto),
8531                Keyword::EVEN => Ok(DistStyle::Even),
8532                Keyword::KEY => Ok(DistStyle::Key),
8533                Keyword::ALL => Ok(DistStyle::All),
8534                _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8535            },
8536            _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8537        }
8538    }
8539
8540    /// Parse Hive formats.
8541    pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8542        let mut hive_format: Option<HiveFormat> = None;
8543        loop {
8544            match self.parse_one_of_keywords(&[
8545                Keyword::ROW,
8546                Keyword::STORED,
8547                Keyword::LOCATION,
8548                Keyword::WITH,
8549                Keyword::USING,
8550            ]) {
8551                Some(Keyword::ROW) => {
8552                    hive_format
8553                        .get_or_insert_with(HiveFormat::default)
8554                        .row_format = Some(self.parse_row_format()?);
8555                }
8556                Some(Keyword::STORED) => {
8557                    self.expect_keyword_is(Keyword::AS)?;
8558                    if self.parse_keyword(Keyword::INPUTFORMAT) {
8559                        let input_format = self.parse_expr()?;
8560                        self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8561                        let output_format = self.parse_expr()?;
8562                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8563                            Some(HiveIOFormat::IOF {
8564                                input_format,
8565                                output_format,
8566                            });
8567                    } else {
8568                        let format = self.parse_file_format()?;
8569                        hive_format.get_or_insert_with(HiveFormat::default).storage =
8570                            Some(HiveIOFormat::FileFormat { format });
8571                    }
8572                }
8573                Some(Keyword::LOCATION) => {
8574                    hive_format.get_or_insert_with(HiveFormat::default).location =
8575                        Some(self.parse_literal_string()?);
8576                }
8577                Some(Keyword::WITH) => {
8578                    self.prev_token();
8579                    let properties = self
8580                        .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8581                    if !properties.is_empty() {
8582                        hive_format
8583                            .get_or_insert_with(HiveFormat::default)
8584                            .serde_properties = Some(properties);
8585                    } else {
8586                        break;
8587                    }
8588                }
8589                Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8590                    let format = self.parse_identifier()?;
8591                    hive_format.get_or_insert_with(HiveFormat::default).storage =
8592                        Some(HiveIOFormat::Using { format });
8593                }
8594                Some(Keyword::USING) => {
8595                    // USING is not a table format keyword in this dialect; put it back
8596                    self.prev_token();
8597                    break;
8598                }
8599                None => break,
8600                _ => break,
8601            }
8602        }
8603
8604        Ok(hive_format)
8605    }
8606
8607    /// Parse Hive row format.
8608    pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8609        self.expect_keyword_is(Keyword::FORMAT)?;
8610        match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8611            Some(Keyword::SERDE) => {
8612                let class = self.parse_literal_string()?;
8613                Ok(HiveRowFormat::SERDE { class })
8614            }
8615            _ => {
8616                let mut row_delimiters = vec![];
8617
8618                loop {
8619                    match self.parse_one_of_keywords(&[
8620                        Keyword::FIELDS,
8621                        Keyword::COLLECTION,
8622                        Keyword::MAP,
8623                        Keyword::LINES,
8624                        Keyword::NULL,
8625                    ]) {
8626                        Some(Keyword::FIELDS)
8627                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8628                        {
8629                            row_delimiters.push(HiveRowDelimiter {
8630                                delimiter: HiveDelimiter::FieldsTerminatedBy,
8631                                char: self.parse_identifier()?,
8632                            });
8633
8634                            if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8635                                row_delimiters.push(HiveRowDelimiter {
8636                                    delimiter: HiveDelimiter::FieldsEscapedBy,
8637                                    char: self.parse_identifier()?,
8638                                });
8639                            }
8640                        }
8641                        Some(Keyword::COLLECTION)
8642                            if self.parse_keywords(&[
8643                                Keyword::ITEMS,
8644                                Keyword::TERMINATED,
8645                                Keyword::BY,
8646                            ]) =>
8647                        {
8648                            row_delimiters.push(HiveRowDelimiter {
8649                                delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8650                                char: self.parse_identifier()?,
8651                            });
8652                        }
8653                        Some(Keyword::MAP)
8654                            if self.parse_keywords(&[
8655                                Keyword::KEYS,
8656                                Keyword::TERMINATED,
8657                                Keyword::BY,
8658                            ]) =>
8659                        {
8660                            row_delimiters.push(HiveRowDelimiter {
8661                                delimiter: HiveDelimiter::MapKeysTerminatedBy,
8662                                char: self.parse_identifier()?,
8663                            });
8664                        }
8665                        Some(Keyword::LINES)
8666                            if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8667                        {
8668                            row_delimiters.push(HiveRowDelimiter {
8669                                delimiter: HiveDelimiter::LinesTerminatedBy,
8670                                char: self.parse_identifier()?,
8671                            });
8672                        }
8673                        Some(Keyword::NULL)
8674                            if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8675                        {
8676                            row_delimiters.push(HiveRowDelimiter {
8677                                delimiter: HiveDelimiter::NullDefinedAs,
8678                                char: self.parse_identifier()?,
8679                            });
8680                        }
8681                        Some(Keyword::NULL) => break,
8682                        _ => {
8683                            break;
8684                        }
8685                    }
8686                }
8687
8688                Ok(HiveRowFormat::DELIMITED {
8689                    delimiters: row_delimiters,
8690                })
8691            }
8692        }
8693    }
8694
8695    fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8696        if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8697            Ok(Some(self.parse_identifier()?))
8698        } else {
8699            Ok(None)
8700        }
8701    }
8702
8703    /// Parse `CREATE TABLE` statement.
8704    #[allow(clippy::too_many_arguments)]
8705    pub fn parse_create_table(
8706        &mut self,
8707        or_replace: bool,
8708        temporary: bool,
8709        unlogged: bool,
8710        global: Option<bool>,
8711        transient: bool,
8712        volatile: bool,
8713        multiset: Option<bool>,
8714    ) -> Result<CreateTable, ParserError> {
8715        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8716        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8717        let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8718
8719        let fallback = if self.dialect.supports_leading_comma_before_table_options()
8720            && self.consume_token(&Token::Comma)
8721        {
8722            let fallback = self.maybe_parse_fallback()?;
8723            if fallback.is_none() {
8724                self.prev_token(); // Put back comma.
8725            }
8726            fallback
8727        } else {
8728            None
8729        };
8730
8731        // PostgreSQL PARTITION OF for child partition tables
8732        // Note: This is a PostgreSQL-specific feature, but the dialect check was intentionally
8733        // removed to allow GenericDialect and other dialects to parse this syntax. This enables
8734        // multi-dialect SQL tools to work with PostgreSQL-specific DDL statements.
8735        //
8736        // PARTITION OF can be combined with other table definition clauses in the AST,
8737        // though PostgreSQL itself prohibits PARTITION OF with AS SELECT or LIKE clauses.
8738        // The parser accepts these combinations for flexibility; semantic validation
8739        // is left to downstream tools.
8740        // Child partitions can have their own constraints and indexes.
8741        let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8742            Some(self.parse_object_name(allow_unquoted_hyphen)?)
8743        } else {
8744            None
8745        };
8746
8747        // Clickhouse has `ON CLUSTER 'cluster'` syntax for DDLs
8748        let on_cluster = self.parse_optional_on_cluster()?;
8749
8750        let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8751
8752        let clone = if self.parse_keyword(Keyword::CLONE) {
8753            self.parse_object_name(allow_unquoted_hyphen).ok()
8754        } else {
8755            None
8756        };
8757
8758        // parse optional column list (schema)
8759        let (columns, constraints) = self.parse_columns()?;
8760        let comment_after_column_def =
8761            if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8762                let next_token = self.next_token();
8763                match next_token.token {
8764                    Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8765                    _ => self.expected("comment", next_token)?,
8766                }
8767            } else {
8768                None
8769            };
8770
8771        // PostgreSQL PARTITION OF: partition bound specification
8772        let for_values = if partition_of.is_some() {
8773            if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8774                Some(self.parse_partition_for_values()?)
8775            } else {
8776                return self.expected_ref(
8777                    "FOR VALUES or DEFAULT after PARTITION OF",
8778                    self.peek_token_ref(),
8779                );
8780            }
8781        } else {
8782            None
8783        };
8784
8785        // SQLite supports `WITHOUT ROWID` at the end of `CREATE TABLE`
8786        let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8787
8788        let hive_distribution = self.parse_hive_distribution()?;
8789        let clustered_by = self.parse_optional_clustered_by()?;
8790        let hive_formats = self.parse_hive_formats()?;
8791
8792        let create_table_config = self.parse_optional_create_table_config()?;
8793
8794        // ClickHouse supports `PRIMARY KEY`, before `ORDER BY`
8795        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#primary-key
8796        let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8797            && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8798        {
8799            Some(Box::new(self.parse_expr()?))
8800        } else {
8801            None
8802        };
8803
8804        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8805            if self.consume_token(&Token::LParen) {
8806                let columns = if self.peek_token_ref().token != Token::RParen {
8807                    self.parse_comma_separated(|p| p.parse_expr())?
8808                } else {
8809                    vec![]
8810                };
8811                self.expect_token(&Token::RParen)?;
8812                Some(OneOrManyWithParens::Many(columns))
8813            } else {
8814                Some(OneOrManyWithParens::One(self.parse_expr()?))
8815            }
8816        } else {
8817            None
8818        };
8819
8820        // ClickHouse allows PARTITION BY after ORDER BY
8821        // https://clickhouse.com/docs/en/sql-reference/statements/create/table#partition-by
8822        let partition_by = if create_table_config.partition_by.is_none()
8823            && self.dialect.supports_partition_by_after_order_by()
8824            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8825        {
8826            Some(Box::new(self.parse_expr()?))
8827        } else {
8828            create_table_config.partition_by
8829        };
8830
8831        let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8832            Some(self.parse_create_table_on_commit()?)
8833        } else {
8834            None
8835        };
8836
8837        let strict = self.parse_keyword(Keyword::STRICT);
8838
8839        // Redshift: BACKUP YES|NO
8840        let backup = if self.parse_keyword(Keyword::BACKUP) {
8841            let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8842            Some(keyword == Keyword::YES)
8843        } else {
8844            None
8845        };
8846
8847        // Redshift: DISTSTYLE, DISTKEY, SORTKEY
8848        let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8849            Some(self.parse_dist_style()?)
8850        } else {
8851            None
8852        };
8853        let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8854            self.expect_token(&Token::LParen)?;
8855            let expr = self.parse_expr()?;
8856            self.expect_token(&Token::RParen)?;
8857            Some(expr)
8858        } else {
8859            None
8860        };
8861        let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8862            self.expect_token(&Token::LParen)?;
8863            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8864            self.expect_token(&Token::RParen)?;
8865            Some(columns)
8866        } else {
8867            None
8868        };
8869
8870        // Parse optional `AS ( query )`
8871        let query = if self.parse_keyword(Keyword::AS) {
8872            Some(self.parse_query()?)
8873        } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8874        {
8875            // rewind the SELECT keyword
8876            self.prev_token();
8877            Some(self.parse_query()?)
8878        } else {
8879            None
8880        };
8881
8882        // `WITH DATA` clause only applies if there is a query body.
8883        let with_data = if query.is_some() {
8884            self.maybe_parse_with_data()?
8885        } else {
8886            None
8887        };
8888
8889        Ok(CreateTableBuilder::new(table_name)
8890            .temporary(temporary)
8891            .unlogged(unlogged)
8892            .columns(columns)
8893            .constraints(constraints)
8894            .or_replace(or_replace)
8895            .if_not_exists(if_not_exists)
8896            .transient(transient)
8897            .volatile(volatile)
8898            .multiset(multiset)
8899            .fallback(fallback)
8900            .hive_distribution(hive_distribution)
8901            .hive_formats(hive_formats)
8902            .global(global)
8903            .query(query)
8904            .without_rowid(without_rowid)
8905            .like(like)
8906            .clone_clause(clone)
8907            .comment_after_column_def(comment_after_column_def)
8908            .order_by(order_by)
8909            .on_commit(on_commit)
8910            .on_cluster(on_cluster)
8911            .clustered_by(clustered_by)
8912            .partition_by(partition_by)
8913            .cluster_by(create_table_config.cluster_by)
8914            .inherits(create_table_config.inherits)
8915            .partition_of(partition_of)
8916            .for_values(for_values)
8917            .table_options(create_table_config.table_options)
8918            .primary_key(primary_key)
8919            .with_data(with_data)
8920            .strict(strict)
8921            .backup(backup)
8922            .diststyle(diststyle)
8923            .distkey(distkey)
8924            .sortkey(sortkey)
8925            .build())
8926    }
8927
8928    /// Parse `MULTISET` table-kind prefix on `CREATE TABLE`.
8929    fn maybe_parse_multiset(&mut self) -> Option<bool> {
8930        match self.parse_one_of_keywords(&[Keyword::SET, Keyword::MULTISET]) {
8931            Some(Keyword::MULTISET) => Some(true),
8932            Some(Keyword::SET) => Some(false),
8933            _ => None,
8934        }
8935    }
8936
8937    /// Parse `FALLBACK` option on a `CREATE TABLE` statement,
8938    fn maybe_parse_fallback(&mut self) -> Result<Option<bool>, ParserError> {
8939        if self.parse_keywords(&[Keyword::NO, Keyword::FALLBACK]) {
8940            Ok(Some(false))
8941        } else if self.parse_keyword(Keyword::FALLBACK) {
8942            Ok(Some(true))
8943        } else {
8944            Ok(None)
8945        }
8946    }
8947
8948    /// Parse [`WithData`] clause on `CREATE TABLE ... AS` statement.
8949    fn maybe_parse_with_data(&mut self) -> Result<Option<WithData>, ParserError> {
8950        let data = if self.parse_keywords(&[Keyword::WITH, Keyword::DATA]) {
8951            true
8952        } else if self.parse_keywords(&[Keyword::WITH, Keyword::NO, Keyword::DATA]) {
8953            false
8954        } else {
8955            return Ok(None);
8956        };
8957
8958        let statistics = if self.parse_keywords(&[Keyword::AND, Keyword::STATISTICS]) {
8959            Some(true)
8960        } else if self.parse_keywords(&[Keyword::AND, Keyword::NO, Keyword::STATISTICS]) {
8961            Some(false)
8962        } else {
8963            None
8964        };
8965
8966        Ok(Some(WithData { data, statistics }))
8967    }
8968
8969    fn maybe_parse_create_table_like(
8970        &mut self,
8971        allow_unquoted_hyphen: bool,
8972    ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8973        let like = if self.dialect.supports_create_table_like_parenthesized()
8974            && self.consume_token(&Token::LParen)
8975        {
8976            if self.parse_keyword(Keyword::LIKE) {
8977                let name = self.parse_object_name(allow_unquoted_hyphen)?;
8978                let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
8979                    Some(CreateTableLikeDefaults::Including)
8980                } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
8981                    Some(CreateTableLikeDefaults::Excluding)
8982                } else {
8983                    None
8984                };
8985                self.expect_token(&Token::RParen)?;
8986                Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
8987                    name,
8988                    defaults,
8989                }))
8990            } else {
8991                // Rollback the '(' it's probably the columns list
8992                self.prev_token();
8993                None
8994            }
8995        } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
8996            let name = self.parse_object_name(allow_unquoted_hyphen)?;
8997            Some(CreateTableLikeKind::Plain(CreateTableLike {
8998                name,
8999                defaults: None,
9000            }))
9001        } else {
9002            None
9003        };
9004        Ok(like)
9005    }
9006
9007    pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
9008        if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
9009            Ok(OnCommit::DeleteRows)
9010        } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
9011            Ok(OnCommit::PreserveRows)
9012        } else if self.parse_keywords(&[Keyword::DROP]) {
9013            Ok(OnCommit::Drop)
9014        } else {
9015            parser_err!(
9016                "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
9017                self.peek_token_ref()
9018            )
9019        }
9020    }
9021
9022    /// Parse [ForValues] of a `PARTITION OF` clause.
9023    ///
9024    /// Parses: `FOR VALUES partition_bound_spec | DEFAULT`
9025    ///
9026    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtable.html)
9027    fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
9028        if self.parse_keyword(Keyword::DEFAULT) {
9029            return Ok(ForValues::Default);
9030        }
9031
9032        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
9033
9034        if self.parse_keyword(Keyword::IN) {
9035            // FOR VALUES IN (expr, ...)
9036            self.expect_token(&Token::LParen)?;
9037            if self.peek_token_ref().token == Token::RParen {
9038                return self.expected_ref("at least one value", self.peek_token_ref());
9039            }
9040            let values = self.parse_comma_separated(Parser::parse_expr)?;
9041            self.expect_token(&Token::RParen)?;
9042            Ok(ForValues::In(values))
9043        } else if self.parse_keyword(Keyword::FROM) {
9044            // FOR VALUES FROM (...) TO (...)
9045            self.expect_token(&Token::LParen)?;
9046            if self.peek_token_ref().token == Token::RParen {
9047                return self.expected_ref("at least one value", self.peek_token_ref());
9048            }
9049            let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9050            self.expect_token(&Token::RParen)?;
9051            self.expect_keyword(Keyword::TO)?;
9052            self.expect_token(&Token::LParen)?;
9053            if self.peek_token_ref().token == Token::RParen {
9054                return self.expected_ref("at least one value", self.peek_token_ref());
9055            }
9056            let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9057            self.expect_token(&Token::RParen)?;
9058            Ok(ForValues::From { from, to })
9059        } else if self.parse_keyword(Keyword::WITH) {
9060            // FOR VALUES WITH (MODULUS n, REMAINDER r)
9061            self.expect_token(&Token::LParen)?;
9062            self.expect_keyword(Keyword::MODULUS)?;
9063            let modulus = self.parse_literal_uint()?;
9064            self.expect_token(&Token::Comma)?;
9065            self.expect_keyword(Keyword::REMAINDER)?;
9066            let remainder = self.parse_literal_uint()?;
9067            self.expect_token(&Token::RParen)?;
9068            Ok(ForValues::With { modulus, remainder })
9069        } else {
9070            self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
9071        }
9072    }
9073
9074    /// Parse a single partition bound value (MINVALUE, MAXVALUE, or expression).
9075    fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
9076        if self.parse_keyword(Keyword::MINVALUE) {
9077            Ok(PartitionBoundValue::MinValue)
9078        } else if self.parse_keyword(Keyword::MAXVALUE) {
9079            Ok(PartitionBoundValue::MaxValue)
9080        } else {
9081            Ok(PartitionBoundValue::Expr(self.parse_expr()?))
9082        }
9083    }
9084
9085    /// Parse configuration like inheritance, partitioning, clustering information during the table creation.
9086    ///
9087    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2)
9088    /// [PostgreSQL](https://www.postgresql.org/docs/current/ddl-partitioning.html)
9089    /// [MySql](https://dev.mysql.com/doc/refman/8.4/en/create-table.html)
9090    fn parse_optional_create_table_config(
9091        &mut self,
9092    ) -> Result<CreateTableConfiguration, ParserError> {
9093        let mut table_options = CreateTableOptions::None;
9094
9095        let inherits = if self.parse_keyword(Keyword::INHERITS) {
9096            Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
9097        } else {
9098            None
9099        };
9100
9101        // PostgreSQL supports `WITH ( options )`, before `AS`
9102        let with_options = self.parse_options(Keyword::WITH)?;
9103        if !with_options.is_empty() {
9104            table_options = CreateTableOptions::With(with_options)
9105        }
9106
9107        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
9108        if !table_properties.is_empty() {
9109            table_options = CreateTableOptions::TableProperties(table_properties);
9110        }
9111        let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
9112            && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
9113        {
9114            Some(Box::new(self.parse_expr()?))
9115        } else {
9116            None
9117        };
9118
9119        let mut cluster_by = None;
9120        if dialect_of!(self is BigQueryDialect | GenericDialect) {
9121            if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
9122                cluster_by = Some(WrappedCollection::NoWrapping(
9123                    self.parse_comma_separated(|p| p.parse_expr())?,
9124                ));
9125            };
9126
9127            if let Token::Word(word) = &self.peek_token_ref().token {
9128                if word.keyword == Keyword::OPTIONS {
9129                    table_options =
9130                        CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
9131                }
9132            };
9133        }
9134
9135        if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
9136            let plain_options = self.parse_plain_options()?;
9137            if !plain_options.is_empty() {
9138                table_options = CreateTableOptions::Plain(plain_options)
9139            }
9140        };
9141
9142        Ok(CreateTableConfiguration {
9143            partition_by,
9144            cluster_by,
9145            inherits,
9146            table_options,
9147        })
9148    }
9149
9150    fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
9151        // Single parameter option
9152        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9153        if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
9154            return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
9155        }
9156
9157        // Custom option
9158        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9159        if self.parse_keywords(&[Keyword::COMMENT]) {
9160            let has_eq = self.consume_token(&Token::Eq);
9161            let value = self.next_token();
9162
9163            let comment = match (has_eq, value.token) {
9164                (true, Token::SingleQuotedString(s)) => {
9165                    Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
9166                }
9167                (false, Token::SingleQuotedString(s)) => {
9168                    Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
9169                }
9170                (_, token) => {
9171                    self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
9172                }
9173            };
9174            return comment;
9175        }
9176
9177        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9178        // <https://clickhouse.com/docs/sql-reference/statements/create/table>
9179        if self.parse_keywords(&[Keyword::ENGINE]) {
9180            let _ = self.consume_token(&Token::Eq);
9181            let value = self.next_token();
9182
9183            let engine = match value.token {
9184                Token::Word(w) => {
9185                    let parameters = if self.peek_token_ref().token == Token::LParen {
9186                        self.parse_parenthesized_identifiers()?
9187                    } else {
9188                        vec![]
9189                    };
9190
9191                    Ok(Some(SqlOption::NamedParenthesizedList(
9192                        NamedParenthesizedList {
9193                            key: Ident::new("ENGINE"),
9194                            name: Some(Ident::new(w.value)),
9195                            values: parameters,
9196                        },
9197                    )))
9198                }
9199                _ => {
9200                    return self.expected("Token::Word", value)?;
9201                }
9202            };
9203
9204            return engine;
9205        }
9206
9207        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9208        if self.parse_keywords(&[Keyword::TABLESPACE]) {
9209            let _ = self.consume_token(&Token::Eq);
9210            let value = self.next_token();
9211
9212            let tablespace = match value.token {
9213                Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
9214                    let storage = match self.parse_keyword(Keyword::STORAGE) {
9215                        true => {
9216                            let _ = self.consume_token(&Token::Eq);
9217                            let storage_token = self.next_token();
9218                            match &storage_token.token {
9219                                Token::Word(w) => match w.value.to_uppercase().as_str() {
9220                                    "DISK" => Some(StorageType::Disk),
9221                                    "MEMORY" => Some(StorageType::Memory),
9222                                    _ => self
9223                                        .expected("Storage type (DISK or MEMORY)", storage_token)?,
9224                                },
9225                                _ => self.expected("Token::Word", storage_token)?,
9226                            }
9227                        }
9228                        false => None,
9229                    };
9230
9231                    Ok(Some(SqlOption::TableSpace(TablespaceOption {
9232                        name,
9233                        storage,
9234                    })))
9235                }
9236                _ => {
9237                    return self.expected("Token::Word", value)?;
9238                }
9239            };
9240
9241            return tablespace;
9242        }
9243
9244        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
9245        if self.parse_keyword(Keyword::UNION) {
9246            let _ = self.consume_token(&Token::Eq);
9247            let value = self.next_token();
9248
9249            match value.token {
9250                Token::LParen => {
9251                    let tables: Vec<Ident> =
9252                        self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9253                    self.expect_token(&Token::RParen)?;
9254
9255                    return Ok(Some(SqlOption::NamedParenthesizedList(
9256                        NamedParenthesizedList {
9257                            key: Ident::new("UNION"),
9258                            name: None,
9259                            values: tables,
9260                        },
9261                    )));
9262                }
9263                _ => {
9264                    return self.expected("Token::LParen", value)?;
9265                }
9266            }
9267        }
9268
9269        // Key/Value parameter option
9270        let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9271            Ident::new("DEFAULT CHARSET")
9272        } else if self.parse_keyword(Keyword::CHARSET) {
9273            Ident::new("CHARSET")
9274        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9275            Ident::new("DEFAULT CHARACTER SET")
9276        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9277            Ident::new("CHARACTER SET")
9278        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9279            Ident::new("DEFAULT COLLATE")
9280        } else if self.parse_keyword(Keyword::COLLATE) {
9281            Ident::new("COLLATE")
9282        } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9283            Ident::new("DATA DIRECTORY")
9284        } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9285            Ident::new("INDEX DIRECTORY")
9286        } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9287            Ident::new("KEY_BLOCK_SIZE")
9288        } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9289            Ident::new("ROW_FORMAT")
9290        } else if self.parse_keyword(Keyword::PACK_KEYS) {
9291            Ident::new("PACK_KEYS")
9292        } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9293            Ident::new("STATS_AUTO_RECALC")
9294        } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9295            Ident::new("STATS_PERSISTENT")
9296        } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9297            Ident::new("STATS_SAMPLE_PAGES")
9298        } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9299            Ident::new("DELAY_KEY_WRITE")
9300        } else if self.parse_keyword(Keyword::COMPRESSION) {
9301            Ident::new("COMPRESSION")
9302        } else if self.parse_keyword(Keyword::ENCRYPTION) {
9303            Ident::new("ENCRYPTION")
9304        } else if self.parse_keyword(Keyword::MAX_ROWS) {
9305            Ident::new("MAX_ROWS")
9306        } else if self.parse_keyword(Keyword::MIN_ROWS) {
9307            Ident::new("MIN_ROWS")
9308        } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9309            Ident::new("AUTOEXTEND_SIZE")
9310        } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9311            Ident::new("AVG_ROW_LENGTH")
9312        } else if self.parse_keyword(Keyword::CHECKSUM) {
9313            Ident::new("CHECKSUM")
9314        } else if self.parse_keyword(Keyword::CONNECTION) {
9315            Ident::new("CONNECTION")
9316        } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9317            Ident::new("ENGINE_ATTRIBUTE")
9318        } else if self.parse_keyword(Keyword::PASSWORD) {
9319            Ident::new("PASSWORD")
9320        } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9321            Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9322        } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9323            Ident::new("INSERT_METHOD")
9324        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9325            Ident::new("AUTO_INCREMENT")
9326        } else {
9327            return Ok(None);
9328        };
9329
9330        let _ = self.consume_token(&Token::Eq);
9331
9332        let value = match self
9333            .maybe_parse(|parser| parser.parse_value())?
9334            .map(Expr::Value)
9335        {
9336            Some(expr) => expr,
9337            None => Expr::Identifier(self.parse_identifier()?),
9338        };
9339
9340        Ok(Some(SqlOption::KeyValue { key, value }))
9341    }
9342
9343    /// Parse plain options.
9344    pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9345        let mut options = Vec::new();
9346
9347        while let Some(option) = self.parse_plain_option()? {
9348            options.push(option);
9349            // Some dialects support comma-separated options; it shouldn't introduce ambiguity to
9350            // consume it for all dialects.
9351            let _ = self.consume_token(&Token::Comma);
9352        }
9353
9354        Ok(options)
9355    }
9356
9357    /// Parse optional inline comment.
9358    pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9359        let comment = if self.parse_keyword(Keyword::COMMENT) {
9360            let has_eq = self.consume_token(&Token::Eq);
9361            let comment = self.parse_comment_value()?;
9362            Some(if has_eq {
9363                CommentDef::WithEq(comment)
9364            } else {
9365                CommentDef::WithoutEq(comment)
9366            })
9367        } else {
9368            None
9369        };
9370        Ok(comment)
9371    }
9372
9373    /// Parse comment value.
9374    pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9375        let next_token = self.next_token();
9376        let value = match next_token.token {
9377            Token::SingleQuotedString(str) => str,
9378            Token::DollarQuotedString(str) => str.value,
9379            _ => self.expected("string literal", next_token)?,
9380        };
9381        Ok(value)
9382    }
9383
9384    /// Parse optional procedure parameters.
9385    pub fn parse_optional_procedure_parameters(
9386        &mut self,
9387    ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9388        let mut params = vec![];
9389        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9390            return Ok(Some(params));
9391        }
9392        loop {
9393            if let Token::Word(_) = &self.peek_token_ref().token {
9394                params.push(self.parse_procedure_param()?)
9395            }
9396            let comma = self.consume_token(&Token::Comma);
9397            if self.consume_token(&Token::RParen) {
9398                // allow a trailing comma, even though it's not in standard
9399                break;
9400            } else if !comma {
9401                return self.expected_ref(
9402                    "',' or ')' after parameter definition",
9403                    self.peek_token_ref(),
9404                );
9405            }
9406        }
9407        Ok(Some(params))
9408    }
9409
9410    /// Parse columns and constraints.
9411    pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9412        let mut columns = vec![];
9413        let mut constraints = vec![];
9414        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9415            return Ok((columns, constraints));
9416        }
9417
9418        loop {
9419            if let Some(constraint) = self.parse_optional_table_constraint()? {
9420                constraints.push(constraint);
9421            } else if let Token::Word(_) = &self.peek_token_ref().token {
9422                columns.push(self.parse_column_def()?);
9423            } else {
9424                return self.expected_ref(
9425                    "column name or constraint definition",
9426                    self.peek_token_ref(),
9427                );
9428            }
9429
9430            let comma = self.consume_token(&Token::Comma);
9431            let rparen = self.peek_token_ref().token == Token::RParen;
9432
9433            if !comma && !rparen {
9434                return self
9435                    .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9436            };
9437
9438            if rparen
9439                && (!comma
9440                    || self.dialect.supports_column_definition_trailing_commas()
9441                    || self.options.trailing_commas)
9442            {
9443                let _ = self.consume_token(&Token::RParen);
9444                break;
9445            }
9446        }
9447
9448        Ok((columns, constraints))
9449    }
9450
9451    /// Parse procedure parameter.
9452    pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9453        let mode = if self.parse_keyword(Keyword::IN) {
9454            Some(ArgMode::In)
9455        } else if self.parse_keyword(Keyword::OUT) {
9456            Some(ArgMode::Out)
9457        } else if self.parse_keyword(Keyword::INOUT) {
9458            Some(ArgMode::InOut)
9459        } else {
9460            None
9461        };
9462        let name = self.parse_identifier()?;
9463        let data_type = self.parse_data_type()?;
9464        let default = if self.consume_token(&Token::Eq) {
9465            Some(self.parse_expr()?)
9466        } else {
9467            None
9468        };
9469
9470        Ok(ProcedureParam {
9471            name,
9472            data_type,
9473            mode,
9474            default,
9475        })
9476    }
9477
9478    /// Parse column definition.
9479    pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9480        self.parse_column_def_inner(false)
9481    }
9482
9483    fn parse_column_def_inner(
9484        &mut self,
9485        optional_data_type: bool,
9486    ) -> Result<ColumnDef, ParserError> {
9487        let col_name = self.parse_identifier()?;
9488        let data_type = if self.is_column_type_sqlite_unspecified() {
9489            DataType::Unspecified
9490        } else if optional_data_type {
9491            self.maybe_parse(|parser| parser.parse_data_type())?
9492                .unwrap_or(DataType::Unspecified)
9493        } else {
9494            self.parse_data_type()?
9495        };
9496        let mut options = vec![];
9497        loop {
9498            if self.parse_keyword(Keyword::CONSTRAINT) {
9499                let name = Some(self.parse_identifier()?);
9500                if let Some(option) = self.parse_optional_column_option()? {
9501                    options.push(ColumnOptionDef { name, option });
9502                } else {
9503                    return self.expected_ref(
9504                        "constraint details after CONSTRAINT <name>",
9505                        self.peek_token_ref(),
9506                    );
9507                }
9508            } else if let Some(option) = self.parse_optional_column_option()? {
9509                options.push(ColumnOptionDef { name: None, option });
9510            } else {
9511                break;
9512            };
9513        }
9514        Ok(ColumnDef {
9515            name: col_name,
9516            data_type,
9517            options,
9518        })
9519    }
9520
9521    fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9522        if dialect_of!(self is SQLiteDialect) {
9523            match &self.peek_token_ref().token {
9524                Token::Word(word) => matches!(
9525                    word.keyword,
9526                    Keyword::CONSTRAINT
9527                        | Keyword::PRIMARY
9528                        | Keyword::NOT
9529                        | Keyword::UNIQUE
9530                        | Keyword::CHECK
9531                        | Keyword::DEFAULT
9532                        | Keyword::COLLATE
9533                        | Keyword::REFERENCES
9534                        | Keyword::GENERATED
9535                        | Keyword::AS
9536                ),
9537                _ => true, // e.g. comma immediately after column name
9538            }
9539        } else {
9540            false
9541        }
9542    }
9543
9544    /// Parse optional column option.
9545    pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9546        if let Some(option) = self.dialect.parse_column_option(self)? {
9547            return option;
9548        }
9549
9550        self.with_state(
9551            ColumnDefinition,
9552            |parser| -> Result<Option<ColumnOption>, ParserError> {
9553                parser.parse_optional_column_option_inner()
9554            },
9555        )
9556    }
9557
9558    fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9559        if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9560            Ok(Some(ColumnOption::CharacterSet(
9561                self.parse_object_name(false)?,
9562            )))
9563        } else if self.parse_keywords(&[Keyword::COLLATE]) {
9564            Ok(Some(ColumnOption::Collation(
9565                self.parse_object_name(false)?,
9566            )))
9567        } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9568            Ok(Some(ColumnOption::NotNull))
9569        } else if self.parse_keywords(&[Keyword::COMMENT]) {
9570            Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9571        } else if self.parse_keyword(Keyword::NULL) {
9572            Ok(Some(ColumnOption::Null))
9573        } else if self.parse_keyword(Keyword::DEFAULT) {
9574            Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9575        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9576            && self.parse_keyword(Keyword::MATERIALIZED)
9577        {
9578            Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9579        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9580            && self.parse_keyword(Keyword::ALIAS)
9581        {
9582            Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9583        } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9584            && self.parse_keyword(Keyword::EPHEMERAL)
9585        {
9586            // The expression is optional for the EPHEMERAL syntax, so we need to check
9587            // if the column definition has remaining tokens before parsing the expression.
9588            if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9589                Ok(Some(ColumnOption::Ephemeral(None)))
9590            } else {
9591                Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9592            }
9593        } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9594            let characteristics = self.parse_constraint_characteristics()?;
9595            Ok(Some(
9596                PrimaryKeyConstraint {
9597                    name: None,
9598                    index_name: None,
9599                    index_type: None,
9600                    columns: vec![],
9601                    include: vec![],
9602                    index_options: vec![],
9603                    characteristics,
9604                }
9605                .into(),
9606            ))
9607        } else if self.parse_keyword(Keyword::UNIQUE) {
9608            let index_type_display =
9609                if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9610                    KeyOrIndexDisplay::Key
9611                } else {
9612                    KeyOrIndexDisplay::None
9613                };
9614            let characteristics = self.parse_constraint_characteristics()?;
9615            Ok(Some(
9616                UniqueConstraint {
9617                    name: None,
9618                    index_name: None,
9619                    index_type_display,
9620                    index_type: None,
9621                    columns: vec![],
9622                    include: vec![],
9623                    index_options: vec![],
9624                    characteristics,
9625                    nulls_distinct: NullsDistinctOption::None,
9626                }
9627                .into(),
9628            ))
9629        } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9630            // In MySQL, `KEY` in a column definition is shorthand for `PRIMARY KEY`.
9631            // See: https://dev.mysql.com/doc/refman/8.4/en/create-table.html
9632            let characteristics = self.parse_constraint_characteristics()?;
9633            Ok(Some(
9634                PrimaryKeyConstraint {
9635                    name: None,
9636                    index_name: None,
9637                    index_type: None,
9638                    columns: vec![],
9639                    include: vec![],
9640                    index_options: vec![],
9641                    characteristics,
9642                }
9643                .into(),
9644            ))
9645        } else if self.parse_keyword(Keyword::REFERENCES) {
9646            let foreign_table = self.parse_object_name(false)?;
9647            // PostgreSQL allows omitting the column list and
9648            // uses the primary key column of the foreign table by default
9649            let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9650            let mut match_kind = None;
9651            let mut on_delete = None;
9652            let mut on_update = None;
9653            loop {
9654                if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9655                    match_kind = Some(self.parse_match_kind()?);
9656                } else if on_delete.is_none()
9657                    && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9658                {
9659                    on_delete = Some(self.parse_referential_action()?);
9660                } else if on_update.is_none()
9661                    && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9662                {
9663                    on_update = Some(self.parse_referential_action()?);
9664                } else {
9665                    break;
9666                }
9667            }
9668            let characteristics = self.parse_constraint_characteristics()?;
9669
9670            Ok(Some(
9671                ForeignKeyConstraint {
9672                    name: None,       // Column-level constraints don't have names
9673                    index_name: None, // Not applicable for column-level constraints
9674                    columns: vec![],  // Not applicable for column-level constraints
9675                    foreign_table,
9676                    referred_columns,
9677                    on_delete,
9678                    on_update,
9679                    match_kind,
9680                    characteristics,
9681                }
9682                .into(),
9683            ))
9684        } else if self.parse_keyword(Keyword::CHECK) {
9685            self.expect_token(&Token::LParen)?;
9686            // since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
9687            let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9688            self.expect_token(&Token::RParen)?;
9689            let no_inherit = self.parse_keywords(&[Keyword::NO, Keyword::INHERIT]);
9690
9691            let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9692                Some(true)
9693            } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9694                Some(false)
9695            } else {
9696                None
9697            };
9698
9699            Ok(Some(
9700                CheckConstraint {
9701                    name: None, // Column-level check constraints don't have names
9702                    expr: Box::new(expr),
9703                    no_inherit,
9704                    enforced,
9705                }
9706                .into(),
9707            ))
9708        } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9709            && dialect_of!(self is MySqlDialect | GenericDialect)
9710        {
9711            // Support AUTO_INCREMENT for MySQL
9712            Ok(Some(ColumnOption::DialectSpecific(vec![
9713                Token::make_keyword("AUTO_INCREMENT"),
9714            ])))
9715        } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9716            && dialect_of!(self is SQLiteDialect |  GenericDialect)
9717        {
9718            // Support AUTOINCREMENT for SQLite
9719            Ok(Some(ColumnOption::DialectSpecific(vec![
9720                Token::make_keyword("AUTOINCREMENT"),
9721            ])))
9722        } else if self.parse_keyword(Keyword::ASC)
9723            && self.dialect.supports_asc_desc_in_column_definition()
9724        {
9725            // Support ASC for SQLite
9726            Ok(Some(ColumnOption::DialectSpecific(vec![
9727                Token::make_keyword("ASC"),
9728            ])))
9729        } else if self.parse_keyword(Keyword::DESC)
9730            && self.dialect.supports_asc_desc_in_column_definition()
9731        {
9732            // Support DESC for SQLite
9733            Ok(Some(ColumnOption::DialectSpecific(vec![
9734                Token::make_keyword("DESC"),
9735            ])))
9736        } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9737            && dialect_of!(self is MySqlDialect | GenericDialect)
9738        {
9739            let expr = self.parse_expr()?;
9740            Ok(Some(ColumnOption::OnUpdate(expr)))
9741        } else if self.parse_keyword(Keyword::GENERATED) {
9742            self.parse_optional_column_option_generated()
9743        } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9744            && self.parse_keyword(Keyword::OPTIONS)
9745        {
9746            self.prev_token();
9747            Ok(Some(ColumnOption::Options(
9748                self.parse_options(Keyword::OPTIONS)?,
9749            )))
9750        } else if self.parse_keyword(Keyword::AS)
9751            && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9752        {
9753            self.parse_optional_column_option_as()
9754        } else if self.parse_keyword(Keyword::SRID)
9755            && dialect_of!(self is MySqlDialect | GenericDialect)
9756        {
9757            Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9758        } else if self.parse_keyword(Keyword::IDENTITY)
9759            && dialect_of!(self is MsSqlDialect | GenericDialect)
9760        {
9761            let parameters = if self.consume_token(&Token::LParen) {
9762                let seed = self.parse_number()?;
9763                self.expect_token(&Token::Comma)?;
9764                let increment = self.parse_number()?;
9765                self.expect_token(&Token::RParen)?;
9766
9767                Some(IdentityPropertyFormatKind::FunctionCall(
9768                    IdentityParameters { seed, increment },
9769                ))
9770            } else {
9771                None
9772            };
9773            Ok(Some(ColumnOption::Identity(
9774                IdentityPropertyKind::Identity(IdentityProperty {
9775                    parameters,
9776                    order: None,
9777                }),
9778            )))
9779        } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9780            && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9781        {
9782            // Support ON CONFLICT for SQLite
9783            Ok(Some(ColumnOption::OnConflict(
9784                self.expect_one_of_keywords(&[
9785                    Keyword::ROLLBACK,
9786                    Keyword::ABORT,
9787                    Keyword::FAIL,
9788                    Keyword::IGNORE,
9789                    Keyword::REPLACE,
9790                ])?,
9791            )))
9792        } else if self.parse_keyword(Keyword::INVISIBLE) {
9793            Ok(Some(ColumnOption::Invisible))
9794        } else {
9795            Ok(None)
9796        }
9797    }
9798
9799    pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9800        let name = self.parse_object_name(false)?;
9801        self.expect_token(&Token::Eq)?;
9802        let value = self.parse_literal_string()?;
9803
9804        Ok(Tag::new(name, value))
9805    }
9806
9807    fn parse_optional_column_option_generated(
9808        &mut self,
9809    ) -> Result<Option<ColumnOption>, ParserError> {
9810        if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9811            let mut sequence_options = vec![];
9812            if self.expect_token(&Token::LParen).is_ok() {
9813                sequence_options = self.parse_create_sequence_options()?;
9814                self.expect_token(&Token::RParen)?;
9815            }
9816            Ok(Some(ColumnOption::Generated {
9817                generated_as: GeneratedAs::Always,
9818                sequence_options: Some(sequence_options),
9819                generation_expr: None,
9820                generation_expr_mode: None,
9821                generated_keyword: true,
9822            }))
9823        } else if self.parse_keywords(&[
9824            Keyword::BY,
9825            Keyword::DEFAULT,
9826            Keyword::AS,
9827            Keyword::IDENTITY,
9828        ]) {
9829            let mut sequence_options = vec![];
9830            if self.expect_token(&Token::LParen).is_ok() {
9831                sequence_options = self.parse_create_sequence_options()?;
9832                self.expect_token(&Token::RParen)?;
9833            }
9834            Ok(Some(ColumnOption::Generated {
9835                generated_as: GeneratedAs::ByDefault,
9836                sequence_options: Some(sequence_options),
9837                generation_expr: None,
9838                generation_expr_mode: None,
9839                generated_keyword: true,
9840            }))
9841        } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9842            if self.expect_token(&Token::LParen).is_ok() {
9843                let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9844                self.expect_token(&Token::RParen)?;
9845                let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9846                    Ok((
9847                        GeneratedAs::ExpStored,
9848                        Some(GeneratedExpressionMode::Stored),
9849                    ))
9850                } else if dialect_of!(self is PostgreSqlDialect) {
9851                    // Postgres' AS IDENTITY branches are above, this one needs STORED
9852                    self.expected_ref("STORED", self.peek_token_ref())
9853                } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9854                    Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9855                } else {
9856                    Ok((GeneratedAs::Always, None))
9857                }?;
9858
9859                Ok(Some(ColumnOption::Generated {
9860                    generated_as: gen_as,
9861                    sequence_options: None,
9862                    generation_expr: Some(expr),
9863                    generation_expr_mode: expr_mode,
9864                    generated_keyword: true,
9865                }))
9866            } else {
9867                Ok(None)
9868            }
9869        } else {
9870            Ok(None)
9871        }
9872    }
9873
9874    fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9875        // Some DBs allow 'AS (expr)', shorthand for GENERATED ALWAYS AS
9876        self.expect_token(&Token::LParen)?;
9877        let expr = self.parse_expr()?;
9878        self.expect_token(&Token::RParen)?;
9879
9880        let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9881            (
9882                GeneratedAs::ExpStored,
9883                Some(GeneratedExpressionMode::Stored),
9884            )
9885        } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9886            (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9887        } else {
9888            (GeneratedAs::Always, None)
9889        };
9890
9891        Ok(Some(ColumnOption::Generated {
9892            generated_as: gen_as,
9893            sequence_options: None,
9894            generation_expr: Some(expr),
9895            generation_expr_mode: expr_mode,
9896            generated_keyword: false,
9897        }))
9898    }
9899
9900    /// Parse optional `CLUSTERED BY` clause for Hive/Generic dialects.
9901    pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9902        let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9903            && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9904        {
9905            let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9906
9907            let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9908                self.expect_token(&Token::LParen)?;
9909                let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9910                self.expect_token(&Token::RParen)?;
9911                Some(sorted_by_columns)
9912            } else {
9913                None
9914            };
9915
9916            self.expect_keyword_is(Keyword::INTO)?;
9917            let num_buckets = self.parse_number_value()?.value;
9918            self.expect_keyword_is(Keyword::BUCKETS)?;
9919            Some(ClusteredBy {
9920                columns,
9921                sorted_by,
9922                num_buckets,
9923            })
9924        } else {
9925            None
9926        };
9927        Ok(clustered_by)
9928    }
9929
9930    /// Parse a referential action used in foreign key clauses.
9931    ///
9932    /// Recognized forms: `RESTRICT`, `CASCADE`, `SET NULL`, `NO ACTION`, `SET DEFAULT`.
9933    pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9934        if self.parse_keyword(Keyword::RESTRICT) {
9935            Ok(ReferentialAction::Restrict)
9936        } else if self.parse_keyword(Keyword::CASCADE) {
9937            Ok(ReferentialAction::Cascade)
9938        } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9939            Ok(ReferentialAction::SetNull)
9940        } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9941            Ok(ReferentialAction::NoAction)
9942        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9943            Ok(ReferentialAction::SetDefault)
9944        } else {
9945            self.expected_ref(
9946                "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9947                self.peek_token_ref(),
9948            )
9949        }
9950    }
9951
9952    /// Parse a `MATCH` kind for constraint references: `FULL`, `PARTIAL`, or `SIMPLE`.
9953    pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9954        if self.parse_keyword(Keyword::FULL) {
9955            Ok(ConstraintReferenceMatchKind::Full)
9956        } else if self.parse_keyword(Keyword::PARTIAL) {
9957            Ok(ConstraintReferenceMatchKind::Partial)
9958        } else if self.parse_keyword(Keyword::SIMPLE) {
9959            Ok(ConstraintReferenceMatchKind::Simple)
9960        } else {
9961            self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9962        }
9963    }
9964
9965    /// Parse `index_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]`
9966    /// after `{ PRIMARY KEY | UNIQUE } USING INDEX`.
9967    fn parse_constraint_using_index(
9968        &mut self,
9969        name: Option<Ident>,
9970    ) -> Result<ConstraintUsingIndex, ParserError> {
9971        let index_name = self.parse_identifier()?;
9972        let characteristics = self.parse_constraint_characteristics()?;
9973        Ok(ConstraintUsingIndex {
9974            name,
9975            index_name,
9976            characteristics,
9977        })
9978    }
9979
9980    /// Parse optional constraint characteristics such as `DEFERRABLE`, `INITIALLY` and `ENFORCED`.
9981    pub fn parse_constraint_characteristics(
9982        &mut self,
9983    ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
9984        let mut cc = ConstraintCharacteristics::default();
9985
9986        loop {
9987            if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
9988            {
9989                cc.deferrable = Some(false);
9990            } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
9991                cc.deferrable = Some(true);
9992            } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
9993                if self.parse_keyword(Keyword::DEFERRED) {
9994                    cc.initially = Some(DeferrableInitial::Deferred);
9995                } else if self.parse_keyword(Keyword::IMMEDIATE) {
9996                    cc.initially = Some(DeferrableInitial::Immediate);
9997                } else {
9998                    self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
9999                }
10000            } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
10001                cc.enforced = Some(true);
10002            } else if cc.enforced.is_none()
10003                && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
10004            {
10005                cc.enforced = Some(false);
10006            } else {
10007                break;
10008            }
10009        }
10010
10011        if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
10012            Ok(Some(cc))
10013        } else {
10014            Ok(None)
10015        }
10016    }
10017
10018    /// Parse an optional table constraint (e.g. `PRIMARY KEY`, `UNIQUE`, `FOREIGN KEY`, `CHECK`).
10019    pub fn parse_optional_table_constraint(
10020        &mut self,
10021    ) -> Result<Option<TableConstraint>, ParserError> {
10022        let name = if self.parse_keyword(Keyword::CONSTRAINT) {
10023            if self.dialect.supports_constraint_keyword_without_name()
10024                && self
10025                    .peek_one_of_keywords(&[
10026                        Keyword::CHECK,
10027                        Keyword::PRIMARY,
10028                        Keyword::UNIQUE,
10029                        Keyword::FOREIGN,
10030                    ])
10031                    .is_some()
10032            {
10033                None
10034            } else {
10035                Some(self.parse_identifier()?)
10036            }
10037        } else {
10038            None
10039        };
10040
10041        let next_token = self.next_token();
10042        match next_token.token {
10043            Token::Word(w) if w.keyword == Keyword::UNIQUE => {
10044                // PostgreSQL: UNIQUE USING INDEX index_name
10045                // https://www.postgresql.org/docs/current/sql-altertable.html
10046                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10047                    return Ok(Some(TableConstraint::UniqueUsingIndex(
10048                        self.parse_constraint_using_index(name)?,
10049                    )));
10050                }
10051
10052                let index_type_display = self.parse_index_type_display();
10053                if !dialect_of!(self is GenericDialect | MySqlDialect)
10054                    && !index_type_display.is_none()
10055                {
10056                    return self.expected_ref(
10057                        "`index_name` or `(column_name [, ...])`",
10058                        self.peek_token_ref(),
10059                    );
10060                }
10061
10062                let nulls_distinct = self.parse_optional_nulls_distinct()?;
10063
10064                // optional index name
10065                let index_name = self.parse_optional_ident()?;
10066                let index_type = self.parse_optional_using_then_index_type()?;
10067
10068                let columns = self.parse_parenthesized_index_column_list()?;
10069                let include = self.parse_optional_include_columns()?;
10070                let index_options = self.parse_index_options()?;
10071                let characteristics = self.parse_constraint_characteristics()?;
10072                Ok(Some(
10073                    UniqueConstraint {
10074                        name,
10075                        index_name,
10076                        index_type_display,
10077                        index_type,
10078                        columns,
10079                        include,
10080                        index_options,
10081                        characteristics,
10082                        nulls_distinct,
10083                    }
10084                    .into(),
10085                ))
10086            }
10087            Token::Word(w) if w.keyword == Keyword::PRIMARY => {
10088                // after `PRIMARY` always stay `KEY`
10089                self.expect_keyword_is(Keyword::KEY)?;
10090
10091                // PostgreSQL: PRIMARY KEY USING INDEX index_name
10092                // https://www.postgresql.org/docs/current/sql-altertable.html
10093                if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10094                    return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
10095                        self.parse_constraint_using_index(name)?,
10096                    )));
10097                }
10098
10099                // optional index name
10100                let index_name = self.parse_optional_ident()?;
10101                let index_type = self.parse_optional_using_then_index_type()?;
10102
10103                let columns = self.parse_parenthesized_index_column_list()?;
10104                let include = self.parse_optional_include_columns()?;
10105                let index_options = self.parse_index_options()?;
10106                let characteristics = self.parse_constraint_characteristics()?;
10107                Ok(Some(
10108                    PrimaryKeyConstraint {
10109                        name,
10110                        index_name,
10111                        index_type,
10112                        columns,
10113                        include,
10114                        index_options,
10115                        characteristics,
10116                    }
10117                    .into(),
10118                ))
10119            }
10120            Token::Word(w) if w.keyword == Keyword::FOREIGN => {
10121                self.expect_keyword_is(Keyword::KEY)?;
10122                let index_name = self.parse_optional_ident()?;
10123                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
10124                self.expect_keyword_is(Keyword::REFERENCES)?;
10125                let foreign_table = self.parse_object_name(false)?;
10126                let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
10127                let mut match_kind = None;
10128                let mut on_delete = None;
10129                let mut on_update = None;
10130                loop {
10131                    if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
10132                        match_kind = Some(self.parse_match_kind()?);
10133                    } else if on_delete.is_none()
10134                        && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
10135                    {
10136                        on_delete = Some(self.parse_referential_action()?);
10137                    } else if on_update.is_none()
10138                        && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
10139                    {
10140                        on_update = Some(self.parse_referential_action()?);
10141                    } else {
10142                        break;
10143                    }
10144                }
10145
10146                let characteristics = self.parse_constraint_characteristics()?;
10147
10148                Ok(Some(
10149                    ForeignKeyConstraint {
10150                        name,
10151                        index_name,
10152                        columns,
10153                        foreign_table,
10154                        referred_columns,
10155                        on_delete,
10156                        on_update,
10157                        match_kind,
10158                        characteristics,
10159                    }
10160                    .into(),
10161                ))
10162            }
10163            Token::Word(w) if w.keyword == Keyword::CHECK => {
10164                self.expect_token(&Token::LParen)?;
10165                let expr = Box::new(self.parse_expr()?);
10166                self.expect_token(&Token::RParen)?;
10167                let no_inherit = self.parse_keywords(&[Keyword::NO, Keyword::INHERIT]);
10168
10169                let enforced = if self.parse_keyword(Keyword::ENFORCED) {
10170                    Some(true)
10171                } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
10172                    Some(false)
10173                } else {
10174                    None
10175                };
10176
10177                Ok(Some(
10178                    CheckConstraint {
10179                        name,
10180                        expr,
10181                        no_inherit,
10182                        enforced,
10183                    }
10184                    .into(),
10185                ))
10186            }
10187            Token::Word(w)
10188                if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
10189                    && dialect_of!(self is GenericDialect | MySqlDialect)
10190                    && name.is_none() =>
10191            {
10192                let display_as_key = w.keyword == Keyword::KEY;
10193
10194                let name = match &self.peek_token_ref().token {
10195                    Token::Word(word) if word.keyword == Keyword::USING => None,
10196                    _ => self.parse_optional_ident()?,
10197                };
10198
10199                let index_type = self.parse_optional_using_then_index_type()?;
10200                let columns = self.parse_parenthesized_index_column_list()?;
10201                let index_options = self.parse_index_options()?;
10202
10203                Ok(Some(
10204                    IndexConstraint {
10205                        display_as_key,
10206                        name,
10207                        index_type,
10208                        columns,
10209                        index_options,
10210                    }
10211                    .into(),
10212                ))
10213            }
10214            Token::Word(w)
10215                if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
10216                    && dialect_of!(self is GenericDialect | MySqlDialect) =>
10217            {
10218                if let Some(name) = name {
10219                    return self.expected(
10220                        "FULLTEXT or SPATIAL option without constraint name",
10221                        TokenWithSpan {
10222                            token: Token::make_keyword(&name.to_string()),
10223                            span: next_token.span,
10224                        },
10225                    );
10226                }
10227
10228                let fulltext = w.keyword == Keyword::FULLTEXT;
10229
10230                let index_type_display = self.parse_index_type_display();
10231
10232                let opt_index_name = self.parse_optional_ident()?;
10233
10234                let columns = self.parse_parenthesized_index_column_list()?;
10235
10236                Ok(Some(
10237                    FullTextOrSpatialConstraint {
10238                        fulltext,
10239                        index_type_display,
10240                        opt_index_name,
10241                        columns,
10242                    }
10243                    .into(),
10244                ))
10245            }
10246            Token::Word(w)
10247                if w.keyword == Keyword::EXCLUDE && self.dialect.supports_exclude_constraint() =>
10248            {
10249                // `EXCLUDE` is a non-reserved keyword in PostgreSQL, so it is a
10250                // valid column name. Only treat it as an exclusion constraint
10251                // when it begins one (named, or followed by `USING` / `(`);
10252                // otherwise backtrack and let it parse as a column.
10253                if name.is_some()
10254                    || self.peek_keyword(Keyword::USING)
10255                    || self.peek_token_ref().token == Token::LParen
10256                {
10257                    Ok(Some(self.parse_exclude_constraint(name)?.into()))
10258                } else {
10259                    self.prev_token();
10260                    Ok(None)
10261                }
10262            }
10263            _ => {
10264                if name.is_some() {
10265                    self.expected("PRIMARY, UNIQUE, FOREIGN, CHECK, or EXCLUDE", next_token)
10266                } else {
10267                    self.prev_token();
10268                    Ok(None)
10269                }
10270            }
10271        }
10272    }
10273
10274    // The leading `EXCLUDE` keyword is already consumed by the caller.
10275    fn parse_exclude_constraint(
10276        &mut self,
10277        name: Option<Ident>,
10278    ) -> Result<ExcludeConstraint, ParserError> {
10279        let index_method = if self.parse_keyword(Keyword::USING) {
10280            Some(self.parse_identifier()?)
10281        } else {
10282            None
10283        };
10284
10285        self.expect_token(&Token::LParen)?;
10286        let elements = self.parse_comma_separated(|p| p.parse_exclude_constraint_element())?;
10287        self.expect_token(&Token::RParen)?;
10288
10289        let include = if self.parse_keyword(Keyword::INCLUDE) {
10290            self.expect_token(&Token::LParen)?;
10291            let cols = self.parse_comma_separated(|p| p.parse_identifier())?;
10292            self.expect_token(&Token::RParen)?;
10293            cols
10294        } else {
10295            vec![]
10296        };
10297
10298        let where_clause = if self.parse_keyword(Keyword::WHERE) {
10299            self.expect_token(&Token::LParen)?;
10300            let predicate = self.parse_expr()?;
10301            self.expect_token(&Token::RParen)?;
10302            Some(Box::new(predicate))
10303        } else {
10304            None
10305        };
10306
10307        let characteristics = self.parse_constraint_characteristics()?;
10308
10309        Ok(ExcludeConstraint {
10310            name,
10311            index_method,
10312            elements,
10313            include,
10314            where_clause,
10315            characteristics,
10316        })
10317    }
10318
10319    fn parse_exclude_constraint_element(
10320        &mut self,
10321    ) -> Result<ExcludeConstraintElement, ParserError> {
10322        let column = self.parse_create_index_expr()?;
10323        self.expect_keyword_is(Keyword::WITH)?;
10324        let operator = self.parse_exclude_constraint_operator()?;
10325        Ok(ExcludeConstraintElement { column, operator })
10326    }
10327
10328    /// Parse the operator that follows `WITH` in an `EXCLUDE` element.
10329    fn parse_exclude_constraint_operator(
10330        &mut self,
10331    ) -> Result<ExcludeConstraintOperator, ParserError> {
10332        if self.parse_keyword(Keyword::OPERATOR) {
10333            return Ok(ExcludeConstraintOperator::PGOperator(
10334                self.parse_pg_operator_ident_parts()?,
10335            ));
10336        }
10337
10338        let operator_token = self.next_token();
10339        Ok(ExcludeConstraintOperator::Token(
10340            operator_token.token.to_string(),
10341        ))
10342    }
10343
10344    /// Parse the body of a Postgres `OPERATOR(schema.op)` form: the
10345    /// parenthesized `.`-separated path of name parts after the `OPERATOR`
10346    /// keyword. Shared between binary expression parsing and exclusion
10347    /// constraint parsing.
10348    fn parse_pg_operator_ident_parts(&mut self) -> Result<Vec<String>, ParserError> {
10349        self.expect_token(&Token::LParen)?;
10350        if self.peek_token_ref().token == Token::RParen {
10351            let token = self.next_token();
10352            return self.expected("operator name", token);
10353        }
10354        let mut idents = vec![];
10355        loop {
10356            self.advance_token();
10357            idents.push(self.get_current_token().to_string());
10358            if !self.consume_token(&Token::Period) {
10359                break;
10360            }
10361        }
10362        self.expect_token(&Token::RParen)?;
10363        Ok(idents)
10364    }
10365
10366    fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10367        Ok(if self.parse_keyword(Keyword::NULLS) {
10368            let not = self.parse_keyword(Keyword::NOT);
10369            self.expect_keyword_is(Keyword::DISTINCT)?;
10370            if not {
10371                NullsDistinctOption::NotDistinct
10372            } else {
10373                NullsDistinctOption::Distinct
10374            }
10375        } else {
10376            NullsDistinctOption::None
10377        })
10378    }
10379
10380    /// Optionally parse a parenthesized list of `SqlOption`s introduced by `keyword`.
10381    pub fn maybe_parse_options(
10382        &mut self,
10383        keyword: Keyword,
10384    ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10385        if let Token::Word(word) = &self.peek_token_ref().token {
10386            if word.keyword == keyword {
10387                return Ok(Some(self.parse_options(keyword)?));
10388            }
10389        };
10390        Ok(None)
10391    }
10392
10393    /// Parse a parenthesized list of `SqlOption`s following `keyword`, or return an empty vec.
10394    pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10395        if self.parse_keyword(keyword) {
10396            self.expect_token(&Token::LParen)?;
10397            let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10398            self.expect_token(&Token::RParen)?;
10399            Ok(options)
10400        } else {
10401            Ok(vec![])
10402        }
10403    }
10404
10405    /// Parse options introduced by one of `keywords` followed by a parenthesized list.
10406    pub fn parse_options_with_keywords(
10407        &mut self,
10408        keywords: &[Keyword],
10409    ) -> Result<Vec<SqlOption>, ParserError> {
10410        if self.parse_keywords(keywords) {
10411            self.expect_token(&Token::LParen)?;
10412            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10413            self.expect_token(&Token::RParen)?;
10414            Ok(options)
10415        } else {
10416            Ok(vec![])
10417        }
10418    }
10419
10420    /// Parse an index type token (e.g. `BTREE`, `HASH`, or a custom identifier).
10421    pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10422        Ok(if self.parse_keyword(Keyword::BTREE) {
10423            IndexType::BTree
10424        } else if self.parse_keyword(Keyword::HASH) {
10425            IndexType::Hash
10426        } else if self.parse_keyword(Keyword::GIN) {
10427            IndexType::GIN
10428        } else if self.parse_keyword(Keyword::GIST) {
10429            IndexType::GiST
10430        } else if self.parse_keyword(Keyword::SPGIST) {
10431            IndexType::SPGiST
10432        } else if self.parse_keyword(Keyword::BRIN) {
10433            IndexType::BRIN
10434        } else if self.parse_keyword(Keyword::BLOOM) {
10435            IndexType::Bloom
10436        } else {
10437            IndexType::Custom(self.parse_identifier()?)
10438        })
10439    }
10440
10441    /// Optionally parse the `USING` keyword, followed by an [IndexType]
10442    /// Example:
10443    /// ```sql
10444    //// USING BTREE (name, age DESC)
10445    /// ```
10446    /// Optionally parse `USING <index_type>` and return the parsed `IndexType` if present.
10447    pub fn parse_optional_using_then_index_type(
10448        &mut self,
10449    ) -> Result<Option<IndexType>, ParserError> {
10450        if self.parse_keyword(Keyword::USING) {
10451            Ok(Some(self.parse_index_type()?))
10452        } else {
10453            Ok(None)
10454        }
10455    }
10456
10457    /// Parse `[ident]`, mostly `ident` is name, like:
10458    /// `window_name`, `index_name`, ...
10459    /// Parse an optional identifier, returning `Some(Ident)` if present.
10460    pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10461        self.maybe_parse(|parser| parser.parse_identifier())
10462    }
10463
10464    #[must_use]
10465    /// Parse optional `KEY` or `INDEX` display tokens used in index/constraint declarations.
10466    pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10467        if self.parse_keyword(Keyword::KEY) {
10468            KeyOrIndexDisplay::Key
10469        } else if self.parse_keyword(Keyword::INDEX) {
10470            KeyOrIndexDisplay::Index
10471        } else {
10472            KeyOrIndexDisplay::None
10473        }
10474    }
10475
10476    /// Parse an optional index option such as `USING <type>` or `COMMENT <string>`.
10477    pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10478        if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10479            Ok(Some(IndexOption::Using(index_type)))
10480        } else if self.parse_keyword(Keyword::COMMENT) {
10481            let s = self.parse_literal_string()?;
10482            Ok(Some(IndexOption::Comment(s)))
10483        } else {
10484            Ok(None)
10485        }
10486    }
10487
10488    /// Parse zero or more index options and return them as a vector.
10489    pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10490        let mut options = Vec::new();
10491
10492        loop {
10493            match self.parse_optional_index_option()? {
10494                Some(index_option) => options.push(index_option),
10495                None => return Ok(options),
10496            }
10497        }
10498    }
10499
10500    /// Parse an optional `INCLUDE (col, ...)` clause on a table constraint.
10501    pub fn parse_optional_include_columns(&mut self) -> Result<Vec<Ident>, ParserError> {
10502        if self.parse_keyword(Keyword::INCLUDE) {
10503            self.expect_token(&Token::LParen)?;
10504            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
10505            self.expect_token(&Token::RParen)?;
10506            Ok(columns)
10507        } else {
10508            Ok(vec![])
10509        }
10510    }
10511
10512    /// Parse a single `SqlOption` used by various dialect-specific DDL statements.
10513    pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10514        let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10515
10516        match &self.peek_token_ref().token {
10517            Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10518                Ok(SqlOption::Ident(self.parse_identifier()?))
10519            }
10520            Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10521                self.parse_option_partition()
10522            }
10523            Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10524                self.parse_option_clustered()
10525            }
10526            _ => {
10527                let name = self.parse_identifier()?;
10528                self.expect_token(&Token::Eq)?;
10529                let value = self.parse_expr()?;
10530
10531                Ok(SqlOption::KeyValue { key: name, value })
10532            }
10533        }
10534    }
10535
10536    /// Parse a `CLUSTERED` table option (MSSQL-specific syntaxes supported).
10537    pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10538        if self.parse_keywords(&[
10539            Keyword::CLUSTERED,
10540            Keyword::COLUMNSTORE,
10541            Keyword::INDEX,
10542            Keyword::ORDER,
10543        ]) {
10544            Ok(SqlOption::Clustered(
10545                TableOptionsClustered::ColumnstoreIndexOrder(
10546                    self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10547                ),
10548            ))
10549        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10550            Ok(SqlOption::Clustered(
10551                TableOptionsClustered::ColumnstoreIndex,
10552            ))
10553        } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10554            self.expect_token(&Token::LParen)?;
10555
10556            let columns = self.parse_comma_separated(|p| {
10557                let name = p.parse_identifier()?;
10558                let asc = p.parse_asc_desc();
10559
10560                Ok(ClusteredIndex { name, asc })
10561            })?;
10562
10563            self.expect_token(&Token::RParen)?;
10564
10565            Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10566        } else {
10567            Err(ParserError::ParserError(
10568                "invalid CLUSTERED sequence".to_string(),
10569            ))
10570        }
10571    }
10572
10573    /// Parse a `PARTITION(...) FOR VALUES(...)` table option.
10574    pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10575        self.expect_keyword_is(Keyword::PARTITION)?;
10576        self.expect_token(&Token::LParen)?;
10577        let column_name = self.parse_identifier()?;
10578
10579        self.expect_keyword_is(Keyword::RANGE)?;
10580        let range_direction = if self.parse_keyword(Keyword::LEFT) {
10581            Some(PartitionRangeDirection::Left)
10582        } else if self.parse_keyword(Keyword::RIGHT) {
10583            Some(PartitionRangeDirection::Right)
10584        } else {
10585            None
10586        };
10587
10588        self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10589        self.expect_token(&Token::LParen)?;
10590
10591        let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10592
10593        self.expect_token(&Token::RParen)?;
10594        self.expect_token(&Token::RParen)?;
10595
10596        Ok(SqlOption::Partition {
10597            column_name,
10598            range_direction,
10599            for_values,
10600        })
10601    }
10602
10603    /// Parse a parenthesized list of partition expressions and return a `Partition` value.
10604    pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10605        self.expect_token(&Token::LParen)?;
10606        let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10607        self.expect_token(&Token::RParen)?;
10608        Ok(Partition::Partitions(partitions))
10609    }
10610
10611    /// Parse a parenthesized `SELECT` projection used for projection-based operations.
10612    pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10613        self.expect_token(&Token::LParen)?;
10614        self.expect_keyword_is(Keyword::SELECT)?;
10615        let projection = self.parse_projection()?;
10616        let group_by = self.parse_optional_group_by()?;
10617        let order_by = self.parse_optional_order_by()?;
10618        self.expect_token(&Token::RParen)?;
10619        Ok(ProjectionSelect {
10620            projection,
10621            group_by,
10622            order_by,
10623        })
10624    }
10625    /// Parse `ALTER TABLE ... ADD PROJECTION ...` operation.
10626    pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10627        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10628        let name = self.parse_identifier()?;
10629        let query = self.parse_projection_select()?;
10630        Ok(AlterTableOperation::AddProjection {
10631            if_not_exists,
10632            name,
10633            select: query,
10634        })
10635    }
10636
10637    /// Parse Redshift `ALTER SORTKEY (column_list)`.
10638    ///
10639    /// See <https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html>
10640    fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10641        self.expect_keyword_is(Keyword::ALTER)?;
10642        self.expect_keyword_is(Keyword::SORTKEY)?;
10643        self.expect_token(&Token::LParen)?;
10644        let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10645        self.expect_token(&Token::RParen)?;
10646        Ok(AlterTableOperation::AlterSortKey { columns })
10647    }
10648
10649    /// Parse a single `ALTER TABLE` operation and return an `AlterTableOperation`.
10650    pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10651        let operation = if self.parse_keyword(Keyword::ADD) {
10652            if let Some(constraint) = self.parse_optional_table_constraint()? {
10653                let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10654                AlterTableOperation::AddConstraint {
10655                    constraint,
10656                    not_valid,
10657                }
10658            } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10659                && self.parse_keyword(Keyword::PROJECTION)
10660            {
10661                return self.parse_alter_table_add_projection();
10662            } else {
10663                let if_not_exists =
10664                    self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10665                let mut new_partitions = vec![];
10666                loop {
10667                    if self.parse_keyword(Keyword::PARTITION) {
10668                        new_partitions.push(self.parse_partition()?);
10669                    } else {
10670                        break;
10671                    }
10672                }
10673                if !new_partitions.is_empty() {
10674                    AlterTableOperation::AddPartitions {
10675                        if_not_exists,
10676                        new_partitions,
10677                    }
10678                } else {
10679                    let column_keyword = self.parse_keyword(Keyword::COLUMN);
10680
10681                    let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10682                    {
10683                        self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10684                            || if_not_exists
10685                    } else {
10686                        false
10687                    };
10688
10689                    let column_def = self.parse_column_def()?;
10690
10691                    let column_position = self.parse_column_position()?;
10692
10693                    AlterTableOperation::AddColumn {
10694                        column_keyword,
10695                        if_not_exists,
10696                        column_def,
10697                        column_position,
10698                    }
10699                }
10700            }
10701        } else if self.parse_keyword(Keyword::RENAME) {
10702            if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10703                let old_name = self.parse_identifier()?;
10704                self.expect_keyword_is(Keyword::TO)?;
10705                let new_name = self.parse_identifier()?;
10706                AlterTableOperation::RenameConstraint { old_name, new_name }
10707            } else if self.parse_keyword(Keyword::TO) {
10708                let table_name = self.parse_object_name(false)?;
10709                AlterTableOperation::RenameTable {
10710                    table_name: RenameTableNameKind::To(table_name),
10711                }
10712            } else if self.parse_keyword(Keyword::AS) {
10713                let table_name = self.parse_object_name(false)?;
10714                AlterTableOperation::RenameTable {
10715                    table_name: RenameTableNameKind::As(table_name),
10716                }
10717            } else {
10718                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10719                let old_column_name = self.parse_identifier()?;
10720                self.expect_keyword_is(Keyword::TO)?;
10721                let new_column_name = self.parse_identifier()?;
10722                AlterTableOperation::RenameColumn {
10723                    old_column_name,
10724                    new_column_name,
10725                }
10726            }
10727        } else if self.parse_keyword(Keyword::DISABLE) {
10728            if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10729                AlterTableOperation::DisableRowLevelSecurity {}
10730            } else if self.parse_keyword(Keyword::RULE) {
10731                let name = self.parse_identifier()?;
10732                AlterTableOperation::DisableRule { name }
10733            } else if self.parse_keyword(Keyword::TRIGGER) {
10734                let name = self.parse_identifier()?;
10735                AlterTableOperation::DisableTrigger { name }
10736            } else {
10737                return self.expected_ref(
10738                    "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10739                    self.peek_token_ref(),
10740                );
10741            }
10742        } else if self.parse_keyword(Keyword::ENABLE) {
10743            if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10744                let name = self.parse_identifier()?;
10745                AlterTableOperation::EnableAlwaysRule { name }
10746            } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10747                let name = self.parse_identifier()?;
10748                AlterTableOperation::EnableAlwaysTrigger { name }
10749            } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10750                AlterTableOperation::EnableRowLevelSecurity {}
10751            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10752                let name = self.parse_identifier()?;
10753                AlterTableOperation::EnableReplicaRule { name }
10754            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10755                let name = self.parse_identifier()?;
10756                AlterTableOperation::EnableReplicaTrigger { name }
10757            } else if self.parse_keyword(Keyword::RULE) {
10758                let name = self.parse_identifier()?;
10759                AlterTableOperation::EnableRule { name }
10760            } else if self.parse_keyword(Keyword::TRIGGER) {
10761                let name = self.parse_identifier()?;
10762                AlterTableOperation::EnableTrigger { name }
10763            } else {
10764                return self.expected_ref(
10765                    "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10766                    self.peek_token_ref(),
10767                );
10768            }
10769        } else if self.parse_keywords(&[
10770            Keyword::FORCE,
10771            Keyword::ROW,
10772            Keyword::LEVEL,
10773            Keyword::SECURITY,
10774        ]) {
10775            AlterTableOperation::ForceRowLevelSecurity
10776        } else if self.parse_keywords(&[
10777            Keyword::NO,
10778            Keyword::FORCE,
10779            Keyword::ROW,
10780            Keyword::LEVEL,
10781            Keyword::SECURITY,
10782        ]) {
10783            AlterTableOperation::NoForceRowLevelSecurity
10784        } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10785            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10786        {
10787            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10788            let name = self.parse_identifier()?;
10789            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10790                Some(self.parse_identifier()?)
10791            } else {
10792                None
10793            };
10794            AlterTableOperation::ClearProjection {
10795                if_exists,
10796                name,
10797                partition,
10798            }
10799        } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10800            && dialect_of!(self is ClickHouseDialect|GenericDialect)
10801        {
10802            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10803            let name = self.parse_identifier()?;
10804            let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10805                Some(self.parse_identifier()?)
10806            } else {
10807                None
10808            };
10809            AlterTableOperation::MaterializeProjection {
10810                if_exists,
10811                name,
10812                partition,
10813            }
10814        } else if self.parse_keyword(Keyword::DROP) {
10815            if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10816                self.expect_token(&Token::LParen)?;
10817                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10818                self.expect_token(&Token::RParen)?;
10819                AlterTableOperation::DropPartitions {
10820                    partitions,
10821                    if_exists: true,
10822                }
10823            } else if self.parse_keyword(Keyword::PARTITION) {
10824                self.expect_token(&Token::LParen)?;
10825                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10826                self.expect_token(&Token::RParen)?;
10827                AlterTableOperation::DropPartitions {
10828                    partitions,
10829                    if_exists: false,
10830                }
10831            } else if self.parse_keyword(Keyword::CONSTRAINT) {
10832                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10833                let name = self.parse_identifier()?;
10834                let drop_behavior = self.parse_optional_drop_behavior();
10835                AlterTableOperation::DropConstraint {
10836                    if_exists,
10837                    name,
10838                    drop_behavior,
10839                }
10840            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10841                let drop_behavior = self.parse_optional_drop_behavior();
10842                AlterTableOperation::DropPrimaryKey { drop_behavior }
10843            } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10844                let name = self.parse_identifier()?;
10845                let drop_behavior = self.parse_optional_drop_behavior();
10846                AlterTableOperation::DropForeignKey {
10847                    name,
10848                    drop_behavior,
10849                }
10850            } else if self.parse_keyword(Keyword::INDEX) {
10851                let name = self.parse_identifier()?;
10852                AlterTableOperation::DropIndex { name }
10853            } else if self.parse_keyword(Keyword::PROJECTION)
10854                && dialect_of!(self is ClickHouseDialect|GenericDialect)
10855            {
10856                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10857                let name = self.parse_identifier()?;
10858                AlterTableOperation::DropProjection { if_exists, name }
10859            } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10860                AlterTableOperation::DropClusteringKey
10861            } else {
10862                let has_column_keyword = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10863                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10864                let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10865                    self.parse_comma_separated(Parser::parse_identifier)?
10866                } else {
10867                    vec![self.parse_identifier()?]
10868                };
10869                let drop_behavior = self.parse_optional_drop_behavior();
10870                AlterTableOperation::DropColumn {
10871                    has_column_keyword,
10872                    column_names,
10873                    if_exists,
10874                    drop_behavior,
10875                }
10876            }
10877        } else if self.parse_keyword(Keyword::PARTITION) {
10878            self.expect_token(&Token::LParen)?;
10879            let before = self.parse_comma_separated(Parser::parse_expr)?;
10880            self.expect_token(&Token::RParen)?;
10881            self.expect_keyword_is(Keyword::RENAME)?;
10882            self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10883            self.expect_token(&Token::LParen)?;
10884            let renames = self.parse_comma_separated(Parser::parse_expr)?;
10885            self.expect_token(&Token::RParen)?;
10886            AlterTableOperation::RenamePartitions {
10887                old_partitions: before,
10888                new_partitions: renames,
10889            }
10890        } else if self.parse_keyword(Keyword::CHANGE) {
10891            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10892            let old_name = self.parse_identifier()?;
10893            let new_name = self.parse_identifier()?;
10894            let data_type = self.parse_data_type()?;
10895            let mut options = vec![];
10896            while let Some(option) = self.parse_optional_column_option()? {
10897                options.push(option);
10898            }
10899
10900            let column_position = self.parse_column_position()?;
10901
10902            AlterTableOperation::ChangeColumn {
10903                old_name,
10904                new_name,
10905                data_type,
10906                options,
10907                column_position,
10908            }
10909        } else if self.parse_keyword(Keyword::MODIFY) {
10910            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10911            let col_name = self.parse_identifier()?;
10912            let data_type = self.parse_data_type()?;
10913            let mut options = vec![];
10914            while let Some(option) = self.parse_optional_column_option()? {
10915                options.push(option);
10916            }
10917
10918            let column_position = self.parse_column_position()?;
10919
10920            AlterTableOperation::ModifyColumn {
10921                col_name,
10922                data_type,
10923                options,
10924                column_position,
10925            }
10926        } else if self.parse_keyword(Keyword::ALTER) {
10927            if self.peek_keyword(Keyword::SORTKEY) {
10928                self.prev_token();
10929                return self.parse_alter_sort_key();
10930            }
10931
10932            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
10933            let column_name = self.parse_identifier()?;
10934            let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10935
10936            let op: AlterColumnOperation = if self.parse_keywords(&[
10937                Keyword::SET,
10938                Keyword::NOT,
10939                Keyword::NULL,
10940            ]) {
10941                AlterColumnOperation::SetNotNull {}
10942            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10943                AlterColumnOperation::DropNotNull {}
10944            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10945                AlterColumnOperation::SetDefault {
10946                    value: self.parse_expr()?,
10947                }
10948            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10949                AlterColumnOperation::DropDefault {}
10950            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10951                self.parse_set_data_type(true)?
10952            } else if self.parse_keyword(Keyword::TYPE) {
10953                self.parse_set_data_type(false)?
10954            } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10955                let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10956                    Some(GeneratedAs::Always)
10957                } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10958                    Some(GeneratedAs::ByDefault)
10959                } else {
10960                    None
10961                };
10962
10963                self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10964
10965                let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10966
10967                if self.peek_token_ref().token == Token::LParen {
10968                    self.expect_token(&Token::LParen)?;
10969                    sequence_options = Some(self.parse_create_sequence_options()?);
10970                    self.expect_token(&Token::RParen)?;
10971                }
10972
10973                AlterColumnOperation::AddGenerated {
10974                    generated_as,
10975                    sequence_options,
10976                }
10977            } else {
10978                let message = if is_postgresql {
10979                    "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10980                } else {
10981                    "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10982                };
10983
10984                return self.expected_ref(message, self.peek_token_ref());
10985            };
10986            AlterTableOperation::AlterColumn { column_name, op }
10987        } else if self.parse_keyword(Keyword::SWAP) {
10988            self.expect_keyword_is(Keyword::WITH)?;
10989            let table_name = self.parse_object_name(false)?;
10990            AlterTableOperation::SwapWith { table_name }
10991        } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10992            && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10993        {
10994            let new_owner = self.parse_owner()?;
10995            AlterTableOperation::OwnerTo { new_owner }
10996        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10997            && self.parse_keyword(Keyword::ATTACH)
10998        {
10999            AlterTableOperation::AttachPartition {
11000                partition: self.parse_part_or_partition()?,
11001            }
11002        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11003            && self.parse_keyword(Keyword::DETACH)
11004        {
11005            AlterTableOperation::DetachPartition {
11006                partition: self.parse_part_or_partition()?,
11007            }
11008        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11009            && self.parse_keyword(Keyword::FREEZE)
11010        {
11011            let partition = self.parse_part_or_partition()?;
11012            let with_name = if self.parse_keyword(Keyword::WITH) {
11013                self.expect_keyword_is(Keyword::NAME)?;
11014                Some(self.parse_identifier()?)
11015            } else {
11016                None
11017            };
11018            AlterTableOperation::FreezePartition {
11019                partition,
11020                with_name,
11021            }
11022        } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11023            && self.parse_keyword(Keyword::UNFREEZE)
11024        {
11025            let partition = self.parse_part_or_partition()?;
11026            let with_name = if self.parse_keyword(Keyword::WITH) {
11027                self.expect_keyword_is(Keyword::NAME)?;
11028                Some(self.parse_identifier()?)
11029            } else {
11030                None
11031            };
11032            AlterTableOperation::UnfreezePartition {
11033                partition,
11034                with_name,
11035            }
11036        } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
11037            self.expect_token(&Token::LParen)?;
11038            let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
11039            self.expect_token(&Token::RParen)?;
11040            AlterTableOperation::ClusterBy { exprs }
11041        } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
11042            AlterTableOperation::SuspendRecluster
11043        } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
11044            AlterTableOperation::ResumeRecluster
11045        } else if self.parse_keyword(Keyword::LOCK) {
11046            let equals = self.consume_token(&Token::Eq);
11047            let lock = match self.parse_one_of_keywords(&[
11048                Keyword::DEFAULT,
11049                Keyword::EXCLUSIVE,
11050                Keyword::NONE,
11051                Keyword::SHARED,
11052            ]) {
11053                Some(Keyword::DEFAULT) => AlterTableLock::Default,
11054                Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
11055                Some(Keyword::NONE) => AlterTableLock::None,
11056                Some(Keyword::SHARED) => AlterTableLock::Shared,
11057                _ => self.expected_ref(
11058                    "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
11059                    self.peek_token_ref(),
11060                )?,
11061            };
11062            AlterTableOperation::Lock { equals, lock }
11063        } else if self.parse_keyword(Keyword::ALGORITHM) {
11064            let equals = self.consume_token(&Token::Eq);
11065            let algorithm = match self.parse_one_of_keywords(&[
11066                Keyword::DEFAULT,
11067                Keyword::INSTANT,
11068                Keyword::INPLACE,
11069                Keyword::COPY,
11070            ]) {
11071                Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
11072                Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
11073                Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
11074                Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
11075                _ => self.expected_ref(
11076                    "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
11077                    self.peek_token_ref(),
11078                )?,
11079            };
11080            AlterTableOperation::Algorithm { equals, algorithm }
11081        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
11082            let equals = self.consume_token(&Token::Eq);
11083            let value = self.parse_number_value()?;
11084            AlterTableOperation::AutoIncrement { equals, value }
11085        } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
11086            let identity = if self.parse_keyword(Keyword::NOTHING) {
11087                ReplicaIdentity::Nothing
11088            } else if self.parse_keyword(Keyword::FULL) {
11089                ReplicaIdentity::Full
11090            } else if self.parse_keyword(Keyword::DEFAULT) {
11091                ReplicaIdentity::Default
11092            } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
11093                ReplicaIdentity::Index(self.parse_identifier()?)
11094            } else {
11095                return self.expected_ref(
11096                    "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
11097                    self.peek_token_ref(),
11098                );
11099            };
11100
11101            AlterTableOperation::ReplicaIdentity { identity }
11102        } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11103            let name = self.parse_identifier()?;
11104            AlterTableOperation::ValidateConstraint { name }
11105        } else if self.parse_keywords(&[Keyword::SET, Keyword::LOGGED]) {
11106            AlterTableOperation::SetLogged
11107        } else if self.parse_keywords(&[Keyword::SET, Keyword::UNLOGGED]) {
11108            AlterTableOperation::SetUnlogged
11109        } else {
11110            let mut options =
11111                self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
11112            if !options.is_empty() {
11113                AlterTableOperation::SetTblProperties {
11114                    table_properties: options,
11115                }
11116            } else {
11117                options = self.parse_options(Keyword::SET)?;
11118                if !options.is_empty() {
11119                    AlterTableOperation::SetOptionsParens { options }
11120                } else {
11121                    return self.expected_ref(
11122                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
11123                    self.peek_token_ref(),
11124                  );
11125                }
11126            }
11127        };
11128        Ok(operation)
11129    }
11130
11131    fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
11132        let data_type = self.parse_data_type()?;
11133        let using = if self.dialect.supports_alter_column_type_using()
11134            && self.parse_keyword(Keyword::USING)
11135        {
11136            Some(self.parse_expr()?)
11137        } else {
11138            None
11139        };
11140        Ok(AlterColumnOperation::SetDataType {
11141            data_type,
11142            using,
11143            had_set,
11144        })
11145    }
11146
11147    fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
11148        let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
11149        match keyword {
11150            Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
11151            Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
11152            // unreachable because expect_one_of_keywords used above
11153            unexpected_keyword => Err(ParserError::ParserError(
11154                format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
11155            )),
11156        }
11157    }
11158
11159    /// Parse an `ALTER <object>` statement and dispatch to the appropriate alter handler.
11160    pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
11161        if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
11162            return self.parse_alter_text_search().map(Into::into);
11163        }
11164
11165        let object_type = self.expect_one_of_keywords(&[
11166            Keyword::VIEW,
11167            Keyword::TYPE,
11168            Keyword::COLLATION,
11169            Keyword::TABLE,
11170            Keyword::INDEX,
11171            Keyword::FUNCTION,
11172            Keyword::AGGREGATE,
11173            Keyword::ROLE,
11174            Keyword::POLICY,
11175            Keyword::CONNECTOR,
11176            Keyword::ICEBERG,
11177            Keyword::SCHEMA,
11178            Keyword::USER,
11179            Keyword::OPERATOR,
11180        ])?;
11181        match object_type {
11182            Keyword::SCHEMA => {
11183                self.prev_token();
11184                self.prev_token();
11185                self.parse_alter_schema()
11186            }
11187            Keyword::VIEW => self.parse_alter_view(),
11188            Keyword::TYPE => self.parse_alter_type(),
11189            Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
11190            Keyword::TABLE => self.parse_alter_table(false),
11191            Keyword::ICEBERG => {
11192                self.expect_keyword(Keyword::TABLE)?;
11193                self.parse_alter_table(true)
11194            }
11195            Keyword::INDEX => {
11196                let index_name = self.parse_object_name(false)?;
11197                let operation = if self.parse_keyword(Keyword::RENAME) {
11198                    if self.parse_keyword(Keyword::TO) {
11199                        let index_name = self.parse_object_name(false)?;
11200                        AlterIndexOperation::RenameIndex { index_name }
11201                    } else {
11202                        return self.expected_ref("TO after RENAME", self.peek_token_ref());
11203                    }
11204                } else {
11205                    return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
11206                };
11207
11208                Ok(Statement::AlterIndex {
11209                    name: index_name,
11210                    operation,
11211                })
11212            }
11213            Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
11214            Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
11215            Keyword::OPERATOR => {
11216                if self.parse_keyword(Keyword::FAMILY) {
11217                    self.parse_alter_operator_family().map(Into::into)
11218                } else if self.parse_keyword(Keyword::CLASS) {
11219                    self.parse_alter_operator_class().map(Into::into)
11220                } else {
11221                    self.parse_alter_operator().map(Into::into)
11222                }
11223            }
11224            Keyword::ROLE => self.parse_alter_role(),
11225            Keyword::POLICY => self.parse_alter_policy().map(Into::into),
11226            Keyword::CONNECTOR => self.parse_alter_connector(),
11227            Keyword::USER if self.dialect.supports_alter_user_as_alter_role() => {
11228                self.parse_alter_role()
11229            }
11230            Keyword::USER => self.parse_alter_user().map(Into::into),
11231            // unreachable because expect_one_of_keywords used above
11232            unexpected_keyword => Err(ParserError::ParserError(
11233                format!("Internal parser error: expected any of {{TEXT SEARCH, VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
11234            )),
11235        }
11236    }
11237
11238    fn parse_alter_aggregate_signature(
11239        &mut self,
11240    ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
11241        let name = self.parse_object_name(false)?;
11242        self.expect_token(&Token::LParen)?;
11243
11244        if self.consume_token(&Token::Mul) {
11245            self.expect_token(&Token::RParen)?;
11246            return Ok((
11247                FunctionDesc {
11248                    name,
11249                    args: Some(vec![]),
11250                },
11251                true,
11252                None,
11253            ));
11254        }
11255
11256        let args =
11257            if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
11258                vec![]
11259            } else {
11260                self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
11261            };
11262
11263        let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11264            Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
11265        } else {
11266            None
11267        };
11268
11269        self.expect_token(&Token::RParen)?;
11270        Ok((
11271            FunctionDesc {
11272                name,
11273                args: Some(args),
11274            },
11275            false,
11276            aggregate_order_by,
11277        ))
11278    }
11279
11280    fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
11281        let action = if self.parse_keywords(&[
11282            Keyword::CALLED,
11283            Keyword::ON,
11284            Keyword::NULL,
11285            Keyword::INPUT,
11286        ]) {
11287            Some(AlterFunctionAction::CalledOnNull(
11288                FunctionCalledOnNull::CalledOnNullInput,
11289            ))
11290        } else if self.parse_keywords(&[
11291            Keyword::RETURNS,
11292            Keyword::NULL,
11293            Keyword::ON,
11294            Keyword::NULL,
11295            Keyword::INPUT,
11296        ]) {
11297            Some(AlterFunctionAction::CalledOnNull(
11298                FunctionCalledOnNull::ReturnsNullOnNullInput,
11299            ))
11300        } else if self.parse_keyword(Keyword::STRICT) {
11301            Some(AlterFunctionAction::CalledOnNull(
11302                FunctionCalledOnNull::Strict,
11303            ))
11304        } else if self.parse_keyword(Keyword::IMMUTABLE) {
11305            Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
11306        } else if self.parse_keyword(Keyword::STABLE) {
11307            Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
11308        } else if self.parse_keyword(Keyword::VOLATILE) {
11309            Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
11310        } else if self.parse_keyword(Keyword::NOT) {
11311            self.expect_keyword(Keyword::LEAKPROOF)?;
11312            Some(AlterFunctionAction::Leakproof(false))
11313        } else if self.parse_keyword(Keyword::LEAKPROOF) {
11314            Some(AlterFunctionAction::Leakproof(true))
11315        } else if self.parse_keyword(Keyword::EXTERNAL) {
11316            self.expect_keyword(Keyword::SECURITY)?;
11317            let security = if self.parse_keyword(Keyword::DEFINER) {
11318                FunctionSecurity::Definer
11319            } else if self.parse_keyword(Keyword::INVOKER) {
11320                FunctionSecurity::Invoker
11321            } else {
11322                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11323            };
11324            Some(AlterFunctionAction::Security {
11325                external: true,
11326                security,
11327            })
11328        } else if self.parse_keyword(Keyword::SECURITY) {
11329            let security = if self.parse_keyword(Keyword::DEFINER) {
11330                FunctionSecurity::Definer
11331            } else if self.parse_keyword(Keyword::INVOKER) {
11332                FunctionSecurity::Invoker
11333            } else {
11334                return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11335            };
11336            Some(AlterFunctionAction::Security {
11337                external: false,
11338                security,
11339            })
11340        } else if self.parse_keyword(Keyword::PARALLEL) {
11341            let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11342                FunctionParallel::Unsafe
11343            } else if self.parse_keyword(Keyword::RESTRICTED) {
11344                FunctionParallel::Restricted
11345            } else if self.parse_keyword(Keyword::SAFE) {
11346                FunctionParallel::Safe
11347            } else {
11348                return self
11349                    .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11350            };
11351            Some(AlterFunctionAction::Parallel(parallel))
11352        } else if self.parse_keyword(Keyword::COST) {
11353            Some(AlterFunctionAction::Cost(self.parse_number()?))
11354        } else if self.parse_keyword(Keyword::ROWS) {
11355            Some(AlterFunctionAction::Rows(self.parse_number()?))
11356        } else if self.parse_keyword(Keyword::SUPPORT) {
11357            Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11358        } else if self.parse_keyword(Keyword::SET) {
11359            let name = self.parse_object_name(false)?;
11360            let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11361                FunctionSetValue::FromCurrent
11362            } else {
11363                if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11364                    return self.expected_ref("= or TO", self.peek_token_ref());
11365                }
11366                if self.parse_keyword(Keyword::DEFAULT) {
11367                    FunctionSetValue::Default
11368                } else {
11369                    FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11370                }
11371            };
11372            Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11373                name,
11374                value,
11375            }))
11376        } else if self.parse_keyword(Keyword::RESET) {
11377            let reset_config = if self.parse_keyword(Keyword::ALL) {
11378                ResetConfig::ALL
11379            } else {
11380                ResetConfig::ConfigName(self.parse_object_name(false)?)
11381            };
11382            Some(AlterFunctionAction::Reset(reset_config))
11383        } else {
11384            None
11385        };
11386
11387        Ok(action)
11388    }
11389
11390    fn parse_alter_function_actions(
11391        &mut self,
11392    ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11393        let mut actions = vec![];
11394        while let Some(action) = self.parse_alter_function_action()? {
11395            actions.push(action);
11396        }
11397        if actions.is_empty() {
11398            return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11399        }
11400        let restrict = self.parse_keyword(Keyword::RESTRICT);
11401        Ok((actions, restrict))
11402    }
11403
11404    /// Parse an `ALTER FUNCTION` or `ALTER AGGREGATE` statement.
11405    pub fn parse_alter_function(
11406        &mut self,
11407        kind: AlterFunctionKind,
11408    ) -> Result<Statement, ParserError> {
11409        let (function, aggregate_star, aggregate_order_by) = match kind {
11410            AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
11411            AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11412        };
11413
11414        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11415            let new_name = self.parse_identifier()?;
11416            AlterFunctionOperation::RenameTo { new_name }
11417        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11418            AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11419        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11420            AlterFunctionOperation::SetSchema {
11421                schema_name: self.parse_object_name(false)?,
11422            }
11423        } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
11424            if !self.parse_keyword(Keyword::DEPENDS) {
11425                return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11426            }
11427            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11428            AlterFunctionOperation::DependsOnExtension {
11429                no: true,
11430                extension_name: self.parse_object_name(false)?,
11431            }
11432        } else if matches!(kind, AlterFunctionKind::Function)
11433            && self.parse_keyword(Keyword::DEPENDS)
11434        {
11435            self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11436            AlterFunctionOperation::DependsOnExtension {
11437                no: false,
11438                extension_name: self.parse_object_name(false)?,
11439            }
11440        } else if matches!(kind, AlterFunctionKind::Function) {
11441            let (actions, restrict) = self.parse_alter_function_actions()?;
11442            AlterFunctionOperation::Actions { actions, restrict }
11443        } else {
11444            return self.expected_ref(
11445                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11446                self.peek_token_ref(),
11447            );
11448        };
11449
11450        Ok(Statement::AlterFunction(AlterFunction {
11451            kind,
11452            function,
11453            aggregate_order_by,
11454            aggregate_star,
11455            operation,
11456        }))
11457    }
11458
11459    /// Parse a [Statement::AlterTable]
11460    pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11461        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11462        let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
11463        let table_name = self.parse_object_name(false)?;
11464        let on_cluster = self.parse_optional_on_cluster()?;
11465        let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11466
11467        let mut location = None;
11468        if self.parse_keyword(Keyword::LOCATION) {
11469            location = Some(HiveSetLocation {
11470                has_set: false,
11471                location: self.parse_identifier()?,
11472            });
11473        } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11474            location = Some(HiveSetLocation {
11475                has_set: true,
11476                location: self.parse_identifier()?,
11477            });
11478        }
11479
11480        let end_token = if self.peek_token_ref().token == Token::SemiColon {
11481            self.peek_token_ref().clone()
11482        } else {
11483            self.get_current_token().clone()
11484        };
11485
11486        Ok(AlterTable {
11487            name: table_name,
11488            if_exists,
11489            only,
11490            operations,
11491            location,
11492            on_cluster,
11493            table_type: if iceberg {
11494                Some(AlterTableType::Iceberg)
11495            } else {
11496                None
11497            },
11498            end_token: AttachedToken(end_token),
11499        }
11500        .into())
11501    }
11502
11503    /// Parse an `ALTER VIEW` statement.
11504    pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11505        let name = self.parse_object_name(false)?;
11506        let columns = self.parse_parenthesized_column_list(Optional, false)?;
11507
11508        let with_options = self.parse_options(Keyword::WITH)?;
11509
11510        self.expect_keyword_is(Keyword::AS)?;
11511        let query = self.parse_query()?;
11512
11513        Ok(Statement::AlterView {
11514            name,
11515            columns,
11516            query,
11517            with_options,
11518        })
11519    }
11520
11521    /// Parse a [Statement::AlterType]
11522    pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11523        let name = self.parse_object_name(false)?;
11524
11525        if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11526            let new_name = self.parse_identifier()?;
11527            Ok(Statement::AlterType(AlterType {
11528                name,
11529                operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11530            }))
11531        } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11532            let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11533            let new_enum_value = self.parse_identifier()?;
11534            let position = if self.parse_keyword(Keyword::BEFORE) {
11535                Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11536            } else if self.parse_keyword(Keyword::AFTER) {
11537                Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11538            } else {
11539                None
11540            };
11541
11542            Ok(Statement::AlterType(AlterType {
11543                name,
11544                operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11545                    if_not_exists,
11546                    value: new_enum_value,
11547                    position,
11548                }),
11549            }))
11550        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11551            let existing_enum_value = self.parse_identifier()?;
11552            self.expect_keyword(Keyword::TO)?;
11553            let new_enum_value = self.parse_identifier()?;
11554
11555            Ok(Statement::AlterType(AlterType {
11556                name,
11557                operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11558                    from: existing_enum_value,
11559                    to: new_enum_value,
11560                }),
11561            }))
11562        } else {
11563            self.expected_ref(
11564                "{RENAME TO | { RENAME | ADD } VALUE}",
11565                self.peek_token_ref(),
11566            )
11567        }
11568    }
11569
11570    /// Parse a [Statement::AlterCollation].
11571    ///
11572    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-altercollation.html)
11573    pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11574        let name = self.parse_object_name(false)?;
11575        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11576            AlterCollationOperation::RenameTo {
11577                new_name: self.parse_identifier()?,
11578            }
11579        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11580            AlterCollationOperation::OwnerTo(self.parse_owner()?)
11581        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11582            AlterCollationOperation::SetSchema {
11583                schema_name: self.parse_object_name(false)?,
11584            }
11585        } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11586            AlterCollationOperation::RefreshVersion
11587        } else {
11588            return self.expected_ref(
11589                "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11590                self.peek_token_ref(),
11591            );
11592        };
11593
11594        Ok(AlterCollation { name, operation })
11595    }
11596
11597    /// Parse a [Statement::AlterOperator]
11598    ///
11599    /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-alteroperator.html)
11600    pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11601        let name = self.parse_operator_name()?;
11602
11603        // Parse (left_type, right_type)
11604        self.expect_token(&Token::LParen)?;
11605
11606        let left_type = if self.parse_keyword(Keyword::NONE) {
11607            None
11608        } else {
11609            Some(self.parse_data_type()?)
11610        };
11611
11612        self.expect_token(&Token::Comma)?;
11613        let right_type = self.parse_data_type()?;
11614        self.expect_token(&Token::RParen)?;
11615
11616        // Parse the operation
11617        let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11618            let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11619                Owner::CurrentRole
11620            } else if self.parse_keyword(Keyword::CURRENT_USER) {
11621                Owner::CurrentUser
11622            } else if self.parse_keyword(Keyword::SESSION_USER) {
11623                Owner::SessionUser
11624            } else {
11625                Owner::Ident(self.parse_identifier()?)
11626            };
11627            AlterOperatorOperation::OwnerTo(owner)
11628        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11629            let schema_name = self.parse_object_name(false)?;
11630            AlterOperatorOperation::SetSchema { schema_name }
11631        } else if self.parse_keyword(Keyword::SET) {
11632            self.expect_token(&Token::LParen)?;
11633
11634            let mut options = Vec::new();
11635            loop {
11636                let keyword = self.expect_one_of_keywords(&[
11637                    Keyword::RESTRICT,
11638                    Keyword::JOIN,
11639                    Keyword::COMMUTATOR,
11640                    Keyword::NEGATOR,
11641                    Keyword::HASHES,
11642                    Keyword::MERGES,
11643                ])?;
11644
11645                match keyword {
11646                    Keyword::RESTRICT => {
11647                        self.expect_token(&Token::Eq)?;
11648                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11649                            None
11650                        } else {
11651                            Some(self.parse_object_name(false)?)
11652                        };
11653                        options.push(OperatorOption::Restrict(proc_name));
11654                    }
11655                    Keyword::JOIN => {
11656                        self.expect_token(&Token::Eq)?;
11657                        let proc_name = if self.parse_keyword(Keyword::NONE) {
11658                            None
11659                        } else {
11660                            Some(self.parse_object_name(false)?)
11661                        };
11662                        options.push(OperatorOption::Join(proc_name));
11663                    }
11664                    Keyword::COMMUTATOR => {
11665                        self.expect_token(&Token::Eq)?;
11666                        let op_name = self.parse_operator_name()?;
11667                        options.push(OperatorOption::Commutator(op_name));
11668                    }
11669                    Keyword::NEGATOR => {
11670                        self.expect_token(&Token::Eq)?;
11671                        let op_name = self.parse_operator_name()?;
11672                        options.push(OperatorOption::Negator(op_name));
11673                    }
11674                    Keyword::HASHES => {
11675                        options.push(OperatorOption::Hashes);
11676                    }
11677                    Keyword::MERGES => {
11678                        options.push(OperatorOption::Merges);
11679                    }
11680                    unexpected_keyword => return Err(ParserError::ParserError(
11681                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11682                    )),
11683                }
11684
11685                if !self.consume_token(&Token::Comma) {
11686                    break;
11687                }
11688            }
11689
11690            self.expect_token(&Token::RParen)?;
11691            AlterOperatorOperation::Set { options }
11692        } else {
11693            return self.expected_ref(
11694                "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11695                self.peek_token_ref(),
11696            );
11697        };
11698
11699        Ok(AlterOperator {
11700            name,
11701            left_type,
11702            right_type,
11703            operation,
11704        })
11705    }
11706
11707    /// Parse an operator item for ALTER OPERATOR FAMILY ADD operations
11708    fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11709        let strategy_number = self.parse_literal_uint()?;
11710        let operator_name = self.parse_operator_name()?;
11711
11712        // Operator argument types (required for ALTER OPERATOR FAMILY)
11713        self.expect_token(&Token::LParen)?;
11714        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11715        self.expect_token(&Token::RParen)?;
11716
11717        // Optional purpose
11718        let purpose = if self.parse_keyword(Keyword::FOR) {
11719            if self.parse_keyword(Keyword::SEARCH) {
11720                Some(OperatorPurpose::ForSearch)
11721            } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11722                let sort_family = self.parse_object_name(false)?;
11723                Some(OperatorPurpose::ForOrderBy { sort_family })
11724            } else {
11725                return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11726            }
11727        } else {
11728            None
11729        };
11730
11731        Ok(OperatorFamilyItem::Operator {
11732            strategy_number,
11733            operator_name,
11734            op_types,
11735            purpose,
11736        })
11737    }
11738
11739    /// Parse a function item for ALTER OPERATOR FAMILY ADD operations
11740    fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11741        let support_number = self.parse_literal_uint()?;
11742
11743        // Optional operator types
11744        let op_types =
11745            if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11746                let types = self.parse_comma_separated(Parser::parse_data_type)?;
11747                self.expect_token(&Token::RParen)?;
11748                Some(types)
11749            } else if self.consume_token(&Token::LParen) {
11750                self.expect_token(&Token::RParen)?;
11751                Some(vec![])
11752            } else {
11753                None
11754            };
11755
11756        let function_name = self.parse_object_name(false)?;
11757
11758        // Function argument types
11759        let argument_types = if self.consume_token(&Token::LParen) {
11760            if self.peek_token_ref().token == Token::RParen {
11761                self.expect_token(&Token::RParen)?;
11762                vec![]
11763            } else {
11764                let types = self.parse_comma_separated(Parser::parse_data_type)?;
11765                self.expect_token(&Token::RParen)?;
11766                types
11767            }
11768        } else {
11769            vec![]
11770        };
11771
11772        Ok(OperatorFamilyItem::Function {
11773            support_number,
11774            op_types,
11775            function_name,
11776            argument_types,
11777        })
11778    }
11779
11780    /// Parse an operator item for ALTER OPERATOR FAMILY DROP operations
11781    fn parse_operator_family_drop_operator(
11782        &mut self,
11783    ) -> Result<OperatorFamilyDropItem, ParserError> {
11784        let strategy_number = self.parse_literal_uint()?;
11785
11786        // Operator argument types (required for DROP)
11787        self.expect_token(&Token::LParen)?;
11788        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11789        self.expect_token(&Token::RParen)?;
11790
11791        Ok(OperatorFamilyDropItem::Operator {
11792            strategy_number,
11793            op_types,
11794        })
11795    }
11796
11797    /// Parse a function item for ALTER OPERATOR FAMILY DROP operations
11798    fn parse_operator_family_drop_function(
11799        &mut self,
11800    ) -> Result<OperatorFamilyDropItem, ParserError> {
11801        let support_number = self.parse_literal_uint()?;
11802
11803        // Operator types (required for DROP)
11804        self.expect_token(&Token::LParen)?;
11805        let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11806        self.expect_token(&Token::RParen)?;
11807
11808        Ok(OperatorFamilyDropItem::Function {
11809            support_number,
11810            op_types,
11811        })
11812    }
11813
11814    /// Parse an operator family item for ADD operations (dispatches to operator or function parsing)
11815    fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11816        if self.parse_keyword(Keyword::OPERATOR) {
11817            self.parse_operator_family_add_operator()
11818        } else if self.parse_keyword(Keyword::FUNCTION) {
11819            self.parse_operator_family_add_function()
11820        } else {
11821            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11822        }
11823    }
11824
11825    /// Parse an operator family item for DROP operations (dispatches to operator or function parsing)
11826    fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11827        if self.parse_keyword(Keyword::OPERATOR) {
11828            self.parse_operator_family_drop_operator()
11829        } else if self.parse_keyword(Keyword::FUNCTION) {
11830            self.parse_operator_family_drop_function()
11831        } else {
11832            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11833        }
11834    }
11835
11836    /// Parse a [Statement::AlterOperatorFamily]
11837    /// See <https://www.postgresql.org/docs/current/sql-alteropfamily.html>
11838    pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11839        let name = self.parse_object_name(false)?;
11840        self.expect_keyword(Keyword::USING)?;
11841        let using = self.parse_identifier()?;
11842
11843        let operation = if self.parse_keyword(Keyword::ADD) {
11844            let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11845            AlterOperatorFamilyOperation::Add { items }
11846        } else if self.parse_keyword(Keyword::DROP) {
11847            let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11848            AlterOperatorFamilyOperation::Drop { items }
11849        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11850            let new_name = self.parse_object_name(false)?;
11851            AlterOperatorFamilyOperation::RenameTo { new_name }
11852        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11853            let owner = self.parse_owner()?;
11854            AlterOperatorFamilyOperation::OwnerTo(owner)
11855        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11856            let schema_name = self.parse_object_name(false)?;
11857            AlterOperatorFamilyOperation::SetSchema { schema_name }
11858        } else {
11859            return self.expected_ref(
11860                "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11861                self.peek_token_ref(),
11862            );
11863        };
11864
11865        Ok(AlterOperatorFamily {
11866            name,
11867            using,
11868            operation,
11869        })
11870    }
11871
11872    /// Parse an `ALTER OPERATOR CLASS` statement.
11873    ///
11874    /// Handles operations like `RENAME TO`, `OWNER TO`, and `SET SCHEMA`.
11875    pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11876        let name = self.parse_object_name(false)?;
11877        self.expect_keyword(Keyword::USING)?;
11878        let using = self.parse_identifier()?;
11879
11880        let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11881            let new_name = self.parse_object_name(false)?;
11882            AlterOperatorClassOperation::RenameTo { new_name }
11883        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11884            let owner = self.parse_owner()?;
11885            AlterOperatorClassOperation::OwnerTo(owner)
11886        } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11887            let schema_name = self.parse_object_name(false)?;
11888            AlterOperatorClassOperation::SetSchema { schema_name }
11889        } else {
11890            return self.expected_ref(
11891                "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11892                self.peek_token_ref(),
11893            );
11894        };
11895
11896        Ok(AlterOperatorClass {
11897            name,
11898            using,
11899            operation,
11900        })
11901    }
11902
11903    /// Parse an `ALTER SCHEMA` statement.
11904    ///
11905    /// Supports operations such as setting options, renaming, adding/dropping replicas, and changing owner.
11906    pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11907        self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11908        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11909        let name = self.parse_object_name(false)?;
11910        let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11911            self.prev_token();
11912            let options = self.parse_options(Keyword::OPTIONS)?;
11913            AlterSchemaOperation::SetOptionsParens { options }
11914        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11915            let collate = self.parse_expr()?;
11916            AlterSchemaOperation::SetDefaultCollate { collate }
11917        } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11918            let replica = self.parse_identifier()?;
11919            let options = if self.peek_keyword(Keyword::OPTIONS) {
11920                Some(self.parse_options(Keyword::OPTIONS)?)
11921            } else {
11922                None
11923            };
11924            AlterSchemaOperation::AddReplica { replica, options }
11925        } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11926            let replica = self.parse_identifier()?;
11927            AlterSchemaOperation::DropReplica { replica }
11928        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11929            let new_name = self.parse_object_name(false)?;
11930            AlterSchemaOperation::Rename { name: new_name }
11931        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11932            let owner = self.parse_owner()?;
11933            AlterSchemaOperation::OwnerTo { owner }
11934        } else {
11935            return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11936        };
11937        Ok(Statement::AlterSchema(AlterSchema {
11938            name,
11939            if_exists,
11940            operations: vec![operation],
11941        }))
11942    }
11943
11944    /// Parse a `CALL procedure_name(arg1, arg2, ...)`
11945    /// or `CALL procedure_name` statement
11946    pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11947        let object_name = self.parse_object_name(false)?;
11948        if self.peek_token_ref().token == Token::LParen {
11949            match self.parse_function(object_name)? {
11950                Expr::Function(f) => Ok(Statement::Call(f)),
11951                other => parser_err!(
11952                    format!("Expected a simple procedure call but found: {other}"),
11953                    self.peek_token_ref().span.start
11954                ),
11955            }
11956        } else {
11957            Ok(Statement::Call(Function {
11958                name: object_name,
11959                uses_odbc_syntax: false,
11960                parameters: FunctionArguments::None,
11961                args: FunctionArguments::None,
11962                over: None,
11963                filter: None,
11964                null_treatment: None,
11965                within_group: vec![],
11966            }))
11967        }
11968    }
11969
11970    /// Parse a copy statement
11971    pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11972        let source;
11973        if self.consume_token(&Token::LParen) {
11974            source = CopySource::Query(self.parse_query()?);
11975            self.expect_token(&Token::RParen)?;
11976        } else {
11977            let table_name = self.parse_object_name(false)?;
11978            let columns = self.parse_parenthesized_column_list(Optional, false)?;
11979            source = CopySource::Table {
11980                table_name,
11981                columns,
11982            };
11983        }
11984        let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
11985            Some(Keyword::FROM) => false,
11986            Some(Keyword::TO) => true,
11987            _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
11988        };
11989        if !to {
11990            // Use a separate if statement to prevent Rust compiler from complaining about
11991            // "if statement in this position is unstable: https://github.com/rust-lang/rust/issues/53667"
11992            if let CopySource::Query(_) = source {
11993                return Err(ParserError::ParserError(
11994                    "COPY ... FROM does not support query as a source".to_string(),
11995                ));
11996            }
11997        }
11998        let target = if self.parse_keyword(Keyword::STDIN) {
11999            CopyTarget::Stdin
12000        } else if self.parse_keyword(Keyword::STDOUT) {
12001            CopyTarget::Stdout
12002        } else if self.parse_keyword(Keyword::PROGRAM) {
12003            CopyTarget::Program {
12004                command: self.parse_literal_string()?,
12005            }
12006        } else {
12007            CopyTarget::File {
12008                filename: self.parse_literal_string()?,
12009            }
12010        };
12011        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
12012        let mut options = vec![];
12013        if self.consume_token(&Token::LParen) {
12014            options = self.parse_comma_separated(Parser::parse_copy_option)?;
12015            self.expect_token(&Token::RParen)?;
12016        }
12017        let mut legacy_options = vec![];
12018        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
12019            legacy_options.push(opt);
12020        }
12021        let values =
12022            if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
12023                self.expect_token(&Token::SemiColon)?;
12024                self.parse_tsv()
12025            } else {
12026                vec![]
12027            };
12028        Ok(Statement::Copy {
12029            source,
12030            to,
12031            target,
12032            options,
12033            legacy_options,
12034            values,
12035        })
12036    }
12037
12038    /// Parse [Statement::Open]
12039    fn parse_open(&mut self) -> Result<Statement, ParserError> {
12040        self.expect_keyword(Keyword::OPEN)?;
12041        Ok(Statement::Open(OpenStatement {
12042            cursor_name: self.parse_identifier()?,
12043        }))
12044    }
12045
12046    /// Parse a `CLOSE` cursor statement.
12047    pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
12048        let cursor = if self.parse_keyword(Keyword::ALL) {
12049            CloseCursor::All
12050        } else {
12051            let name = self.parse_identifier()?;
12052
12053            CloseCursor::Specific { name }
12054        };
12055
12056        Ok(Statement::Close { cursor })
12057    }
12058
12059    fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
12060        let ret = match self.parse_one_of_keywords(&[
12061            Keyword::FORMAT,
12062            Keyword::FREEZE,
12063            Keyword::DELIMITER,
12064            Keyword::NULL,
12065            Keyword::HEADER,
12066            Keyword::QUOTE,
12067            Keyword::ESCAPE,
12068            Keyword::FORCE_QUOTE,
12069            Keyword::FORCE_NOT_NULL,
12070            Keyword::FORCE_NULL,
12071            Keyword::ENCODING,
12072        ]) {
12073            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
12074            Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
12075                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12076                Some(Keyword::FALSE)
12077            )),
12078            Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
12079            Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
12080            Some(Keyword::HEADER) => CopyOption::Header(!matches!(
12081                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12082                Some(Keyword::FALSE)
12083            )),
12084            Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
12085            Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
12086            Some(Keyword::FORCE_QUOTE) => {
12087                CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
12088            }
12089            Some(Keyword::FORCE_NOT_NULL) => {
12090                CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12091            }
12092            Some(Keyword::FORCE_NULL) => {
12093                CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12094            }
12095            Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
12096            _ => self.expected_ref("option", self.peek_token_ref())?,
12097        };
12098        Ok(ret)
12099    }
12100
12101    fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
12102        // FORMAT \[ AS \] is optional
12103        if self.parse_keyword(Keyword::FORMAT) {
12104            let _ = self.parse_keyword(Keyword::AS);
12105        }
12106
12107        let ret = match self.parse_one_of_keywords(&[
12108            Keyword::ACCEPTANYDATE,
12109            Keyword::ACCEPTINVCHARS,
12110            Keyword::ADDQUOTES,
12111            Keyword::ALLOWOVERWRITE,
12112            Keyword::BINARY,
12113            Keyword::BLANKSASNULL,
12114            Keyword::BZIP2,
12115            Keyword::CLEANPATH,
12116            Keyword::COMPUPDATE,
12117            Keyword::CREDENTIALS,
12118            Keyword::CSV,
12119            Keyword::DATEFORMAT,
12120            Keyword::DELIMITER,
12121            Keyword::EMPTYASNULL,
12122            Keyword::ENCRYPTED,
12123            Keyword::ESCAPE,
12124            Keyword::EXTENSION,
12125            Keyword::FIXEDWIDTH,
12126            Keyword::GZIP,
12127            Keyword::HEADER,
12128            Keyword::IAM_ROLE,
12129            Keyword::IGNOREHEADER,
12130            Keyword::JSON,
12131            Keyword::MANIFEST,
12132            Keyword::MAXFILESIZE,
12133            Keyword::NULL,
12134            Keyword::PARALLEL,
12135            Keyword::PARQUET,
12136            Keyword::PARTITION,
12137            Keyword::REGION,
12138            Keyword::REMOVEQUOTES,
12139            Keyword::ROWGROUPSIZE,
12140            Keyword::STATUPDATE,
12141            Keyword::TIMEFORMAT,
12142            Keyword::TRUNCATECOLUMNS,
12143            Keyword::ZSTD,
12144        ]) {
12145            Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
12146            Some(Keyword::ACCEPTINVCHARS) => {
12147                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12148                let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12149                    Some(self.parse_literal_string()?)
12150                } else {
12151                    None
12152                };
12153                CopyLegacyOption::AcceptInvChars(ch)
12154            }
12155            Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
12156            Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
12157            Some(Keyword::BINARY) => CopyLegacyOption::Binary,
12158            Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
12159            Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
12160            Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
12161            Some(Keyword::COMPUPDATE) => {
12162                let preset = self.parse_keyword(Keyword::PRESET);
12163                let enabled = match self.parse_one_of_keywords(&[
12164                    Keyword::TRUE,
12165                    Keyword::FALSE,
12166                    Keyword::ON,
12167                    Keyword::OFF,
12168                ]) {
12169                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12170                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12171                    _ => None,
12172                };
12173                CopyLegacyOption::CompUpdate { preset, enabled }
12174            }
12175            Some(Keyword::CREDENTIALS) => {
12176                CopyLegacyOption::Credentials(self.parse_literal_string()?)
12177            }
12178            Some(Keyword::CSV) => CopyLegacyOption::Csv({
12179                let mut opts = vec![];
12180                while let Some(opt) =
12181                    self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
12182                {
12183                    opts.push(opt);
12184                }
12185                opts
12186            }),
12187            Some(Keyword::DATEFORMAT) => {
12188                let _ = self.parse_keyword(Keyword::AS);
12189                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12190                    Some(self.parse_literal_string()?)
12191                } else {
12192                    None
12193                };
12194                CopyLegacyOption::DateFormat(fmt)
12195            }
12196            Some(Keyword::DELIMITER) => {
12197                let _ = self.parse_keyword(Keyword::AS);
12198                CopyLegacyOption::Delimiter(self.parse_literal_char()?)
12199            }
12200            Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
12201            Some(Keyword::ENCRYPTED) => {
12202                let auto = self.parse_keyword(Keyword::AUTO);
12203                CopyLegacyOption::Encrypted { auto }
12204            }
12205            Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
12206            Some(Keyword::EXTENSION) => {
12207                let ext = self.parse_literal_string()?;
12208                CopyLegacyOption::Extension(ext)
12209            }
12210            Some(Keyword::FIXEDWIDTH) => {
12211                let spec = self.parse_literal_string()?;
12212                CopyLegacyOption::FixedWidth(spec)
12213            }
12214            Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
12215            Some(Keyword::HEADER) => CopyLegacyOption::Header,
12216            Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
12217            Some(Keyword::IGNOREHEADER) => {
12218                let _ = self.parse_keyword(Keyword::AS);
12219                let num_rows = self.parse_literal_uint()?;
12220                CopyLegacyOption::IgnoreHeader(num_rows)
12221            }
12222            Some(Keyword::JSON) => {
12223                let _ = self.parse_keyword(Keyword::AS);
12224                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12225                    Some(self.parse_literal_string()?)
12226                } else {
12227                    None
12228                };
12229                CopyLegacyOption::Json(fmt)
12230            }
12231            Some(Keyword::MANIFEST) => {
12232                let verbose = self.parse_keyword(Keyword::VERBOSE);
12233                CopyLegacyOption::Manifest { verbose }
12234            }
12235            Some(Keyword::MAXFILESIZE) => {
12236                let _ = self.parse_keyword(Keyword::AS);
12237                let size = self.parse_number_value()?;
12238                let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12239                    Some(Keyword::MB) => Some(FileSizeUnit::MB),
12240                    Some(Keyword::GB) => Some(FileSizeUnit::GB),
12241                    _ => None,
12242                };
12243                CopyLegacyOption::MaxFileSize(FileSize { size, unit })
12244            }
12245            Some(Keyword::NULL) => {
12246                let _ = self.parse_keyword(Keyword::AS);
12247                CopyLegacyOption::Null(self.parse_literal_string()?)
12248            }
12249            Some(Keyword::PARALLEL) => {
12250                let enabled = match self.parse_one_of_keywords(&[
12251                    Keyword::TRUE,
12252                    Keyword::FALSE,
12253                    Keyword::ON,
12254                    Keyword::OFF,
12255                ]) {
12256                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12257                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12258                    _ => None,
12259                };
12260                CopyLegacyOption::Parallel(enabled)
12261            }
12262            Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
12263            Some(Keyword::PARTITION) => {
12264                self.expect_keyword(Keyword::BY)?;
12265                let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
12266                let include = self.parse_keyword(Keyword::INCLUDE);
12267                CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
12268            }
12269            Some(Keyword::REGION) => {
12270                let _ = self.parse_keyword(Keyword::AS);
12271                let region = self.parse_literal_string()?;
12272                CopyLegacyOption::Region(region)
12273            }
12274            Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
12275            Some(Keyword::ROWGROUPSIZE) => {
12276                let _ = self.parse_keyword(Keyword::AS);
12277                let file_size = self.parse_file_size()?;
12278                CopyLegacyOption::RowGroupSize(file_size)
12279            }
12280            Some(Keyword::STATUPDATE) => {
12281                let enabled = match self.parse_one_of_keywords(&[
12282                    Keyword::TRUE,
12283                    Keyword::FALSE,
12284                    Keyword::ON,
12285                    Keyword::OFF,
12286                ]) {
12287                    Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12288                    Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12289                    _ => None,
12290                };
12291                CopyLegacyOption::StatUpdate(enabled)
12292            }
12293            Some(Keyword::TIMEFORMAT) => {
12294                let _ = self.parse_keyword(Keyword::AS);
12295                let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12296                    Some(self.parse_literal_string()?)
12297                } else {
12298                    None
12299                };
12300                CopyLegacyOption::TimeFormat(fmt)
12301            }
12302            Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
12303            Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
12304            _ => self.expected_ref("option", self.peek_token_ref())?,
12305        };
12306        Ok(ret)
12307    }
12308
12309    fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
12310        let size = self.parse_number_value()?;
12311        let unit = self.maybe_parse_file_size_unit();
12312        Ok(FileSize { size, unit })
12313    }
12314
12315    fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
12316        match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12317            Some(Keyword::MB) => Some(FileSizeUnit::MB),
12318            Some(Keyword::GB) => Some(FileSizeUnit::GB),
12319            _ => None,
12320        }
12321    }
12322
12323    fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12324        if self.parse_keyword(Keyword::DEFAULT) {
12325            Ok(IamRoleKind::Default)
12326        } else {
12327            let arn = self.parse_literal_string()?;
12328            Ok(IamRoleKind::Arn(arn))
12329        }
12330    }
12331
12332    fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12333        let ret = match self.parse_one_of_keywords(&[
12334            Keyword::HEADER,
12335            Keyword::QUOTE,
12336            Keyword::ESCAPE,
12337            Keyword::FORCE,
12338        ]) {
12339            Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12340            Some(Keyword::QUOTE) => {
12341                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12342                CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12343            }
12344            Some(Keyword::ESCAPE) => {
12345                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
12346                CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12347            }
12348            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12349                CopyLegacyCsvOption::ForceNotNull(
12350                    self.parse_comma_separated(|p| p.parse_identifier())?,
12351                )
12352            }
12353            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12354                CopyLegacyCsvOption::ForceQuote(
12355                    self.parse_comma_separated(|p| p.parse_identifier())?,
12356                )
12357            }
12358            _ => self.expected_ref("csv option", self.peek_token_ref())?,
12359        };
12360        Ok(ret)
12361    }
12362
12363    fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12364        let s = self.parse_literal_string()?;
12365        if s.len() != 1 {
12366            let loc = self
12367                .tokens
12368                .get(self.index - 1)
12369                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12370            return parser_err!(format!("Expect a char, found {s:?}"), loc);
12371        }
12372        Ok(s.chars().next().unwrap())
12373    }
12374
12375    /// Parse a tab separated values in
12376    /// COPY payload
12377    pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12378        self.parse_tab_value()
12379    }
12380
12381    /// Parse a single tab-separated value row used by `COPY` payload parsing.
12382    pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12383        let mut values = vec![];
12384        let mut content = String::new();
12385        while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12386            match t {
12387                Token::Whitespace(Whitespace::Tab) => {
12388                    values.push(Some(core::mem::take(&mut content)));
12389                }
12390                Token::Whitespace(Whitespace::Newline) => {
12391                    values.push(Some(core::mem::take(&mut content)));
12392                }
12393                Token::Backslash => {
12394                    if self.consume_token(&Token::Period) {
12395                        return values;
12396                    }
12397                    if let Token::Word(w) = self.next_token().token {
12398                        if w.value == "N" {
12399                            values.push(None);
12400                        }
12401                    }
12402                }
12403                _ => {
12404                    content.push_str(&t.to_string());
12405                }
12406            }
12407        }
12408        values
12409    }
12410
12411    /// Parse a literal value (numbers, strings, date/time, booleans)
12412    pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12413        let next_token = self.next_token();
12414        let span = next_token.span;
12415        let ok_value = |value: Value| Ok(value.with_span(span));
12416        match next_token.token {
12417            Token::Word(w) => match w.keyword {
12418                Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12419                    ok_value(Value::Boolean(true))
12420                }
12421                Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12422                    ok_value(Value::Boolean(false))
12423                }
12424                Keyword::NULL => ok_value(Value::Null),
12425                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12426                    Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12427                    Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12428                    _ => self.expected(
12429                        "A value?",
12430                        TokenWithSpan {
12431                            token: Token::Word(w),
12432                            span,
12433                        },
12434                    )?,
12435                },
12436                _ => self.expected(
12437                    "a concrete value",
12438                    TokenWithSpan {
12439                        token: Token::Word(w),
12440                        span,
12441                    },
12442                ),
12443            },
12444            // The call to n.parse() returns a bigdecimal when the
12445            // bigdecimal feature is enabled, and is otherwise a no-op
12446            // (i.e., it returns the input string).
12447            Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12448            Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12449                self.maybe_concat_string_literal(s.to_string()),
12450            )),
12451            Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12452                self.maybe_concat_string_literal(s.to_string()),
12453            )),
12454            Token::TripleSingleQuotedString(ref s) => {
12455                ok_value(Value::TripleSingleQuotedString(s.to_string()))
12456            }
12457            Token::TripleDoubleQuotedString(ref s) => {
12458                ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12459            }
12460            Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12461            Token::SingleQuotedByteStringLiteral(ref s) => {
12462                ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12463            }
12464            Token::DoubleQuotedByteStringLiteral(ref s) => {
12465                ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12466            }
12467            Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12468                ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12469            }
12470            Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12471                ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12472            }
12473            Token::SingleQuotedRawStringLiteral(ref s) => {
12474                ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12475            }
12476            Token::DoubleQuotedRawStringLiteral(ref s) => {
12477                ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12478            }
12479            Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12480                ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12481            }
12482            Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12483                ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12484            }
12485            Token::NationalStringLiteral(ref s) => {
12486                ok_value(Value::NationalStringLiteral(s.to_string()))
12487            }
12488            Token::QuoteDelimitedStringLiteral(v) => {
12489                ok_value(Value::QuoteDelimitedStringLiteral(v))
12490            }
12491            Token::NationalQuoteDelimitedStringLiteral(v) => {
12492                ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12493            }
12494            Token::EscapedStringLiteral(ref s) => {
12495                ok_value(Value::EscapedStringLiteral(s.to_string()))
12496            }
12497            Token::UnicodeStringLiteral(ref s) => {
12498                ok_value(Value::UnicodeStringLiteral(s.to_string()))
12499            }
12500            Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12501            Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12502            tok @ Token::Colon | tok @ Token::AtSign => {
12503                // 1. Not calling self.parse_identifier(false)?
12504                //    because only in placeholder we want to check
12505                //    numbers as idfentifies.  This because snowflake
12506                //    allows numbers as placeholders
12507                // 2. Not calling self.next_token() to enforce `tok`
12508                //    be followed immediately by a word/number, ie.
12509                //    without any whitespace in between
12510                let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12511                let ident = match next_token.token {
12512                    Token::Word(w) => Ok(w.into_ident(next_token.span)),
12513                    Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12514                    _ => self.expected("placeholder", next_token),
12515                }?;
12516                Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12517                    .with_span(Span::new(span.start, ident.span.end)))
12518            }
12519            unexpected => self.expected(
12520                "a value",
12521                TokenWithSpan {
12522                    token: unexpected,
12523                    span,
12524                },
12525            ),
12526        }
12527    }
12528
12529    fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12530        if self.dialect.supports_string_literal_concatenation() {
12531            while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12532                self.peek_token_ref().token
12533            {
12534                str.push_str(s);
12535                self.advance_token();
12536            }
12537        } else if self
12538            .dialect
12539            .supports_string_literal_concatenation_with_newline()
12540        {
12541            // We are iterating over tokens including whitespaces, to identify
12542            // string literals separated by newlines so we can concatenate them.
12543            let mut after_newline = false;
12544            loop {
12545                match self.peek_token_no_skip().token {
12546                    Token::Whitespace(Whitespace::Newline) => {
12547                        after_newline = true;
12548                        self.next_token_no_skip();
12549                    }
12550                    Token::Whitespace(_) => {
12551                        self.next_token_no_skip();
12552                    }
12553                    Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12554                        if after_newline =>
12555                    {
12556                        str.push_str(s.clone().as_str());
12557                        self.next_token_no_skip();
12558                        after_newline = false;
12559                    }
12560                    _ => break,
12561                }
12562            }
12563        }
12564
12565        str
12566    }
12567
12568    /// Parse an unsigned numeric literal
12569    pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12570        let value_wrapper = self.parse_value()?;
12571        match &value_wrapper.value {
12572            Value::Number(_, _) => Ok(value_wrapper),
12573            Value::Placeholder(_) => Ok(value_wrapper),
12574            _ => {
12575                self.prev_token();
12576                self.expected_ref("literal number", self.peek_token_ref())
12577            }
12578        }
12579    }
12580
12581    /// Parse a numeric literal as an expression. Returns a [`Expr::UnaryOp`] if the number is signed,
12582    /// otherwise returns a [`Expr::Value`]
12583    pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12584        let next_token = self.next_token();
12585        match next_token.token {
12586            Token::Plus => Ok(Expr::UnaryOp {
12587                op: UnaryOperator::Plus,
12588                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12589            }),
12590            Token::Minus => Ok(Expr::UnaryOp {
12591                op: UnaryOperator::Minus,
12592                expr: Box::new(Expr::Value(self.parse_number_value()?)),
12593            }),
12594            _ => {
12595                self.prev_token();
12596                Ok(Expr::Value(self.parse_number_value()?))
12597            }
12598        }
12599    }
12600
12601    fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12602        let next_token = self.next_token();
12603        let span = next_token.span;
12604        match next_token.token {
12605            Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12606                Value::SingleQuotedString(s.to_string()).with_span(span),
12607            )),
12608            Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12609                Value::DoubleQuotedString(s.to_string()).with_span(span),
12610            )),
12611            Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12612                Value::HexStringLiteral(s.to_string()).with_span(span),
12613            )),
12614            unexpected => self.expected(
12615                "a string value",
12616                TokenWithSpan {
12617                    token: unexpected,
12618                    span,
12619                },
12620            ),
12621        }
12622    }
12623
12624    /// Parse an unsigned literal integer/long
12625    pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12626        let next_token = self.next_token();
12627        match next_token.token {
12628            Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12629            _ => self.expected("literal int", next_token),
12630        }
12631    }
12632
12633    /// Parse the body of a `CREATE FUNCTION` specified as a string.
12634    /// e.g. `CREATE FUNCTION ... AS $$ body $$`.
12635    fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12636        let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12637            let peek_token = parser.peek_token();
12638            let span = peek_token.span;
12639            match peek_token.token {
12640                Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12641                {
12642                    parser.next_token();
12643                    Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12644                }
12645                _ => Ok(Expr::Value(
12646                    Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12647                )),
12648            }
12649        };
12650
12651        Ok(CreateFunctionBody::AsBeforeOptions {
12652            body: parse_string_expr(self)?,
12653            link_symbol: if self.consume_token(&Token::Comma) {
12654                Some(parse_string_expr(self)?)
12655            } else {
12656                None
12657            },
12658        })
12659    }
12660
12661    /// Parse a literal string
12662    pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12663        let next_token = self.next_token();
12664        match next_token.token {
12665            Token::Word(Word {
12666                value,
12667                keyword: Keyword::NoKeyword,
12668                ..
12669            }) => Ok(value),
12670            Token::SingleQuotedString(s) => Ok(s),
12671            Token::DoubleQuotedString(s) => Ok(s),
12672            Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12673                Ok(s)
12674            }
12675            Token::UnicodeStringLiteral(s) => Ok(s),
12676            _ => self.expected("literal string", next_token),
12677        }
12678    }
12679
12680    /// Parse a boolean string
12681    pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12682        match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12683            Some(Keyword::TRUE) => Ok(true),
12684            Some(Keyword::FALSE) => Ok(false),
12685            _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12686        }
12687    }
12688
12689    /// Parse the `IS [NOT] JSON` predicate after `JSON` (and optional `NOT`) was consumed.
12690    fn parse_is_json_predicate(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
12691        let kind = match self.parse_one_of_keywords(&[
12692            Keyword::VALUE,
12693            Keyword::SCALAR,
12694            Keyword::ARRAY,
12695            Keyword::OBJECT,
12696        ]) {
12697            Some(Keyword::VALUE) => Some(JsonPredicateType::Value),
12698            Some(Keyword::SCALAR) => Some(JsonPredicateType::Scalar),
12699            Some(Keyword::ARRAY) => Some(JsonPredicateType::Array),
12700            Some(Keyword::OBJECT) => Some(JsonPredicateType::Object),
12701            _ => None,
12702        };
12703
12704        let unique_keys = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
12705            Some(Keyword::WITH) => {
12706                self.expect_keyword_is(Keyword::UNIQUE)?;
12707                let _ = self.parse_keyword(Keyword::KEYS);
12708                Some(JsonKeyUniqueness::WithUniqueKeys)
12709            }
12710            Some(Keyword::WITHOUT) => {
12711                self.expect_keyword_is(Keyword::UNIQUE)?;
12712                let _ = self.parse_keyword(Keyword::KEYS);
12713                Some(JsonKeyUniqueness::WithoutUniqueKeys)
12714            }
12715            _ => None,
12716        };
12717
12718        Ok(Expr::IsJson {
12719            expr: Box::new(expr),
12720            kind,
12721            unique_keys,
12722            negated,
12723        })
12724    }
12725
12726    /// Parse a literal unicode normalization clause
12727    pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12728        let neg = self.parse_keyword(Keyword::NOT);
12729        let normalized_form = self.maybe_parse(|parser| {
12730            match parser.parse_one_of_keywords(&[
12731                Keyword::NFC,
12732                Keyword::NFD,
12733                Keyword::NFKC,
12734                Keyword::NFKD,
12735            ]) {
12736                Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12737                Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12738                Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12739                Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12740                _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12741            }
12742        })?;
12743        if self.parse_keyword(Keyword::NORMALIZED) {
12744            return Ok(Expr::IsNormalized {
12745                expr: Box::new(expr),
12746                form: normalized_form,
12747                negated: neg,
12748            });
12749        }
12750        self.expected_ref("unicode normalization form", self.peek_token_ref())
12751    }
12752
12753    /// Parse parenthesized enum members, used with `ENUM(...)` type definitions.
12754    pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12755        self.expect_token(&Token::LParen)?;
12756        let values = self.parse_comma_separated(|parser| {
12757            let name = parser.parse_literal_string()?;
12758            let e = if parser.consume_token(&Token::Eq) {
12759                let value = parser.parse_number()?;
12760                EnumMember::NamedValue(name, value)
12761            } else {
12762                EnumMember::Name(name)
12763            };
12764            Ok(e)
12765        })?;
12766        self.expect_token(&Token::RParen)?;
12767
12768        Ok(values)
12769    }
12770
12771    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
12772    pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12773        let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12774        if trailing_bracket.0 {
12775            return parser_err!(
12776                format!("unmatched > after parsing data type {ty}"),
12777                self.peek_token_ref()
12778            );
12779        }
12780
12781        Ok(ty)
12782    }
12783
12784    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
12785    fn parse_data_type_helper(
12786        &mut self,
12787    ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12788        let _guard = self.recursion_counter.try_decrease()?;
12789
12790        let dialect = self.dialect;
12791        self.advance_token();
12792        let next_token = self.get_current_token();
12793        let next_token_index = self.get_current_index();
12794
12795        let mut trailing_bracket: MatchedTrailingBracket = false.into();
12796        let mut data = match &next_token.token {
12797            Token::Word(w) => match w.keyword {
12798                Keyword::BOOLEAN => Ok(DataType::Boolean),
12799                Keyword::BOOL => Ok(DataType::Bool),
12800                Keyword::FLOAT => {
12801                    let precision = self.parse_exact_number_optional_precision_scale()?;
12802
12803                    if self.parse_keyword(Keyword::UNSIGNED) {
12804                        Ok(DataType::FloatUnsigned(precision))
12805                    } else {
12806                        Ok(DataType::Float(precision))
12807                    }
12808                }
12809                Keyword::REAL => {
12810                    if self.parse_keyword(Keyword::UNSIGNED) {
12811                        Ok(DataType::RealUnsigned)
12812                    } else {
12813                        Ok(DataType::Real)
12814                    }
12815                }
12816                Keyword::FLOAT4 => Ok(DataType::Float4),
12817                Keyword::FLOAT32 => Ok(DataType::Float32),
12818                Keyword::FLOAT64 => Ok(DataType::Float64),
12819                Keyword::FLOAT8 => Ok(DataType::Float8),
12820                Keyword::DOUBLE => {
12821                    if self.parse_keyword(Keyword::PRECISION) {
12822                        if self.parse_keyword(Keyword::UNSIGNED) {
12823                            Ok(DataType::DoublePrecisionUnsigned)
12824                        } else {
12825                            Ok(DataType::DoublePrecision)
12826                        }
12827                    } else {
12828                        let precision = self.parse_exact_number_optional_precision_scale()?;
12829
12830                        if self.parse_keyword(Keyword::UNSIGNED) {
12831                            Ok(DataType::DoubleUnsigned(precision))
12832                        } else {
12833                            Ok(DataType::Double(precision))
12834                        }
12835                    }
12836                }
12837                Keyword::TINYINT => {
12838                    let optional_precision = self.parse_optional_precision();
12839                    if self.parse_keyword(Keyword::UNSIGNED) {
12840                        Ok(DataType::TinyIntUnsigned(optional_precision?))
12841                    } else {
12842                        if dialect.supports_data_type_signed_suffix() {
12843                            let _ = self.parse_keyword(Keyword::SIGNED);
12844                        }
12845                        Ok(DataType::TinyInt(optional_precision?))
12846                    }
12847                }
12848                Keyword::INT2 => {
12849                    let optional_precision = self.parse_optional_precision();
12850                    if self.parse_keyword(Keyword::UNSIGNED) {
12851                        Ok(DataType::Int2Unsigned(optional_precision?))
12852                    } else {
12853                        Ok(DataType::Int2(optional_precision?))
12854                    }
12855                }
12856                Keyword::SMALLINT => {
12857                    let optional_precision = self.parse_optional_precision();
12858                    if self.parse_keyword(Keyword::UNSIGNED) {
12859                        Ok(DataType::SmallIntUnsigned(optional_precision?))
12860                    } else {
12861                        if dialect.supports_data_type_signed_suffix() {
12862                            let _ = self.parse_keyword(Keyword::SIGNED);
12863                        }
12864                        Ok(DataType::SmallInt(optional_precision?))
12865                    }
12866                }
12867                Keyword::MEDIUMINT => {
12868                    let optional_precision = self.parse_optional_precision();
12869                    if self.parse_keyword(Keyword::UNSIGNED) {
12870                        Ok(DataType::MediumIntUnsigned(optional_precision?))
12871                    } else {
12872                        if dialect.supports_data_type_signed_suffix() {
12873                            let _ = self.parse_keyword(Keyword::SIGNED);
12874                        }
12875                        Ok(DataType::MediumInt(optional_precision?))
12876                    }
12877                }
12878                Keyword::INT => {
12879                    let optional_precision = self.parse_optional_precision();
12880                    if self.parse_keyword(Keyword::UNSIGNED) {
12881                        Ok(DataType::IntUnsigned(optional_precision?))
12882                    } else {
12883                        if dialect.supports_data_type_signed_suffix() {
12884                            let _ = self.parse_keyword(Keyword::SIGNED);
12885                        }
12886                        Ok(DataType::Int(optional_precision?))
12887                    }
12888                }
12889                Keyword::INT4 => {
12890                    let optional_precision = self.parse_optional_precision();
12891                    if self.parse_keyword(Keyword::UNSIGNED) {
12892                        Ok(DataType::Int4Unsigned(optional_precision?))
12893                    } else {
12894                        Ok(DataType::Int4(optional_precision?))
12895                    }
12896                }
12897                Keyword::INT8 => {
12898                    let optional_precision = self.parse_optional_precision();
12899                    if self.parse_keyword(Keyword::UNSIGNED) {
12900                        Ok(DataType::Int8Unsigned(optional_precision?))
12901                    } else {
12902                        Ok(DataType::Int8(optional_precision?))
12903                    }
12904                }
12905                Keyword::INT16 => Ok(DataType::Int16),
12906                Keyword::INT32 => Ok(DataType::Int32),
12907                Keyword::INT64 => Ok(DataType::Int64),
12908                Keyword::INT128 => Ok(DataType::Int128),
12909                Keyword::INT256 => Ok(DataType::Int256),
12910                Keyword::INTEGER => {
12911                    let optional_precision = self.parse_optional_precision();
12912                    if self.parse_keyword(Keyword::UNSIGNED) {
12913                        Ok(DataType::IntegerUnsigned(optional_precision?))
12914                    } else {
12915                        if dialect.supports_data_type_signed_suffix() {
12916                            let _ = self.parse_keyword(Keyword::SIGNED);
12917                        }
12918                        Ok(DataType::Integer(optional_precision?))
12919                    }
12920                }
12921                Keyword::BIGINT => {
12922                    let optional_precision = self.parse_optional_precision();
12923                    if self.parse_keyword(Keyword::UNSIGNED) {
12924                        Ok(DataType::BigIntUnsigned(optional_precision?))
12925                    } else {
12926                        if dialect.supports_data_type_signed_suffix() {
12927                            let _ = self.parse_keyword(Keyword::SIGNED);
12928                        }
12929                        Ok(DataType::BigInt(optional_precision?))
12930                    }
12931                }
12932                Keyword::HUGEINT => Ok(DataType::HugeInt),
12933                Keyword::UBIGINT => Ok(DataType::UBigInt),
12934                Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12935                Keyword::USMALLINT => Ok(DataType::USmallInt),
12936                Keyword::UTINYINT => Ok(DataType::UTinyInt),
12937                Keyword::UINT8 => Ok(DataType::UInt8),
12938                Keyword::UINT16 => Ok(DataType::UInt16),
12939                Keyword::UINT32 => Ok(DataType::UInt32),
12940                Keyword::UINT64 => Ok(DataType::UInt64),
12941                Keyword::UINT128 => Ok(DataType::UInt128),
12942                Keyword::UINT256 => Ok(DataType::UInt256),
12943                Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12944                Keyword::NVARCHAR => {
12945                    Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12946                }
12947                Keyword::CHARACTER => {
12948                    if self.parse_keyword(Keyword::VARYING) {
12949                        Ok(DataType::CharacterVarying(
12950                            self.parse_optional_character_length()?,
12951                        ))
12952                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12953                        Ok(DataType::CharacterLargeObject(
12954                            self.parse_optional_precision()?,
12955                        ))
12956                    } else {
12957                        Ok(DataType::Character(self.parse_optional_character_length()?))
12958                    }
12959                }
12960                Keyword::CHAR => {
12961                    if self.parse_keyword(Keyword::VARYING) {
12962                        Ok(DataType::CharVarying(
12963                            self.parse_optional_character_length()?,
12964                        ))
12965                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12966                        Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12967                    } else {
12968                        Ok(DataType::Char(self.parse_optional_character_length()?))
12969                    }
12970                }
12971                Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12972                Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12973                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12974                Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12975                Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12976                Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12977                Keyword::LONGBLOB => Ok(DataType::LongBlob),
12978                Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12979                    Ok(DataType::BigInt(None))
12980                }
12981                Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12982                Keyword::BIT => {
12983                    if self.parse_keyword(Keyword::VARYING) {
12984                        Ok(DataType::BitVarying(self.parse_optional_precision()?))
12985                    } else {
12986                        Ok(DataType::Bit(self.parse_optional_precision()?))
12987                    }
12988                }
12989                Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12990                Keyword::UUID => Ok(DataType::Uuid),
12991                Keyword::DATE => Ok(DataType::Date),
12992                Keyword::DATE32 => Ok(DataType::Date32),
12993                Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12994                Keyword::DATETIME64 => {
12995                    self.prev_token();
12996                    let (precision, time_zone) = self.parse_datetime_64()?;
12997                    Ok(DataType::Datetime64(precision, time_zone))
12998                }
12999                Keyword::TIMESTAMP => {
13000                    let precision = self.parse_optional_precision()?;
13001                    let tz = if self.parse_keyword(Keyword::WITH) {
13002                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13003                        TimezoneInfo::WithTimeZone
13004                    } else if self.parse_keyword(Keyword::WITHOUT) {
13005                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13006                        TimezoneInfo::WithoutTimeZone
13007                    } else {
13008                        TimezoneInfo::None
13009                    };
13010                    Ok(DataType::Timestamp(precision, tz))
13011                }
13012                Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
13013                    self.parse_optional_precision()?,
13014                    TimezoneInfo::Tz,
13015                )),
13016                Keyword::TIMESTAMP_NTZ => {
13017                    Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
13018                }
13019                Keyword::TIME => {
13020                    let precision = self.parse_optional_precision()?;
13021                    let tz = if self.parse_keyword(Keyword::WITH) {
13022                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13023                        TimezoneInfo::WithTimeZone
13024                    } else if self.parse_keyword(Keyword::WITHOUT) {
13025                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13026                        TimezoneInfo::WithoutTimeZone
13027                    } else {
13028                        TimezoneInfo::None
13029                    };
13030                    Ok(DataType::Time(precision, tz))
13031                }
13032                Keyword::TIMETZ => Ok(DataType::Time(
13033                    self.parse_optional_precision()?,
13034                    TimezoneInfo::Tz,
13035                )),
13036                Keyword::INTERVAL => {
13037                    if self.dialect.supports_interval_options() {
13038                        let fields = self.maybe_parse_optional_interval_fields()?;
13039                        let precision = self.parse_optional_precision()?;
13040                        Ok(DataType::Interval { fields, precision })
13041                    } else {
13042                        Ok(DataType::Interval {
13043                            fields: None,
13044                            precision: None,
13045                        })
13046                    }
13047                }
13048                Keyword::JSON => Ok(DataType::JSON),
13049                Keyword::JSONB => Ok(DataType::JSONB),
13050                Keyword::REGCLASS => Ok(DataType::Regclass),
13051                Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
13052                Keyword::FIXEDSTRING => {
13053                    self.expect_token(&Token::LParen)?;
13054                    let character_length = self.parse_literal_uint()?;
13055                    self.expect_token(&Token::RParen)?;
13056                    Ok(DataType::FixedString(character_length))
13057                }
13058                Keyword::TEXT => {
13059                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13060                        Ok(DataType::Custom(
13061                            ObjectName::from(vec![Ident::new("TEXT")]),
13062                            modifiers,
13063                        ))
13064                    } else {
13065                        Ok(DataType::Text)
13066                    }
13067                }
13068                Keyword::TINYTEXT => Ok(DataType::TinyText),
13069                Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
13070                Keyword::LONGTEXT => Ok(DataType::LongText),
13071                Keyword::BYTEA => Ok(DataType::Bytea),
13072                Keyword::NUMERIC => Ok(DataType::Numeric(
13073                    self.parse_exact_number_optional_precision_scale()?,
13074                )),
13075                Keyword::DECIMAL => {
13076                    let precision = self.parse_exact_number_optional_precision_scale()?;
13077
13078                    if self.parse_keyword(Keyword::UNSIGNED) {
13079                        Ok(DataType::DecimalUnsigned(precision))
13080                    } else {
13081                        Ok(DataType::Decimal(precision))
13082                    }
13083                }
13084                Keyword::DEC => {
13085                    let precision = self.parse_exact_number_optional_precision_scale()?;
13086
13087                    if self.parse_keyword(Keyword::UNSIGNED) {
13088                        Ok(DataType::DecUnsigned(precision))
13089                    } else {
13090                        Ok(DataType::Dec(precision))
13091                    }
13092                }
13093                Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
13094                    self.parse_exact_number_optional_precision_scale()?,
13095                )),
13096                Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
13097                    self.parse_exact_number_optional_precision_scale()?,
13098                )),
13099                Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
13100                Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
13101                Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
13102                Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
13103                Keyword::ARRAY => {
13104                    if self.dialect.supports_array_typedef_without_element_type() {
13105                        Ok(DataType::Array(ArrayElemTypeDef::None))
13106                    } else if dialect_of!(self is ClickHouseDialect) {
13107                        Ok(self.parse_sub_type(|internal_type| {
13108                            DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
13109                        })?)
13110                    } else {
13111                        self.expect_token(&Token::Lt)?;
13112                        let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
13113                        trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13114                        Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
13115                            inside_type,
13116                        ))))
13117                    }
13118                }
13119                Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
13120                    self.prev_token();
13121                    let field_defs = self.parse_duckdb_struct_type_def()?;
13122                    Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
13123                }
13124                Keyword::STRUCT if self.dialect.supports_struct_literal() => {
13125                    self.prev_token();
13126                    let (field_defs, _trailing_bracket) =
13127                        self.parse_struct_type_def(Self::parse_struct_field_def)?;
13128                    trailing_bracket = _trailing_bracket;
13129                    Ok(DataType::Struct(
13130                        field_defs,
13131                        StructBracketKind::AngleBrackets,
13132                    ))
13133                }
13134                Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
13135                    self.prev_token();
13136                    let fields = self.parse_union_type_def()?;
13137                    Ok(DataType::Union(fields))
13138                }
13139                Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13140                    Ok(self.parse_sub_type(DataType::Nullable)?)
13141                }
13142                Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13143                    Ok(self.parse_sub_type(DataType::LowCardinality)?)
13144                }
13145                Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
13146                    self.expect_token(&Token::Lt)?;
13147                    let key_data_type = self.parse_data_type()?;
13148                    self.expect_token(&Token::Comma)?;
13149                    let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
13150                    trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13151                    Ok(DataType::Map(
13152                        Box::new(key_data_type),
13153                        Box::new(value_data_type),
13154                        MapBracketKind::AngleBrackets,
13155                    ))
13156                }
13157                Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13158                    self.prev_token();
13159                    let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
13160                    Ok(DataType::Map(
13161                        Box::new(key_data_type),
13162                        Box::new(value_data_type),
13163                        MapBracketKind::Parentheses,
13164                    ))
13165                }
13166                Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13167                    self.expect_token(&Token::LParen)?;
13168                    let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
13169                    self.expect_token(&Token::RParen)?;
13170                    Ok(DataType::Nested(field_defs))
13171                }
13172                Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13173                    self.prev_token();
13174                    let field_defs = self.parse_click_house_tuple_def()?;
13175                    Ok(DataType::Tuple(field_defs))
13176                }
13177                Keyword::TRIGGER => Ok(DataType::Trigger),
13178                Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
13179                    let _ = self.parse_keyword(Keyword::TYPE);
13180                    Ok(DataType::AnyType)
13181                }
13182                Keyword::TABLE => {
13183                    // an LParen after the TABLE keyword indicates that table columns are being defined
13184                    // whereas no LParen indicates an anonymous table expression will be returned
13185                    if self.peek_token_ref().token == Token::LParen {
13186                        let columns = self.parse_returns_table_columns()?;
13187                        Ok(DataType::Table(Some(columns)))
13188                    } else {
13189                        Ok(DataType::Table(None))
13190                    }
13191                }
13192                Keyword::SIGNED => {
13193                    if self.parse_keyword(Keyword::INTEGER) {
13194                        Ok(DataType::SignedInteger)
13195                    } else {
13196                        Ok(DataType::Signed)
13197                    }
13198                }
13199                Keyword::UNSIGNED => {
13200                    if self.parse_keyword(Keyword::INTEGER) {
13201                        Ok(DataType::UnsignedInteger)
13202                    } else {
13203                        Ok(DataType::Unsigned)
13204                    }
13205                }
13206                Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13207                    Ok(DataType::TsVector)
13208                }
13209                Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13210                    Ok(DataType::TsQuery)
13211                }
13212                _ => {
13213                    self.prev_token();
13214                    let type_name = self.parse_object_name(false)?;
13215                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13216                        Ok(DataType::Custom(type_name, modifiers))
13217                    } else {
13218                        Ok(DataType::Custom(type_name, vec![]))
13219                    }
13220                }
13221            },
13222            _ => self.expected_at("a data type name", next_token_index),
13223        }?;
13224
13225        if self.dialect.supports_array_typedef_with_brackets() {
13226            while self.consume_token(&Token::LBracket) {
13227                // Parse optional array data type size
13228                let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13229                self.expect_token(&Token::RBracket)?;
13230                data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
13231            }
13232        }
13233
13234        // Type-qualified array, e.g. `INT ARRAY` or `INT ARRAY[3]`. One-dimensional
13235        // with a single optional size. The `ARRAY` keyword is unambiguous everywhere.
13236        if self.parse_keyword(Keyword::ARRAY) {
13237            let size = if self.consume_token(&Token::LBracket) {
13238                let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13239                self.expect_token(&Token::RBracket)?;
13240                size
13241            } else {
13242                None
13243            };
13244            data = DataType::Array(ArrayElemTypeDef::Qualified(Box::new(data), size));
13245        }
13246
13247        Ok((data, trailing_bracket))
13248    }
13249
13250    fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
13251        self.parse_column_def()
13252    }
13253
13254    fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
13255        self.expect_token(&Token::LParen)?;
13256        let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
13257        self.expect_token(&Token::RParen)?;
13258        Ok(columns)
13259    }
13260
13261    /// Parse a parenthesized, comma-separated list of single-quoted strings.
13262    pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
13263        self.expect_token(&Token::LParen)?;
13264        let mut values = Vec::new();
13265        loop {
13266            let next_token = self.next_token();
13267            match next_token.token {
13268                Token::SingleQuotedString(value) => values.push(value),
13269                _ => self.expected("a string", next_token)?,
13270            }
13271            let next_token = self.next_token();
13272            match next_token.token {
13273                Token::Comma => (),
13274                Token::RParen => break,
13275                _ => self.expected(", or }", next_token)?,
13276            }
13277        }
13278        Ok(values)
13279    }
13280
13281    /// Strictly parse `identifier AS identifier`
13282    pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13283        let ident = self.parse_identifier()?;
13284        self.expect_keyword_is(Keyword::AS)?;
13285        let alias = self.parse_identifier()?;
13286        Ok(IdentWithAlias { ident, alias })
13287    }
13288
13289    /// Parse `identifier [AS] identifier` where the AS keyword is optional
13290    fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13291        let ident = self.parse_identifier()?;
13292        let _after_as = self.parse_keyword(Keyword::AS);
13293        let alias = self.parse_identifier()?;
13294        Ok(IdentWithAlias { ident, alias })
13295    }
13296
13297    /// Parse comma-separated list of parenthesized queries for pipe operators
13298    fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
13299        self.parse_comma_separated(|parser| {
13300            parser.expect_token(&Token::LParen)?;
13301            let query = parser.parse_query()?;
13302            parser.expect_token(&Token::RParen)?;
13303            Ok(*query)
13304        })
13305    }
13306
13307    /// Parse set quantifier for pipe operators that require DISTINCT. E.g. INTERSECT and EXCEPT
13308    fn parse_distinct_required_set_quantifier(
13309        &mut self,
13310        operator_name: &str,
13311    ) -> Result<SetQuantifier, ParserError> {
13312        let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
13313        match quantifier {
13314            SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
13315            _ => Err(ParserError::ParserError(format!(
13316                "{operator_name} pipe operator requires DISTINCT modifier",
13317            ))),
13318        }
13319    }
13320
13321    /// Parse optional identifier alias (with or without AS keyword)
13322    fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13323        if self.parse_keyword(Keyword::AS) {
13324            Ok(Some(self.parse_identifier()?))
13325        } else {
13326            // Check if the next token is an identifier (implicit alias)
13327            self.maybe_parse(|parser| parser.parse_identifier())
13328        }
13329    }
13330
13331    /// Optionally parses an alias for a select list item
13332    fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13333        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13334            parser.dialect.is_select_item_alias(explicit, kw, parser)
13335        }
13336        self.parse_optional_alias_inner(None, validator)
13337    }
13338
13339    /// Optionally parses an alias for a table like in `... FROM generate_series(1, 10) AS t (col)`.
13340    /// In this case, the alias is allowed to optionally name the columns in the table, in
13341    /// addition to the table itself.
13342    pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
13343        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13344            parser.dialect.is_table_factor_alias(explicit, kw, parser)
13345        }
13346        let explicit = self.peek_keyword(Keyword::AS);
13347        match self.parse_optional_alias_inner(None, validator)? {
13348            Some(name) => {
13349                let columns = self.parse_table_alias_column_defs()?;
13350                let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
13351                    Some(self.parse_identifier()?)
13352                } else {
13353                    None
13354                };
13355                Ok(Some(TableAlias {
13356                    explicit,
13357                    name,
13358                    columns,
13359                    at,
13360                }))
13361            }
13362            None => Ok(None),
13363        }
13364    }
13365
13366    fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
13367        let mut hints = vec![];
13368        while let Some(hint_type) =
13369            self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
13370        {
13371            let hint_type = match hint_type {
13372                Keyword::USE => TableIndexHintType::Use,
13373                Keyword::IGNORE => TableIndexHintType::Ignore,
13374                Keyword::FORCE => TableIndexHintType::Force,
13375                _ => {
13376                    return self.expected_ref(
13377                        "expected to match USE/IGNORE/FORCE keyword",
13378                        self.peek_token_ref(),
13379                    )
13380                }
13381            };
13382            let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13383                Some(Keyword::INDEX) => TableIndexType::Index,
13384                Some(Keyword::KEY) => TableIndexType::Key,
13385                _ => {
13386                    return self
13387                        .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13388                }
13389            };
13390            let for_clause = if self.parse_keyword(Keyword::FOR) {
13391                let clause = if self.parse_keyword(Keyword::JOIN) {
13392                    TableIndexHintForClause::Join
13393                } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13394                    TableIndexHintForClause::OrderBy
13395                } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13396                    TableIndexHintForClause::GroupBy
13397                } else {
13398                    return self.expected_ref(
13399                        "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13400                        self.peek_token_ref(),
13401                    );
13402                };
13403                Some(clause)
13404            } else {
13405                None
13406            };
13407
13408            self.expect_token(&Token::LParen)?;
13409            let index_names = if self.peek_token_ref().token != Token::RParen {
13410                self.parse_comma_separated(Parser::parse_identifier)?
13411            } else {
13412                vec![]
13413            };
13414            self.expect_token(&Token::RParen)?;
13415            hints.push(TableIndexHints {
13416                hint_type,
13417                index_type,
13418                for_clause,
13419                index_names,
13420            });
13421        }
13422        Ok(hints)
13423    }
13424
13425    /// Wrapper for parse_optional_alias_inner, left for backwards-compatibility
13426    /// but new flows should use the context-specific methods such as `maybe_parse_select_item_alias`
13427    /// and `maybe_parse_table_alias`.
13428    pub fn parse_optional_alias(
13429        &mut self,
13430        reserved_kwds: &[Keyword],
13431    ) -> Result<Option<Ident>, ParserError> {
13432        fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13433            false
13434        }
13435        self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13436    }
13437
13438    /// Parses an optional alias after a SQL element such as a select list item
13439    /// or a table name.
13440    ///
13441    /// This method accepts an optional list of reserved keywords or a function
13442    /// to call to validate if a keyword should be parsed as an alias, to allow
13443    /// callers to customize the parsing logic based on their context.
13444    fn parse_optional_alias_inner<F>(
13445        &mut self,
13446        reserved_kwds: Option<&[Keyword]>,
13447        validator: F,
13448    ) -> Result<Option<Ident>, ParserError>
13449    where
13450        F: Fn(bool, &Keyword, &mut Parser) -> bool,
13451    {
13452        let after_as = self.parse_keyword(Keyword::AS);
13453
13454        let next_token = self.next_token();
13455        match next_token.token {
13456            // Accepts a keyword as an alias if the AS keyword explicitly indicate an alias or if the
13457            // caller provided a list of reserved keywords and the keyword is not on that list.
13458            Token::Word(w)
13459                if reserved_kwds.is_some()
13460                    && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13461            {
13462                Ok(Some(w.into_ident(next_token.span)))
13463            }
13464            // Accepts a keyword as alias based on the caller's context, such as to what SQL element
13465            // this word is a potential alias of using the validator call-back. This allows for
13466            // dialect-specific logic.
13467            Token::Word(w) if validator(after_as, &w.keyword, self) => {
13468                Ok(Some(w.into_ident(next_token.span)))
13469            }
13470            // For backwards-compatibility, we accept quoted strings as aliases regardless of the context.
13471            Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13472            Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13473            _ => {
13474                if after_as {
13475                    return self.expected("an identifier after AS", next_token);
13476                }
13477                self.prev_token();
13478                Ok(None) // no alias found
13479            }
13480        }
13481    }
13482
13483    /// Parse an optional `GROUP BY` clause, returning `Some(GroupByExpr)` when present.
13484    pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13485        if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13486            let expressions = if self.parse_keyword(Keyword::ALL) {
13487                None
13488            } else {
13489                Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13490            };
13491
13492            let mut modifiers = vec![];
13493            if self.dialect.supports_group_by_with_modifier() {
13494                loop {
13495                    if !self.parse_keyword(Keyword::WITH) {
13496                        break;
13497                    }
13498                    let keyword = self.expect_one_of_keywords(&[
13499                        Keyword::ROLLUP,
13500                        Keyword::CUBE,
13501                        Keyword::TOTALS,
13502                    ])?;
13503                    modifiers.push(match keyword {
13504                        Keyword::ROLLUP => GroupByWithModifier::Rollup,
13505                        Keyword::CUBE => GroupByWithModifier::Cube,
13506                        Keyword::TOTALS => GroupByWithModifier::Totals,
13507                        _ => {
13508                            return parser_err!(
13509                                "BUG: expected to match GroupBy modifier keyword",
13510                                self.peek_token_ref().span.start
13511                            )
13512                        }
13513                    });
13514                }
13515            }
13516            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13517                self.expect_token(&Token::LParen)?;
13518                let result = self.parse_comma_separated(|p| {
13519                    if p.peek_token_ref().token == Token::LParen {
13520                        p.parse_tuple(true, true)
13521                    } else {
13522                        Ok(vec![p.parse_expr()?])
13523                    }
13524                })?;
13525                self.expect_token(&Token::RParen)?;
13526                modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13527                    result,
13528                )));
13529            };
13530            let group_by = match expressions {
13531                None => GroupByExpr::All(modifiers),
13532                Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13533            };
13534            Ok(Some(group_by))
13535        } else {
13536            Ok(None)
13537        }
13538    }
13539
13540    /// Parse an optional `ORDER BY` clause, returning `Some(OrderBy)` when present.
13541    pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13542        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13543            let order_by =
13544                if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13545                    let order_by_options = self.parse_order_by_options()?;
13546                    OrderBy {
13547                        kind: OrderByKind::All(order_by_options),
13548                        interpolate: None,
13549                    }
13550                } else {
13551                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13552                    let interpolate = if self.dialect.supports_interpolate() {
13553                        self.parse_interpolations()?
13554                    } else {
13555                        None
13556                    };
13557                    OrderBy {
13558                        kind: OrderByKind::Expressions(exprs),
13559                        interpolate,
13560                    }
13561                };
13562            Ok(Some(order_by))
13563        } else {
13564            Ok(None)
13565        }
13566    }
13567
13568    fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13569        let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13570            Some(self.parse_offset()?)
13571        } else {
13572            None
13573        };
13574
13575        let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13576            let expr = self.parse_limit()?;
13577
13578            if self.dialect.supports_limit_comma()
13579                && offset.is_none()
13580                && expr.is_some() // ALL not supported with comma
13581                && self.consume_token(&Token::Comma)
13582            {
13583                let offset = expr.ok_or_else(|| {
13584                    ParserError::ParserError(
13585                        "Missing offset for LIMIT <offset>, <limit>".to_string(),
13586                    )
13587                })?;
13588                return Ok(Some(LimitClause::OffsetCommaLimit {
13589                    offset,
13590                    limit: self.parse_expr()?,
13591                }));
13592            }
13593
13594            let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13595                Some(self.parse_comma_separated(Parser::parse_expr)?)
13596            } else {
13597                None
13598            };
13599
13600            (Some(expr), limit_by)
13601        } else {
13602            (None, None)
13603        };
13604
13605        if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13606            offset = Some(self.parse_offset()?);
13607        }
13608
13609        if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13610            Ok(Some(LimitClause::LimitOffset {
13611                limit: limit.unwrap_or_default(),
13612                offset,
13613                limit_by: limit_by.unwrap_or_default(),
13614            }))
13615        } else {
13616            Ok(None)
13617        }
13618    }
13619
13620    /// Parse a table object for insertion
13621    /// e.g. `some_database.some_table` or `FUNCTION some_table_func(...)`
13622    pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13623        if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13624            let fn_name = self.parse_object_name(false)?;
13625            self.parse_function_call(fn_name)
13626                .map(TableObject::TableFunction)
13627        } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13628            self.parse_parenthesized(|p| p.parse_query())
13629                .map(TableObject::TableQuery)
13630        } else {
13631            self.parse_object_name(false).map(TableObject::TableName)
13632        }
13633    }
13634
13635    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13636    /// `foo` or `myschema."table"
13637    ///
13638    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13639    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13640    /// in this context on BigQuery.
13641    pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13642        self.parse_object_name_inner(in_table_clause, false)
13643    }
13644
13645    /// Parse a possibly qualified, possibly quoted identifier, e.g.
13646    /// `foo` or `myschema."table"
13647    ///
13648    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
13649    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
13650    /// in this context on BigQuery.
13651    ///
13652    /// The `allow_wildcards` parameter indicates whether to allow for wildcards in the object name
13653    /// e.g. *, *.*, `foo`.*, or "foo"."bar"
13654    fn parse_object_name_inner(
13655        &mut self,
13656        in_table_clause: bool,
13657        allow_wildcards: bool,
13658    ) -> Result<ObjectName, ParserError> {
13659        let mut parts = vec![];
13660        if dialect_of!(self is BigQueryDialect) && in_table_clause {
13661            loop {
13662                let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13663                parts.push(ObjectNamePart::Identifier(ident));
13664                if !self.consume_token(&Token::Period) && !end_with_period {
13665                    break;
13666                }
13667            }
13668        } else {
13669            loop {
13670                if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13671                    let span = self.next_token().span;
13672                    parts.push(ObjectNamePart::Identifier(Ident {
13673                        value: Token::Mul.to_string(),
13674                        quote_style: None,
13675                        span,
13676                    }));
13677                } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13678                    let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13679                    parts.push(ObjectNamePart::Identifier(ident));
13680                    if !self.consume_token(&Token::Period) && !end_with_period {
13681                        break;
13682                    }
13683                } else if self.dialect.supports_object_name_double_dot_notation()
13684                    && parts.len() == 1
13685                    && matches!(self.peek_token_ref().token, Token::Period)
13686                {
13687                    // Empty string here means default schema
13688                    parts.push(ObjectNamePart::Identifier(Ident::new("")));
13689                } else {
13690                    let ident = self.parse_identifier()?;
13691                    let part = if self
13692                        .dialect
13693                        .is_identifier_generating_function_name(&ident, &parts)
13694                    {
13695                        self.expect_token(&Token::LParen)?;
13696                        let args: Vec<FunctionArg> =
13697                            self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13698                        self.expect_token(&Token::RParen)?;
13699                        ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13700                    } else {
13701                        ObjectNamePart::Identifier(ident)
13702                    };
13703                    parts.push(part);
13704                }
13705
13706                if !self.consume_token(&Token::Period) {
13707                    break;
13708                }
13709            }
13710        }
13711
13712        // BigQuery accepts any number of quoted identifiers of a table name.
13713        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
13714        if dialect_of!(self is BigQueryDialect)
13715            && parts.iter().any(|part| {
13716                part.as_ident()
13717                    .is_some_and(|ident| ident.value.contains('.'))
13718            })
13719        {
13720            parts = parts
13721                .into_iter()
13722                .flat_map(|part| match part.as_ident() {
13723                    Some(ident) => ident
13724                        .value
13725                        .split('.')
13726                        .map(|value| {
13727                            ObjectNamePart::Identifier(Ident {
13728                                value: value.into(),
13729                                quote_style: ident.quote_style,
13730                                span: ident.span,
13731                            })
13732                        })
13733                        .collect::<Vec<_>>(),
13734                    None => vec![part],
13735                })
13736                .collect()
13737        }
13738
13739        Ok(ObjectName(parts))
13740    }
13741
13742    /// Parse identifiers
13743    pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13744        let mut idents = vec![];
13745        loop {
13746            let token = self.peek_token_ref();
13747            match &token.token {
13748                Token::Word(w) => {
13749                    idents.push(w.to_ident(token.span));
13750                }
13751                Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13752                    break
13753                }
13754                _ => {}
13755            }
13756            self.advance_token();
13757        }
13758        Ok(idents)
13759    }
13760
13761    /// Parse identifiers of form ident1[.identN]*
13762    ///
13763    /// Similar in functionality to [parse_identifiers], with difference
13764    /// being this function is much more strict about parsing a valid multipart identifier, not
13765    /// allowing extraneous tokens to be parsed, otherwise it fails.
13766    ///
13767    /// For example:
13768    ///
13769    /// ```rust
13770    /// use sqlparser::ast::Ident;
13771    /// use sqlparser::dialect::GenericDialect;
13772    /// use sqlparser::parser::Parser;
13773    ///
13774    /// let dialect = GenericDialect {};
13775    /// let expected = vec![Ident::new("one"), Ident::new("two")];
13776    ///
13777    /// // expected usage
13778    /// let sql = "one.two";
13779    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13780    /// let actual = parser.parse_multipart_identifier().unwrap();
13781    /// assert_eq!(&actual, &expected);
13782    ///
13783    /// // parse_identifiers is more loose on what it allows, parsing successfully
13784    /// let sql = "one + two";
13785    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13786    /// let actual = parser.parse_identifiers().unwrap();
13787    /// assert_eq!(&actual, &expected);
13788    ///
13789    /// // expected to strictly fail due to + separator
13790    /// let sql = "one + two";
13791    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
13792    /// let actual = parser.parse_multipart_identifier().unwrap_err();
13793    /// assert_eq!(
13794    ///     actual.to_string(),
13795    ///     "sql parser error: Unexpected token in identifier: +"
13796    /// );
13797    /// ```
13798    ///
13799    /// [parse_identifiers]: Parser::parse_identifiers
13800    pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13801        let mut idents = vec![];
13802
13803        // expecting at least one word for identifier
13804        let next_token = self.next_token();
13805        match next_token.token {
13806            Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13807            Token::EOF => {
13808                return Err(ParserError::ParserError(
13809                    "Empty input when parsing identifier".to_string(),
13810                ))?
13811            }
13812            token => {
13813                return Err(ParserError::ParserError(format!(
13814                    "Unexpected token in identifier: {token}"
13815                )))?
13816            }
13817        };
13818
13819        // parse optional next parts if exist
13820        loop {
13821            match self.next_token().token {
13822                // ensure that optional period is succeeded by another identifier
13823                Token::Period => {
13824                    let next_token = self.next_token();
13825                    match next_token.token {
13826                        Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13827                        Token::EOF => {
13828                            return Err(ParserError::ParserError(
13829                                "Trailing period in identifier".to_string(),
13830                            ))?
13831                        }
13832                        token => {
13833                            return Err(ParserError::ParserError(format!(
13834                                "Unexpected token following period in identifier: {token}"
13835                            )))?
13836                        }
13837                    }
13838                }
13839                Token::EOF => break,
13840                token => {
13841                    Err(ParserError::ParserError(format!(
13842                        "Unexpected token in identifier: {token}"
13843                    )))?;
13844                }
13845            }
13846        }
13847
13848        Ok(idents)
13849    }
13850
13851    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
13852    pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13853        let next_token = self.next_token();
13854        match next_token.token {
13855            Token::Word(w) => Ok(w.into_ident(next_token.span)),
13856            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13857            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13858            _ => self.expected("identifier", next_token),
13859        }
13860    }
13861
13862    /// On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
13863    /// TABLE clause.
13864    ///
13865    /// The first segment must be an ordinary unquoted identifier, e.g. it must not start
13866    /// with a digit. Subsequent segments are either must either be valid identifiers or
13867    /// integers, e.g. foo-123 is allowed, but foo-123a is not.
13868    ///
13869    /// [BigQuery-lexical](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical)
13870    ///
13871    /// Return a tuple of the identifier and a boolean indicating it ends with a period.
13872    fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13873        match self.peek_token().token {
13874            Token::Word(w) => {
13875                let quote_style_is_none = w.quote_style.is_none();
13876                let mut requires_whitespace = false;
13877                let mut ident = w.into_ident(self.next_token().span);
13878                if quote_style_is_none {
13879                    while matches!(self.peek_token_no_skip().token, Token::Minus) {
13880                        self.next_token();
13881                        ident.value.push('-');
13882
13883                        let token = self
13884                            .next_token_no_skip()
13885                            .cloned()
13886                            .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13887                        requires_whitespace = match token.token {
13888                            Token::Word(next_word) if next_word.quote_style.is_none() => {
13889                                ident.value.push_str(&next_word.value);
13890                                false
13891                            }
13892                            Token::Number(s, false) => {
13893                                // A number token can represent a decimal value ending with a period, e.g., `Number('123.')`.
13894                                // However, for an [ObjectName], it is part of a hyphenated identifier, e.g., `foo-123.bar`.
13895                                //
13896                                // If a number token is followed by a period, it is part of an [ObjectName].
13897                                // Return the identifier with `true` if the number token is followed by a period, indicating that
13898                                // parsing should continue for the next part of the hyphenated identifier.
13899                                if s.ends_with('.') {
13900                                    let Some(s) = s.split('.').next().filter(|s| {
13901                                        !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13902                                    }) else {
13903                                        return self.expected(
13904                                            "continuation of hyphenated identifier",
13905                                            TokenWithSpan::new(Token::Number(s, false), token.span),
13906                                        );
13907                                    };
13908                                    ident.value.push_str(s);
13909                                    return Ok((ident, true));
13910                                } else {
13911                                    ident.value.push_str(&s);
13912                                }
13913                                // If next token is period, then it is part of an ObjectName and we don't expect whitespace
13914                                // after the number.
13915                                !matches!(self.peek_token_ref().token, Token::Period)
13916                            }
13917                            _ => {
13918                                return self
13919                                    .expected("continuation of hyphenated identifier", token);
13920                            }
13921                        }
13922                    }
13923
13924                    // If the last segment was a number, we must check that it's followed by whitespace,
13925                    // otherwise foo-123a will be parsed as `foo-123` with the alias `a`.
13926                    if requires_whitespace {
13927                        let token = self.next_token();
13928                        if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13929                            return self
13930                                .expected("whitespace following hyphenated identifier", token);
13931                        }
13932                    }
13933                }
13934                Ok((ident, false))
13935            }
13936            _ => Ok((self.parse_identifier()?, false)),
13937        }
13938    }
13939
13940    /// Parses a parenthesized, comma-separated list of column definitions within a view.
13941    fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13942        if self.consume_token(&Token::LParen) {
13943            if self.peek_token_ref().token == Token::RParen {
13944                self.next_token();
13945                Ok(vec![])
13946            } else {
13947                let cols = self.parse_comma_separated_with_trailing_commas(
13948                    Parser::parse_view_column,
13949                    self.dialect.supports_column_definition_trailing_commas(),
13950                    Self::is_reserved_for_column_alias,
13951                )?;
13952                self.expect_token(&Token::RParen)?;
13953                Ok(cols)
13954            }
13955        } else {
13956            Ok(vec![])
13957        }
13958    }
13959
13960    /// Parses a column definition within a view.
13961    fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13962        let name = self.parse_identifier()?;
13963        let options = self.parse_view_column_options()?;
13964        let data_type = if dialect_of!(self is ClickHouseDialect) {
13965            Some(self.parse_data_type()?)
13966        } else {
13967            None
13968        };
13969        Ok(ViewColumnDef {
13970            name,
13971            data_type,
13972            options,
13973        })
13974    }
13975
13976    fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13977        let mut options = Vec::new();
13978        loop {
13979            let option = self.parse_optional_column_option()?;
13980            if let Some(option) = option {
13981                options.push(option);
13982            } else {
13983                break;
13984            }
13985        }
13986        if options.is_empty() {
13987            Ok(None)
13988        } else if self.dialect.supports_space_separated_column_options() {
13989            Ok(Some(ColumnOptions::SpaceSeparated(options)))
13990        } else {
13991            Ok(Some(ColumnOptions::CommaSeparated(options)))
13992        }
13993    }
13994
13995    /// Parses a parenthesized comma-separated list of unqualified, possibly quoted identifiers.
13996    /// For example: `(col1, "col 2", ...)`
13997    pub fn parse_parenthesized_column_list(
13998        &mut self,
13999        optional: IsOptional,
14000        allow_empty: bool,
14001    ) -> Result<Vec<Ident>, ParserError> {
14002        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
14003    }
14004
14005    /// Parse a parenthesized list of compound identifiers as expressions.
14006    pub fn parse_parenthesized_compound_identifier_list(
14007        &mut self,
14008        optional: IsOptional,
14009        allow_empty: bool,
14010    ) -> Result<Vec<Expr>, ParserError> {
14011        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14012            Ok(Expr::CompoundIdentifier(
14013                p.parse_period_separated(|p| p.parse_identifier())?,
14014            ))
14015        })
14016    }
14017
14018    /// Parses a parenthesized comma-separated list of index columns, which can be arbitrary
14019    /// expressions with ordering information (and an opclass in some dialects).
14020    fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
14021        self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
14022            p.parse_create_index_expr()
14023        })
14024    }
14025
14026    /// Parses a parenthesized comma-separated list of qualified, possibly quoted identifiers.
14027    /// For example: `(db1.sc1.tbl1.col1, db1.sc1.tbl1."col 2", ...)`
14028    pub fn parse_parenthesized_qualified_column_list(
14029        &mut self,
14030        optional: IsOptional,
14031        allow_empty: bool,
14032    ) -> Result<Vec<ObjectName>, ParserError> {
14033        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14034            p.parse_object_name(true)
14035        })
14036    }
14037
14038    /// Parses a parenthesized comma-separated list of columns using
14039    /// the provided function to parse each element.
14040    fn parse_parenthesized_column_list_inner<F, T>(
14041        &mut self,
14042        optional: IsOptional,
14043        allow_empty: bool,
14044        mut f: F,
14045    ) -> Result<Vec<T>, ParserError>
14046    where
14047        F: FnMut(&mut Parser) -> Result<T, ParserError>,
14048    {
14049        if self.consume_token(&Token::LParen) {
14050            if allow_empty && self.peek_token_ref().token == Token::RParen {
14051                self.next_token();
14052                Ok(vec![])
14053            } else {
14054                let cols = self.parse_comma_separated(|p| f(p))?;
14055                self.expect_token(&Token::RParen)?;
14056                Ok(cols)
14057            }
14058        } else if optional == Optional {
14059            Ok(vec![])
14060        } else {
14061            self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
14062        }
14063    }
14064
14065    /// Parses a parenthesized comma-separated list of table alias column definitions.
14066    fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
14067        if self.consume_token(&Token::LParen) {
14068            let cols = self.parse_comma_separated(|p| {
14069                let name = p.parse_identifier()?;
14070                let data_type = p.maybe_parse(|p| p.parse_data_type())?;
14071                Ok(TableAliasColumnDef { name, data_type })
14072            })?;
14073            self.expect_token(&Token::RParen)?;
14074            Ok(cols)
14075        } else {
14076            Ok(vec![])
14077        }
14078    }
14079
14080    /// Parse an unsigned precision value enclosed in parentheses, e.g. `(10)`.
14081    pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
14082        self.expect_token(&Token::LParen)?;
14083        let n = self.parse_literal_uint()?;
14084        self.expect_token(&Token::RParen)?;
14085        Ok(n)
14086    }
14087
14088    /// Parse an optional precision `(n)` and return it as `Some(n)` when present.
14089    pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
14090        if self.consume_token(&Token::LParen) {
14091            let n = self.parse_literal_uint()?;
14092            self.expect_token(&Token::RParen)?;
14093            Ok(Some(n))
14094        } else {
14095            Ok(None)
14096        }
14097    }
14098
14099    fn maybe_parse_optional_interval_fields(
14100        &mut self,
14101    ) -> Result<Option<IntervalFields>, ParserError> {
14102        match self.parse_one_of_keywords(&[
14103            // Can be followed by `TO` option
14104            Keyword::YEAR,
14105            Keyword::DAY,
14106            Keyword::HOUR,
14107            Keyword::MINUTE,
14108            // No `TO` option
14109            Keyword::MONTH,
14110            Keyword::SECOND,
14111        ]) {
14112            Some(Keyword::YEAR) => {
14113                if self.peek_keyword(Keyword::TO) {
14114                    self.expect_keyword(Keyword::TO)?;
14115                    self.expect_keyword(Keyword::MONTH)?;
14116                    Ok(Some(IntervalFields::YearToMonth))
14117                } else {
14118                    Ok(Some(IntervalFields::Year))
14119                }
14120            }
14121            Some(Keyword::DAY) => {
14122                if self.peek_keyword(Keyword::TO) {
14123                    self.expect_keyword(Keyword::TO)?;
14124                    match self.expect_one_of_keywords(&[
14125                        Keyword::HOUR,
14126                        Keyword::MINUTE,
14127                        Keyword::SECOND,
14128                    ])? {
14129                        Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
14130                        Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
14131                        Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
14132                        _ => {
14133                            self.prev_token();
14134                            self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
14135                        }
14136                    }
14137                } else {
14138                    Ok(Some(IntervalFields::Day))
14139                }
14140            }
14141            Some(Keyword::HOUR) => {
14142                if self.peek_keyword(Keyword::TO) {
14143                    self.expect_keyword(Keyword::TO)?;
14144                    match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
14145                        Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
14146                        Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
14147                        _ => {
14148                            self.prev_token();
14149                            self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
14150                        }
14151                    }
14152                } else {
14153                    Ok(Some(IntervalFields::Hour))
14154                }
14155            }
14156            Some(Keyword::MINUTE) => {
14157                if self.peek_keyword(Keyword::TO) {
14158                    self.expect_keyword(Keyword::TO)?;
14159                    self.expect_keyword(Keyword::SECOND)?;
14160                    Ok(Some(IntervalFields::MinuteToSecond))
14161                } else {
14162                    Ok(Some(IntervalFields::Minute))
14163                }
14164            }
14165            Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
14166            Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
14167            Some(_) => {
14168                self.prev_token();
14169                self.expected_ref(
14170                    "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
14171                    self.peek_token_ref(),
14172                )
14173            }
14174            None => Ok(None),
14175        }
14176    }
14177
14178    /// Parse datetime64 [1]
14179    /// Syntax
14180    /// ```sql
14181    /// DateTime64(precision[, timezone])
14182    /// ```
14183    ///
14184    /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/datetime64
14185    pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
14186        self.expect_keyword_is(Keyword::DATETIME64)?;
14187        self.expect_token(&Token::LParen)?;
14188        let precision = self.parse_literal_uint()?;
14189        let time_zone = if self.consume_token(&Token::Comma) {
14190            Some(self.parse_literal_string()?)
14191        } else {
14192            None
14193        };
14194        self.expect_token(&Token::RParen)?;
14195        Ok((precision, time_zone))
14196    }
14197
14198    /// Parse an optional character length specification `(n | MAX [CHARACTERS|OCTETS])`.
14199    pub fn parse_optional_character_length(
14200        &mut self,
14201    ) -> Result<Option<CharacterLength>, ParserError> {
14202        if self.consume_token(&Token::LParen) {
14203            let character_length = self.parse_character_length()?;
14204            self.expect_token(&Token::RParen)?;
14205            Ok(Some(character_length))
14206        } else {
14207            Ok(None)
14208        }
14209    }
14210
14211    /// Parse an optional binary length specification like `(n)`.
14212    pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
14213        if self.consume_token(&Token::LParen) {
14214            let binary_length = self.parse_binary_length()?;
14215            self.expect_token(&Token::RParen)?;
14216            Ok(Some(binary_length))
14217        } else {
14218            Ok(None)
14219        }
14220    }
14221
14222    /// Parse a character length, handling `MAX` or integer lengths with optional units.
14223    pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
14224        if self.parse_keyword(Keyword::MAX) {
14225            return Ok(CharacterLength::Max);
14226        }
14227        let length = self.parse_literal_uint()?;
14228        let unit = if self.parse_keyword(Keyword::CHARACTERS) {
14229            Some(CharLengthUnits::Characters)
14230        } else if self.parse_keyword(Keyword::OCTETS) {
14231            Some(CharLengthUnits::Octets)
14232        } else {
14233            None
14234        };
14235        Ok(CharacterLength::IntegerLength { length, unit })
14236    }
14237
14238    /// Parse a binary length specification, returning `BinaryLength`.
14239    pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
14240        if self.parse_keyword(Keyword::MAX) {
14241            return Ok(BinaryLength::Max);
14242        }
14243        let length = self.parse_literal_uint()?;
14244        Ok(BinaryLength::IntegerLength { length })
14245    }
14246
14247    /// Parse an optional `(precision[, scale])` and return `(Option<precision>, Option<scale>)`.
14248    pub fn parse_optional_precision_scale(
14249        &mut self,
14250    ) -> Result<(Option<u64>, Option<u64>), ParserError> {
14251        if self.consume_token(&Token::LParen) {
14252            let n = self.parse_literal_uint()?;
14253            let scale = if self.consume_token(&Token::Comma) {
14254                Some(self.parse_literal_uint()?)
14255            } else {
14256                None
14257            };
14258            self.expect_token(&Token::RParen)?;
14259            Ok((Some(n), scale))
14260        } else {
14261            Ok((None, None))
14262        }
14263    }
14264
14265    /// Parse exact-number precision/scale info like `(precision[, scale])` for decimal types.
14266    pub fn parse_exact_number_optional_precision_scale(
14267        &mut self,
14268    ) -> Result<ExactNumberInfo, ParserError> {
14269        if self.consume_token(&Token::LParen) {
14270            let precision = self.parse_literal_uint()?;
14271            let scale = if self.consume_token(&Token::Comma) {
14272                Some(self.parse_signed_integer()?)
14273            } else {
14274                None
14275            };
14276
14277            self.expect_token(&Token::RParen)?;
14278
14279            match scale {
14280                None => Ok(ExactNumberInfo::Precision(precision)),
14281                Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
14282            }
14283        } else {
14284            Ok(ExactNumberInfo::None)
14285        }
14286    }
14287
14288    /// Parse an optionally signed integer literal.
14289    fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
14290        let is_negative = self.consume_token(&Token::Minus);
14291
14292        if !is_negative {
14293            let _ = self.consume_token(&Token::Plus);
14294        }
14295
14296        let current_token = self.peek_token_ref();
14297        match &current_token.token {
14298            Token::Number(s, _) => {
14299                let s = s.clone();
14300                let span_start = current_token.span.start;
14301                self.advance_token();
14302                let value = Self::parse::<i64>(s, span_start)?;
14303                Ok(if is_negative { -value } else { value })
14304            }
14305            _ => self.expected_ref("number", current_token),
14306        }
14307    }
14308
14309    /// Parse optional type modifiers appearing in parentheses e.g. `(UNSIGNED, ZEROFILL)`.
14310    pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
14311        if self.consume_token(&Token::LParen) {
14312            let mut modifiers = Vec::new();
14313            loop {
14314                let next_token = self.next_token();
14315                match next_token.token {
14316                    Token::Word(w) => modifiers.push(w.to_string()),
14317                    Token::Number(n, _) => modifiers.push(n),
14318                    Token::SingleQuotedString(s) => modifiers.push(s),
14319
14320                    Token::Comma => {
14321                        continue;
14322                    }
14323                    Token::RParen => {
14324                        break;
14325                    }
14326                    _ => self.expected("type modifiers", next_token)?,
14327                }
14328            }
14329
14330            Ok(Some(modifiers))
14331        } else {
14332            Ok(None)
14333        }
14334    }
14335
14336    /// Parse a parenthesized sub data type
14337    fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
14338    where
14339        F: FnOnce(Box<DataType>) -> DataType,
14340    {
14341        self.expect_token(&Token::LParen)?;
14342        let inside_type = self.parse_data_type()?;
14343        self.expect_token(&Token::RParen)?;
14344        Ok(parent_type(inside_type.into()))
14345    }
14346
14347    /// Parse a DELETE statement, returning a `Box`ed SetExpr
14348    ///
14349    /// This is used to reduce the size of the stack frames in debug builds
14350    fn parse_delete_setexpr_boxed(
14351        &mut self,
14352        delete_token: TokenWithSpan,
14353    ) -> Result<Box<SetExpr>, ParserError> {
14354        Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
14355    }
14356
14357    /// Parse a `DELETE` statement and return `Statement::Delete`.
14358    pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
14359        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14360        let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
14361            // `FROM` keyword is optional in BigQuery SQL.
14362            // https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#delete_statement
14363            if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
14364                (vec![], false)
14365            } else {
14366                let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
14367                self.expect_keyword_is(Keyword::FROM)?;
14368                (tables, true)
14369            }
14370        } else {
14371            (vec![], true)
14372        };
14373
14374        let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14375
14376        let output = self.maybe_parse_output_clause()?;
14377
14378        let using = if self.parse_keyword(Keyword::USING) {
14379            Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14380        } else {
14381            None
14382        };
14383        let selection = if self.parse_keyword(Keyword::WHERE) {
14384            Some(self.parse_expr()?)
14385        } else {
14386            None
14387        };
14388        let returning = if self.parse_keyword(Keyword::RETURNING) {
14389            Some(self.parse_comma_separated(Parser::parse_select_item)?)
14390        } else {
14391            None
14392        };
14393        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14394            self.parse_comma_separated(Parser::parse_order_by_expr)?
14395        } else {
14396            vec![]
14397        };
14398        let limit = if self.parse_keyword(Keyword::LIMIT) {
14399            self.parse_limit()?
14400        } else {
14401            None
14402        };
14403
14404        Ok(Statement::Delete(Delete {
14405            delete_token: delete_token.into(),
14406            optimizer_hints,
14407            tables,
14408            from: if with_from_keyword {
14409                FromTable::WithFromKeyword(from)
14410            } else {
14411                FromTable::WithoutKeyword(from)
14412            },
14413            using,
14414            selection,
14415            returning,
14416            output,
14417            order_by,
14418            limit,
14419        }))
14420    }
14421
14422    /// Parse a `KILL` statement, optionally specifying `CONNECTION`, `QUERY`, or `MUTATION`.
14423    /// KILL [CONNECTION | QUERY | MUTATION] processlist_id
14424    pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14425        let modifier_keyword =
14426            self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14427
14428        let id = self.parse_literal_uint()?;
14429
14430        let modifier = match modifier_keyword {
14431            Some(Keyword::CONNECTION) => Some(KillType::Connection),
14432            Some(Keyword::QUERY) => Some(KillType::Query),
14433            Some(Keyword::MUTATION) => {
14434                if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14435                    Some(KillType::Mutation)
14436                } else {
14437                    self.expected_ref(
14438                        "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14439                        self.peek_token_ref(),
14440                    )?
14441                }
14442            }
14443            _ => None,
14444        };
14445
14446        Ok(Statement::Kill { modifier, id })
14447    }
14448
14449    /// Parse an `EXPLAIN` statement, handling dialect-specific options and modifiers.
14450    pub fn parse_explain(
14451        &mut self,
14452        describe_alias: DescribeAlias,
14453    ) -> Result<Statement, ParserError> {
14454        let mut analyze = false;
14455        let mut verbose = false;
14456        let mut query_plan = false;
14457        let mut estimate = false;
14458        let mut format = None;
14459        let mut options = None;
14460
14461        // Note: DuckDB is compatible with PostgreSQL syntax for this statement,
14462        // although not all features may be implemented.
14463        if describe_alias == DescribeAlias::Explain
14464            && self.dialect.supports_explain_with_utility_options()
14465            && self.peek_token_ref().token == Token::LParen
14466        {
14467            options = Some(self.parse_utility_options()?)
14468        } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14469            query_plan = true;
14470        } else if self.parse_keyword(Keyword::ESTIMATE) {
14471            estimate = true;
14472        } else {
14473            analyze = self.parse_keyword(Keyword::ANALYZE);
14474            verbose = self.parse_keyword(Keyword::VERBOSE);
14475            if self.parse_keyword(Keyword::FORMAT) {
14476                format = Some(self.parse_analyze_format_kind()?);
14477            }
14478        }
14479
14480        match self.maybe_parse(|parser| parser.parse_statement())? {
14481            Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14482                ParserError::ParserError("Explain must be root of the plan".to_string()),
14483            ),
14484            Some(statement) => Ok(Statement::Explain {
14485                describe_alias,
14486                analyze,
14487                verbose,
14488                query_plan,
14489                estimate,
14490                statement: Box::new(statement),
14491                format,
14492                options,
14493            }),
14494            _ => {
14495                let hive_format =
14496                    match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14497                        Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14498                        Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14499                        _ => None,
14500                    };
14501
14502                let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14503                    // only allow to use TABLE keyword for DESC|DESCRIBE statement
14504                    self.parse_keyword(Keyword::TABLE)
14505                } else {
14506                    false
14507                };
14508
14509                let table_name = self.parse_object_name(false)?;
14510                Ok(Statement::ExplainTable {
14511                    describe_alias,
14512                    hive_format,
14513                    has_table_keyword,
14514                    table_name,
14515                })
14516            }
14517        }
14518    }
14519
14520    /// Parse a query expression, i.e. a `SELECT` statement optionally
14521    /// preceded with some `WITH` CTE declarations and optionally followed
14522    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
14523    /// expect the initial keyword to be already consumed
14524    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14525    pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14526        let _guard = self.recursion_counter.try_decrease()?;
14527        let with = if self.parse_keyword(Keyword::WITH) {
14528            let with_token = self.get_current_token();
14529            Some(With {
14530                with_token: with_token.clone().into(),
14531                recursive: self.parse_keyword(Keyword::RECURSIVE),
14532                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14533            })
14534        } else {
14535            None
14536        };
14537        if self.parse_keyword(Keyword::INSERT) {
14538            Ok(Query {
14539                with,
14540                body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14541                order_by: None,
14542                limit_clause: None,
14543                fetch: None,
14544                locks: vec![],
14545                for_clause: None,
14546                settings: None,
14547                format_clause: None,
14548                pipe_operators: vec![],
14549            }
14550            .into())
14551        } else if self.parse_keyword(Keyword::UPDATE) {
14552            Ok(Query {
14553                with,
14554                body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14555                order_by: None,
14556                limit_clause: None,
14557                fetch: None,
14558                locks: vec![],
14559                for_clause: None,
14560                settings: None,
14561                format_clause: None,
14562                pipe_operators: vec![],
14563            }
14564            .into())
14565        } else if self.parse_keyword(Keyword::DELETE) {
14566            Ok(Query {
14567                with,
14568                body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14569                limit_clause: None,
14570                order_by: None,
14571                fetch: None,
14572                locks: vec![],
14573                for_clause: None,
14574                settings: None,
14575                format_clause: None,
14576                pipe_operators: vec![],
14577            }
14578            .into())
14579        } else if self.parse_keyword(Keyword::MERGE) {
14580            Ok(Query {
14581                with,
14582                body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14583                limit_clause: None,
14584                order_by: None,
14585                fetch: None,
14586                locks: vec![],
14587                for_clause: None,
14588                settings: None,
14589                format_clause: None,
14590                pipe_operators: vec![],
14591            }
14592            .into())
14593        } else {
14594            let body = self.parse_query_body(self.dialect.prec_unknown())?;
14595
14596            let order_by = self.parse_optional_order_by()?;
14597
14598            let mut limit_clause = self.parse_optional_limit_clause()?;
14599
14600            let settings = self.parse_settings()?;
14601
14602            let fetch = if self.parse_keyword(Keyword::FETCH) {
14603                Some(self.parse_fetch()?)
14604            } else {
14605                None
14606            };
14607
14608            let mut for_clause = None;
14609            let mut locks = Vec::new();
14610            while self.parse_keyword(Keyword::FOR) {
14611                if let Some(parsed_for_clause) = self.parse_for_clause()? {
14612                    for_clause = Some(parsed_for_clause);
14613                    break;
14614                } else {
14615                    locks.push(self.parse_lock()?);
14616                }
14617            }
14618
14619            // Some databases (e.g. PostgreSQL) accept `LIMIT`/`OFFSET` after the
14620            // row-locking clause (`... FOR UPDATE SKIP LOCKED LIMIT 5`) as well
14621            // as before it. The locking clause above is parsed for every
14622            // dialect, so accept a trailing limit here too rather than gating it
14623            // behind a dialect flag.
14624            if limit_clause.is_none() {
14625                limit_clause = self.parse_optional_limit_clause()?;
14626            }
14627
14628            let format_clause =
14629                if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14630                    if self.parse_keyword(Keyword::NULL) {
14631                        Some(FormatClause::Null)
14632                    } else {
14633                        let ident = self.parse_identifier()?;
14634                        Some(FormatClause::Identifier(ident))
14635                    }
14636                } else {
14637                    None
14638                };
14639
14640            let pipe_operators = if self.dialect.supports_pipe_operator() {
14641                self.parse_pipe_operators()?
14642            } else {
14643                Vec::new()
14644            };
14645
14646            Ok(Query {
14647                with,
14648                body,
14649                order_by,
14650                limit_clause,
14651                fetch,
14652                locks,
14653                for_clause,
14654                settings,
14655                format_clause,
14656                pipe_operators,
14657            }
14658            .into())
14659        }
14660    }
14661
14662    fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14663        let mut pipe_operators = Vec::new();
14664
14665        while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14666            let kw = self.expect_one_of_keywords(&[
14667                Keyword::SELECT,
14668                Keyword::EXTEND,
14669                Keyword::SET,
14670                Keyword::DROP,
14671                Keyword::AS,
14672                Keyword::WHERE,
14673                Keyword::LIMIT,
14674                Keyword::AGGREGATE,
14675                Keyword::ORDER,
14676                Keyword::TABLESAMPLE,
14677                Keyword::RENAME,
14678                Keyword::UNION,
14679                Keyword::INTERSECT,
14680                Keyword::EXCEPT,
14681                Keyword::CALL,
14682                Keyword::PIVOT,
14683                Keyword::UNPIVOT,
14684                Keyword::JOIN,
14685                Keyword::INNER,
14686                Keyword::LEFT,
14687                Keyword::RIGHT,
14688                Keyword::FULL,
14689                Keyword::CROSS,
14690            ])?;
14691            match kw {
14692                Keyword::SELECT => {
14693                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14694                    pipe_operators.push(PipeOperator::Select { exprs })
14695                }
14696                Keyword::EXTEND => {
14697                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14698                    pipe_operators.push(PipeOperator::Extend { exprs })
14699                }
14700                Keyword::SET => {
14701                    let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14702                    pipe_operators.push(PipeOperator::Set { assignments })
14703                }
14704                Keyword::DROP => {
14705                    let columns = self.parse_identifiers()?;
14706                    pipe_operators.push(PipeOperator::Drop { columns })
14707                }
14708                Keyword::AS => {
14709                    let alias = self.parse_identifier()?;
14710                    pipe_operators.push(PipeOperator::As { alias })
14711                }
14712                Keyword::WHERE => {
14713                    let expr = self.parse_expr()?;
14714                    pipe_operators.push(PipeOperator::Where { expr })
14715                }
14716                Keyword::LIMIT => {
14717                    let expr = self.parse_expr()?;
14718                    let offset = if self.parse_keyword(Keyword::OFFSET) {
14719                        Some(self.parse_expr()?)
14720                    } else {
14721                        None
14722                    };
14723                    pipe_operators.push(PipeOperator::Limit { expr, offset })
14724                }
14725                Keyword::AGGREGATE => {
14726                    let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14727                        vec![]
14728                    } else {
14729                        self.parse_comma_separated(|parser| {
14730                            parser.parse_expr_with_alias_and_order_by()
14731                        })?
14732                    };
14733
14734                    let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14735                        self.parse_comma_separated(|parser| {
14736                            parser.parse_expr_with_alias_and_order_by()
14737                        })?
14738                    } else {
14739                        vec![]
14740                    };
14741
14742                    pipe_operators.push(PipeOperator::Aggregate {
14743                        full_table_exprs,
14744                        group_by_expr,
14745                    })
14746                }
14747                Keyword::ORDER => {
14748                    self.expect_one_of_keywords(&[Keyword::BY])?;
14749                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14750                    pipe_operators.push(PipeOperator::OrderBy { exprs })
14751                }
14752                Keyword::TABLESAMPLE => {
14753                    let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14754                    pipe_operators.push(PipeOperator::TableSample { sample });
14755                }
14756                Keyword::RENAME => {
14757                    let mappings =
14758                        self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14759                    pipe_operators.push(PipeOperator::Rename { mappings });
14760                }
14761                Keyword::UNION => {
14762                    let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14763                    let queries = self.parse_pipe_operator_queries()?;
14764                    pipe_operators.push(PipeOperator::Union {
14765                        set_quantifier,
14766                        queries,
14767                    });
14768                }
14769                Keyword::INTERSECT => {
14770                    let set_quantifier =
14771                        self.parse_distinct_required_set_quantifier("INTERSECT")?;
14772                    let queries = self.parse_pipe_operator_queries()?;
14773                    pipe_operators.push(PipeOperator::Intersect {
14774                        set_quantifier,
14775                        queries,
14776                    });
14777                }
14778                Keyword::EXCEPT => {
14779                    let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14780                    let queries = self.parse_pipe_operator_queries()?;
14781                    pipe_operators.push(PipeOperator::Except {
14782                        set_quantifier,
14783                        queries,
14784                    });
14785                }
14786                Keyword::CALL => {
14787                    let function_name = self.parse_object_name(false)?;
14788                    let function_expr = self.parse_function(function_name)?;
14789                    if let Expr::Function(function) = function_expr {
14790                        let alias = self.parse_identifier_optional_alias()?;
14791                        pipe_operators.push(PipeOperator::Call { function, alias });
14792                    } else {
14793                        return Err(ParserError::ParserError(
14794                            "Expected function call after CALL".to_string(),
14795                        ));
14796                    }
14797                }
14798                Keyword::PIVOT => {
14799                    self.expect_token(&Token::LParen)?;
14800                    let aggregate_functions =
14801                        self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14802                    self.expect_keyword_is(Keyword::FOR)?;
14803                    let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14804                    self.expect_keyword_is(Keyword::IN)?;
14805
14806                    self.expect_token(&Token::LParen)?;
14807                    let value_source = if self.parse_keyword(Keyword::ANY) {
14808                        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14809                            self.parse_comma_separated(Parser::parse_order_by_expr)?
14810                        } else {
14811                            vec![]
14812                        };
14813                        PivotValueSource::Any(order_by)
14814                    } else if self.peek_sub_query() {
14815                        PivotValueSource::Subquery(self.parse_query()?)
14816                    } else {
14817                        PivotValueSource::List(
14818                            self.parse_comma_separated(Self::parse_expr_with_alias)?,
14819                        )
14820                    };
14821                    self.expect_token(&Token::RParen)?;
14822                    self.expect_token(&Token::RParen)?;
14823
14824                    let alias = self.parse_identifier_optional_alias()?;
14825
14826                    pipe_operators.push(PipeOperator::Pivot {
14827                        aggregate_functions,
14828                        value_column,
14829                        value_source,
14830                        alias,
14831                    });
14832                }
14833                Keyword::UNPIVOT => {
14834                    self.expect_token(&Token::LParen)?;
14835                    let value_column = self.parse_identifier()?;
14836                    self.expect_keyword(Keyword::FOR)?;
14837                    let name_column = self.parse_identifier()?;
14838                    self.expect_keyword(Keyword::IN)?;
14839
14840                    self.expect_token(&Token::LParen)?;
14841                    let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14842                    self.expect_token(&Token::RParen)?;
14843
14844                    self.expect_token(&Token::RParen)?;
14845
14846                    let alias = self.parse_identifier_optional_alias()?;
14847
14848                    pipe_operators.push(PipeOperator::Unpivot {
14849                        value_column,
14850                        name_column,
14851                        unpivot_columns,
14852                        alias,
14853                    });
14854                }
14855                Keyword::JOIN
14856                | Keyword::INNER
14857                | Keyword::LEFT
14858                | Keyword::RIGHT
14859                | Keyword::FULL
14860                | Keyword::CROSS => {
14861                    self.prev_token();
14862                    let mut joins = self.parse_joins()?;
14863                    if joins.len() != 1 {
14864                        return Err(ParserError::ParserError(
14865                            "Join pipe operator must have a single join".to_string(),
14866                        ));
14867                    }
14868                    let join = joins.swap_remove(0);
14869                    pipe_operators.push(PipeOperator::Join(join))
14870                }
14871                unhandled => {
14872                    return Err(ParserError::ParserError(format!(
14873                    "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14874                )))
14875                }
14876            }
14877        }
14878        Ok(pipe_operators)
14879    }
14880
14881    fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14882        let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14883        {
14884            let key_values = self.parse_comma_separated(|p| {
14885                let key = p.parse_identifier()?;
14886                p.expect_token(&Token::Eq)?;
14887                let value = p.parse_expr()?;
14888                Ok(Setting { key, value })
14889            })?;
14890            Some(key_values)
14891        } else {
14892            None
14893        };
14894        Ok(settings)
14895    }
14896
14897    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
14898    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14899        if self.parse_keyword(Keyword::XML) {
14900            Ok(Some(self.parse_for_xml()?))
14901        } else if self.parse_keyword(Keyword::JSON) {
14902            Ok(Some(self.parse_for_json()?))
14903        } else if self.parse_keyword(Keyword::BROWSE) {
14904            Ok(Some(ForClause::Browse))
14905        } else {
14906            Ok(None)
14907        }
14908    }
14909
14910    /// Parse a mssql `FOR XML` clause
14911    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14912        let for_xml = if self.parse_keyword(Keyword::RAW) {
14913            let mut element_name = None;
14914            if self.peek_token_ref().token == Token::LParen {
14915                self.expect_token(&Token::LParen)?;
14916                element_name = Some(self.parse_literal_string()?);
14917                self.expect_token(&Token::RParen)?;
14918            }
14919            ForXml::Raw(element_name)
14920        } else if self.parse_keyword(Keyword::AUTO) {
14921            ForXml::Auto
14922        } else if self.parse_keyword(Keyword::EXPLICIT) {
14923            ForXml::Explicit
14924        } else if self.parse_keyword(Keyword::PATH) {
14925            let mut element_name = None;
14926            if self.peek_token_ref().token == Token::LParen {
14927                self.expect_token(&Token::LParen)?;
14928                element_name = Some(self.parse_literal_string()?);
14929                self.expect_token(&Token::RParen)?;
14930            }
14931            ForXml::Path(element_name)
14932        } else {
14933            return Err(ParserError::ParserError(
14934                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14935            ));
14936        };
14937        let mut elements = false;
14938        let mut binary_base64 = false;
14939        let mut root = None;
14940        let mut r#type = false;
14941        while self.peek_token_ref().token == Token::Comma {
14942            self.next_token();
14943            if self.parse_keyword(Keyword::ELEMENTS) {
14944                elements = true;
14945            } else if self.parse_keyword(Keyword::BINARY) {
14946                self.expect_keyword_is(Keyword::BASE64)?;
14947                binary_base64 = true;
14948            } else if self.parse_keyword(Keyword::ROOT) {
14949                self.expect_token(&Token::LParen)?;
14950                root = Some(self.parse_literal_string()?);
14951                self.expect_token(&Token::RParen)?;
14952            } else if self.parse_keyword(Keyword::TYPE) {
14953                r#type = true;
14954            }
14955        }
14956        Ok(ForClause::Xml {
14957            for_xml,
14958            elements,
14959            binary_base64,
14960            root,
14961            r#type,
14962        })
14963    }
14964
14965    /// Parse a mssql `FOR JSON` clause
14966    pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14967        let for_json = if self.parse_keyword(Keyword::AUTO) {
14968            ForJson::Auto
14969        } else if self.parse_keyword(Keyword::PATH) {
14970            ForJson::Path
14971        } else {
14972            return Err(ParserError::ParserError(
14973                "Expected FOR JSON [AUTO | PATH ]".to_string(),
14974            ));
14975        };
14976        let mut root = None;
14977        let mut include_null_values = false;
14978        let mut without_array_wrapper = false;
14979        while self.peek_token_ref().token == Token::Comma {
14980            self.next_token();
14981            if self.parse_keyword(Keyword::ROOT) {
14982                self.expect_token(&Token::LParen)?;
14983                root = Some(self.parse_literal_string()?);
14984                self.expect_token(&Token::RParen)?;
14985            } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14986                include_null_values = true;
14987            } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14988                without_array_wrapper = true;
14989            }
14990        }
14991        Ok(ForClause::Json {
14992            for_json,
14993            root,
14994            include_null_values,
14995            without_array_wrapper,
14996        })
14997    }
14998
14999    /// Parse a CTE (`alias [( col1, col2, ... )] [AS] (subquery)`)
15000    pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
15001        let name = self.parse_identifier()?;
15002
15003        let as_optional = self.dialect.supports_cte_without_as();
15004
15005        // If AS is optional, first try to parse `name (query)` directly
15006        if as_optional && !self.peek_keyword(Keyword::AS) {
15007            if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
15008                p.expect_token(&Token::LParen)?;
15009                let query = p.parse_query()?;
15010                let closing_paren_token = p.expect_token(&Token::RParen)?;
15011                Ok((query, closing_paren_token))
15012            })? {
15013                let mut cte = Cte {
15014                    alias: TableAlias {
15015                        explicit: false,
15016                        name,
15017                        columns: vec![],
15018                        at: None,
15019                    },
15020                    query,
15021                    from: None,
15022                    materialized: None,
15023                    closing_paren_token: closing_paren_token.into(),
15024                };
15025                if self.parse_keyword(Keyword::FROM) {
15026                    cte.from = Some(self.parse_identifier()?);
15027                }
15028                return Ok(cte);
15029            }
15030        }
15031
15032        // Determine column definitions and consume AS
15033        let columns = if self.parse_keyword(Keyword::AS) {
15034            vec![]
15035        } else {
15036            let columns = self.parse_table_alias_column_defs()?;
15037            if as_optional {
15038                let _ = self.parse_keyword(Keyword::AS);
15039            } else {
15040                self.expect_keyword_is(Keyword::AS)?;
15041            }
15042            columns
15043        };
15044
15045        let mut is_materialized = None;
15046        if dialect_of!(self is PostgreSqlDialect) {
15047            if self.parse_keyword(Keyword::MATERIALIZED) {
15048                is_materialized = Some(CteAsMaterialized::Materialized);
15049            } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
15050                is_materialized = Some(CteAsMaterialized::NotMaterialized);
15051            }
15052        }
15053
15054        self.expect_token(&Token::LParen)?;
15055        let query = self.parse_query()?;
15056        let closing_paren_token = self.expect_token(&Token::RParen)?;
15057
15058        let mut cte = Cte {
15059            alias: TableAlias {
15060                explicit: false,
15061                name,
15062                columns,
15063                at: None,
15064            },
15065            query,
15066            from: None,
15067            materialized: is_materialized,
15068            closing_paren_token: closing_paren_token.into(),
15069        };
15070        if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
15071            cte.from = Some(self.parse_identifier()?);
15072        }
15073        Ok(cte)
15074    }
15075
15076    /// Parse a "query body", which is an expression with roughly the
15077    /// following grammar:
15078    /// ```sql
15079    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
15080    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
15081    ///   subquery ::= query_body [ order_by_limit ]
15082    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
15083    /// ```
15084    pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
15085        // We parse the expression using a Pratt parser, as in `parse_expr()`.
15086        // Start by parsing a restricted SELECT or a `(subquery)`:
15087        let expr = if self.peek_keyword(Keyword::SELECT)
15088            || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
15089        {
15090            SetExpr::Select(self.parse_select().map(Box::new)?)
15091        } else if self.consume_token(&Token::LParen) {
15092            // CTEs are not allowed here, but the parser currently accepts them
15093            let subquery = self.parse_query()?;
15094            self.expect_token(&Token::RParen)?;
15095            SetExpr::Query(subquery)
15096        } else if self.parse_keyword(Keyword::VALUES) {
15097            let is_mysql = dialect_of!(self is MySqlDialect);
15098            SetExpr::Values(self.parse_values(is_mysql, false)?)
15099        } else if self.parse_keyword(Keyword::VALUE) {
15100            let is_mysql = dialect_of!(self is MySqlDialect);
15101            SetExpr::Values(self.parse_values(is_mysql, true)?)
15102        } else if self.parse_keyword(Keyword::TABLE) {
15103            SetExpr::Table(Box::new(self.parse_as_table()?))
15104        } else {
15105            return self.expected_ref(
15106                "SELECT, VALUES, or a subquery in the query body",
15107                self.peek_token_ref(),
15108            );
15109        };
15110
15111        self.parse_remaining_set_exprs(expr, precedence)
15112    }
15113
15114    /// Parse any extra set expressions that may be present in a query body
15115    ///
15116    /// (this is its own function to reduce required stack size in debug builds)
15117    fn parse_remaining_set_exprs(
15118        &mut self,
15119        mut expr: SetExpr,
15120        precedence: u8,
15121    ) -> Result<Box<SetExpr>, ParserError> {
15122        loop {
15123            // The query can be optionally followed by a set operator:
15124            let op = self.parse_set_operator(&self.peek_token().token);
15125            let next_precedence = match op {
15126                // UNION and EXCEPT have the same binding power and evaluate left-to-right
15127                Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
15128                    10
15129                }
15130                // INTERSECT has higher precedence than UNION/EXCEPT
15131                Some(SetOperator::Intersect) => 20,
15132                // Unexpected token or EOF => stop parsing the query body
15133                None => break,
15134            };
15135            if precedence >= next_precedence {
15136                break;
15137            }
15138            self.next_token(); // skip past the set operator
15139            let set_quantifier = self.parse_set_quantifier(&op);
15140            expr = SetExpr::SetOperation {
15141                left: Box::new(expr),
15142                op: op.unwrap(),
15143                set_quantifier,
15144                right: self.parse_query_body(next_precedence)?,
15145            };
15146        }
15147
15148        Ok(expr.into())
15149    }
15150
15151    /// Parse a set operator token into its `SetOperator` variant.
15152    pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
15153        match token {
15154            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
15155            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
15156            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
15157            Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
15158            _ => None,
15159        }
15160    }
15161
15162    /// Parse a set quantifier (e.g., `ALL`, `DISTINCT BY NAME`) for the given set operator.
15163    pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
15164        match op {
15165            Some(
15166                SetOperator::Except
15167                | SetOperator::Intersect
15168                | SetOperator::Union
15169                | SetOperator::Minus,
15170            ) => {
15171                if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
15172                    SetQuantifier::DistinctByName
15173                } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15174                    SetQuantifier::ByName
15175                } else if self.parse_keyword(Keyword::ALL) {
15176                    if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15177                        SetQuantifier::AllByName
15178                    } else {
15179                        SetQuantifier::All
15180                    }
15181                } else if self.parse_keyword(Keyword::DISTINCT) {
15182                    SetQuantifier::Distinct
15183                } else {
15184                    SetQuantifier::None
15185                }
15186            }
15187            _ => SetQuantifier::None,
15188        }
15189    }
15190
15191    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`)
15192    pub fn parse_select(&mut self) -> Result<Select, ParserError> {
15193        let mut from_first = None;
15194
15195        if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
15196            let from_token = self.expect_keyword(Keyword::FROM)?;
15197            let from = self.parse_table_with_joins()?;
15198            if !self.peek_keyword(Keyword::SELECT) {
15199                return Ok(Select {
15200                    select_token: AttachedToken(from_token),
15201                    optimizer_hints: vec![],
15202                    distinct: None,
15203                    select_modifiers: None,
15204                    top: None,
15205                    top_before_distinct: false,
15206                    projection: vec![],
15207                    exclude: None,
15208                    into: None,
15209                    from,
15210                    lateral_views: vec![],
15211                    prewhere: None,
15212                    selection: None,
15213                    group_by: GroupByExpr::Expressions(vec![], vec![]),
15214                    cluster_by: vec![],
15215                    distribute_by: vec![],
15216                    sort_by: vec![],
15217                    having: None,
15218                    named_window: vec![],
15219                    window_before_qualify: false,
15220                    qualify: None,
15221                    value_table_mode: None,
15222                    connect_by: vec![],
15223                    flavor: SelectFlavor::FromFirstNoSelect,
15224                });
15225            }
15226            from_first = Some(from);
15227        }
15228
15229        let select_token = self.expect_keyword(Keyword::SELECT)?;
15230        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
15231        let value_table_mode = self.parse_value_table_mode()?;
15232
15233        let (select_modifiers, distinct_select_modifier) =
15234            if self.dialect.supports_select_modifiers() {
15235                self.parse_select_modifiers()?
15236            } else {
15237                (None, None)
15238            };
15239
15240        let mut top_before_distinct = false;
15241        let mut top = None;
15242        if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15243            top = Some(self.parse_top()?);
15244            top_before_distinct = true;
15245        }
15246
15247        let distinct = if distinct_select_modifier.is_some() {
15248            distinct_select_modifier
15249        } else {
15250            self.parse_all_or_distinct()?
15251        };
15252
15253        if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15254            top = Some(self.parse_top()?);
15255        }
15256
15257        let projection =
15258            if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
15259                vec![]
15260            } else {
15261                self.parse_projection()?
15262            };
15263
15264        let exclude = if self.dialect.supports_select_exclude() {
15265            self.parse_optional_select_item_exclude()?
15266        } else {
15267            None
15268        };
15269
15270        let into = if self.parse_keyword(Keyword::INTO) {
15271            Some(self.parse_select_into()?)
15272        } else {
15273            None
15274        };
15275
15276        // Note that for keywords to be properly handled here, they need to be
15277        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
15278        // otherwise they may be parsed as an alias as part of the `projection`
15279        // or `from`.
15280
15281        let (from, from_first) = if let Some(from) = from_first.take() {
15282            (from, true)
15283        } else if self.parse_keyword(Keyword::FROM) {
15284            (self.parse_table_with_joins()?, false)
15285        } else {
15286            (vec![], false)
15287        };
15288
15289        let mut lateral_views = vec![];
15290        loop {
15291            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
15292                let outer = self.parse_keyword(Keyword::OUTER);
15293                let lateral_view = self.parse_expr()?;
15294                let lateral_view_name = self.parse_object_name(false)?;
15295                let lateral_col_alias = self
15296                    .parse_comma_separated(|parser| {
15297                        parser.parse_optional_alias(&[
15298                            Keyword::WHERE,
15299                            Keyword::GROUP,
15300                            Keyword::CLUSTER,
15301                            Keyword::HAVING,
15302                            Keyword::LATERAL,
15303                        ]) // This couldn't possibly be a bad idea
15304                    })?
15305                    .into_iter()
15306                    .flatten()
15307                    .collect();
15308
15309                lateral_views.push(LateralView {
15310                    lateral_view,
15311                    lateral_view_name,
15312                    lateral_col_alias,
15313                    outer,
15314                });
15315            } else {
15316                break;
15317            }
15318        }
15319
15320        let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
15321        {
15322            Some(self.parse_expr()?)
15323        } else {
15324            None
15325        };
15326
15327        let selection = if self.parse_keyword(Keyword::WHERE) {
15328            Some(self.parse_expr()?)
15329        } else {
15330            None
15331        };
15332
15333        let connect_by = self.maybe_parse_connect_by()?;
15334
15335        let group_by = self
15336            .parse_optional_group_by()?
15337            .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
15338
15339        let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
15340            self.parse_comma_separated(Parser::parse_expr)?
15341        } else {
15342            vec![]
15343        };
15344
15345        let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
15346            self.parse_comma_separated(Parser::parse_expr)?
15347        } else {
15348            vec![]
15349        };
15350
15351        let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
15352            self.parse_comma_separated(Parser::parse_order_by_expr)?
15353        } else {
15354            vec![]
15355        };
15356
15357        let having = if self.parse_keyword(Keyword::HAVING) {
15358            Some(self.parse_expr()?)
15359        } else {
15360            None
15361        };
15362
15363        // Accept QUALIFY and WINDOW in any order and flag accordingly.
15364        let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
15365        {
15366            let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
15367            if self.parse_keyword(Keyword::QUALIFY) {
15368                (named_windows, Some(self.parse_expr()?), true)
15369            } else {
15370                (named_windows, None, true)
15371            }
15372        } else if self.parse_keyword(Keyword::QUALIFY) {
15373            let qualify = Some(self.parse_expr()?);
15374            if self.parse_keyword(Keyword::WINDOW) {
15375                (
15376                    self.parse_comma_separated(Parser::parse_named_window)?,
15377                    qualify,
15378                    false,
15379                )
15380            } else {
15381                (Default::default(), qualify, false)
15382            }
15383        } else {
15384            Default::default()
15385        };
15386
15387        Ok(Select {
15388            select_token: AttachedToken(select_token),
15389            optimizer_hints,
15390            distinct,
15391            select_modifiers,
15392            top,
15393            top_before_distinct,
15394            projection,
15395            exclude,
15396            into,
15397            from,
15398            lateral_views,
15399            prewhere,
15400            selection,
15401            group_by,
15402            cluster_by,
15403            distribute_by,
15404            sort_by,
15405            having,
15406            named_window: named_windows,
15407            window_before_qualify,
15408            qualify,
15409            value_table_mode,
15410            connect_by,
15411            flavor: if from_first {
15412                SelectFlavor::FromFirst
15413            } else {
15414                SelectFlavor::Standard
15415            },
15416        })
15417    }
15418
15419    /// Parses optimizer hints at the current token position.
15420    ///
15421    /// Collects all `/*prefix+...*/` and `--prefix+...` patterns.
15422    /// The `prefix` is any run of ASCII alphanumeric characters between the
15423    /// comment marker and `+` (e.g. `""` for `/*+...*/`, `"abc"` for `/*abc+...*/`).
15424    ///
15425    /// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/optimizer-hints.html#optimizer-hints-overview)
15426    /// [Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E)
15427    fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15428        let supports_hints = self.dialect.supports_comment_optimizer_hint();
15429        if !supports_hints {
15430            return Ok(vec![]);
15431        }
15432        let mut hints = vec![];
15433        loop {
15434            let t = self.peek_nth_token_no_skip_ref(0);
15435            let Token::Whitespace(ws) = &t.token else {
15436                break;
15437            };
15438            match ws {
15439                Whitespace::SingleLineComment { comment, prefix } => {
15440                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15441                        hints.push(OptimizerHint {
15442                            prefix: hint_prefix,
15443                            text,
15444                            style: OptimizerHintStyle::SingleLine {
15445                                prefix: prefix.clone(),
15446                            },
15447                        });
15448                    }
15449                    self.next_token_no_skip();
15450                }
15451                Whitespace::MultiLineComment(comment) => {
15452                    if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15453                        hints.push(OptimizerHint {
15454                            prefix: hint_prefix,
15455                            text,
15456                            style: OptimizerHintStyle::MultiLine,
15457                        });
15458                    }
15459                    self.next_token_no_skip();
15460                }
15461                Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15462                    self.next_token_no_skip();
15463                }
15464            }
15465        }
15466        Ok(hints)
15467    }
15468
15469    /// Checks if a comment's content starts with `[ASCII-alphanumeric]*+`
15470    /// and returns `(prefix, text_after_plus)` if so.
15471    fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15472        let (before_plus, text) = comment.split_once('+')?;
15473        if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15474            Some((before_plus.to_string(), text.to_string()))
15475        } else {
15476            None
15477        }
15478    }
15479
15480    /// Parses MySQL SELECT modifiers and DISTINCT/ALL in any order.
15481    ///
15482    /// Manual testing shows odifiers can appear in any order, and modifiers other than DISTINCT/ALL
15483    /// can be repeated.
15484    ///
15485    /// <https://dev.mysql.com/doc/refman/8.4/en/select.html>
15486    fn parse_select_modifiers(
15487        &mut self,
15488    ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15489        let mut modifiers = SelectModifiers::default();
15490        let mut distinct = None;
15491
15492        let keywords = &[
15493            Keyword::ALL,
15494            Keyword::DISTINCT,
15495            Keyword::DISTINCTROW,
15496            Keyword::HIGH_PRIORITY,
15497            Keyword::STRAIGHT_JOIN,
15498            Keyword::SQL_SMALL_RESULT,
15499            Keyword::SQL_BIG_RESULT,
15500            Keyword::SQL_BUFFER_RESULT,
15501            Keyword::SQL_NO_CACHE,
15502            Keyword::SQL_CALC_FOUND_ROWS,
15503        ];
15504
15505        while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15506            match keyword {
15507                Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15508                    self.prev_token();
15509                    distinct = self.parse_all_or_distinct()?;
15510                }
15511                // DISTINCTROW is a MySQL-specific legacy (but not deprecated) alias for DISTINCT
15512                Keyword::DISTINCTROW if distinct.is_none() => {
15513                    distinct = Some(Distinct::Distinct);
15514                }
15515                Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15516                Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15517                Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15518                Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15519                Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15520                Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15521                Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15522                _ => {
15523                    self.prev_token();
15524                    return self.expected_ref(
15525                        "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15526                        self.peek_token_ref(),
15527                    );
15528                }
15529            }
15530        }
15531
15532        // Avoid polluting the AST with `Some(SelectModifiers::default())` empty value unless there
15533        // actually were some modifiers set.
15534        let select_modifiers = if modifiers.is_any_set() {
15535            Some(modifiers)
15536        } else {
15537            None
15538        };
15539        Ok((select_modifiers, distinct))
15540    }
15541
15542    fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15543        if !dialect_of!(self is BigQueryDialect) {
15544            return Ok(None);
15545        }
15546
15547        let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15548            Some(ValueTableMode::DistinctAsValue)
15549        } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15550            Some(ValueTableMode::DistinctAsStruct)
15551        } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15552            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15553        {
15554            Some(ValueTableMode::AsValue)
15555        } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15556            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15557        {
15558            Some(ValueTableMode::AsStruct)
15559        } else if self.parse_keyword(Keyword::AS) {
15560            self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15561        } else {
15562            None
15563        };
15564
15565        Ok(mode)
15566    }
15567
15568    /// Invoke `f` after first setting the parser's `ParserState` to `state`.
15569    ///
15570    /// Upon return, restores the parser's state to what it started at.
15571    fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15572    where
15573        F: FnMut(&mut Parser) -> Result<T, ParserError>,
15574    {
15575        let current_state = self.state;
15576        self.state = state;
15577        let res = f(self);
15578        self.state = current_state;
15579        res
15580    }
15581
15582    /// Parse a `CONNECT BY` clause (Oracle-style hierarchical query support).
15583    pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15584        let mut clauses = Vec::with_capacity(2);
15585        loop {
15586            if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15587                clauses.push(ConnectByKind::StartWith {
15588                    start_token: self.token_at(idx).clone().into(),
15589                    condition: self.parse_expr()?.into(),
15590                });
15591            } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15592            {
15593                clauses.push(ConnectByKind::ConnectBy {
15594                    connect_token: self.token_at(idx).clone().into(),
15595                    nocycle: self.parse_keyword(Keyword::NOCYCLE),
15596                    relationships: self.with_state(ParserState::ConnectBy, |parser| {
15597                        parser.parse_comma_separated(Parser::parse_expr)
15598                    })?,
15599                });
15600            } else {
15601                break;
15602            }
15603        }
15604        Ok(clauses)
15605    }
15606
15607    /// Parse `CREATE TABLE x AS TABLE y`
15608    pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15609        let token1 = self.next_token();
15610        let token2 = self.next_token();
15611        let token3 = self.next_token();
15612
15613        let table_name;
15614        let schema_name;
15615        if token2 == Token::Period {
15616            match token1.token {
15617                Token::Word(w) => {
15618                    schema_name = w.value;
15619                }
15620                _ => {
15621                    return self.expected("Schema name", token1);
15622                }
15623            }
15624            match token3.token {
15625                Token::Word(w) => {
15626                    table_name = w.value;
15627                }
15628                _ => {
15629                    return self.expected("Table name", token3);
15630                }
15631            }
15632            Ok(Table {
15633                table_name: Some(table_name),
15634                schema_name: Some(schema_name),
15635            })
15636        } else {
15637            match token1.token {
15638                Token::Word(w) => {
15639                    table_name = w.value;
15640                }
15641                _ => {
15642                    return self.expected("Table name", token1);
15643                }
15644            }
15645            Ok(Table {
15646                table_name: Some(table_name),
15647                schema_name: None,
15648            })
15649        }
15650    }
15651
15652    /// Parse a `SET ROLE` statement. Expects SET to be consumed already.
15653    fn parse_set_role(
15654        &mut self,
15655        modifier: Option<ContextModifier>,
15656    ) -> Result<Statement, ParserError> {
15657        self.expect_keyword_is(Keyword::ROLE)?;
15658
15659        let role_name = if self.parse_keyword(Keyword::NONE) {
15660            None
15661        } else {
15662            Some(self.parse_identifier()?)
15663        };
15664        Ok(Statement::Set(Set::SetRole {
15665            context_modifier: modifier,
15666            role_name,
15667        }))
15668    }
15669
15670    fn parse_set_values(
15671        &mut self,
15672        parenthesized_assignment: bool,
15673    ) -> Result<Vec<Expr>, ParserError> {
15674        let mut values = vec![];
15675
15676        if parenthesized_assignment {
15677            self.expect_token(&Token::LParen)?;
15678        }
15679
15680        loop {
15681            let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15682                expr
15683            } else if let Ok(expr) = self.parse_expr() {
15684                expr
15685            } else {
15686                self.expected_ref("variable value", self.peek_token_ref())?
15687            };
15688
15689            values.push(value);
15690            if self.consume_token(&Token::Comma) {
15691                continue;
15692            }
15693
15694            if parenthesized_assignment {
15695                self.expect_token(&Token::RParen)?;
15696            }
15697            return Ok(values);
15698        }
15699    }
15700
15701    fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15702        let modifier =
15703            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15704
15705        Self::keyword_to_modifier(modifier)
15706    }
15707
15708    /// Parse a single SET statement assignment `var = expr`.
15709    fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15710        let scope = self.parse_context_modifier();
15711
15712        let name = if self.dialect.supports_parenthesized_set_variables()
15713            && self.consume_token(&Token::LParen)
15714        {
15715            // Parenthesized assignments are handled in the `parse_set` function after
15716            // trying to parse list of assignments using this function.
15717            // If a dialect supports both, and we find a LParen, we early exit from this function.
15718            self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15719        } else {
15720            self.parse_object_name(false)?
15721        };
15722
15723        if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15724            return self.expected_ref("assignment operator", self.peek_token_ref());
15725        }
15726
15727        let value = self.parse_expr()?;
15728
15729        Ok(SetAssignment { scope, name, value })
15730    }
15731
15732    fn parse_set(&mut self) -> Result<Statement, ParserError> {
15733        let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15734
15735        // Modifier is either HIVEVAR: or a ContextModifier (LOCAL, SESSION, etc), not both
15736        let scope = if !hivevar {
15737            self.parse_context_modifier()
15738        } else {
15739            None
15740        };
15741
15742        if hivevar {
15743            self.expect_token(&Token::Colon)?;
15744        }
15745
15746        if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15747            return Ok(set_role_stmt);
15748        }
15749
15750        // Handle special cases first
15751        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15752            || self.parse_keyword(Keyword::TIMEZONE)
15753        {
15754            if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15755                return Ok(Set::SingleAssignment {
15756                    scope,
15757                    hivevar,
15758                    variable: ObjectName::from(vec!["TIMEZONE".into()]),
15759                    values: self.parse_set_values(false)?,
15760                }
15761                .into());
15762            } else {
15763                // A shorthand alias for SET TIME ZONE that doesn't require
15764                // the assignment operator. It's originally PostgreSQL specific,
15765                // but we allow it for all the dialects
15766                return Ok(Set::SetTimeZone {
15767                    local: scope == Some(ContextModifier::Local),
15768                    value: self.parse_expr()?,
15769                }
15770                .into());
15771            }
15772        } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15773            if self.parse_keyword(Keyword::DEFAULT) {
15774                return Ok(Set::SetNamesDefault {}.into());
15775            }
15776            let charset_name = self.parse_identifier()?;
15777            let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15778                Some(self.parse_literal_string()?)
15779            } else {
15780                None
15781            };
15782
15783            return Ok(Set::SetNames {
15784                charset_name,
15785                collation_name,
15786            }
15787            .into());
15788        } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15789            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15790            return Ok(Set::SetTransaction {
15791                modes: self.parse_transaction_modes()?,
15792                snapshot: None,
15793                session: true,
15794            }
15795            .into());
15796        } else if self.parse_keyword(Keyword::TRANSACTION) {
15797            if self.parse_keyword(Keyword::SNAPSHOT) {
15798                let snapshot_id = self.parse_value()?;
15799                return Ok(Set::SetTransaction {
15800                    modes: vec![],
15801                    snapshot: Some(snapshot_id),
15802                    session: false,
15803                }
15804                .into());
15805            }
15806            return Ok(Set::SetTransaction {
15807                modes: self.parse_transaction_modes()?,
15808                snapshot: None,
15809                session: false,
15810            }
15811            .into());
15812        } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15813            let scope = match scope {
15814                Some(s) => s,
15815                None => {
15816                    return self.expected_at(
15817                        "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15818                        self.get_current_index(),
15819                    )
15820                }
15821            };
15822            let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15823                SetSessionAuthorizationParamKind::Default
15824            } else {
15825                let value = self.parse_identifier()?;
15826                SetSessionAuthorizationParamKind::User(value)
15827            };
15828            return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15829                scope,
15830                kind: auth_value,
15831            })
15832            .into());
15833        }
15834
15835        if self.dialect.supports_comma_separated_set_assignments() {
15836            if scope.is_some() {
15837                self.prev_token();
15838            }
15839
15840            if let Some(assignments) = self
15841                .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15842            {
15843                return if assignments.len() > 1 {
15844                    Ok(Set::MultipleAssignments { assignments }.into())
15845                } else {
15846                    let SetAssignment { scope, name, value } =
15847                        assignments.into_iter().next().ok_or_else(|| {
15848                            ParserError::ParserError("Expected at least one assignment".to_string())
15849                        })?;
15850
15851                    Ok(Set::SingleAssignment {
15852                        scope,
15853                        hivevar,
15854                        variable: name,
15855                        values: vec![value],
15856                    }
15857                    .into())
15858                };
15859            }
15860        }
15861
15862        let variables = if self.dialect.supports_parenthesized_set_variables()
15863            && self.consume_token(&Token::LParen)
15864        {
15865            let vars = OneOrManyWithParens::Many(
15866                self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15867                    .into_iter()
15868                    .map(|ident| ObjectName::from(vec![ident]))
15869                    .collect(),
15870            );
15871            self.expect_token(&Token::RParen)?;
15872            vars
15873        } else {
15874            OneOrManyWithParens::One(self.parse_object_name(false)?)
15875        };
15876
15877        if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15878            let stmt = match variables {
15879                OneOrManyWithParens::One(var) => Set::SingleAssignment {
15880                    scope,
15881                    hivevar,
15882                    variable: var,
15883                    values: self.parse_set_values(false)?,
15884                },
15885                OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15886                    variables: vars,
15887                    values: self.parse_set_values(true)?,
15888                },
15889            };
15890
15891            return Ok(stmt.into());
15892        }
15893
15894        if self.dialect.supports_set_stmt_without_operator() {
15895            self.prev_token();
15896            return self.parse_set_session_params();
15897        };
15898
15899        self.expected_ref("equals sign or TO", self.peek_token_ref())
15900    }
15901
15902    /// Parse session parameter assignments after `SET` when no `=` or `TO` is present.
15903    pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15904        if self.parse_keyword(Keyword::STATISTICS) {
15905            let topic = match self.parse_one_of_keywords(&[
15906                Keyword::IO,
15907                Keyword::PROFILE,
15908                Keyword::TIME,
15909                Keyword::XML,
15910            ]) {
15911                Some(Keyword::IO) => SessionParamStatsTopic::IO,
15912                Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15913                Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15914                Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15915                _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15916            };
15917            let value = self.parse_session_param_value()?;
15918            Ok(
15919                Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15920                    topic,
15921                    value,
15922                }))
15923                .into(),
15924            )
15925        } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15926            let obj = self.parse_object_name(false)?;
15927            let value = self.parse_session_param_value()?;
15928            Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15929                SetSessionParamIdentityInsert { obj, value },
15930            ))
15931            .into())
15932        } else if self.parse_keyword(Keyword::OFFSETS) {
15933            let keywords = self.parse_comma_separated(|parser| {
15934                let next_token = parser.next_token();
15935                match &next_token.token {
15936                    Token::Word(w) => Ok(w.to_string()),
15937                    _ => parser.expected("SQL keyword", next_token),
15938                }
15939            })?;
15940            let value = self.parse_session_param_value()?;
15941            Ok(
15942                Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15943                    keywords,
15944                    value,
15945                }))
15946                .into(),
15947            )
15948        } else {
15949            let names = self.parse_comma_separated(|parser| {
15950                let next_token = parser.next_token();
15951                match next_token.token {
15952                    Token::Word(w) => Ok(w.to_string()),
15953                    _ => parser.expected("Session param name", next_token),
15954                }
15955            })?;
15956            let value = self.parse_expr()?.to_string();
15957            Ok(
15958                Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15959                    names,
15960                    value,
15961                }))
15962                .into(),
15963            )
15964        }
15965    }
15966
15967    fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15968        if self.parse_keyword(Keyword::ON) {
15969            Ok(SessionParamValue::On)
15970        } else if self.parse_keyword(Keyword::OFF) {
15971            Ok(SessionParamValue::Off)
15972        } else {
15973            self.expected_ref("ON or OFF", self.peek_token_ref())
15974        }
15975    }
15976
15977    /// Parse a `SHOW` statement and dispatch to specific SHOW handlers.
15978    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15979        let terse = self.parse_keyword(Keyword::TERSE);
15980        let extended = self.parse_keyword(Keyword::EXTENDED);
15981        let full = self.parse_keyword(Keyword::FULL);
15982        let session = self.parse_keyword(Keyword::SESSION);
15983        let global = self.parse_keyword(Keyword::GLOBAL);
15984        let external = self.parse_keyword(Keyword::EXTERNAL);
15985        if self
15986            .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15987            .is_some()
15988        {
15989            Ok(self.parse_show_columns(extended, full)?)
15990        } else if self.parse_keyword(Keyword::TABLES) {
15991            Ok(self.parse_show_tables(terse, extended, full, external)?)
15992        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15993            Ok(self.parse_show_views(terse, true)?)
15994        } else if self.parse_keyword(Keyword::VIEWS) {
15995            Ok(self.parse_show_views(terse, false)?)
15996        } else if self.parse_keyword(Keyword::FUNCTIONS) {
15997            Ok(self.parse_show_functions()?)
15998        } else if self.parse_keyword(Keyword::PROCESSLIST) {
15999            Ok(Statement::ShowProcessList { full })
16000        } else if extended || full {
16001            Err(ParserError::ParserError(
16002                "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
16003            ))
16004        } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
16005            Ok(self.parse_show_create()?)
16006        } else if self.parse_keyword(Keyword::COLLATION) {
16007            Ok(self.parse_show_collation()?)
16008        } else if self.parse_keyword(Keyword::VARIABLES)
16009            && dialect_of!(self is MySqlDialect | GenericDialect)
16010        {
16011            Ok(Statement::ShowVariables {
16012                filter: self.parse_show_statement_filter()?,
16013                session,
16014                global,
16015            })
16016        } else if self.parse_keyword(Keyword::STATUS)
16017            && dialect_of!(self is MySqlDialect | GenericDialect)
16018        {
16019            Ok(Statement::ShowStatus {
16020                filter: self.parse_show_statement_filter()?,
16021                session,
16022                global,
16023            })
16024        } else if self.parse_keyword(Keyword::CATALOGS) {
16025            self.parse_show_catalogs(terse)
16026        } else if self.parse_keyword(Keyword::DATABASES) {
16027            self.parse_show_databases(terse)
16028        } else if self.parse_keyword(Keyword::SCHEMAS) {
16029            self.parse_show_schemas(terse)
16030        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
16031            self.parse_show_charset(false)
16032        } else if self.parse_keyword(Keyword::CHARSET) {
16033            self.parse_show_charset(true)
16034        } else {
16035            Ok(Statement::ShowVariable {
16036                variable: self.parse_identifiers()?,
16037            })
16038        }
16039    }
16040
16041    fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
16042        // parse one of keywords
16043        Ok(Statement::ShowCharset(ShowCharset {
16044            is_shorthand,
16045            filter: self.parse_show_statement_filter()?,
16046        }))
16047    }
16048
16049    fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
16050        let history = self.parse_keyword(Keyword::HISTORY);
16051        let show_options = self.parse_show_stmt_options()?;
16052        Ok(Statement::ShowCatalogs {
16053            terse,
16054            history,
16055            show_options,
16056        })
16057    }
16058
16059    fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
16060        let history = self.parse_keyword(Keyword::HISTORY);
16061        let show_options = self.parse_show_stmt_options()?;
16062        Ok(Statement::ShowDatabases {
16063            terse,
16064            history,
16065            show_options,
16066        })
16067    }
16068
16069    fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
16070        let history = self.parse_keyword(Keyword::HISTORY);
16071        let show_options = self.parse_show_stmt_options()?;
16072        Ok(Statement::ShowSchemas {
16073            terse,
16074            history,
16075            show_options,
16076        })
16077    }
16078
16079    /// Parse `SHOW CREATE <object>` returning the corresponding `ShowCreate` statement.
16080    pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
16081        let obj_type = match self.expect_one_of_keywords(&[
16082            Keyword::TABLE,
16083            Keyword::TRIGGER,
16084            Keyword::FUNCTION,
16085            Keyword::PROCEDURE,
16086            Keyword::EVENT,
16087            Keyword::VIEW,
16088        ])? {
16089            Keyword::TABLE => Ok(ShowCreateObject::Table),
16090            Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
16091            Keyword::FUNCTION => Ok(ShowCreateObject::Function),
16092            Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
16093            Keyword::EVENT => Ok(ShowCreateObject::Event),
16094            Keyword::VIEW => Ok(ShowCreateObject::View),
16095            keyword => Err(ParserError::ParserError(format!(
16096                "Unable to map keyword to ShowCreateObject: {keyword:?}"
16097            ))),
16098        }?;
16099
16100        let obj_name = self.parse_object_name(false)?;
16101
16102        Ok(Statement::ShowCreate { obj_type, obj_name })
16103    }
16104
16105    /// Parse `SHOW COLUMNS`/`SHOW FIELDS` and return a `ShowColumns` statement.
16106    pub fn parse_show_columns(
16107        &mut self,
16108        extended: bool,
16109        full: bool,
16110    ) -> Result<Statement, ParserError> {
16111        let show_options = self.parse_show_stmt_options()?;
16112        Ok(Statement::ShowColumns {
16113            extended,
16114            full,
16115            show_options,
16116        })
16117    }
16118
16119    fn parse_show_tables(
16120        &mut self,
16121        terse: bool,
16122        extended: bool,
16123        full: bool,
16124        external: bool,
16125    ) -> Result<Statement, ParserError> {
16126        let history = !external && self.parse_keyword(Keyword::HISTORY);
16127        let show_options = self.parse_show_stmt_options()?;
16128        Ok(Statement::ShowTables {
16129            terse,
16130            history,
16131            extended,
16132            full,
16133            external,
16134            show_options,
16135        })
16136    }
16137
16138    fn parse_show_views(
16139        &mut self,
16140        terse: bool,
16141        materialized: bool,
16142    ) -> Result<Statement, ParserError> {
16143        let show_options = self.parse_show_stmt_options()?;
16144        Ok(Statement::ShowViews {
16145            materialized,
16146            terse,
16147            show_options,
16148        })
16149    }
16150
16151    /// Parse `SHOW FUNCTIONS` and optional filter.
16152    pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
16153        let filter = self.parse_show_statement_filter()?;
16154        Ok(Statement::ShowFunctions { filter })
16155    }
16156
16157    /// Parse `SHOW COLLATION` and optional filter.
16158    pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
16159        let filter = self.parse_show_statement_filter()?;
16160        Ok(Statement::ShowCollation { filter })
16161    }
16162
16163    /// Parse an optional filter used by `SHOW` statements (LIKE, ILIKE, WHERE, or literal).
16164    pub fn parse_show_statement_filter(
16165        &mut self,
16166    ) -> Result<Option<ShowStatementFilter>, ParserError> {
16167        if self.parse_keyword(Keyword::LIKE) {
16168            Ok(Some(ShowStatementFilter::Like(
16169                self.parse_literal_string()?,
16170            )))
16171        } else if self.parse_keyword(Keyword::ILIKE) {
16172            Ok(Some(ShowStatementFilter::ILike(
16173                self.parse_literal_string()?,
16174            )))
16175        } else if self.parse_keyword(Keyword::WHERE) {
16176            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
16177        } else {
16178            self.maybe_parse(|parser| -> Result<String, ParserError> {
16179                parser.parse_literal_string()
16180            })?
16181            .map_or(Ok(None), |filter| {
16182                Ok(Some(ShowStatementFilter::NoKeyword(filter)))
16183            })
16184        }
16185    }
16186
16187    /// Parse a `USE` statement (database/catalog/schema/warehouse/role selection).
16188    pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
16189        // Determine which keywords are recognized by the current dialect
16190        let parsed_keyword = if dialect_of!(self is HiveDialect) {
16191            // HiveDialect accepts USE DEFAULT; statement without any db specified
16192            if self.parse_keyword(Keyword::DEFAULT) {
16193                return Ok(Statement::Use(Use::Default));
16194            }
16195            None // HiveDialect doesn't expect any other specific keyword after `USE`
16196        } else if dialect_of!(self is DatabricksDialect) {
16197            self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
16198        } else if dialect_of!(self is SnowflakeDialect) {
16199            self.parse_one_of_keywords(&[
16200                Keyword::DATABASE,
16201                Keyword::SCHEMA,
16202                Keyword::WAREHOUSE,
16203                Keyword::ROLE,
16204                Keyword::SECONDARY,
16205            ])
16206        } else {
16207            None // No specific keywords for other dialects, including GenericDialect
16208        };
16209
16210        let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
16211            self.parse_secondary_roles()?
16212        } else {
16213            let obj_name = self.parse_object_name(false)?;
16214            match parsed_keyword {
16215                Some(Keyword::CATALOG) => Use::Catalog(obj_name),
16216                Some(Keyword::DATABASE) => Use::Database(obj_name),
16217                Some(Keyword::SCHEMA) => Use::Schema(obj_name),
16218                Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
16219                Some(Keyword::ROLE) => Use::Role(obj_name),
16220                _ => Use::Object(obj_name),
16221            }
16222        };
16223
16224        Ok(Statement::Use(result))
16225    }
16226
16227    fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
16228        self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
16229        if self.parse_keyword(Keyword::NONE) {
16230            Ok(Use::SecondaryRoles(SecondaryRoles::None))
16231        } else if self.parse_keyword(Keyword::ALL) {
16232            Ok(Use::SecondaryRoles(SecondaryRoles::All))
16233        } else {
16234            let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
16235            Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
16236        }
16237    }
16238
16239    /// Parse a table factor followed by any join clauses, returning `TableWithJoins`.
16240    pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
16241        let relation = self.parse_table_factor()?;
16242        // Note that for keywords to be properly handled here, they need to be
16243        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
16244        // a table alias.
16245        let joins = self.parse_joins()?;
16246        Ok(TableWithJoins { relation, joins })
16247    }
16248
16249    fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
16250        let mut joins = vec![];
16251        loop {
16252            let global = self.parse_keyword(Keyword::GLOBAL);
16253            let join = if self.parse_keyword(Keyword::CROSS) {
16254                let join_operator = if self.parse_keyword(Keyword::JOIN) {
16255                    JoinOperator::CrossJoin(JoinConstraint::None)
16256                } else if self.parse_keyword(Keyword::APPLY) {
16257                    // MSSQL extension, similar to CROSS JOIN LATERAL
16258                    JoinOperator::CrossApply
16259                } else {
16260                    return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
16261                };
16262                let relation = self.parse_table_factor()?;
16263                let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
16264                    && self.dialect.supports_cross_join_constraint()
16265                {
16266                    let constraint = self.parse_join_constraint(false)?;
16267                    JoinOperator::CrossJoin(constraint)
16268                } else {
16269                    join_operator
16270                };
16271                Join {
16272                    relation,
16273                    global,
16274                    join_operator,
16275                }
16276            } else if self.parse_keyword(Keyword::OUTER) {
16277                // MSSQL extension, similar to LEFT JOIN LATERAL .. ON 1=1
16278                self.expect_keyword_is(Keyword::APPLY)?;
16279                Join {
16280                    relation: self.parse_table_factor()?,
16281                    global,
16282                    join_operator: JoinOperator::OuterApply,
16283                }
16284            } else if self.parse_keyword(Keyword::ASOF) {
16285                self.expect_keyword_is(Keyword::JOIN)?;
16286                let relation = self.parse_table_factor()?;
16287                self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
16288                let match_condition = self.parse_parenthesized(Self::parse_expr)?;
16289                Join {
16290                    relation,
16291                    global,
16292                    join_operator: JoinOperator::AsOf {
16293                        match_condition,
16294                        constraint: self.parse_join_constraint(false)?,
16295                    },
16296                }
16297            } else if self.dialect.supports_array_join_syntax()
16298                && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
16299            {
16300                // ClickHouse: INNER ARRAY JOIN
16301                Join {
16302                    relation: self.parse_table_factor()?,
16303                    global,
16304                    join_operator: JoinOperator::InnerArrayJoin,
16305                }
16306            } else if self.dialect.supports_array_join_syntax()
16307                && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
16308            {
16309                // ClickHouse: LEFT ARRAY JOIN
16310                Join {
16311                    relation: self.parse_table_factor()?,
16312                    global,
16313                    join_operator: JoinOperator::LeftArrayJoin,
16314                }
16315            } else if self.dialect.supports_array_join_syntax()
16316                && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
16317            {
16318                // ClickHouse: ARRAY JOIN
16319                Join {
16320                    relation: self.parse_table_factor()?,
16321                    global,
16322                    join_operator: JoinOperator::ArrayJoin,
16323                }
16324            } else {
16325                let natural = self.parse_keyword(Keyword::NATURAL);
16326                let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
16327                    w.keyword
16328                } else {
16329                    Keyword::NoKeyword
16330                };
16331
16332                let join_operator_type = match peek_keyword {
16333                    Keyword::INNER | Keyword::JOIN => {
16334                        let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
16335                        self.expect_keyword_is(Keyword::JOIN)?;
16336                        if inner {
16337                            JoinOperator::Inner
16338                        } else {
16339                            JoinOperator::Join
16340                        }
16341                    }
16342                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
16343                        let _ = self.next_token(); // consume LEFT/RIGHT
16344                        let is_left = kw == Keyword::LEFT;
16345                        let join_type = self.parse_one_of_keywords(&[
16346                            Keyword::OUTER,
16347                            Keyword::SEMI,
16348                            Keyword::ANTI,
16349                            Keyword::JOIN,
16350                        ]);
16351                        match join_type {
16352                            Some(Keyword::OUTER) => {
16353                                self.expect_keyword_is(Keyword::JOIN)?;
16354                                if is_left {
16355                                    JoinOperator::LeftOuter
16356                                } else {
16357                                    JoinOperator::RightOuter
16358                                }
16359                            }
16360                            Some(Keyword::SEMI) => {
16361                                self.expect_keyword_is(Keyword::JOIN)?;
16362                                if is_left {
16363                                    JoinOperator::LeftSemi
16364                                } else {
16365                                    JoinOperator::RightSemi
16366                                }
16367                            }
16368                            Some(Keyword::ANTI) => {
16369                                self.expect_keyword_is(Keyword::JOIN)?;
16370                                if is_left {
16371                                    JoinOperator::LeftAnti
16372                                } else {
16373                                    JoinOperator::RightAnti
16374                                }
16375                            }
16376                            Some(Keyword::JOIN) => {
16377                                if is_left {
16378                                    JoinOperator::Left
16379                                } else {
16380                                    JoinOperator::Right
16381                                }
16382                            }
16383                            _ => {
16384                                return Err(ParserError::ParserError(format!(
16385                                    "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16386                                )))
16387                            }
16388                        }
16389                    }
16390                    Keyword::ANTI => {
16391                        let _ = self.next_token(); // consume ANTI
16392                        self.expect_keyword_is(Keyword::JOIN)?;
16393                        JoinOperator::Anti
16394                    }
16395                    Keyword::SEMI => {
16396                        let _ = self.next_token(); // consume SEMI
16397                        self.expect_keyword_is(Keyword::JOIN)?;
16398                        JoinOperator::Semi
16399                    }
16400                    Keyword::FULL => {
16401                        let _ = self.next_token(); // consume FULL
16402                        let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
16403                        self.expect_keyword_is(Keyword::JOIN)?;
16404                        JoinOperator::FullOuter
16405                    }
16406                    Keyword::OUTER => {
16407                        return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16408                    }
16409                    Keyword::STRAIGHT_JOIN => {
16410                        let _ = self.next_token(); // consume STRAIGHT_JOIN
16411                        JoinOperator::StraightJoin
16412                    }
16413                    _ if natural => {
16414                        return self
16415                            .expected_ref("a join type after NATURAL", self.peek_token_ref());
16416                    }
16417                    _ => break,
16418                };
16419                let mut relation = self.parse_table_factor()?;
16420
16421                if !self
16422                    .dialect
16423                    .supports_left_associative_joins_without_parens()
16424                    && !natural
16425                    && self.peek_parens_less_nested_join()
16426                {
16427                    let joins = self.parse_joins()?;
16428                    relation = TableFactor::NestedJoin {
16429                        table_with_joins: Box::new(TableWithJoins { relation, joins }),
16430                        alias: None,
16431                    };
16432                }
16433
16434                let join_constraint = self.parse_join_constraint(natural)?;
16435                Join {
16436                    relation,
16437                    global,
16438                    join_operator: join_operator_type(join_constraint),
16439                }
16440            };
16441            joins.push(join);
16442        }
16443        Ok(joins)
16444    }
16445
16446    fn peek_parens_less_nested_join(&self) -> bool {
16447        matches!(
16448            self.peek_token_ref().token,
16449            Token::Word(Word {
16450                keyword: Keyword::JOIN
16451                    | Keyword::INNER
16452                    | Keyword::LEFT
16453                    | Keyword::RIGHT
16454                    | Keyword::FULL,
16455                ..
16456            })
16457        )
16458    }
16459
16460    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
16461    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16462    pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16463        let _guard = self.recursion_counter.try_decrease()?;
16464        if self.parse_keyword(Keyword::LATERAL) {
16465            // LATERAL must always be followed by a subquery or table function.
16466            if self.consume_token(&Token::LParen) {
16467                self.parse_derived_table_factor(Lateral)
16468            } else {
16469                let name = self.parse_object_name(false)?;
16470                self.expect_token(&Token::LParen)?;
16471                let args = self.parse_optional_args()?;
16472                let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16473                let alias = self.maybe_parse_table_alias()?;
16474                Ok(TableFactor::Function {
16475                    lateral: true,
16476                    name,
16477                    args,
16478                    with_ordinality,
16479                    alias,
16480                })
16481            }
16482        } else if self.parse_keyword(Keyword::TABLE) {
16483            // parse table function (SELECT * FROM TABLE (<expr>) [ AS <alias> ])
16484            self.expect_token(&Token::LParen)?;
16485            let expr = self.parse_expr()?;
16486            self.expect_token(&Token::RParen)?;
16487            let alias = self.maybe_parse_table_alias()?;
16488            Ok(TableFactor::TableFunction { expr, alias })
16489        } else if self.consume_token(&Token::LParen) {
16490            // A left paren introduces either a derived table (i.e., a subquery)
16491            // or a nested join. It's nearly impossible to determine ahead of
16492            // time which it is... so we just try to parse both.
16493            //
16494            // Here's an example that demonstrates the complexity:
16495            //                     /-------------------------------------------------------\
16496            //                     | /-----------------------------------\                 |
16497            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
16498            //                   ^ ^ ^ ^
16499            //                   | | | |
16500            //                   | | | |
16501            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
16502            //                   | | (3) starts a derived table (subquery)
16503            //                   | (2) starts a nested join
16504            //                   (1) an additional set of parens around a nested join
16505            //
16506
16507            // If the recently consumed '(' starts a derived table, the call to
16508            // `parse_derived_table_factor` below will return success after parsing the
16509            // subquery, followed by the closing ')', and the alias of the derived table.
16510            // In the example above this is case (3).
16511            //
16512            // Memoize failures to break the 2^N work on inputs like
16513            // `FROM ((((...`, where the nested-join fallback recurses back into
16514            // `parse_table_factor` and re-attempts the same speculative parse.
16515            let derived_pos = self.index;
16516            let derived = if self
16517                .failed_derived_table_factor_positions
16518                .contains(&derived_pos)
16519            {
16520                None
16521            } else {
16522                match self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))? {
16523                    Some(t) => Some(t),
16524                    None => {
16525                        self.failed_derived_table_factor_positions
16526                            .insert(derived_pos);
16527                        None
16528                    }
16529                }
16530            };
16531            if let Some(mut table) = derived {
16532                while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16533                {
16534                    table = match kw {
16535                        Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16536                        Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16537                        unexpected_keyword => return Err(ParserError::ParserError(
16538                            format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16539                        )),
16540                    }
16541                }
16542                return Ok(table);
16543            }
16544
16545            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
16546            // recently consumed does not start a derived table (cases 1, 2, or 4).
16547            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
16548
16549            // Inside the parentheses we expect to find an (A) table factor
16550            // followed by some joins or (B) another level of nesting.
16551            let mut table_and_joins = self.parse_table_and_joins()?;
16552
16553            #[allow(clippy::if_same_then_else)]
16554            if !table_and_joins.joins.is_empty() {
16555                self.expect_token(&Token::RParen)?;
16556                let alias = self.maybe_parse_table_alias()?;
16557                Ok(TableFactor::NestedJoin {
16558                    table_with_joins: Box::new(table_and_joins),
16559                    alias,
16560                }) // (A)
16561            } else if let TableFactor::NestedJoin {
16562                table_with_joins: _,
16563                alias: _,
16564            } = &table_and_joins.relation
16565            {
16566                // (B): `table_and_joins` (what we found inside the parentheses)
16567                // is a nested join `(foo JOIN bar)`, not followed by other joins.
16568                self.expect_token(&Token::RParen)?;
16569                let alias = self.maybe_parse_table_alias()?;
16570                Ok(TableFactor::NestedJoin {
16571                    table_with_joins: Box::new(table_and_joins),
16572                    alias,
16573                })
16574            } else if self.dialect.supports_parens_around_table_factor() {
16575                // Dialect-specific behavior: Snowflake diverges from the
16576                // standard and from most of the other implementations by
16577                // allowing extra parentheses not only around a join (B), but
16578                // around lone table names (e.g. `FROM (mytable [AS alias])`)
16579                // and around derived tables (e.g. `FROM ((SELECT ...)
16580                // [AS alias])`) as well.
16581                self.expect_token(&Token::RParen)?;
16582
16583                if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16584                    // Snowflake also allows specifying an alias *after* parens
16585                    // e.g. `FROM (mytable) AS alias`
16586                    match &mut table_and_joins.relation {
16587                        TableFactor::Derived { alias, .. }
16588                        | TableFactor::Table { alias, .. }
16589                        | TableFactor::Function { alias, .. }
16590                        | TableFactor::UNNEST { alias, .. }
16591                        | TableFactor::JsonTable { alias, .. }
16592                        | TableFactor::XmlTable { alias, .. }
16593                        | TableFactor::OpenJsonTable { alias, .. }
16594                        | TableFactor::TableFunction { alias, .. }
16595                        | TableFactor::Pivot { alias, .. }
16596                        | TableFactor::Unpivot { alias, .. }
16597                        | TableFactor::MatchRecognize { alias, .. }
16598                        | TableFactor::SemanticView { alias, .. }
16599                        | TableFactor::NestedJoin { alias, .. } => {
16600                            // but not `FROM (mytable AS alias1) AS alias2`.
16601                            if let Some(inner_alias) = alias {
16602                                return Err(ParserError::ParserError(format!(
16603                                    "duplicate alias {inner_alias}"
16604                                )));
16605                            }
16606                            // Act as if the alias was specified normally next
16607                            // to the table name: `(mytable) AS alias` ->
16608                            // `(mytable AS alias)`
16609                            alias.replace(outer_alias);
16610                        }
16611                        TableFactor::UnpivotExpr { .. } => {
16612                            return Err(ParserError::ParserError(
16613                                "alias after parenthesized UNPIVOT expression is not supported"
16614                                    .to_string(),
16615                            ))
16616                        }
16617                    };
16618                }
16619                // Do not store the extra set of parens in the AST
16620                Ok(table_and_joins.relation)
16621            } else {
16622                // The SQL spec prohibits derived tables and bare tables from
16623                // appearing alone in parentheses (e.g. `FROM (mytable)`)
16624                self.expected_ref("joined table", self.peek_token_ref())
16625            }
16626        } else if self.dialect.supports_values_as_table_factor()
16627            && matches!(
16628                self.peek_tokens(),
16629                [
16630                    Token::Word(Word {
16631                        keyword: Keyword::VALUES,
16632                        ..
16633                    }),
16634                    Token::LParen
16635                ]
16636            )
16637        {
16638            self.expect_keyword_is(Keyword::VALUES)?;
16639
16640            // Snowflake and Databricks allow syntax like below:
16641            // SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
16642            // where there are no parentheses around the VALUES clause.
16643            let values = SetExpr::Values(self.parse_values(false, false)?);
16644            let alias = self.maybe_parse_table_alias()?;
16645            Ok(TableFactor::Derived {
16646                lateral: false,
16647                subquery: Box::new(Query {
16648                    with: None,
16649                    body: Box::new(values),
16650                    order_by: None,
16651                    limit_clause: None,
16652                    fetch: None,
16653                    locks: vec![],
16654                    for_clause: None,
16655                    settings: None,
16656                    format_clause: None,
16657                    pipe_operators: vec![],
16658                }),
16659                alias,
16660                sample: None,
16661            })
16662        } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16663            && self.parse_keyword(Keyword::UNNEST)
16664        {
16665            self.expect_token(&Token::LParen)?;
16666            let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16667            self.expect_token(&Token::RParen)?;
16668
16669            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16670            let alias = match self.maybe_parse_table_alias() {
16671                Ok(Some(alias)) => Some(alias),
16672                Ok(None) => None,
16673                Err(e) => return Err(e),
16674            };
16675
16676            let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16677                Ok(()) => true,
16678                Err(_) => false,
16679            };
16680
16681            let with_offset_alias = if with_offset {
16682                match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16683                    Ok(Some(alias)) => Some(alias),
16684                    Ok(None) => None,
16685                    Err(e) => return Err(e),
16686                }
16687            } else {
16688                None
16689            };
16690
16691            Ok(TableFactor::UNNEST {
16692                alias,
16693                array_exprs,
16694                with_offset,
16695                with_offset_alias,
16696                with_ordinality,
16697            })
16698        } else if self.dialect.supports_unpivot_expr() && self.peek_keyword(Keyword::UNPIVOT) {
16699            self.parse_unpivot_expr_table_factor()
16700        } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16701            let json_expr = self.parse_expr()?;
16702            self.expect_token(&Token::Comma)?;
16703            let json_path = self.parse_value()?;
16704            self.expect_keyword_is(Keyword::COLUMNS)?;
16705            self.expect_token(&Token::LParen)?;
16706            let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16707            self.expect_token(&Token::RParen)?;
16708            self.expect_token(&Token::RParen)?;
16709            let alias = self.maybe_parse_table_alias()?;
16710            Ok(TableFactor::JsonTable {
16711                json_expr,
16712                json_path,
16713                columns,
16714                alias,
16715            })
16716        } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16717            self.prev_token();
16718            self.parse_open_json_table_factor()
16719        } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16720            self.prev_token();
16721            self.parse_xml_table_factor()
16722        } else if self.dialect.supports_semantic_view_table_factor()
16723            && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16724        {
16725            self.parse_semantic_view_table_factor()
16726        } else if self.peek_token_ref().token == Token::AtSign {
16727            // Stage reference: @mystage or @namespace.stage (e.g. Snowflake)
16728            self.parse_snowflake_stage_table_factor()
16729        } else {
16730            let name = self.parse_object_name(true)?;
16731
16732            let json_path = match &self.peek_token_ref().token {
16733                Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16734                _ => None,
16735            };
16736
16737            let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16738                && self.parse_keyword(Keyword::PARTITION)
16739            {
16740                self.parse_parenthesized_identifiers()?
16741            } else {
16742                vec![]
16743            };
16744
16745            // Parse potential version qualifier
16746            let version = self.maybe_parse_table_version()?;
16747
16748            // Postgres, MSSQL, ClickHouse: table-valued functions:
16749            let args = if self.consume_token(&Token::LParen) {
16750                Some(self.parse_table_function_args()?)
16751            } else {
16752                None
16753            };
16754
16755            let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16756
16757            let mut sample = None;
16758            if self.dialect.supports_table_sample_before_alias() {
16759                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16760                    sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16761                }
16762            }
16763
16764            let alias = self.maybe_parse_table_alias()?;
16765
16766            // MYSQL-specific table hints:
16767            let index_hints = if self.dialect.supports_table_hints() {
16768                self.maybe_parse(|p| p.parse_table_index_hints())?
16769                    .unwrap_or(vec![])
16770            } else {
16771                vec![]
16772            };
16773
16774            // MSSQL-specific table hints:
16775            let mut with_hints = vec![];
16776            if self.parse_keyword(Keyword::WITH) {
16777                if self.consume_token(&Token::LParen) {
16778                    with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16779                    self.expect_token(&Token::RParen)?;
16780                } else {
16781                    // rewind, as WITH may belong to the next statement's CTE
16782                    self.prev_token();
16783                }
16784            };
16785
16786            if !self.dialect.supports_table_sample_before_alias() {
16787                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16788                    sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16789                }
16790            }
16791
16792            let mut table = TableFactor::Table {
16793                name,
16794                alias,
16795                args,
16796                with_hints,
16797                version,
16798                partitions,
16799                with_ordinality,
16800                json_path,
16801                sample,
16802                index_hints,
16803            };
16804
16805            while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16806                table = match kw {
16807                    Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16808                    Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16809                    unexpected_keyword => return Err(ParserError::ParserError(
16810                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16811                    )),
16812                }
16813            }
16814
16815            if self.dialect.supports_match_recognize()
16816                && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16817            {
16818                table = self.parse_match_recognize(table)?;
16819            }
16820
16821            Ok(table)
16822        }
16823    }
16824
16825    /// Parse a Snowflake stage reference as a table factor.
16826    /// Handles syntax like: `@mystage1 (file_format => 'myformat', pattern => '...')`
16827    ///
16828    /// See: <https://docs.snowflake.com/en/user-guide/querying-stage>
16829    fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16830        // Parse the stage name starting with @
16831        let name = crate::dialect::parse_snowflake_stage_name(self)?;
16832
16833        // Parse optional stage options like (file_format => 'myformat', pattern => '...')
16834        let args = if self.consume_token(&Token::LParen) {
16835            Some(self.parse_table_function_args()?)
16836        } else {
16837            None
16838        };
16839
16840        let alias = self.maybe_parse_table_alias()?;
16841
16842        Ok(TableFactor::Table {
16843            name,
16844            alias,
16845            args,
16846            with_hints: vec![],
16847            version: None,
16848            partitions: vec![],
16849            with_ordinality: false,
16850            json_path: None,
16851            sample: None,
16852            index_hints: vec![],
16853        })
16854    }
16855
16856    fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16857        let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16858            TableSampleModifier::TableSample
16859        } else if self.parse_keyword(Keyword::SAMPLE) {
16860            TableSampleModifier::Sample
16861        } else {
16862            return Ok(None);
16863        };
16864        self.parse_table_sample(modifier).map(Some)
16865    }
16866
16867    fn parse_table_sample(
16868        &mut self,
16869        modifier: TableSampleModifier,
16870    ) -> Result<Box<TableSample>, ParserError> {
16871        let name = match self.parse_one_of_keywords(&[
16872            Keyword::BERNOULLI,
16873            Keyword::ROW,
16874            Keyword::SYSTEM,
16875            Keyword::BLOCK,
16876        ]) {
16877            Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16878            Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16879            Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16880            Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16881            _ => None,
16882        };
16883
16884        let parenthesized = self.consume_token(&Token::LParen);
16885
16886        let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16887            let selected_bucket = self.parse_number_value()?;
16888            self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16889            let total = self.parse_number_value()?;
16890            let on = if self.parse_keyword(Keyword::ON) {
16891                Some(self.parse_expr()?)
16892            } else {
16893                None
16894            };
16895            (
16896                None,
16897                Some(TableSampleBucket {
16898                    bucket: selected_bucket,
16899                    total,
16900                    on,
16901                }),
16902            )
16903        } else {
16904            let value = match self.maybe_parse(|p| p.parse_expr())? {
16905                Some(num) => num,
16906                None => {
16907                    let next_token = self.next_token();
16908                    if let Token::Word(w) = next_token.token {
16909                        Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16910                    } else {
16911                        return parser_err!(
16912                            "Expecting number or byte length e.g. 100M",
16913                            self.peek_token_ref().span.start
16914                        );
16915                    }
16916                }
16917            };
16918            let unit = if self.parse_keyword(Keyword::ROWS) {
16919                Some(TableSampleUnit::Rows)
16920            } else if self.parse_keyword(Keyword::PERCENT) {
16921                Some(TableSampleUnit::Percent)
16922            } else {
16923                None
16924            };
16925            (
16926                Some(TableSampleQuantity {
16927                    parenthesized,
16928                    value,
16929                    unit,
16930                }),
16931                None,
16932            )
16933        };
16934        if parenthesized {
16935            self.expect_token(&Token::RParen)?;
16936        }
16937
16938        let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16939            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16940        } else if self.parse_keyword(Keyword::SEED) {
16941            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16942        } else {
16943            None
16944        };
16945
16946        let offset = if self.parse_keyword(Keyword::OFFSET) {
16947            Some(self.parse_expr()?)
16948        } else {
16949            None
16950        };
16951
16952        Ok(Box::new(TableSample {
16953            modifier,
16954            name,
16955            quantity,
16956            seed,
16957            bucket,
16958            offset,
16959        }))
16960    }
16961
16962    fn parse_table_sample_seed(
16963        &mut self,
16964        modifier: TableSampleSeedModifier,
16965    ) -> Result<TableSampleSeed, ParserError> {
16966        self.expect_token(&Token::LParen)?;
16967        let value = self.parse_number_value()?;
16968        self.expect_token(&Token::RParen)?;
16969        Ok(TableSampleSeed { modifier, value })
16970    }
16971
16972    /// Parses `OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]` clause,
16973    /// assuming the `OPENJSON` keyword was already consumed.
16974    fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16975        self.expect_token(&Token::LParen)?;
16976        let json_expr = self.parse_expr()?;
16977        let json_path = if self.consume_token(&Token::Comma) {
16978            Some(self.parse_value()?)
16979        } else {
16980            None
16981        };
16982        self.expect_token(&Token::RParen)?;
16983        let columns = if self.parse_keyword(Keyword::WITH) {
16984            self.expect_token(&Token::LParen)?;
16985            let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16986            self.expect_token(&Token::RParen)?;
16987            columns
16988        } else {
16989            Vec::new()
16990        };
16991        let alias = self.maybe_parse_table_alias()?;
16992        Ok(TableFactor::OpenJsonTable {
16993            json_expr,
16994            json_path,
16995            columns,
16996            alias,
16997        })
16998    }
16999
17000    fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17001        self.expect_token(&Token::LParen)?;
17002        let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
17003            self.expect_token(&Token::LParen)?;
17004            let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
17005            self.expect_token(&Token::RParen)?;
17006            self.expect_token(&Token::Comma)?;
17007            namespaces
17008        } else {
17009            vec![]
17010        };
17011        let row_expression = self.parse_expr()?;
17012        let passing = self.parse_xml_passing_clause()?;
17013        self.expect_keyword_is(Keyword::COLUMNS)?;
17014        let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
17015        self.expect_token(&Token::RParen)?;
17016        let alias = self.maybe_parse_table_alias()?;
17017        Ok(TableFactor::XmlTable {
17018            namespaces,
17019            row_expression,
17020            passing,
17021            columns,
17022            alias,
17023        })
17024    }
17025
17026    fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
17027        let uri = self.parse_expr()?;
17028        self.expect_keyword_is(Keyword::AS)?;
17029        let name = self.parse_identifier()?;
17030        Ok(XmlNamespaceDefinition { uri, name })
17031    }
17032
17033    fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
17034        let name = self.parse_identifier()?;
17035
17036        let option = if self.parse_keyword(Keyword::FOR) {
17037            self.expect_keyword(Keyword::ORDINALITY)?;
17038            XmlTableColumnOption::ForOrdinality
17039        } else {
17040            let r#type = self.parse_data_type()?;
17041            let mut path = None;
17042            let mut default = None;
17043
17044            if self.parse_keyword(Keyword::PATH) {
17045                path = Some(self.parse_expr()?);
17046            }
17047
17048            if self.parse_keyword(Keyword::DEFAULT) {
17049                default = Some(self.parse_expr()?);
17050            }
17051
17052            let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
17053            if !not_null {
17054                // NULL is the default but can be specified explicitly
17055                let _ = self.parse_keyword(Keyword::NULL);
17056            }
17057
17058            XmlTableColumnOption::NamedInfo {
17059                r#type,
17060                path,
17061                default,
17062                nullable: !not_null,
17063            }
17064        };
17065        Ok(XmlTableColumn { name, option })
17066    }
17067
17068    fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
17069        let mut arguments = vec![];
17070        if self.parse_keyword(Keyword::PASSING) {
17071            loop {
17072                let by_value =
17073                    self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
17074                let expr = self.parse_expr()?;
17075                let alias = if self.parse_keyword(Keyword::AS) {
17076                    Some(self.parse_identifier()?)
17077                } else {
17078                    None
17079                };
17080                arguments.push(XmlPassingArgument {
17081                    expr,
17082                    alias,
17083                    by_value,
17084                });
17085                if !self.consume_token(&Token::Comma) {
17086                    break;
17087                }
17088            }
17089        }
17090        Ok(XmlPassingClause { arguments })
17091    }
17092
17093    /// Parse a [TableFactor::SemanticView]
17094    fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17095        self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
17096        self.expect_token(&Token::LParen)?;
17097
17098        let name = self.parse_object_name(true)?;
17099
17100        // Parse DIMENSIONS, METRICS, FACTS and WHERE clauses in flexible order
17101        let mut dimensions = Vec::new();
17102        let mut metrics = Vec::new();
17103        let mut facts = Vec::new();
17104        let mut where_clause = None;
17105
17106        while self.peek_token_ref().token != Token::RParen {
17107            if self.parse_keyword(Keyword::DIMENSIONS) {
17108                if !dimensions.is_empty() {
17109                    return Err(ParserError::ParserError(
17110                        "DIMENSIONS clause can only be specified once".to_string(),
17111                    ));
17112                }
17113                dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17114            } else if self.parse_keyword(Keyword::METRICS) {
17115                if !metrics.is_empty() {
17116                    return Err(ParserError::ParserError(
17117                        "METRICS clause can only be specified once".to_string(),
17118                    ));
17119                }
17120                metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17121            } else if self.parse_keyword(Keyword::FACTS) {
17122                if !facts.is_empty() {
17123                    return Err(ParserError::ParserError(
17124                        "FACTS clause can only be specified once".to_string(),
17125                    ));
17126                }
17127                facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17128            } else if self.parse_keyword(Keyword::WHERE) {
17129                if where_clause.is_some() {
17130                    return Err(ParserError::ParserError(
17131                        "WHERE clause can only be specified once".to_string(),
17132                    ));
17133                }
17134                where_clause = Some(self.parse_expr()?);
17135            } else {
17136                let tok = self.peek_token_ref();
17137                parser_err!(
17138                    format!(
17139                        "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
17140                        tok.token
17141                    ),
17142                    tok.span.start
17143                )?;
17144            }
17145        }
17146
17147        self.expect_token(&Token::RParen)?;
17148
17149        let alias = self.maybe_parse_table_alias()?;
17150
17151        Ok(TableFactor::SemanticView {
17152            name,
17153            dimensions,
17154            metrics,
17155            facts,
17156            where_clause,
17157            alias,
17158        })
17159    }
17160
17161    fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
17162        self.expect_token(&Token::LParen)?;
17163
17164        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
17165            self.parse_comma_separated(Parser::parse_expr)?
17166        } else {
17167            vec![]
17168        };
17169
17170        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17171            self.parse_comma_separated(Parser::parse_order_by_expr)?
17172        } else {
17173            vec![]
17174        };
17175
17176        let measures = if self.parse_keyword(Keyword::MEASURES) {
17177            self.parse_comma_separated(|p| {
17178                let expr = p.parse_expr()?;
17179                let _ = p.parse_keyword(Keyword::AS);
17180                let alias = p.parse_identifier()?;
17181                Ok(Measure { expr, alias })
17182            })?
17183        } else {
17184            vec![]
17185        };
17186
17187        let rows_per_match =
17188            if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
17189                Some(RowsPerMatch::OneRow)
17190            } else if self.parse_keywords(&[
17191                Keyword::ALL,
17192                Keyword::ROWS,
17193                Keyword::PER,
17194                Keyword::MATCH,
17195            ]) {
17196                Some(RowsPerMatch::AllRows(
17197                    if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
17198                        Some(EmptyMatchesMode::Show)
17199                    } else if self.parse_keywords(&[
17200                        Keyword::OMIT,
17201                        Keyword::EMPTY,
17202                        Keyword::MATCHES,
17203                    ]) {
17204                        Some(EmptyMatchesMode::Omit)
17205                    } else if self.parse_keywords(&[
17206                        Keyword::WITH,
17207                        Keyword::UNMATCHED,
17208                        Keyword::ROWS,
17209                    ]) {
17210                        Some(EmptyMatchesMode::WithUnmatched)
17211                    } else {
17212                        None
17213                    },
17214                ))
17215            } else {
17216                None
17217            };
17218
17219        let after_match_skip =
17220            if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
17221                if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
17222                    Some(AfterMatchSkip::PastLastRow)
17223                } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
17224                    Some(AfterMatchSkip::ToNextRow)
17225                } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
17226                    Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
17227                } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
17228                    Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
17229                } else {
17230                    let found = self.next_token();
17231                    return self.expected("after match skip option", found);
17232                }
17233            } else {
17234                None
17235            };
17236
17237        self.expect_keyword_is(Keyword::PATTERN)?;
17238        let pattern = self.parse_parenthesized(Self::parse_pattern)?;
17239
17240        self.expect_keyword_is(Keyword::DEFINE)?;
17241
17242        let symbols = self.parse_comma_separated(|p| {
17243            let symbol = p.parse_identifier()?;
17244            p.expect_keyword_is(Keyword::AS)?;
17245            let definition = p.parse_expr()?;
17246            Ok(SymbolDefinition { symbol, definition })
17247        })?;
17248
17249        self.expect_token(&Token::RParen)?;
17250
17251        let alias = self.maybe_parse_table_alias()?;
17252
17253        Ok(TableFactor::MatchRecognize {
17254            table: Box::new(table),
17255            partition_by,
17256            order_by,
17257            measures,
17258            rows_per_match,
17259            after_match_skip,
17260            pattern,
17261            symbols,
17262            alias,
17263        })
17264    }
17265
17266    fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17267        match self.next_token().token {
17268            Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
17269            Token::Placeholder(s) if s == "$" => {
17270                Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
17271            }
17272            Token::LBrace => {
17273                self.expect_token(&Token::Minus)?;
17274                let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
17275                self.expect_token(&Token::Minus)?;
17276                self.expect_token(&Token::RBrace)?;
17277                Ok(MatchRecognizePattern::Exclude(symbol))
17278            }
17279            Token::Word(Word {
17280                value,
17281                quote_style: None,
17282                ..
17283            }) if value == "PERMUTE" => {
17284                self.expect_token(&Token::LParen)?;
17285                let symbols = self.parse_comma_separated(|p| {
17286                    p.parse_identifier().map(MatchRecognizeSymbol::Named)
17287                })?;
17288                self.expect_token(&Token::RParen)?;
17289                Ok(MatchRecognizePattern::Permute(symbols))
17290            }
17291            Token::LParen => {
17292                let pattern = self.parse_pattern()?;
17293                self.expect_token(&Token::RParen)?;
17294                Ok(MatchRecognizePattern::Group(Box::new(pattern)))
17295            }
17296            _ => {
17297                self.prev_token();
17298                self.parse_identifier()
17299                    .map(MatchRecognizeSymbol::Named)
17300                    .map(MatchRecognizePattern::Symbol)
17301            }
17302        }
17303    }
17304
17305    fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17306        let mut pattern = self.parse_base_pattern()?;
17307        loop {
17308            let token = self.next_token();
17309            let quantifier = match token.token {
17310                Token::Mul => RepetitionQuantifier::ZeroOrMore,
17311                Token::Plus => RepetitionQuantifier::OneOrMore,
17312                Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
17313                Token::LBrace => {
17314                    // quantifier is a range like {n} or {n,} or {,m} or {n,m}
17315                    let token = self.next_token();
17316                    match token.token {
17317                        Token::Comma => {
17318                            let next_token = self.next_token();
17319                            let Token::Number(n, _) = next_token.token else {
17320                                return self.expected("literal number", next_token);
17321                            };
17322                            self.expect_token(&Token::RBrace)?;
17323                            RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
17324                        }
17325                        Token::Number(n, _) if self.consume_token(&Token::Comma) => {
17326                            let next_token = self.next_token();
17327                            match next_token.token {
17328                                Token::Number(m, _) => {
17329                                    self.expect_token(&Token::RBrace)?;
17330                                    RepetitionQuantifier::Range(
17331                                        Self::parse(n, token.span.start)?,
17332                                        Self::parse(m, token.span.start)?,
17333                                    )
17334                                }
17335                                Token::RBrace => {
17336                                    RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
17337                                }
17338                                _ => {
17339                                    return self.expected("} or upper bound", next_token);
17340                                }
17341                            }
17342                        }
17343                        Token::Number(n, _) => {
17344                            self.expect_token(&Token::RBrace)?;
17345                            RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
17346                        }
17347                        _ => return self.expected("quantifier range", token),
17348                    }
17349                }
17350                _ => {
17351                    self.prev_token();
17352                    break;
17353                }
17354            };
17355            pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
17356        }
17357        Ok(pattern)
17358    }
17359
17360    fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17361        let mut patterns = vec![self.parse_repetition_pattern()?];
17362        while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
17363            patterns.push(self.parse_repetition_pattern()?);
17364        }
17365        match <[MatchRecognizePattern; 1]>::try_from(patterns) {
17366            Ok([pattern]) => Ok(pattern),
17367            Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
17368        }
17369    }
17370
17371    fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17372        let pattern = self.parse_concat_pattern()?;
17373        if self.consume_token(&Token::Pipe) {
17374            match self.parse_pattern()? {
17375                // flatten nested alternations
17376                MatchRecognizePattern::Alternation(mut patterns) => {
17377                    patterns.insert(0, pattern);
17378                    Ok(MatchRecognizePattern::Alternation(patterns))
17379                }
17380                next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
17381            }
17382        } else {
17383            Ok(pattern)
17384        }
17385    }
17386
17387    /// Parses a the timestamp version specifier (i.e. query historical data)
17388    pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
17389        if self.dialect.supports_table_versioning() {
17390            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
17391            {
17392                let expr = self.parse_expr()?;
17393                return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
17394            } else if self.peek_keyword(Keyword::CHANGES) {
17395                return self.parse_table_version_changes().map(Some);
17396            } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
17397                let func_name = self.parse_object_name(true)?;
17398                let func = self.parse_function(func_name)?;
17399                return Ok(Some(TableVersion::Function(func)));
17400            } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
17401                let expr = self.parse_expr()?;
17402                return Ok(Some(TableVersion::TimestampAsOf(expr)));
17403            } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
17404                let expr = Expr::Value(self.parse_number_value()?);
17405                return Ok(Some(TableVersion::VersionAsOf(expr)));
17406            }
17407        }
17408        Ok(None)
17409    }
17410
17411    /// Parses the Snowflake `CHANGES` clause for change tracking queries.
17412    ///
17413    /// Syntax:
17414    /// ```sql
17415    /// CHANGES (INFORMATION => DEFAULT)
17416    ///   AT (TIMESTAMP => <expr>)
17417    ///   [END (TIMESTAMP => <expr>)]
17418    /// ```
17419    ///
17420    /// <https://docs.snowflake.com/en/sql-reference/constructs/changes>
17421    fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17422        let changes_name = self.parse_object_name(true)?;
17423        let changes = self.parse_function(changes_name)?;
17424        let at_name = self.parse_object_name(true)?;
17425        let at = self.parse_function(at_name)?;
17426        let end = if self.peek_keyword(Keyword::END) {
17427            let end_name = self.parse_object_name(true)?;
17428            Some(self.parse_function(end_name)?)
17429        } else {
17430            None
17431        };
17432        Ok(TableVersion::Changes { changes, at, end })
17433    }
17434
17435    /// Parses MySQL's JSON_TABLE column definition.
17436    /// For example: `id INT EXISTS PATH '$' DEFAULT '0' ON EMPTY ERROR ON ERROR`
17437    pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17438        if self.parse_keyword(Keyword::NESTED) {
17439            let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17440            let path = self.parse_value()?;
17441            self.expect_keyword_is(Keyword::COLUMNS)?;
17442            let columns = self.parse_parenthesized(|p| {
17443                p.parse_comma_separated(Self::parse_json_table_column_def)
17444            })?;
17445            return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17446                path,
17447                columns,
17448            }));
17449        }
17450        let name = self.parse_identifier()?;
17451        if self.parse_keyword(Keyword::FOR) {
17452            self.expect_keyword_is(Keyword::ORDINALITY)?;
17453            return Ok(JsonTableColumn::ForOrdinality(name));
17454        }
17455        let r#type = self.parse_data_type()?;
17456        let exists = self.parse_keyword(Keyword::EXISTS);
17457        self.expect_keyword_is(Keyword::PATH)?;
17458        let path = self.parse_value()?;
17459        let mut on_empty = None;
17460        let mut on_error = None;
17461        while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17462            if self.parse_keyword(Keyword::EMPTY) {
17463                on_empty = Some(error_handling);
17464            } else {
17465                self.expect_keyword_is(Keyword::ERROR)?;
17466                on_error = Some(error_handling);
17467            }
17468        }
17469        Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17470            name,
17471            r#type,
17472            path,
17473            exists,
17474            on_empty,
17475            on_error,
17476        }))
17477    }
17478
17479    /// Parses MSSQL's `OPENJSON WITH` column definition.
17480    ///
17481    /// ```sql
17482    /// colName type [ column_path ] [ AS JSON ]
17483    /// ```
17484    ///
17485    /// Reference: <https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver16#syntax>
17486    pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17487        let name = self.parse_identifier()?;
17488        let r#type = self.parse_data_type()?;
17489        let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17490            self.next_token();
17491            Some(path)
17492        } else {
17493            None
17494        };
17495        let as_json = self.parse_keyword(Keyword::AS);
17496        if as_json {
17497            self.expect_keyword_is(Keyword::JSON)?;
17498        }
17499        Ok(OpenJsonTableColumn {
17500            name,
17501            r#type,
17502            path,
17503            as_json,
17504        })
17505    }
17506
17507    fn parse_json_table_column_error_handling(
17508        &mut self,
17509    ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17510        let res = if self.parse_keyword(Keyword::NULL) {
17511            JsonTableColumnErrorHandling::Null
17512        } else if self.parse_keyword(Keyword::ERROR) {
17513            JsonTableColumnErrorHandling::Error
17514        } else if self.parse_keyword(Keyword::DEFAULT) {
17515            JsonTableColumnErrorHandling::Default(self.parse_value()?)
17516        } else {
17517            return Ok(None);
17518        };
17519        self.expect_keyword_is(Keyword::ON)?;
17520        Ok(Some(res))
17521    }
17522
17523    /// Parse a derived table factor (a parenthesized subquery), handling optional LATERAL.
17524    pub fn parse_derived_table_factor(
17525        &mut self,
17526        lateral: IsLateral,
17527    ) -> Result<TableFactor, ParserError> {
17528        let subquery = self.parse_query()?;
17529        self.expect_token(&Token::RParen)?;
17530        let alias = self.maybe_parse_table_alias()?;
17531
17532        // Parse optional SAMPLE clause after alias
17533        let sample = self
17534            .maybe_parse_table_sample()?
17535            .map(TableSampleKind::AfterTableAlias);
17536
17537        Ok(TableFactor::Derived {
17538            lateral: match lateral {
17539                Lateral => true,
17540                NotLateral => false,
17541            },
17542            subquery,
17543            alias,
17544            sample,
17545        })
17546    }
17547
17548    /// Parses an expression with an optional alias
17549    ///
17550    /// Examples:
17551    ///
17552    /// ```sql
17553    /// SUM(price) AS total_price
17554    /// ```
17555    /// ```sql
17556    /// SUM(price)
17557    /// ```
17558    ///
17559    /// Example
17560    /// ```
17561    /// # use sqlparser::parser::{Parser, ParserError};
17562    /// # use sqlparser::dialect::GenericDialect;
17563    /// # fn main() ->Result<(), ParserError> {
17564    /// let sql = r#"SUM("a") as "b""#;
17565    /// let mut parser = Parser::new(&GenericDialect).try_with_sql(sql)?;
17566    /// let expr_with_alias = parser.parse_expr_with_alias()?;
17567    /// assert_eq!(Some("b".to_string()), expr_with_alias.alias.map(|x|x.value));
17568    /// # Ok(())
17569    /// # }
17570    pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17571        let expr = self.parse_expr()?;
17572        let alias = if self.parse_keyword(Keyword::AS) {
17573            Some(self.parse_identifier()?)
17574        } else {
17575            None
17576        };
17577
17578        Ok(ExprWithAlias { expr, alias })
17579    }
17580
17581    /// Parse an expression followed by an optional alias; Unlike
17582    /// [Self::parse_expr_with_alias] the "AS" keyword between the expression
17583    /// and the alias is optional.
17584    fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17585        let expr = self.parse_expr()?;
17586        let alias = self.parse_identifier_optional_alias()?;
17587        Ok(ExprWithAlias { expr, alias })
17588    }
17589
17590    /// Parses a plain function call with an optional alias for the `PIVOT` clause
17591    fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17592        let function_name = match self.next_token().token {
17593            Token::Word(w) => Ok(w.value),
17594            _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17595        }?;
17596        let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17597        let alias = {
17598            fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17599                // ~ for a PIVOT aggregate function the alias must not be a "FOR"; in any dialect
17600                kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17601            }
17602            self.parse_optional_alias_inner(None, validator)?
17603        };
17604        Ok(ExprWithAlias { expr, alias })
17605    }
17606
17607    /// Parse a PIVOT table factor (ClickHouse/Oracle style pivot), returning a TableFactor.
17608    pub fn parse_pivot_table_factor(
17609        &mut self,
17610        table: TableFactor,
17611    ) -> Result<TableFactor, ParserError> {
17612        self.expect_token(&Token::LParen)?;
17613        let aggregate_functions =
17614            self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17615        self.expect_keyword_is(Keyword::FOR)?;
17616        let value_column = if self.peek_token_ref().token == Token::LParen {
17617            self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17618                p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17619            })?
17620        } else {
17621            vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17622        };
17623        self.expect_keyword_is(Keyword::IN)?;
17624
17625        self.expect_token(&Token::LParen)?;
17626        let value_source = if self.parse_keyword(Keyword::ANY) {
17627            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17628                self.parse_comma_separated(Parser::parse_order_by_expr)?
17629            } else {
17630                vec![]
17631            };
17632            PivotValueSource::Any(order_by)
17633        } else if self.peek_sub_query() {
17634            PivotValueSource::Subquery(self.parse_query()?)
17635        } else {
17636            PivotValueSource::List(
17637                self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17638            )
17639        };
17640        self.expect_token(&Token::RParen)?;
17641
17642        let default_on_null =
17643            if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17644                self.expect_token(&Token::LParen)?;
17645                let expr = self.parse_expr()?;
17646                self.expect_token(&Token::RParen)?;
17647                Some(expr)
17648            } else {
17649                None
17650            };
17651
17652        self.expect_token(&Token::RParen)?;
17653        let alias = self.maybe_parse_table_alias()?;
17654        Ok(TableFactor::Pivot {
17655            table: Box::new(table),
17656            aggregate_functions,
17657            value_column,
17658            value_source,
17659            default_on_null,
17660            alias,
17661        })
17662    }
17663
17664    /// Parse an UNPIVOT table factor, returning a TableFactor.
17665    pub fn parse_unpivot_table_factor(
17666        &mut self,
17667        table: TableFactor,
17668    ) -> Result<TableFactor, ParserError> {
17669        let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17670            self.expect_keyword_is(Keyword::NULLS)?;
17671            Some(NullInclusion::IncludeNulls)
17672        } else if self.parse_keyword(Keyword::EXCLUDE) {
17673            self.expect_keyword_is(Keyword::NULLS)?;
17674            Some(NullInclusion::ExcludeNulls)
17675        } else {
17676            None
17677        };
17678        self.expect_token(&Token::LParen)?;
17679        let value = self.parse_expr()?;
17680        self.expect_keyword_is(Keyword::FOR)?;
17681        let name = self.parse_identifier()?;
17682        self.expect_keyword_is(Keyword::IN)?;
17683        let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17684            p.parse_expr_with_alias()
17685        })?;
17686        self.expect_token(&Token::RParen)?;
17687        let alias = self.maybe_parse_table_alias()?;
17688        Ok(TableFactor::Unpivot {
17689            table: Box::new(table),
17690            value,
17691            null_inclusion,
17692            name,
17693            columns,
17694            alias,
17695        })
17696    }
17697
17698    /// Parse an object UNPIVOT table factor in FROM clause.
17699    ///
17700    /// Syntax:
17701    /// `UNPIVOT expression AS value_alias [AT attribute_alias]`
17702    pub fn parse_unpivot_expr_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17703        self.expect_keyword_is(Keyword::UNPIVOT)?;
17704        let expression = self.parse_expr()?;
17705        self.expect_keyword_is(Keyword::AS)?;
17706        let value_alias = self.parse_identifier()?;
17707        let attribute_alias = if self.parse_keyword(Keyword::AT) {
17708            Some(self.parse_identifier()?)
17709        } else {
17710            None
17711        };
17712
17713        Ok(TableFactor::UnpivotExpr {
17714            expression,
17715            value_alias,
17716            attribute_alias,
17717        })
17718    }
17719
17720    /// Parse a JOIN constraint (`NATURAL`, `ON <expr>`, `USING (...)`, or no constraint).
17721    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17722        if natural {
17723            Ok(JoinConstraint::Natural)
17724        } else if self.parse_keyword(Keyword::ON) {
17725            let constraint = self.parse_expr()?;
17726            Ok(JoinConstraint::On(constraint))
17727        } else if self.parse_keyword(Keyword::USING) {
17728            let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17729            Ok(JoinConstraint::Using(columns))
17730        } else {
17731            Ok(JoinConstraint::None)
17732            //self.expected_ref("ON, or USING after JOIN", self.peek_token_ref())
17733        }
17734    }
17735
17736    /// Parse a GRANT statement.
17737    pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17738        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17739
17740        self.expect_keyword_is(Keyword::TO)?;
17741        let grantees = self.parse_grantees()?;
17742
17743        let with_grant_option =
17744            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17745
17746        let current_grants =
17747            if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17748                Some(CurrentGrantsKind::CopyCurrentGrants)
17749            } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17750                Some(CurrentGrantsKind::RevokeCurrentGrants)
17751            } else {
17752                None
17753            };
17754
17755        let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17756            Some(self.parse_identifier()?)
17757        } else {
17758            None
17759        };
17760
17761        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17762            Some(self.parse_identifier()?)
17763        } else {
17764            None
17765        };
17766
17767        Ok(Grant {
17768            privileges,
17769            objects,
17770            grantees,
17771            with_grant_option,
17772            as_grantor,
17773            granted_by,
17774            current_grants,
17775        })
17776    }
17777
17778    fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17779        let mut values = vec![];
17780        let mut grantee_type = GranteesType::None;
17781        loop {
17782            let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17783                GranteesType::Role
17784            } else if self.parse_keyword(Keyword::USER) {
17785                GranteesType::User
17786            } else if self.parse_keyword(Keyword::SHARE) {
17787                GranteesType::Share
17788            } else if self.parse_keyword(Keyword::GROUP) {
17789                GranteesType::Group
17790            } else if self.parse_keyword(Keyword::PUBLIC) {
17791                GranteesType::Public
17792            } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17793                GranteesType::DatabaseRole
17794            } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17795                GranteesType::ApplicationRole
17796            } else if self.parse_keyword(Keyword::APPLICATION) {
17797                GranteesType::Application
17798            } else {
17799                grantee_type.clone() // keep from previous iteraton, if not specified
17800            };
17801
17802            if self
17803                .dialect
17804                .get_reserved_grantees_types()
17805                .contains(&new_grantee_type)
17806            {
17807                self.prev_token();
17808            } else {
17809                grantee_type = new_grantee_type;
17810            }
17811
17812            let grantee = if grantee_type == GranteesType::Public {
17813                Grantee {
17814                    grantee_type: grantee_type.clone(),
17815                    name: None,
17816                }
17817            } else {
17818                let mut name = self.parse_grantee_name()?;
17819                if self.consume_token(&Token::Colon) {
17820                    // Redshift supports namespace prefix for external users and groups:
17821                    // <Namespace>:<GroupName> or <Namespace>:<UserName>
17822                    // https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html
17823                    let ident = self.parse_identifier()?;
17824                    if let GranteeName::ObjectName(namespace) = name {
17825                        name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17826                            format!("{namespace}:{ident}"),
17827                        )]));
17828                    };
17829                }
17830                Grantee {
17831                    grantee_type: grantee_type.clone(),
17832                    name: Some(name),
17833                }
17834            };
17835
17836            values.push(grantee);
17837
17838            if !self.consume_token(&Token::Comma) {
17839                break;
17840            }
17841        }
17842
17843        Ok(values)
17844    }
17845
17846    /// Parse privileges and optional target objects for GRANT/DENY/REVOKE statements.
17847    pub fn parse_grant_deny_revoke_privileges_objects(
17848        &mut self,
17849    ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17850        let privileges = if self.parse_keyword(Keyword::ALL) {
17851            Privileges::All {
17852                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17853            }
17854        } else {
17855            let actions = self.parse_actions_list()?;
17856            Privileges::Actions(actions)
17857        };
17858
17859        let objects = if self.parse_keyword(Keyword::ON) {
17860            if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17861                Some(GrantObjects::AllTablesInSchema {
17862                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17863                })
17864            } else if self.parse_keywords(&[
17865                Keyword::ALL,
17866                Keyword::EXTERNAL,
17867                Keyword::TABLES,
17868                Keyword::IN,
17869                Keyword::SCHEMA,
17870            ]) {
17871                Some(GrantObjects::AllExternalTablesInSchema {
17872                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17873                })
17874            } else if self.parse_keywords(&[
17875                Keyword::ALL,
17876                Keyword::VIEWS,
17877                Keyword::IN,
17878                Keyword::SCHEMA,
17879            ]) {
17880                Some(GrantObjects::AllViewsInSchema {
17881                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17882                })
17883            } else if self.parse_keywords(&[
17884                Keyword::ALL,
17885                Keyword::MATERIALIZED,
17886                Keyword::VIEWS,
17887                Keyword::IN,
17888                Keyword::SCHEMA,
17889            ]) {
17890                Some(GrantObjects::AllMaterializedViewsInSchema {
17891                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17892                })
17893            } else if self.parse_keywords(&[
17894                Keyword::ALL,
17895                Keyword::FUNCTIONS,
17896                Keyword::IN,
17897                Keyword::SCHEMA,
17898            ]) {
17899                Some(GrantObjects::AllFunctionsInSchema {
17900                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17901                })
17902            } else if self.parse_keywords(&[
17903                Keyword::FUTURE,
17904                Keyword::SCHEMAS,
17905                Keyword::IN,
17906                Keyword::DATABASE,
17907            ]) {
17908                Some(GrantObjects::FutureSchemasInDatabase {
17909                    databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17910                })
17911            } else if self.parse_keywords(&[
17912                Keyword::FUTURE,
17913                Keyword::TABLES,
17914                Keyword::IN,
17915                Keyword::SCHEMA,
17916            ]) {
17917                Some(GrantObjects::FutureTablesInSchema {
17918                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17919                })
17920            } else if self.parse_keywords(&[
17921                Keyword::FUTURE,
17922                Keyword::EXTERNAL,
17923                Keyword::TABLES,
17924                Keyword::IN,
17925                Keyword::SCHEMA,
17926            ]) {
17927                Some(GrantObjects::FutureExternalTablesInSchema {
17928                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17929                })
17930            } else if self.parse_keywords(&[
17931                Keyword::FUTURE,
17932                Keyword::VIEWS,
17933                Keyword::IN,
17934                Keyword::SCHEMA,
17935            ]) {
17936                Some(GrantObjects::FutureViewsInSchema {
17937                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17938                })
17939            } else if self.parse_keywords(&[
17940                Keyword::FUTURE,
17941                Keyword::MATERIALIZED,
17942                Keyword::VIEWS,
17943                Keyword::IN,
17944                Keyword::SCHEMA,
17945            ]) {
17946                Some(GrantObjects::FutureMaterializedViewsInSchema {
17947                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17948                })
17949            } else if self.parse_keywords(&[
17950                Keyword::ALL,
17951                Keyword::SEQUENCES,
17952                Keyword::IN,
17953                Keyword::SCHEMA,
17954            ]) {
17955                Some(GrantObjects::AllSequencesInSchema {
17956                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17957                })
17958            } else if self.parse_keywords(&[
17959                Keyword::FUTURE,
17960                Keyword::SEQUENCES,
17961                Keyword::IN,
17962                Keyword::SCHEMA,
17963            ]) {
17964                Some(GrantObjects::FutureSequencesInSchema {
17965                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17966                })
17967            } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17968                Some(GrantObjects::ResourceMonitors(
17969                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17970                ))
17971            } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17972                Some(GrantObjects::ComputePools(
17973                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17974                ))
17975            } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17976                Some(GrantObjects::FailoverGroup(
17977                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17978                ))
17979            } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17980                Some(GrantObjects::ReplicationGroup(
17981                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17982                ))
17983            } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17984                Some(GrantObjects::ExternalVolumes(
17985                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
17986                ))
17987            } else {
17988                let object_type = self.parse_one_of_keywords(&[
17989                    Keyword::SEQUENCE,
17990                    Keyword::DATABASE,
17991                    Keyword::SCHEMA,
17992                    Keyword::TABLE,
17993                    Keyword::VIEW,
17994                    Keyword::WAREHOUSE,
17995                    Keyword::INTEGRATION,
17996                    Keyword::VIEW,
17997                    Keyword::WAREHOUSE,
17998                    Keyword::INTEGRATION,
17999                    Keyword::USER,
18000                    Keyword::CONNECTION,
18001                    Keyword::PROCEDURE,
18002                    Keyword::FUNCTION,
18003                ]);
18004                let objects =
18005                    self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
18006                match object_type {
18007                    Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
18008                    Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
18009                    Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
18010                    Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
18011                    Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
18012                    Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
18013                    Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
18014                    Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
18015                    kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
18016                        if let Some(name) = objects?.first() {
18017                            self.parse_grant_procedure_or_function(name, &kw)?
18018                        } else {
18019                            self.expected_ref("procedure or function name", self.peek_token_ref())?
18020                        }
18021                    }
18022                    Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
18023                    Some(unexpected_keyword) => return Err(ParserError::ParserError(
18024                        format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
18025                    )),
18026                }
18027            }
18028        } else {
18029            None
18030        };
18031
18032        Ok((privileges, objects))
18033    }
18034
18035    fn parse_grant_procedure_or_function(
18036        &mut self,
18037        name: &ObjectName,
18038        kw: &Option<Keyword>,
18039    ) -> Result<Option<GrantObjects>, ParserError> {
18040        let arg_types = if self.consume_token(&Token::LParen) {
18041            let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
18042            self.expect_token(&Token::RParen)?;
18043            list
18044        } else {
18045            vec![]
18046        };
18047        match kw {
18048            Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
18049                name: name.clone(),
18050                arg_types,
18051            })),
18052            Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
18053                name: name.clone(),
18054                arg_types,
18055            })),
18056            _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
18057        }
18058    }
18059
18060    /// Parse a single grantable permission/action (used within GRANT statements).
18061    pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
18062        fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
18063            let columns = parser.parse_parenthesized_column_list(Optional, false)?;
18064            if columns.is_empty() {
18065                Ok(None)
18066            } else {
18067                Ok(Some(columns))
18068            }
18069        }
18070
18071        // Multi-word privileges
18072        if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
18073            Ok(Action::ImportedPrivileges)
18074        } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
18075            Ok(Action::AddSearchOptimization)
18076        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
18077            Ok(Action::AttachListing)
18078        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
18079            Ok(Action::AttachPolicy)
18080        } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
18081            Ok(Action::BindServiceEndpoint)
18082        } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
18083            let role = self.parse_object_name(false)?;
18084            Ok(Action::DatabaseRole { role })
18085        } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
18086            Ok(Action::EvolveSchema)
18087        } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
18088            Ok(Action::ImportShare)
18089        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
18090            Ok(Action::ManageVersions)
18091        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
18092            Ok(Action::ManageReleases)
18093        } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
18094            Ok(Action::OverrideShareRestrictions)
18095        } else if self.parse_keywords(&[
18096            Keyword::PURCHASE,
18097            Keyword::DATA,
18098            Keyword::EXCHANGE,
18099            Keyword::LISTING,
18100        ]) {
18101            Ok(Action::PurchaseDataExchangeListing)
18102        } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
18103            Ok(Action::ResolveAll)
18104        } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
18105            Ok(Action::ReadSession)
18106
18107        // Single-word privileges
18108        } else if self.parse_keyword(Keyword::APPLY) {
18109            let apply_type = self.parse_action_apply_type()?;
18110            Ok(Action::Apply { apply_type })
18111        } else if self.parse_keyword(Keyword::APPLYBUDGET) {
18112            Ok(Action::ApplyBudget)
18113        } else if self.parse_keyword(Keyword::AUDIT) {
18114            Ok(Action::Audit)
18115        } else if self.parse_keyword(Keyword::CONNECT) {
18116            Ok(Action::Connect)
18117        } else if self.parse_keyword(Keyword::CREATE) {
18118            let obj_type = self.maybe_parse_action_create_object_type();
18119            Ok(Action::Create { obj_type })
18120        } else if self.parse_keyword(Keyword::DELETE) {
18121            Ok(Action::Delete)
18122        } else if self.parse_keyword(Keyword::EXEC) {
18123            let obj_type = self.maybe_parse_action_execute_obj_type();
18124            Ok(Action::Exec { obj_type })
18125        } else if self.parse_keyword(Keyword::EXECUTE) {
18126            let obj_type = self.maybe_parse_action_execute_obj_type();
18127            Ok(Action::Execute { obj_type })
18128        } else if self.parse_keyword(Keyword::FAILOVER) {
18129            Ok(Action::Failover)
18130        } else if self.parse_keyword(Keyword::INSERT) {
18131            Ok(Action::Insert {
18132                columns: parse_columns(self)?,
18133            })
18134        } else if self.parse_keyword(Keyword::MANAGE) {
18135            let manage_type = self.parse_action_manage_type()?;
18136            Ok(Action::Manage { manage_type })
18137        } else if self.parse_keyword(Keyword::MODIFY) {
18138            let modify_type = self.parse_action_modify_type();
18139            Ok(Action::Modify { modify_type })
18140        } else if self.parse_keyword(Keyword::MONITOR) {
18141            let monitor_type = self.parse_action_monitor_type();
18142            Ok(Action::Monitor { monitor_type })
18143        } else if self.parse_keyword(Keyword::OPERATE) {
18144            Ok(Action::Operate)
18145        } else if self.parse_keyword(Keyword::REFERENCES) {
18146            Ok(Action::References {
18147                columns: parse_columns(self)?,
18148            })
18149        } else if self.parse_keyword(Keyword::READ) {
18150            Ok(Action::Read)
18151        } else if self.parse_keyword(Keyword::REPLICATE) {
18152            Ok(Action::Replicate)
18153        } else if self.parse_keyword(Keyword::ROLE) {
18154            let role = self.parse_object_name(false)?;
18155            Ok(Action::Role { role })
18156        } else if self.parse_keyword(Keyword::SELECT) {
18157            Ok(Action::Select {
18158                columns: parse_columns(self)?,
18159            })
18160        } else if self.parse_keyword(Keyword::TEMPORARY) {
18161            Ok(Action::Temporary)
18162        } else if self.parse_keyword(Keyword::TRIGGER) {
18163            Ok(Action::Trigger)
18164        } else if self.parse_keyword(Keyword::TRUNCATE) {
18165            Ok(Action::Truncate)
18166        } else if self.parse_keyword(Keyword::UPDATE) {
18167            Ok(Action::Update {
18168                columns: parse_columns(self)?,
18169            })
18170        } else if self.parse_keyword(Keyword::USAGE) {
18171            Ok(Action::Usage)
18172        } else if self.parse_keyword(Keyword::OWNERSHIP) {
18173            Ok(Action::Ownership)
18174        } else if self.parse_keyword(Keyword::DROP) {
18175            Ok(Action::Drop)
18176        } else {
18177            self.expected_ref("a privilege keyword", self.peek_token_ref())?
18178        }
18179    }
18180
18181    fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
18182        // Multi-word object types
18183        if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
18184            Some(ActionCreateObjectType::ApplicationPackage)
18185        } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18186            Some(ActionCreateObjectType::ComputePool)
18187        } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
18188            Some(ActionCreateObjectType::DataExchangeListing)
18189        } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18190            Some(ActionCreateObjectType::ExternalVolume)
18191        } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18192            Some(ActionCreateObjectType::FailoverGroup)
18193        } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
18194            Some(ActionCreateObjectType::NetworkPolicy)
18195        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
18196            Some(ActionCreateObjectType::OrganiationListing)
18197        } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18198            Some(ActionCreateObjectType::ReplicationGroup)
18199        }
18200        // Single-word object types
18201        else if self.parse_keyword(Keyword::ACCOUNT) {
18202            Some(ActionCreateObjectType::Account)
18203        } else if self.parse_keyword(Keyword::APPLICATION) {
18204            Some(ActionCreateObjectType::Application)
18205        } else if self.parse_keyword(Keyword::DATABASE) {
18206            Some(ActionCreateObjectType::Database)
18207        } else if self.parse_keyword(Keyword::INTEGRATION) {
18208            Some(ActionCreateObjectType::Integration)
18209        } else if self.parse_keyword(Keyword::ROLE) {
18210            Some(ActionCreateObjectType::Role)
18211        } else if self.parse_keyword(Keyword::SCHEMA) {
18212            Some(ActionCreateObjectType::Schema)
18213        } else if self.parse_keyword(Keyword::SHARE) {
18214            Some(ActionCreateObjectType::Share)
18215        } else if self.parse_keyword(Keyword::USER) {
18216            Some(ActionCreateObjectType::User)
18217        } else if self.parse_keyword(Keyword::WAREHOUSE) {
18218            Some(ActionCreateObjectType::Warehouse)
18219        } else {
18220            None
18221        }
18222    }
18223
18224    fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
18225        if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
18226            Ok(ActionApplyType::AggregationPolicy)
18227        } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
18228            Ok(ActionApplyType::AuthenticationPolicy)
18229        } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
18230            Ok(ActionApplyType::JoinPolicy)
18231        } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
18232            Ok(ActionApplyType::MaskingPolicy)
18233        } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
18234            Ok(ActionApplyType::PackagesPolicy)
18235        } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
18236            Ok(ActionApplyType::PasswordPolicy)
18237        } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
18238            Ok(ActionApplyType::ProjectionPolicy)
18239        } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
18240            Ok(ActionApplyType::RowAccessPolicy)
18241        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
18242            Ok(ActionApplyType::SessionPolicy)
18243        } else if self.parse_keyword(Keyword::TAG) {
18244            Ok(ActionApplyType::Tag)
18245        } else {
18246            self.expected_ref("GRANT APPLY type", self.peek_token_ref())
18247        }
18248    }
18249
18250    fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
18251        if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
18252            Some(ActionExecuteObjectType::DataMetricFunction)
18253        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
18254            Some(ActionExecuteObjectType::ManagedAlert)
18255        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
18256            Some(ActionExecuteObjectType::ManagedTask)
18257        } else if self.parse_keyword(Keyword::ALERT) {
18258            Some(ActionExecuteObjectType::Alert)
18259        } else if self.parse_keyword(Keyword::TASK) {
18260            Some(ActionExecuteObjectType::Task)
18261        } else {
18262            None
18263        }
18264    }
18265
18266    fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
18267        if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
18268            Ok(ActionManageType::AccountSupportCases)
18269        } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
18270            Ok(ActionManageType::EventSharing)
18271        } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
18272            Ok(ActionManageType::ListingAutoFulfillment)
18273        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
18274            Ok(ActionManageType::OrganizationSupportCases)
18275        } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
18276            Ok(ActionManageType::UserSupportCases)
18277        } else if self.parse_keyword(Keyword::GRANTS) {
18278            Ok(ActionManageType::Grants)
18279        } else if self.parse_keyword(Keyword::WAREHOUSES) {
18280            Ok(ActionManageType::Warehouses)
18281        } else {
18282            self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
18283        }
18284    }
18285
18286    fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
18287        if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
18288            Some(ActionModifyType::LogLevel)
18289        } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
18290            Some(ActionModifyType::TraceLevel)
18291        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
18292            Some(ActionModifyType::SessionLogLevel)
18293        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
18294            Some(ActionModifyType::SessionTraceLevel)
18295        } else {
18296            None
18297        }
18298    }
18299
18300    fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
18301        if self.parse_keyword(Keyword::EXECUTION) {
18302            Some(ActionMonitorType::Execution)
18303        } else if self.parse_keyword(Keyword::SECURITY) {
18304            Some(ActionMonitorType::Security)
18305        } else if self.parse_keyword(Keyword::USAGE) {
18306            Some(ActionMonitorType::Usage)
18307        } else {
18308            None
18309        }
18310    }
18311
18312    /// Parse a grantee name, possibly with a host qualifier (user@host).
18313    pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
18314        let mut name = self.parse_object_name(false)?;
18315        if self.dialect.supports_user_host_grantee()
18316            && name.0.len() == 1
18317            && name.0[0].as_ident().is_some()
18318            && self.consume_token(&Token::AtSign)
18319        {
18320            let user = name.0.pop().unwrap().as_ident().unwrap().clone();
18321            let host = self.parse_identifier()?;
18322            Ok(GranteeName::UserHost { user, host })
18323        } else {
18324            Ok(GranteeName::ObjectName(name))
18325        }
18326    }
18327
18328    /// Parse [`Statement::Deny`]
18329    pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
18330        self.expect_keyword(Keyword::DENY)?;
18331
18332        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18333        let objects = match objects {
18334            Some(o) => o,
18335            None => {
18336                return parser_err!(
18337                    "DENY statements must specify an object",
18338                    self.peek_token_ref().span.start
18339                )
18340            }
18341        };
18342
18343        self.expect_keyword_is(Keyword::TO)?;
18344        let grantees = self.parse_grantees()?;
18345        let cascade = self.parse_cascade_option();
18346        let granted_by = if self.parse_keywords(&[Keyword::AS]) {
18347            Some(self.parse_identifier()?)
18348        } else {
18349            None
18350        };
18351
18352        Ok(Statement::Deny(DenyStatement {
18353            privileges,
18354            objects,
18355            grantees,
18356            cascade,
18357            granted_by,
18358        }))
18359    }
18360
18361    /// Parse a REVOKE statement
18362    pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
18363        let grant_option_for =
18364            self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
18365
18366        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18367
18368        self.expect_keyword_is(Keyword::FROM)?;
18369        let grantees = self.parse_grantees()?;
18370
18371        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
18372            Some(self.parse_identifier()?)
18373        } else {
18374            None
18375        };
18376
18377        let cascade = self.parse_cascade_option();
18378
18379        Ok(Revoke {
18380            grant_option_for,
18381            privileges,
18382            objects,
18383            grantees,
18384            granted_by,
18385            cascade,
18386        })
18387    }
18388
18389    /// Parse an REPLACE statement
18390    pub fn parse_replace(
18391        &mut self,
18392        replace_token: TokenWithSpan,
18393    ) -> Result<Statement, ParserError> {
18394        if !dialect_of!(self is MySqlDialect | GenericDialect) {
18395            return parser_err!(
18396                "Unsupported statement REPLACE",
18397                self.peek_token_ref().span.start
18398            );
18399        }
18400
18401        let mut insert = self.parse_insert(replace_token)?;
18402        if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
18403            *replace_into = true;
18404        }
18405
18406        Ok(insert)
18407    }
18408
18409    /// Parse an INSERT statement, returning a `Box`ed SetExpr
18410    ///
18411    /// This is used to reduce the size of the stack frames in debug builds
18412    fn parse_insert_setexpr_boxed(
18413        &mut self,
18414        insert_token: TokenWithSpan,
18415    ) -> Result<Box<SetExpr>, ParserError> {
18416        Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
18417    }
18418
18419    /// Parse an INSERT statement
18420    pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
18421        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18422        let or = self.parse_conflict_clause();
18423        let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
18424            None
18425        } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
18426            Some(MysqlInsertPriority::LowPriority)
18427        } else if self.parse_keyword(Keyword::DELAYED) {
18428            Some(MysqlInsertPriority::Delayed)
18429        } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
18430            Some(MysqlInsertPriority::HighPriority)
18431        } else {
18432            None
18433        };
18434
18435        let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
18436            && self.parse_keyword(Keyword::IGNORE);
18437
18438        let replace_into = false;
18439
18440        let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18441        let into = self.parse_keyword(Keyword::INTO);
18442
18443        let local = self.parse_keyword(Keyword::LOCAL);
18444
18445        if self.parse_keyword(Keyword::DIRECTORY) {
18446            let path = self.parse_literal_string()?;
18447            let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18448                Some(self.parse_file_format()?)
18449            } else {
18450                None
18451            };
18452            let source = self.parse_query()?;
18453            Ok(Statement::Directory {
18454                local,
18455                path,
18456                overwrite,
18457                file_format,
18458                source,
18459            })
18460        } else {
18461            // Hive lets you put table here regardless
18462            let table = self.parse_keyword(Keyword::TABLE);
18463            let table_object = self.parse_table_object()?;
18464
18465            let table_alias = if self.dialect.supports_insert_table_alias()
18466                && !self.peek_sub_query()
18467                && self
18468                    .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18469                    .is_none()
18470            {
18471                if self.parse_keyword(Keyword::AS) {
18472                    Some(TableAliasWithoutColumns {
18473                        explicit: true,
18474                        alias: self.parse_identifier()?,
18475                    })
18476                } else {
18477                    self.maybe_parse(|parser| parser.parse_identifier())?
18478                        .map(|alias| TableAliasWithoutColumns {
18479                            explicit: false,
18480                            alias,
18481                        })
18482                }
18483            } else {
18484                None
18485            };
18486
18487            let is_mysql = dialect_of!(self is MySqlDialect);
18488
18489            let (columns, partitioned, after_columns, output, source, assignments) = if self
18490                .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18491            {
18492                (vec![], None, vec![], None, None, vec![])
18493            } else {
18494                let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18495                    let columns =
18496                        self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18497
18498                    let partitioned = self.parse_insert_partition()?;
18499                    // Hive allows you to specify columns after partitions as well if you want.
18500                    let after_columns = if dialect_of!(self is HiveDialect) {
18501                        self.parse_parenthesized_column_list(Optional, false)?
18502                    } else {
18503                        vec![]
18504                    };
18505                    (columns, partitioned, after_columns)
18506                } else {
18507                    Default::default()
18508                };
18509
18510                let output = self.maybe_parse_output_clause()?;
18511
18512                let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18513                    || self.peek_keyword(Keyword::SETTINGS)
18514                {
18515                    (None, vec![])
18516                } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18517                    (None, self.parse_comma_separated(Parser::parse_assignment)?)
18518                } else {
18519                    (Some(self.parse_query()?), vec![])
18520                };
18521
18522                (
18523                    columns,
18524                    partitioned,
18525                    after_columns,
18526                    output,
18527                    source,
18528                    assignments,
18529                )
18530            };
18531
18532            let (format_clause, settings) = if self.dialect.supports_insert_format() {
18533                // Settings always comes before `FORMAT` for ClickHouse:
18534                // <https://clickhouse.com/docs/en/sql-reference/statements/insert-into>
18535                let settings = self.parse_settings()?;
18536
18537                let format = if self.parse_keyword(Keyword::FORMAT) {
18538                    Some(self.parse_input_format_clause()?)
18539                } else {
18540                    None
18541                };
18542
18543                (format, settings)
18544            } else {
18545                Default::default()
18546            };
18547
18548            let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18549                && self.parse_keyword(Keyword::AS)
18550            {
18551                let row_alias = self.parse_object_name(false)?;
18552                let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18553                Some(InsertAliases {
18554                    row_alias,
18555                    col_aliases,
18556                })
18557            } else {
18558                None
18559            };
18560
18561            let on = if self.parse_keyword(Keyword::ON) {
18562                if self.parse_keyword(Keyword::CONFLICT) {
18563                    let conflict_target =
18564                        if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18565                            Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18566                        } else if self.peek_token_ref().token == Token::LParen {
18567                            Some(ConflictTarget::Columns(
18568                                self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18569                            ))
18570                        } else {
18571                            None
18572                        };
18573
18574                    self.expect_keyword_is(Keyword::DO)?;
18575                    let action = if self.parse_keyword(Keyword::NOTHING) {
18576                        OnConflictAction::DoNothing
18577                    } else {
18578                        self.expect_keyword_is(Keyword::UPDATE)?;
18579                        self.expect_keyword_is(Keyword::SET)?;
18580                        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18581                        let selection = if self.parse_keyword(Keyword::WHERE) {
18582                            Some(self.parse_expr()?)
18583                        } else {
18584                            None
18585                        };
18586                        OnConflictAction::DoUpdate(DoUpdate {
18587                            assignments,
18588                            selection,
18589                        })
18590                    };
18591
18592                    Some(OnInsert::OnConflict(OnConflict {
18593                        conflict_target,
18594                        action,
18595                    }))
18596                } else {
18597                    self.expect_keyword_is(Keyword::DUPLICATE)?;
18598                    self.expect_keyword_is(Keyword::KEY)?;
18599                    self.expect_keyword_is(Keyword::UPDATE)?;
18600                    let l = self.parse_comma_separated(Parser::parse_assignment)?;
18601
18602                    Some(OnInsert::DuplicateKeyUpdate(l))
18603                }
18604            } else {
18605                None
18606            };
18607
18608            let returning = if self.parse_keyword(Keyword::RETURNING) {
18609                Some(self.parse_comma_separated(Parser::parse_select_item)?)
18610            } else {
18611                None
18612            };
18613
18614            Ok(Insert {
18615                insert_token: insert_token.into(),
18616                optimizer_hints,
18617                or,
18618                table: table_object,
18619                table_alias,
18620                ignore,
18621                into,
18622                overwrite,
18623                partitioned,
18624                columns,
18625                after_columns,
18626                source,
18627                assignments,
18628                has_table_keyword: table,
18629                on,
18630                returning,
18631                output,
18632                replace_into,
18633                priority,
18634                insert_alias,
18635                settings,
18636                format_clause,
18637                multi_table_insert_type: None,
18638                multi_table_into_clauses: vec![],
18639                multi_table_when_clauses: vec![],
18640                multi_table_else_clause: None,
18641            }
18642            .into())
18643        }
18644    }
18645
18646    /// Parses input format clause used for ClickHouse.
18647    ///
18648    /// <https://clickhouse.com/docs/en/interfaces/formats>
18649    pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18650        let ident = self.parse_identifier()?;
18651        let values = self
18652            .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18653            .unwrap_or_default();
18654
18655        Ok(InputFormatClause { ident, values })
18656    }
18657
18658    /// Returns true if the immediate tokens look like the
18659    /// beginning of a subquery. `(SELECT ...` or `((SELECT ...` etc.
18660    fn peek_subquery_start(&mut self) -> bool {
18661        // Handle (SELECT, ((SELECT, (((SELECT, etc.
18662        // This makes INSERT consistent with other contexts where nested
18663        // parentheses around subqueries are handled by recursive descent.
18664        let mut i = 0;
18665        loop {
18666            match &self.peek_nth_token_ref(i).token {
18667                Token::LParen => i += 1,
18668                Token::Word(w) if w.keyword == Keyword::SELECT => return i > 0,
18669                _ => return false,
18670            }
18671        }
18672    }
18673
18674    /// Returns true if the immediate tokens look like the
18675    /// beginning of a subquery possibly preceded by CTEs;
18676    /// i.e. `(WITH ...` or `(SELECT ...`.
18677    fn peek_subquery_or_cte_start(&mut self) -> bool {
18678        matches!(
18679            self.peek_tokens_ref(),
18680            [
18681                TokenWithSpan {
18682                    token: Token::LParen,
18683                    ..
18684                },
18685                TokenWithSpan {
18686                    token: Token::Word(Word {
18687                        keyword: Keyword::SELECT | Keyword::WITH,
18688                        ..
18689                    }),
18690                    ..
18691                },
18692            ]
18693        )
18694    }
18695
18696    fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18697        if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18698            Some(SqliteOnConflict::Replace)
18699        } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18700            Some(SqliteOnConflict::Rollback)
18701        } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18702            Some(SqliteOnConflict::Abort)
18703        } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18704            Some(SqliteOnConflict::Fail)
18705        } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18706            Some(SqliteOnConflict::Ignore)
18707        } else if self.parse_keyword(Keyword::REPLACE) {
18708            Some(SqliteOnConflict::Replace)
18709        } else {
18710            None
18711        }
18712    }
18713
18714    /// Parse an optional `PARTITION (...)` clause for INSERT statements.
18715    pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18716        if self.parse_keyword(Keyword::PARTITION) {
18717            self.expect_token(&Token::LParen)?;
18718            let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18719            self.expect_token(&Token::RParen)?;
18720            Ok(partition_cols)
18721        } else {
18722            Ok(None)
18723        }
18724    }
18725
18726    /// Parse optional Hive `INPUTFORMAT ... SERDE ...` clause used by LOAD DATA.
18727    pub fn parse_load_data_table_format(
18728        &mut self,
18729    ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18730        if self.parse_keyword(Keyword::INPUTFORMAT) {
18731            let input_format = self.parse_expr()?;
18732            self.expect_keyword_is(Keyword::SERDE)?;
18733            let serde = self.parse_expr()?;
18734            Ok(Some(HiveLoadDataFormat {
18735                input_format,
18736                serde,
18737            }))
18738        } else {
18739            Ok(None)
18740        }
18741    }
18742
18743    /// Parse an UPDATE statement, returning a `Box`ed SetExpr
18744    ///
18745    /// This is used to reduce the size of the stack frames in debug builds
18746    fn parse_update_setexpr_boxed(
18747        &mut self,
18748        update_token: TokenWithSpan,
18749    ) -> Result<Box<SetExpr>, ParserError> {
18750        Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18751    }
18752
18753    /// Parse an `UPDATE` statement and return `Statement::Update`.
18754    pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18755        let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18756        let or = self.parse_conflict_clause();
18757        let table = self.parse_table_and_joins()?;
18758        let from_before_set = if self.parse_keyword(Keyword::FROM) {
18759            Some(UpdateTableFromKind::BeforeSet(
18760                self.parse_table_with_joins()?,
18761            ))
18762        } else {
18763            None
18764        };
18765        self.expect_keyword(Keyword::SET)?;
18766        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18767
18768        let output = self.maybe_parse_output_clause()?;
18769
18770        let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18771            Some(UpdateTableFromKind::AfterSet(
18772                self.parse_table_with_joins()?,
18773            ))
18774        } else {
18775            from_before_set
18776        };
18777        let selection = if self.parse_keyword(Keyword::WHERE) {
18778            Some(self.parse_expr()?)
18779        } else {
18780            None
18781        };
18782        let returning = if self.parse_keyword(Keyword::RETURNING) {
18783            Some(self.parse_comma_separated(Parser::parse_select_item)?)
18784        } else {
18785            None
18786        };
18787        let order_by = if self.dialect.supports_update_order_by()
18788            && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18789        {
18790            self.parse_comma_separated(Parser::parse_order_by_expr)?
18791        } else {
18792            vec![]
18793        };
18794        let limit = if self.parse_keyword(Keyword::LIMIT) {
18795            Some(self.parse_expr()?)
18796        } else {
18797            None
18798        };
18799        Ok(Update {
18800            update_token: update_token.into(),
18801            optimizer_hints,
18802            table,
18803            assignments,
18804            from,
18805            selection,
18806            returning,
18807            output,
18808            or,
18809            order_by,
18810            limit,
18811        }
18812        .into())
18813    }
18814
18815    /// Parse a `var = expr` assignment, used in an UPDATE statement
18816    pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18817        let target = self.parse_assignment_target()?;
18818        self.expect_token(&Token::Eq)?;
18819        let value = self.parse_expr()?;
18820        Ok(Assignment { target, value })
18821    }
18822
18823    /// Parse the left-hand side of an assignment, used in an UPDATE statement
18824    pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18825        if self.consume_token(&Token::LParen) {
18826            let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18827            self.expect_token(&Token::RParen)?;
18828            Ok(AssignmentTarget::Tuple(columns))
18829        } else {
18830            let column = self.parse_object_name(false)?;
18831            Ok(AssignmentTarget::ColumnName(column))
18832        }
18833    }
18834
18835    /// Parse a single function argument, handling named and unnamed variants.
18836    pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18837        // Parse the argument expression once, then check for a named-arg
18838        // operator. Parsing it speculatively and re-parsing on the unnamed
18839        // path is O(2^depth) on nested calls like `CAST(CASE (CAST(CASE (…`.
18840        if self.dialect.supports_named_fn_args_with_expr_name() {
18841            let expr = self.parse_wildcard_expr()?;
18842            // A wildcard is never a named-arg name; only the unnamed form applies.
18843            if !matches!(expr, Expr::Wildcard(_) | Expr::QualifiedWildcard(..)) {
18844                if let Some(operator) =
18845                    self.maybe_parse(|p| p.parse_function_named_arg_operator())?
18846                {
18847                    let arg = self.parse_wildcard_expr()?.into();
18848                    return Ok(FunctionArg::ExprNamed {
18849                        name: expr,
18850                        arg,
18851                        operator,
18852                    });
18853                }
18854            }
18855            let arg_expr = self.function_arg_expr_from_wildcard(expr)?;
18856            return Ok(FunctionArg::Unnamed(
18857                self.maybe_parse_aliased_function_arg(arg_expr)?,
18858            ));
18859        }
18860
18861        let arg = self.maybe_parse(|p| {
18862            let name = p.parse_identifier()?;
18863            let operator = p.parse_function_named_arg_operator()?;
18864            let arg = p.parse_wildcard_expr()?.into();
18865            Ok(FunctionArg::Named {
18866                name,
18867                arg,
18868                operator,
18869            })
18870        })?;
18871        if let Some(arg) = arg {
18872            return Ok(arg);
18873        }
18874        let wildcard_expr = self.parse_wildcard_expr()?;
18875        let arg_expr = self.function_arg_expr_from_wildcard(wildcard_expr)?;
18876        Ok(FunctionArg::Unnamed(
18877            self.maybe_parse_aliased_function_arg(arg_expr)?,
18878        ))
18879    }
18880
18881    /// Wrap an already-parsed expression as a function argument, parsing any
18882    /// trailing wildcard options (e.g. Snowflake's `HASH(* EXCLUDE(col))`).
18883    fn function_arg_expr_from_wildcard(
18884        &mut self,
18885        wildcard_expr: Expr,
18886    ) -> Result<FunctionArgExpr, ParserError> {
18887        Ok(match wildcard_expr {
18888            Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18889                // Parse the options the same way SELECT items do.
18890                let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18891                if opts.opt_exclude.is_some()
18892                    || opts.opt_except.is_some()
18893                    || opts.opt_replace.is_some()
18894                    || opts.opt_rename.is_some()
18895                    || opts.opt_ilike.is_some()
18896                {
18897                    FunctionArgExpr::WildcardWithOptions(opts)
18898                } else {
18899                    wildcard_expr.into()
18900                }
18901            }
18902            other => other.into(),
18903        })
18904    }
18905
18906    /// Parse an optional `AS <alias>` on an unnamed function argument
18907    /// (e.g. `XMLFOREST(a AS x)` in PostgreSQL).
18908    fn maybe_parse_aliased_function_arg(
18909        &mut self,
18910        arg_expr: FunctionArgExpr,
18911    ) -> Result<FunctionArgExpr, ParserError> {
18912        Ok(match arg_expr {
18913            FunctionArgExpr::Expr(expr)
18914                if self.dialect.supports_aliased_function_args()
18915                    && self.parse_keyword(Keyword::AS) =>
18916            {
18917                FunctionArgExpr::Expr(Expr::Named {
18918                    expr: expr.into(),
18919                    name: self.parse_identifier()?,
18920                })
18921            }
18922            other => other,
18923        })
18924    }
18925
18926    fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18927        if self.parse_keyword(Keyword::VALUE) {
18928            return Ok(FunctionArgOperator::Value);
18929        }
18930        let tok = self.next_token();
18931        match tok.token {
18932            Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18933                Ok(FunctionArgOperator::RightArrow)
18934            }
18935            Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18936                Ok(FunctionArgOperator::Equals)
18937            }
18938            Token::Assignment
18939                if self
18940                    .dialect
18941                    .supports_named_fn_args_with_assignment_operator() =>
18942            {
18943                Ok(FunctionArgOperator::Assignment)
18944            }
18945            Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18946                Ok(FunctionArgOperator::Colon)
18947            }
18948            _ => {
18949                self.prev_token();
18950                self.expected("argument operator", tok)
18951            }
18952        }
18953    }
18954
18955    /// Parse an optional, comma-separated list of function arguments (consumes closing paren).
18956    pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18957        if self.consume_token(&Token::RParen) {
18958            Ok(vec![])
18959        } else {
18960            let args = self.parse_comma_separated(Parser::parse_function_args)?;
18961            self.expect_token(&Token::RParen)?;
18962            Ok(args)
18963        }
18964    }
18965
18966    fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18967        if self.consume_token(&Token::RParen) {
18968            return Ok(TableFunctionArgs {
18969                args: vec![],
18970                settings: None,
18971            });
18972        }
18973        let mut args = vec![];
18974        let settings = loop {
18975            if let Some(settings) = self.parse_settings()? {
18976                break Some(settings);
18977            }
18978            args.push(self.parse_function_args()?);
18979            if self.is_parse_comma_separated_end() {
18980                break None;
18981            }
18982        };
18983        self.expect_token(&Token::RParen)?;
18984        Ok(TableFunctionArgs { args, settings })
18985    }
18986
18987    /// Parses a potentially empty list of arguments to a function
18988    /// (including the closing parenthesis).
18989    ///
18990    /// Examples:
18991    /// ```sql
18992    /// FIRST_VALUE(x ORDER BY 1,2,3);
18993    /// FIRST_VALUE(x IGNORE NULL);
18994    /// ```
18995    fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18996        let mut clauses = vec![];
18997
18998        // Handle clauses that may exist with an empty argument list
18999
19000        if let Some(null_clause) = self.parse_json_null_clause() {
19001            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19002        }
19003
19004        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19005            clauses.push(FunctionArgumentClause::JsonReturningClause(
19006                json_returning_clause,
19007            ));
19008        }
19009
19010        if self.consume_token(&Token::RParen) {
19011            return Ok(FunctionArgumentList {
19012                duplicate_treatment: None,
19013                args: vec![],
19014                clauses,
19015            });
19016        }
19017
19018        let duplicate_treatment = self.parse_duplicate_treatment()?;
19019        let args = self.parse_comma_separated(Parser::parse_function_args)?;
19020
19021        if self.parse_keyword(Keyword::WHERE) {
19022            clauses.push(FunctionArgumentClause::Where(self.parse_expr()?));
19023        }
19024
19025        if self.dialect.supports_window_function_null_treatment_arg() {
19026            if let Some(null_treatment) = self.parse_null_treatment()? {
19027                clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
19028            }
19029        }
19030
19031        if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
19032            clauses.push(FunctionArgumentClause::OrderBy(
19033                self.parse_comma_separated(Parser::parse_order_by_expr)?,
19034            ));
19035        }
19036
19037        if self.parse_keyword(Keyword::LIMIT) {
19038            clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
19039        }
19040
19041        if dialect_of!(self is GenericDialect | BigQueryDialect)
19042            && self.parse_keyword(Keyword::HAVING)
19043        {
19044            let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
19045                Keyword::MIN => HavingBoundKind::Min,
19046                Keyword::MAX => HavingBoundKind::Max,
19047                unexpected_keyword => return Err(ParserError::ParserError(
19048                    format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
19049                )),
19050            };
19051            clauses.push(FunctionArgumentClause::Having(HavingBound(
19052                kind,
19053                self.parse_expr()?,
19054            )))
19055        }
19056
19057        if dialect_of!(self is GenericDialect | MySqlDialect)
19058            && self.parse_keyword(Keyword::SEPARATOR)
19059        {
19060            clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
19061        }
19062
19063        if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
19064            clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
19065        }
19066
19067        if let Some(null_clause) = self.parse_json_null_clause() {
19068            clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19069        }
19070
19071        if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19072            clauses.push(FunctionArgumentClause::JsonReturningClause(
19073                json_returning_clause,
19074            ));
19075        }
19076
19077        self.expect_token(&Token::RParen)?;
19078        Ok(FunctionArgumentList {
19079            duplicate_treatment,
19080            args,
19081            clauses,
19082        })
19083    }
19084
19085    fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
19086        if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
19087            Some(JsonNullClause::AbsentOnNull)
19088        } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
19089            Some(JsonNullClause::NullOnNull)
19090        } else {
19091            None
19092        }
19093    }
19094
19095    fn maybe_parse_json_returning_clause(
19096        &mut self,
19097    ) -> Result<Option<JsonReturningClause>, ParserError> {
19098        if self.parse_keyword(Keyword::RETURNING) {
19099            let data_type = self.parse_data_type()?;
19100            Ok(Some(JsonReturningClause { data_type }))
19101        } else {
19102            Ok(None)
19103        }
19104    }
19105
19106    fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
19107        let loc = self.peek_token_ref().span.start;
19108        match (
19109            self.parse_keyword(Keyword::ALL),
19110            self.parse_keyword(Keyword::DISTINCT),
19111        ) {
19112            (true, false) => Ok(Some(DuplicateTreatment::All)),
19113            (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
19114            (false, false) => Ok(None),
19115            (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
19116        }
19117    }
19118
19119    /// Parse a comma-delimited list of projections after SELECT
19120    pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
19121        let prefix = self
19122            .parse_one_of_keywords(
19123                self.dialect
19124                    .get_reserved_keywords_for_select_item_operator(),
19125            )
19126            .map(|keyword| Ident::new(format!("{keyword:?}")));
19127
19128        match self.parse_wildcard_expr()? {
19129            Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
19130                SelectItemQualifiedWildcardKind::ObjectName(prefix),
19131                self.parse_wildcard_additional_options(token.0)?,
19132            )),
19133            Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
19134                self.parse_wildcard_additional_options(token.0)?,
19135            )),
19136            Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
19137                parser_err!(
19138                    format!("Expected an expression, found: {}", v),
19139                    self.peek_token_ref().span.start
19140                )
19141            }
19142            Expr::BinaryOp {
19143                left,
19144                op: BinaryOperator::Eq,
19145                right,
19146            } if self.dialect.supports_eq_alias_assignment()
19147                && matches!(left.as_ref(), Expr::Identifier(_)) =>
19148            {
19149                let Expr::Identifier(alias) = *left else {
19150                    return parser_err!(
19151                        "BUG: expected identifier expression as alias",
19152                        self.peek_token_ref().span.start
19153                    );
19154                };
19155                Ok(SelectItem::ExprWithAlias {
19156                    expr: *right,
19157                    alias,
19158                })
19159            }
19160            expr if self.dialect.supports_select_expr_star()
19161                && self.consume_tokens(&[Token::Period, Token::Mul]) =>
19162            {
19163                let wildcard_token = self.get_previous_token().clone();
19164                Ok(SelectItem::QualifiedWildcard(
19165                    SelectItemQualifiedWildcardKind::Expr(expr),
19166                    self.parse_wildcard_additional_options(wildcard_token)?,
19167                ))
19168            }
19169            expr if self.dialect.supports_select_item_multi_column_alias()
19170                && self.peek_keyword(Keyword::AS)
19171                && self.peek_nth_token(1).token == Token::LParen =>
19172            {
19173                self.expect_keyword(Keyword::AS)?;
19174                self.expect_token(&Token::LParen)?;
19175                let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
19176                self.expect_token(&Token::RParen)?;
19177                Ok(SelectItem::ExprWithAliases {
19178                    expr: maybe_prefixed_expr(expr, prefix),
19179                    aliases,
19180                })
19181            }
19182            expr => self
19183                .maybe_parse_select_item_alias()
19184                .map(|alias| match alias {
19185                    Some(alias) => SelectItem::ExprWithAlias {
19186                        expr: maybe_prefixed_expr(expr, prefix),
19187                        alias,
19188                    },
19189                    None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
19190                }),
19191        }
19192    }
19193
19194    /// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
19195    ///
19196    /// If it is not possible to parse it, will return an option.
19197    pub fn parse_wildcard_additional_options(
19198        &mut self,
19199        wildcard_token: TokenWithSpan,
19200    ) -> Result<WildcardAdditionalOptions, ParserError> {
19201        let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
19202            self.parse_optional_select_item_ilike()?
19203        } else {
19204            None
19205        };
19206        let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
19207        {
19208            self.parse_optional_select_item_exclude()?
19209        } else {
19210            None
19211        };
19212        let opt_except = if self.dialect.supports_select_wildcard_except() {
19213            self.parse_optional_select_item_except()?
19214        } else {
19215            None
19216        };
19217        let opt_replace = if self.dialect.supports_select_wildcard_replace() {
19218            self.parse_optional_select_item_replace()?
19219        } else {
19220            None
19221        };
19222        let opt_rename = if self.dialect.supports_select_wildcard_rename() {
19223            self.parse_optional_select_item_rename()?
19224        } else {
19225            None
19226        };
19227
19228        let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
19229            self.maybe_parse_select_item_alias()?
19230        } else {
19231            None
19232        };
19233
19234        Ok(WildcardAdditionalOptions {
19235            wildcard_token: wildcard_token.into(),
19236            opt_ilike,
19237            opt_exclude,
19238            opt_except,
19239            opt_rename,
19240            opt_replace,
19241            opt_alias,
19242        })
19243    }
19244
19245    /// Parse an [`Ilike`](IlikeSelectItem) information for wildcard select items.
19246    ///
19247    /// If it is not possible to parse it, will return an option.
19248    pub fn parse_optional_select_item_ilike(
19249        &mut self,
19250    ) -> Result<Option<IlikeSelectItem>, ParserError> {
19251        let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
19252            let next_token = self.next_token();
19253            let pattern = match next_token.token {
19254                Token::SingleQuotedString(s) => s,
19255                _ => return self.expected("ilike pattern", next_token),
19256            };
19257            Some(IlikeSelectItem { pattern })
19258        } else {
19259            None
19260        };
19261        Ok(opt_ilike)
19262    }
19263
19264    /// Parse an [`Exclude`](ExcludeSelectItem) information for wildcard select items.
19265    ///
19266    /// If it is not possible to parse it, will return an option.
19267    pub fn parse_optional_select_item_exclude(
19268        &mut self,
19269    ) -> Result<Option<ExcludeSelectItem>, ParserError> {
19270        let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
19271            if self.consume_token(&Token::LParen) {
19272                let columns =
19273                    self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
19274                self.expect_token(&Token::RParen)?;
19275                Some(ExcludeSelectItem::Multiple(columns))
19276            } else {
19277                let column = self.parse_object_name(false)?;
19278                Some(ExcludeSelectItem::Single(column))
19279            }
19280        } else {
19281            None
19282        };
19283
19284        Ok(opt_exclude)
19285    }
19286
19287    /// Parse an [`Except`](ExceptSelectItem) information for wildcard select items.
19288    ///
19289    /// If it is not possible to parse it, will return an option.
19290    pub fn parse_optional_select_item_except(
19291        &mut self,
19292    ) -> Result<Option<ExceptSelectItem>, ParserError> {
19293        let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
19294            if self.peek_token_ref().token == Token::LParen {
19295                let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
19296                match &idents[..] {
19297                    [] => {
19298                        return self.expected_ref(
19299                            "at least one column should be parsed by the expect clause",
19300                            self.peek_token_ref(),
19301                        )?;
19302                    }
19303                    [first, idents @ ..] => Some(ExceptSelectItem {
19304                        first_element: first.clone(),
19305                        additional_elements: idents.to_vec(),
19306                    }),
19307                }
19308            } else {
19309                // Clickhouse allows EXCEPT column_name
19310                let ident = self.parse_identifier()?;
19311                Some(ExceptSelectItem {
19312                    first_element: ident,
19313                    additional_elements: vec![],
19314                })
19315            }
19316        } else {
19317            None
19318        };
19319
19320        Ok(opt_except)
19321    }
19322
19323    /// Parse a [`Rename`](RenameSelectItem) information for wildcard select items.
19324    pub fn parse_optional_select_item_rename(
19325        &mut self,
19326    ) -> Result<Option<RenameSelectItem>, ParserError> {
19327        let opt_rename = if self.parse_keyword(Keyword::RENAME) {
19328            if self.consume_token(&Token::LParen) {
19329                let idents =
19330                    self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
19331                self.expect_token(&Token::RParen)?;
19332                Some(RenameSelectItem::Multiple(idents))
19333            } else {
19334                let ident = self.parse_identifier_with_alias()?;
19335                Some(RenameSelectItem::Single(ident))
19336            }
19337        } else {
19338            None
19339        };
19340
19341        Ok(opt_rename)
19342    }
19343
19344    /// Parse a [`Replace`](ReplaceSelectItem) information for wildcard select items.
19345    pub fn parse_optional_select_item_replace(
19346        &mut self,
19347    ) -> Result<Option<ReplaceSelectItem>, ParserError> {
19348        let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
19349            if self.consume_token(&Token::LParen) {
19350                let items = self.parse_comma_separated(|parser| {
19351                    Ok(Box::new(parser.parse_replace_elements()?))
19352                })?;
19353                self.expect_token(&Token::RParen)?;
19354                Some(ReplaceSelectItem { items })
19355            } else {
19356                let tok = self.next_token();
19357                return self.expected("( after REPLACE but", tok);
19358            }
19359        } else {
19360            None
19361        };
19362
19363        Ok(opt_replace)
19364    }
19365    /// Parse a single element of a `REPLACE (...)` select-item clause.
19366    pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
19367        let expr = self.parse_expr()?;
19368        let as_keyword = self.parse_keyword(Keyword::AS);
19369        let ident = self.parse_identifier()?;
19370        Ok(ReplaceSelectElement {
19371            expr,
19372            column_name: ident,
19373            as_keyword,
19374        })
19375    }
19376
19377    /// Parse ASC or DESC, returns an Option with true if ASC, false of DESC or `None` if none of
19378    /// them.
19379    pub fn parse_asc_desc(&mut self) -> Option<bool> {
19380        if self.parse_keyword(Keyword::ASC) {
19381            Some(true)
19382        } else if self.parse_keyword(Keyword::DESC) {
19383            Some(false)
19384        } else {
19385            None
19386        }
19387    }
19388
19389    /// Parse ASC or DESC and map to [OrderBySort].
19390    fn parse_optional_order_by_sort(&mut self) -> Option<OrderBySort> {
19391        match self.parse_asc_desc() {
19392            Some(true) => Some(OrderBySort::Asc),
19393            Some(false) => Some(OrderBySort::Desc),
19394            None => None,
19395        }
19396    }
19397
19398    /// Parse an [OrderByExpr] expression.
19399    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
19400        self.parse_order_by_expr_inner(false)
19401            .map(|(order_by, _)| order_by)
19402    }
19403
19404    /// Parse an [IndexColumn].
19405    pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
19406        self.parse_order_by_expr_inner(true)
19407            .map(|(column, operator_class)| IndexColumn {
19408                column,
19409                operator_class,
19410            })
19411    }
19412
19413    fn parse_order_by_expr_inner(
19414        &mut self,
19415        with_operator_class: bool,
19416    ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
19417        let expr = self.parse_expr()?;
19418
19419        let operator_class: Option<ObjectName> = if with_operator_class {
19420            // We check that if non of the following keywords are present, then we parse an
19421            // identifier as operator class.
19422            if self
19423                .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
19424                .is_some()
19425            {
19426                None
19427            } else {
19428                self.maybe_parse(|parser| parser.parse_object_name(false))?
19429            }
19430        } else {
19431            None
19432        };
19433
19434        let options = if !with_operator_class
19435            && self.dialect.supports_order_by_using_operator()
19436            && self.parse_keyword(Keyword::USING)
19437        {
19438            let op = self.parse_order_by_using_operator()?;
19439            OrderByOptions {
19440                sort: Some(OrderBySort::Using(op)),
19441                nulls_first: self.parse_null_ordering_modifier(),
19442            }
19443        } else {
19444            self.parse_order_by_options()?
19445        };
19446
19447        let with_fill = if self.dialect.supports_with_fill()
19448            && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
19449        {
19450            Some(self.parse_with_fill()?)
19451        } else {
19452            None
19453        };
19454
19455        Ok((
19456            OrderByExpr {
19457                expr,
19458                options,
19459                with_fill,
19460            },
19461            operator_class,
19462        ))
19463    }
19464
19465    fn parse_order_by_using_operator(&mut self) -> Result<ObjectName, ParserError> {
19466        if self.parse_keyword(Keyword::OPERATOR) {
19467            self.expect_token(&Token::LParen)?;
19468            let operator_name = self.parse_operator_name()?;
19469            self.expect_token(&Token::RParen)?;
19470            return Ok(operator_name);
19471        }
19472
19473        let token = self.next_token();
19474        Ok(ObjectName::from(vec![Ident::new(token.token.to_string())]))
19475    }
19476
19477    fn parse_null_ordering_modifier(&mut self) -> Option<bool> {
19478        if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19479            Some(true)
19480        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19481            Some(false)
19482        } else {
19483            None
19484        }
19485    }
19486
19487    fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19488        let sort = self.parse_optional_order_by_sort();
19489        let nulls_first = self.parse_null_ordering_modifier();
19490
19491        Ok(OrderByOptions { sort, nulls_first })
19492    }
19493
19494    // Parse a WITH FILL clause (ClickHouse dialect)
19495    // that follow the WITH FILL keywords in a ORDER BY clause
19496    /// Parse a `WITH FILL` clause used in ORDER BY (ClickHouse dialect).
19497    pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19498        let from = if self.parse_keyword(Keyword::FROM) {
19499            Some(self.parse_expr()?)
19500        } else {
19501            None
19502        };
19503
19504        let to = if self.parse_keyword(Keyword::TO) {
19505            Some(self.parse_expr()?)
19506        } else {
19507            None
19508        };
19509
19510        let step = if self.parse_keyword(Keyword::STEP) {
19511            Some(self.parse_expr()?)
19512        } else {
19513            None
19514        };
19515
19516        Ok(WithFill { from, to, step })
19517    }
19518
19519    /// Parse a set of comma separated INTERPOLATE expressions (ClickHouse dialect)
19520    /// that follow the INTERPOLATE keyword in an ORDER BY clause with the WITH FILL modifier
19521    pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19522        if !self.parse_keyword(Keyword::INTERPOLATE) {
19523            return Ok(None);
19524        }
19525
19526        if self.consume_token(&Token::LParen) {
19527            let interpolations =
19528                self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19529            self.expect_token(&Token::RParen)?;
19530            // INTERPOLATE () and INTERPOLATE ( ... ) variants
19531            return Ok(Some(Interpolate {
19532                exprs: Some(interpolations),
19533            }));
19534        }
19535
19536        // INTERPOLATE
19537        Ok(Some(Interpolate { exprs: None }))
19538    }
19539
19540    /// Parse a INTERPOLATE expression (ClickHouse dialect)
19541    pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19542        let column = self.parse_identifier()?;
19543        let expr = if self.parse_keyword(Keyword::AS) {
19544            Some(self.parse_expr()?)
19545        } else {
19546            None
19547        };
19548        Ok(InterpolateExpr { column, expr })
19549    }
19550
19551    /// Parse a TOP clause, MSSQL equivalent of LIMIT,
19552    /// that follows after `SELECT [DISTINCT]`.
19553    pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19554        let quantity = if self.consume_token(&Token::LParen) {
19555            let quantity = self.parse_expr()?;
19556            self.expect_token(&Token::RParen)?;
19557            Some(TopQuantity::Expr(quantity))
19558        } else {
19559            let next_token = self.next_token();
19560            let quantity = match next_token.token {
19561                Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19562                _ => self.expected("literal int", next_token)?,
19563            };
19564            Some(TopQuantity::Constant(quantity))
19565        };
19566
19567        let percent = self.parse_keyword(Keyword::PERCENT);
19568
19569        let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19570
19571        Ok(Top {
19572            with_ties,
19573            percent,
19574            quantity,
19575        })
19576    }
19577
19578    /// Parse a LIMIT clause
19579    pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19580        if self.parse_keyword(Keyword::ALL) {
19581            Ok(None)
19582        } else {
19583            Ok(Some(self.parse_expr()?))
19584        }
19585    }
19586
19587    /// Parse an OFFSET clause
19588    pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19589        let value = self.parse_expr()?;
19590        let rows = if self.parse_keyword(Keyword::ROW) {
19591            OffsetRows::Row
19592        } else if self.parse_keyword(Keyword::ROWS) {
19593            OffsetRows::Rows
19594        } else {
19595            OffsetRows::None
19596        };
19597        Ok(Offset { value, rows })
19598    }
19599
19600    /// Parse a FETCH clause
19601    pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19602        let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19603
19604        let (quantity, percent) = if self
19605            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19606            .is_some()
19607        {
19608            (None, false)
19609        } else {
19610            let quantity = Expr::Value(self.parse_value()?);
19611            let percent = self.parse_keyword(Keyword::PERCENT);
19612            let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19613            (Some(quantity), percent)
19614        };
19615
19616        let with_ties = if self.parse_keyword(Keyword::ONLY) {
19617            false
19618        } else {
19619            self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19620        };
19621
19622        Ok(Fetch {
19623            with_ties,
19624            percent,
19625            quantity,
19626        })
19627    }
19628
19629    /// Parse a FOR UPDATE/FOR SHARE clause
19630    pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19631        let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19632            Keyword::UPDATE => LockType::Update,
19633            Keyword::SHARE => LockType::Share,
19634            unexpected_keyword => return Err(ParserError::ParserError(
19635                format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19636            )),
19637        };
19638        let of = if self.parse_keyword(Keyword::OF) {
19639            Some(self.parse_object_name(false)?)
19640        } else {
19641            None
19642        };
19643        let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19644            Some(NonBlock::Nowait)
19645        } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19646            Some(NonBlock::SkipLocked)
19647        } else {
19648            None
19649        };
19650        Ok(LockClause {
19651            lock_type,
19652            of,
19653            nonblock,
19654        })
19655    }
19656
19657    /// Parse a PostgreSQL `LOCK` statement.
19658    pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19659        self.expect_keyword(Keyword::LOCK)?;
19660
19661        if self.peek_keyword(Keyword::TABLES) {
19662            return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19663        }
19664
19665        let _ = self.parse_keyword(Keyword::TABLE);
19666        let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19667        let lock_mode = if self.parse_keyword(Keyword::IN) {
19668            let lock_mode = self.parse_lock_table_mode()?;
19669            self.expect_keyword(Keyword::MODE)?;
19670            Some(lock_mode)
19671        } else {
19672            None
19673        };
19674        let nowait = self.parse_keyword(Keyword::NOWAIT);
19675
19676        Ok(Lock {
19677            tables,
19678            lock_mode,
19679            nowait,
19680        })
19681    }
19682
19683    fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19684        let only = self.parse_keyword(Keyword::ONLY);
19685        let name = self.parse_object_name(false)?;
19686        let has_asterisk = self.consume_token(&Token::Mul);
19687
19688        Ok(LockTableTarget {
19689            name,
19690            only,
19691            has_asterisk,
19692        })
19693    }
19694
19695    fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19696        if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19697            Ok(LockTableMode::AccessShare)
19698        } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19699            Ok(LockTableMode::AccessExclusive)
19700        } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19701            Ok(LockTableMode::RowShare)
19702        } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19703            Ok(LockTableMode::RowExclusive)
19704        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19705            Ok(LockTableMode::ShareUpdateExclusive)
19706        } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19707            Ok(LockTableMode::ShareRowExclusive)
19708        } else if self.parse_keyword(Keyword::SHARE) {
19709            Ok(LockTableMode::Share)
19710        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19711            Ok(LockTableMode::Exclusive)
19712        } else {
19713            self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19714        }
19715    }
19716
19717    /// Parse a VALUES clause
19718    pub fn parse_values(
19719        &mut self,
19720        allow_empty: bool,
19721        value_keyword: bool,
19722    ) -> Result<Values, ParserError> {
19723        let mut explicit_row = false;
19724
19725        let rows = self.parse_comma_separated(|parser| {
19726            if parser.parse_keyword(Keyword::ROW) {
19727                explicit_row = true;
19728            }
19729            Ok(Parens {
19730                opening_token: parser.expect_token(&Token::LParen)?.into(),
19731                content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19732                    vec![]
19733                } else {
19734                    parser.parse_comma_separated(Parser::parse_expr)?
19735                },
19736                closing_token: parser.expect_token(&Token::RParen)?.into(),
19737            })
19738        })?;
19739        Ok(Values {
19740            explicit_row,
19741            rows,
19742            value_keyword,
19743        })
19744    }
19745
19746    /// Parse a 'START TRANSACTION' statement
19747    pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19748        self.expect_keyword_is(Keyword::TRANSACTION)?;
19749        Ok(Statement::StartTransaction {
19750            modes: self.parse_transaction_modes()?,
19751            begin: false,
19752            transaction: Some(BeginTransactionKind::Transaction),
19753            modifier: None,
19754            statements: vec![],
19755            exception: None,
19756            has_end_keyword: false,
19757        })
19758    }
19759
19760    /// Parse a transaction modifier keyword that can follow a `BEGIN` statement.
19761    pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19762        if !self.dialect.supports_start_transaction_modifier() {
19763            None
19764        } else if self.parse_keyword(Keyword::DEFERRED) {
19765            Some(TransactionModifier::Deferred)
19766        } else if self.parse_keyword(Keyword::IMMEDIATE) {
19767            Some(TransactionModifier::Immediate)
19768        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19769            Some(TransactionModifier::Exclusive)
19770        } else if self.parse_keyword(Keyword::TRY) {
19771            Some(TransactionModifier::Try)
19772        } else if self.parse_keyword(Keyword::CATCH) {
19773            Some(TransactionModifier::Catch)
19774        } else {
19775            None
19776        }
19777    }
19778
19779    /// Parse a 'BEGIN' statement
19780    pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19781        let modifier = self.parse_transaction_modifier();
19782        let transaction =
19783            match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19784            {
19785                Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19786                Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19787                Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19788                _ => None,
19789            };
19790        Ok(Statement::StartTransaction {
19791            modes: self.parse_transaction_modes()?,
19792            begin: true,
19793            transaction,
19794            modifier,
19795            statements: vec![],
19796            exception: None,
19797            has_end_keyword: false,
19798        })
19799    }
19800
19801    /// Parse a 'BEGIN ... EXCEPTION ... END' block
19802    pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19803        let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19804
19805        let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19806            let mut when = Vec::new();
19807
19808            // We can have multiple `WHEN` arms so we consume all cases until `END`
19809            while !self.peek_keyword(Keyword::END) {
19810                self.expect_keyword(Keyword::WHEN)?;
19811
19812                // Each `WHEN` case can have one or more conditions, e.g.
19813                // WHEN EXCEPTION_1 [OR EXCEPTION_2] THEN
19814                // So we parse identifiers until the `THEN` keyword.
19815                let mut idents = Vec::new();
19816
19817                while !self.parse_keyword(Keyword::THEN) {
19818                    let ident = self.parse_identifier()?;
19819                    idents.push(ident);
19820
19821                    self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19822                }
19823
19824                let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19825
19826                when.push(ExceptionWhen { idents, statements });
19827            }
19828
19829            Some(when)
19830        } else {
19831            None
19832        };
19833
19834        self.expect_keyword(Keyword::END)?;
19835
19836        Ok(Statement::StartTransaction {
19837            begin: true,
19838            statements,
19839            exception,
19840            has_end_keyword: true,
19841            transaction: None,
19842            modifier: None,
19843            modes: Default::default(),
19844        })
19845    }
19846
19847    /// Parse an 'END' statement
19848    pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19849        let modifier = if !self.dialect.supports_end_transaction_modifier() {
19850            None
19851        } else if self.parse_keyword(Keyword::TRY) {
19852            Some(TransactionModifier::Try)
19853        } else if self.parse_keyword(Keyword::CATCH) {
19854            Some(TransactionModifier::Catch)
19855        } else {
19856            None
19857        };
19858        Ok(Statement::Commit {
19859            chain: self.parse_commit_rollback_chain()?,
19860            end: true,
19861            modifier,
19862        })
19863    }
19864
19865    /// Parse a list of transaction modes
19866    pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19867        let mut modes = vec![];
19868        let mut required = false;
19869        loop {
19870            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19871                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19872                    TransactionIsolationLevel::ReadUncommitted
19873                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19874                    TransactionIsolationLevel::ReadCommitted
19875                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19876                    TransactionIsolationLevel::RepeatableRead
19877                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19878                    TransactionIsolationLevel::Serializable
19879                } else if self.parse_keyword(Keyword::SNAPSHOT) {
19880                    TransactionIsolationLevel::Snapshot
19881                } else {
19882                    self.expected_ref("isolation level", self.peek_token_ref())?
19883                };
19884                TransactionMode::IsolationLevel(iso_level)
19885            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19886                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19887            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19888                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19889            } else if required {
19890                self.expected_ref("transaction mode", self.peek_token_ref())?
19891            } else {
19892                break;
19893            };
19894            modes.push(mode);
19895            // ANSI requires a comma after each transaction mode, but
19896            // PostgreSQL, for historical reasons, does not. We follow
19897            // PostgreSQL in making the comma optional, since that is strictly
19898            // more general.
19899            required = self.consume_token(&Token::Comma);
19900        }
19901        Ok(modes)
19902    }
19903
19904    /// Parse a 'COMMIT' statement
19905    pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19906        Ok(Statement::Commit {
19907            chain: self.parse_commit_rollback_chain()?,
19908            end: false,
19909            modifier: None,
19910        })
19911    }
19912
19913    /// Parse a 'ROLLBACK' statement
19914    pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19915        let chain = self.parse_commit_rollback_chain()?;
19916        let savepoint = self.parse_rollback_savepoint()?;
19917
19918        Ok(Statement::Rollback { chain, savepoint })
19919    }
19920
19921    /// Parse an 'ABORT' statement
19922    ///
19923    /// ```sql
19924    /// ABORT [ TRANSACTION | WORK ] [ AND [ NO ] CHAIN ]
19925    /// ```
19926    pub fn parse_abort(&mut self) -> Result<Statement, ParserError> {
19927        let chain = self.parse_commit_rollback_chain()?;
19928
19929        Ok(Statement::Rollback {
19930            chain,
19931            savepoint: None,
19932        })
19933    }
19934
19935    /// Parse an optional `AND [NO] CHAIN` clause for `COMMIT` and `ROLLBACK` statements
19936    pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19937        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19938        if self.parse_keyword(Keyword::AND) {
19939            let chain = !self.parse_keyword(Keyword::NO);
19940            self.expect_keyword_is(Keyword::CHAIN)?;
19941            Ok(chain)
19942        } else {
19943            Ok(false)
19944        }
19945    }
19946
19947    /// Parse an optional 'TO SAVEPOINT savepoint_name' clause for ROLLBACK statements
19948    pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19949        if self.parse_keyword(Keyword::TO) {
19950            let _ = self.parse_keyword(Keyword::SAVEPOINT);
19951            let savepoint = self.parse_identifier()?;
19952
19953            Ok(Some(savepoint))
19954        } else {
19955            Ok(None)
19956        }
19957    }
19958
19959    /// Parse a 'RAISERROR' statement
19960    pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19961        self.expect_token(&Token::LParen)?;
19962        let message = Box::new(self.parse_expr()?);
19963        self.expect_token(&Token::Comma)?;
19964        let severity = Box::new(self.parse_expr()?);
19965        self.expect_token(&Token::Comma)?;
19966        let state = Box::new(self.parse_expr()?);
19967        let arguments = if self.consume_token(&Token::Comma) {
19968            self.parse_comma_separated(Parser::parse_expr)?
19969        } else {
19970            vec![]
19971        };
19972        self.expect_token(&Token::RParen)?;
19973        let options = if self.parse_keyword(Keyword::WITH) {
19974            self.parse_comma_separated(Parser::parse_raiserror_option)?
19975        } else {
19976            vec![]
19977        };
19978        Ok(Statement::RaisError {
19979            message,
19980            severity,
19981            state,
19982            arguments,
19983            options,
19984        })
19985    }
19986
19987    /// Parse a single `RAISERROR` option
19988    pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19989        match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19990            Keyword::LOG => Ok(RaisErrorOption::Log),
19991            Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19992            Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19993            _ => self.expected_ref(
19994                "LOG, NOWAIT OR SETERROR raiserror option",
19995                self.peek_token_ref(),
19996            ),
19997        }
19998    }
19999
20000    /// Parse a MSSQL `THROW` statement.
20001    ///
20002    /// See [Statement::Throw]
20003    pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
20004        self.expect_keyword_is(Keyword::THROW)?;
20005
20006        let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
20007        let (message, state) = if error_number.is_some() {
20008            self.expect_token(&Token::Comma)?;
20009            let message = Box::new(self.parse_expr()?);
20010            self.expect_token(&Token::Comma)?;
20011            let state = Box::new(self.parse_expr()?);
20012            (Some(message), Some(state))
20013        } else {
20014            (None, None)
20015        };
20016
20017        Ok(ThrowStatement {
20018            error_number,
20019            message,
20020            state,
20021        })
20022    }
20023
20024    /// Parse a SQL `DEALLOCATE` statement
20025    pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
20026        let prepare = self.parse_keyword(Keyword::PREPARE);
20027        let name = self.parse_identifier()?;
20028        Ok(Statement::Deallocate { name, prepare })
20029    }
20030
20031    /// Parse a SQL `EXECUTE` statement
20032    pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
20033        let immediate =
20034            self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
20035
20036        // When `EXEC` is immediately followed by `(`, the content is a dynamic-SQL
20037        // expression — e.g. `EXEC (@sql)`, `EXEC ('SELECT ...')`, or
20038        // `EXEC ('SELECT ... FROM ' + @tbl + ' WHERE ...')`.
20039        // Skip name parsing; the expression ends up in `parameters` via the
20040        // `has_parentheses` path below, consistent with `EXECUTE IMMEDIATE <expr>`.
20041        let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
20042            None
20043        } else {
20044            Some(self.parse_object_name(false)?)
20045        };
20046
20047        let has_parentheses = self.consume_token(&Token::LParen);
20048
20049        let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
20050        let end_token = match (has_parentheses, self.peek_token().token) {
20051            (true, _) => Token::RParen,
20052            (false, Token::EOF) => Token::EOF,
20053            (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
20054            (false, _) => Token::SemiColon,
20055        };
20056
20057        let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
20058
20059        if has_parentheses {
20060            self.expect_token(&Token::RParen)?;
20061        }
20062
20063        let into = if self.parse_keyword(Keyword::INTO) {
20064            self.parse_comma_separated(Self::parse_identifier)?
20065        } else {
20066            vec![]
20067        };
20068
20069        let using = if self.parse_keyword(Keyword::USING) {
20070            self.parse_comma_separated(Self::parse_expr_with_alias)?
20071        } else {
20072            vec![]
20073        };
20074
20075        let output = self.parse_keyword(Keyword::OUTPUT);
20076
20077        let default = self.parse_keyword(Keyword::DEFAULT);
20078
20079        Ok(Statement::Execute {
20080            immediate,
20081            name,
20082            parameters,
20083            has_parentheses,
20084            into,
20085            using,
20086            output,
20087            default,
20088        })
20089    }
20090
20091    /// Parse a SQL `PREPARE` statement
20092    pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
20093        let name = self.parse_identifier()?;
20094
20095        let mut data_types = vec![];
20096        if self.consume_token(&Token::LParen) {
20097            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
20098            self.expect_token(&Token::RParen)?;
20099        }
20100
20101        self.expect_keyword_is(Keyword::AS)?;
20102        let statement = Box::new(self.parse_statement()?);
20103        Ok(Statement::Prepare {
20104            name,
20105            data_types,
20106            statement,
20107        })
20108    }
20109
20110    /// Parse a SQL `UNLOAD` statement
20111    pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
20112        self.expect_keyword(Keyword::UNLOAD)?;
20113        self.expect_token(&Token::LParen)?;
20114        let (query, query_text) =
20115            if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
20116                (None, Some(self.parse_literal_string()?))
20117            } else {
20118                (Some(self.parse_query()?), None)
20119            };
20120        self.expect_token(&Token::RParen)?;
20121
20122        self.expect_keyword_is(Keyword::TO)?;
20123        let to = self.parse_identifier()?;
20124        let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
20125            Some(self.parse_iam_role_kind()?)
20126        } else {
20127            None
20128        };
20129        let with = self.parse_options(Keyword::WITH)?;
20130        let mut options = vec![];
20131        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
20132            options.push(opt);
20133        }
20134        Ok(Statement::Unload {
20135            query,
20136            query_text,
20137            to,
20138            auth,
20139            with,
20140            options,
20141        })
20142    }
20143
20144    fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
20145        let temporary = self
20146            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
20147            .is_some();
20148        let unlogged = self.parse_keyword(Keyword::UNLOGGED);
20149        let table = self.parse_keyword(Keyword::TABLE);
20150        let targets = self.parse_comma_separated(Parser::parse_expr)?;
20151
20152        Ok(SelectInto {
20153            temporary,
20154            unlogged,
20155            table,
20156            targets,
20157        })
20158    }
20159
20160    fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
20161        let v = self.parse_value()?;
20162        match &v.value {
20163            Value::SingleQuotedString(_) => Ok(v),
20164            Value::DoubleQuotedString(_) => Ok(v),
20165            Value::Number(_, _) => Ok(v),
20166            Value::Placeholder(_) => Ok(v),
20167            _ => {
20168                self.prev_token();
20169                self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
20170            }
20171        }
20172    }
20173
20174    /// PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
20175    pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
20176        let name = self.parse_object_name(false)?;
20177        if self.consume_token(&Token::LParen) {
20178            let value = self.parse_pragma_value()?;
20179            self.expect_token(&Token::RParen)?;
20180            Ok(Statement::Pragma {
20181                name,
20182                value: Some(value),
20183                is_eq: false,
20184            })
20185        } else if self.consume_token(&Token::Eq) {
20186            Ok(Statement::Pragma {
20187                name,
20188                value: Some(self.parse_pragma_value()?),
20189                is_eq: true,
20190            })
20191        } else {
20192            Ok(Statement::Pragma {
20193                name,
20194                value: None,
20195                is_eq: false,
20196            })
20197        }
20198    }
20199
20200    /// `INSTALL [extension_name]`
20201    pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
20202        let extension_name = self.parse_identifier()?;
20203
20204        Ok(Statement::Install { extension_name })
20205    }
20206
20207    /// Parse a SQL LOAD statement
20208    pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
20209        if self.dialect.supports_load_extension() {
20210            let extension_name = self.parse_identifier()?;
20211            Ok(Statement::Load { extension_name })
20212        } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
20213            let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
20214            self.expect_keyword_is(Keyword::INPATH)?;
20215            let inpath = self.parse_literal_string()?;
20216            let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
20217            self.expect_keyword_is(Keyword::INTO)?;
20218            self.expect_keyword_is(Keyword::TABLE)?;
20219            let table_name = self.parse_object_name(false)?;
20220            let partitioned = self.parse_insert_partition()?;
20221            let table_format = self.parse_load_data_table_format()?;
20222            Ok(Statement::LoadData {
20223                local,
20224                inpath,
20225                overwrite,
20226                table_name,
20227                partitioned,
20228                table_format,
20229            })
20230        } else {
20231            self.expected_ref(
20232                "`DATA` or an extension name after `LOAD`",
20233                self.peek_token_ref(),
20234            )
20235        }
20236    }
20237
20238    /// ClickHouse:
20239    /// ```sql
20240    /// OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]
20241    /// ```
20242    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/optimize)
20243    ///
20244    /// Databricks:
20245    /// ```sql
20246    /// OPTIMIZE table_name [WHERE predicate] [ZORDER BY (col_name1 [, ...])]
20247    /// ```
20248    /// [Databricks](https://docs.databricks.com/en/sql/language-manual/delta-optimize.html)
20249    pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
20250        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
20251
20252        let name = self.parse_object_name(false)?;
20253
20254        // ClickHouse-specific options
20255        let on_cluster = self.parse_optional_on_cluster()?;
20256
20257        let partition = if self.parse_keyword(Keyword::PARTITION) {
20258            if self.parse_keyword(Keyword::ID) {
20259                Some(Partition::Identifier(self.parse_identifier()?))
20260            } else {
20261                Some(Partition::Expr(self.parse_expr()?))
20262            }
20263        } else {
20264            None
20265        };
20266
20267        let include_final = self.parse_keyword(Keyword::FINAL);
20268
20269        let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
20270            if self.parse_keyword(Keyword::BY) {
20271                Some(Deduplicate::ByExpression(self.parse_expr()?))
20272            } else {
20273                Some(Deduplicate::All)
20274            }
20275        } else {
20276            None
20277        };
20278
20279        // Databricks-specific options
20280        let predicate = if self.parse_keyword(Keyword::WHERE) {
20281            Some(self.parse_expr()?)
20282        } else {
20283            None
20284        };
20285
20286        let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
20287            self.expect_token(&Token::LParen)?;
20288            let columns = self.parse_comma_separated(|p| p.parse_expr())?;
20289            self.expect_token(&Token::RParen)?;
20290            Some(columns)
20291        } else {
20292            None
20293        };
20294
20295        Ok(Statement::OptimizeTable {
20296            name,
20297            has_table_keyword,
20298            on_cluster,
20299            partition,
20300            include_final,
20301            deduplicate,
20302            predicate,
20303            zorder,
20304        })
20305    }
20306
20307    /// ```sql
20308    /// CREATE [ { TEMPORARY | TEMP } ] SEQUENCE [ IF NOT EXISTS ] <sequence_name>
20309    /// ```
20310    ///
20311    /// See [Postgres docs](https://www.postgresql.org/docs/current/sql-createsequence.html) for more details.
20312    pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
20313        //[ IF NOT EXISTS ]
20314        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20315        //name
20316        let name = self.parse_object_name(false)?;
20317        //[ AS data_type ]
20318        let mut data_type: Option<DataType> = None;
20319        if self.parse_keywords(&[Keyword::AS]) {
20320            data_type = Some(self.parse_data_type()?)
20321        }
20322        let sequence_options = self.parse_create_sequence_options()?;
20323        // [ OWNED BY { table_name.column_name | NONE } ]
20324        let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
20325            if self.parse_keywords(&[Keyword::NONE]) {
20326                Some(ObjectName::from(vec![Ident::new("NONE")]))
20327            } else {
20328                Some(self.parse_object_name(false)?)
20329            }
20330        } else {
20331            None
20332        };
20333        Ok(Statement::CreateSequence {
20334            temporary,
20335            if_not_exists,
20336            name,
20337            data_type,
20338            sequence_options,
20339            owned_by,
20340        })
20341    }
20342
20343    fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
20344        let mut sequence_options = vec![];
20345        //[ INCREMENT [ BY ] increment ]
20346        if self.parse_keywords(&[Keyword::INCREMENT]) {
20347            if self.parse_keywords(&[Keyword::BY]) {
20348                sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
20349            } else {
20350                sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
20351            }
20352        }
20353        //[ MINVALUE minvalue | NO MINVALUE ]
20354        if self.parse_keyword(Keyword::MINVALUE) {
20355            sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
20356        } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
20357            sequence_options.push(SequenceOptions::MinValue(None));
20358        }
20359        //[ MAXVALUE maxvalue | NO MAXVALUE ]
20360        if self.parse_keywords(&[Keyword::MAXVALUE]) {
20361            sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
20362        } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
20363            sequence_options.push(SequenceOptions::MaxValue(None));
20364        }
20365
20366        //[ START [ WITH ] start ]
20367        if self.parse_keywords(&[Keyword::START]) {
20368            if self.parse_keywords(&[Keyword::WITH]) {
20369                sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
20370            } else {
20371                sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
20372            }
20373        }
20374        //[ CACHE cache ]
20375        if self.parse_keywords(&[Keyword::CACHE]) {
20376            sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
20377        }
20378        // [ [ NO ] CYCLE ]
20379        if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
20380            sequence_options.push(SequenceOptions::Cycle(true));
20381        } else if self.parse_keywords(&[Keyword::CYCLE]) {
20382            sequence_options.push(SequenceOptions::Cycle(false));
20383        }
20384
20385        Ok(sequence_options)
20386    }
20387
20388    ///   Parse a `CREATE SERVER` statement.
20389    ///
20390    ///  See [Statement::CreateServer]
20391    pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
20392        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20393        let name = self.parse_object_name(false)?;
20394
20395        let server_type = if self.parse_keyword(Keyword::TYPE) {
20396            Some(self.parse_identifier()?)
20397        } else {
20398            None
20399        };
20400
20401        let version = if self.parse_keyword(Keyword::VERSION) {
20402            Some(self.parse_identifier()?)
20403        } else {
20404            None
20405        };
20406
20407        self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
20408        let foreign_data_wrapper = self.parse_object_name(false)?;
20409
20410        let mut options = None;
20411        if self.parse_keyword(Keyword::OPTIONS) {
20412            self.expect_token(&Token::LParen)?;
20413            options = Some(self.parse_comma_separated(|p| {
20414                let key = p.parse_identifier()?;
20415                let value = p.parse_identifier()?;
20416                Ok(CreateServerOption { key, value })
20417            })?);
20418            self.expect_token(&Token::RParen)?;
20419        }
20420
20421        Ok(Statement::CreateServer(CreateServerStatement {
20422            name,
20423            if_not_exists: ine,
20424            server_type,
20425            version,
20426            foreign_data_wrapper,
20427            options,
20428        }))
20429    }
20430
20431    /// The index of the first unprocessed token.
20432    pub fn index(&self) -> usize {
20433        self.index
20434    }
20435
20436    /// Parse a named window definition.
20437    pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
20438        let ident = self.parse_identifier()?;
20439        self.expect_keyword_is(Keyword::AS)?;
20440
20441        let window_expr = if self.consume_token(&Token::LParen) {
20442            NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
20443        } else if self.dialect.supports_window_clause_named_window_reference() {
20444            NamedWindowExpr::NamedWindow(self.parse_identifier()?)
20445        } else {
20446            return self.expected_ref("(", self.peek_token_ref());
20447        };
20448
20449        Ok(NamedWindowDefinition(ident, window_expr))
20450    }
20451
20452    /// Parse `CREATE PROCEDURE` statement.
20453    pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
20454        let name = self.parse_object_name(false)?;
20455        let params = self.parse_optional_procedure_parameters()?;
20456
20457        let language = if self.parse_keyword(Keyword::LANGUAGE) {
20458            Some(self.parse_identifier()?)
20459        } else {
20460            None
20461        };
20462
20463        self.expect_keyword_is(Keyword::AS)?;
20464
20465        let body = self.parse_conditional_statements(&[Keyword::END])?;
20466
20467        Ok(Statement::CreateProcedure {
20468            name,
20469            or_alter,
20470            params,
20471            language,
20472            body,
20473        })
20474    }
20475
20476    /// Parse a window specification.
20477    pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
20478        let window_name = match &self.peek_token_ref().token {
20479            Token::Word(word) if word.keyword == Keyword::NoKeyword => {
20480                self.parse_optional_ident()?
20481            }
20482            _ => None,
20483        };
20484
20485        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
20486            self.parse_comma_separated(Parser::parse_expr)?
20487        } else {
20488            vec![]
20489        };
20490        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
20491            self.parse_comma_separated(Parser::parse_order_by_expr)?
20492        } else {
20493            vec![]
20494        };
20495
20496        let window_frame = if !self.consume_token(&Token::RParen) {
20497            let window_frame = self.parse_window_frame()?;
20498            self.expect_token(&Token::RParen)?;
20499            Some(window_frame)
20500        } else {
20501            None
20502        };
20503        Ok(WindowSpec {
20504            window_name,
20505            partition_by,
20506            order_by,
20507            window_frame,
20508        })
20509    }
20510
20511    /// Parse `CREATE TYPE` statement.
20512    pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
20513        let name = self.parse_object_name(false)?;
20514
20515        // Check if we have AS keyword
20516        let has_as = self.parse_keyword(Keyword::AS);
20517
20518        if !has_as {
20519            // Two cases: CREATE TYPE name; or CREATE TYPE name (options);
20520            if self.consume_token(&Token::LParen) {
20521                // CREATE TYPE name (options) - SQL definition without AS
20522                let options = self.parse_create_type_sql_definition_options()?;
20523                self.expect_token(&Token::RParen)?;
20524                return Ok(Statement::CreateType {
20525                    name,
20526                    representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
20527                });
20528            }
20529
20530            // CREATE TYPE name; - no representation
20531            return Ok(Statement::CreateType {
20532                name,
20533                representation: None,
20534            });
20535        }
20536
20537        // We have AS keyword
20538        if self.parse_keyword(Keyword::ENUM) {
20539            // CREATE TYPE name AS ENUM (labels)
20540            self.parse_create_type_enum(name)
20541        } else if self.parse_keyword(Keyword::RANGE) {
20542            // CREATE TYPE name AS RANGE (options)
20543            self.parse_create_type_range(name)
20544        } else if self.consume_token(&Token::LParen) {
20545            // CREATE TYPE name AS (attributes) - Composite
20546            self.parse_create_type_composite(name)
20547        } else {
20548            self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
20549        }
20550    }
20551
20552    /// Parse remainder of `CREATE TYPE AS (attributes)` statement (composite type)
20553    ///
20554    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
20555    fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20556        if self.consume_token(&Token::RParen) {
20557            // Empty composite type
20558            return Ok(Statement::CreateType {
20559                name,
20560                representation: Some(UserDefinedTypeRepresentation::Composite {
20561                    attributes: vec![],
20562                }),
20563            });
20564        }
20565
20566        let mut attributes = vec![];
20567        loop {
20568            let attr_name = self.parse_identifier()?;
20569            let attr_data_type = self.parse_data_type()?;
20570            let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
20571                Some(self.parse_object_name(false)?)
20572            } else {
20573                None
20574            };
20575            attributes.push(UserDefinedTypeCompositeAttributeDef {
20576                name: attr_name,
20577                data_type: attr_data_type,
20578                collation: attr_collation,
20579            });
20580
20581            if !self.consume_token(&Token::Comma) {
20582                break;
20583            }
20584        }
20585        self.expect_token(&Token::RParen)?;
20586
20587        Ok(Statement::CreateType {
20588            name,
20589            representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
20590        })
20591    }
20592
20593    /// Parse remainder of `CREATE TYPE AS ENUM` statement (see [Statement::CreateType] and [Self::parse_create_type])
20594    ///
20595    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
20596    pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20597        self.expect_token(&Token::LParen)?;
20598        let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20599        self.expect_token(&Token::RParen)?;
20600
20601        Ok(Statement::CreateType {
20602            name,
20603            representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
20604        })
20605    }
20606
20607    /// Parse remainder of `CREATE TYPE AS RANGE` statement
20608    ///
20609    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
20610    fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20611        self.expect_token(&Token::LParen)?;
20612        let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
20613        self.expect_token(&Token::RParen)?;
20614
20615        Ok(Statement::CreateType {
20616            name,
20617            representation: Some(UserDefinedTypeRepresentation::Range { options }),
20618        })
20619    }
20620
20621    /// Parse a single range option for a `CREATE TYPE AS RANGE` statement
20622    fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
20623        let keyword = self.parse_one_of_keywords(&[
20624            Keyword::SUBTYPE,
20625            Keyword::SUBTYPE_OPCLASS,
20626            Keyword::COLLATION,
20627            Keyword::CANONICAL,
20628            Keyword::SUBTYPE_DIFF,
20629            Keyword::MULTIRANGE_TYPE_NAME,
20630        ]);
20631
20632        match keyword {
20633            Some(Keyword::SUBTYPE) => {
20634                self.expect_token(&Token::Eq)?;
20635                let data_type = self.parse_data_type()?;
20636                Ok(UserDefinedTypeRangeOption::Subtype(data_type))
20637            }
20638            Some(Keyword::SUBTYPE_OPCLASS) => {
20639                self.expect_token(&Token::Eq)?;
20640                let name = self.parse_object_name(false)?;
20641                Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
20642            }
20643            Some(Keyword::COLLATION) => {
20644                self.expect_token(&Token::Eq)?;
20645                let name = self.parse_object_name(false)?;
20646                Ok(UserDefinedTypeRangeOption::Collation(name))
20647            }
20648            Some(Keyword::CANONICAL) => {
20649                self.expect_token(&Token::Eq)?;
20650                let name = self.parse_object_name(false)?;
20651                Ok(UserDefinedTypeRangeOption::Canonical(name))
20652            }
20653            Some(Keyword::SUBTYPE_DIFF) => {
20654                self.expect_token(&Token::Eq)?;
20655                let name = self.parse_object_name(false)?;
20656                Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20657            }
20658            Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20659                self.expect_token(&Token::Eq)?;
20660                let name = self.parse_object_name(false)?;
20661                Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20662            }
20663            _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20664        }
20665    }
20666
20667    /// Parse SQL definition options for CREATE TYPE (options)
20668    fn parse_create_type_sql_definition_options(
20669        &mut self,
20670    ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20671        self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20672    }
20673
20674    /// Parse a single SQL definition option for CREATE TYPE (options)
20675    fn parse_sql_definition_option(
20676        &mut self,
20677    ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20678        let keyword = self.parse_one_of_keywords(&[
20679            Keyword::INPUT,
20680            Keyword::OUTPUT,
20681            Keyword::RECEIVE,
20682            Keyword::SEND,
20683            Keyword::TYPMOD_IN,
20684            Keyword::TYPMOD_OUT,
20685            Keyword::ANALYZE,
20686            Keyword::SUBSCRIPT,
20687            Keyword::INTERNALLENGTH,
20688            Keyword::PASSEDBYVALUE,
20689            Keyword::ALIGNMENT,
20690            Keyword::STORAGE,
20691            Keyword::LIKE,
20692            Keyword::CATEGORY,
20693            Keyword::PREFERRED,
20694            Keyword::DEFAULT,
20695            Keyword::ELEMENT,
20696            Keyword::DELIMITER,
20697            Keyword::COLLATABLE,
20698        ]);
20699
20700        match keyword {
20701            Some(Keyword::INPUT) => {
20702                self.expect_token(&Token::Eq)?;
20703                let name = self.parse_object_name(false)?;
20704                Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20705            }
20706            Some(Keyword::OUTPUT) => {
20707                self.expect_token(&Token::Eq)?;
20708                let name = self.parse_object_name(false)?;
20709                Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20710            }
20711            Some(Keyword::RECEIVE) => {
20712                self.expect_token(&Token::Eq)?;
20713                let name = self.parse_object_name(false)?;
20714                Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20715            }
20716            Some(Keyword::SEND) => {
20717                self.expect_token(&Token::Eq)?;
20718                let name = self.parse_object_name(false)?;
20719                Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20720            }
20721            Some(Keyword::TYPMOD_IN) => {
20722                self.expect_token(&Token::Eq)?;
20723                let name = self.parse_object_name(false)?;
20724                Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20725            }
20726            Some(Keyword::TYPMOD_OUT) => {
20727                self.expect_token(&Token::Eq)?;
20728                let name = self.parse_object_name(false)?;
20729                Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20730            }
20731            Some(Keyword::ANALYZE) => {
20732                self.expect_token(&Token::Eq)?;
20733                let name = self.parse_object_name(false)?;
20734                Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20735            }
20736            Some(Keyword::SUBSCRIPT) => {
20737                self.expect_token(&Token::Eq)?;
20738                let name = self.parse_object_name(false)?;
20739                Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20740            }
20741            Some(Keyword::INTERNALLENGTH) => {
20742                self.expect_token(&Token::Eq)?;
20743                if self.parse_keyword(Keyword::VARIABLE) {
20744                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20745                        UserDefinedTypeInternalLength::Variable,
20746                    ))
20747                } else {
20748                    let value = self.parse_literal_uint()?;
20749                    Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20750                        UserDefinedTypeInternalLength::Fixed(value),
20751                    ))
20752                }
20753            }
20754            Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20755            Some(Keyword::ALIGNMENT) => {
20756                self.expect_token(&Token::Eq)?;
20757                let align_keyword = self.parse_one_of_keywords(&[
20758                    Keyword::CHAR,
20759                    Keyword::INT2,
20760                    Keyword::INT4,
20761                    Keyword::DOUBLE,
20762                ]);
20763                match align_keyword {
20764                    Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20765                        Alignment::Char,
20766                    )),
20767                    Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20768                        Alignment::Int2,
20769                    )),
20770                    Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20771                        Alignment::Int4,
20772                    )),
20773                    Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20774                        Alignment::Double,
20775                    )),
20776                    _ => self.expected_ref(
20777                        "alignment value (char, int2, int4, or double)",
20778                        self.peek_token_ref(),
20779                    ),
20780                }
20781            }
20782            Some(Keyword::STORAGE) => {
20783                self.expect_token(&Token::Eq)?;
20784                let storage_keyword = self.parse_one_of_keywords(&[
20785                    Keyword::PLAIN,
20786                    Keyword::EXTERNAL,
20787                    Keyword::EXTENDED,
20788                    Keyword::MAIN,
20789                ]);
20790                match storage_keyword {
20791                    Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20792                        UserDefinedTypeStorage::Plain,
20793                    )),
20794                    Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20795                        UserDefinedTypeStorage::External,
20796                    )),
20797                    Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20798                        UserDefinedTypeStorage::Extended,
20799                    )),
20800                    Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20801                        UserDefinedTypeStorage::Main,
20802                    )),
20803                    _ => self.expected_ref(
20804                        "storage value (plain, external, extended, or main)",
20805                        self.peek_token_ref(),
20806                    ),
20807                }
20808            }
20809            Some(Keyword::LIKE) => {
20810                self.expect_token(&Token::Eq)?;
20811                let name = self.parse_object_name(false)?;
20812                Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20813            }
20814            Some(Keyword::CATEGORY) => {
20815                self.expect_token(&Token::Eq)?;
20816                let category_str = self.parse_literal_string()?;
20817                let category_char = category_str.chars().next().ok_or_else(|| {
20818                    ParserError::ParserError(
20819                        "CATEGORY value must be a single character".to_string(),
20820                    )
20821                })?;
20822                Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20823            }
20824            Some(Keyword::PREFERRED) => {
20825                self.expect_token(&Token::Eq)?;
20826                let value =
20827                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20828                Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20829            }
20830            Some(Keyword::DEFAULT) => {
20831                self.expect_token(&Token::Eq)?;
20832                let expr = self.parse_expr()?;
20833                Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20834            }
20835            Some(Keyword::ELEMENT) => {
20836                self.expect_token(&Token::Eq)?;
20837                let data_type = self.parse_data_type()?;
20838                Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20839            }
20840            Some(Keyword::DELIMITER) => {
20841                self.expect_token(&Token::Eq)?;
20842                let delimiter = self.parse_literal_string()?;
20843                Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20844            }
20845            Some(Keyword::COLLATABLE) => {
20846                self.expect_token(&Token::Eq)?;
20847                let value =
20848                    self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20849                Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20850            }
20851            _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20852        }
20853    }
20854
20855    fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20856        self.expect_token(&Token::LParen)?;
20857        let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20858        self.expect_token(&Token::RParen)?;
20859        Ok(idents)
20860    }
20861
20862    fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20863        if dialect_of!(self is MySqlDialect | GenericDialect) {
20864            if self.parse_keyword(Keyword::FIRST) {
20865                Ok(Some(MySQLColumnPosition::First))
20866            } else if self.parse_keyword(Keyword::AFTER) {
20867                let ident = self.parse_identifier()?;
20868                Ok(Some(MySQLColumnPosition::After(ident)))
20869            } else {
20870                Ok(None)
20871            }
20872        } else {
20873            Ok(None)
20874        }
20875    }
20876
20877    /// Parse [Statement::Print]
20878    fn parse_print(&mut self) -> Result<Statement, ParserError> {
20879        Ok(Statement::Print(PrintStatement {
20880            message: Box::new(self.parse_expr()?),
20881        }))
20882    }
20883
20884    /// Parse [Statement::WaitFor]
20885    ///
20886    /// See: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/waitfor-transact-sql>
20887    fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20888        let wait_type = if self.parse_keyword(Keyword::DELAY) {
20889            WaitForType::Delay
20890        } else if self.parse_keyword(Keyword::TIME) {
20891            WaitForType::Time
20892        } else {
20893            return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20894        };
20895        let expr = self.parse_expr()?;
20896        Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20897    }
20898
20899    /// Parse [Statement::Return]
20900    fn parse_return(&mut self) -> Result<Statement, ParserError> {
20901        match self.maybe_parse(|p| p.parse_expr())? {
20902            Some(expr) => Ok(Statement::Return(ReturnStatement {
20903                value: Some(ReturnStatementValue::Expr(expr)),
20904            })),
20905            None => Ok(Statement::Return(ReturnStatement { value: None })),
20906        }
20907    }
20908
20909    /// /// Parse a `EXPORT DATA` statement.
20910    ///
20911    /// See [Statement::ExportData]
20912    fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20913        self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20914
20915        let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20916            Some(self.parse_object_name(false)?)
20917        } else {
20918            None
20919        };
20920        self.expect_keyword(Keyword::OPTIONS)?;
20921        self.expect_token(&Token::LParen)?;
20922        let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20923        self.expect_token(&Token::RParen)?;
20924        self.expect_keyword(Keyword::AS)?;
20925        let query = self.parse_query()?;
20926        Ok(Statement::ExportData(ExportData {
20927            options,
20928            query,
20929            connection,
20930        }))
20931    }
20932
20933    fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20934        self.expect_keyword(Keyword::VACUUM)?;
20935        let full = self.parse_keyword(Keyword::FULL);
20936        let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20937        let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20938        let reindex = self.parse_keyword(Keyword::REINDEX);
20939        let recluster = self.parse_keyword(Keyword::RECLUSTER);
20940        let (table_name, threshold, boost) =
20941            match self.maybe_parse(|p| p.parse_object_name(false))? {
20942                Some(table_name) => {
20943                    let threshold = if self.parse_keyword(Keyword::TO) {
20944                        let value = self.parse_value()?;
20945                        self.expect_keyword(Keyword::PERCENT)?;
20946                        Some(value)
20947                    } else {
20948                        None
20949                    };
20950                    let boost = self.parse_keyword(Keyword::BOOST);
20951                    (Some(table_name), threshold, boost)
20952                }
20953                _ => (None, None, false),
20954            };
20955        Ok(Statement::Vacuum(VacuumStatement {
20956            full,
20957            sort_only,
20958            delete_only,
20959            reindex,
20960            recluster,
20961            table_name,
20962            threshold,
20963            boost,
20964        }))
20965    }
20966
20967    /// Consume the parser and return its underlying token buffer
20968    pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20969        self.tokens
20970    }
20971
20972    /// Returns true if the next keyword indicates a sub query, i.e. SELECT or WITH
20973    fn peek_sub_query(&mut self) -> bool {
20974        self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20975            .is_some()
20976    }
20977
20978    pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20979        let show_in;
20980        let mut filter_position = None;
20981        if self.dialect.supports_show_like_before_in() {
20982            if let Some(filter) = self.parse_show_statement_filter()? {
20983                filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20984            }
20985            show_in = self.maybe_parse_show_stmt_in()?;
20986        } else {
20987            show_in = self.maybe_parse_show_stmt_in()?;
20988            if let Some(filter) = self.parse_show_statement_filter()? {
20989                filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20990            }
20991        }
20992        let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20993        let limit = self.maybe_parse_show_stmt_limit()?;
20994        let from = self.maybe_parse_show_stmt_from()?;
20995        Ok(ShowStatementOptions {
20996            filter_position,
20997            show_in,
20998            starts_with,
20999            limit,
21000            limit_from: from,
21001        })
21002    }
21003
21004    fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
21005        let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
21006            Some(Keyword::FROM) => ShowStatementInClause::FROM,
21007            Some(Keyword::IN) => ShowStatementInClause::IN,
21008            None => return Ok(None),
21009            _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
21010        };
21011
21012        let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
21013            Keyword::ACCOUNT,
21014            Keyword::DATABASE,
21015            Keyword::SCHEMA,
21016            Keyword::TABLE,
21017            Keyword::VIEW,
21018        ]) {
21019            // If we see these next keywords it means we don't have a parent name
21020            Some(Keyword::DATABASE)
21021                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21022                    | self.peek_keyword(Keyword::LIMIT) =>
21023            {
21024                (Some(ShowStatementInParentType::Database), None)
21025            }
21026            Some(Keyword::SCHEMA)
21027                if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21028                    | self.peek_keyword(Keyword::LIMIT) =>
21029            {
21030                (Some(ShowStatementInParentType::Schema), None)
21031            }
21032            Some(parent_kw) => {
21033                // The parent name here is still optional, for example:
21034                // SHOW TABLES IN ACCOUNT, so parsing the object name
21035                // may fail because the statement ends.
21036                let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
21037                match parent_kw {
21038                    Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
21039                    Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
21040                    Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
21041                    Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
21042                    Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
21043                    _ => {
21044                        return self.expected_ref(
21045                            "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
21046                            self.peek_token_ref(),
21047                        )
21048                    }
21049                }
21050            }
21051            None => {
21052                // Parsing MySQL style FROM tbl_name FROM db_name
21053                // which is equivalent to FROM tbl_name.db_name
21054                let mut parent_name = self.parse_object_name(false)?;
21055                if self
21056                    .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
21057                    .is_some()
21058                {
21059                    parent_name
21060                        .0
21061                        .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
21062                }
21063                (None, Some(parent_name))
21064            }
21065        };
21066
21067        Ok(Some(ShowStatementIn {
21068            clause,
21069            parent_type,
21070            parent_name,
21071        }))
21072    }
21073
21074    fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21075        if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
21076            Ok(Some(self.parse_value()?))
21077        } else {
21078            Ok(None)
21079        }
21080    }
21081
21082    fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
21083        if self.parse_keyword(Keyword::LIMIT) {
21084            Ok(self.parse_limit()?)
21085        } else {
21086            Ok(None)
21087        }
21088    }
21089
21090    fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21091        if self.parse_keyword(Keyword::FROM) {
21092            Ok(Some(self.parse_value()?))
21093        } else {
21094            Ok(None)
21095        }
21096    }
21097
21098    pub(crate) fn in_column_definition_state(&self) -> bool {
21099        matches!(self.state, ColumnDefinition)
21100    }
21101
21102    /// Parses options provided in key-value format.
21103    ///
21104    /// * `parenthesized` - true if the options are enclosed in parenthesis
21105    /// * `end_words` - a list of keywords that any of them indicates the end of the options section
21106    pub(crate) fn parse_key_value_options(
21107        &mut self,
21108        parenthesized: bool,
21109        end_words: &[Keyword],
21110    ) -> Result<KeyValueOptions, ParserError> {
21111        let mut options: Vec<KeyValueOption> = Vec::new();
21112        let mut delimiter = KeyValueOptionsDelimiter::Space;
21113        if parenthesized {
21114            self.expect_token(&Token::LParen)?;
21115        }
21116        loop {
21117            match self.next_token().token {
21118                Token::RParen => {
21119                    if parenthesized {
21120                        break;
21121                    } else {
21122                        return self.expected_ref(" another option or EOF", self.peek_token_ref());
21123                    }
21124                }
21125                Token::EOF => break,
21126                Token::SemiColon => {
21127                    self.prev_token();
21128                    break;
21129                }
21130                Token::Comma => {
21131                    delimiter = KeyValueOptionsDelimiter::Comma;
21132                    continue;
21133                }
21134                Token::Word(w) if !end_words.contains(&w.keyword) => {
21135                    options.push(self.parse_key_value_option(&w)?)
21136                }
21137                Token::Word(w) if end_words.contains(&w.keyword) => {
21138                    self.prev_token();
21139                    break;
21140                }
21141                _ => {
21142                    return self.expected_ref(
21143                        "another option, EOF, SemiColon, Comma or ')'",
21144                        self.peek_token_ref(),
21145                    )
21146                }
21147            };
21148        }
21149
21150        Ok(KeyValueOptions { delimiter, options })
21151    }
21152
21153    /// Parses a `KEY = VALUE` construct based on the specified key
21154    pub(crate) fn parse_key_value_option(
21155        &mut self,
21156        key: &Word,
21157    ) -> Result<KeyValueOption, ParserError> {
21158        self.expect_token(&Token::Eq)?;
21159        let peeked_token = self.peek_token();
21160        match peeked_token.token {
21161            Token::SingleQuotedString(_) => Ok(KeyValueOption {
21162                option_name: key.value.clone(),
21163                option_value: KeyValueOptionKind::Single(self.parse_value()?),
21164            }),
21165            Token::Word(word)
21166                if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
21167            {
21168                Ok(KeyValueOption {
21169                    option_name: key.value.clone(),
21170                    option_value: KeyValueOptionKind::Single(self.parse_value()?),
21171                })
21172            }
21173            Token::Number(..) => Ok(KeyValueOption {
21174                option_name: key.value.clone(),
21175                option_value: KeyValueOptionKind::Single(self.parse_value()?),
21176            }),
21177            Token::Word(word) => {
21178                self.next_token();
21179                Ok(KeyValueOption {
21180                    option_name: key.value.clone(),
21181                    option_value: KeyValueOptionKind::Single(
21182                        Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
21183                    ),
21184                })
21185            }
21186            Token::LParen => {
21187                // Can be a list of values or a list of key value properties.
21188                // Try to parse a list of values and if that fails, try to parse
21189                // a list of key-value properties.
21190                match self.maybe_parse(|parser| {
21191                    parser.expect_token(&Token::LParen)?;
21192                    let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
21193                    parser.expect_token(&Token::RParen)?;
21194                    values
21195                })? {
21196                    Some(values) => Ok(KeyValueOption {
21197                        option_name: key.value.clone(),
21198                        option_value: KeyValueOptionKind::Multi(values),
21199                    }),
21200                    None => Ok(KeyValueOption {
21201                        option_name: key.value.clone(),
21202                        option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
21203                            self.parse_key_value_options(true, &[])?,
21204                        )),
21205                    }),
21206                }
21207            }
21208            _ => self.expected_ref("expected option value", self.peek_token_ref()),
21209        }
21210    }
21211
21212    /// Parses a RESET statement
21213    fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
21214        if self.parse_keyword(Keyword::ALL) {
21215            return Ok(ResetStatement { reset: Reset::ALL });
21216        }
21217
21218        if self.parse_keywords(&[Keyword::SESSION, Keyword::AUTHORIZATION]) {
21219            return Ok(ResetStatement {
21220                reset: Reset::SessionAuthorization,
21221            });
21222        }
21223
21224        let obj = self.parse_object_name(false)?;
21225        Ok(ResetStatement {
21226            reset: Reset::ConfigurationParameter(obj),
21227        })
21228    }
21229}
21230
21231fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
21232    if let Some(prefix) = prefix {
21233        Expr::Prefixed {
21234            prefix,
21235            value: Box::new(expr),
21236        }
21237    } else {
21238        expr
21239    }
21240}
21241
21242impl Word {
21243    /// Convert a reference to this word into an [`Ident`] by cloning the value.
21244    ///
21245    /// Use this method when you need to keep the original `Word` around.
21246    /// If you can consume the `Word`, prefer [`into_ident`](Self::into_ident) instead
21247    /// to avoid cloning.
21248    #[inline]
21249    pub fn to_ident(&self, span: Span) -> Ident {
21250        Ident {
21251            value: self.value.clone(),
21252            quote_style: self.quote_style,
21253            span,
21254        }
21255    }
21256
21257    /// Convert this word into an [`Ident`] identifier, consuming the `Word`.
21258    ///
21259    /// This avoids cloning the string value. If you need to keep the original
21260    /// `Word`, use [`to_ident`](Self::to_ident) instead.
21261    pub fn into_ident(self, span: Span) -> Ident {
21262        Ident {
21263            value: self.value,
21264            quote_style: self.quote_style,
21265            span,
21266        }
21267    }
21268}
21269
21270#[cfg(test)]
21271mod tests {
21272    use crate::test_utils::{all_dialects, TestedDialects};
21273
21274    use super::*;
21275
21276    #[test]
21277    fn test_prev_index() {
21278        let sql = "SELECT version";
21279        all_dialects().run_parser_method(sql, |parser| {
21280            assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
21281            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21282            parser.prev_token();
21283            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21284            assert_eq!(parser.next_token(), Token::make_word("version", None));
21285            parser.prev_token();
21286            assert_eq!(parser.peek_token(), Token::make_word("version", None));
21287            assert_eq!(parser.next_token(), Token::make_word("version", None));
21288            assert_eq!(parser.peek_token(), Token::EOF);
21289            parser.prev_token();
21290            assert_eq!(parser.next_token(), Token::make_word("version", None));
21291            assert_eq!(parser.next_token(), Token::EOF);
21292            assert_eq!(parser.next_token(), Token::EOF);
21293            parser.prev_token();
21294        });
21295    }
21296
21297    #[test]
21298    fn test_peek_tokens() {
21299        all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
21300            assert!(matches!(
21301                parser.peek_tokens(),
21302                [Token::Word(Word {
21303                    keyword: Keyword::SELECT,
21304                    ..
21305                })]
21306            ));
21307
21308            assert!(matches!(
21309                parser.peek_tokens(),
21310                [
21311                    Token::Word(Word {
21312                        keyword: Keyword::SELECT,
21313                        ..
21314                    }),
21315                    Token::Word(_),
21316                    Token::Word(Word {
21317                        keyword: Keyword::AS,
21318                        ..
21319                    }),
21320                ]
21321            ));
21322
21323            for _ in 0..4 {
21324                parser.next_token();
21325            }
21326
21327            assert!(matches!(
21328                parser.peek_tokens(),
21329                [
21330                    Token::Word(Word {
21331                        keyword: Keyword::FROM,
21332                        ..
21333                    }),
21334                    Token::Word(_),
21335                    Token::EOF,
21336                    Token::EOF,
21337                ]
21338            ))
21339        })
21340    }
21341
21342    #[cfg(test)]
21343    mod test_parse_data_type {
21344        use crate::ast::{
21345            CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
21346        };
21347        use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
21348        use crate::test_utils::TestedDialects;
21349
21350        macro_rules! test_parse_data_type {
21351            ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
21352                $dialect.run_parser_method(&*$input, |parser| {
21353                    let data_type = parser.parse_data_type().unwrap();
21354                    assert_eq!($expected_type, data_type);
21355                    assert_eq!($input.to_string(), data_type.to_string());
21356                });
21357            }};
21358        }
21359
21360        #[test]
21361        fn test_ansii_character_string_types() {
21362            // Character string types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-string-type>
21363            let dialect =
21364                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21365
21366            test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
21367
21368            test_parse_data_type!(
21369                dialect,
21370                "CHARACTER(20)",
21371                DataType::Character(Some(CharacterLength::IntegerLength {
21372                    length: 20,
21373                    unit: None
21374                }))
21375            );
21376
21377            test_parse_data_type!(
21378                dialect,
21379                "CHARACTER(20 CHARACTERS)",
21380                DataType::Character(Some(CharacterLength::IntegerLength {
21381                    length: 20,
21382                    unit: Some(CharLengthUnits::Characters)
21383                }))
21384            );
21385
21386            test_parse_data_type!(
21387                dialect,
21388                "CHARACTER(20 OCTETS)",
21389                DataType::Character(Some(CharacterLength::IntegerLength {
21390                    length: 20,
21391                    unit: Some(CharLengthUnits::Octets)
21392                }))
21393            );
21394
21395            test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
21396
21397            test_parse_data_type!(
21398                dialect,
21399                "CHAR(20)",
21400                DataType::Char(Some(CharacterLength::IntegerLength {
21401                    length: 20,
21402                    unit: None
21403                }))
21404            );
21405
21406            test_parse_data_type!(
21407                dialect,
21408                "CHAR(20 CHARACTERS)",
21409                DataType::Char(Some(CharacterLength::IntegerLength {
21410                    length: 20,
21411                    unit: Some(CharLengthUnits::Characters)
21412                }))
21413            );
21414
21415            test_parse_data_type!(
21416                dialect,
21417                "CHAR(20 OCTETS)",
21418                DataType::Char(Some(CharacterLength::IntegerLength {
21419                    length: 20,
21420                    unit: Some(CharLengthUnits::Octets)
21421                }))
21422            );
21423
21424            test_parse_data_type!(
21425                dialect,
21426                "CHARACTER VARYING(20)",
21427                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21428                    length: 20,
21429                    unit: None
21430                }))
21431            );
21432
21433            test_parse_data_type!(
21434                dialect,
21435                "CHARACTER VARYING(20 CHARACTERS)",
21436                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21437                    length: 20,
21438                    unit: Some(CharLengthUnits::Characters)
21439                }))
21440            );
21441
21442            test_parse_data_type!(
21443                dialect,
21444                "CHARACTER VARYING(20 OCTETS)",
21445                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21446                    length: 20,
21447                    unit: Some(CharLengthUnits::Octets)
21448                }))
21449            );
21450
21451            test_parse_data_type!(
21452                dialect,
21453                "CHAR VARYING(20)",
21454                DataType::CharVarying(Some(CharacterLength::IntegerLength {
21455                    length: 20,
21456                    unit: None
21457                }))
21458            );
21459
21460            test_parse_data_type!(
21461                dialect,
21462                "CHAR VARYING(20 CHARACTERS)",
21463                DataType::CharVarying(Some(CharacterLength::IntegerLength {
21464                    length: 20,
21465                    unit: Some(CharLengthUnits::Characters)
21466                }))
21467            );
21468
21469            test_parse_data_type!(
21470                dialect,
21471                "CHAR VARYING(20 OCTETS)",
21472                DataType::CharVarying(Some(CharacterLength::IntegerLength {
21473                    length: 20,
21474                    unit: Some(CharLengthUnits::Octets)
21475                }))
21476            );
21477
21478            test_parse_data_type!(
21479                dialect,
21480                "VARCHAR(20)",
21481                DataType::Varchar(Some(CharacterLength::IntegerLength {
21482                    length: 20,
21483                    unit: None
21484                }))
21485            );
21486        }
21487
21488        #[test]
21489        fn test_ansii_character_large_object_types() {
21490            // Character large object types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-length>
21491            let dialect =
21492                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21493
21494            test_parse_data_type!(
21495                dialect,
21496                "CHARACTER LARGE OBJECT",
21497                DataType::CharacterLargeObject(None)
21498            );
21499            test_parse_data_type!(
21500                dialect,
21501                "CHARACTER LARGE OBJECT(20)",
21502                DataType::CharacterLargeObject(Some(20))
21503            );
21504
21505            test_parse_data_type!(
21506                dialect,
21507                "CHAR LARGE OBJECT",
21508                DataType::CharLargeObject(None)
21509            );
21510            test_parse_data_type!(
21511                dialect,
21512                "CHAR LARGE OBJECT(20)",
21513                DataType::CharLargeObject(Some(20))
21514            );
21515
21516            test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
21517            test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
21518        }
21519
21520        #[test]
21521        fn test_parse_custom_types() {
21522            let dialect =
21523                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21524
21525            test_parse_data_type!(
21526                dialect,
21527                "GEOMETRY",
21528                DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
21529            );
21530
21531            test_parse_data_type!(
21532                dialect,
21533                "GEOMETRY(POINT)",
21534                DataType::Custom(
21535                    ObjectName::from(vec!["GEOMETRY".into()]),
21536                    vec!["POINT".to_string()]
21537                )
21538            );
21539
21540            test_parse_data_type!(
21541                dialect,
21542                "GEOMETRY(POINT, 4326)",
21543                DataType::Custom(
21544                    ObjectName::from(vec!["GEOMETRY".into()]),
21545                    vec!["POINT".to_string(), "4326".to_string()]
21546                )
21547            );
21548        }
21549
21550        #[test]
21551        fn test_ansii_exact_numeric_types() {
21552            // Exact numeric types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type>
21553            let dialect = TestedDialects::new(vec![
21554                Box::new(GenericDialect {}),
21555                Box::new(AnsiDialect {}),
21556                Box::new(PostgreSqlDialect {}),
21557            ]);
21558
21559            test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
21560
21561            test_parse_data_type!(
21562                dialect,
21563                "NUMERIC(2)",
21564                DataType::Numeric(ExactNumberInfo::Precision(2))
21565            );
21566
21567            test_parse_data_type!(
21568                dialect,
21569                "NUMERIC(2,10)",
21570                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
21571            );
21572
21573            test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
21574
21575            test_parse_data_type!(
21576                dialect,
21577                "DECIMAL(2)",
21578                DataType::Decimal(ExactNumberInfo::Precision(2))
21579            );
21580
21581            test_parse_data_type!(
21582                dialect,
21583                "DECIMAL(2,10)",
21584                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
21585            );
21586
21587            test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
21588
21589            test_parse_data_type!(
21590                dialect,
21591                "DEC(2)",
21592                DataType::Dec(ExactNumberInfo::Precision(2))
21593            );
21594
21595            test_parse_data_type!(
21596                dialect,
21597                "DEC(2,10)",
21598                DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
21599            );
21600
21601            // Test negative scale values.
21602            test_parse_data_type!(
21603                dialect,
21604                "NUMERIC(10,-2)",
21605                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
21606            );
21607
21608            test_parse_data_type!(
21609                dialect,
21610                "DECIMAL(1000,-10)",
21611                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
21612            );
21613
21614            test_parse_data_type!(
21615                dialect,
21616                "DEC(5,-1000)",
21617                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
21618            );
21619
21620            test_parse_data_type!(
21621                dialect,
21622                "NUMERIC(10,-5)",
21623                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
21624            );
21625
21626            test_parse_data_type!(
21627                dialect,
21628                "DECIMAL(20,-10)",
21629                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
21630            );
21631
21632            test_parse_data_type!(
21633                dialect,
21634                "DEC(5,-2)",
21635                DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
21636            );
21637
21638            dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
21639                let data_type = parser.parse_data_type().unwrap();
21640                assert_eq!(
21641                    DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
21642                    data_type
21643                );
21644                // Note: Explicit '+' sign is not preserved in output, which is correct
21645                assert_eq!("NUMERIC(10,5)", data_type.to_string());
21646            });
21647        }
21648
21649        #[test]
21650        fn test_ansii_date_type() {
21651            // Datetime types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type>
21652            let dialect =
21653                TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21654
21655            test_parse_data_type!(dialect, "DATE", DataType::Date);
21656
21657            test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
21658
21659            test_parse_data_type!(
21660                dialect,
21661                "TIME(6)",
21662                DataType::Time(Some(6), TimezoneInfo::None)
21663            );
21664
21665            test_parse_data_type!(
21666                dialect,
21667                "TIME WITH TIME ZONE",
21668                DataType::Time(None, TimezoneInfo::WithTimeZone)
21669            );
21670
21671            test_parse_data_type!(
21672                dialect,
21673                "TIME(6) WITH TIME ZONE",
21674                DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21675            );
21676
21677            test_parse_data_type!(
21678                dialect,
21679                "TIME WITHOUT TIME ZONE",
21680                DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21681            );
21682
21683            test_parse_data_type!(
21684                dialect,
21685                "TIME(6) WITHOUT TIME ZONE",
21686                DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21687            );
21688
21689            test_parse_data_type!(
21690                dialect,
21691                "TIMESTAMP",
21692                DataType::Timestamp(None, TimezoneInfo::None)
21693            );
21694
21695            test_parse_data_type!(
21696                dialect,
21697                "TIMESTAMP(22)",
21698                DataType::Timestamp(Some(22), TimezoneInfo::None)
21699            );
21700
21701            test_parse_data_type!(
21702                dialect,
21703                "TIMESTAMP(22) WITH TIME ZONE",
21704                DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21705            );
21706
21707            test_parse_data_type!(
21708                dialect,
21709                "TIMESTAMP(33) WITHOUT TIME ZONE",
21710                DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21711            );
21712        }
21713    }
21714
21715    #[test]
21716    fn test_parse_schema_name() {
21717        // The expected name should be identical as the input name, that's why I don't receive both
21718        macro_rules! test_parse_schema_name {
21719            ($input:expr, $expected_name:expr $(,)?) => {{
21720                all_dialects().run_parser_method(&*$input, |parser| {
21721                    let schema_name = parser.parse_schema_name().unwrap();
21722                    // Validate that the structure is the same as expected
21723                    assert_eq!(schema_name, $expected_name);
21724                    // Validate that the input and the expected structure serialization are the same
21725                    assert_eq!(schema_name.to_string(), $input.to_string());
21726                });
21727            }};
21728        }
21729
21730        let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21731        let dummy_authorization = Ident::new("dummy_authorization");
21732
21733        test_parse_schema_name!(
21734            format!("{dummy_name}"),
21735            SchemaName::Simple(dummy_name.clone())
21736        );
21737
21738        test_parse_schema_name!(
21739            format!("AUTHORIZATION {dummy_authorization}"),
21740            SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21741        );
21742        test_parse_schema_name!(
21743            format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21744            SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21745        );
21746    }
21747
21748    #[test]
21749    fn mysql_parse_index_table_constraint() {
21750        macro_rules! test_parse_table_constraint {
21751            ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21752                $dialect.run_parser_method(&*$input, |parser| {
21753                    let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21754                    // Validate that the structure is the same as expected
21755                    assert_eq!(constraint, $expected);
21756                    // Validate that the input and the expected structure serialization are the same
21757                    assert_eq!(constraint.to_string(), $input.to_string());
21758                });
21759            }};
21760        }
21761
21762        fn mk_expected_col(name: &str) -> IndexColumn {
21763            IndexColumn {
21764                column: OrderByExpr {
21765                    expr: Expr::Identifier(name.into()),
21766                    options: OrderByOptions {
21767                        sort: None,
21768                        nulls_first: None,
21769                    },
21770                    with_fill: None,
21771                },
21772                operator_class: None,
21773            }
21774        }
21775
21776        let dialect =
21777            TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21778
21779        test_parse_table_constraint!(
21780            dialect,
21781            "INDEX (c1)",
21782            IndexConstraint {
21783                display_as_key: false,
21784                name: None,
21785                index_type: None,
21786                columns: vec![mk_expected_col("c1")],
21787                index_options: vec![],
21788            }
21789            .into()
21790        );
21791
21792        test_parse_table_constraint!(
21793            dialect,
21794            "KEY (c1)",
21795            IndexConstraint {
21796                display_as_key: true,
21797                name: None,
21798                index_type: None,
21799                columns: vec![mk_expected_col("c1")],
21800                index_options: vec![],
21801            }
21802            .into()
21803        );
21804
21805        test_parse_table_constraint!(
21806            dialect,
21807            "INDEX 'index' (c1, c2)",
21808            TableConstraint::Index(IndexConstraint {
21809                display_as_key: false,
21810                name: Some(Ident::with_quote('\'', "index")),
21811                index_type: None,
21812                columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21813                index_options: vec![],
21814            })
21815        );
21816
21817        test_parse_table_constraint!(
21818            dialect,
21819            "INDEX USING BTREE (c1)",
21820            IndexConstraint {
21821                display_as_key: false,
21822                name: None,
21823                index_type: Some(IndexType::BTree),
21824                columns: vec![mk_expected_col("c1")],
21825                index_options: vec![],
21826            }
21827            .into()
21828        );
21829
21830        test_parse_table_constraint!(
21831            dialect,
21832            "INDEX USING HASH (c1)",
21833            IndexConstraint {
21834                display_as_key: false,
21835                name: None,
21836                index_type: Some(IndexType::Hash),
21837                columns: vec![mk_expected_col("c1")],
21838                index_options: vec![],
21839            }
21840            .into()
21841        );
21842
21843        test_parse_table_constraint!(
21844            dialect,
21845            "INDEX idx_name USING BTREE (c1)",
21846            IndexConstraint {
21847                display_as_key: false,
21848                name: Some(Ident::new("idx_name")),
21849                index_type: Some(IndexType::BTree),
21850                columns: vec![mk_expected_col("c1")],
21851                index_options: vec![],
21852            }
21853            .into()
21854        );
21855
21856        test_parse_table_constraint!(
21857            dialect,
21858            "INDEX idx_name USING HASH (c1)",
21859            IndexConstraint {
21860                display_as_key: false,
21861                name: Some(Ident::new("idx_name")),
21862                index_type: Some(IndexType::Hash),
21863                columns: vec![mk_expected_col("c1")],
21864                index_options: vec![],
21865            }
21866            .into()
21867        );
21868    }
21869
21870    #[test]
21871    fn test_tokenizer_error_loc() {
21872        let sql = "foo '";
21873        let ast = Parser::parse_sql(&GenericDialect, sql);
21874        assert_eq!(
21875            ast,
21876            Err(ParserError::TokenizerError(
21877                "Unterminated string literal at Line: 1, Column: 5".to_string()
21878            ))
21879        );
21880    }
21881
21882    #[test]
21883    fn test_parser_error_loc() {
21884        let sql = "SELECT this is a syntax error";
21885        let ParserError::ParserError(msg) = Parser::parse_sql(&GenericDialect, sql).unwrap_err()
21886        else {
21887            panic!("expected ParserError::ParserError");
21888        };
21889        assert!(
21890            msg.ends_with("found: a at Line: 1, Column: 16"),
21891            "unexpected error message: {msg}"
21892        );
21893    }
21894
21895    #[test]
21896    fn test_nested_explain_error() {
21897        let sql = "EXPLAIN EXPLAIN SELECT 1";
21898        let ast = Parser::parse_sql(&GenericDialect, sql);
21899        assert_eq!(
21900            ast,
21901            Err(ParserError::ParserError(
21902                "Explain must be root of the plan".to_string()
21903            ))
21904        );
21905    }
21906
21907    #[test]
21908    fn test_parse_multipart_identifier_positive() {
21909        let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21910
21911        // parse multipart with quotes
21912        let expected = vec![
21913            Ident {
21914                value: "CATALOG".to_string(),
21915                quote_style: None,
21916                span: Span::empty(),
21917            },
21918            Ident {
21919                value: "F(o)o. \"bar".to_string(),
21920                quote_style: Some('"'),
21921                span: Span::empty(),
21922            },
21923            Ident {
21924                value: "table".to_string(),
21925                quote_style: None,
21926                span: Span::empty(),
21927            },
21928        ];
21929        dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21930            let actual = parser.parse_multipart_identifier().unwrap();
21931            assert_eq!(expected, actual);
21932        });
21933
21934        // allow whitespace between ident parts
21935        let expected = vec![
21936            Ident {
21937                value: "CATALOG".to_string(),
21938                quote_style: None,
21939                span: Span::empty(),
21940            },
21941            Ident {
21942                value: "table".to_string(),
21943                quote_style: None,
21944                span: Span::empty(),
21945            },
21946        ];
21947        dialect.run_parser_method("CATALOG . table", |parser| {
21948            let actual = parser.parse_multipart_identifier().unwrap();
21949            assert_eq!(expected, actual);
21950        });
21951    }
21952
21953    #[test]
21954    fn test_parse_multipart_identifier_negative() {
21955        macro_rules! test_parse_multipart_identifier_error {
21956            ($input:expr, $expected_err:expr $(,)?) => {{
21957                all_dialects().run_parser_method(&*$input, |parser| {
21958                    let actual_err = parser.parse_multipart_identifier().unwrap_err();
21959                    assert_eq!(actual_err.to_string(), $expected_err);
21960                });
21961            }};
21962        }
21963
21964        test_parse_multipart_identifier_error!(
21965            "",
21966            "sql parser error: Empty input when parsing identifier",
21967        );
21968
21969        test_parse_multipart_identifier_error!(
21970            "*schema.table",
21971            "sql parser error: Unexpected token in identifier: *",
21972        );
21973
21974        test_parse_multipart_identifier_error!(
21975            "schema.table*",
21976            "sql parser error: Unexpected token in identifier: *",
21977        );
21978
21979        test_parse_multipart_identifier_error!(
21980            "schema.table.",
21981            "sql parser error: Trailing period in identifier",
21982        );
21983
21984        test_parse_multipart_identifier_error!(
21985            "schema.*",
21986            "sql parser error: Unexpected token following period in identifier: *",
21987        );
21988    }
21989
21990    #[test]
21991    fn test_mysql_partition_selection() {
21992        let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21993        let expected = vec!["p0", "p2"];
21994
21995        let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21996        assert_eq!(ast.len(), 1);
21997        if let Statement::Query(v) = &ast[0] {
21998            if let SetExpr::Select(select) = &*v.body {
21999                assert_eq!(select.from.len(), 1);
22000                let from: &TableWithJoins = &select.from[0];
22001                let table_factor = &from.relation;
22002                if let TableFactor::Table { partitions, .. } = table_factor {
22003                    let actual: Vec<&str> = partitions
22004                        .iter()
22005                        .map(|ident| ident.value.as_str())
22006                        .collect();
22007                    assert_eq!(expected, actual);
22008                }
22009            }
22010        } else {
22011            panic!("fail to parse mysql partition selection");
22012        }
22013    }
22014
22015    #[test]
22016    fn test_replace_into_placeholders() {
22017        let sql = "REPLACE INTO t (a) VALUES (&a)";
22018
22019        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22020    }
22021
22022    #[test]
22023    fn test_replace_into_set_placeholder() {
22024        let sql = "REPLACE INTO t SET ?";
22025
22026        assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22027    }
22028
22029    #[test]
22030    fn test_replace_incomplete() {
22031        let sql = r#"REPLACE"#;
22032
22033        assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
22034    }
22035
22036    #[test]
22037    fn test_placeholder_invalid_whitespace() {
22038        for w in ["  ", "/*invalid*/"] {
22039            let sql = format!("\nSELECT\n  :{w}fooBar");
22040            assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
22041        }
22042    }
22043}