sqlparser/parser/
mod.rs

1// Licensed under the Apache License, Version 2.0 (the "License");
2// you may not use this file except in compliance with the License.
3// You may obtain a copy of the License at
4//
5// http://www.apache.org/licenses/LICENSE-2.0
6//
7// Unless required by applicable law or agreed to in writing, software
8// distributed under the License is distributed on an "AS IS" BASIS,
9// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10// See the License for the specific language governing permissions and
11// limitations under the License.
12
13//! SQL Parser
14
15#[cfg(not(feature = "std"))]
16use alloc::{
17    boxed::Box,
18    format,
19    string::{String, ToString},
20    vec,
21    vec::Vec,
22};
23use core::fmt;
24
25use log::debug;
26
27use IsLateral::*;
28use IsOptional::*;
29
30use crate::ast::helpers::stmt_create_table::{BigQueryTableConfiguration, CreateTableBuilder};
31use crate::ast::*;
32use crate::dialect::*;
33use crate::keywords::{self, Keyword, ALL_KEYWORDS};
34use crate::tokenizer::*;
35
36mod alter;
37
38#[derive(Debug, Clone, PartialEq, Eq)]
39pub enum ParserError {
40    TokenizerError(String),
41    ParserError(String),
42    RecursionLimitExceeded,
43}
44
45// Use `Parser::expected` instead, if possible
46macro_rules! parser_err {
47    ($MSG:expr, $loc:expr) => {
48        Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
49    };
50}
51
52// Returns a successful result if the optional expression is some
53macro_rules! return_ok_if_some {
54    ($e:expr) => {{
55        if let Some(v) = $e {
56            return Ok(v);
57        }
58    }};
59}
60
61#[cfg(feature = "std")]
62/// Implementation [`RecursionCounter`] if std is available
63mod recursion {
64    use std::cell::Cell;
65    use std::rc::Rc;
66
67    use super::ParserError;
68
69    /// Tracks remaining recursion depth. This value is decremented on
70    /// each call to `try_decrease()`, when it reaches 0 an error will
71    /// be returned.
72    ///
73    /// Note: Uses an Rc and Cell in order to satisfy the Rust
74    /// borrow checker so the automatic DepthGuard decrement a
75    /// reference to the counter.
76    pub(crate) struct RecursionCounter {
77        remaining_depth: Rc<Cell<usize>>,
78    }
79
80    impl RecursionCounter {
81        /// Creates a [`RecursionCounter`] with the specified maximum
82        /// depth
83        pub fn new(remaining_depth: usize) -> Self {
84            Self {
85                remaining_depth: Rc::new(remaining_depth.into()),
86            }
87        }
88
89        /// Decreases the remaining depth by 1.
90        ///
91        /// Returns `Err` if the remaining depth falls to 0.
92        ///
93        /// Returns a [`DepthGuard`] which will adds 1 to the
94        /// remaining depth upon drop;
95        pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
96            let old_value = self.remaining_depth.get();
97            // ran out of space
98            if old_value == 0 {
99                Err(ParserError::RecursionLimitExceeded)
100            } else {
101                self.remaining_depth.set(old_value - 1);
102                Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
103            }
104        }
105    }
106
107    /// Guard that increass the remaining depth by 1 on drop
108    pub struct DepthGuard {
109        remaining_depth: Rc<Cell<usize>>,
110    }
111
112    impl DepthGuard {
113        fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
114            Self { remaining_depth }
115        }
116    }
117    impl Drop for DepthGuard {
118        fn drop(&mut self) {
119            let old_value = self.remaining_depth.get();
120            self.remaining_depth.set(old_value + 1);
121        }
122    }
123}
124
125#[cfg(not(feature = "std"))]
126mod recursion {
127    /// Implementation [`RecursionCounter`] if std is NOT available (and does not
128    /// guard against stack overflow).
129    ///
130    /// Has the same API as the std RecursionCounter implementation
131    /// but does not actually limit stack depth.
132    pub(crate) struct RecursionCounter {}
133
134    impl RecursionCounter {
135        pub fn new(_remaining_depth: usize) -> Self {
136            Self {}
137        }
138        pub fn try_decrease(&self) -> Result<DepthGuard, super::ParserError> {
139            Ok(DepthGuard {})
140        }
141    }
142
143    pub struct DepthGuard {}
144}
145
146use recursion::RecursionCounter;
147
148#[derive(PartialEq, Eq)]
149pub enum IsOptional {
150    Optional,
151    Mandatory,
152}
153
154pub enum IsLateral {
155    Lateral,
156    NotLateral,
157}
158
159pub enum WildcardExpr {
160    Expr(Expr),
161    QualifiedWildcard(ObjectName),
162    Wildcard,
163}
164
165impl From<TokenizerError> for ParserError {
166    fn from(e: TokenizerError) -> Self {
167        ParserError::TokenizerError(e.to_string())
168    }
169}
170
171impl fmt::Display for ParserError {
172    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
173        write!(
174            f,
175            "sql parser error: {}",
176            match self {
177                ParserError::TokenizerError(s) => s,
178                ParserError::ParserError(s) => s,
179                ParserError::RecursionLimitExceeded => "recursion limit exceeded",
180            }
181        )
182    }
183}
184
185#[cfg(feature = "std")]
186impl std::error::Error for ParserError {}
187
188// By default, allow expressions up to this deep before erroring
189const DEFAULT_REMAINING_DEPTH: usize = 50;
190
191/// Composite types declarations using angle brackets syntax can be arbitrary
192/// nested such that the following declaration is possible:
193///      `ARRAY<ARRAY<INT>>`
194/// But the tokenizer recognizes the `>>` as a ShiftRight token.
195/// We work-around that limitation when parsing a data type by accepting
196/// either a `>` or `>>` token in such cases, remembering which variant we
197/// matched.
198/// In the latter case having matched a `>>`, the parent type will not look to
199/// match its closing `>` as a result since that will have taken place at the
200/// child type.
201///
202/// See [Parser::parse_data_type] for details
203struct MatchedTrailingBracket(bool);
204
205impl From<bool> for MatchedTrailingBracket {
206    fn from(value: bool) -> Self {
207        Self(value)
208    }
209}
210
211/// Options that control how the [`Parser`] parses SQL text
212#[derive(Debug, Clone, PartialEq, Eq)]
213pub struct ParserOptions {
214    pub trailing_commas: bool,
215    /// Controls how literal values are unescaped. See
216    /// [`Tokenizer::with_unescape`] for more details.
217    pub unescape: bool,
218}
219
220impl Default for ParserOptions {
221    fn default() -> Self {
222        Self {
223            trailing_commas: false,
224            unescape: true,
225        }
226    }
227}
228
229impl ParserOptions {
230    /// Create a new [`ParserOptions`]
231    pub fn new() -> Self {
232        Default::default()
233    }
234
235    /// Set if trailing commas are allowed.
236    ///
237    /// If this option is `false` (the default), the following SQL will
238    /// not parse. If the option is `true`, the SQL will parse.
239    ///
240    /// ```sql
241    ///  SELECT
242    ///   foo,
243    ///   bar,
244    ///  FROM baz
245    /// ```
246    pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
247        self.trailing_commas = trailing_commas;
248        self
249    }
250
251    /// Set if literal values are unescaped. Defaults to true. See
252    /// [`Tokenizer::with_unescape`] for more details.
253    pub fn with_unescape(mut self, unescape: bool) -> Self {
254        self.unescape = unescape;
255        self
256    }
257}
258
259pub struct Parser<'a> {
260    tokens: Vec<TokenWithLocation>,
261    /// The index of the first unprocessed token in `self.tokens`
262    index: usize,
263    /// The current dialect to use
264    dialect: &'a dyn Dialect,
265    /// Additional options that allow you to mix & match behavior
266    /// otherwise constrained to certain dialects (e.g. trailing
267    /// commas) and/or format of parse (e.g. unescaping)
268    options: ParserOptions,
269    /// ensure the stack does not overflow by limiting recursion depth
270    recursion_counter: RecursionCounter,
271}
272
273impl<'a> Parser<'a> {
274    /// Create a parser for a [`Dialect`]
275    ///
276    /// See also [`Parser::parse_sql`]
277    ///
278    /// Example:
279    /// ```
280    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
281    /// # fn main() -> Result<(), ParserError> {
282    /// let dialect = GenericDialect{};
283    /// let statements = Parser::new(&dialect)
284    ///   .try_with_sql("SELECT * FROM foo")?
285    ///   .parse_statements()?;
286    /// # Ok(())
287    /// # }
288    /// ```
289    pub fn new(dialect: &'a dyn Dialect) -> Self {
290        Self {
291            tokens: vec![],
292            index: 0,
293            dialect,
294            recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
295            options: ParserOptions::default(),
296        }
297    }
298
299    /// Specify the maximum recursion limit while parsing.
300    ///
301    ///
302    /// [`Parser`] prevents stack overflows by returning
303    /// [`ParserError::RecursionLimitExceeded`] if the parser exceeds
304    /// this depth while processing the query.
305    ///
306    /// Example:
307    /// ```
308    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
309    /// # fn main() -> Result<(), ParserError> {
310    /// let dialect = GenericDialect{};
311    /// let result = Parser::new(&dialect)
312    ///   .with_recursion_limit(1)
313    ///   .try_with_sql("SELECT * FROM foo WHERE (a OR (b OR (c OR d)))")?
314    ///   .parse_statements();
315    ///   assert_eq!(result, Err(ParserError::RecursionLimitExceeded));
316    /// # Ok(())
317    /// # }
318    /// ```
319    pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
320        self.recursion_counter = RecursionCounter::new(recursion_limit);
321        self
322    }
323
324    /// Specify additional parser options
325    ///
326    ///
327    /// [`Parser`] supports additional options ([`ParserOptions`])
328    /// that allow you to mix & match behavior otherwise constrained
329    /// to certain dialects (e.g. trailing commas).
330    ///
331    /// Example:
332    /// ```
333    /// # use sqlparser::{parser::{Parser, ParserError, ParserOptions}, dialect::GenericDialect};
334    /// # fn main() -> Result<(), ParserError> {
335    /// let dialect = GenericDialect{};
336    /// let options = ParserOptions::new()
337    ///    .with_trailing_commas(true)
338    ///    .with_unescape(false);
339    /// let result = Parser::new(&dialect)
340    ///   .with_options(options)
341    ///   .try_with_sql("SELECT a, b, COUNT(*), FROM foo GROUP BY a, b,")?
342    ///   .parse_statements();
343    ///   assert!(matches!(result, Ok(_)));
344    /// # Ok(())
345    /// # }
346    /// ```
347    pub fn with_options(mut self, options: ParserOptions) -> Self {
348        self.options = options;
349        self
350    }
351
352    /// Reset this parser to parse the specified token stream
353    pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithLocation>) -> Self {
354        self.tokens = tokens;
355        self.index = 0;
356        self
357    }
358
359    /// Reset this parser state to parse the specified tokens
360    pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
361        // Put in dummy locations
362        let tokens_with_locations: Vec<TokenWithLocation> = tokens
363            .into_iter()
364            .map(|token| TokenWithLocation {
365                token,
366                location: Location { line: 0, column: 0 },
367            })
368            .collect();
369        self.with_tokens_with_locations(tokens_with_locations)
370    }
371
372    /// Tokenize the sql string and sets this [`Parser`]'s state to
373    /// parse the resulting tokens
374    ///
375    /// Returns an error if there was an error tokenizing the SQL string.
376    ///
377    /// See example on [`Parser::new()`] for an example
378    pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
379        debug!("Parsing sql '{}'...", sql);
380        let tokens = Tokenizer::new(self.dialect, sql)
381            .with_unescape(self.options.unescape)
382            .tokenize_with_location()?;
383        Ok(self.with_tokens_with_locations(tokens))
384    }
385
386    /// Parse potentially multiple statements
387    ///
388    /// Example
389    /// ```
390    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
391    /// # fn main() -> Result<(), ParserError> {
392    /// let dialect = GenericDialect{};
393    /// let statements = Parser::new(&dialect)
394    ///   // Parse a SQL string with 2 separate statements
395    ///   .try_with_sql("SELECT * FROM foo; SELECT * FROM bar;")?
396    ///   .parse_statements()?;
397    /// assert_eq!(statements.len(), 2);
398    /// # Ok(())
399    /// # }
400    /// ```
401    pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
402        let mut stmts = Vec::new();
403        let mut expecting_statement_delimiter = false;
404        loop {
405            // ignore empty statements (between successive statement delimiters)
406            while self.consume_token(&Token::SemiColon) {
407                expecting_statement_delimiter = false;
408            }
409
410            match self.peek_token().token {
411                Token::EOF => break,
412
413                // end of statement
414                Token::Word(word) => {
415                    if expecting_statement_delimiter && word.keyword == Keyword::END {
416                        break;
417                    }
418                }
419                _ => {}
420            }
421
422            if expecting_statement_delimiter {
423                return self.expected("end of statement", self.peek_token());
424            }
425
426            let statement = self.parse_statement()?;
427            stmts.push(statement);
428            expecting_statement_delimiter = true;
429        }
430        Ok(stmts)
431    }
432
433    /// Convenience method to parse a string with one or more SQL
434    /// statements into produce an Abstract Syntax Tree (AST).
435    ///
436    /// Example
437    /// ```
438    /// # use sqlparser::{parser::{Parser, ParserError}, dialect::GenericDialect};
439    /// # fn main() -> Result<(), ParserError> {
440    /// let dialect = GenericDialect{};
441    /// let statements = Parser::parse_sql(
442    ///   &dialect, "SELECT * FROM foo"
443    /// )?;
444    /// assert_eq!(statements.len(), 1);
445    /// # Ok(())
446    /// # }
447    /// ```
448    pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
449        Parser::new(dialect).try_with_sql(sql)?.parse_statements()
450    }
451
452    /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.),
453    /// stopping before the statement separator, if any.
454    pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
455        let _guard = self.recursion_counter.try_decrease()?;
456
457        // allow the dialect to override statement parsing
458        if let Some(statement) = self.dialect.parse_statement(self) {
459            return statement;
460        }
461
462        let next_token = self.next_token();
463        match &next_token.token {
464            Token::Word(w) => match w.keyword {
465                Keyword::KILL => Ok(self.parse_kill()?),
466                Keyword::FLUSH => Ok(self.parse_flush()?),
467                Keyword::DESCRIBE => Ok(self.parse_explain(true)?),
468                Keyword::EXPLAIN => Ok(self.parse_explain(false)?),
469                Keyword::ANALYZE => Ok(self.parse_analyze()?),
470                Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
471                    self.prev_token();
472                    Ok(Statement::Query(Box::new(self.parse_query()?)))
473                }
474                Keyword::TRUNCATE => Ok(self.parse_truncate()?),
475                Keyword::ATTACH => Ok(self.parse_attach_database()?),
476                Keyword::MSCK => Ok(self.parse_msck()?),
477                Keyword::CREATE => Ok(self.parse_create()?),
478                Keyword::CACHE => Ok(self.parse_cache_table()?),
479                Keyword::DROP => Ok(self.parse_drop()?),
480                Keyword::DISCARD => Ok(self.parse_discard()?),
481                Keyword::DECLARE => Ok(self.parse_declare()?),
482                Keyword::FETCH => Ok(self.parse_fetch_statement()?),
483                Keyword::DELETE => Ok(self.parse_delete()?),
484                Keyword::INSERT => Ok(self.parse_insert()?),
485                Keyword::REPLACE => Ok(self.parse_replace()?),
486                Keyword::UNCACHE => Ok(self.parse_uncache_table()?),
487                Keyword::UPDATE => Ok(self.parse_update()?),
488                Keyword::ALTER => Ok(self.parse_alter()?),
489                Keyword::CALL => Ok(self.parse_call()?),
490                Keyword::COPY => Ok(self.parse_copy()?),
491                Keyword::CLOSE => Ok(self.parse_close()?),
492                Keyword::SET => Ok(self.parse_set()?),
493                Keyword::SHOW => Ok(self.parse_show()?),
494                Keyword::USE => Ok(self.parse_use()?),
495                Keyword::GRANT => Ok(self.parse_grant()?),
496                Keyword::REVOKE => Ok(self.parse_revoke()?),
497                Keyword::START => Ok(self.parse_start_transaction()?),
498                // `BEGIN` is a nonstandard but common alias for the
499                // standard `START TRANSACTION` statement. It is supported
500                // by at least PostgreSQL and MySQL.
501                Keyword::BEGIN => Ok(self.parse_begin()?),
502                // `END` is a nonstandard but common alias for the
503                // standard `COMMIT TRANSACTION` statement. It is supported
504                // by PostgreSQL.
505                Keyword::END => Ok(self.parse_end()?),
506                Keyword::SAVEPOINT => Ok(self.parse_savepoint()?),
507                Keyword::RELEASE => Ok(self.parse_release()?),
508                Keyword::COMMIT => Ok(self.parse_commit()?),
509                Keyword::ROLLBACK => Ok(self.parse_rollback()?),
510                Keyword::ASSERT => Ok(self.parse_assert()?),
511                // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
512                // syntaxes. They are used for Postgres prepared statement.
513                Keyword::DEALLOCATE => Ok(self.parse_deallocate()?),
514                Keyword::EXECUTE => Ok(self.parse_execute()?),
515                Keyword::PREPARE => Ok(self.parse_prepare()?),
516                Keyword::MERGE => Ok(self.parse_merge()?),
517                // `PRAGMA` is sqlite specific https://www.sqlite.org/pragma.html
518                Keyword::PRAGMA => Ok(self.parse_pragma()?),
519                _ => self.expected("an SQL statement", next_token),
520            },
521            Token::LParen => {
522                self.prev_token();
523                Ok(Statement::Query(Box::new(self.parse_query()?)))
524            }
525            _ => self.expected("an SQL statement", next_token),
526        }
527    }
528
529    pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
530        let mut channel = None;
531        let mut tables: Vec<ObjectName> = vec![];
532        let mut read_lock = false;
533        let mut export = false;
534
535        if !dialect_of!(self is MySqlDialect | GenericDialect) {
536            return parser_err!("Unsupported statement FLUSH", self.peek_token().location);
537        }
538
539        let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
540            Some(FlushLocation::NoWriteToBinlog)
541        } else if self.parse_keyword(Keyword::LOCAL) {
542            Some(FlushLocation::Local)
543        } else {
544            None
545        };
546
547        let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
548            FlushType::BinaryLogs
549        } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
550            FlushType::EngineLogs
551        } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
552            FlushType::ErrorLogs
553        } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
554            FlushType::GeneralLogs
555        } else if self.parse_keywords(&[Keyword::HOSTS]) {
556            FlushType::Hosts
557        } else if self.parse_keyword(Keyword::PRIVILEGES) {
558            FlushType::Privileges
559        } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
560            FlushType::OptimizerCosts
561        } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
562            if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
563                channel = Some(self.parse_object_name(false).unwrap().to_string());
564            }
565            FlushType::RelayLogs
566        } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
567            FlushType::SlowLogs
568        } else if self.parse_keyword(Keyword::STATUS) {
569            FlushType::Status
570        } else if self.parse_keyword(Keyword::USER_RESOURCES) {
571            FlushType::UserResources
572        } else if self.parse_keywords(&[Keyword::LOGS]) {
573            FlushType::Logs
574        } else if self.parse_keywords(&[Keyword::TABLES]) {
575            loop {
576                let next_token = self.next_token();
577                match &next_token.token {
578                    Token::Word(w) => match w.keyword {
579                        Keyword::WITH => {
580                            read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
581                        }
582                        Keyword::FOR => {
583                            export = self.parse_keyword(Keyword::EXPORT);
584                        }
585                        Keyword::NoKeyword => {
586                            self.prev_token();
587                            tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
588                        }
589                        _ => {}
590                    },
591                    _ => {
592                        break;
593                    }
594                }
595            }
596
597            FlushType::Tables
598        } else {
599            return self.expected(
600                "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
601                 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
602                self.peek_token(),
603            );
604        };
605
606        Ok(Statement::Flush {
607            object_type,
608            location,
609            channel,
610            read_lock,
611            export,
612            tables,
613        })
614    }
615
616    pub fn parse_msck(&mut self) -> Result<Statement, ParserError> {
617        let repair = self.parse_keyword(Keyword::REPAIR);
618        self.expect_keyword(Keyword::TABLE)?;
619        let table_name = self.parse_object_name(false)?;
620        let partition_action = self
621            .maybe_parse(|parser| {
622                let pa = match parser.parse_one_of_keywords(&[
623                    Keyword::ADD,
624                    Keyword::DROP,
625                    Keyword::SYNC,
626                ]) {
627                    Some(Keyword::ADD) => Some(AddDropSync::ADD),
628                    Some(Keyword::DROP) => Some(AddDropSync::DROP),
629                    Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
630                    _ => None,
631                };
632                parser.expect_keyword(Keyword::PARTITIONS)?;
633                Ok(pa)
634            })
635            .unwrap_or_default();
636        Ok(Statement::Msck {
637            repair,
638            table_name,
639            partition_action,
640        })
641    }
642
643    pub fn parse_truncate(&mut self) -> Result<Statement, ParserError> {
644        let table = self.parse_keyword(Keyword::TABLE);
645        let table_name = self.parse_object_name(false)?;
646        let mut partitions = None;
647        if self.parse_keyword(Keyword::PARTITION) {
648            self.expect_token(&Token::LParen)?;
649            partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
650            self.expect_token(&Token::RParen)?;
651        }
652        Ok(Statement::Truncate {
653            table_name,
654            partitions,
655            table,
656        })
657    }
658
659    pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
660        let database = self.parse_keyword(Keyword::DATABASE);
661        let database_file_name = self.parse_expr()?;
662        self.expect_keyword(Keyword::AS)?;
663        let schema_name = self.parse_identifier(false)?;
664        Ok(Statement::AttachDatabase {
665            database,
666            schema_name,
667            database_file_name,
668        })
669    }
670
671    pub fn parse_analyze(&mut self) -> Result<Statement, ParserError> {
672        self.expect_keyword(Keyword::TABLE)?;
673        let table_name = self.parse_object_name(false)?;
674        let mut for_columns = false;
675        let mut cache_metadata = false;
676        let mut noscan = false;
677        let mut partitions = None;
678        let mut compute_statistics = false;
679        let mut columns = vec![];
680        loop {
681            match self.parse_one_of_keywords(&[
682                Keyword::PARTITION,
683                Keyword::FOR,
684                Keyword::CACHE,
685                Keyword::NOSCAN,
686                Keyword::COMPUTE,
687            ]) {
688                Some(Keyword::PARTITION) => {
689                    self.expect_token(&Token::LParen)?;
690                    partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
691                    self.expect_token(&Token::RParen)?;
692                }
693                Some(Keyword::NOSCAN) => noscan = true,
694                Some(Keyword::FOR) => {
695                    self.expect_keyword(Keyword::COLUMNS)?;
696
697                    columns = self
698                        .maybe_parse(|parser| {
699                            parser.parse_comma_separated(|p| p.parse_identifier(false))
700                        })
701                        .unwrap_or_default();
702                    for_columns = true
703                }
704                Some(Keyword::CACHE) => {
705                    self.expect_keyword(Keyword::METADATA)?;
706                    cache_metadata = true
707                }
708                Some(Keyword::COMPUTE) => {
709                    self.expect_keyword(Keyword::STATISTICS)?;
710                    compute_statistics = true
711                }
712                _ => break,
713            }
714        }
715
716        Ok(Statement::Analyze {
717            table_name,
718            for_columns,
719            columns,
720            partitions,
721            cache_metadata,
722            noscan,
723            compute_statistics,
724        })
725    }
726
727    /// Parse a new expression including wildcard & qualified wildcard
728    pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
729        let index = self.index;
730
731        let next_token = self.next_token();
732        match next_token.token {
733            t @ (Token::Word(_) | Token::SingleQuotedString(_)) => {
734                if self.peek_token().token == Token::Period {
735                    let mut id_parts: Vec<Ident> = vec![match t {
736                        Token::Word(w) => w.to_ident(),
737                        Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
738                        _ => unreachable!(), // We matched above
739                    }];
740
741                    while self.consume_token(&Token::Period) {
742                        let next_token = self.next_token();
743                        match next_token.token {
744                            Token::Word(w) => id_parts.push(w.to_ident()),
745                            Token::SingleQuotedString(s) => {
746                                // SQLite has single-quoted identifiers
747                                id_parts.push(Ident::with_quote('\'', s))
748                            }
749                            Token::Mul => {
750                                return Ok(Expr::QualifiedWildcard(ObjectName(id_parts)));
751                            }
752                            _ => {
753                                return self
754                                    .expected("an identifier or a '*' after '.'", next_token);
755                            }
756                        }
757                    }
758                }
759            }
760            Token::Mul => {
761                return Ok(Expr::Wildcard);
762            }
763            _ => (),
764        };
765
766        self.index = index;
767        self.parse_expr()
768    }
769
770    /// Parse a new expression
771    pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
772        let _guard = self.recursion_counter.try_decrease()?;
773        self.parse_subexpr(0)
774    }
775
776    /// Parse tokens until the precedence changes
777    pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
778        debug!("parsing expr");
779        let mut expr = self.parse_prefix()?;
780        debug!("prefix: {:?}", expr);
781        loop {
782            let next_precedence = self.get_next_precedence()?;
783            debug!("next precedence: {:?}", next_precedence);
784
785            if precedence >= next_precedence {
786                break;
787            }
788
789            expr = self.parse_infix(expr, next_precedence)?;
790        }
791        Ok(expr)
792    }
793
794    pub fn parse_interval_expr(&mut self) -> Result<Expr, ParserError> {
795        let precedence = 0;
796        let mut expr = self.parse_prefix()?;
797
798        loop {
799            let next_precedence = self.get_next_interval_precedence()?;
800
801            if precedence >= next_precedence {
802                break;
803            }
804
805            expr = self.parse_infix(expr, next_precedence)?;
806        }
807
808        Ok(expr)
809    }
810
811    /// Get the precedence of the next token
812    /// With AND, OR, and XOR
813    pub fn get_next_interval_precedence(&self) -> Result<u8, ParserError> {
814        let token = self.peek_token();
815
816        match token.token {
817            Token::Word(w) if w.keyword == Keyword::AND => Ok(0),
818            Token::Word(w) if w.keyword == Keyword::OR => Ok(0),
819            Token::Word(w) if w.keyword == Keyword::XOR => Ok(0),
820            _ => self.get_next_precedence(),
821        }
822    }
823
824    pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
825        let condition = self.parse_expr()?;
826        let message = if self.parse_keyword(Keyword::AS) {
827            Some(self.parse_expr()?)
828        } else {
829            None
830        };
831
832        Ok(Statement::Assert { condition, message })
833    }
834
835    pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
836        let name = self.parse_identifier(false)?;
837        Ok(Statement::Savepoint { name })
838    }
839
840    pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
841        let _ = self.parse_keyword(Keyword::SAVEPOINT);
842        let name = self.parse_identifier(false)?;
843
844        Ok(Statement::ReleaseSavepoint { name })
845    }
846
847    /// Parse an expression prefix
848    pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
849        // allow the dialect to override prefix parsing
850        if let Some(prefix) = self.dialect.parse_prefix(self) {
851            return prefix;
852        }
853
854        // PostgreSQL allows any string literal to be preceded by a type name, indicating that the
855        // string literal represents a literal of that type. Some examples:
856        //
857        //      DATE '2020-05-20'
858        //      TIMESTAMP WITH TIME ZONE '2020-05-20 7:43:54'
859        //      BOOL 'true'
860        //
861        // The first two are standard SQL, while the latter is a PostgreSQL extension. Complicating
862        // matters is the fact that INTERVAL string literals may optionally be followed by special
863        // keywords, e.g.:
864        //
865        //      INTERVAL '7' DAY
866        //
867        // Note also that naively `SELECT date` looks like a syntax error because the `date` type
868        // name is not followed by a string literal, but in fact in PostgreSQL it is a valid
869        // expression that should parse as the column name "date".
870        let loc = self.peek_token().location;
871        return_ok_if_some!(self.maybe_parse(|parser| {
872            match parser.parse_data_type()? {
873                DataType::Interval => parser.parse_interval(),
874                // PostgreSQL allows almost any identifier to be used as custom data type name,
875                // and we support that in `parse_data_type()`. But unlike Postgres we don't
876                // have a list of globally reserved keywords (since they vary across dialects),
877                // so given `NOT 'a' LIKE 'b'`, we'd accept `NOT` as a possible custom data type
878                // name, resulting in `NOT 'a'` being recognized as a `TypedString` instead of
879                // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we don't accept the
880                // `type 'string'` syntax for the custom data types at all.
881                DataType::Custom(..) => parser_err!("dummy", loc),
882                data_type => Ok(Expr::TypedString {
883                    data_type,
884                    value: parser.parse_literal_string()?,
885                }),
886            }
887        }));
888
889        let next_token = self.next_token();
890        let expr = match next_token.token {
891            Token::Word(w) => match w.keyword {
892                Keyword::TRUE | Keyword::FALSE | Keyword::NULL => {
893                    self.prev_token();
894                    Ok(Expr::Value(self.parse_value()?))
895                }
896                Keyword::CURRENT_CATALOG
897                | Keyword::CURRENT_USER
898                | Keyword::SESSION_USER
899                | Keyword::USER
900                    if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
901                {
902                    Ok(Expr::Function(Function {
903                        name: ObjectName(vec![w.to_ident()]),
904                        args: vec![],
905                        null_treatment: None,
906                        filter: None,
907                        over: None,
908                        distinct: false,
909                        special: true,
910                        order_by: vec![],
911                    }))
912                }
913                Keyword::CURRENT_TIMESTAMP
914                | Keyword::CURRENT_TIME
915                | Keyword::CURRENT_DATE
916                | Keyword::LOCALTIME
917                | Keyword::LOCALTIMESTAMP => {
918                    self.parse_time_functions(ObjectName(vec![w.to_ident()]))
919                }
920                Keyword::CASE => self.parse_case_expr(),
921                Keyword::CONVERT => self.parse_convert_expr(),
922                Keyword::CAST => self.parse_cast_expr(),
923                Keyword::TRY_CAST => self.parse_try_cast_expr(),
924                Keyword::SAFE_CAST => self.parse_safe_cast_expr(),
925                Keyword::EXISTS => self.parse_exists_expr(false),
926                Keyword::EXTRACT => self.parse_extract_expr(),
927                Keyword::CEIL => self.parse_ceil_floor_expr(true),
928                Keyword::FLOOR => self.parse_ceil_floor_expr(false),
929                Keyword::POSITION if self.peek_token().token == Token::LParen => {
930                    self.parse_position_expr()
931                }
932                Keyword::SUBSTRING => self.parse_substring_expr(),
933                Keyword::OVERLAY => self.parse_overlay_expr(),
934                Keyword::TRIM => self.parse_trim_expr(),
935                Keyword::INTERVAL => self.parse_interval(),
936                Keyword::LISTAGG => self.parse_listagg_expr(),
937                // Treat ARRAY[1,2,3] as an array [1,2,3], otherwise try as subquery or a function call
938                Keyword::ARRAY if self.peek_token() == Token::LBracket => {
939                    self.expect_token(&Token::LBracket)?;
940                    self.parse_array_expr(true)
941                }
942                Keyword::ARRAY
943                    if self.peek_token() == Token::LParen
944                        && !dialect_of!(self is ClickHouseDialect) =>
945                {
946                    self.expect_token(&Token::LParen)?;
947                    self.parse_array_subquery()
948                }
949                Keyword::ARRAY_AGG => self.parse_array_agg_expr(),
950                Keyword::NOT => self.parse_not(),
951                Keyword::MATCH if dialect_of!(self is MySqlDialect | GenericDialect) => {
952                    self.parse_match_against()
953                }
954                Keyword::STRUCT if dialect_of!(self is BigQueryDialect | GenericDialect) => {
955                    self.prev_token();
956                    self.parse_bigquery_struct_literal()
957                }
958                // Here `w` is a word, check if it's a part of a multi-part
959                // identifier, a function call, or a simple identifier:
960                _ => match self.peek_token().token {
961                    Token::LParen | Token::Period => {
962                        let mut id_parts: Vec<Ident> = vec![w.to_ident()];
963                        let mut ends_with_wildcard = false;
964                        while self.consume_token(&Token::Period) {
965                            let next_token = self.next_token();
966                            match next_token.token {
967                                Token::Word(w) => id_parts.push(w.to_ident()),
968                                Token::Mul => {
969                                    // Postgres explicitly allows funcnm(tablenm.*) and the
970                                    // function array_agg traverses this control flow
971                                    if dialect_of!(self is PostgreSqlDialect) {
972                                        ends_with_wildcard = true;
973                                        break;
974                                    } else {
975                                        return self
976                                            .expected("an identifier after '.'", next_token);
977                                    }
978                                }
979                                Token::SingleQuotedString(s) => {
980                                    id_parts.push(Ident::with_quote('\'', s))
981                                }
982                                _ => {
983                                    return self
984                                        .expected("an identifier or a '*' after '.'", next_token);
985                                }
986                            }
987                        }
988
989                        if ends_with_wildcard {
990                            Ok(Expr::QualifiedWildcard(ObjectName(id_parts)))
991                        } else if self.consume_token(&Token::LParen) {
992                            self.prev_token();
993                            self.parse_function(ObjectName(id_parts))
994                        } else {
995                            Ok(Expr::CompoundIdentifier(id_parts))
996                        }
997                    }
998                    // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
999                    Token::SingleQuotedString(_)
1000                    | Token::DoubleQuotedString(_)
1001                    | Token::HexStringLiteral(_)
1002                        if w.value.starts_with('_') =>
1003                    {
1004                        Ok(Expr::IntroducedString {
1005                            introducer: w.value,
1006                            value: self.parse_introduced_string_value()?,
1007                        })
1008                    }
1009                    _ => Ok(Expr::Identifier(w.to_ident())),
1010                },
1011            }, // End of Token::Word
1012            // array `[1, 2, 3]`
1013            Token::LBracket => self.parse_array_expr(false),
1014            tok @ Token::Minus | tok @ Token::Plus => {
1015                let op = if tok == Token::Plus {
1016                    UnaryOperator::Plus
1017                } else {
1018                    UnaryOperator::Minus
1019                };
1020                Ok(Expr::UnaryOp {
1021                    op,
1022                    expr: Box::new(self.parse_subexpr(Self::MUL_DIV_MOD_OP_PREC)?),
1023                })
1024            }
1025            tok @ Token::DoubleExclamationMark
1026            | tok @ Token::PGSquareRoot
1027            | tok @ Token::PGCubeRoot
1028            | tok @ Token::AtSign
1029            | tok @ Token::Tilde
1030                if dialect_of!(self is PostgreSqlDialect) =>
1031            {
1032                let op = match tok {
1033                    Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1034                    Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1035                    Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1036                    Token::AtSign => UnaryOperator::PGAbs,
1037                    Token::Tilde => UnaryOperator::PGBitwiseNot,
1038                    _ => unreachable!(),
1039                };
1040                Ok(Expr::UnaryOp {
1041                    op,
1042                    expr: Box::new(self.parse_subexpr(Self::PLUS_MINUS_PREC)?),
1043                })
1044            }
1045            Token::EscapedStringLiteral(_) if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1046            {
1047                self.prev_token();
1048                Ok(Expr::Value(self.parse_value()?))
1049            }
1050            Token::Number(_, _)
1051            | Token::SingleQuotedString(_)
1052            | Token::DoubleQuotedString(_)
1053            | Token::DollarQuotedString(_)
1054            | Token::SingleQuotedByteStringLiteral(_)
1055            | Token::DoubleQuotedByteStringLiteral(_)
1056            | Token::RawStringLiteral(_)
1057            | Token::NationalStringLiteral(_)
1058            | Token::HexStringLiteral(_) => {
1059                self.prev_token();
1060                Ok(Expr::Value(self.parse_value()?))
1061            }
1062            Token::LParen => {
1063                let expr =
1064                    if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
1065                        self.prev_token();
1066                        Expr::Subquery(Box::new(self.parse_query()?))
1067                    } else {
1068                        let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1069                        match exprs.len() {
1070                            0 => unreachable!(), // parse_comma_separated ensures 1 or more
1071                            1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
1072                            _ => Expr::Tuple(exprs),
1073                        }
1074                    };
1075                self.expect_token(&Token::RParen)?;
1076                if !self.consume_token(&Token::Period) {
1077                    Ok(expr)
1078                } else {
1079                    let tok = self.next_token();
1080                    let key = match tok.token {
1081                        Token::Word(word) => word.to_ident(),
1082                        _ => {
1083                            return parser_err!(
1084                                format!("Expected identifier, found: {tok}"),
1085                                tok.location
1086                            )
1087                        }
1088                    };
1089                    Ok(Expr::CompositeAccess {
1090                        expr: Box::new(expr),
1091                        key,
1092                    })
1093                }
1094            }
1095            Token::Placeholder(_) | Token::Colon | Token::AtSign => {
1096                self.prev_token();
1097                Ok(Expr::Value(self.parse_value()?))
1098            }
1099            _ => self.expected("an expression:", next_token),
1100        }?;
1101
1102        if self.parse_keyword(Keyword::COLLATE) {
1103            Ok(Expr::Collate {
1104                expr: Box::new(expr),
1105                collation: self.parse_object_name(false)?,
1106            })
1107        } else {
1108            Ok(expr)
1109        }
1110    }
1111
1112    pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
1113        self.expect_token(&Token::LParen)?;
1114        let distinct = self.parse_all_or_distinct()?.is_some();
1115        let (args, order_by) = self.parse_optional_args_with_orderby()?;
1116        let filter = if self.dialect.supports_filter_during_aggregation()
1117            && self.parse_keyword(Keyword::FILTER)
1118            && self.consume_token(&Token::LParen)
1119            && self.parse_keyword(Keyword::WHERE)
1120        {
1121            let filter = Some(Box::new(self.parse_expr()?));
1122            self.expect_token(&Token::RParen)?;
1123            filter
1124        } else {
1125            None
1126        };
1127        let null_treatment = match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE])
1128        {
1129            Some(keyword) => {
1130                self.expect_keyword(Keyword::NULLS)?;
1131
1132                match keyword {
1133                    Keyword::RESPECT => Some(NullTreatment::RespectNulls),
1134                    Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
1135                    _ => None,
1136                }
1137            }
1138            None => None,
1139        };
1140        let over = if self.parse_keyword(Keyword::OVER) {
1141            if self.consume_token(&Token::LParen) {
1142                let window_spec = self.parse_window_spec()?;
1143                Some(WindowType::WindowSpec(window_spec))
1144            } else {
1145                Some(WindowType::NamedWindow(self.parse_identifier(false)?))
1146            }
1147        } else {
1148            None
1149        };
1150        Ok(Expr::Function(Function {
1151            name,
1152            args,
1153            null_treatment,
1154            filter,
1155            over,
1156            distinct,
1157            special: false,
1158            order_by,
1159        }))
1160    }
1161
1162    pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
1163        let (args, order_by, special) = if self.consume_token(&Token::LParen) {
1164            let (args, order_by) = self.parse_optional_args_with_orderby()?;
1165            (args, order_by, false)
1166        } else {
1167            (vec![], vec![], true)
1168        };
1169        Ok(Expr::Function(Function {
1170            name,
1171            args,
1172            null_treatment: None,
1173            filter: None,
1174            over: None,
1175            distinct: false,
1176            special,
1177            order_by,
1178        }))
1179    }
1180
1181    pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
1182        let next_token = self.next_token();
1183        match &next_token.token {
1184            Token::Word(w) => match w.keyword {
1185                Keyword::ROWS => Ok(WindowFrameUnits::Rows),
1186                Keyword::RANGE => Ok(WindowFrameUnits::Range),
1187                Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
1188                _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
1189            },
1190            _ => self.expected("ROWS, RANGE, GROUPS", next_token),
1191        }
1192    }
1193
1194    pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
1195        let units = self.parse_window_frame_units()?;
1196        let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
1197            let start_bound = self.parse_window_frame_bound()?;
1198            self.expect_keyword(Keyword::AND)?;
1199            let end_bound = Some(self.parse_window_frame_bound()?);
1200            (start_bound, end_bound)
1201        } else {
1202            (self.parse_window_frame_bound()?, None)
1203        };
1204        Ok(WindowFrame {
1205            units,
1206            start_bound,
1207            end_bound,
1208        })
1209    }
1210
1211    /// Parse `CURRENT ROW` or `{ <positive number> | UNBOUNDED } { PRECEDING | FOLLOWING }`
1212    pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
1213        if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
1214            Ok(WindowFrameBound::CurrentRow)
1215        } else {
1216            let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
1217                None
1218            } else {
1219                Some(Box::new(match self.peek_token().token {
1220                    Token::SingleQuotedString(_) => self.parse_interval()?,
1221                    _ => self.parse_expr()?,
1222                }))
1223            };
1224            if self.parse_keyword(Keyword::PRECEDING) {
1225                Ok(WindowFrameBound::Preceding(rows))
1226            } else if self.parse_keyword(Keyword::FOLLOWING) {
1227                Ok(WindowFrameBound::Following(rows))
1228            } else {
1229                self.expected("PRECEDING or FOLLOWING", self.peek_token())
1230            }
1231        }
1232    }
1233
1234    /// parse a group by expr. a group by expr can be one of group sets, roll up, cube, or simple
1235    /// expr.
1236    fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
1237        if self.dialect.supports_group_by_expr() {
1238            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
1239                self.expect_token(&Token::LParen)?;
1240                let result = self.parse_comma_separated(|p| p.parse_tuple(false, true))?;
1241                self.expect_token(&Token::RParen)?;
1242                Ok(Expr::GroupingSets(result))
1243            } else if self.parse_keyword(Keyword::CUBE) {
1244                self.expect_token(&Token::LParen)?;
1245                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
1246                self.expect_token(&Token::RParen)?;
1247                Ok(Expr::Cube(result))
1248            } else if self.parse_keyword(Keyword::ROLLUP) {
1249                self.expect_token(&Token::LParen)?;
1250                let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
1251                self.expect_token(&Token::RParen)?;
1252                Ok(Expr::Rollup(result))
1253            } else {
1254                self.parse_expr()
1255            }
1256        } else {
1257            // TODO parse rollup for other dialects
1258            self.parse_expr()
1259        }
1260    }
1261
1262    /// parse a tuple with `(` and `)`.
1263    /// If `lift_singleton` is true, then a singleton tuple is lifted to a tuple of length 1, otherwise it will fail.
1264    /// If `allow_empty` is true, then an empty tuple is allowed.
1265    fn parse_tuple(
1266        &mut self,
1267        lift_singleton: bool,
1268        allow_empty: bool,
1269    ) -> Result<Vec<Expr>, ParserError> {
1270        if lift_singleton {
1271            if self.consume_token(&Token::LParen) {
1272                let result = if allow_empty && self.consume_token(&Token::RParen) {
1273                    vec![]
1274                } else {
1275                    let result = self.parse_comma_separated(Parser::parse_expr)?;
1276                    self.expect_token(&Token::RParen)?;
1277                    result
1278                };
1279                Ok(result)
1280            } else {
1281                Ok(vec![self.parse_expr()?])
1282            }
1283        } else {
1284            self.expect_token(&Token::LParen)?;
1285            let result = if allow_empty && self.consume_token(&Token::RParen) {
1286                vec![]
1287            } else {
1288                let result = self.parse_comma_separated(Parser::parse_expr)?;
1289                self.expect_token(&Token::RParen)?;
1290                result
1291            };
1292            Ok(result)
1293        }
1294    }
1295
1296    pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
1297        let mut operand = None;
1298        if !self.parse_keyword(Keyword::WHEN) {
1299            operand = Some(Box::new(self.parse_expr()?));
1300            self.expect_keyword(Keyword::WHEN)?;
1301        }
1302        let mut conditions = vec![];
1303        let mut results = vec![];
1304        loop {
1305            conditions.push(self.parse_expr()?);
1306            self.expect_keyword(Keyword::THEN)?;
1307            results.push(self.parse_expr()?);
1308            if !self.parse_keyword(Keyword::WHEN) {
1309                break;
1310            }
1311        }
1312        let else_result = if self.parse_keyword(Keyword::ELSE) {
1313            Some(Box::new(self.parse_expr()?))
1314        } else {
1315            None
1316        };
1317        self.expect_keyword(Keyword::END)?;
1318        Ok(Expr::Case {
1319            operand,
1320            conditions,
1321            results,
1322            else_result,
1323        })
1324    }
1325
1326    pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
1327        if self.parse_keyword(Keyword::FORMAT) {
1328            let value = self.parse_value()?;
1329            if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
1330                Ok(Some(CastFormat::ValueAtTimeZone(
1331                    value,
1332                    self.parse_value()?,
1333                )))
1334            } else {
1335                Ok(Some(CastFormat::Value(value)))
1336            }
1337        } else {
1338            Ok(None)
1339        }
1340    }
1341
1342    /// mssql-like convert function
1343    fn parse_mssql_convert(&mut self) -> Result<Expr, ParserError> {
1344        self.expect_token(&Token::LParen)?;
1345        let data_type = self.parse_data_type()?;
1346        self.expect_token(&Token::Comma)?;
1347        let expr = self.parse_expr()?;
1348        self.expect_token(&Token::RParen)?;
1349        Ok(Expr::Convert {
1350            expr: Box::new(expr),
1351            data_type: Some(data_type),
1352            charset: None,
1353            target_before_value: true,
1354        })
1355    }
1356
1357    /// Parse a SQL CONVERT function:
1358    ///  - `CONVERT('héhé' USING utf8mb4)` (MySQL)
1359    ///  - `CONVERT('héhé', CHAR CHARACTER SET utf8mb4)` (MySQL)
1360    ///  - `CONVERT(DECIMAL(10, 5), 42)` (MSSQL) - the type comes first
1361    pub fn parse_convert_expr(&mut self) -> Result<Expr, ParserError> {
1362        if self.dialect.convert_type_before_value() {
1363            return self.parse_mssql_convert();
1364        }
1365        self.expect_token(&Token::LParen)?;
1366        let expr = self.parse_expr()?;
1367        if self.parse_keyword(Keyword::USING) {
1368            let charset = self.parse_object_name(false)?;
1369            self.expect_token(&Token::RParen)?;
1370            return Ok(Expr::Convert {
1371                expr: Box::new(expr),
1372                data_type: None,
1373                charset: Some(charset),
1374                target_before_value: false,
1375            });
1376        }
1377        self.expect_token(&Token::Comma)?;
1378        let data_type = self.parse_data_type()?;
1379        let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
1380            Some(self.parse_object_name(false)?)
1381        } else {
1382            None
1383        };
1384        self.expect_token(&Token::RParen)?;
1385        Ok(Expr::Convert {
1386            expr: Box::new(expr),
1387            data_type: Some(data_type),
1388            charset,
1389            target_before_value: false,
1390        })
1391    }
1392
1393    /// Parse a SQL CAST function e.g. `CAST(expr AS FLOAT)`
1394    pub fn parse_cast_expr(&mut self) -> Result<Expr, ParserError> {
1395        self.expect_token(&Token::LParen)?;
1396        let expr = self.parse_expr()?;
1397        self.expect_keyword(Keyword::AS)?;
1398        let data_type = self.parse_data_type()?;
1399        let format = self.parse_optional_cast_format()?;
1400        self.expect_token(&Token::RParen)?;
1401        Ok(Expr::Cast {
1402            expr: Box::new(expr),
1403            data_type,
1404            format,
1405        })
1406    }
1407
1408    /// Parse a SQL TRY_CAST function e.g. `TRY_CAST(expr AS FLOAT)`
1409    pub fn parse_try_cast_expr(&mut self) -> Result<Expr, ParserError> {
1410        self.expect_token(&Token::LParen)?;
1411        let expr = self.parse_expr()?;
1412        self.expect_keyword(Keyword::AS)?;
1413        let data_type = self.parse_data_type()?;
1414        let format = self.parse_optional_cast_format()?;
1415        self.expect_token(&Token::RParen)?;
1416        Ok(Expr::TryCast {
1417            expr: Box::new(expr),
1418            data_type,
1419            format,
1420        })
1421    }
1422
1423    /// Parse a BigQuery SAFE_CAST function e.g. `SAFE_CAST(expr AS FLOAT64)`
1424    pub fn parse_safe_cast_expr(&mut self) -> Result<Expr, ParserError> {
1425        self.expect_token(&Token::LParen)?;
1426        let expr = self.parse_expr()?;
1427        self.expect_keyword(Keyword::AS)?;
1428        let data_type = self.parse_data_type()?;
1429        let format = self.parse_optional_cast_format()?;
1430        self.expect_token(&Token::RParen)?;
1431        Ok(Expr::SafeCast {
1432            expr: Box::new(expr),
1433            data_type,
1434            format,
1435        })
1436    }
1437
1438    /// Parse a SQL EXISTS expression e.g. `WHERE EXISTS(SELECT ...)`.
1439    pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
1440        self.expect_token(&Token::LParen)?;
1441        let exists_node = Expr::Exists {
1442            negated,
1443            subquery: Box::new(self.parse_query()?),
1444        };
1445        self.expect_token(&Token::RParen)?;
1446        Ok(exists_node)
1447    }
1448
1449    pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
1450        self.expect_token(&Token::LParen)?;
1451        let field = self.parse_date_time_field()?;
1452        self.expect_keyword(Keyword::FROM)?;
1453        let expr = self.parse_expr()?;
1454        self.expect_token(&Token::RParen)?;
1455        Ok(Expr::Extract {
1456            field,
1457            expr: Box::new(expr),
1458        })
1459    }
1460
1461    pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
1462        self.expect_token(&Token::LParen)?;
1463        let expr = self.parse_expr()?;
1464        // Parse `CEIL/FLOOR(expr)`
1465        let mut field = DateTimeField::NoDateTime;
1466        let keyword_to = self.parse_keyword(Keyword::TO);
1467        if keyword_to {
1468            // Parse `CEIL/FLOOR(expr TO DateTimeField)`
1469            field = self.parse_date_time_field()?;
1470        }
1471        self.expect_token(&Token::RParen)?;
1472        if is_ceil {
1473            Ok(Expr::Ceil {
1474                expr: Box::new(expr),
1475                field,
1476            })
1477        } else {
1478            Ok(Expr::Floor {
1479                expr: Box::new(expr),
1480                field,
1481            })
1482        }
1483    }
1484
1485    pub fn parse_position_expr(&mut self) -> Result<Expr, ParserError> {
1486        // PARSE SELECT POSITION('@' in field)
1487        self.expect_token(&Token::LParen)?;
1488
1489        // Parse the subexpr till the IN keyword
1490        let expr = self.parse_subexpr(Self::BETWEEN_PREC)?;
1491        if self.parse_keyword(Keyword::IN) {
1492            let from = self.parse_expr()?;
1493            self.expect_token(&Token::RParen)?;
1494            Ok(Expr::Position {
1495                expr: Box::new(expr),
1496                r#in: Box::new(from),
1497            })
1498        } else {
1499            parser_err!(
1500                "Position function must include IN keyword".to_string(),
1501                self.peek_token().location
1502            )
1503        }
1504    }
1505
1506    pub fn parse_substring_expr(&mut self) -> Result<Expr, ParserError> {
1507        if self.dialect.supports_substring_from_for_expr() {
1508            // PARSE SUBSTRING (EXPR [FROM 1] [FOR 3])
1509            self.expect_token(&Token::LParen)?;
1510            let expr = self.parse_expr()?;
1511            let mut from_expr = None;
1512            if self.parse_keyword(Keyword::FROM) || self.consume_token(&Token::Comma) {
1513                from_expr = Some(self.parse_expr()?);
1514            }
1515
1516            let mut to_expr = None;
1517            if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
1518                to_expr = Some(self.parse_expr()?);
1519            }
1520            self.expect_token(&Token::RParen)?;
1521
1522            Ok(Expr::Substring {
1523                expr: Box::new(expr),
1524                substring_from: from_expr.map(Box::new),
1525                substring_for: to_expr.map(Box::new),
1526                special: false,
1527            })
1528        } else {
1529            // PARSE SUBSTRING(EXPR, start, length)
1530            self.expect_token(&Token::LParen)?;
1531            let expr = self.parse_expr()?;
1532
1533            self.expect_token(&Token::Comma)?;
1534            let from_expr = Some(self.parse_expr()?);
1535
1536            self.expect_token(&Token::Comma)?;
1537            let to_expr = Some(self.parse_expr()?);
1538
1539            self.expect_token(&Token::RParen)?;
1540
1541            Ok(Expr::Substring {
1542                expr: Box::new(expr),
1543                substring_from: from_expr.map(Box::new),
1544                substring_for: to_expr.map(Box::new),
1545                special: true,
1546            })
1547        }
1548    }
1549
1550    pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
1551        // PARSE OVERLAY (EXPR PLACING EXPR FROM 1 [FOR 3])
1552        self.expect_token(&Token::LParen)?;
1553        let expr = self.parse_expr()?;
1554        self.expect_keyword(Keyword::PLACING)?;
1555        let what_expr = self.parse_expr()?;
1556        self.expect_keyword(Keyword::FROM)?;
1557        let from_expr = self.parse_expr()?;
1558        let mut for_expr = None;
1559        if self.parse_keyword(Keyword::FOR) {
1560            for_expr = Some(self.parse_expr()?);
1561        }
1562        self.expect_token(&Token::RParen)?;
1563
1564        Ok(Expr::Overlay {
1565            expr: Box::new(expr),
1566            overlay_what: Box::new(what_expr),
1567            overlay_from: Box::new(from_expr),
1568            overlay_for: for_expr.map(Box::new),
1569        })
1570    }
1571
1572    /// ```sql
1573    /// TRIM ([WHERE] ['text' FROM] 'text')
1574    /// TRIM ('text')
1575    /// TRIM(<expr>, [, characters]) -- only Snowflake or BigQuery
1576    /// ```
1577    pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
1578        self.expect_token(&Token::LParen)?;
1579        let mut trim_where = None;
1580        if let Token::Word(word) = self.peek_token().token {
1581            if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING]
1582                .iter()
1583                .any(|d| word.keyword == *d)
1584            {
1585                trim_where = Some(self.parse_trim_where()?);
1586            }
1587        }
1588        let expr = self.parse_expr()?;
1589        if self.parse_keyword(Keyword::FROM) {
1590            let trim_what = Box::new(expr);
1591            let expr = self.parse_expr()?;
1592            self.expect_token(&Token::RParen)?;
1593            Ok(Expr::Trim {
1594                expr: Box::new(expr),
1595                trim_where,
1596                trim_what: Some(trim_what),
1597                trim_characters: None,
1598            })
1599        } else if self.consume_token(&Token::Comma)
1600            && dialect_of!(self is SnowflakeDialect | BigQueryDialect | GenericDialect)
1601        {
1602            let characters = self.parse_comma_separated(Parser::parse_expr)?;
1603            self.expect_token(&Token::RParen)?;
1604            Ok(Expr::Trim {
1605                expr: Box::new(expr),
1606                trim_where: None,
1607                trim_what: None,
1608                trim_characters: Some(characters),
1609            })
1610        } else {
1611            self.expect_token(&Token::RParen)?;
1612            Ok(Expr::Trim {
1613                expr: Box::new(expr),
1614                trim_where,
1615                trim_what: None,
1616                trim_characters: None,
1617            })
1618        }
1619    }
1620
1621    pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
1622        let next_token = self.next_token();
1623        match &next_token.token {
1624            Token::Word(w) => match w.keyword {
1625                Keyword::BOTH => Ok(TrimWhereField::Both),
1626                Keyword::LEADING => Ok(TrimWhereField::Leading),
1627                Keyword::TRAILING => Ok(TrimWhereField::Trailing),
1628                _ => self.expected("trim_where field", next_token)?,
1629            },
1630            _ => self.expected("trim_where field", next_token),
1631        }
1632    }
1633
1634    /// Parses an array expression `[ex1, ex2, ..]`
1635    /// if `named` is `true`, came from an expression like  `ARRAY[ex1, ex2]`
1636    pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
1637        if self.peek_token().token == Token::RBracket {
1638            let _ = self.next_token(); // consume ]
1639            Ok(Expr::Array(Array {
1640                elem: vec![],
1641                named,
1642            }))
1643        } else {
1644            let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1645            self.expect_token(&Token::RBracket)?;
1646            Ok(Expr::Array(Array { elem: exprs, named }))
1647        }
1648    }
1649
1650    // Parses an array constructed from a subquery
1651    pub fn parse_array_subquery(&mut self) -> Result<Expr, ParserError> {
1652        let query = self.parse_query()?;
1653        self.expect_token(&Token::RParen)?;
1654        Ok(Expr::ArraySubquery(Box::new(query)))
1655    }
1656
1657    /// Parse a SQL LISTAGG expression, e.g. `LISTAGG(...) WITHIN GROUP (ORDER BY ...)`.
1658    pub fn parse_listagg_expr(&mut self) -> Result<Expr, ParserError> {
1659        self.expect_token(&Token::LParen)?;
1660        let distinct = self.parse_all_or_distinct()?.is_some();
1661        let expr = Box::new(self.parse_expr()?);
1662        // While ANSI SQL would would require the separator, Redshift makes this optional. Here we
1663        // choose to make the separator optional as this provides the more general implementation.
1664        let separator = if self.consume_token(&Token::Comma) {
1665            Some(Box::new(self.parse_expr()?))
1666        } else {
1667            None
1668        };
1669        let on_overflow = if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
1670            if self.parse_keyword(Keyword::ERROR) {
1671                Some(ListAggOnOverflow::Error)
1672            } else {
1673                self.expect_keyword(Keyword::TRUNCATE)?;
1674                let filler = match self.peek_token().token {
1675                    Token::Word(w)
1676                        if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
1677                    {
1678                        None
1679                    }
1680                    Token::SingleQuotedString(_)
1681                    | Token::EscapedStringLiteral(_)
1682                    | Token::NationalStringLiteral(_)
1683                    | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
1684                    _ => self.expected(
1685                        "either filler, WITH, or WITHOUT in LISTAGG",
1686                        self.peek_token(),
1687                    )?,
1688                };
1689                let with_count = self.parse_keyword(Keyword::WITH);
1690                if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
1691                    self.expected("either WITH or WITHOUT in LISTAGG", self.peek_token())?;
1692                }
1693                self.expect_keyword(Keyword::COUNT)?;
1694                Some(ListAggOnOverflow::Truncate { filler, with_count })
1695            }
1696        } else {
1697            None
1698        };
1699        self.expect_token(&Token::RParen)?;
1700        // Once again ANSI SQL requires WITHIN GROUP, but Redshift does not. Again we choose the
1701        // more general implementation.
1702        let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
1703            self.expect_token(&Token::LParen)?;
1704            self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
1705            let order_by_expr = self.parse_comma_separated(Parser::parse_order_by_expr)?;
1706            self.expect_token(&Token::RParen)?;
1707            order_by_expr
1708        } else {
1709            vec![]
1710        };
1711        Ok(Expr::ListAgg(ListAgg {
1712            distinct,
1713            expr,
1714            separator,
1715            on_overflow,
1716            within_group,
1717        }))
1718    }
1719
1720    pub fn parse_array_agg_expr(&mut self) -> Result<Expr, ParserError> {
1721        self.expect_token(&Token::LParen)?;
1722        let distinct = self.parse_keyword(Keyword::DISTINCT);
1723        let expr = Box::new(self.parse_expr()?);
1724        // ANSI SQL and BigQuery define ORDER BY inside function.
1725        if !self.dialect.supports_within_after_array_aggregation() {
1726            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
1727                Some(self.parse_comma_separated(Parser::parse_order_by_expr)?)
1728            } else {
1729                None
1730            };
1731            let limit = if self.parse_keyword(Keyword::LIMIT) {
1732                self.parse_limit()?.map(Box::new)
1733            } else {
1734                None
1735            };
1736            self.expect_token(&Token::RParen)?;
1737            return Ok(Expr::ArrayAgg(ArrayAgg {
1738                distinct,
1739                expr,
1740                order_by,
1741                limit,
1742                within_group: false,
1743            }));
1744        }
1745        // Snowflake defines ORDER BY in within group instead of inside the function like
1746        // ANSI SQL.
1747        self.expect_token(&Token::RParen)?;
1748        let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
1749            self.expect_token(&Token::LParen)?;
1750            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
1751                Some(self.parse_comma_separated(Parser::parse_order_by_expr)?)
1752            } else {
1753                None
1754            };
1755            self.expect_token(&Token::RParen)?;
1756            order_by
1757        } else {
1758            None
1759        };
1760
1761        Ok(Expr::ArrayAgg(ArrayAgg {
1762            distinct,
1763            expr,
1764            order_by: within_group,
1765            limit: None,
1766            within_group: true,
1767        }))
1768    }
1769
1770    // This function parses date/time fields for the EXTRACT function-like
1771    // operator, interval qualifiers, and the ceil/floor operations.
1772    // EXTRACT supports a wider set of date/time fields than interval qualifiers,
1773    // so this function may need to be split in two.
1774    pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
1775        let next_token = self.next_token();
1776        match &next_token.token {
1777            Token::Word(w) => match w.keyword {
1778                Keyword::YEAR => Ok(DateTimeField::Year),
1779                Keyword::MONTH => Ok(DateTimeField::Month),
1780                Keyword::WEEK => Ok(DateTimeField::Week),
1781                Keyword::DAY => Ok(DateTimeField::Day),
1782                Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
1783                Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
1784                Keyword::DATE => Ok(DateTimeField::Date),
1785                Keyword::HOUR => Ok(DateTimeField::Hour),
1786                Keyword::MINUTE => Ok(DateTimeField::Minute),
1787                Keyword::SECOND => Ok(DateTimeField::Second),
1788                Keyword::CENTURY => Ok(DateTimeField::Century),
1789                Keyword::DECADE => Ok(DateTimeField::Decade),
1790                Keyword::DOY => Ok(DateTimeField::Doy),
1791                Keyword::DOW => Ok(DateTimeField::Dow),
1792                Keyword::EPOCH => Ok(DateTimeField::Epoch),
1793                Keyword::ISODOW => Ok(DateTimeField::Isodow),
1794                Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
1795                Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
1796                Keyword::JULIAN => Ok(DateTimeField::Julian),
1797                Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
1798                Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
1799                Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
1800                Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
1801                Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
1802                Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
1803                Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
1804                Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
1805                Keyword::QUARTER => Ok(DateTimeField::Quarter),
1806                Keyword::TIME => Ok(DateTimeField::Time),
1807                Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
1808                Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
1809                Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
1810                Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
1811                Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
1812                _ => self.expected("date/time field", next_token),
1813            },
1814            _ => self.expected("date/time field", next_token),
1815        }
1816    }
1817
1818    pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
1819        match self.peek_token().token {
1820            Token::Word(w) => match w.keyword {
1821                Keyword::EXISTS => {
1822                    let negated = true;
1823                    let _ = self.parse_keyword(Keyword::EXISTS);
1824                    self.parse_exists_expr(negated)
1825                }
1826                _ => Ok(Expr::UnaryOp {
1827                    op: UnaryOperator::Not,
1828                    expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
1829                }),
1830            },
1831            _ => Ok(Expr::UnaryOp {
1832                op: UnaryOperator::Not,
1833                expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
1834            }),
1835        }
1836    }
1837
1838    /// Parses fulltext expressions [(1)]
1839    ///
1840    /// # Errors
1841    /// This method will raise an error if the column list is empty or with invalid identifiers,
1842    /// the match expression is not a literal string, or if the search modifier is not valid.
1843    ///
1844    /// [(1)]: Expr::MatchAgainst
1845    pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
1846        let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
1847
1848        self.expect_keyword(Keyword::AGAINST)?;
1849
1850        self.expect_token(&Token::LParen)?;
1851
1852        // MySQL is too permissive about the value, IMO we can't validate it perfectly on syntax level.
1853        let match_value = self.parse_value()?;
1854
1855        let in_natural_language_mode_keywords = &[
1856            Keyword::IN,
1857            Keyword::NATURAL,
1858            Keyword::LANGUAGE,
1859            Keyword::MODE,
1860        ];
1861
1862        let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
1863
1864        let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
1865
1866        let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
1867            if self.parse_keywords(with_query_expansion_keywords) {
1868                Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
1869            } else {
1870                Some(SearchModifier::InNaturalLanguageMode)
1871            }
1872        } else if self.parse_keywords(in_boolean_mode_keywords) {
1873            Some(SearchModifier::InBooleanMode)
1874        } else if self.parse_keywords(with_query_expansion_keywords) {
1875            Some(SearchModifier::WithQueryExpansion)
1876        } else {
1877            None
1878        };
1879
1880        self.expect_token(&Token::RParen)?;
1881
1882        Ok(Expr::MatchAgainst {
1883            columns,
1884            match_value,
1885            opt_search_modifier,
1886        })
1887    }
1888
1889    /// Parse an INTERVAL expression.
1890    ///
1891    /// Some syntactically valid intervals:
1892    ///
1893    ///   1. `INTERVAL '1' DAY`
1894    ///   2. `INTERVAL '1-1' YEAR TO MONTH`
1895    ///   3. `INTERVAL '1' SECOND`
1896    ///   4. `INTERVAL '1:1:1.1' HOUR (5) TO SECOND (5)`
1897    ///   5. `INTERVAL '1.1' SECOND (2, 2)`
1898    ///   6. `INTERVAL '1:1' HOUR (5) TO MINUTE (5)`
1899    ///   7. (MySql and BigQuey only):`INTERVAL 1 DAY`
1900    ///
1901    /// Note that we do not currently attempt to parse the quoted value.
1902    pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
1903        // The SQL standard allows an optional sign before the value string, but
1904        // it is not clear if any implementations support that syntax, so we
1905        // don't currently try to parse it. (The sign can instead be included
1906        // inside the value string.)
1907
1908        // The first token in an interval is a string literal which specifies
1909        // the duration of the interval.
1910        let value = self.parse_interval_expr()?;
1911
1912        // Following the string literal is a qualifier which indicates the units
1913        // of the duration specified in the string literal.
1914        //
1915        // Note that PostgreSQL allows omitting the qualifier, so we provide
1916        // this more general implementation.
1917        let leading_field = match self.peek_token().token {
1918            Token::Word(kw)
1919                if [
1920                    Keyword::YEAR,
1921                    Keyword::MONTH,
1922                    Keyword::WEEK,
1923                    Keyword::DAY,
1924                    Keyword::HOUR,
1925                    Keyword::MINUTE,
1926                    Keyword::SECOND,
1927                    Keyword::CENTURY,
1928                    Keyword::DECADE,
1929                    Keyword::DOW,
1930                    Keyword::DOY,
1931                    Keyword::EPOCH,
1932                    Keyword::ISODOW,
1933                    Keyword::ISOYEAR,
1934                    Keyword::JULIAN,
1935                    Keyword::MICROSECOND,
1936                    Keyword::MICROSECONDS,
1937                    Keyword::MILLENIUM,
1938                    Keyword::MILLENNIUM,
1939                    Keyword::MILLISECOND,
1940                    Keyword::MILLISECONDS,
1941                    Keyword::NANOSECOND,
1942                    Keyword::NANOSECONDS,
1943                    Keyword::QUARTER,
1944                    Keyword::TIMEZONE,
1945                    Keyword::TIMEZONE_HOUR,
1946                    Keyword::TIMEZONE_MINUTE,
1947                ]
1948                .iter()
1949                .any(|d| kw.keyword == *d) =>
1950            {
1951                Some(self.parse_date_time_field()?)
1952            }
1953            _ => None,
1954        };
1955
1956        let (leading_precision, last_field, fsec_precision) =
1957            if leading_field == Some(DateTimeField::Second) {
1958                // SQL mandates special syntax for `SECOND TO SECOND` literals.
1959                // Instead of
1960                //     `SECOND [(<leading precision>)] TO SECOND[(<fractional seconds precision>)]`
1961                // one must use the special format:
1962                //     `SECOND [( <leading precision> [ , <fractional seconds precision>] )]`
1963                let last_field = None;
1964                let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
1965                (leading_precision, last_field, fsec_precision)
1966            } else {
1967                let leading_precision = self.parse_optional_precision()?;
1968                if self.parse_keyword(Keyword::TO) {
1969                    let last_field = Some(self.parse_date_time_field()?);
1970                    let fsec_precision = if last_field == Some(DateTimeField::Second) {
1971                        self.parse_optional_precision()?
1972                    } else {
1973                        None
1974                    };
1975                    (leading_precision, last_field, fsec_precision)
1976                } else {
1977                    (leading_precision, None, None)
1978                }
1979            };
1980
1981        Ok(Expr::Interval(Interval {
1982            value: Box::new(value),
1983            leading_field,
1984            leading_precision,
1985            last_field,
1986            fractional_seconds_precision: fsec_precision,
1987        }))
1988    }
1989
1990    /// Bigquery specific: Parse a struct literal
1991    /// Syntax
1992    /// ```sql
1993    /// -- typed
1994    /// STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
1995    /// -- typeless
1996    /// STRUCT( expr1 [AS field_name] [, ... ])
1997    /// ```
1998    fn parse_bigquery_struct_literal(&mut self) -> Result<Expr, ParserError> {
1999        let (fields, trailing_bracket) =
2000            self.parse_struct_type_def(Self::parse_big_query_struct_field_def)?;
2001        if trailing_bracket.0 {
2002            return parser_err!("unmatched > in STRUCT literal", self.peek_token().location);
2003        }
2004
2005        self.expect_token(&Token::LParen)?;
2006        let values = self
2007            .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
2008        self.expect_token(&Token::RParen)?;
2009
2010        Ok(Expr::Struct { values, fields })
2011    }
2012
2013    /// Parse an expression value for a bigquery struct [1]
2014    /// Syntax
2015    /// ```sql
2016    /// expr [AS name]
2017    /// ```
2018    ///
2019    /// Parameter typed_syntax is set to true if the expression
2020    /// is to be parsed as a field expression declared using typed
2021    /// struct syntax [2], and false if using typeless struct syntax [3].
2022    ///
2023    /// [1]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct
2024    /// [2]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typed_struct_syntax
2025    /// [3]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#typeless_struct_syntax
2026    fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
2027        let expr = self.parse_expr()?;
2028        if self.parse_keyword(Keyword::AS) {
2029            if typed_syntax {
2030                return parser_err!("Typed syntax does not allow AS", {
2031                    self.prev_token();
2032                    self.peek_token().location
2033                });
2034            }
2035            let field_name = self.parse_identifier(false)?;
2036            Ok(Expr::Named {
2037                expr: expr.into(),
2038                name: field_name,
2039            })
2040        } else {
2041            Ok(expr)
2042        }
2043    }
2044
2045    /// Parse a Struct type definition as a sequence of field-value pairs.
2046    /// The syntax of the Struct elem differs by dialect so it is customised
2047    /// by the `elem_parser` argument.
2048    ///
2049    /// Syntax
2050    /// ```sql
2051    /// Hive:
2052    /// STRUCT<field_name: field_type>
2053    ///
2054    /// BigQuery:
2055    /// STRUCT<[field_name] field_type>
2056    /// ```
2057    fn parse_struct_type_def<F>(
2058        &mut self,
2059        mut elem_parser: F,
2060    ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
2061    where
2062        F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
2063    {
2064        let start_token = self.peek_token();
2065        self.expect_keyword(Keyword::STRUCT)?;
2066
2067        // Nothing to do if we have no type information.
2068        if Token::Lt != self.peek_token() {
2069            return Ok((Default::default(), false.into()));
2070        }
2071        self.next_token();
2072
2073        let mut field_defs = vec![];
2074        let trailing_bracket = loop {
2075            let (def, trailing_bracket) = elem_parser(self)?;
2076            field_defs.push(def);
2077            if !self.consume_token(&Token::Comma) {
2078                break trailing_bracket;
2079            }
2080
2081            // Angle brackets are balanced so we only expect the trailing `>>` after
2082            // we've matched all field types for the current struct.
2083            // e.g. this is invalid syntax `STRUCT<STRUCT<INT>>>, INT>(NULL)`
2084            if trailing_bracket.0 {
2085                return parser_err!("unmatched > in STRUCT definition", start_token.location);
2086            }
2087        };
2088
2089        Ok((
2090            field_defs,
2091            self.expect_closing_angle_bracket(trailing_bracket)?,
2092        ))
2093    }
2094
2095    /// Parse a field definition in a BigQuery struct.
2096    /// Syntax:
2097    ///
2098    /// ```sql
2099    /// [field_name] field_type
2100    /// ```
2101    fn parse_big_query_struct_field_def(
2102        &mut self,
2103    ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
2104        let is_anonymous_field = if let Token::Word(w) = self.peek_token().token {
2105            ALL_KEYWORDS
2106                .binary_search(&w.value.to_uppercase().as_str())
2107                .is_ok()
2108        } else {
2109            false
2110        };
2111
2112        let field_name = if is_anonymous_field {
2113            None
2114        } else {
2115            Some(self.parse_identifier(false)?)
2116        };
2117
2118        let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
2119
2120        Ok((
2121            StructField {
2122                field_name,
2123                field_type,
2124            },
2125            trailing_bracket,
2126        ))
2127    }
2128
2129    /// For nested types that use the angle bracket syntax, this matches either
2130    /// `>`, `>>` or nothing depending on which variant is expected (specified by the previously
2131    /// matched `trailing_bracket` argument). It returns whether there is a trailing
2132    /// left to be matched - (i.e. if '>>' was matched).
2133    fn expect_closing_angle_bracket(
2134        &mut self,
2135        trailing_bracket: MatchedTrailingBracket,
2136    ) -> Result<MatchedTrailingBracket, ParserError> {
2137        let trailing_bracket = if !trailing_bracket.0 {
2138            match self.peek_token().token {
2139                Token::Gt => {
2140                    self.next_token();
2141                    false.into()
2142                }
2143                Token::ShiftRight => {
2144                    self.next_token();
2145                    true.into()
2146                }
2147                _ => return self.expected(">", self.peek_token()),
2148            }
2149        } else {
2150            false.into()
2151        };
2152
2153        Ok(trailing_bracket)
2154    }
2155
2156    /// Parse an operator following an expression
2157    pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
2158        // allow the dialect to override infix parsing
2159        if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
2160            return infix;
2161        }
2162
2163        let tok = self.next_token();
2164
2165        let regular_binary_operator = match &tok.token {
2166            Token::Spaceship => Some(BinaryOperator::Spaceship),
2167            Token::DoubleEq => Some(BinaryOperator::Eq),
2168            Token::Eq => Some(BinaryOperator::Eq),
2169            Token::Neq => Some(BinaryOperator::NotEq),
2170            Token::Gt => Some(BinaryOperator::Gt),
2171            Token::GtEq => Some(BinaryOperator::GtEq),
2172            Token::Lt => Some(BinaryOperator::Lt),
2173            Token::LtEq => Some(BinaryOperator::LtEq),
2174            Token::Plus => Some(BinaryOperator::Plus),
2175            Token::Minus => Some(BinaryOperator::Minus),
2176            Token::Mul => Some(BinaryOperator::Multiply),
2177            Token::Mod => Some(BinaryOperator::Modulo),
2178            Token::StringConcat => Some(BinaryOperator::StringConcat),
2179            Token::Pipe => Some(BinaryOperator::BitwiseOr),
2180            Token::Caret => {
2181                // In PostgreSQL, ^ stands for the exponentiation operation,
2182                // and # stands for XOR. See https://www.postgresql.org/docs/current/functions-math.html
2183                if dialect_of!(self is PostgreSqlDialect) {
2184                    Some(BinaryOperator::PGExp)
2185                } else {
2186                    Some(BinaryOperator::BitwiseXor)
2187                }
2188            }
2189            Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
2190            Token::Div => Some(BinaryOperator::Divide),
2191            Token::DuckIntDiv if dialect_of!(self is DuckDbDialect | GenericDialect) => {
2192                Some(BinaryOperator::DuckIntegerDivide)
2193            }
2194            Token::ShiftLeft if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) => {
2195                Some(BinaryOperator::PGBitwiseShiftLeft)
2196            }
2197            Token::ShiftRight if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) => {
2198                Some(BinaryOperator::PGBitwiseShiftRight)
2199            }
2200            Token::Sharp if dialect_of!(self is PostgreSqlDialect) => {
2201                Some(BinaryOperator::PGBitwiseXor)
2202            }
2203            Token::Overlap if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
2204                Some(BinaryOperator::PGOverlap)
2205            }
2206            Token::CaretAt if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
2207                Some(BinaryOperator::PGStartsWith)
2208            }
2209            Token::Tilde => Some(BinaryOperator::PGRegexMatch),
2210            Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
2211            Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
2212            Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
2213            Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
2214            Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
2215            Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
2216            Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
2217            Token::Word(w) => match w.keyword {
2218                Keyword::AND => Some(BinaryOperator::And),
2219                Keyword::OR => Some(BinaryOperator::Or),
2220                Keyword::XOR => Some(BinaryOperator::Xor),
2221                Keyword::OPERATOR if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
2222                    self.expect_token(&Token::LParen)?;
2223                    // there are special rules for operator names in
2224                    // postgres so we can not use 'parse_object'
2225                    // or similar.
2226                    // See https://www.postgresql.org/docs/current/sql-createoperator.html
2227                    let mut idents = vec![];
2228                    loop {
2229                        idents.push(self.next_token().to_string());
2230                        if !self.consume_token(&Token::Period) {
2231                            break;
2232                        }
2233                    }
2234                    self.expect_token(&Token::RParen)?;
2235                    Some(BinaryOperator::PGCustomBinaryOperator(idents))
2236                }
2237                _ => None,
2238            },
2239            _ => None,
2240        };
2241
2242        if let Some(op) = regular_binary_operator {
2243            if let Some(keyword) = self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL]) {
2244                self.expect_token(&Token::LParen)?;
2245                let right = self.parse_subexpr(precedence)?;
2246                self.expect_token(&Token::RParen)?;
2247
2248                if !matches!(
2249                    op,
2250                    BinaryOperator::Gt
2251                        | BinaryOperator::Lt
2252                        | BinaryOperator::GtEq
2253                        | BinaryOperator::LtEq
2254                        | BinaryOperator::Eq
2255                        | BinaryOperator::NotEq
2256                ) {
2257                    return parser_err!(
2258                        format!(
2259                        "Expected one of [=, >, <, =>, =<, !=] as comparison operator, found: {op}"
2260                    ),
2261                        tok.location
2262                    );
2263                };
2264
2265                Ok(match keyword {
2266                    Keyword::ALL => Expr::AllOp {
2267                        left: Box::new(expr),
2268                        compare_op: op,
2269                        right: Box::new(right),
2270                    },
2271                    Keyword::ANY => Expr::AnyOp {
2272                        left: Box::new(expr),
2273                        compare_op: op,
2274                        right: Box::new(right),
2275                    },
2276                    _ => unreachable!(),
2277                })
2278            } else {
2279                Ok(Expr::BinaryOp {
2280                    left: Box::new(expr),
2281                    op,
2282                    right: Box::new(self.parse_subexpr(precedence)?),
2283                })
2284            }
2285        } else if let Token::Word(w) = &tok.token {
2286            match w.keyword {
2287                Keyword::IS => {
2288                    if self.parse_keyword(Keyword::NULL) {
2289                        Ok(Expr::IsNull(Box::new(expr)))
2290                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
2291                        Ok(Expr::IsNotNull(Box::new(expr)))
2292                    } else if self.parse_keywords(&[Keyword::TRUE]) {
2293                        Ok(Expr::IsTrue(Box::new(expr)))
2294                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
2295                        Ok(Expr::IsNotTrue(Box::new(expr)))
2296                    } else if self.parse_keywords(&[Keyword::FALSE]) {
2297                        Ok(Expr::IsFalse(Box::new(expr)))
2298                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
2299                        Ok(Expr::IsNotFalse(Box::new(expr)))
2300                    } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
2301                        Ok(Expr::IsUnknown(Box::new(expr)))
2302                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
2303                        Ok(Expr::IsNotUnknown(Box::new(expr)))
2304                    } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
2305                        let expr2 = self.parse_expr()?;
2306                        Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
2307                    } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
2308                    {
2309                        let expr2 = self.parse_expr()?;
2310                        Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
2311                    } else {
2312                        self.expected(
2313                            "[NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS",
2314                            self.peek_token(),
2315                        )
2316                    }
2317                }
2318                Keyword::AT => {
2319                    // if self.parse_keyword(Keyword::TIME) {
2320                    //     self.expect_keyword(Keyword::ZONE)?;
2321                    if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
2322                        let time_zone = self.next_token();
2323                        match time_zone.token {
2324                            Token::SingleQuotedString(time_zone) => {
2325                                log::trace!("Peek token: {:?}", self.peek_token());
2326                                Ok(Expr::AtTimeZone {
2327                                    timestamp: Box::new(expr),
2328                                    time_zone,
2329                                })
2330                            }
2331                            _ => self.expected(
2332                                "Expected Token::SingleQuotedString after AT TIME ZONE",
2333                                time_zone,
2334                            ),
2335                        }
2336                    } else {
2337                        self.expected("Expected Token::Word after AT", tok)
2338                    }
2339                }
2340                Keyword::NOT
2341                | Keyword::IN
2342                | Keyword::BETWEEN
2343                | Keyword::LIKE
2344                | Keyword::ILIKE
2345                | Keyword::SIMILAR
2346                | Keyword::REGEXP
2347                | Keyword::RLIKE => {
2348                    self.prev_token();
2349                    let negated = self.parse_keyword(Keyword::NOT);
2350                    let regexp = self.parse_keyword(Keyword::REGEXP);
2351                    let rlike = self.parse_keyword(Keyword::RLIKE);
2352                    if regexp || rlike {
2353                        Ok(Expr::RLike {
2354                            negated,
2355                            expr: Box::new(expr),
2356                            pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2357                            regexp,
2358                        })
2359                    } else if self.parse_keyword(Keyword::IN) {
2360                        self.parse_in(expr, negated)
2361                    } else if self.parse_keyword(Keyword::BETWEEN) {
2362                        self.parse_between(expr, negated)
2363                    } else if self.parse_keyword(Keyword::LIKE) {
2364                        Ok(Expr::Like {
2365                            negated,
2366                            expr: Box::new(expr),
2367                            pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2368                            escape_char: self.parse_escape_char()?,
2369                        })
2370                    } else if self.parse_keyword(Keyword::ILIKE) {
2371                        Ok(Expr::ILike {
2372                            negated,
2373                            expr: Box::new(expr),
2374                            pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2375                            escape_char: self.parse_escape_char()?,
2376                        })
2377                    } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
2378                        Ok(Expr::SimilarTo {
2379                            negated,
2380                            expr: Box::new(expr),
2381                            pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2382                            escape_char: self.parse_escape_char()?,
2383                        })
2384                    } else {
2385                        self.expected("IN or BETWEEN after NOT", self.peek_token())
2386                    }
2387                }
2388                // Can only happen if `get_next_precedence` got out of sync with this function
2389                _ => parser_err!(
2390                    format!("No infix parser for token {:?}", tok.token),
2391                    tok.location
2392                ),
2393            }
2394        } else if Token::DoubleColon == tok {
2395            self.parse_pg_cast(expr)
2396        } else if Token::ExclamationMark == tok {
2397            // PostgreSQL factorial operation
2398            Ok(Expr::UnaryOp {
2399                op: UnaryOperator::PGPostfixFactorial,
2400                expr: Box::new(expr),
2401            })
2402        } else if Token::LBracket == tok {
2403            if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
2404                // parse index
2405                return self.parse_array_index(expr);
2406            }
2407            self.parse_map_access(expr)
2408        } else if Token::Colon == tok {
2409            Ok(Expr::JsonAccess {
2410                left: Box::new(expr),
2411                operator: JsonOperator::Colon,
2412                right: Box::new(Expr::Value(self.parse_value()?)),
2413            })
2414        } else if Token::Arrow == tok
2415            || Token::LongArrow == tok
2416            || Token::HashArrow == tok
2417            || Token::HashLongArrow == tok
2418            || Token::AtArrow == tok
2419            || Token::ArrowAt == tok
2420            || Token::HashMinus == tok
2421            || Token::AtQuestion == tok
2422            || Token::AtAt == tok
2423        {
2424            let operator = match tok.token {
2425                Token::Arrow => JsonOperator::Arrow,
2426                Token::LongArrow => JsonOperator::LongArrow,
2427                Token::HashArrow => JsonOperator::HashArrow,
2428                Token::HashLongArrow => JsonOperator::HashLongArrow,
2429                Token::AtArrow => JsonOperator::AtArrow,
2430                Token::ArrowAt => JsonOperator::ArrowAt,
2431                Token::HashMinus => JsonOperator::HashMinus,
2432                Token::AtQuestion => JsonOperator::AtQuestion,
2433                Token::AtAt => JsonOperator::AtAt,
2434                _ => unreachable!(),
2435            };
2436            Ok(Expr::JsonAccess {
2437                left: Box::new(expr),
2438                operator,
2439                right: Box::new(self.parse_expr()?),
2440            })
2441        } else {
2442            // Can only happen if `get_next_precedence` got out of sync with this function
2443            parser_err!(
2444                format!("No infix parser for token {:?}", tok.token),
2445                tok.location
2446            )
2447        }
2448    }
2449
2450    /// parse the ESCAPE CHAR portion of LIKE, ILIKE, and SIMILAR TO
2451    pub fn parse_escape_char(&mut self) -> Result<Option<char>, ParserError> {
2452        if self.parse_keyword(Keyword::ESCAPE) {
2453            Ok(Some(self.parse_literal_char()?))
2454        } else {
2455            Ok(None)
2456        }
2457    }
2458
2459    pub fn parse_array_index(&mut self, expr: Expr) -> Result<Expr, ParserError> {
2460        let index = self.parse_expr()?;
2461        self.expect_token(&Token::RBracket)?;
2462        let mut indexes: Vec<Expr> = vec![index];
2463        while self.consume_token(&Token::LBracket) {
2464            let index = self.parse_expr()?;
2465            self.expect_token(&Token::RBracket)?;
2466            indexes.push(index);
2467        }
2468        Ok(Expr::ArrayIndex {
2469            obj: Box::new(expr),
2470            indexes,
2471        })
2472    }
2473
2474    pub fn parse_map_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
2475        let key = self.parse_map_key()?;
2476        let tok = self.consume_token(&Token::RBracket);
2477        debug!("Tok: {}", tok);
2478        let mut key_parts: Vec<Expr> = vec![key];
2479        while self.consume_token(&Token::LBracket) {
2480            let key = self.parse_map_key()?;
2481            let tok = self.consume_token(&Token::RBracket);
2482            debug!("Tok: {}", tok);
2483            key_parts.push(key);
2484        }
2485        match expr {
2486            e @ Expr::Identifier(_) | e @ Expr::CompoundIdentifier(_) => Ok(Expr::MapAccess {
2487                column: Box::new(e),
2488                keys: key_parts,
2489            }),
2490            _ => Ok(expr),
2491        }
2492    }
2493
2494    /// Parses the parens following the `[ NOT ] IN` operator
2495    pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
2496        // BigQuery allows `IN UNNEST(array_expression)`
2497        // https://cloud.google.com/bigquery/docs/reference/standard-sql/operators#in_operators
2498        if self.parse_keyword(Keyword::UNNEST) {
2499            self.expect_token(&Token::LParen)?;
2500            let array_expr = self.parse_expr()?;
2501            self.expect_token(&Token::RParen)?;
2502            return Ok(Expr::InUnnest {
2503                expr: Box::new(expr),
2504                array_expr: Box::new(array_expr),
2505                negated,
2506            });
2507        }
2508        self.expect_token(&Token::LParen)?;
2509        let in_op = if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
2510            self.prev_token();
2511            Expr::InSubquery {
2512                expr: Box::new(expr),
2513                subquery: Box::new(self.parse_query()?),
2514                negated,
2515            }
2516        } else {
2517            Expr::InList {
2518                expr: Box::new(expr),
2519                list: if self.dialect.supports_in_empty_list() {
2520                    self.parse_comma_separated0(Parser::parse_expr)?
2521                } else {
2522                    self.parse_comma_separated(Parser::parse_expr)?
2523                },
2524                negated,
2525            }
2526        };
2527        self.expect_token(&Token::RParen)?;
2528        Ok(in_op)
2529    }
2530
2531    /// Parses `BETWEEN <low> AND <high>`, assuming the `BETWEEN` keyword was already consumed
2532    pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
2533        // Stop parsing subexpressions for <low> and <high> on tokens with
2534        // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
2535        let low = self.parse_subexpr(Self::BETWEEN_PREC)?;
2536        self.expect_keyword(Keyword::AND)?;
2537        let high = self.parse_subexpr(Self::BETWEEN_PREC)?;
2538        Ok(Expr::Between {
2539            expr: Box::new(expr),
2540            negated,
2541            low: Box::new(low),
2542            high: Box::new(high),
2543        })
2544    }
2545
2546    /// Parse a postgresql casting style which is in the form of `expr::datatype`
2547    pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
2548        Ok(Expr::Cast {
2549            expr: Box::new(expr),
2550            data_type: self.parse_data_type()?,
2551            format: None,
2552        })
2553    }
2554
2555    // use https://www.postgresql.org/docs/7.0/operators.htm#AEN2026 as a reference
2556    const MUL_DIV_MOD_OP_PREC: u8 = 40;
2557    const PLUS_MINUS_PREC: u8 = 30;
2558    const XOR_PREC: u8 = 24;
2559    const TIME_ZONE_PREC: u8 = 20;
2560    const BETWEEN_PREC: u8 = 20;
2561    const LIKE_PREC: u8 = 19;
2562    const IS_PREC: u8 = 17;
2563    const UNARY_NOT_PREC: u8 = 15;
2564    const AND_PREC: u8 = 10;
2565    const OR_PREC: u8 = 5;
2566
2567    /// Get the precedence of the next token
2568    pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
2569        // allow the dialect to override precedence logic
2570        if let Some(precedence) = self.dialect.get_next_precedence(self) {
2571            return precedence;
2572        }
2573
2574        let token = self.peek_token();
2575        debug!("get_next_precedence() {:?}", token);
2576        let token_0 = self.peek_nth_token(0);
2577        let token_1 = self.peek_nth_token(1);
2578        let token_2 = self.peek_nth_token(2);
2579        debug!("0: {token_0} 1: {token_1} 2: {token_2}");
2580        match token.token {
2581            Token::Word(w) if w.keyword == Keyword::OR => Ok(Self::OR_PREC),
2582            Token::Word(w) if w.keyword == Keyword::AND => Ok(Self::AND_PREC),
2583            Token::Word(w) if w.keyword == Keyword::XOR => Ok(Self::XOR_PREC),
2584
2585            Token::Word(w) if w.keyword == Keyword::AT => {
2586                match (self.peek_nth_token(1).token, self.peek_nth_token(2).token) {
2587                    (Token::Word(w), Token::Word(w2))
2588                        if w.keyword == Keyword::TIME && w2.keyword == Keyword::ZONE =>
2589                    {
2590                        Ok(Self::TIME_ZONE_PREC)
2591                    }
2592                    _ => Ok(0),
2593                }
2594            }
2595
2596            Token::Word(w) if w.keyword == Keyword::NOT => match self.peek_nth_token(1).token {
2597                // The precedence of NOT varies depending on keyword that
2598                // follows it. If it is followed by IN, BETWEEN, or LIKE,
2599                // it takes on the precedence of those tokens. Otherwise it
2600                // is not an infix operator, and therefore has zero
2601                // precedence.
2602                Token::Word(w) if w.keyword == Keyword::IN => Ok(Self::BETWEEN_PREC),
2603                Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(Self::BETWEEN_PREC),
2604                Token::Word(w) if w.keyword == Keyword::LIKE => Ok(Self::LIKE_PREC),
2605                Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(Self::LIKE_PREC),
2606                Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(Self::LIKE_PREC),
2607                Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(Self::LIKE_PREC),
2608                Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(Self::LIKE_PREC),
2609                _ => Ok(0),
2610            },
2611            Token::Word(w) if w.keyword == Keyword::IS => Ok(Self::IS_PREC),
2612            Token::Word(w) if w.keyword == Keyword::IN => Ok(Self::BETWEEN_PREC),
2613            Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(Self::BETWEEN_PREC),
2614            Token::Word(w) if w.keyword == Keyword::LIKE => Ok(Self::LIKE_PREC),
2615            Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(Self::LIKE_PREC),
2616            Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(Self::LIKE_PREC),
2617            Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(Self::LIKE_PREC),
2618            Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(Self::LIKE_PREC),
2619            Token::Word(w) if w.keyword == Keyword::OPERATOR => Ok(Self::BETWEEN_PREC),
2620            Token::Word(w) if w.keyword == Keyword::DIV => Ok(Self::MUL_DIV_MOD_OP_PREC),
2621            Token::Eq
2622            | Token::Lt
2623            | Token::LtEq
2624            | Token::Neq
2625            | Token::Gt
2626            | Token::GtEq
2627            | Token::DoubleEq
2628            | Token::Tilde
2629            | Token::TildeAsterisk
2630            | Token::ExclamationMarkTilde
2631            | Token::ExclamationMarkTildeAsterisk
2632            | Token::DoubleTilde
2633            | Token::DoubleTildeAsterisk
2634            | Token::ExclamationMarkDoubleTilde
2635            | Token::ExclamationMarkDoubleTildeAsterisk
2636            | Token::Spaceship => Ok(20),
2637            Token::Pipe => Ok(21),
2638            Token::Caret | Token::Sharp | Token::ShiftRight | Token::ShiftLeft => Ok(22),
2639            Token::Ampersand => Ok(23),
2640            Token::Plus | Token::Minus => Ok(Self::PLUS_MINUS_PREC),
2641            Token::Mul | Token::Div | Token::DuckIntDiv | Token::Mod | Token::StringConcat => {
2642                Ok(Self::MUL_DIV_MOD_OP_PREC)
2643            }
2644            Token::DoubleColon => Ok(50),
2645            Token::Colon => Ok(50),
2646            Token::ExclamationMark => Ok(50),
2647            Token::LBracket
2648            | Token::LongArrow
2649            | Token::Arrow
2650            | Token::Overlap
2651            | Token::CaretAt
2652            | Token::HashArrow
2653            | Token::HashLongArrow
2654            | Token::AtArrow
2655            | Token::ArrowAt
2656            | Token::HashMinus
2657            | Token::AtQuestion
2658            | Token::AtAt => Ok(50),
2659            _ => Ok(0),
2660        }
2661    }
2662
2663    /// Return the first non-whitespace token that has not yet been processed
2664    /// (or None if reached end-of-file)
2665    pub fn peek_token(&self) -> TokenWithLocation {
2666        self.peek_nth_token(0)
2667    }
2668
2669    /// Return nth non-whitespace token that has not yet been processed
2670    pub fn peek_nth_token(&self, mut n: usize) -> TokenWithLocation {
2671        let mut index = self.index;
2672        loop {
2673            index += 1;
2674            match self.tokens.get(index - 1) {
2675                Some(TokenWithLocation {
2676                    token: Token::Whitespace(_),
2677                    location: _,
2678                }) => continue,
2679                non_whitespace => {
2680                    if n == 0 {
2681                        return non_whitespace.cloned().unwrap_or(TokenWithLocation {
2682                            token: Token::EOF,
2683                            location: Location { line: 0, column: 0 },
2684                        });
2685                    }
2686                    n -= 1;
2687                }
2688            }
2689        }
2690    }
2691
2692    /// Return the first token, possibly whitespace, that has not yet been processed
2693    /// (or None if reached end-of-file).
2694    pub fn peek_token_no_skip(&self) -> TokenWithLocation {
2695        self.peek_nth_token_no_skip(0)
2696    }
2697
2698    /// Return nth token, possibly whitespace, that has not yet been processed.
2699    pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithLocation {
2700        self.tokens
2701            .get(self.index + n)
2702            .cloned()
2703            .unwrap_or(TokenWithLocation {
2704                token: Token::EOF,
2705                location: Location { line: 0, column: 0 },
2706            })
2707    }
2708
2709    /// Return the first non-whitespace token that has not yet been processed
2710    /// (or None if reached end-of-file) and mark it as processed. OK to call
2711    /// repeatedly after reaching EOF.
2712    pub fn next_token(&mut self) -> TokenWithLocation {
2713        loop {
2714            self.index += 1;
2715            match self.tokens.get(self.index - 1) {
2716                Some(TokenWithLocation {
2717                    token: Token::Whitespace(_),
2718                    location: _,
2719                }) => continue,
2720                token => {
2721                    return token
2722                        .cloned()
2723                        .unwrap_or_else(|| TokenWithLocation::wrap(Token::EOF))
2724                }
2725            }
2726        }
2727    }
2728
2729    /// Return the first unprocessed token, possibly whitespace.
2730    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithLocation> {
2731        self.index += 1;
2732        self.tokens.get(self.index - 1)
2733    }
2734
2735    /// Push back the last one non-whitespace token. Must be called after
2736    /// `next_token()`, otherwise might panic. OK to call after
2737    /// `next_token()` indicates an EOF.
2738    pub fn prev_token(&mut self) {
2739        loop {
2740            assert!(self.index > 0);
2741            self.index -= 1;
2742            if let Some(TokenWithLocation {
2743                token: Token::Whitespace(_),
2744                location: _,
2745            }) = self.tokens.get(self.index)
2746            {
2747                continue;
2748            }
2749            return;
2750        }
2751    }
2752
2753    /// Report `found` was encountered instead of `expected`
2754    pub fn expected<T>(&self, expected: &str, found: TokenWithLocation) -> Result<T, ParserError> {
2755        parser_err!(
2756            format!("Expected {expected}, found: {found}"),
2757            found.location
2758        )
2759    }
2760
2761    /// If the current token is the `expected` keyword, consume it and returns
2762    /// true. Otherwise, no tokens are consumed and returns false.
2763    #[must_use]
2764    pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
2765        match self.peek_token().token {
2766            Token::Word(w) if expected == w.keyword => {
2767                self.next_token();
2768                true
2769            }
2770            _ => false,
2771        }
2772    }
2773
2774    /// If the current and subsequent tokens exactly match the `keywords`
2775    /// sequence, consume them and returns true. Otherwise, no tokens are
2776    /// consumed and returns false
2777    #[must_use]
2778    pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
2779        let index = self.index;
2780        for &keyword in keywords {
2781            if !self.parse_keyword(keyword) {
2782                // println!("parse_keywords aborting .. did not find {:?}", keyword);
2783                // reset index and return immediately
2784                self.index = index;
2785                return false;
2786            }
2787        }
2788        true
2789    }
2790
2791    /// If the current token is one of the given `keywords`, consume the token
2792    /// and return the keyword that matches. Otherwise, no tokens are consumed
2793    /// and returns `None`.
2794    #[must_use]
2795    pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
2796        match self.peek_token().token {
2797            Token::Word(w) => {
2798                keywords
2799                    .iter()
2800                    .find(|keyword| **keyword == w.keyword)
2801                    .map(|keyword| {
2802                        self.next_token();
2803                        *keyword
2804                    })
2805            }
2806            _ => None,
2807        }
2808    }
2809
2810    /// If the current token is one of the expected keywords, consume the token
2811    /// and return the keyword that matches. Otherwise, return an error.
2812    pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
2813        if let Some(keyword) = self.parse_one_of_keywords(keywords) {
2814            Ok(keyword)
2815        } else {
2816            let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
2817            self.expected(
2818                &format!("one of {}", keywords.join(" or ")),
2819                self.peek_token(),
2820            )
2821        }
2822    }
2823
2824    /// If the current token is the `expected` keyword, consume the token.
2825    /// Otherwise return an error.
2826    pub fn expect_keyword(&mut self, expected: Keyword) -> Result<(), ParserError> {
2827        if self.parse_keyword(expected) {
2828            Ok(())
2829        } else {
2830            self.expected(format!("{:?}", &expected).as_str(), self.peek_token())
2831        }
2832    }
2833
2834    /// If the current and subsequent tokens exactly match the `keywords`
2835    /// sequence, consume them and returns Ok. Otherwise, return an Error.
2836    pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
2837        for &kw in expected {
2838            self.expect_keyword(kw)?;
2839        }
2840        Ok(())
2841    }
2842
2843    /// Consume the next token if it matches the expected token, otherwise return false
2844    #[must_use]
2845    pub fn consume_token(&mut self, expected: &Token) -> bool {
2846        if self.peek_token() == *expected {
2847            self.next_token();
2848            true
2849        } else {
2850            false
2851        }
2852    }
2853
2854    /// Bail out if the current token is not an expected keyword, or consume it if it is
2855    pub fn expect_token(&mut self, expected: &Token) -> Result<(), ParserError> {
2856        if self.consume_token(expected) {
2857            Ok(())
2858        } else {
2859            self.expected(&expected.to_string(), self.peek_token())
2860        }
2861    }
2862
2863    /// Parse a comma-separated list of 1+ SelectItem
2864    pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
2865        // BigQuery allows trailing commas, but only in project lists
2866        // e.g. `SELECT 1, 2, FROM t`
2867        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#trailing_commas
2868        //
2869        // This pattern could be captured better with RAII type semantics, but it's quite a bit of
2870        // code to add for just one case, so we'll just do it manually here.
2871        let old_value = self.options.trailing_commas;
2872        self.options.trailing_commas |= dialect_of!(self is BigQueryDialect);
2873
2874        let ret = self.parse_comma_separated(|p| p.parse_select_item());
2875        self.options.trailing_commas = old_value;
2876
2877        ret
2878    }
2879
2880    /// Parse a comma-separated list of 1+ items accepted by `F`
2881    pub fn parse_comma_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
2882    where
2883        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
2884    {
2885        let mut values = vec![];
2886        loop {
2887            values.push(f(self)?);
2888            if !self.consume_token(&Token::Comma) {
2889                break;
2890            } else if self.options.trailing_commas {
2891                match self.peek_token().token {
2892                    Token::Word(kw)
2893                        if keywords::RESERVED_FOR_COLUMN_ALIAS
2894                            .iter()
2895                            .any(|d| kw.keyword == *d) =>
2896                    {
2897                        break;
2898                    }
2899                    Token::RParen
2900                    | Token::SemiColon
2901                    | Token::EOF
2902                    | Token::RBracket
2903                    | Token::RBrace => break,
2904                    _ => continue,
2905                }
2906            }
2907        }
2908        Ok(values)
2909    }
2910
2911    /// Parse a comma-separated list of 0+ items accepted by `F`
2912    pub fn parse_comma_separated0<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
2913    where
2914        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
2915    {
2916        // ()
2917        if matches!(self.peek_token().token, Token::RParen) {
2918            return Ok(vec![]);
2919        }
2920        // (,)
2921        if self.options.trailing_commas
2922            && matches!(self.peek_nth_token(0).token, Token::Comma)
2923            && matches!(self.peek_nth_token(1).token, Token::RParen)
2924        {
2925            let _ = self.consume_token(&Token::Comma);
2926            return Ok(vec![]);
2927        }
2928
2929        self.parse_comma_separated(f)
2930    }
2931
2932    /// Run a parser method `f`, reverting back to the current position
2933    /// if unsuccessful.
2934    #[must_use]
2935    fn maybe_parse<T, F>(&mut self, mut f: F) -> Option<T>
2936    where
2937        F: FnMut(&mut Parser) -> Result<T, ParserError>,
2938    {
2939        let index = self.index;
2940        if let Ok(t) = f(self) {
2941            Some(t)
2942        } else {
2943            self.index = index;
2944            None
2945        }
2946    }
2947
2948    /// Parse either `ALL`, `DISTINCT` or `DISTINCT ON (...)`. Returns `None` if `ALL` is parsed
2949    /// and results in a `ParserError` if both `ALL` and `DISTINCT` are found.
2950    pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
2951        let loc = self.peek_token().location;
2952        let all = self.parse_keyword(Keyword::ALL);
2953        let distinct = self.parse_keyword(Keyword::DISTINCT);
2954        if !distinct {
2955            return Ok(None);
2956        }
2957        if all {
2958            return parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc);
2959        }
2960        let on = self.parse_keyword(Keyword::ON);
2961        if !on {
2962            return Ok(Some(Distinct::Distinct));
2963        }
2964
2965        self.expect_token(&Token::LParen)?;
2966        let col_names = if self.consume_token(&Token::RParen) {
2967            self.prev_token();
2968            Vec::new()
2969        } else {
2970            self.parse_comma_separated(Parser::parse_expr)?
2971        };
2972        self.expect_token(&Token::RParen)?;
2973        Ok(Some(Distinct::On(col_names)))
2974    }
2975
2976    /// Parse a SQL CREATE statement
2977    pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
2978        let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
2979        let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
2980        let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
2981        let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
2982        let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
2983        let global: Option<bool> = if global {
2984            Some(true)
2985        } else if local {
2986            Some(false)
2987        } else {
2988            None
2989        };
2990        let temporary = self
2991            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
2992            .is_some();
2993        if self.parse_keyword(Keyword::TABLE) {
2994            self.parse_create_table(or_replace, temporary, global, transient)
2995        } else if self.parse_keyword(Keyword::MATERIALIZED) || self.parse_keyword(Keyword::VIEW) {
2996            self.prev_token();
2997            self.parse_create_view(or_replace, temporary)
2998        } else if self.parse_keyword(Keyword::EXTERNAL) {
2999            self.parse_create_external_table(or_replace)
3000        } else if self.parse_keyword(Keyword::FUNCTION) {
3001            self.parse_create_function(or_replace, temporary)
3002        } else if self.parse_keyword(Keyword::MACRO) {
3003            self.parse_create_macro(or_replace, temporary)
3004        } else if or_replace {
3005            self.expected(
3006                "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
3007                self.peek_token(),
3008            )
3009        } else if self.parse_keyword(Keyword::EXTENSION) {
3010            self.parse_create_extension()
3011        } else if self.parse_keyword(Keyword::INDEX) {
3012            self.parse_create_index(false)
3013        } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
3014            self.parse_create_index(true)
3015        } else if self.parse_keyword(Keyword::VIRTUAL) {
3016            self.parse_create_virtual_table()
3017        } else if self.parse_keyword(Keyword::SCHEMA) {
3018            self.parse_create_schema()
3019        } else if self.parse_keyword(Keyword::DATABASE) {
3020            self.parse_create_database()
3021        } else if self.parse_keyword(Keyword::ROLE) {
3022            self.parse_create_role()
3023        } else if self.parse_keyword(Keyword::SEQUENCE) {
3024            self.parse_create_sequence(temporary)
3025        } else if self.parse_keyword(Keyword::TYPE) {
3026            self.parse_create_type()
3027        } else if self.parse_keyword(Keyword::PROCEDURE) {
3028            self.parse_create_procedure(or_alter)
3029        } else {
3030            self.expected("an object type after CREATE", self.peek_token())
3031        }
3032    }
3033
3034    /// Parse a CACHE TABLE statement
3035    pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
3036        let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
3037        if self.parse_keyword(Keyword::TABLE) {
3038            let table_name = self.parse_object_name(false)?;
3039            if self.peek_token().token != Token::EOF {
3040                if let Token::Word(word) = self.peek_token().token {
3041                    if word.keyword == Keyword::OPTIONS {
3042                        options = self.parse_options(Keyword::OPTIONS)?
3043                    }
3044                };
3045
3046                if self.peek_token().token != Token::EOF {
3047                    let (a, q) = self.parse_as_query()?;
3048                    has_as = a;
3049                    query = Some(q);
3050                }
3051
3052                Ok(Statement::Cache {
3053                    table_flag,
3054                    table_name,
3055                    has_as,
3056                    options,
3057                    query,
3058                })
3059            } else {
3060                Ok(Statement::Cache {
3061                    table_flag,
3062                    table_name,
3063                    has_as,
3064                    options,
3065                    query,
3066                })
3067            }
3068        } else {
3069            table_flag = Some(self.parse_object_name(false)?);
3070            if self.parse_keyword(Keyword::TABLE) {
3071                let table_name = self.parse_object_name(false)?;
3072                if self.peek_token() != Token::EOF {
3073                    if let Token::Word(word) = self.peek_token().token {
3074                        if word.keyword == Keyword::OPTIONS {
3075                            options = self.parse_options(Keyword::OPTIONS)?
3076                        }
3077                    };
3078
3079                    if self.peek_token() != Token::EOF {
3080                        let (a, q) = self.parse_as_query()?;
3081                        has_as = a;
3082                        query = Some(q);
3083                    }
3084
3085                    Ok(Statement::Cache {
3086                        table_flag,
3087                        table_name,
3088                        has_as,
3089                        options,
3090                        query,
3091                    })
3092                } else {
3093                    Ok(Statement::Cache {
3094                        table_flag,
3095                        table_name,
3096                        has_as,
3097                        options,
3098                        query,
3099                    })
3100                }
3101            } else {
3102                if self.peek_token() == Token::EOF {
3103                    self.prev_token();
3104                }
3105                self.expected("a `TABLE` keyword", self.peek_token())
3106            }
3107        }
3108    }
3109
3110    /// Parse 'AS' before as query,such as `WITH XXX AS SELECT XXX` oer `CACHE TABLE AS SELECT XXX`
3111    pub fn parse_as_query(&mut self) -> Result<(bool, Query), ParserError> {
3112        match self.peek_token().token {
3113            Token::Word(word) => match word.keyword {
3114                Keyword::AS => {
3115                    self.next_token();
3116                    Ok((true, self.parse_query()?))
3117                }
3118                _ => Ok((false, self.parse_query()?)),
3119            },
3120            _ => self.expected("a QUERY statement", self.peek_token()),
3121        }
3122    }
3123
3124    /// Parse a UNCACHE TABLE statement
3125    pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
3126        let has_table = self.parse_keyword(Keyword::TABLE);
3127        if has_table {
3128            let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3129            let table_name = self.parse_object_name(false)?;
3130            if self.peek_token().token == Token::EOF {
3131                Ok(Statement::UNCache {
3132                    table_name,
3133                    if_exists,
3134                })
3135            } else {
3136                self.expected("an `EOF`", self.peek_token())
3137            }
3138        } else {
3139            self.expected("a `TABLE` keyword", self.peek_token())
3140        }
3141    }
3142
3143    /// SQLite-specific `CREATE VIRTUAL TABLE`
3144    pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
3145        self.expect_keyword(Keyword::TABLE)?;
3146        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3147        let table_name = self.parse_object_name(false)?;
3148        self.expect_keyword(Keyword::USING)?;
3149        let module_name = self.parse_identifier(false)?;
3150        // SQLite docs note that module "arguments syntax is sufficiently
3151        // general that the arguments can be made to appear as column
3152        // definitions in a traditional CREATE TABLE statement", but
3153        // we don't implement that.
3154        let module_args = self.parse_parenthesized_column_list(Optional, false)?;
3155        Ok(Statement::CreateVirtualTable {
3156            name: table_name,
3157            if_not_exists,
3158            module_name,
3159            module_args,
3160        })
3161    }
3162
3163    pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
3164        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3165
3166        let schema_name = self.parse_schema_name()?;
3167
3168        Ok(Statement::CreateSchema {
3169            schema_name,
3170            if_not_exists,
3171        })
3172    }
3173
3174    fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
3175        if self.parse_keyword(Keyword::AUTHORIZATION) {
3176            Ok(SchemaName::UnnamedAuthorization(
3177                self.parse_identifier(false)?,
3178            ))
3179        } else {
3180            let name = self.parse_object_name(false)?;
3181
3182            if self.parse_keyword(Keyword::AUTHORIZATION) {
3183                Ok(SchemaName::NamedAuthorization(
3184                    name,
3185                    self.parse_identifier(false)?,
3186                ))
3187            } else {
3188                Ok(SchemaName::Simple(name))
3189            }
3190        }
3191    }
3192
3193    pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
3194        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3195        let db_name = self.parse_object_name(false)?;
3196        let mut location = None;
3197        let mut managed_location = None;
3198        loop {
3199            match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
3200                Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
3201                Some(Keyword::MANAGEDLOCATION) => {
3202                    managed_location = Some(self.parse_literal_string()?)
3203                }
3204                _ => break,
3205            }
3206        }
3207        Ok(Statement::CreateDatabase {
3208            db_name,
3209            if_not_exists: ine,
3210            location,
3211            managed_location,
3212        })
3213    }
3214
3215    pub fn parse_optional_create_function_using(
3216        &mut self,
3217    ) -> Result<Option<CreateFunctionUsing>, ParserError> {
3218        if !self.parse_keyword(Keyword::USING) {
3219            return Ok(None);
3220        };
3221        let keyword =
3222            self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
3223
3224        let uri = self.parse_literal_string()?;
3225
3226        match keyword {
3227            Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
3228            Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
3229            Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
3230            _ => self.expected(
3231                "JAR, FILE or ARCHIVE, got {:?}",
3232                TokenWithLocation::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
3233            ),
3234        }
3235    }
3236
3237    pub fn parse_create_function(
3238        &mut self,
3239        or_replace: bool,
3240        temporary: bool,
3241    ) -> Result<Statement, ParserError> {
3242        if dialect_of!(self is HiveDialect) {
3243            let name = self.parse_object_name(false)?;
3244            self.expect_keyword(Keyword::AS)?;
3245            let class_name = self.parse_function_definition()?;
3246            let params = CreateFunctionBody {
3247                as_: Some(class_name),
3248                using: self.parse_optional_create_function_using()?,
3249                ..Default::default()
3250            };
3251
3252            Ok(Statement::CreateFunction {
3253                or_replace,
3254                temporary,
3255                name,
3256                args: None,
3257                return_type: None,
3258                params,
3259            })
3260        } else if dialect_of!(self is PostgreSqlDialect) {
3261            let name = self.parse_object_name(false)?;
3262            self.expect_token(&Token::LParen)?;
3263            let args = if self.consume_token(&Token::RParen) {
3264                self.prev_token();
3265                None
3266            } else {
3267                Some(self.parse_comma_separated(Parser::parse_function_arg)?)
3268            };
3269
3270            self.expect_token(&Token::RParen)?;
3271
3272            let return_type = if self.parse_keyword(Keyword::RETURNS) {
3273                Some(self.parse_data_type()?)
3274            } else {
3275                None
3276            };
3277
3278            let params = self.parse_create_function_body()?;
3279
3280            Ok(Statement::CreateFunction {
3281                or_replace,
3282                temporary,
3283                name,
3284                args,
3285                return_type,
3286                params,
3287            })
3288        } else if dialect_of!(self is DuckDbDialect) {
3289            self.parse_create_macro(or_replace, temporary)
3290        } else {
3291            self.prev_token();
3292            self.expected("an object type after CREATE", self.peek_token())
3293        }
3294    }
3295
3296    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
3297        let mode = if self.parse_keyword(Keyword::IN) {
3298            Some(ArgMode::In)
3299        } else if self.parse_keyword(Keyword::OUT) {
3300            Some(ArgMode::Out)
3301        } else if self.parse_keyword(Keyword::INOUT) {
3302            Some(ArgMode::InOut)
3303        } else {
3304            None
3305        };
3306
3307        // parse: [ argname ] argtype
3308        let mut name = None;
3309        let mut data_type = self.parse_data_type()?;
3310        if let DataType::Custom(n, _) = &data_type {
3311            // the first token is actually a name
3312            name = Some(n.0[0].clone());
3313            data_type = self.parse_data_type()?;
3314        }
3315
3316        let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
3317        {
3318            Some(self.parse_expr()?)
3319        } else {
3320            None
3321        };
3322        Ok(OperateFunctionArg {
3323            mode,
3324            name,
3325            data_type,
3326            default_expr,
3327        })
3328    }
3329
3330    fn parse_create_function_body(&mut self) -> Result<CreateFunctionBody, ParserError> {
3331        let mut body = CreateFunctionBody::default();
3332        loop {
3333            fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
3334                if field.is_some() {
3335                    return Err(ParserError::ParserError(format!(
3336                        "{name} specified more than once",
3337                    )));
3338                }
3339                Ok(())
3340            }
3341            if self.parse_keyword(Keyword::AS) {
3342                ensure_not_set(&body.as_, "AS")?;
3343                body.as_ = Some(self.parse_function_definition()?);
3344            } else if self.parse_keyword(Keyword::LANGUAGE) {
3345                ensure_not_set(&body.language, "LANGUAGE")?;
3346                body.language = Some(self.parse_identifier(false)?);
3347            } else if self.parse_keyword(Keyword::IMMUTABLE) {
3348                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
3349                body.behavior = Some(FunctionBehavior::Immutable);
3350            } else if self.parse_keyword(Keyword::STABLE) {
3351                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
3352                body.behavior = Some(FunctionBehavior::Stable);
3353            } else if self.parse_keyword(Keyword::VOLATILE) {
3354                ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
3355                body.behavior = Some(FunctionBehavior::Volatile);
3356            } else if self.parse_keyword(Keyword::RETURN) {
3357                ensure_not_set(&body.return_, "RETURN")?;
3358                body.return_ = Some(self.parse_expr()?);
3359            } else {
3360                return Ok(body);
3361            }
3362        }
3363    }
3364
3365    pub fn parse_create_macro(
3366        &mut self,
3367        or_replace: bool,
3368        temporary: bool,
3369    ) -> Result<Statement, ParserError> {
3370        if dialect_of!(self is DuckDbDialect |  GenericDialect) {
3371            let name = self.parse_object_name(false)?;
3372            self.expect_token(&Token::LParen)?;
3373            let args = if self.consume_token(&Token::RParen) {
3374                self.prev_token();
3375                None
3376            } else {
3377                Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
3378            };
3379
3380            self.expect_token(&Token::RParen)?;
3381            self.expect_keyword(Keyword::AS)?;
3382
3383            Ok(Statement::CreateMacro {
3384                or_replace,
3385                temporary,
3386                name,
3387                args,
3388                definition: if self.parse_keyword(Keyword::TABLE) {
3389                    MacroDefinition::Table(self.parse_query()?)
3390                } else {
3391                    MacroDefinition::Expr(self.parse_expr()?)
3392                },
3393            })
3394        } else {
3395            self.prev_token();
3396            self.expected("an object type after CREATE", self.peek_token())
3397        }
3398    }
3399
3400    fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
3401        let name = self.parse_identifier(false)?;
3402
3403        let default_expr =
3404            if self.consume_token(&Token::DuckAssignment) || self.consume_token(&Token::RArrow) {
3405                Some(self.parse_expr()?)
3406            } else {
3407                None
3408            };
3409        Ok(MacroArg { name, default_expr })
3410    }
3411
3412    pub fn parse_create_external_table(
3413        &mut self,
3414        or_replace: bool,
3415    ) -> Result<Statement, ParserError> {
3416        self.expect_keyword(Keyword::TABLE)?;
3417        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3418        let table_name = self.parse_object_name(false)?;
3419        let (columns, constraints) = self.parse_columns()?;
3420
3421        let hive_distribution = self.parse_hive_distribution()?;
3422        let hive_formats = self.parse_hive_formats()?;
3423
3424        let file_format = if let Some(ff) = &hive_formats.storage {
3425            match ff {
3426                HiveIOFormat::FileFormat { format } => Some(*format),
3427                _ => None,
3428            }
3429        } else {
3430            None
3431        };
3432        let location = hive_formats.location.clone();
3433        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
3434        Ok(CreateTableBuilder::new(table_name)
3435            .columns(columns)
3436            .constraints(constraints)
3437            .hive_distribution(hive_distribution)
3438            .hive_formats(Some(hive_formats))
3439            .table_properties(table_properties)
3440            .or_replace(or_replace)
3441            .if_not_exists(if_not_exists)
3442            .external(true)
3443            .file_format(file_format)
3444            .location(location)
3445            .build())
3446    }
3447
3448    pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
3449        let next_token = self.next_token();
3450        match &next_token.token {
3451            Token::Word(w) => match w.keyword {
3452                Keyword::AVRO => Ok(FileFormat::AVRO),
3453                Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
3454                Keyword::ORC => Ok(FileFormat::ORC),
3455                Keyword::PARQUET => Ok(FileFormat::PARQUET),
3456                Keyword::RCFILE => Ok(FileFormat::RCFILE),
3457                Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
3458                Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
3459                _ => self.expected("fileformat", next_token),
3460            },
3461            _ => self.expected("fileformat", next_token),
3462        }
3463    }
3464
3465    pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
3466        let next_token = self.next_token();
3467        match &next_token.token {
3468            Token::Word(w) => match w.keyword {
3469                Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
3470                Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
3471                Keyword::JSON => Ok(AnalyzeFormat::JSON),
3472                _ => self.expected("fileformat", next_token),
3473            },
3474            _ => self.expected("fileformat", next_token),
3475        }
3476    }
3477
3478    pub fn parse_create_view(
3479        &mut self,
3480        or_replace: bool,
3481        temporary: bool,
3482    ) -> Result<Statement, ParserError> {
3483        let materialized = self.parse_keyword(Keyword::MATERIALIZED);
3484        self.expect_keyword(Keyword::VIEW)?;
3485        let if_not_exists = dialect_of!(self is SQLiteDialect|GenericDialect)
3486            && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3487        // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
3488        // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
3489        let name = self.parse_object_name(false)?;
3490        let columns = self.parse_view_columns()?;
3491        let mut options = CreateTableOptions::None;
3492        let with_options = self.parse_options(Keyword::WITH)?;
3493        if !with_options.is_empty() {
3494            options = CreateTableOptions::With(with_options);
3495        }
3496
3497        let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
3498            self.expect_keyword(Keyword::BY)?;
3499            self.parse_parenthesized_column_list(Optional, false)?
3500        } else {
3501            vec![]
3502        };
3503
3504        if dialect_of!(self is BigQueryDialect | GenericDialect) {
3505            if let Token::Word(word) = self.peek_token().token {
3506                if word.keyword == Keyword::OPTIONS {
3507                    let opts = self.parse_options(Keyword::OPTIONS)?;
3508                    if !opts.is_empty() {
3509                        options = CreateTableOptions::Options(opts);
3510                    }
3511                }
3512            };
3513        }
3514
3515        self.expect_keyword(Keyword::AS)?;
3516        let query = Box::new(self.parse_query()?);
3517        // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
3518
3519        let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
3520            && self.parse_keywords(&[
3521                Keyword::WITH,
3522                Keyword::NO,
3523                Keyword::SCHEMA,
3524                Keyword::BINDING,
3525            ]);
3526
3527        Ok(Statement::CreateView {
3528            name,
3529            columns,
3530            query,
3531            materialized,
3532            or_replace,
3533            options,
3534            cluster_by,
3535            with_no_schema_binding,
3536            if_not_exists,
3537            temporary,
3538        })
3539    }
3540
3541    pub fn parse_create_role(&mut self) -> Result<Statement, ParserError> {
3542        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3543        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
3544
3545        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
3546
3547        let optional_keywords = if dialect_of!(self is MsSqlDialect) {
3548            vec![Keyword::AUTHORIZATION]
3549        } else if dialect_of!(self is PostgreSqlDialect) {
3550            vec![
3551                Keyword::LOGIN,
3552                Keyword::NOLOGIN,
3553                Keyword::INHERIT,
3554                Keyword::NOINHERIT,
3555                Keyword::BYPASSRLS,
3556                Keyword::NOBYPASSRLS,
3557                Keyword::PASSWORD,
3558                Keyword::CREATEDB,
3559                Keyword::NOCREATEDB,
3560                Keyword::CREATEROLE,
3561                Keyword::NOCREATEROLE,
3562                Keyword::SUPERUSER,
3563                Keyword::NOSUPERUSER,
3564                Keyword::REPLICATION,
3565                Keyword::NOREPLICATION,
3566                Keyword::CONNECTION,
3567                Keyword::VALID,
3568                Keyword::IN,
3569                Keyword::ROLE,
3570                Keyword::ADMIN,
3571                Keyword::USER,
3572            ]
3573        } else {
3574            vec![]
3575        };
3576
3577        // MSSQL
3578        let mut authorization_owner = None;
3579        // Postgres
3580        let mut login = None;
3581        let mut inherit = None;
3582        let mut bypassrls = None;
3583        let mut password = None;
3584        let mut create_db = None;
3585        let mut create_role = None;
3586        let mut superuser = None;
3587        let mut replication = None;
3588        let mut connection_limit = None;
3589        let mut valid_until = None;
3590        let mut in_role = vec![];
3591        let mut in_group = vec![];
3592        let mut role = vec![];
3593        let mut user = vec![];
3594        let mut admin = vec![];
3595
3596        while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
3597            let loc = self
3598                .tokens
3599                .get(self.index - 1)
3600                .map_or(Location { line: 0, column: 0 }, |t| t.location);
3601            match keyword {
3602                Keyword::AUTHORIZATION => {
3603                    if authorization_owner.is_some() {
3604                        parser_err!("Found multiple AUTHORIZATION", loc)
3605                    } else {
3606                        authorization_owner = Some(self.parse_object_name(false)?);
3607                        Ok(())
3608                    }
3609                }
3610                Keyword::LOGIN | Keyword::NOLOGIN => {
3611                    if login.is_some() {
3612                        parser_err!("Found multiple LOGIN or NOLOGIN", loc)
3613                    } else {
3614                        login = Some(keyword == Keyword::LOGIN);
3615                        Ok(())
3616                    }
3617                }
3618                Keyword::INHERIT | Keyword::NOINHERIT => {
3619                    if inherit.is_some() {
3620                        parser_err!("Found multiple INHERIT or NOINHERIT", loc)
3621                    } else {
3622                        inherit = Some(keyword == Keyword::INHERIT);
3623                        Ok(())
3624                    }
3625                }
3626                Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
3627                    if bypassrls.is_some() {
3628                        parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
3629                    } else {
3630                        bypassrls = Some(keyword == Keyword::BYPASSRLS);
3631                        Ok(())
3632                    }
3633                }
3634                Keyword::CREATEDB | Keyword::NOCREATEDB => {
3635                    if create_db.is_some() {
3636                        parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
3637                    } else {
3638                        create_db = Some(keyword == Keyword::CREATEDB);
3639                        Ok(())
3640                    }
3641                }
3642                Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
3643                    if create_role.is_some() {
3644                        parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
3645                    } else {
3646                        create_role = Some(keyword == Keyword::CREATEROLE);
3647                        Ok(())
3648                    }
3649                }
3650                Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
3651                    if superuser.is_some() {
3652                        parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
3653                    } else {
3654                        superuser = Some(keyword == Keyword::SUPERUSER);
3655                        Ok(())
3656                    }
3657                }
3658                Keyword::REPLICATION | Keyword::NOREPLICATION => {
3659                    if replication.is_some() {
3660                        parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
3661                    } else {
3662                        replication = Some(keyword == Keyword::REPLICATION);
3663                        Ok(())
3664                    }
3665                }
3666                Keyword::PASSWORD => {
3667                    if password.is_some() {
3668                        parser_err!("Found multiple PASSWORD", loc)
3669                    } else {
3670                        password = if self.parse_keyword(Keyword::NULL) {
3671                            Some(Password::NullPassword)
3672                        } else {
3673                            Some(Password::Password(Expr::Value(self.parse_value()?)))
3674                        };
3675                        Ok(())
3676                    }
3677                }
3678                Keyword::CONNECTION => {
3679                    self.expect_keyword(Keyword::LIMIT)?;
3680                    if connection_limit.is_some() {
3681                        parser_err!("Found multiple CONNECTION LIMIT", loc)
3682                    } else {
3683                        connection_limit = Some(Expr::Value(self.parse_number_value()?));
3684                        Ok(())
3685                    }
3686                }
3687                Keyword::VALID => {
3688                    self.expect_keyword(Keyword::UNTIL)?;
3689                    if valid_until.is_some() {
3690                        parser_err!("Found multiple VALID UNTIL", loc)
3691                    } else {
3692                        valid_until = Some(Expr::Value(self.parse_value()?));
3693                        Ok(())
3694                    }
3695                }
3696                Keyword::IN => {
3697                    if self.parse_keyword(Keyword::ROLE) {
3698                        if !in_role.is_empty() {
3699                            parser_err!("Found multiple IN ROLE", loc)
3700                        } else {
3701                            in_role = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3702                            Ok(())
3703                        }
3704                    } else if self.parse_keyword(Keyword::GROUP) {
3705                        if !in_group.is_empty() {
3706                            parser_err!("Found multiple IN GROUP", loc)
3707                        } else {
3708                            in_group = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3709                            Ok(())
3710                        }
3711                    } else {
3712                        self.expected("ROLE or GROUP after IN", self.peek_token())
3713                    }
3714                }
3715                Keyword::ROLE => {
3716                    if !role.is_empty() {
3717                        parser_err!("Found multiple ROLE", loc)
3718                    } else {
3719                        role = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3720                        Ok(())
3721                    }
3722                }
3723                Keyword::USER => {
3724                    if !user.is_empty() {
3725                        parser_err!("Found multiple USER", loc)
3726                    } else {
3727                        user = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3728                        Ok(())
3729                    }
3730                }
3731                Keyword::ADMIN => {
3732                    if !admin.is_empty() {
3733                        parser_err!("Found multiple ADMIN", loc)
3734                    } else {
3735                        admin = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3736                        Ok(())
3737                    }
3738                }
3739                _ => break,
3740            }?
3741        }
3742
3743        Ok(Statement::CreateRole {
3744            names,
3745            if_not_exists,
3746            login,
3747            inherit,
3748            bypassrls,
3749            password,
3750            create_db,
3751            create_role,
3752            replication,
3753            superuser,
3754            connection_limit,
3755            valid_until,
3756            in_role,
3757            in_group,
3758            role,
3759            user,
3760            admin,
3761            authorization_owner,
3762        })
3763    }
3764
3765    pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
3766        // MySQL dialect supports `TEMPORARY`
3767        let temporary = dialect_of!(self is MySqlDialect | GenericDialect)
3768            && self.parse_keyword(Keyword::TEMPORARY);
3769
3770        let object_type = if self.parse_keyword(Keyword::TABLE) {
3771            ObjectType::Table
3772        } else if self.parse_keyword(Keyword::VIEW) {
3773            ObjectType::View
3774        } else if self.parse_keyword(Keyword::INDEX) {
3775            ObjectType::Index
3776        } else if self.parse_keyword(Keyword::ROLE) {
3777            ObjectType::Role
3778        } else if self.parse_keyword(Keyword::SCHEMA) {
3779            ObjectType::Schema
3780        } else if self.parse_keyword(Keyword::SEQUENCE) {
3781            ObjectType::Sequence
3782        } else if self.parse_keyword(Keyword::STAGE) {
3783            ObjectType::Stage
3784        } else if self.parse_keyword(Keyword::FUNCTION) {
3785            return self.parse_drop_function();
3786        } else {
3787            return self.expected(
3788                "TABLE, VIEW, INDEX, ROLE, SCHEMA, FUNCTION, STAGE or SEQUENCE after DROP",
3789                self.peek_token(),
3790            );
3791        };
3792        // Many dialects support the non standard `IF EXISTS` clause and allow
3793        // specifying multiple objects to delete in a single statement
3794        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3795        let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
3796
3797        let loc = self.peek_token().location;
3798        let cascade = self.parse_keyword(Keyword::CASCADE);
3799        let restrict = self.parse_keyword(Keyword::RESTRICT);
3800        let purge = self.parse_keyword(Keyword::PURGE);
3801        if cascade && restrict {
3802            return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
3803        }
3804        if object_type == ObjectType::Role && (cascade || restrict || purge) {
3805            return parser_err!(
3806                "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
3807                loc
3808            );
3809        }
3810        Ok(Statement::Drop {
3811            object_type,
3812            if_exists,
3813            names,
3814            cascade,
3815            restrict,
3816            purge,
3817            temporary,
3818        })
3819    }
3820
3821    /// ```sql
3822    /// DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
3823    /// [ CASCADE | RESTRICT ]
3824    /// ```
3825    fn parse_drop_function(&mut self) -> Result<Statement, ParserError> {
3826        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3827        let func_desc = self.parse_comma_separated(Parser::parse_drop_function_desc)?;
3828        let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
3829            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
3830            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
3831            _ => None,
3832        };
3833        Ok(Statement::DropFunction {
3834            if_exists,
3835            func_desc,
3836            option,
3837        })
3838    }
3839
3840    fn parse_drop_function_desc(&mut self) -> Result<DropFunctionDesc, ParserError> {
3841        let name = self.parse_object_name(false)?;
3842
3843        let args = if self.consume_token(&Token::LParen) {
3844            if self.consume_token(&Token::RParen) {
3845                None
3846            } else {
3847                let args = self.parse_comma_separated(Parser::parse_function_arg)?;
3848                self.expect_token(&Token::RParen)?;
3849                Some(args)
3850            }
3851        } else {
3852            None
3853        };
3854
3855        Ok(DropFunctionDesc { name, args })
3856    }
3857
3858    /// ```sql
3859    /// DECLARE name [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]
3860    ///     CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
3861    /// ```
3862    pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
3863        let name = self.parse_identifier(false)?;
3864
3865        let binary = self.parse_keyword(Keyword::BINARY);
3866        let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
3867            Some(true)
3868        } else if self.parse_keyword(Keyword::ASENSITIVE) {
3869            Some(false)
3870        } else {
3871            None
3872        };
3873        let scroll = if self.parse_keyword(Keyword::SCROLL) {
3874            Some(true)
3875        } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
3876            Some(false)
3877        } else {
3878            None
3879        };
3880
3881        self.expect_keyword(Keyword::CURSOR)?;
3882
3883        let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
3884            Some(keyword) => {
3885                self.expect_keyword(Keyword::HOLD)?;
3886
3887                match keyword {
3888                    Keyword::WITH => Some(true),
3889                    Keyword::WITHOUT => Some(false),
3890                    _ => unreachable!(),
3891                }
3892            }
3893            None => None,
3894        };
3895
3896        self.expect_keyword(Keyword::FOR)?;
3897
3898        let query = self.parse_query()?;
3899
3900        Ok(Statement::Declare {
3901            name,
3902            binary,
3903            sensitive,
3904            scroll,
3905            hold,
3906            query: Box::new(query),
3907        })
3908    }
3909
3910    // FETCH [ direction { FROM | IN } ] cursor INTO target;
3911    pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
3912        let direction = if self.parse_keyword(Keyword::NEXT) {
3913            FetchDirection::Next
3914        } else if self.parse_keyword(Keyword::PRIOR) {
3915            FetchDirection::Prior
3916        } else if self.parse_keyword(Keyword::FIRST) {
3917            FetchDirection::First
3918        } else if self.parse_keyword(Keyword::LAST) {
3919            FetchDirection::Last
3920        } else if self.parse_keyword(Keyword::ABSOLUTE) {
3921            FetchDirection::Absolute {
3922                limit: self.parse_number_value()?,
3923            }
3924        } else if self.parse_keyword(Keyword::RELATIVE) {
3925            FetchDirection::Relative {
3926                limit: self.parse_number_value()?,
3927            }
3928        } else if self.parse_keyword(Keyword::FORWARD) {
3929            if self.parse_keyword(Keyword::ALL) {
3930                FetchDirection::ForwardAll
3931            } else {
3932                FetchDirection::Forward {
3933                    // TODO: Support optional
3934                    limit: Some(self.parse_number_value()?),
3935                }
3936            }
3937        } else if self.parse_keyword(Keyword::BACKWARD) {
3938            if self.parse_keyword(Keyword::ALL) {
3939                FetchDirection::BackwardAll
3940            } else {
3941                FetchDirection::Backward {
3942                    // TODO: Support optional
3943                    limit: Some(self.parse_number_value()?),
3944                }
3945            }
3946        } else if self.parse_keyword(Keyword::ALL) {
3947            FetchDirection::All
3948        } else {
3949            FetchDirection::Count {
3950                limit: self.parse_number_value()?,
3951            }
3952        };
3953
3954        self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
3955
3956        let name = self.parse_identifier(false)?;
3957
3958        let into = if self.parse_keyword(Keyword::INTO) {
3959            Some(self.parse_object_name(false)?)
3960        } else {
3961            None
3962        };
3963
3964        Ok(Statement::Fetch {
3965            name,
3966            direction,
3967            into,
3968        })
3969    }
3970
3971    pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
3972        let object_type = if self.parse_keyword(Keyword::ALL) {
3973            DiscardObject::ALL
3974        } else if self.parse_keyword(Keyword::PLANS) {
3975            DiscardObject::PLANS
3976        } else if self.parse_keyword(Keyword::SEQUENCES) {
3977            DiscardObject::SEQUENCES
3978        } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
3979            DiscardObject::TEMP
3980        } else {
3981            return self.expected(
3982                "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
3983                self.peek_token(),
3984            );
3985        };
3986        Ok(Statement::Discard { object_type })
3987    }
3988
3989    pub fn parse_create_index(&mut self, unique: bool) -> Result<Statement, ParserError> {
3990        let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
3991        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3992        let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
3993            let index_name = self.parse_object_name(false)?;
3994            self.expect_keyword(Keyword::ON)?;
3995            Some(index_name)
3996        } else {
3997            None
3998        };
3999        let table_name = self.parse_object_name(false)?;
4000        let using = if self.parse_keyword(Keyword::USING) {
4001            Some(self.parse_identifier(false)?)
4002        } else {
4003            None
4004        };
4005        self.expect_token(&Token::LParen)?;
4006        let columns = self.parse_comma_separated(Parser::parse_order_by_expr)?;
4007        self.expect_token(&Token::RParen)?;
4008
4009        let include = if self.parse_keyword(Keyword::INCLUDE) {
4010            self.expect_token(&Token::LParen)?;
4011            let columns = self.parse_comma_separated(|p| p.parse_identifier(false))?;
4012            self.expect_token(&Token::RParen)?;
4013            columns
4014        } else {
4015            vec![]
4016        };
4017
4018        let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
4019            let not = self.parse_keyword(Keyword::NOT);
4020            self.expect_keyword(Keyword::DISTINCT)?;
4021            Some(!not)
4022        } else {
4023            None
4024        };
4025
4026        let predicate = if self.parse_keyword(Keyword::WHERE) {
4027            Some(self.parse_expr()?)
4028        } else {
4029            None
4030        };
4031
4032        Ok(Statement::CreateIndex {
4033            name: index_name,
4034            table_name,
4035            using,
4036            columns,
4037            unique,
4038            concurrently,
4039            if_not_exists,
4040            include,
4041            nulls_distinct,
4042            predicate,
4043        })
4044    }
4045
4046    pub fn parse_create_extension(&mut self) -> Result<Statement, ParserError> {
4047        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
4048        let name = self.parse_identifier(false)?;
4049
4050        let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
4051            let schema = if self.parse_keyword(Keyword::SCHEMA) {
4052                Some(self.parse_identifier(false)?)
4053            } else {
4054                None
4055            };
4056
4057            let version = if self.parse_keyword(Keyword::VERSION) {
4058                Some(self.parse_identifier(false)?)
4059            } else {
4060                None
4061            };
4062
4063            let cascade = self.parse_keyword(Keyword::CASCADE);
4064
4065            (schema, version, cascade)
4066        } else {
4067            (None, None, false)
4068        };
4069
4070        Ok(Statement::CreateExtension {
4071            name,
4072            if_not_exists,
4073            schema,
4074            version,
4075            cascade,
4076        })
4077    }
4078
4079    //TODO: Implement parsing for Skewed and Clustered
4080    pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
4081        if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
4082            self.expect_token(&Token::LParen)?;
4083            let columns = self.parse_comma_separated(Parser::parse_column_def)?;
4084            self.expect_token(&Token::RParen)?;
4085            Ok(HiveDistributionStyle::PARTITIONED { columns })
4086        } else {
4087            Ok(HiveDistributionStyle::NONE)
4088        }
4089    }
4090
4091    pub fn parse_hive_formats(&mut self) -> Result<HiveFormat, ParserError> {
4092        let mut hive_format = HiveFormat::default();
4093        loop {
4094            match self.parse_one_of_keywords(&[Keyword::ROW, Keyword::STORED, Keyword::LOCATION]) {
4095                Some(Keyword::ROW) => {
4096                    hive_format.row_format = Some(self.parse_row_format()?);
4097                }
4098                Some(Keyword::STORED) => {
4099                    self.expect_keyword(Keyword::AS)?;
4100                    if self.parse_keyword(Keyword::INPUTFORMAT) {
4101                        let input_format = self.parse_expr()?;
4102                        self.expect_keyword(Keyword::OUTPUTFORMAT)?;
4103                        let output_format = self.parse_expr()?;
4104                        hive_format.storage = Some(HiveIOFormat::IOF {
4105                            input_format,
4106                            output_format,
4107                        });
4108                    } else {
4109                        let format = self.parse_file_format()?;
4110                        hive_format.storage = Some(HiveIOFormat::FileFormat { format });
4111                    }
4112                }
4113                Some(Keyword::LOCATION) => {
4114                    hive_format.location = Some(self.parse_literal_string()?);
4115                }
4116                None => break,
4117                _ => break,
4118            }
4119        }
4120
4121        Ok(hive_format)
4122    }
4123
4124    pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
4125        self.expect_keyword(Keyword::FORMAT)?;
4126        match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
4127            Some(Keyword::SERDE) => {
4128                let class = self.parse_literal_string()?;
4129                Ok(HiveRowFormat::SERDE { class })
4130            }
4131            _ => Ok(HiveRowFormat::DELIMITED),
4132        }
4133    }
4134
4135    pub fn parse_create_table(
4136        &mut self,
4137        or_replace: bool,
4138        temporary: bool,
4139        global: Option<bool>,
4140        transient: bool,
4141    ) -> Result<Statement, ParserError> {
4142        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
4143        let table_name = self.parse_object_name(false)?;
4144
4145        // Clickhouse has `ON CLUSTER 'cluster'` syntax for DDLs
4146        let on_cluster = if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
4147            let next_token = self.next_token();
4148            match next_token.token {
4149                Token::SingleQuotedString(s) => Some(s),
4150                Token::Word(s) => Some(s.to_string()),
4151                _ => self.expected("identifier or cluster literal", next_token)?,
4152            }
4153        } else {
4154            None
4155        };
4156
4157        let like = if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
4158            self.parse_object_name(false).ok()
4159        } else {
4160            None
4161        };
4162
4163        let clone = if self.parse_keyword(Keyword::CLONE) {
4164            self.parse_object_name(false).ok()
4165        } else {
4166            None
4167        };
4168
4169        // parse optional column list (schema)
4170        let (columns, constraints) = self.parse_columns()?;
4171
4172        // SQLite supports `WITHOUT ROWID` at the end of `CREATE TABLE`
4173        let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
4174
4175        let hive_distribution = self.parse_hive_distribution()?;
4176        let hive_formats = self.parse_hive_formats()?;
4177        // PostgreSQL supports `WITH ( options )`, before `AS`
4178        let with_options = self.parse_options(Keyword::WITH)?;
4179        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
4180
4181        let engine = if self.parse_keyword(Keyword::ENGINE) {
4182            self.expect_token(&Token::Eq)?;
4183            let next_token = self.next_token();
4184            match next_token.token {
4185                Token::Word(w) => Some(w.value),
4186                _ => self.expected("identifier", next_token)?,
4187            }
4188        } else {
4189            None
4190        };
4191
4192        let auto_increment_offset = if self.parse_keyword(Keyword::AUTO_INCREMENT) {
4193            let _ = self.consume_token(&Token::Eq);
4194            let next_token = self.next_token();
4195            match next_token.token {
4196                Token::Number(s, _) => Some(s.parse::<u32>().expect("literal int")),
4197                _ => self.expected("literal int", next_token)?,
4198            }
4199        } else {
4200            None
4201        };
4202
4203        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
4204            if self.consume_token(&Token::LParen) {
4205                let columns = if self.peek_token() != Token::RParen {
4206                    self.parse_comma_separated(|p| p.parse_identifier(false))?
4207                } else {
4208                    vec![]
4209                };
4210                self.expect_token(&Token::RParen)?;
4211                Some(columns)
4212            } else {
4213                Some(vec![self.parse_identifier(false)?])
4214            }
4215        } else {
4216            None
4217        };
4218
4219        let big_query_config = if dialect_of!(self is BigQueryDialect | GenericDialect) {
4220            self.parse_optional_big_query_create_table_config()?
4221        } else {
4222            Default::default()
4223        };
4224
4225        // Parse optional `AS ( query )`
4226        let query = if self.parse_keyword(Keyword::AS) {
4227            Some(Box::new(self.parse_query()?))
4228        } else {
4229            None
4230        };
4231
4232        let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
4233            self.expect_token(&Token::Eq)?;
4234            let next_token = self.next_token();
4235            match next_token.token {
4236                Token::Word(w) => Some(w.value),
4237                _ => self.expected("identifier", next_token)?,
4238            }
4239        } else {
4240            None
4241        };
4242
4243        let collation = if self.parse_keywords(&[Keyword::COLLATE]) {
4244            self.expect_token(&Token::Eq)?;
4245            let next_token = self.next_token();
4246            match next_token.token {
4247                Token::Word(w) => Some(w.value),
4248                _ => self.expected("identifier", next_token)?,
4249            }
4250        } else {
4251            None
4252        };
4253
4254        let on_commit: Option<OnCommit> =
4255            if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, Keyword::DELETE, Keyword::ROWS])
4256            {
4257                Some(OnCommit::DeleteRows)
4258            } else if self.parse_keywords(&[
4259                Keyword::ON,
4260                Keyword::COMMIT,
4261                Keyword::PRESERVE,
4262                Keyword::ROWS,
4263            ]) {
4264                Some(OnCommit::PreserveRows)
4265            } else if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, Keyword::DROP]) {
4266                Some(OnCommit::Drop)
4267            } else {
4268                None
4269            };
4270
4271        let strict = self.parse_keyword(Keyword::STRICT);
4272
4273        let comment = if self.parse_keyword(Keyword::COMMENT) {
4274            let _ = self.consume_token(&Token::Eq);
4275            let next_token = self.next_token();
4276            match next_token.token {
4277                Token::SingleQuotedString(str) => Some(str),
4278                _ => self.expected("comment", next_token)?,
4279            }
4280        } else {
4281            None
4282        };
4283
4284        Ok(CreateTableBuilder::new(table_name)
4285            .temporary(temporary)
4286            .columns(columns)
4287            .constraints(constraints)
4288            .with_options(with_options)
4289            .table_properties(table_properties)
4290            .or_replace(or_replace)
4291            .if_not_exists(if_not_exists)
4292            .transient(transient)
4293            .hive_distribution(hive_distribution)
4294            .hive_formats(Some(hive_formats))
4295            .global(global)
4296            .query(query)
4297            .without_rowid(without_rowid)
4298            .like(like)
4299            .clone_clause(clone)
4300            .engine(engine)
4301            .comment(comment)
4302            .auto_increment_offset(auto_increment_offset)
4303            .order_by(order_by)
4304            .default_charset(default_charset)
4305            .collation(collation)
4306            .on_commit(on_commit)
4307            .on_cluster(on_cluster)
4308            .partition_by(big_query_config.partition_by)
4309            .cluster_by(big_query_config.cluster_by)
4310            .options(big_query_config.options)
4311            .strict(strict)
4312            .build())
4313    }
4314
4315    /// Parse configuration like partitioning, clustering information during big-query table creation.
4316    /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2>
4317    fn parse_optional_big_query_create_table_config(
4318        &mut self,
4319    ) -> Result<BigQueryTableConfiguration, ParserError> {
4320        let mut partition_by = None;
4321        if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
4322            partition_by = Some(Box::new(self.parse_expr()?));
4323        };
4324
4325        let mut cluster_by = None;
4326        if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
4327            cluster_by = Some(self.parse_comma_separated(|p| p.parse_identifier(false))?);
4328        };
4329
4330        let mut options = None;
4331        if let Token::Word(word) = self.peek_token().token {
4332            if word.keyword == Keyword::OPTIONS {
4333                options = Some(self.parse_options(Keyword::OPTIONS)?);
4334            }
4335        };
4336
4337        Ok(BigQueryTableConfiguration {
4338            partition_by,
4339            cluster_by,
4340            options,
4341        })
4342    }
4343
4344    pub fn parse_optional_procedure_parameters(
4345        &mut self,
4346    ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
4347        let mut params = vec![];
4348        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
4349            return Ok(Some(params));
4350        }
4351        loop {
4352            if let Token::Word(_) = self.peek_token().token {
4353                params.push(self.parse_procedure_param()?)
4354            }
4355            let comma = self.consume_token(&Token::Comma);
4356            if self.consume_token(&Token::RParen) {
4357                // allow a trailing comma, even though it's not in standard
4358                break;
4359            } else if !comma {
4360                return self.expected("',' or ')' after parameter definition", self.peek_token());
4361            }
4362        }
4363        Ok(Some(params))
4364    }
4365
4366    pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
4367        let mut columns = vec![];
4368        let mut constraints = vec![];
4369        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
4370            return Ok((columns, constraints));
4371        }
4372
4373        loop {
4374            if let Some(constraint) = self.parse_optional_table_constraint()? {
4375                constraints.push(constraint);
4376            } else if let Token::Word(_) = self.peek_token().token {
4377                columns.push(self.parse_column_def()?);
4378            } else {
4379                return self.expected("column name or constraint definition", self.peek_token());
4380            }
4381            let comma = self.consume_token(&Token::Comma);
4382            if self.consume_token(&Token::RParen) {
4383                // allow a trailing comma, even though it's not in standard
4384                break;
4385            } else if !comma {
4386                return self.expected("',' or ')' after column definition", self.peek_token());
4387            }
4388        }
4389
4390        Ok((columns, constraints))
4391    }
4392
4393    pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
4394        let name = self.parse_identifier(false)?;
4395        let data_type = self.parse_data_type()?;
4396        Ok(ProcedureParam { name, data_type })
4397    }
4398
4399    pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
4400        let name = self.parse_identifier(false)?;
4401        let data_type = if self.is_column_type_sqlite_unspecified() {
4402            DataType::Unspecified
4403        } else {
4404            self.parse_data_type()?
4405        };
4406        let mut collation = if self.parse_keyword(Keyword::COLLATE) {
4407            Some(self.parse_object_name(false)?)
4408        } else {
4409            None
4410        };
4411        let mut options = vec![];
4412        loop {
4413            if self.parse_keyword(Keyword::CONSTRAINT) {
4414                let name = Some(self.parse_identifier(false)?);
4415                if let Some(option) = self.parse_optional_column_option()? {
4416                    options.push(ColumnOptionDef { name, option });
4417                } else {
4418                    return self.expected(
4419                        "constraint details after CONSTRAINT <name>",
4420                        self.peek_token(),
4421                    );
4422                }
4423            } else if let Some(option) = self.parse_optional_column_option()? {
4424                options.push(ColumnOptionDef { name: None, option });
4425            } else if dialect_of!(self is MySqlDialect | GenericDialect)
4426                && self.parse_keyword(Keyword::COLLATE)
4427            {
4428                collation = Some(self.parse_object_name(false)?);
4429            } else {
4430                break;
4431            };
4432        }
4433        Ok(ColumnDef {
4434            name,
4435            data_type,
4436            collation,
4437            options,
4438        })
4439    }
4440
4441    fn is_column_type_sqlite_unspecified(&mut self) -> bool {
4442        if dialect_of!(self is SQLiteDialect) {
4443            match self.peek_token().token {
4444                Token::Word(word) => matches!(
4445                    word.keyword,
4446                    Keyword::CONSTRAINT
4447                        | Keyword::PRIMARY
4448                        | Keyword::NOT
4449                        | Keyword::UNIQUE
4450                        | Keyword::CHECK
4451                        | Keyword::DEFAULT
4452                        | Keyword::COLLATE
4453                        | Keyword::REFERENCES
4454                        | Keyword::GENERATED
4455                        | Keyword::AS
4456                ),
4457                _ => true, // e.g. comma immediately after column name
4458            }
4459        } else {
4460            false
4461        }
4462    }
4463
4464    pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
4465        if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
4466            Ok(Some(ColumnOption::CharacterSet(
4467                self.parse_object_name(false)?,
4468            )))
4469        } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
4470            Ok(Some(ColumnOption::NotNull))
4471        } else if self.parse_keywords(&[Keyword::COMMENT]) {
4472            let next_token = self.next_token();
4473            match next_token.token {
4474                Token::SingleQuotedString(value, ..) => Ok(Some(ColumnOption::Comment(value))),
4475                _ => self.expected("string", next_token),
4476            }
4477        } else if self.parse_keyword(Keyword::NULL) {
4478            Ok(Some(ColumnOption::Null))
4479        } else if self.parse_keyword(Keyword::DEFAULT) {
4480            Ok(Some(ColumnOption::Default(self.parse_expr()?)))
4481        } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
4482            let characteristics = self.parse_constraint_characteristics()?;
4483            Ok(Some(ColumnOption::Unique {
4484                is_primary: true,
4485                characteristics,
4486            }))
4487        } else if self.parse_keyword(Keyword::UNIQUE) {
4488            let characteristics = self.parse_constraint_characteristics()?;
4489            Ok(Some(ColumnOption::Unique {
4490                is_primary: false,
4491                characteristics,
4492            }))
4493        } else if self.parse_keyword(Keyword::REFERENCES) {
4494            let foreign_table = self.parse_object_name(false)?;
4495            // PostgreSQL allows omitting the column list and
4496            // uses the primary key column of the foreign table by default
4497            let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
4498            let mut on_delete = None;
4499            let mut on_update = None;
4500            loop {
4501                if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
4502                    on_delete = Some(self.parse_referential_action()?);
4503                } else if on_update.is_none()
4504                    && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
4505                {
4506                    on_update = Some(self.parse_referential_action()?);
4507                } else {
4508                    break;
4509                }
4510            }
4511            let characteristics = self.parse_constraint_characteristics()?;
4512
4513            Ok(Some(ColumnOption::ForeignKey {
4514                foreign_table,
4515                referred_columns,
4516                on_delete,
4517                on_update,
4518                characteristics,
4519            }))
4520        } else if self.parse_keyword(Keyword::CHECK) {
4521            self.expect_token(&Token::LParen)?;
4522            let expr = self.parse_expr()?;
4523            self.expect_token(&Token::RParen)?;
4524            Ok(Some(ColumnOption::Check(expr)))
4525        } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
4526            && dialect_of!(self is MySqlDialect | GenericDialect)
4527        {
4528            // Support AUTO_INCREMENT for MySQL
4529            Ok(Some(ColumnOption::DialectSpecific(vec![
4530                Token::make_keyword("AUTO_INCREMENT"),
4531            ])))
4532        } else if self.parse_keyword(Keyword::AUTOINCREMENT)
4533            && dialect_of!(self is SQLiteDialect |  GenericDialect)
4534        {
4535            // Support AUTOINCREMENT for SQLite
4536            Ok(Some(ColumnOption::DialectSpecific(vec![
4537                Token::make_keyword("AUTOINCREMENT"),
4538            ])))
4539        } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
4540            && dialect_of!(self is MySqlDialect | GenericDialect)
4541        {
4542            let expr = self.parse_expr()?;
4543            Ok(Some(ColumnOption::OnUpdate(expr)))
4544        } else if self.parse_keyword(Keyword::GENERATED) {
4545            self.parse_optional_column_option_generated()
4546        } else if dialect_of!(self is BigQueryDialect | GenericDialect)
4547            && self.parse_keyword(Keyword::OPTIONS)
4548        {
4549            self.prev_token();
4550            Ok(Some(ColumnOption::Options(
4551                self.parse_options(Keyword::OPTIONS)?,
4552            )))
4553        } else if self.parse_keyword(Keyword::AS)
4554            && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
4555        {
4556            self.parse_optional_column_option_as()
4557        } else {
4558            Ok(None)
4559        }
4560    }
4561    fn parse_optional_column_option_generated(
4562        &mut self,
4563    ) -> Result<Option<ColumnOption>, ParserError> {
4564        if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
4565            let mut sequence_options = vec![];
4566            if self.expect_token(&Token::LParen).is_ok() {
4567                sequence_options = self.parse_create_sequence_options()?;
4568                self.expect_token(&Token::RParen)?;
4569            }
4570            Ok(Some(ColumnOption::Generated {
4571                generated_as: GeneratedAs::Always,
4572                sequence_options: Some(sequence_options),
4573                generation_expr: None,
4574                generation_expr_mode: None,
4575                generated_keyword: true,
4576            }))
4577        } else if self.parse_keywords(&[
4578            Keyword::BY,
4579            Keyword::DEFAULT,
4580            Keyword::AS,
4581            Keyword::IDENTITY,
4582        ]) {
4583            let mut sequence_options = vec![];
4584            if self.expect_token(&Token::LParen).is_ok() {
4585                sequence_options = self.parse_create_sequence_options()?;
4586                self.expect_token(&Token::RParen)?;
4587            }
4588            Ok(Some(ColumnOption::Generated {
4589                generated_as: GeneratedAs::ByDefault,
4590                sequence_options: Some(sequence_options),
4591                generation_expr: None,
4592                generation_expr_mode: None,
4593                generated_keyword: true,
4594            }))
4595        } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
4596            if self.expect_token(&Token::LParen).is_ok() {
4597                let expr = self.parse_expr()?;
4598                self.expect_token(&Token::RParen)?;
4599                let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
4600                    Ok((
4601                        GeneratedAs::ExpStored,
4602                        Some(GeneratedExpressionMode::Stored),
4603                    ))
4604                } else if dialect_of!(self is PostgreSqlDialect) {
4605                    // Postgres' AS IDENTITY branches are above, this one needs STORED
4606                    self.expected("STORED", self.peek_token())
4607                } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
4608                    Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
4609                } else {
4610                    Ok((GeneratedAs::Always, None))
4611                }?;
4612
4613                Ok(Some(ColumnOption::Generated {
4614                    generated_as: gen_as,
4615                    sequence_options: None,
4616                    generation_expr: Some(expr),
4617                    generation_expr_mode: expr_mode,
4618                    generated_keyword: true,
4619                }))
4620            } else {
4621                Ok(None)
4622            }
4623        } else {
4624            Ok(None)
4625        }
4626    }
4627
4628    fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
4629        // Some DBs allow 'AS (expr)', shorthand for GENERATED ALWAYS AS
4630        self.expect_token(&Token::LParen)?;
4631        let expr = self.parse_expr()?;
4632        self.expect_token(&Token::RParen)?;
4633
4634        let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
4635            (
4636                GeneratedAs::ExpStored,
4637                Some(GeneratedExpressionMode::Stored),
4638            )
4639        } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
4640            (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
4641        } else {
4642            (GeneratedAs::Always, None)
4643        };
4644
4645        Ok(Some(ColumnOption::Generated {
4646            generated_as: gen_as,
4647            sequence_options: None,
4648            generation_expr: Some(expr),
4649            generation_expr_mode: expr_mode,
4650            generated_keyword: false,
4651        }))
4652    }
4653
4654    pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
4655        if self.parse_keyword(Keyword::RESTRICT) {
4656            Ok(ReferentialAction::Restrict)
4657        } else if self.parse_keyword(Keyword::CASCADE) {
4658            Ok(ReferentialAction::Cascade)
4659        } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
4660            Ok(ReferentialAction::SetNull)
4661        } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
4662            Ok(ReferentialAction::NoAction)
4663        } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
4664            Ok(ReferentialAction::SetDefault)
4665        } else {
4666            self.expected(
4667                "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
4668                self.peek_token(),
4669            )
4670        }
4671    }
4672
4673    pub fn parse_constraint_characteristics(
4674        &mut self,
4675    ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
4676        let mut cc = ConstraintCharacteristics {
4677            deferrable: None,
4678            initially: None,
4679            enforced: None,
4680        };
4681
4682        loop {
4683            if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
4684            {
4685                cc.deferrable = Some(false);
4686            } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
4687                cc.deferrable = Some(true);
4688            } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
4689                if self.parse_keyword(Keyword::DEFERRED) {
4690                    cc.initially = Some(DeferrableInitial::Deferred);
4691                } else if self.parse_keyword(Keyword::IMMEDIATE) {
4692                    cc.initially = Some(DeferrableInitial::Immediate);
4693                } else {
4694                    self.expected("one of DEFERRED or IMMEDIATE", self.peek_token())?;
4695                }
4696            } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
4697                cc.enforced = Some(true);
4698            } else if cc.enforced.is_none()
4699                && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
4700            {
4701                cc.enforced = Some(false);
4702            } else {
4703                break;
4704            }
4705        }
4706
4707        if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
4708            Ok(Some(cc))
4709        } else {
4710            Ok(None)
4711        }
4712    }
4713
4714    pub fn parse_optional_table_constraint(
4715        &mut self,
4716    ) -> Result<Option<TableConstraint>, ParserError> {
4717        let name = if self.parse_keyword(Keyword::CONSTRAINT) {
4718            Some(self.parse_identifier(false)?)
4719        } else {
4720            None
4721        };
4722
4723        let next_token = self.next_token();
4724        match next_token.token {
4725            Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
4726                let is_primary = w.keyword == Keyword::PRIMARY;
4727
4728                // parse optional [KEY]
4729                let _ = self.parse_keyword(Keyword::KEY);
4730
4731                // optional constraint name
4732                let name = self
4733                    .maybe_parse(|parser| parser.parse_identifier(false))
4734                    .or(name);
4735
4736                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4737                let characteristics = self.parse_constraint_characteristics()?;
4738                Ok(Some(TableConstraint::Unique {
4739                    name,
4740                    columns,
4741                    is_primary,
4742                    characteristics,
4743                }))
4744            }
4745            Token::Word(w) if w.keyword == Keyword::FOREIGN => {
4746                self.expect_keyword(Keyword::KEY)?;
4747                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4748                self.expect_keyword(Keyword::REFERENCES)?;
4749                let foreign_table = self.parse_object_name(false)?;
4750                let referred_columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4751                let mut on_delete = None;
4752                let mut on_update = None;
4753                loop {
4754                    if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
4755                        on_delete = Some(self.parse_referential_action()?);
4756                    } else if on_update.is_none()
4757                        && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
4758                    {
4759                        on_update = Some(self.parse_referential_action()?);
4760                    } else {
4761                        break;
4762                    }
4763                }
4764
4765                let characteristics = self.parse_constraint_characteristics()?;
4766
4767                Ok(Some(TableConstraint::ForeignKey {
4768                    name,
4769                    columns,
4770                    foreign_table,
4771                    referred_columns,
4772                    on_delete,
4773                    on_update,
4774                    characteristics,
4775                }))
4776            }
4777            Token::Word(w) if w.keyword == Keyword::CHECK => {
4778                self.expect_token(&Token::LParen)?;
4779                let expr = Box::new(self.parse_expr()?);
4780                self.expect_token(&Token::RParen)?;
4781                Ok(Some(TableConstraint::Check { name, expr }))
4782            }
4783            Token::Word(w)
4784                if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
4785                    && dialect_of!(self is GenericDialect | MySqlDialect) =>
4786            {
4787                let display_as_key = w.keyword == Keyword::KEY;
4788
4789                let name = match self.peek_token().token {
4790                    Token::Word(word) if word.keyword == Keyword::USING => None,
4791                    _ => self.maybe_parse(|parser| parser.parse_identifier(false)),
4792                };
4793
4794                let index_type = if self.parse_keyword(Keyword::USING) {
4795                    Some(self.parse_index_type()?)
4796                } else {
4797                    None
4798                };
4799                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4800
4801                Ok(Some(TableConstraint::Index {
4802                    display_as_key,
4803                    name,
4804                    index_type,
4805                    columns,
4806                }))
4807            }
4808            Token::Word(w)
4809                if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
4810                    && dialect_of!(self is GenericDialect | MySqlDialect) =>
4811            {
4812                if let Some(name) = name {
4813                    return self.expected(
4814                        "FULLTEXT or SPATIAL option without constraint name",
4815                        TokenWithLocation {
4816                            token: Token::make_keyword(&name.to_string()),
4817                            location: next_token.location,
4818                        },
4819                    );
4820                }
4821
4822                let fulltext = w.keyword == Keyword::FULLTEXT;
4823
4824                let index_type_display = if self.parse_keyword(Keyword::KEY) {
4825                    KeyOrIndexDisplay::Key
4826                } else if self.parse_keyword(Keyword::INDEX) {
4827                    KeyOrIndexDisplay::Index
4828                } else {
4829                    KeyOrIndexDisplay::None
4830                };
4831
4832                let opt_index_name = self.maybe_parse(|parser| parser.parse_identifier(false));
4833
4834                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4835
4836                Ok(Some(TableConstraint::FulltextOrSpatial {
4837                    fulltext,
4838                    index_type_display,
4839                    opt_index_name,
4840                    columns,
4841                }))
4842            }
4843            _ => {
4844                if name.is_some() {
4845                    self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
4846                } else {
4847                    self.prev_token();
4848                    Ok(None)
4849                }
4850            }
4851        }
4852    }
4853
4854    pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
4855        if self.parse_keyword(keyword) {
4856            self.expect_token(&Token::LParen)?;
4857            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
4858            self.expect_token(&Token::RParen)?;
4859            Ok(options)
4860        } else {
4861            Ok(vec![])
4862        }
4863    }
4864
4865    pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
4866        if self.parse_keyword(Keyword::BTREE) {
4867            Ok(IndexType::BTree)
4868        } else if self.parse_keyword(Keyword::HASH) {
4869            Ok(IndexType::Hash)
4870        } else {
4871            self.expected("index type {BTREE | HASH}", self.peek_token())
4872        }
4873    }
4874
4875    pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
4876        let name = self.parse_identifier(false)?;
4877        self.expect_token(&Token::Eq)?;
4878        let value = self.parse_expr()?;
4879        Ok(SqlOption { name, value })
4880    }
4881
4882    pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
4883        self.expect_token(&Token::LParen)?;
4884        let partitions = self.parse_comma_separated(Parser::parse_expr)?;
4885        self.expect_token(&Token::RParen)?;
4886        Ok(Partition { partitions })
4887    }
4888
4889    pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
4890        let operation = if self.parse_keyword(Keyword::ADD) {
4891            if let Some(constraint) = self.parse_optional_table_constraint()? {
4892                AlterTableOperation::AddConstraint(constraint)
4893            } else {
4894                let if_not_exists =
4895                    self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
4896                let mut new_partitions = vec![];
4897                loop {
4898                    if self.parse_keyword(Keyword::PARTITION) {
4899                        new_partitions.push(self.parse_partition()?);
4900                    } else {
4901                        break;
4902                    }
4903                }
4904                if !new_partitions.is_empty() {
4905                    AlterTableOperation::AddPartitions {
4906                        if_not_exists,
4907                        new_partitions,
4908                    }
4909                } else {
4910                    let column_keyword = self.parse_keyword(Keyword::COLUMN);
4911
4912                    let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
4913                    {
4914                        self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
4915                            || if_not_exists
4916                    } else {
4917                        false
4918                    };
4919
4920                    let column_def = self.parse_column_def()?;
4921                    AlterTableOperation::AddColumn {
4922                        column_keyword,
4923                        if_not_exists,
4924                        column_def,
4925                    }
4926                }
4927            }
4928        } else if self.parse_keyword(Keyword::RENAME) {
4929            if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
4930                let old_name = self.parse_identifier(false)?;
4931                self.expect_keyword(Keyword::TO)?;
4932                let new_name = self.parse_identifier(false)?;
4933                AlterTableOperation::RenameConstraint { old_name, new_name }
4934            } else if self.parse_keyword(Keyword::TO) {
4935                let table_name = self.parse_object_name(false)?;
4936                AlterTableOperation::RenameTable { table_name }
4937            } else {
4938                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
4939                let old_column_name = self.parse_identifier(false)?;
4940                self.expect_keyword(Keyword::TO)?;
4941                let new_column_name = self.parse_identifier(false)?;
4942                AlterTableOperation::RenameColumn {
4943                    old_column_name,
4944                    new_column_name,
4945                }
4946            }
4947        } else if self.parse_keyword(Keyword::DISABLE) {
4948            if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
4949                AlterTableOperation::DisableRowLevelSecurity {}
4950            } else if self.parse_keyword(Keyword::RULE) {
4951                let name = self.parse_identifier(false)?;
4952                AlterTableOperation::DisableRule { name }
4953            } else if self.parse_keyword(Keyword::TRIGGER) {
4954                let name = self.parse_identifier(false)?;
4955                AlterTableOperation::DisableTrigger { name }
4956            } else {
4957                return self.expected(
4958                    "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
4959                    self.peek_token(),
4960                );
4961            }
4962        } else if self.parse_keyword(Keyword::ENABLE) {
4963            if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
4964                let name = self.parse_identifier(false)?;
4965                AlterTableOperation::EnableAlwaysRule { name }
4966            } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
4967                let name = self.parse_identifier(false)?;
4968                AlterTableOperation::EnableAlwaysTrigger { name }
4969            } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
4970                AlterTableOperation::EnableRowLevelSecurity {}
4971            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
4972                let name = self.parse_identifier(false)?;
4973                AlterTableOperation::EnableReplicaRule { name }
4974            } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
4975                let name = self.parse_identifier(false)?;
4976                AlterTableOperation::EnableReplicaTrigger { name }
4977            } else if self.parse_keyword(Keyword::RULE) {
4978                let name = self.parse_identifier(false)?;
4979                AlterTableOperation::EnableRule { name }
4980            } else if self.parse_keyword(Keyword::TRIGGER) {
4981                let name = self.parse_identifier(false)?;
4982                AlterTableOperation::EnableTrigger { name }
4983            } else {
4984                return self.expected(
4985                    "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
4986                    self.peek_token(),
4987                );
4988            }
4989        } else if self.parse_keyword(Keyword::DROP) {
4990            if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
4991                self.expect_token(&Token::LParen)?;
4992                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
4993                self.expect_token(&Token::RParen)?;
4994                AlterTableOperation::DropPartitions {
4995                    partitions,
4996                    if_exists: true,
4997                }
4998            } else if self.parse_keyword(Keyword::PARTITION) {
4999                self.expect_token(&Token::LParen)?;
5000                let partitions = self.parse_comma_separated(Parser::parse_expr)?;
5001                self.expect_token(&Token::RParen)?;
5002                AlterTableOperation::DropPartitions {
5003                    partitions,
5004                    if_exists: false,
5005                }
5006            } else if self.parse_keyword(Keyword::CONSTRAINT) {
5007                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5008                let name = self.parse_identifier(false)?;
5009                let cascade = self.parse_keyword(Keyword::CASCADE);
5010                AlterTableOperation::DropConstraint {
5011                    if_exists,
5012                    name,
5013                    cascade,
5014                }
5015            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
5016                && dialect_of!(self is MySqlDialect | GenericDialect)
5017            {
5018                AlterTableOperation::DropPrimaryKey
5019            } else {
5020                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
5021                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5022                let column_name = self.parse_identifier(false)?;
5023                let cascade = self.parse_keyword(Keyword::CASCADE);
5024                AlterTableOperation::DropColumn {
5025                    column_name,
5026                    if_exists,
5027                    cascade,
5028                }
5029            }
5030        } else if self.parse_keyword(Keyword::PARTITION) {
5031            self.expect_token(&Token::LParen)?;
5032            let before = self.parse_comma_separated(Parser::parse_expr)?;
5033            self.expect_token(&Token::RParen)?;
5034            self.expect_keyword(Keyword::RENAME)?;
5035            self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
5036            self.expect_token(&Token::LParen)?;
5037            let renames = self.parse_comma_separated(Parser::parse_expr)?;
5038            self.expect_token(&Token::RParen)?;
5039            AlterTableOperation::RenamePartitions {
5040                old_partitions: before,
5041                new_partitions: renames,
5042            }
5043        } else if self.parse_keyword(Keyword::CHANGE) {
5044            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
5045            let old_name = self.parse_identifier(false)?;
5046            let new_name = self.parse_identifier(false)?;
5047            let data_type = self.parse_data_type()?;
5048            let mut options = vec![];
5049            while let Some(option) = self.parse_optional_column_option()? {
5050                options.push(option);
5051            }
5052
5053            AlterTableOperation::ChangeColumn {
5054                old_name,
5055                new_name,
5056                data_type,
5057                options,
5058            }
5059        } else if self.parse_keyword(Keyword::ALTER) {
5060            let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
5061            let column_name = self.parse_identifier(false)?;
5062            let is_postgresql = dialect_of!(self is PostgreSqlDialect);
5063
5064            let op: AlterColumnOperation = if self.parse_keywords(&[
5065                Keyword::SET,
5066                Keyword::NOT,
5067                Keyword::NULL,
5068            ]) {
5069                AlterColumnOperation::SetNotNull {}
5070            } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
5071                AlterColumnOperation::DropNotNull {}
5072            } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
5073                AlterColumnOperation::SetDefault {
5074                    value: self.parse_expr()?,
5075                }
5076            } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
5077                AlterColumnOperation::DropDefault {}
5078            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
5079                || (is_postgresql && self.parse_keyword(Keyword::TYPE))
5080            {
5081                let data_type = self.parse_data_type()?;
5082                let using = if is_postgresql && self.parse_keyword(Keyword::USING) {
5083                    Some(self.parse_expr()?)
5084                } else {
5085                    None
5086                };
5087                AlterColumnOperation::SetDataType { data_type, using }
5088            } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
5089                let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
5090                    Some(GeneratedAs::Always)
5091                } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
5092                    Some(GeneratedAs::ByDefault)
5093                } else {
5094                    None
5095                };
5096
5097                self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
5098
5099                let mut sequence_options: Option<Vec<SequenceOptions>> = None;
5100
5101                if self.peek_token().token == Token::LParen {
5102                    self.expect_token(&Token::LParen)?;
5103                    sequence_options = Some(self.parse_create_sequence_options()?);
5104                    self.expect_token(&Token::RParen)?;
5105                }
5106
5107                AlterColumnOperation::AddGenerated {
5108                    generated_as,
5109                    sequence_options,
5110                }
5111            } else {
5112                let message = if is_postgresql {
5113                    "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
5114                } else {
5115                    "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
5116                };
5117
5118                return self.expected(message, self.peek_token());
5119            };
5120            AlterTableOperation::AlterColumn { column_name, op }
5121        } else if self.parse_keyword(Keyword::SWAP) {
5122            self.expect_keyword(Keyword::WITH)?;
5123            let table_name = self.parse_object_name(false)?;
5124            AlterTableOperation::SwapWith { table_name }
5125        } else {
5126            return self.expected(
5127                "ADD, RENAME, PARTITION, SWAP or DROP after ALTER TABLE",
5128                self.peek_token(),
5129            );
5130        };
5131        Ok(operation)
5132    }
5133
5134    pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
5135        let object_type = self.expect_one_of_keywords(&[
5136            Keyword::VIEW,
5137            Keyword::TABLE,
5138            Keyword::INDEX,
5139            Keyword::ROLE,
5140        ])?;
5141        match object_type {
5142            Keyword::VIEW => self.parse_alter_view(),
5143            Keyword::TABLE => {
5144                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5145                let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
5146                let table_name = self.parse_object_name(false)?;
5147                let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
5148                Ok(Statement::AlterTable {
5149                    name: table_name,
5150                    if_exists,
5151                    only,
5152                    operations,
5153                })
5154            }
5155            Keyword::INDEX => {
5156                let index_name = self.parse_object_name(false)?;
5157                let operation = if self.parse_keyword(Keyword::RENAME) {
5158                    if self.parse_keyword(Keyword::TO) {
5159                        let index_name = self.parse_object_name(false)?;
5160                        AlterIndexOperation::RenameIndex { index_name }
5161                    } else {
5162                        return self.expected("TO after RENAME", self.peek_token());
5163                    }
5164                } else {
5165                    return self.expected("RENAME after ALTER INDEX", self.peek_token());
5166                };
5167
5168                Ok(Statement::AlterIndex {
5169                    name: index_name,
5170                    operation,
5171                })
5172            }
5173            Keyword::ROLE => self.parse_alter_role(),
5174            // unreachable because expect_one_of_keywords used above
5175            _ => unreachable!(),
5176        }
5177    }
5178
5179    pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
5180        let name = self.parse_object_name(false)?;
5181        let columns = self.parse_parenthesized_column_list(Optional, false)?;
5182
5183        let with_options = self.parse_options(Keyword::WITH)?;
5184
5185        self.expect_keyword(Keyword::AS)?;
5186        let query = Box::new(self.parse_query()?);
5187
5188        Ok(Statement::AlterView {
5189            name,
5190            columns,
5191            query,
5192            with_options,
5193        })
5194    }
5195
5196    /// Parse a `CALL procedure_name(arg1, arg2, ...)`
5197    /// or `CALL procedure_name` statement
5198    pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
5199        let object_name = self.parse_object_name(false)?;
5200        if self.peek_token().token == Token::LParen {
5201            match self.parse_function(object_name)? {
5202                Expr::Function(f) => Ok(Statement::Call(f)),
5203                other => parser_err!(
5204                    format!("Expected a simple procedure call but found: {other}"),
5205                    self.peek_token().location
5206                ),
5207            }
5208        } else {
5209            Ok(Statement::Call(Function {
5210                name: object_name,
5211                args: vec![],
5212                over: None,
5213                distinct: false,
5214                filter: None,
5215                null_treatment: None,
5216                special: true,
5217                order_by: vec![],
5218            }))
5219        }
5220    }
5221
5222    /// Parse a copy statement
5223    pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
5224        let source;
5225        if self.consume_token(&Token::LParen) {
5226            source = CopySource::Query(Box::new(self.parse_query()?));
5227            self.expect_token(&Token::RParen)?;
5228        } else {
5229            let table_name = self.parse_object_name(false)?;
5230            let columns = self.parse_parenthesized_column_list(Optional, false)?;
5231            source = CopySource::Table {
5232                table_name,
5233                columns,
5234            };
5235        }
5236        let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
5237            Some(Keyword::FROM) => false,
5238            Some(Keyword::TO) => true,
5239            _ => self.expected("FROM or TO", self.peek_token())?,
5240        };
5241        if !to {
5242            // Use a separate if statement to prevent Rust compiler from complaining about
5243            // "if statement in this position is unstable: https://github.com/rust-lang/rust/issues/53667"
5244            if let CopySource::Query(_) = source {
5245                return Err(ParserError::ParserError(
5246                    "COPY ... FROM does not support query as a source".to_string(),
5247                ));
5248            }
5249        }
5250        let target = if self.parse_keyword(Keyword::STDIN) {
5251            CopyTarget::Stdin
5252        } else if self.parse_keyword(Keyword::STDOUT) {
5253            CopyTarget::Stdout
5254        } else if self.parse_keyword(Keyword::PROGRAM) {
5255            CopyTarget::Program {
5256                command: self.parse_literal_string()?,
5257            }
5258        } else {
5259            CopyTarget::File {
5260                filename: self.parse_literal_string()?,
5261            }
5262        };
5263        let _ = self.parse_keyword(Keyword::WITH); // [ WITH ]
5264        let mut options = vec![];
5265        if self.consume_token(&Token::LParen) {
5266            options = self.parse_comma_separated(Parser::parse_copy_option)?;
5267            self.expect_token(&Token::RParen)?;
5268        }
5269        let mut legacy_options = vec![];
5270        while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option()) {
5271            legacy_options.push(opt);
5272        }
5273        let values = if let CopyTarget::Stdin = target {
5274            self.expect_token(&Token::SemiColon)?;
5275            self.parse_tsv()
5276        } else {
5277            vec![]
5278        };
5279        Ok(Statement::Copy {
5280            source,
5281            to,
5282            target,
5283            options,
5284            legacy_options,
5285            values,
5286        })
5287    }
5288
5289    pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
5290        let cursor = if self.parse_keyword(Keyword::ALL) {
5291            CloseCursor::All
5292        } else {
5293            let name = self.parse_identifier(false)?;
5294
5295            CloseCursor::Specific { name }
5296        };
5297
5298        Ok(Statement::Close { cursor })
5299    }
5300
5301    fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
5302        let ret = match self.parse_one_of_keywords(&[
5303            Keyword::FORMAT,
5304            Keyword::FREEZE,
5305            Keyword::DELIMITER,
5306            Keyword::NULL,
5307            Keyword::HEADER,
5308            Keyword::QUOTE,
5309            Keyword::ESCAPE,
5310            Keyword::FORCE_QUOTE,
5311            Keyword::FORCE_NOT_NULL,
5312            Keyword::FORCE_NULL,
5313            Keyword::ENCODING,
5314        ]) {
5315            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier(false)?),
5316            Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
5317                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
5318                Some(Keyword::FALSE)
5319            )),
5320            Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
5321            Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
5322            Some(Keyword::HEADER) => CopyOption::Header(!matches!(
5323                self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
5324                Some(Keyword::FALSE)
5325            )),
5326            Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
5327            Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
5328            Some(Keyword::FORCE_QUOTE) => {
5329                CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
5330            }
5331            Some(Keyword::FORCE_NOT_NULL) => {
5332                CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
5333            }
5334            Some(Keyword::FORCE_NULL) => {
5335                CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
5336            }
5337            Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
5338            _ => self.expected("option", self.peek_token())?,
5339        };
5340        Ok(ret)
5341    }
5342
5343    fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
5344        let ret = match self.parse_one_of_keywords(&[
5345            Keyword::BINARY,
5346            Keyword::DELIMITER,
5347            Keyword::NULL,
5348            Keyword::CSV,
5349        ]) {
5350            Some(Keyword::BINARY) => CopyLegacyOption::Binary,
5351            Some(Keyword::DELIMITER) => {
5352                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
5353                CopyLegacyOption::Delimiter(self.parse_literal_char()?)
5354            }
5355            Some(Keyword::NULL) => {
5356                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
5357                CopyLegacyOption::Null(self.parse_literal_string()?)
5358            }
5359            Some(Keyword::CSV) => CopyLegacyOption::Csv({
5360                let mut opts = vec![];
5361                while let Some(opt) =
5362                    self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())
5363                {
5364                    opts.push(opt);
5365                }
5366                opts
5367            }),
5368            _ => self.expected("option", self.peek_token())?,
5369        };
5370        Ok(ret)
5371    }
5372
5373    fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
5374        let ret = match self.parse_one_of_keywords(&[
5375            Keyword::HEADER,
5376            Keyword::QUOTE,
5377            Keyword::ESCAPE,
5378            Keyword::FORCE,
5379        ]) {
5380            Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
5381            Some(Keyword::QUOTE) => {
5382                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
5383                CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
5384            }
5385            Some(Keyword::ESCAPE) => {
5386                let _ = self.parse_keyword(Keyword::AS); // [ AS ]
5387                CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
5388            }
5389            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
5390                CopyLegacyCsvOption::ForceNotNull(
5391                    self.parse_comma_separated(|p| p.parse_identifier(false))?,
5392                )
5393            }
5394            Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
5395                CopyLegacyCsvOption::ForceQuote(
5396                    self.parse_comma_separated(|p| p.parse_identifier(false))?,
5397                )
5398            }
5399            _ => self.expected("csv option", self.peek_token())?,
5400        };
5401        Ok(ret)
5402    }
5403
5404    fn parse_literal_char(&mut self) -> Result<char, ParserError> {
5405        let s = self.parse_literal_string()?;
5406        if s.len() != 1 {
5407            let loc = self
5408                .tokens
5409                .get(self.index - 1)
5410                .map_or(Location { line: 0, column: 0 }, |t| t.location);
5411            return parser_err!(format!("Expect a char, found {s:?}"), loc);
5412        }
5413        Ok(s.chars().next().unwrap())
5414    }
5415
5416    /// Parse a tab separated values in
5417    /// COPY payload
5418    pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
5419        self.parse_tab_value()
5420    }
5421
5422    pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
5423        let mut values = vec![];
5424        let mut content = String::from("");
5425        while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
5426            match t {
5427                Token::Whitespace(Whitespace::Tab) => {
5428                    values.push(Some(content.to_string()));
5429                    content.clear();
5430                }
5431                Token::Whitespace(Whitespace::Newline) => {
5432                    values.push(Some(content.to_string()));
5433                    content.clear();
5434                }
5435                Token::Backslash => {
5436                    if self.consume_token(&Token::Period) {
5437                        return values;
5438                    }
5439                    if let Token::Word(w) = self.next_token().token {
5440                        if w.value == "N" {
5441                            values.push(None);
5442                        }
5443                    }
5444                }
5445                _ => {
5446                    content.push_str(&t.to_string());
5447                }
5448            }
5449        }
5450        values
5451    }
5452
5453    /// Parse a literal value (numbers, strings, date/time, booleans)
5454    pub fn parse_value(&mut self) -> Result<Value, ParserError> {
5455        let next_token = self.next_token();
5456        let location = next_token.location;
5457        match next_token.token {
5458            Token::Word(w) => match w.keyword {
5459                Keyword::TRUE => Ok(Value::Boolean(true)),
5460                Keyword::FALSE => Ok(Value::Boolean(false)),
5461                Keyword::NULL => Ok(Value::Null),
5462                Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
5463                    Some('"') => Ok(Value::DoubleQuotedString(w.value)),
5464                    Some('\'') => Ok(Value::SingleQuotedString(w.value)),
5465                    _ => self.expected(
5466                        "A value?",
5467                        TokenWithLocation {
5468                            token: Token::Word(w),
5469                            location,
5470                        },
5471                    )?,
5472                },
5473                // Case when Snowflake Semi-structured data like key:value
5474                Keyword::NoKeyword
5475                | Keyword::LOCATION
5476                | Keyword::TYPE
5477                | Keyword::DATE
5478                | Keyword::START
5479                | Keyword::END
5480                    if dialect_of!(self is SnowflakeDialect | GenericDialect) =>
5481                {
5482                    Ok(Value::UnQuotedString(w.value))
5483                }
5484                _ => self.expected(
5485                    "a concrete value",
5486                    TokenWithLocation {
5487                        token: Token::Word(w),
5488                        location,
5489                    },
5490                ),
5491            },
5492            // The call to n.parse() returns a bigdecimal when the
5493            // bigdecimal feature is enabled, and is otherwise a no-op
5494            // (i.e., it returns the input string).
5495            Token::Number(ref n, l) => match n.parse() {
5496                Ok(n) => Ok(Value::Number(n, l)),
5497                Err(e) => parser_err!(format!("Could not parse '{n}' as number: {e}"), location),
5498            },
5499            Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
5500            Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
5501            Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone())),
5502            Token::SingleQuotedByteStringLiteral(ref s) => {
5503                Ok(Value::SingleQuotedByteStringLiteral(s.clone()))
5504            }
5505            Token::DoubleQuotedByteStringLiteral(ref s) => {
5506                Ok(Value::DoubleQuotedByteStringLiteral(s.clone()))
5507            }
5508            Token::RawStringLiteral(ref s) => Ok(Value::RawStringLiteral(s.clone())),
5509            Token::NationalStringLiteral(ref s) => Ok(Value::NationalStringLiteral(s.to_string())),
5510            Token::EscapedStringLiteral(ref s) => Ok(Value::EscapedStringLiteral(s.to_string())),
5511            Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
5512            Token::Placeholder(ref s) => Ok(Value::Placeholder(s.to_string())),
5513            tok @ Token::Colon | tok @ Token::AtSign => {
5514                // Not calling self.parse_identifier(false)? because only in placeholder we want to check numbers as idfentifies
5515                // This because snowflake allows numbers as placeholders
5516                let next_token = self.next_token();
5517                let ident = match next_token.token {
5518                    Token::Word(w) => Ok(w.to_ident()),
5519                    Token::Number(w, false) => Ok(Ident::new(w)),
5520                    _ => self.expected("placeholder", next_token),
5521                }?;
5522                let placeholder = tok.to_string() + &ident.value;
5523                Ok(Value::Placeholder(placeholder))
5524            }
5525            unexpected => self.expected(
5526                "a value",
5527                TokenWithLocation {
5528                    token: unexpected,
5529                    location,
5530                },
5531            ),
5532        }
5533    }
5534
5535    pub fn parse_number_value(&mut self) -> Result<Value, ParserError> {
5536        match self.parse_value()? {
5537            v @ Value::Number(_, _) => Ok(v),
5538            v @ Value::Placeholder(_) => Ok(v),
5539            _ => {
5540                self.prev_token();
5541                self.expected("literal number", self.peek_token())
5542            }
5543        }
5544    }
5545
5546    fn parse_introduced_string_value(&mut self) -> Result<Value, ParserError> {
5547        let next_token = self.next_token();
5548        let location = next_token.location;
5549        match next_token.token {
5550            Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
5551            Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
5552            Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
5553            unexpected => self.expected(
5554                "a string value",
5555                TokenWithLocation {
5556                    token: unexpected,
5557                    location,
5558                },
5559            ),
5560        }
5561    }
5562
5563    /// Parse an unsigned literal integer/long
5564    pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
5565        let next_token = self.next_token();
5566        match next_token.token {
5567            Token::Number(s, _) => s.parse::<u64>().map_err(|e| {
5568                ParserError::ParserError(format!("Could not parse '{s}' as u64: {e}"))
5569            }),
5570            _ => self.expected("literal int", next_token),
5571        }
5572    }
5573
5574    pub fn parse_function_definition(&mut self) -> Result<FunctionDefinition, ParserError> {
5575        let peek_token = self.peek_token();
5576        match peek_token.token {
5577            Token::DollarQuotedString(value) if dialect_of!(self is PostgreSqlDialect) => {
5578                self.next_token();
5579                Ok(FunctionDefinition::DoubleDollarDef(value.value))
5580            }
5581            _ => Ok(FunctionDefinition::SingleQuotedDef(
5582                self.parse_literal_string()?,
5583            )),
5584        }
5585    }
5586    /// Parse a literal string
5587    pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
5588        let next_token = self.next_token();
5589        match next_token.token {
5590            Token::Word(Word {
5591                value,
5592                keyword: Keyword::NoKeyword,
5593                ..
5594            }) => Ok(value),
5595            Token::SingleQuotedString(s) => Ok(s),
5596            Token::DoubleQuotedString(s) => Ok(s),
5597            Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
5598                Ok(s)
5599            }
5600            _ => self.expected("literal string", next_token),
5601        }
5602    }
5603
5604    /// Parse a map key string
5605    pub fn parse_map_key(&mut self) -> Result<Expr, ParserError> {
5606        let next_token = self.next_token();
5607        match next_token.token {
5608            // handle bigquery offset subscript operator which overlaps with OFFSET operator
5609            Token::Word(Word { value, keyword, .. })
5610                if (dialect_of!(self is BigQueryDialect) && keyword == Keyword::OFFSET) =>
5611            {
5612                self.parse_function(ObjectName(vec![Ident::new(value)]))
5613            }
5614            Token::Word(Word { value, keyword, .. }) if (keyword == Keyword::NoKeyword) => {
5615                if self.peek_token() == Token::LParen {
5616                    return self.parse_function(ObjectName(vec![Ident::new(value)]));
5617                }
5618                Ok(Expr::Value(Value::SingleQuotedString(value)))
5619            }
5620            Token::SingleQuotedString(s) => Ok(Expr::Value(Value::SingleQuotedString(s))),
5621            #[cfg(not(feature = "bigdecimal"))]
5622            Token::Number(s, _) => Ok(Expr::Value(Value::Number(s, false))),
5623            #[cfg(feature = "bigdecimal")]
5624            Token::Number(s, _) => Ok(Expr::Value(Value::Number(s.parse().unwrap(), false))),
5625            _ => self.expected("literal string, number or function", next_token),
5626        }
5627    }
5628
5629    /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
5630    pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
5631        let (ty, trailing_bracket) = self.parse_data_type_helper()?;
5632        if trailing_bracket.0 {
5633            return parser_err!(
5634                format!("unmatched > after parsing data type {ty}"),
5635                self.peek_token()
5636            );
5637        }
5638
5639        Ok(ty)
5640    }
5641
5642    fn parse_data_type_helper(
5643        &mut self,
5644    ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
5645        let next_token = self.next_token();
5646        let mut trailing_bracket = false.into();
5647        let mut data = match next_token.token {
5648            Token::Word(w) => match w.keyword {
5649                Keyword::BOOLEAN => Ok(DataType::Boolean),
5650                Keyword::BOOL => Ok(DataType::Bool),
5651                Keyword::FLOAT => Ok(DataType::Float(self.parse_optional_precision()?)),
5652                Keyword::REAL => Ok(DataType::Real),
5653                Keyword::FLOAT4 => Ok(DataType::Float4),
5654                Keyword::FLOAT64 => Ok(DataType::Float64),
5655                Keyword::FLOAT8 => Ok(DataType::Float8),
5656                Keyword::DOUBLE => {
5657                    if self.parse_keyword(Keyword::PRECISION) {
5658                        Ok(DataType::DoublePrecision)
5659                    } else {
5660                        Ok(DataType::Double)
5661                    }
5662                }
5663                Keyword::TINYINT => {
5664                    let optional_precision = self.parse_optional_precision();
5665                    if self.parse_keyword(Keyword::UNSIGNED) {
5666                        Ok(DataType::UnsignedTinyInt(optional_precision?))
5667                    } else {
5668                        Ok(DataType::TinyInt(optional_precision?))
5669                    }
5670                }
5671                Keyword::INT2 => {
5672                    let optional_precision = self.parse_optional_precision();
5673                    if self.parse_keyword(Keyword::UNSIGNED) {
5674                        Ok(DataType::UnsignedInt2(optional_precision?))
5675                    } else {
5676                        Ok(DataType::Int2(optional_precision?))
5677                    }
5678                }
5679                Keyword::SMALLINT => {
5680                    let optional_precision = self.parse_optional_precision();
5681                    if self.parse_keyword(Keyword::UNSIGNED) {
5682                        Ok(DataType::UnsignedSmallInt(optional_precision?))
5683                    } else {
5684                        Ok(DataType::SmallInt(optional_precision?))
5685                    }
5686                }
5687                Keyword::MEDIUMINT => {
5688                    let optional_precision = self.parse_optional_precision();
5689                    if self.parse_keyword(Keyword::UNSIGNED) {
5690                        Ok(DataType::UnsignedMediumInt(optional_precision?))
5691                    } else {
5692                        Ok(DataType::MediumInt(optional_precision?))
5693                    }
5694                }
5695                Keyword::INT => {
5696                    let optional_precision = self.parse_optional_precision();
5697                    if self.parse_keyword(Keyword::UNSIGNED) {
5698                        Ok(DataType::UnsignedInt(optional_precision?))
5699                    } else {
5700                        Ok(DataType::Int(optional_precision?))
5701                    }
5702                }
5703                Keyword::INT4 => {
5704                    let optional_precision = self.parse_optional_precision();
5705                    if self.parse_keyword(Keyword::UNSIGNED) {
5706                        Ok(DataType::UnsignedInt4(optional_precision?))
5707                    } else {
5708                        Ok(DataType::Int4(optional_precision?))
5709                    }
5710                }
5711                Keyword::INT64 => Ok(DataType::Int64),
5712                Keyword::INTEGER => {
5713                    let optional_precision = self.parse_optional_precision();
5714                    if self.parse_keyword(Keyword::UNSIGNED) {
5715                        Ok(DataType::UnsignedInteger(optional_precision?))
5716                    } else {
5717                        Ok(DataType::Integer(optional_precision?))
5718                    }
5719                }
5720                Keyword::BIGINT => {
5721                    let optional_precision = self.parse_optional_precision();
5722                    if self.parse_keyword(Keyword::UNSIGNED) {
5723                        Ok(DataType::UnsignedBigInt(optional_precision?))
5724                    } else {
5725                        Ok(DataType::BigInt(optional_precision?))
5726                    }
5727                }
5728                Keyword::INT8 => {
5729                    let optional_precision = self.parse_optional_precision();
5730                    if self.parse_keyword(Keyword::UNSIGNED) {
5731                        Ok(DataType::UnsignedInt8(optional_precision?))
5732                    } else {
5733                        Ok(DataType::Int8(optional_precision?))
5734                    }
5735                }
5736                Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
5737                Keyword::NVARCHAR => Ok(DataType::Nvarchar(self.parse_optional_precision()?)),
5738                Keyword::CHARACTER => {
5739                    if self.parse_keyword(Keyword::VARYING) {
5740                        Ok(DataType::CharacterVarying(
5741                            self.parse_optional_character_length()?,
5742                        ))
5743                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
5744                        Ok(DataType::CharacterLargeObject(
5745                            self.parse_optional_precision()?,
5746                        ))
5747                    } else {
5748                        Ok(DataType::Character(self.parse_optional_character_length()?))
5749                    }
5750                }
5751                Keyword::CHAR => {
5752                    if self.parse_keyword(Keyword::VARYING) {
5753                        Ok(DataType::CharVarying(
5754                            self.parse_optional_character_length()?,
5755                        ))
5756                    } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
5757                        Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
5758                    } else {
5759                        Ok(DataType::Char(self.parse_optional_character_length()?))
5760                    }
5761                }
5762                Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
5763                Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
5764                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_precision()?)),
5765                Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
5766                Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
5767                Keyword::UUID => Ok(DataType::Uuid),
5768                Keyword::DATE => Ok(DataType::Date),
5769                Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
5770                Keyword::TIMESTAMP => {
5771                    let precision = self.parse_optional_precision()?;
5772                    let tz = if self.parse_keyword(Keyword::WITH) {
5773                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5774                        TimezoneInfo::WithTimeZone
5775                    } else if self.parse_keyword(Keyword::WITHOUT) {
5776                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5777                        TimezoneInfo::WithoutTimeZone
5778                    } else {
5779                        TimezoneInfo::None
5780                    };
5781                    Ok(DataType::Timestamp(precision, tz))
5782                }
5783                Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
5784                    self.parse_optional_precision()?,
5785                    TimezoneInfo::Tz,
5786                )),
5787                Keyword::TIME => {
5788                    let precision = self.parse_optional_precision()?;
5789                    let tz = if self.parse_keyword(Keyword::WITH) {
5790                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5791                        TimezoneInfo::WithTimeZone
5792                    } else if self.parse_keyword(Keyword::WITHOUT) {
5793                        self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5794                        TimezoneInfo::WithoutTimeZone
5795                    } else {
5796                        TimezoneInfo::None
5797                    };
5798                    Ok(DataType::Time(precision, tz))
5799                }
5800                Keyword::TIMETZ => Ok(DataType::Time(
5801                    self.parse_optional_precision()?,
5802                    TimezoneInfo::Tz,
5803                )),
5804                // Interval types can be followed by a complicated interval
5805                // qualifier that we don't currently support. See
5806                // parse_interval for a taste.
5807                Keyword::INTERVAL => Ok(DataType::Interval),
5808                Keyword::JSON => Ok(DataType::JSON),
5809                Keyword::JSONB => Ok(DataType::JSONB),
5810                Keyword::REGCLASS => Ok(DataType::Regclass),
5811                Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
5812                Keyword::TEXT => Ok(DataType::Text),
5813                Keyword::BYTEA => Ok(DataType::Bytea),
5814                Keyword::NUMERIC => Ok(DataType::Numeric(
5815                    self.parse_exact_number_optional_precision_scale()?,
5816                )),
5817                Keyword::DECIMAL => Ok(DataType::Decimal(
5818                    self.parse_exact_number_optional_precision_scale()?,
5819                )),
5820                Keyword::DEC => Ok(DataType::Dec(
5821                    self.parse_exact_number_optional_precision_scale()?,
5822                )),
5823                Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
5824                    self.parse_exact_number_optional_precision_scale()?,
5825                )),
5826                Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
5827                    self.parse_exact_number_optional_precision_scale()?,
5828                )),
5829                Keyword::ENUM => Ok(DataType::Enum(self.parse_string_values()?)),
5830                Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
5831                Keyword::ARRAY => {
5832                    if dialect_of!(self is SnowflakeDialect) {
5833                        Ok(DataType::Array(ArrayElemTypeDef::None))
5834                    } else {
5835                        self.expect_token(&Token::Lt)?;
5836                        let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
5837                        trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
5838                        Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
5839                            inside_type,
5840                        ))))
5841                    }
5842                }
5843                Keyword::STRUCT if dialect_of!(self is BigQueryDialect) => {
5844                    self.prev_token();
5845                    let (field_defs, _trailing_bracket) =
5846                        self.parse_struct_type_def(Self::parse_big_query_struct_field_def)?;
5847                    trailing_bracket = _trailing_bracket;
5848                    Ok(DataType::Struct(field_defs))
5849                }
5850                _ => {
5851                    self.prev_token();
5852                    let type_name = self.parse_object_name(false)?;
5853                    if let Some(modifiers) = self.parse_optional_type_modifiers()? {
5854                        Ok(DataType::Custom(type_name, modifiers))
5855                    } else {
5856                        Ok(DataType::Custom(type_name, vec![]))
5857                    }
5858                }
5859            },
5860            _ => self.expected("a data type name", next_token),
5861        }?;
5862
5863        // Parse array data types. Note: this is postgresql-specific and different from
5864        // Keyword::ARRAY syntax from above
5865        while self.consume_token(&Token::LBracket) {
5866            self.expect_token(&Token::RBracket)?;
5867            data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data)))
5868        }
5869        Ok((data, trailing_bracket))
5870    }
5871
5872    pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
5873        self.expect_token(&Token::LParen)?;
5874        let mut values = Vec::new();
5875        loop {
5876            let next_token = self.next_token();
5877            match next_token.token {
5878                Token::SingleQuotedString(value) => values.push(value),
5879                _ => self.expected("a string", next_token)?,
5880            }
5881            let next_token = self.next_token();
5882            match next_token.token {
5883                Token::Comma => (),
5884                Token::RParen => break,
5885                _ => self.expected(", or }", next_token)?,
5886            }
5887        }
5888        Ok(values)
5889    }
5890
5891    /// Strictly parse `identifier AS identifier`
5892    pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
5893        let ident = self.parse_identifier(false)?;
5894        self.expect_keyword(Keyword::AS)?;
5895        let alias = self.parse_identifier(false)?;
5896        Ok(IdentWithAlias { ident, alias })
5897    }
5898
5899    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
5900    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
5901    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
5902    pub fn parse_optional_alias(
5903        &mut self,
5904        reserved_kwds: &[Keyword],
5905    ) -> Result<Option<Ident>, ParserError> {
5906        let after_as = self.parse_keyword(Keyword::AS);
5907        let next_token = self.next_token();
5908        match next_token.token {
5909            // Accept any identifier after `AS` (though many dialects have restrictions on
5910            // keywords that may appear here). If there's no `AS`: don't parse keywords,
5911            // which may start a construct allowed in this position, to be parsed as aliases.
5912            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
5913            // not an alias.)
5914            Token::Word(w) if after_as || !reserved_kwds.contains(&w.keyword) => {
5915                Ok(Some(w.to_ident()))
5916            }
5917            // MSSQL supports single-quoted strings as aliases for columns
5918            // We accept them as table aliases too, although MSSQL does not.
5919            //
5920            // Note, that this conflicts with an obscure rule from the SQL
5921            // standard, which we don't implement:
5922            // https://crate.io/docs/sql-99/en/latest/chapters/07.html#character-string-literal-s
5923            //    "[Obscure Rule] SQL allows you to break a long <character
5924            //    string literal> up into two or more smaller <character string
5925            //    literal>s, split by a <separator> that includes a newline
5926            //    character. When it sees such a <literal>, your DBMS will
5927            //    ignore the <separator> and treat the multiple strings as
5928            //    a single <literal>."
5929            Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
5930            // Support for MySql dialect double quoted string, `AS "HOUR"` for example
5931            Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
5932            _ => {
5933                if after_as {
5934                    return self.expected("an identifier after AS", next_token);
5935                }
5936                self.prev_token();
5937                Ok(None) // no alias found
5938            }
5939        }
5940    }
5941
5942    /// Parse `AS identifier` when the AS is describing a table-valued object,
5943    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
5944    /// the alias is allowed to optionally name the columns in the table, in
5945    /// addition to the table itself.
5946    pub fn parse_optional_table_alias(
5947        &mut self,
5948        reserved_kwds: &[Keyword],
5949    ) -> Result<Option<TableAlias>, ParserError> {
5950        match self.parse_optional_alias(reserved_kwds)? {
5951            Some(name) => {
5952                let columns = self.parse_parenthesized_column_list(Optional, false)?;
5953                Ok(Some(TableAlias { name, columns }))
5954            }
5955            None => Ok(None),
5956        }
5957    }
5958
5959    /// Parse a possibly qualified, possibly quoted identifier, e.g.
5960    /// `foo` or `myschema."table"
5961    ///
5962    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
5963    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
5964    /// in this context on BigQuery.
5965    pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
5966        let mut idents = vec![];
5967        loop {
5968            idents.push(self.parse_identifier(in_table_clause)?);
5969            if !self.consume_token(&Token::Period) {
5970                break;
5971            }
5972        }
5973
5974        // BigQuery accepts any number of quoted identifiers of a table name.
5975        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
5976        if dialect_of!(self is BigQueryDialect)
5977            && idents.iter().any(|ident| ident.value.contains('.'))
5978        {
5979            idents = idents
5980                .into_iter()
5981                .flat_map(|ident| {
5982                    ident
5983                        .value
5984                        .split('.')
5985                        .map(|value| Ident {
5986                            value: value.into(),
5987                            quote_style: ident.quote_style,
5988                        })
5989                        .collect::<Vec<_>>()
5990                })
5991                .collect()
5992        }
5993
5994        Ok(ObjectName(idents))
5995    }
5996
5997    /// Parse identifiers
5998    pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
5999        let mut idents = vec![];
6000        loop {
6001            match self.peek_token().token {
6002                Token::Word(w) => {
6003                    idents.push(w.to_ident());
6004                }
6005                Token::EOF | Token::Eq => break,
6006                _ => {}
6007            }
6008            self.next_token();
6009        }
6010        Ok(idents)
6011    }
6012
6013    /// Parse identifiers of form ident1[.identN]*
6014    ///
6015    /// Similar in functionality to [parse_identifiers], with difference
6016    /// being this function is much more strict about parsing a valid multipart identifier, not
6017    /// allowing extraneous tokens to be parsed, otherwise it fails.
6018    ///
6019    /// For example:
6020    ///
6021    /// ```rust
6022    /// use sqlparser::ast::Ident;
6023    /// use sqlparser::dialect::GenericDialect;
6024    /// use sqlparser::parser::Parser;
6025    ///
6026    /// let dialect = GenericDialect {};
6027    /// let expected = vec![Ident::new("one"), Ident::new("two")];
6028    ///
6029    /// // expected usage
6030    /// let sql = "one.two";
6031    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
6032    /// let actual = parser.parse_multipart_identifier().unwrap();
6033    /// assert_eq!(&actual, &expected);
6034    ///
6035    /// // parse_identifiers is more loose on what it allows, parsing successfully
6036    /// let sql = "one + two";
6037    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
6038    /// let actual = parser.parse_identifiers().unwrap();
6039    /// assert_eq!(&actual, &expected);
6040    ///
6041    /// // expected to strictly fail due to + separator
6042    /// let sql = "one + two";
6043    /// let mut parser = Parser::new(&dialect).try_with_sql(sql).unwrap();
6044    /// let actual = parser.parse_multipart_identifier().unwrap_err();
6045    /// assert_eq!(
6046    ///     actual.to_string(),
6047    ///     "sql parser error: Unexpected token in identifier: +"
6048    /// );
6049    /// ```
6050    ///
6051    /// [parse_identifiers]: Parser::parse_identifiers
6052    pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
6053        let mut idents = vec![];
6054
6055        // expecting at least one word for identifier
6056        match self.next_token().token {
6057            Token::Word(w) => idents.push(w.to_ident()),
6058            Token::EOF => {
6059                return Err(ParserError::ParserError(
6060                    "Empty input when parsing identifier".to_string(),
6061                ))?
6062            }
6063            token => {
6064                return Err(ParserError::ParserError(format!(
6065                    "Unexpected token in identifier: {token}"
6066                )))?
6067            }
6068        };
6069
6070        // parse optional next parts if exist
6071        loop {
6072            match self.next_token().token {
6073                // ensure that optional period is succeeded by another identifier
6074                Token::Period => match self.next_token().token {
6075                    Token::Word(w) => idents.push(w.to_ident()),
6076                    Token::EOF => {
6077                        return Err(ParserError::ParserError(
6078                            "Trailing period in identifier".to_string(),
6079                        ))?
6080                    }
6081                    token => {
6082                        return Err(ParserError::ParserError(format!(
6083                            "Unexpected token following period in identifier: {token}"
6084                        )))?
6085                    }
6086                },
6087                Token::EOF => break,
6088                token => {
6089                    return Err(ParserError::ParserError(format!(
6090                        "Unexpected token in identifier: {token}"
6091                    )))?
6092                }
6093            }
6094        }
6095
6096        Ok(idents)
6097    }
6098
6099    /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
6100    ///
6101    /// The `in_table_clause` parameter indicates whether the identifier is a table in a FROM, JOIN, or
6102    /// similar table clause. Currently, this is used only to support unquoted hyphenated identifiers in
6103    //  this context on BigQuery.
6104    pub fn parse_identifier(&mut self, in_table_clause: bool) -> Result<Ident, ParserError> {
6105        let next_token = self.next_token();
6106        match next_token.token {
6107            Token::Word(w) => {
6108                let mut ident = w.to_ident();
6109
6110                // On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
6111                // TABLE clause [0].
6112                //
6113                // The first segment must be an ordinary unquoted identifier, e.g. it must not start
6114                // with a digit. Subsequent segments are either must either be valid identifiers or
6115                // integers, e.g. foo-123 is allowed, but foo-123a is not.
6116                //
6117                // [0] https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical
6118                if dialect_of!(self is BigQueryDialect)
6119                    && w.quote_style.is_none()
6120                    && in_table_clause
6121                {
6122                    let mut requires_whitespace = false;
6123                    while matches!(self.peek_token_no_skip().token, Token::Minus) {
6124                        self.next_token();
6125                        ident.value.push('-');
6126
6127                        let token = self
6128                            .next_token_no_skip()
6129                            .cloned()
6130                            .unwrap_or(TokenWithLocation::wrap(Token::EOF));
6131                        requires_whitespace = match token.token {
6132                            Token::Word(next_word) if next_word.quote_style.is_none() => {
6133                                ident.value.push_str(&next_word.value);
6134                                false
6135                            }
6136                            Token::Number(s, false) if s.chars().all(|c| c.is_ascii_digit()) => {
6137                                ident.value.push_str(&s);
6138                                true
6139                            }
6140                            _ => {
6141                                return self
6142                                    .expected("continuation of hyphenated identifier", token);
6143                            }
6144                        }
6145                    }
6146
6147                    // If the last segment was a number, we must check that it's followed by whitespace,
6148                    // otherwise foo-123a will be parsed as `foo-123` with the alias `a`.
6149                    if requires_whitespace {
6150                        let token = self.next_token();
6151                        if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
6152                            return self
6153                                .expected("whitespace following hyphenated identifier", token);
6154                        }
6155                    }
6156                }
6157                Ok(ident)
6158            }
6159            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
6160            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
6161            _ => self.expected("identifier", next_token),
6162        }
6163    }
6164
6165    /// Parses a parenthesized, comma-separated list of column definitions within a view.
6166    fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
6167        if self.consume_token(&Token::LParen) {
6168            if self.peek_token().token == Token::RParen {
6169                self.next_token();
6170                Ok(vec![])
6171            } else {
6172                let cols = self.parse_comma_separated(Parser::parse_view_column)?;
6173                self.expect_token(&Token::RParen)?;
6174                Ok(cols)
6175            }
6176        } else {
6177            Ok(vec![])
6178        }
6179    }
6180
6181    /// Parses a column definition within a view.
6182    fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
6183        let name = self.parse_identifier(false)?;
6184        let options = if dialect_of!(self is BigQueryDialect | GenericDialect)
6185            && self.parse_keyword(Keyword::OPTIONS)
6186        {
6187            self.prev_token();
6188            Some(self.parse_options(Keyword::OPTIONS)?)
6189        } else {
6190            None
6191        };
6192        Ok(ViewColumnDef { name, options })
6193    }
6194
6195    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
6196    pub fn parse_parenthesized_column_list(
6197        &mut self,
6198        optional: IsOptional,
6199        allow_empty: bool,
6200    ) -> Result<Vec<Ident>, ParserError> {
6201        if self.consume_token(&Token::LParen) {
6202            if allow_empty && self.peek_token().token == Token::RParen {
6203                self.next_token();
6204                Ok(vec![])
6205            } else {
6206                let cols = self.parse_comma_separated(|p| p.parse_identifier(false))?;
6207                self.expect_token(&Token::RParen)?;
6208                Ok(cols)
6209            }
6210        } else if optional == Optional {
6211            Ok(vec![])
6212        } else {
6213            self.expected("a list of columns in parentheses", self.peek_token())
6214        }
6215    }
6216
6217    pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
6218        self.expect_token(&Token::LParen)?;
6219        let n = self.parse_literal_uint()?;
6220        self.expect_token(&Token::RParen)?;
6221        Ok(n)
6222    }
6223
6224    pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
6225        if self.consume_token(&Token::LParen) {
6226            let n = self.parse_literal_uint()?;
6227            self.expect_token(&Token::RParen)?;
6228            Ok(Some(n))
6229        } else {
6230            Ok(None)
6231        }
6232    }
6233
6234    pub fn parse_optional_character_length(
6235        &mut self,
6236    ) -> Result<Option<CharacterLength>, ParserError> {
6237        if self.consume_token(&Token::LParen) {
6238            let character_length = self.parse_character_length()?;
6239            self.expect_token(&Token::RParen)?;
6240            Ok(Some(character_length))
6241        } else {
6242            Ok(None)
6243        }
6244    }
6245
6246    pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
6247        if self.parse_keyword(Keyword::MAX) {
6248            return Ok(CharacterLength::Max);
6249        }
6250        let length = self.parse_literal_uint()?;
6251        let unit = if self.parse_keyword(Keyword::CHARACTERS) {
6252            Some(CharLengthUnits::Characters)
6253        } else if self.parse_keyword(Keyword::OCTETS) {
6254            Some(CharLengthUnits::Octets)
6255        } else {
6256            None
6257        };
6258        Ok(CharacterLength::IntegerLength { length, unit })
6259    }
6260
6261    pub fn parse_optional_precision_scale(
6262        &mut self,
6263    ) -> Result<(Option<u64>, Option<u64>), ParserError> {
6264        if self.consume_token(&Token::LParen) {
6265            let n = self.parse_literal_uint()?;
6266            let scale = if self.consume_token(&Token::Comma) {
6267                Some(self.parse_literal_uint()?)
6268            } else {
6269                None
6270            };
6271            self.expect_token(&Token::RParen)?;
6272            Ok((Some(n), scale))
6273        } else {
6274            Ok((None, None))
6275        }
6276    }
6277
6278    pub fn parse_exact_number_optional_precision_scale(
6279        &mut self,
6280    ) -> Result<ExactNumberInfo, ParserError> {
6281        if self.consume_token(&Token::LParen) {
6282            let precision = self.parse_literal_uint()?;
6283            let scale = if self.consume_token(&Token::Comma) {
6284                Some(self.parse_literal_uint()?)
6285            } else {
6286                None
6287            };
6288
6289            self.expect_token(&Token::RParen)?;
6290
6291            match scale {
6292                None => Ok(ExactNumberInfo::Precision(precision)),
6293                Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
6294            }
6295        } else {
6296            Ok(ExactNumberInfo::None)
6297        }
6298    }
6299
6300    pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
6301        if self.consume_token(&Token::LParen) {
6302            let mut modifiers = Vec::new();
6303            loop {
6304                let next_token = self.next_token();
6305                match next_token.token {
6306                    Token::Word(w) => modifiers.push(w.to_string()),
6307                    Token::Number(n, _) => modifiers.push(n),
6308                    Token::SingleQuotedString(s) => modifiers.push(s),
6309
6310                    Token::Comma => {
6311                        continue;
6312                    }
6313                    Token::RParen => {
6314                        break;
6315                    }
6316                    _ => self.expected("type modifiers", next_token)?,
6317                }
6318            }
6319
6320            Ok(Some(modifiers))
6321        } else {
6322            Ok(None)
6323        }
6324    }
6325
6326    pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
6327        let tables = if !self.parse_keyword(Keyword::FROM) {
6328            let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6329            self.expect_keyword(Keyword::FROM)?;
6330            tables
6331        } else {
6332            vec![]
6333        };
6334
6335        let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
6336        let using = if self.parse_keyword(Keyword::USING) {
6337            Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
6338        } else {
6339            None
6340        };
6341        let selection = if self.parse_keyword(Keyword::WHERE) {
6342            Some(self.parse_expr()?)
6343        } else {
6344            None
6345        };
6346        let returning = if self.parse_keyword(Keyword::RETURNING) {
6347            Some(self.parse_comma_separated(Parser::parse_select_item)?)
6348        } else {
6349            None
6350        };
6351        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6352            self.parse_comma_separated(Parser::parse_order_by_expr)?
6353        } else {
6354            vec![]
6355        };
6356        let limit = if self.parse_keyword(Keyword::LIMIT) {
6357            self.parse_limit()?
6358        } else {
6359            None
6360        };
6361
6362        Ok(Statement::Delete {
6363            tables,
6364            from,
6365            using,
6366            selection,
6367            returning,
6368            order_by,
6369            limit,
6370        })
6371    }
6372
6373    // KILL [CONNECTION | QUERY | MUTATION] processlist_id
6374    pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
6375        let modifier_keyword =
6376            self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
6377
6378        let id = self.parse_literal_uint()?;
6379
6380        let modifier = match modifier_keyword {
6381            Some(Keyword::CONNECTION) => Some(KillType::Connection),
6382            Some(Keyword::QUERY) => Some(KillType::Query),
6383            Some(Keyword::MUTATION) => {
6384                if dialect_of!(self is ClickHouseDialect | GenericDialect) {
6385                    Some(KillType::Mutation)
6386                } else {
6387                    self.expected(
6388                        "Unsupported type for KILL, allowed: CONNECTION | QUERY",
6389                        self.peek_token(),
6390                    )?
6391                }
6392            }
6393            _ => None,
6394        };
6395
6396        Ok(Statement::Kill { modifier, id })
6397    }
6398
6399    pub fn parse_explain(&mut self, describe_alias: bool) -> Result<Statement, ParserError> {
6400        let analyze = self.parse_keyword(Keyword::ANALYZE);
6401        let verbose = self.parse_keyword(Keyword::VERBOSE);
6402        let mut format = None;
6403        if self.parse_keyword(Keyword::FORMAT) {
6404            format = Some(self.parse_analyze_format()?);
6405        }
6406
6407        match self.maybe_parse(|parser| parser.parse_statement()) {
6408            Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
6409                ParserError::ParserError("Explain must be root of the plan".to_string()),
6410            ),
6411            Some(statement) => Ok(Statement::Explain {
6412                describe_alias,
6413                analyze,
6414                verbose,
6415                statement: Box::new(statement),
6416                format,
6417            }),
6418            _ => {
6419                let table_name = self.parse_object_name(false)?;
6420                Ok(Statement::ExplainTable {
6421                    describe_alias,
6422                    table_name,
6423                })
6424            }
6425        }
6426    }
6427
6428    /// Parse a query expression, i.e. a `SELECT` statement optionally
6429    /// preceded with some `WITH` CTE declarations and optionally followed
6430    /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
6431    /// expect the initial keyword to be already consumed
6432    pub fn parse_query(&mut self) -> Result<Query, ParserError> {
6433        let _guard = self.recursion_counter.try_decrease()?;
6434        let with = if self.parse_keyword(Keyword::WITH) {
6435            Some(With {
6436                recursive: self.parse_keyword(Keyword::RECURSIVE),
6437                cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
6438            })
6439        } else {
6440            None
6441        };
6442
6443        if self.parse_keyword(Keyword::INSERT) {
6444            let insert = self.parse_insert()?;
6445
6446            Ok(Query {
6447                with,
6448                body: Box::new(SetExpr::Insert(insert)),
6449                limit: None,
6450                limit_by: vec![],
6451                order_by: vec![],
6452                offset: None,
6453                fetch: None,
6454                locks: vec![],
6455                for_clause: None,
6456            })
6457        } else if self.parse_keyword(Keyword::UPDATE) {
6458            let update = self.parse_update()?;
6459            Ok(Query {
6460                with,
6461                body: Box::new(SetExpr::Update(update)),
6462                limit: None,
6463                limit_by: vec![],
6464                order_by: vec![],
6465                offset: None,
6466                fetch: None,
6467                locks: vec![],
6468                for_clause: None,
6469            })
6470        } else {
6471            let body = Box::new(self.parse_query_body(0)?);
6472
6473            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6474                self.parse_comma_separated(Parser::parse_order_by_expr)?
6475            } else {
6476                vec![]
6477            };
6478
6479            let mut limit = None;
6480            let mut offset = None;
6481
6482            for _x in 0..2 {
6483                if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
6484                    limit = self.parse_limit()?
6485                }
6486
6487                if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
6488                    offset = Some(self.parse_offset()?)
6489                }
6490
6491                if dialect_of!(self is GenericDialect | MySqlDialect | ClickHouseDialect)
6492                    && limit.is_some()
6493                    && offset.is_none()
6494                    && self.consume_token(&Token::Comma)
6495                {
6496                    // MySQL style LIMIT x,y => LIMIT y OFFSET x.
6497                    // Check <https://dev.mysql.com/doc/refman/8.0/en/select.html> for more details.
6498                    offset = Some(Offset {
6499                        value: limit.unwrap(),
6500                        rows: OffsetRows::None,
6501                    });
6502                    limit = Some(self.parse_expr()?);
6503                }
6504            }
6505
6506            let limit_by = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6507                && self.parse_keyword(Keyword::BY)
6508            {
6509                self.parse_comma_separated(Parser::parse_expr)?
6510            } else {
6511                vec![]
6512            };
6513
6514            let fetch = if self.parse_keyword(Keyword::FETCH) {
6515                Some(self.parse_fetch()?)
6516            } else {
6517                None
6518            };
6519
6520            let mut for_clause = None;
6521            let mut locks = Vec::new();
6522            while self.parse_keyword(Keyword::FOR) {
6523                if let Some(parsed_for_clause) = self.parse_for_clause()? {
6524                    for_clause = Some(parsed_for_clause);
6525                    break;
6526                } else {
6527                    locks.push(self.parse_lock()?);
6528                }
6529            }
6530
6531            Ok(Query {
6532                with,
6533                body,
6534                order_by,
6535                limit,
6536                limit_by,
6537                offset,
6538                fetch,
6539                locks,
6540                for_clause,
6541            })
6542        }
6543    }
6544
6545    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
6546    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
6547        if self.parse_keyword(Keyword::XML) {
6548            Ok(Some(self.parse_for_xml()?))
6549        } else if self.parse_keyword(Keyword::JSON) {
6550            Ok(Some(self.parse_for_json()?))
6551        } else if self.parse_keyword(Keyword::BROWSE) {
6552            Ok(Some(ForClause::Browse))
6553        } else {
6554            Ok(None)
6555        }
6556    }
6557
6558    /// Parse a mssql `FOR XML` clause
6559    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
6560        let for_xml = if self.parse_keyword(Keyword::RAW) {
6561            let mut element_name = None;
6562            if self.peek_token().token == Token::LParen {
6563                self.expect_token(&Token::LParen)?;
6564                element_name = Some(self.parse_literal_string()?);
6565                self.expect_token(&Token::RParen)?;
6566            }
6567            ForXml::Raw(element_name)
6568        } else if self.parse_keyword(Keyword::AUTO) {
6569            ForXml::Auto
6570        } else if self.parse_keyword(Keyword::EXPLICIT) {
6571            ForXml::Explicit
6572        } else if self.parse_keyword(Keyword::PATH) {
6573            let mut element_name = None;
6574            if self.peek_token().token == Token::LParen {
6575                self.expect_token(&Token::LParen)?;
6576                element_name = Some(self.parse_literal_string()?);
6577                self.expect_token(&Token::RParen)?;
6578            }
6579            ForXml::Path(element_name)
6580        } else {
6581            return Err(ParserError::ParserError(
6582                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
6583            ));
6584        };
6585        let mut elements = false;
6586        let mut binary_base64 = false;
6587        let mut root = None;
6588        let mut r#type = false;
6589        while self.peek_token().token == Token::Comma {
6590            self.next_token();
6591            if self.parse_keyword(Keyword::ELEMENTS) {
6592                elements = true;
6593            } else if self.parse_keyword(Keyword::BINARY) {
6594                self.expect_keyword(Keyword::BASE64)?;
6595                binary_base64 = true;
6596            } else if self.parse_keyword(Keyword::ROOT) {
6597                self.expect_token(&Token::LParen)?;
6598                root = Some(self.parse_literal_string()?);
6599                self.expect_token(&Token::RParen)?;
6600            } else if self.parse_keyword(Keyword::TYPE) {
6601                r#type = true;
6602            }
6603        }
6604        Ok(ForClause::Xml {
6605            for_xml,
6606            elements,
6607            binary_base64,
6608            root,
6609            r#type,
6610        })
6611    }
6612
6613    /// Parse a mssql `FOR JSON` clause
6614    pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
6615        let for_json = if self.parse_keyword(Keyword::AUTO) {
6616            ForJson::Auto
6617        } else if self.parse_keyword(Keyword::PATH) {
6618            ForJson::Path
6619        } else {
6620            return Err(ParserError::ParserError(
6621                "Expected FOR JSON [AUTO | PATH ]".to_string(),
6622            ));
6623        };
6624        let mut root = None;
6625        let mut include_null_values = false;
6626        let mut without_array_wrapper = false;
6627        while self.peek_token().token == Token::Comma {
6628            self.next_token();
6629            if self.parse_keyword(Keyword::ROOT) {
6630                self.expect_token(&Token::LParen)?;
6631                root = Some(self.parse_literal_string()?);
6632                self.expect_token(&Token::RParen)?;
6633            } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
6634                include_null_values = true;
6635            } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
6636                without_array_wrapper = true;
6637            }
6638        }
6639        Ok(ForClause::Json {
6640            for_json,
6641            root,
6642            include_null_values,
6643            without_array_wrapper,
6644        })
6645    }
6646
6647    /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
6648    pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
6649        let name = self.parse_identifier(false)?;
6650
6651        let mut cte = if self.parse_keyword(Keyword::AS) {
6652            self.expect_token(&Token::LParen)?;
6653            let query = Box::new(self.parse_query()?);
6654            self.expect_token(&Token::RParen)?;
6655            let alias = TableAlias {
6656                name,
6657                columns: vec![],
6658            };
6659            Cte {
6660                alias,
6661                query,
6662                from: None,
6663            }
6664        } else {
6665            let columns = self.parse_parenthesized_column_list(Optional, false)?;
6666            self.expect_keyword(Keyword::AS)?;
6667            self.expect_token(&Token::LParen)?;
6668            let query = Box::new(self.parse_query()?);
6669            self.expect_token(&Token::RParen)?;
6670            let alias = TableAlias { name, columns };
6671            Cte {
6672                alias,
6673                query,
6674                from: None,
6675            }
6676        };
6677        if self.parse_keyword(Keyword::FROM) {
6678            cte.from = Some(self.parse_identifier(false)?);
6679        }
6680        Ok(cte)
6681    }
6682
6683    /// Parse a "query body", which is an expression with roughly the
6684    /// following grammar:
6685    /// ```sql
6686    ///   query_body ::= restricted_select | '(' subquery ')' | set_operation
6687    ///   restricted_select ::= 'SELECT' [expr_list] [ from ] [ where ] [ groupby_having ]
6688    ///   subquery ::= query_body [ order_by_limit ]
6689    ///   set_operation ::= query_body { 'UNION' | 'EXCEPT' | 'INTERSECT' } [ 'ALL' ] query_body
6690    /// ```
6691    pub fn parse_query_body(&mut self, precedence: u8) -> Result<SetExpr, ParserError> {
6692        // We parse the expression using a Pratt parser, as in `parse_expr()`.
6693        // Start by parsing a restricted SELECT or a `(subquery)`:
6694        let mut expr = if self.parse_keyword(Keyword::SELECT) {
6695            SetExpr::Select(Box::new(self.parse_select()?))
6696        } else if self.consume_token(&Token::LParen) {
6697            // CTEs are not allowed here, but the parser currently accepts them
6698            let subquery = self.parse_query()?;
6699            self.expect_token(&Token::RParen)?;
6700            SetExpr::Query(Box::new(subquery))
6701        } else if self.parse_keyword(Keyword::VALUES) {
6702            let is_mysql = dialect_of!(self is MySqlDialect);
6703            SetExpr::Values(self.parse_values(is_mysql)?)
6704        } else if self.parse_keyword(Keyword::TABLE) {
6705            SetExpr::Table(Box::new(self.parse_as_table()?))
6706        } else {
6707            return self.expected(
6708                "SELECT, VALUES, or a subquery in the query body",
6709                self.peek_token(),
6710            );
6711        };
6712
6713        loop {
6714            // The query can be optionally followed by a set operator:
6715            let op = self.parse_set_operator(&self.peek_token().token);
6716            let next_precedence = match op {
6717                // UNION and EXCEPT have the same binding power and evaluate left-to-right
6718                Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
6719                // INTERSECT has higher precedence than UNION/EXCEPT
6720                Some(SetOperator::Intersect) => 20,
6721                // Unexpected token or EOF => stop parsing the query body
6722                None => break,
6723            };
6724            if precedence >= next_precedence {
6725                break;
6726            }
6727            self.next_token(); // skip past the set operator
6728            let set_quantifier = self.parse_set_quantifier(&op);
6729            expr = SetExpr::SetOperation {
6730                left: Box::new(expr),
6731                op: op.unwrap(),
6732                set_quantifier,
6733                right: Box::new(self.parse_query_body(next_precedence)?),
6734            };
6735        }
6736
6737        Ok(expr)
6738    }
6739
6740    pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
6741        match token {
6742            Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
6743            Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
6744            Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
6745            _ => None,
6746        }
6747    }
6748
6749    pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
6750        match op {
6751            Some(SetOperator::Union) => {
6752                if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
6753                    SetQuantifier::DistinctByName
6754                } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
6755                    SetQuantifier::ByName
6756                } else if self.parse_keyword(Keyword::ALL) {
6757                    if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
6758                        SetQuantifier::AllByName
6759                    } else {
6760                        SetQuantifier::All
6761                    }
6762                } else if self.parse_keyword(Keyword::DISTINCT) {
6763                    SetQuantifier::Distinct
6764                } else {
6765                    SetQuantifier::None
6766                }
6767            }
6768            Some(SetOperator::Except) | Some(SetOperator::Intersect) => {
6769                if self.parse_keyword(Keyword::ALL) {
6770                    SetQuantifier::All
6771                } else if self.parse_keyword(Keyword::DISTINCT) {
6772                    SetQuantifier::Distinct
6773                } else {
6774                    SetQuantifier::None
6775                }
6776            }
6777            _ => SetQuantifier::None,
6778        }
6779    }
6780
6781    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
6782    /// assuming the initial `SELECT` was already consumed
6783    pub fn parse_select(&mut self) -> Result<Select, ParserError> {
6784        let distinct = self.parse_all_or_distinct()?;
6785
6786        let top = if self.parse_keyword(Keyword::TOP) {
6787            Some(self.parse_top()?)
6788        } else {
6789            None
6790        };
6791
6792        let projection = self.parse_projection()?;
6793
6794        let into = if self.parse_keyword(Keyword::INTO) {
6795            let temporary = self
6796                .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
6797                .is_some();
6798            let unlogged = self.parse_keyword(Keyword::UNLOGGED);
6799            let table = self.parse_keyword(Keyword::TABLE);
6800            let name = self.parse_object_name(false)?;
6801            Some(SelectInto {
6802                temporary,
6803                unlogged,
6804                table,
6805                name,
6806            })
6807        } else {
6808            None
6809        };
6810
6811        // Note that for keywords to be properly handled here, they need to be
6812        // added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
6813        // otherwise they may be parsed as an alias as part of the `projection`
6814        // or `from`.
6815
6816        let from = if self.parse_keyword(Keyword::FROM) {
6817            self.parse_comma_separated(Parser::parse_table_and_joins)?
6818        } else {
6819            vec![]
6820        };
6821
6822        let mut lateral_views = vec![];
6823        loop {
6824            if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
6825                let outer = self.parse_keyword(Keyword::OUTER);
6826                let lateral_view = self.parse_expr()?;
6827                let lateral_view_name = self.parse_object_name(false)?;
6828                let lateral_col_alias = self
6829                    .parse_comma_separated(|parser| {
6830                        parser.parse_optional_alias(&[
6831                            Keyword::WHERE,
6832                            Keyword::GROUP,
6833                            Keyword::CLUSTER,
6834                            Keyword::HAVING,
6835                            Keyword::LATERAL,
6836                        ]) // This couldn't possibly be a bad idea
6837                    })?
6838                    .into_iter()
6839                    .flatten()
6840                    .collect();
6841
6842                lateral_views.push(LateralView {
6843                    lateral_view,
6844                    lateral_view_name,
6845                    lateral_col_alias,
6846                    outer,
6847                });
6848            } else {
6849                break;
6850            }
6851        }
6852
6853        let selection = if self.parse_keyword(Keyword::WHERE) {
6854            Some(self.parse_expr()?)
6855        } else {
6856            None
6857        };
6858
6859        let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
6860            if self.parse_keyword(Keyword::ALL) {
6861                GroupByExpr::All
6862            } else {
6863                GroupByExpr::Expressions(self.parse_comma_separated(Parser::parse_group_by_expr)?)
6864            }
6865        } else {
6866            GroupByExpr::Expressions(vec![])
6867        };
6868
6869        let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
6870            self.parse_comma_separated(Parser::parse_expr)?
6871        } else {
6872            vec![]
6873        };
6874
6875        let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
6876            self.parse_comma_separated(Parser::parse_expr)?
6877        } else {
6878            vec![]
6879        };
6880
6881        let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
6882            self.parse_comma_separated(Parser::parse_expr)?
6883        } else {
6884            vec![]
6885        };
6886
6887        let having = if self.parse_keyword(Keyword::HAVING) {
6888            Some(self.parse_expr()?)
6889        } else {
6890            None
6891        };
6892
6893        let named_windows = if self.parse_keyword(Keyword::WINDOW) {
6894            self.parse_comma_separated(Parser::parse_named_window)?
6895        } else {
6896            vec![]
6897        };
6898
6899        let qualify = if self.parse_keyword(Keyword::QUALIFY) {
6900            Some(self.parse_expr()?)
6901        } else {
6902            None
6903        };
6904
6905        Ok(Select {
6906            distinct,
6907            top,
6908            projection,
6909            into,
6910            from,
6911            lateral_views,
6912            selection,
6913            group_by,
6914            cluster_by,
6915            distribute_by,
6916            sort_by,
6917            having,
6918            named_window: named_windows,
6919            qualify,
6920        })
6921    }
6922
6923    /// Parse `CREATE TABLE x AS TABLE y`
6924    pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
6925        let token1 = self.next_token();
6926        let token2 = self.next_token();
6927        let token3 = self.next_token();
6928
6929        let table_name;
6930        let schema_name;
6931        if token2 == Token::Period {
6932            match token1.token {
6933                Token::Word(w) => {
6934                    schema_name = w.value;
6935                }
6936                _ => {
6937                    return self.expected("Schema name", token1);
6938                }
6939            }
6940            match token3.token {
6941                Token::Word(w) => {
6942                    table_name = w.value;
6943                }
6944                _ => {
6945                    return self.expected("Table name", token3);
6946                }
6947            }
6948            Ok(Table {
6949                table_name: Some(table_name),
6950                schema_name: Some(schema_name),
6951            })
6952        } else {
6953            match token1.token {
6954                Token::Word(w) => {
6955                    table_name = w.value;
6956                }
6957                _ => {
6958                    return self.expected("Table name", token1);
6959                }
6960            }
6961            Ok(Table {
6962                table_name: Some(table_name),
6963                schema_name: None,
6964            })
6965        }
6966    }
6967
6968    pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
6969        let modifier =
6970            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
6971        if let Some(Keyword::HIVEVAR) = modifier {
6972            self.expect_token(&Token::Colon)?;
6973        } else if self.parse_keyword(Keyword::ROLE) {
6974            let context_modifier = match modifier {
6975                Some(Keyword::LOCAL) => ContextModifier::Local,
6976                Some(Keyword::SESSION) => ContextModifier::Session,
6977                _ => ContextModifier::None,
6978            };
6979
6980            let role_name = if self.parse_keyword(Keyword::NONE) {
6981                None
6982            } else {
6983                Some(self.parse_identifier(false)?)
6984            };
6985            return Ok(Statement::SetRole {
6986                context_modifier,
6987                role_name,
6988            });
6989        }
6990
6991        let variable = if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
6992            ObjectName(vec!["TIMEZONE".into()])
6993        } else {
6994            self.parse_object_name(false)?
6995        };
6996
6997        if variable.to_string().eq_ignore_ascii_case("NAMES")
6998            && dialect_of!(self is MySqlDialect | GenericDialect)
6999        {
7000            if self.parse_keyword(Keyword::DEFAULT) {
7001                return Ok(Statement::SetNamesDefault {});
7002            }
7003
7004            let charset_name = self.parse_literal_string()?;
7005            let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
7006                Some(self.parse_literal_string()?)
7007            } else {
7008                None
7009            };
7010
7011            Ok(Statement::SetNames {
7012                charset_name,
7013                collation_name,
7014            })
7015        } else if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
7016            let mut values = vec![];
7017            loop {
7018                let value = if let Ok(expr) = self.parse_expr() {
7019                    expr
7020                } else {
7021                    self.expected("variable value", self.peek_token())?
7022                };
7023
7024                values.push(value);
7025                if self.consume_token(&Token::Comma) {
7026                    continue;
7027                }
7028                return Ok(Statement::SetVariable {
7029                    local: modifier == Some(Keyword::LOCAL),
7030                    hivevar: Some(Keyword::HIVEVAR) == modifier,
7031                    variable,
7032                    value: values,
7033                });
7034            }
7035        } else if variable.to_string().eq_ignore_ascii_case("TIMEZONE") {
7036            // for some db (e.g. postgresql), SET TIME ZONE <value> is an alias for SET TIMEZONE [TO|=] <value>
7037            match self.parse_expr() {
7038                Ok(expr) => Ok(Statement::SetTimeZone {
7039                    local: modifier == Some(Keyword::LOCAL),
7040                    value: expr,
7041                }),
7042                _ => self.expected("timezone value", self.peek_token())?,
7043            }
7044        } else if variable.to_string() == "CHARACTERISTICS" {
7045            self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
7046            Ok(Statement::SetTransaction {
7047                modes: self.parse_transaction_modes()?,
7048                snapshot: None,
7049                session: true,
7050            })
7051        } else if variable.to_string() == "TRANSACTION" && modifier.is_none() {
7052            if self.parse_keyword(Keyword::SNAPSHOT) {
7053                let snaphot_id = self.parse_value()?;
7054                return Ok(Statement::SetTransaction {
7055                    modes: vec![],
7056                    snapshot: Some(snaphot_id),
7057                    session: false,
7058                });
7059            }
7060            Ok(Statement::SetTransaction {
7061                modes: self.parse_transaction_modes()?,
7062                snapshot: None,
7063                session: false,
7064            })
7065        } else {
7066            self.expected("equals sign or TO", self.peek_token())
7067        }
7068    }
7069
7070    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
7071        let extended = self.parse_keyword(Keyword::EXTENDED);
7072        let full = self.parse_keyword(Keyword::FULL);
7073        let session = self.parse_keyword(Keyword::SESSION);
7074        let global = self.parse_keyword(Keyword::GLOBAL);
7075        if self
7076            .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
7077            .is_some()
7078        {
7079            Ok(self.parse_show_columns(extended, full)?)
7080        } else if self.parse_keyword(Keyword::TABLES) {
7081            Ok(self.parse_show_tables(extended, full)?)
7082        } else if self.parse_keyword(Keyword::FUNCTIONS) {
7083            Ok(self.parse_show_functions()?)
7084        } else if extended || full {
7085            Err(ParserError::ParserError(
7086                "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
7087            ))
7088        } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
7089            Ok(self.parse_show_create()?)
7090        } else if self.parse_keyword(Keyword::COLLATION) {
7091            Ok(self.parse_show_collation()?)
7092        } else if self.parse_keyword(Keyword::VARIABLES)
7093            && dialect_of!(self is MySqlDialect | GenericDialect)
7094        {
7095            Ok(Statement::ShowVariables {
7096                filter: self.parse_show_statement_filter()?,
7097                session,
7098                global,
7099            })
7100        } else {
7101            Ok(Statement::ShowVariable {
7102                variable: self.parse_identifiers()?,
7103            })
7104        }
7105    }
7106
7107    pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
7108        let obj_type = match self.expect_one_of_keywords(&[
7109            Keyword::TABLE,
7110            Keyword::TRIGGER,
7111            Keyword::FUNCTION,
7112            Keyword::PROCEDURE,
7113            Keyword::EVENT,
7114            Keyword::VIEW,
7115        ])? {
7116            Keyword::TABLE => Ok(ShowCreateObject::Table),
7117            Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
7118            Keyword::FUNCTION => Ok(ShowCreateObject::Function),
7119            Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
7120            Keyword::EVENT => Ok(ShowCreateObject::Event),
7121            Keyword::VIEW => Ok(ShowCreateObject::View),
7122            keyword => Err(ParserError::ParserError(format!(
7123                "Unable to map keyword to ShowCreateObject: {keyword:?}"
7124            ))),
7125        }?;
7126
7127        let obj_name = self.parse_object_name(false)?;
7128
7129        Ok(Statement::ShowCreate { obj_type, obj_name })
7130    }
7131
7132    pub fn parse_show_columns(
7133        &mut self,
7134        extended: bool,
7135        full: bool,
7136    ) -> Result<Statement, ParserError> {
7137        self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
7138        let object_name = self.parse_object_name(false)?;
7139        let table_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
7140            Some(_) => {
7141                let db_name = vec![self.parse_identifier(false)?];
7142                let ObjectName(table_name) = object_name;
7143                let object_name = db_name.into_iter().chain(table_name).collect();
7144                ObjectName(object_name)
7145            }
7146            None => object_name,
7147        };
7148        let filter = self.parse_show_statement_filter()?;
7149        Ok(Statement::ShowColumns {
7150            extended,
7151            full,
7152            table_name,
7153            filter,
7154        })
7155    }
7156
7157    pub fn parse_show_tables(
7158        &mut self,
7159        extended: bool,
7160        full: bool,
7161    ) -> Result<Statement, ParserError> {
7162        let db_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
7163            Some(_) => Some(self.parse_identifier(false)?),
7164            None => None,
7165        };
7166        let filter = self.parse_show_statement_filter()?;
7167        Ok(Statement::ShowTables {
7168            extended,
7169            full,
7170            db_name,
7171            filter,
7172        })
7173    }
7174
7175    pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
7176        let filter = self.parse_show_statement_filter()?;
7177        Ok(Statement::ShowFunctions { filter })
7178    }
7179
7180    pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
7181        let filter = self.parse_show_statement_filter()?;
7182        Ok(Statement::ShowCollation { filter })
7183    }
7184
7185    pub fn parse_show_statement_filter(
7186        &mut self,
7187    ) -> Result<Option<ShowStatementFilter>, ParserError> {
7188        if self.parse_keyword(Keyword::LIKE) {
7189            Ok(Some(ShowStatementFilter::Like(
7190                self.parse_literal_string()?,
7191            )))
7192        } else if self.parse_keyword(Keyword::ILIKE) {
7193            Ok(Some(ShowStatementFilter::ILike(
7194                self.parse_literal_string()?,
7195            )))
7196        } else if self.parse_keyword(Keyword::WHERE) {
7197            Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
7198        } else {
7199            Ok(None)
7200        }
7201    }
7202
7203    pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
7204        let db_name = self.parse_identifier(false)?;
7205        Ok(Statement::Use { db_name })
7206    }
7207
7208    pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
7209        let relation = self.parse_table_factor()?;
7210        // Note that for keywords to be properly handled here, they need to be
7211        // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
7212        // a table alias.
7213        let mut joins = vec![];
7214        loop {
7215            let join = if self.parse_keyword(Keyword::CROSS) {
7216                let join_operator = if self.parse_keyword(Keyword::JOIN) {
7217                    JoinOperator::CrossJoin
7218                } else if self.parse_keyword(Keyword::APPLY) {
7219                    // MSSQL extension, similar to CROSS JOIN LATERAL
7220                    JoinOperator::CrossApply
7221                } else {
7222                    return self.expected("JOIN or APPLY after CROSS", self.peek_token());
7223                };
7224                Join {
7225                    relation: self.parse_table_factor()?,
7226                    join_operator,
7227                }
7228            } else if self.parse_keyword(Keyword::OUTER) {
7229                // MSSQL extension, similar to LEFT JOIN LATERAL .. ON 1=1
7230                self.expect_keyword(Keyword::APPLY)?;
7231                Join {
7232                    relation: self.parse_table_factor()?,
7233                    join_operator: JoinOperator::OuterApply,
7234                }
7235            } else {
7236                let natural = self.parse_keyword(Keyword::NATURAL);
7237                let peek_keyword = if let Token::Word(w) = self.peek_token().token {
7238                    w.keyword
7239                } else {
7240                    Keyword::NoKeyword
7241                };
7242
7243                let join_operator_type = match peek_keyword {
7244                    Keyword::INNER | Keyword::JOIN => {
7245                        let _ = self.parse_keyword(Keyword::INNER); // [ INNER ]
7246                        self.expect_keyword(Keyword::JOIN)?;
7247                        JoinOperator::Inner
7248                    }
7249                    kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
7250                        let _ = self.next_token(); // consume LEFT/RIGHT
7251                        let is_left = kw == Keyword::LEFT;
7252                        let join_type = self.parse_one_of_keywords(&[
7253                            Keyword::OUTER,
7254                            Keyword::SEMI,
7255                            Keyword::ANTI,
7256                            Keyword::JOIN,
7257                        ]);
7258                        match join_type {
7259                            Some(Keyword::OUTER) => {
7260                                self.expect_keyword(Keyword::JOIN)?;
7261                                if is_left {
7262                                    JoinOperator::LeftOuter
7263                                } else {
7264                                    JoinOperator::RightOuter
7265                                }
7266                            }
7267                            Some(Keyword::SEMI) => {
7268                                self.expect_keyword(Keyword::JOIN)?;
7269                                if is_left {
7270                                    JoinOperator::LeftSemi
7271                                } else {
7272                                    JoinOperator::RightSemi
7273                                }
7274                            }
7275                            Some(Keyword::ANTI) => {
7276                                self.expect_keyword(Keyword::JOIN)?;
7277                                if is_left {
7278                                    JoinOperator::LeftAnti
7279                                } else {
7280                                    JoinOperator::RightAnti
7281                                }
7282                            }
7283                            Some(Keyword::JOIN) => {
7284                                if is_left {
7285                                    JoinOperator::LeftOuter
7286                                } else {
7287                                    JoinOperator::RightOuter
7288                                }
7289                            }
7290                            _ => {
7291                                return Err(ParserError::ParserError(format!(
7292                                    "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
7293                                )))
7294                            }
7295                        }
7296                    }
7297                    Keyword::FULL => {
7298                        let _ = self.next_token(); // consume FULL
7299                        let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
7300                        self.expect_keyword(Keyword::JOIN)?;
7301                        JoinOperator::FullOuter
7302                    }
7303                    Keyword::OUTER => {
7304                        return self.expected("LEFT, RIGHT, or FULL", self.peek_token());
7305                    }
7306                    _ if natural => {
7307                        return self.expected("a join type after NATURAL", self.peek_token());
7308                    }
7309                    _ => break,
7310                };
7311                let relation = self.parse_table_factor()?;
7312                let join_constraint = self.parse_join_constraint(natural)?;
7313                Join {
7314                    relation,
7315                    join_operator: join_operator_type(join_constraint),
7316                }
7317            };
7318            joins.push(join);
7319        }
7320        Ok(TableWithJoins { relation, joins })
7321    }
7322
7323    /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
7324    pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
7325        if self.parse_keyword(Keyword::LATERAL) {
7326            // LATERAL must always be followed by a subquery or table function.
7327            if self.consume_token(&Token::LParen) {
7328                self.parse_derived_table_factor(Lateral)
7329            } else {
7330                let name = self.parse_object_name(false)?;
7331                self.expect_token(&Token::LParen)?;
7332                let args = self.parse_optional_args()?;
7333                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7334                Ok(TableFactor::Function {
7335                    lateral: true,
7336                    name,
7337                    args,
7338                    alias,
7339                })
7340            }
7341        } else if self.parse_keyword(Keyword::TABLE) {
7342            // parse table function (SELECT * FROM TABLE (<expr>) [ AS <alias> ])
7343            self.expect_token(&Token::LParen)?;
7344            let expr = self.parse_expr()?;
7345            self.expect_token(&Token::RParen)?;
7346            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7347            Ok(TableFactor::TableFunction { expr, alias })
7348        } else if self.consume_token(&Token::LParen) {
7349            // A left paren introduces either a derived table (i.e., a subquery)
7350            // or a nested join. It's nearly impossible to determine ahead of
7351            // time which it is... so we just try to parse both.
7352            //
7353            // Here's an example that demonstrates the complexity:
7354            //                     /-------------------------------------------------------\
7355            //                     | /-----------------------------------\                 |
7356            //     SELECT * FROM ( ( ( (SELECT 1) UNION (SELECT 2) ) AS t1 NATURAL JOIN t2 ) )
7357            //                   ^ ^ ^ ^
7358            //                   | | | |
7359            //                   | | | |
7360            //                   | | | (4) belongs to a SetExpr::Query inside the subquery
7361            //                   | | (3) starts a derived table (subquery)
7362            //                   | (2) starts a nested join
7363            //                   (1) an additional set of parens around a nested join
7364            //
7365
7366            // If the recently consumed '(' starts a derived table, the call to
7367            // `parse_derived_table_factor` below will return success after parsing the
7368            // subquery, followed by the closing ')', and the alias of the derived table.
7369            // In the example above this is case (3).
7370            if let Some(mut table) =
7371                self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))
7372            {
7373                while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
7374                {
7375                    table = match kw {
7376                        Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
7377                        Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
7378                        _ => unreachable!(),
7379                    }
7380                }
7381                return Ok(table);
7382            }
7383
7384            // A parsing error from `parse_derived_table_factor` indicates that the '(' we've
7385            // recently consumed does not start a derived table (cases 1, 2, or 4).
7386            // `maybe_parse` will ignore such an error and rewind to be after the opening '('.
7387
7388            // Inside the parentheses we expect to find an (A) table factor
7389            // followed by some joins or (B) another level of nesting.
7390            let mut table_and_joins = self.parse_table_and_joins()?;
7391
7392            #[allow(clippy::if_same_then_else)]
7393            if !table_and_joins.joins.is_empty() {
7394                self.expect_token(&Token::RParen)?;
7395                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7396                Ok(TableFactor::NestedJoin {
7397                    table_with_joins: Box::new(table_and_joins),
7398                    alias,
7399                }) // (A)
7400            } else if let TableFactor::NestedJoin {
7401                table_with_joins: _,
7402                alias: _,
7403            } = &table_and_joins.relation
7404            {
7405                // (B): `table_and_joins` (what we found inside the parentheses)
7406                // is a nested join `(foo JOIN bar)`, not followed by other joins.
7407                self.expect_token(&Token::RParen)?;
7408                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7409                Ok(TableFactor::NestedJoin {
7410                    table_with_joins: Box::new(table_and_joins),
7411                    alias,
7412                })
7413            } else if dialect_of!(self is SnowflakeDialect | GenericDialect) {
7414                // Dialect-specific behavior: Snowflake diverges from the
7415                // standard and from most of the other implementations by
7416                // allowing extra parentheses not only around a join (B), but
7417                // around lone table names (e.g. `FROM (mytable [AS alias])`)
7418                // and around derived tables (e.g. `FROM ((SELECT ...)
7419                // [AS alias])`) as well.
7420                self.expect_token(&Token::RParen)?;
7421
7422                if let Some(outer_alias) =
7423                    self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?
7424                {
7425                    // Snowflake also allows specifying an alias *after* parens
7426                    // e.g. `FROM (mytable) AS alias`
7427                    match &mut table_and_joins.relation {
7428                        TableFactor::Derived { alias, .. }
7429                        | TableFactor::Table { alias, .. }
7430                        | TableFactor::Function { alias, .. }
7431                        | TableFactor::UNNEST { alias, .. }
7432                        | TableFactor::JsonTable { alias, .. }
7433                        | TableFactor::TableFunction { alias, .. }
7434                        | TableFactor::Pivot { alias, .. }
7435                        | TableFactor::Unpivot { alias, .. }
7436                        | TableFactor::NestedJoin { alias, .. } => {
7437                            // but not `FROM (mytable AS alias1) AS alias2`.
7438                            if let Some(inner_alias) = alias {
7439                                return Err(ParserError::ParserError(format!(
7440                                    "duplicate alias {inner_alias}"
7441                                )));
7442                            }
7443                            // Act as if the alias was specified normally next
7444                            // to the table name: `(mytable) AS alias` ->
7445                            // `(mytable AS alias)`
7446                            alias.replace(outer_alias);
7447                        }
7448                    };
7449                }
7450                // Do not store the extra set of parens in the AST
7451                Ok(table_and_joins.relation)
7452            } else {
7453                // The SQL spec prohibits derived tables and bare tables from
7454                // appearing alone in parentheses (e.g. `FROM (mytable)`)
7455                self.expected("joined table", self.peek_token())
7456            }
7457        } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
7458            && self.parse_keyword(Keyword::UNNEST)
7459        {
7460            self.expect_token(&Token::LParen)?;
7461            let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
7462            self.expect_token(&Token::RParen)?;
7463
7464            let alias = match self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS) {
7465                Ok(Some(alias)) => Some(alias),
7466                Ok(None) => None,
7467                Err(e) => return Err(e),
7468            };
7469
7470            let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
7471                Ok(()) => true,
7472                Err(_) => false,
7473            };
7474
7475            let with_offset_alias = if with_offset {
7476                match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
7477                    Ok(Some(alias)) => Some(alias),
7478                    Ok(None) => None,
7479                    Err(e) => return Err(e),
7480                }
7481            } else {
7482                None
7483            };
7484
7485            Ok(TableFactor::UNNEST {
7486                alias,
7487                array_exprs,
7488                with_offset,
7489                with_offset_alias,
7490            })
7491        } else if self.parse_keyword(Keyword::JSON_TABLE) {
7492            self.expect_token(&Token::LParen)?;
7493            let json_expr = self.parse_expr()?;
7494            self.expect_token(&Token::Comma)?;
7495            let json_path = self.parse_value()?;
7496            self.expect_keyword(Keyword::COLUMNS)?;
7497            self.expect_token(&Token::LParen)?;
7498            let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
7499            self.expect_token(&Token::RParen)?;
7500            self.expect_token(&Token::RParen)?;
7501            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7502            Ok(TableFactor::JsonTable {
7503                json_expr,
7504                json_path,
7505                columns,
7506                alias,
7507            })
7508        } else {
7509            let name = self.parse_object_name(true)?;
7510
7511            let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
7512                && self.parse_keyword(Keyword::PARTITION)
7513            {
7514                self.parse_partitions()?
7515            } else {
7516                vec![]
7517            };
7518
7519            // Parse potential version qualifier
7520            let version = self.parse_table_version()?;
7521
7522            // Postgres, MSSQL: table-valued functions:
7523            let args = if self.consume_token(&Token::LParen) {
7524                Some(self.parse_optional_args()?)
7525            } else {
7526                None
7527            };
7528
7529            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7530
7531            // MSSQL-specific table hints:
7532            let mut with_hints = vec![];
7533            if self.parse_keyword(Keyword::WITH) {
7534                if self.consume_token(&Token::LParen) {
7535                    with_hints = self.parse_comma_separated(Parser::parse_expr)?;
7536                    self.expect_token(&Token::RParen)?;
7537                } else {
7538                    // rewind, as WITH may belong to the next statement's CTE
7539                    self.prev_token();
7540                }
7541            };
7542
7543            let mut table = TableFactor::Table {
7544                name,
7545                alias,
7546                args,
7547                with_hints,
7548                version,
7549                partitions,
7550            };
7551
7552            while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
7553                table = match kw {
7554                    Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
7555                    Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
7556                    _ => unreachable!(),
7557                }
7558            }
7559
7560            Ok(table)
7561        }
7562    }
7563
7564    /// Parse a given table version specifier.
7565    ///
7566    /// For now it only supports timestamp versioning for BigQuery and MSSQL dialects.
7567    pub fn parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
7568        if dialect_of!(self is BigQueryDialect | MsSqlDialect)
7569            && self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
7570        {
7571            let expr = self.parse_expr()?;
7572            Ok(Some(TableVersion::ForSystemTimeAsOf(expr)))
7573        } else {
7574            Ok(None)
7575        }
7576    }
7577
7578    /// Parses MySQL's JSON_TABLE column definition.
7579    /// For example: `id INT EXISTS PATH '$' DEFAULT '0' ON EMPTY ERROR ON ERROR`
7580    pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
7581        let name = self.parse_identifier(false)?;
7582        let r#type = self.parse_data_type()?;
7583        let exists = self.parse_keyword(Keyword::EXISTS);
7584        self.expect_keyword(Keyword::PATH)?;
7585        let path = self.parse_value()?;
7586        let mut on_empty = None;
7587        let mut on_error = None;
7588        while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
7589            if self.parse_keyword(Keyword::EMPTY) {
7590                on_empty = Some(error_handling);
7591            } else {
7592                self.expect_keyword(Keyword::ERROR)?;
7593                on_error = Some(error_handling);
7594            }
7595        }
7596        Ok(JsonTableColumn {
7597            name,
7598            r#type,
7599            path,
7600            exists,
7601            on_empty,
7602            on_error,
7603        })
7604    }
7605
7606    fn parse_json_table_column_error_handling(
7607        &mut self,
7608    ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
7609        let res = if self.parse_keyword(Keyword::NULL) {
7610            JsonTableColumnErrorHandling::Null
7611        } else if self.parse_keyword(Keyword::ERROR) {
7612            JsonTableColumnErrorHandling::Error
7613        } else if self.parse_keyword(Keyword::DEFAULT) {
7614            JsonTableColumnErrorHandling::Default(self.parse_value()?)
7615        } else {
7616            return Ok(None);
7617        };
7618        self.expect_keyword(Keyword::ON)?;
7619        Ok(Some(res))
7620    }
7621
7622    pub fn parse_derived_table_factor(
7623        &mut self,
7624        lateral: IsLateral,
7625    ) -> Result<TableFactor, ParserError> {
7626        let subquery = Box::new(self.parse_query()?);
7627        self.expect_token(&Token::RParen)?;
7628        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7629        Ok(TableFactor::Derived {
7630            lateral: match lateral {
7631                Lateral => true,
7632                NotLateral => false,
7633            },
7634            subquery,
7635            alias,
7636        })
7637    }
7638
7639    pub fn parse_pivot_table_factor(
7640        &mut self,
7641        table: TableFactor,
7642    ) -> Result<TableFactor, ParserError> {
7643        self.expect_token(&Token::LParen)?;
7644        let function_name = match self.next_token().token {
7645            Token::Word(w) => Ok(w.value),
7646            _ => self.expected("an aggregate function name", self.peek_token()),
7647        }?;
7648        let function = self.parse_function(ObjectName(vec![Ident::new(function_name)]))?;
7649        self.expect_keyword(Keyword::FOR)?;
7650        let value_column = self.parse_object_name(false)?.0;
7651        self.expect_keyword(Keyword::IN)?;
7652        self.expect_token(&Token::LParen)?;
7653        let pivot_values = self.parse_comma_separated(Parser::parse_value)?;
7654        self.expect_token(&Token::RParen)?;
7655        self.expect_token(&Token::RParen)?;
7656        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7657        Ok(TableFactor::Pivot {
7658            table: Box::new(table),
7659            aggregate_function: function,
7660            value_column,
7661            pivot_values,
7662            alias,
7663        })
7664    }
7665
7666    pub fn parse_unpivot_table_factor(
7667        &mut self,
7668        table: TableFactor,
7669    ) -> Result<TableFactor, ParserError> {
7670        self.expect_token(&Token::LParen)?;
7671        let value = self.parse_identifier(false)?;
7672        self.expect_keyword(Keyword::FOR)?;
7673        let name = self.parse_identifier(false)?;
7674        self.expect_keyword(Keyword::IN)?;
7675        let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
7676        self.expect_token(&Token::RParen)?;
7677        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7678        Ok(TableFactor::Unpivot {
7679            table: Box::new(table),
7680            value,
7681            name,
7682            columns,
7683            alias,
7684        })
7685    }
7686
7687    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
7688        if natural {
7689            Ok(JoinConstraint::Natural)
7690        } else if self.parse_keyword(Keyword::ON) {
7691            let constraint = self.parse_expr()?;
7692            Ok(JoinConstraint::On(constraint))
7693        } else if self.parse_keyword(Keyword::USING) {
7694            let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
7695            Ok(JoinConstraint::Using(columns))
7696        } else {
7697            Ok(JoinConstraint::None)
7698            //self.expected("ON, or USING after JOIN", self.peek_token())
7699        }
7700    }
7701
7702    /// Parse a GRANT statement.
7703    pub fn parse_grant(&mut self) -> Result<Statement, ParserError> {
7704        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
7705
7706        self.expect_keyword(Keyword::TO)?;
7707        let grantees = self.parse_comma_separated(|p| p.parse_identifier(false))?;
7708
7709        let with_grant_option =
7710            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
7711
7712        let granted_by = self
7713            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
7714            .then(|| self.parse_identifier(false).unwrap());
7715
7716        Ok(Statement::Grant {
7717            privileges,
7718            objects,
7719            grantees,
7720            with_grant_option,
7721            granted_by,
7722        })
7723    }
7724
7725    pub fn parse_grant_revoke_privileges_objects(
7726        &mut self,
7727    ) -> Result<(Privileges, GrantObjects), ParserError> {
7728        let privileges = if self.parse_keyword(Keyword::ALL) {
7729            Privileges::All {
7730                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
7731            }
7732        } else {
7733            let (actions, err): (Vec<_>, Vec<_>) = self
7734                .parse_comma_separated(Parser::parse_grant_permission)?
7735                .into_iter()
7736                .map(|(kw, columns)| match kw {
7737                    Keyword::DELETE => Ok(Action::Delete),
7738                    Keyword::INSERT => Ok(Action::Insert { columns }),
7739                    Keyword::REFERENCES => Ok(Action::References { columns }),
7740                    Keyword::SELECT => Ok(Action::Select { columns }),
7741                    Keyword::TRIGGER => Ok(Action::Trigger),
7742                    Keyword::TRUNCATE => Ok(Action::Truncate),
7743                    Keyword::UPDATE => Ok(Action::Update { columns }),
7744                    Keyword::USAGE => Ok(Action::Usage),
7745                    Keyword::CONNECT => Ok(Action::Connect),
7746                    Keyword::CREATE => Ok(Action::Create),
7747                    Keyword::EXECUTE => Ok(Action::Execute),
7748                    Keyword::TEMPORARY => Ok(Action::Temporary),
7749                    // This will cover all future added keywords to
7750                    // parse_grant_permission and unhandled in this
7751                    // match
7752                    _ => Err(kw),
7753                })
7754                .partition(Result::is_ok);
7755
7756            if !err.is_empty() {
7757                let errors: Vec<Keyword> = err.into_iter().filter_map(|x| x.err()).collect();
7758                return Err(ParserError::ParserError(format!(
7759                    "INTERNAL ERROR: GRANT/REVOKE unexpected keyword(s) - {errors:?}"
7760                )));
7761            }
7762            let act = actions.into_iter().filter_map(|x| x.ok()).collect();
7763            Privileges::Actions(act)
7764        };
7765
7766        self.expect_keyword(Keyword::ON)?;
7767
7768        let objects = if self.parse_keywords(&[
7769            Keyword::ALL,
7770            Keyword::TABLES,
7771            Keyword::IN,
7772            Keyword::SCHEMA,
7773        ]) {
7774            GrantObjects::AllTablesInSchema {
7775                schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
7776            }
7777        } else if self.parse_keywords(&[
7778            Keyword::ALL,
7779            Keyword::SEQUENCES,
7780            Keyword::IN,
7781            Keyword::SCHEMA,
7782        ]) {
7783            GrantObjects::AllSequencesInSchema {
7784                schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
7785            }
7786        } else {
7787            let object_type =
7788                self.parse_one_of_keywords(&[Keyword::SEQUENCE, Keyword::SCHEMA, Keyword::TABLE]);
7789            let objects = self.parse_comma_separated(|p| p.parse_object_name(false));
7790            match object_type {
7791                Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
7792                Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
7793                Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
7794                _ => unreachable!(),
7795            }
7796        };
7797
7798        Ok((privileges, objects))
7799    }
7800
7801    pub fn parse_grant_permission(&mut self) -> Result<(Keyword, Option<Vec<Ident>>), ParserError> {
7802        if let Some(kw) = self.parse_one_of_keywords(&[
7803            Keyword::CONNECT,
7804            Keyword::CREATE,
7805            Keyword::DELETE,
7806            Keyword::EXECUTE,
7807            Keyword::INSERT,
7808            Keyword::REFERENCES,
7809            Keyword::SELECT,
7810            Keyword::TEMPORARY,
7811            Keyword::TRIGGER,
7812            Keyword::TRUNCATE,
7813            Keyword::UPDATE,
7814            Keyword::USAGE,
7815        ]) {
7816            let columns = match kw {
7817                Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
7818                    let columns = self.parse_parenthesized_column_list(Optional, false)?;
7819                    if columns.is_empty() {
7820                        None
7821                    } else {
7822                        Some(columns)
7823                    }
7824                }
7825                _ => None,
7826            };
7827            Ok((kw, columns))
7828        } else {
7829            self.expected("a privilege keyword", self.peek_token())?
7830        }
7831    }
7832
7833    /// Parse a REVOKE statement
7834    pub fn parse_revoke(&mut self) -> Result<Statement, ParserError> {
7835        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
7836
7837        self.expect_keyword(Keyword::FROM)?;
7838        let grantees = self.parse_comma_separated(|p| p.parse_identifier(false))?;
7839
7840        let granted_by = self
7841            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
7842            .then(|| self.parse_identifier(false).unwrap());
7843
7844        let loc = self.peek_token().location;
7845        let cascade = self.parse_keyword(Keyword::CASCADE);
7846        let restrict = self.parse_keyword(Keyword::RESTRICT);
7847        if cascade && restrict {
7848            return parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE", loc);
7849        }
7850
7851        Ok(Statement::Revoke {
7852            privileges,
7853            objects,
7854            grantees,
7855            granted_by,
7856            cascade,
7857        })
7858    }
7859
7860    /// Parse an REPLACE statement
7861    pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
7862        if !dialect_of!(self is MySqlDialect | GenericDialect) {
7863            return parser_err!("Unsupported statement REPLACE", self.peek_token().location);
7864        }
7865
7866        let insert = &mut self.parse_insert().unwrap();
7867        if let Statement::Insert { replace_into, .. } = insert {
7868            *replace_into = true;
7869        }
7870
7871        Ok(insert.clone())
7872    }
7873
7874    /// Parse an INSERT statement
7875    pub fn parse_insert(&mut self) -> Result<Statement, ParserError> {
7876        let or = if !dialect_of!(self is SQLiteDialect) {
7877            None
7878        } else if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
7879            Some(SqliteOnConflict::Replace)
7880        } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
7881            Some(SqliteOnConflict::Rollback)
7882        } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
7883            Some(SqliteOnConflict::Abort)
7884        } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
7885            Some(SqliteOnConflict::Fail)
7886        } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
7887            Some(SqliteOnConflict::Ignore)
7888        } else if self.parse_keyword(Keyword::REPLACE) {
7889            Some(SqliteOnConflict::Replace)
7890        } else {
7891            None
7892        };
7893
7894        let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
7895            None
7896        } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
7897            Some(MysqlInsertPriority::LowPriority)
7898        } else if self.parse_keyword(Keyword::DELAYED) {
7899            Some(MysqlInsertPriority::Delayed)
7900        } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
7901            Some(MysqlInsertPriority::HighPriority)
7902        } else {
7903            None
7904        };
7905
7906        let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
7907            && self.parse_keyword(Keyword::IGNORE);
7908
7909        let replace_into = false;
7910
7911        let action = self.parse_one_of_keywords(&[Keyword::INTO, Keyword::OVERWRITE]);
7912        let into = action == Some(Keyword::INTO);
7913        let overwrite = action == Some(Keyword::OVERWRITE);
7914
7915        let local = self.parse_keyword(Keyword::LOCAL);
7916
7917        if self.parse_keyword(Keyword::DIRECTORY) {
7918            let path = self.parse_literal_string()?;
7919            let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
7920                Some(self.parse_file_format()?)
7921            } else {
7922                None
7923            };
7924            let source = Box::new(self.parse_query()?);
7925            Ok(Statement::Directory {
7926                local,
7927                path,
7928                overwrite,
7929                file_format,
7930                source,
7931            })
7932        } else {
7933            // Hive lets you put table here regardless
7934            let table = self.parse_keyword(Keyword::TABLE);
7935            let table_name = self.parse_object_name(false)?;
7936
7937            let table_alias =
7938                if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::AS) {
7939                    Some(self.parse_identifier(false)?)
7940                } else {
7941                    None
7942                };
7943
7944            let is_mysql = dialect_of!(self is MySqlDialect);
7945
7946            let (columns, partitioned, after_columns, source) =
7947                if self.parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES]) {
7948                    (vec![], None, vec![], None)
7949                } else {
7950                    let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
7951
7952                    let partitioned = self.parse_insert_partition()?;
7953
7954                    // Hive allows you to specify columns after partitions as well if you want.
7955                    let after_columns = self.parse_parenthesized_column_list(Optional, false)?;
7956
7957                    let source = Some(Box::new(self.parse_query()?));
7958
7959                    (columns, partitioned, after_columns, source)
7960                };
7961
7962            let (as_table, as_table_after_columns) = if dialect_of!(self is MySqlDialect | GenericDialect)
7963                && self.parse_keyword(Keyword::AS)
7964            {
7965                let as_table = Some(self.parse_object_name(false)?);
7966                let as_table_after_columns =
7967                    self.parse_parenthesized_column_list(Optional, false)?;
7968                (as_table, as_table_after_columns)
7969            } else {
7970                (None, vec![])
7971            };
7972
7973            let on = if self.parse_keyword(Keyword::ON) {
7974                if self.parse_keyword(Keyword::CONFLICT) {
7975                    let conflict_target =
7976                        if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
7977                            Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
7978                        } else if self.peek_token() == Token::LParen {
7979                            Some(ConflictTarget::Columns(
7980                                self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
7981                            ))
7982                        } else {
7983                            None
7984                        };
7985
7986                    self.expect_keyword(Keyword::DO)?;
7987                    let action = if self.parse_keyword(Keyword::NOTHING) {
7988                        OnConflictAction::DoNothing
7989                    } else {
7990                        self.expect_keyword(Keyword::UPDATE)?;
7991                        self.expect_keyword(Keyword::SET)?;
7992                        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
7993                        let selection = if self.parse_keyword(Keyword::WHERE) {
7994                            Some(self.parse_expr()?)
7995                        } else {
7996                            None
7997                        };
7998                        OnConflictAction::DoUpdate(DoUpdate {
7999                            assignments,
8000                            selection,
8001                        })
8002                    };
8003
8004                    Some(OnInsert::OnConflict(OnConflict {
8005                        conflict_target,
8006                        action,
8007                    }))
8008                } else {
8009                    self.expect_keyword(Keyword::DUPLICATE)?;
8010                    self.expect_keyword(Keyword::KEY)?;
8011                    self.expect_keyword(Keyword::UPDATE)?;
8012                    let l = self.parse_comma_separated(Parser::parse_assignment)?;
8013
8014                    Some(OnInsert::DuplicateKeyUpdate(l))
8015                }
8016            } else {
8017                None
8018            };
8019
8020            let returning = if self.parse_keyword(Keyword::RETURNING) {
8021                Some(self.parse_comma_separated(Parser::parse_select_item)?)
8022            } else {
8023                None
8024            };
8025
8026            Ok(Statement::Insert {
8027                or,
8028                table_name,
8029                table_alias,
8030                ignore,
8031                into,
8032                overwrite,
8033                partitioned,
8034                columns,
8035                after_columns,
8036                source,
8037                table,
8038                as_table,
8039                as_table_after_columns,
8040                on,
8041                returning,
8042                replace_into,
8043                priority,
8044            })
8045        }
8046    }
8047
8048    pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
8049        if self.parse_keyword(Keyword::PARTITION) {
8050            self.expect_token(&Token::LParen)?;
8051            let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
8052            self.expect_token(&Token::RParen)?;
8053            Ok(partition_cols)
8054        } else {
8055            Ok(None)
8056        }
8057    }
8058
8059    pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
8060        let table = self.parse_table_and_joins()?;
8061        self.expect_keyword(Keyword::SET)?;
8062        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8063        let from = if self.parse_keyword(Keyword::FROM)
8064            && dialect_of!(self is GenericDialect | PostgreSqlDialect | DuckDbDialect | BigQueryDialect | SnowflakeDialect | RedshiftSqlDialect | MsSqlDialect)
8065        {
8066            Some(self.parse_table_and_joins()?)
8067        } else {
8068            None
8069        };
8070        let selection = if self.parse_keyword(Keyword::WHERE) {
8071            Some(self.parse_expr()?)
8072        } else {
8073            None
8074        };
8075        let returning = if self.parse_keyword(Keyword::RETURNING) {
8076            Some(self.parse_comma_separated(Parser::parse_select_item)?)
8077        } else {
8078            None
8079        };
8080        Ok(Statement::Update {
8081            table,
8082            assignments,
8083            from,
8084            selection,
8085            returning,
8086        })
8087    }
8088
8089    /// Parse a `var = expr` assignment, used in an UPDATE statement
8090    pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
8091        let id = self.parse_identifiers()?;
8092        self.expect_token(&Token::Eq)?;
8093        let value = self.parse_expr()?;
8094        Ok(Assignment { id, value })
8095    }
8096
8097    pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
8098        if self.peek_nth_token(1) == Token::RArrow {
8099            let name = self.parse_identifier(false)?;
8100
8101            self.expect_token(&Token::RArrow)?;
8102            let arg = self.parse_wildcard_expr()?.into();
8103
8104            Ok(FunctionArg::Named { name, arg })
8105        } else {
8106            Ok(FunctionArg::Unnamed(self.parse_wildcard_expr()?.into()))
8107        }
8108    }
8109
8110    pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
8111        if self.consume_token(&Token::RParen) {
8112            Ok(vec![])
8113        } else {
8114            let args = self.parse_comma_separated(Parser::parse_function_args)?;
8115            self.expect_token(&Token::RParen)?;
8116            Ok(args)
8117        }
8118    }
8119
8120    pub fn parse_optional_args_with_orderby(
8121        &mut self,
8122    ) -> Result<(Vec<FunctionArg>, Vec<OrderByExpr>), ParserError> {
8123        if self.consume_token(&Token::RParen) {
8124            Ok((vec![], vec![]))
8125        } else {
8126            // Snowflake permits a subquery to be passed as an argument without
8127            // an enclosing set of parens if it's the only argument.
8128            if dialect_of!(self is SnowflakeDialect)
8129                && self
8130                    .parse_one_of_keywords(&[Keyword::WITH, Keyword::SELECT])
8131                    .is_some()
8132            {
8133                self.prev_token();
8134                let subquery = self.parse_query()?;
8135                self.expect_token(&Token::RParen)?;
8136                return Ok((
8137                    vec![FunctionArg::Unnamed(FunctionArgExpr::from(Expr::Subquery(
8138                        Box::new(subquery),
8139                    )))],
8140                    vec![],
8141                ));
8142            }
8143
8144            let args = self.parse_comma_separated(Parser::parse_function_args)?;
8145            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8146                self.parse_comma_separated(Parser::parse_order_by_expr)?
8147            } else {
8148                vec![]
8149            };
8150            self.expect_token(&Token::RParen)?;
8151            Ok((args, order_by))
8152        }
8153    }
8154
8155    /// Parse a comma-delimited list of projections after SELECT
8156    pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
8157        match self.parse_wildcard_expr()? {
8158            Expr::QualifiedWildcard(prefix) => Ok(SelectItem::QualifiedWildcard(
8159                prefix,
8160                self.parse_wildcard_additional_options()?,
8161            )),
8162            Expr::Wildcard => Ok(SelectItem::Wildcard(
8163                self.parse_wildcard_additional_options()?,
8164            )),
8165            expr => {
8166                let expr: Expr = if self.dialect.supports_filter_during_aggregation()
8167                    && self.parse_keyword(Keyword::FILTER)
8168                {
8169                    let i = self.index - 1;
8170                    if self.consume_token(&Token::LParen) && self.parse_keyword(Keyword::WHERE) {
8171                        let filter = self.parse_expr()?;
8172                        self.expect_token(&Token::RParen)?;
8173                        Expr::AggregateExpressionWithFilter {
8174                            expr: Box::new(expr),
8175                            filter: Box::new(filter),
8176                        }
8177                    } else {
8178                        self.index = i;
8179                        expr
8180                    }
8181                } else {
8182                    expr
8183                };
8184                self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
8185                    .map(|alias| match alias {
8186                        Some(alias) => SelectItem::ExprWithAlias { expr, alias },
8187                        None => SelectItem::UnnamedExpr(expr),
8188                    })
8189            }
8190        }
8191    }
8192
8193    /// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
8194    ///
8195    /// If it is not possible to parse it, will return an option.
8196    pub fn parse_wildcard_additional_options(
8197        &mut self,
8198    ) -> Result<WildcardAdditionalOptions, ParserError> {
8199        let opt_exclude = if dialect_of!(self is GenericDialect | DuckDbDialect | SnowflakeDialect)
8200        {
8201            self.parse_optional_select_item_exclude()?
8202        } else {
8203            None
8204        };
8205        let opt_except = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect)
8206        {
8207            self.parse_optional_select_item_except()?
8208        } else {
8209            None
8210        };
8211        let opt_rename = if dialect_of!(self is GenericDialect | SnowflakeDialect) {
8212            self.parse_optional_select_item_rename()?
8213        } else {
8214            None
8215        };
8216
8217        let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect)
8218        {
8219            self.parse_optional_select_item_replace()?
8220        } else {
8221            None
8222        };
8223
8224        Ok(WildcardAdditionalOptions {
8225            opt_exclude,
8226            opt_except,
8227            opt_rename,
8228            opt_replace,
8229        })
8230    }
8231
8232    /// Parse an [`Exclude`](ExcludeSelectItem) information for wildcard select items.
8233    ///
8234    /// If it is not possible to parse it, will return an option.
8235    pub fn parse_optional_select_item_exclude(
8236        &mut self,
8237    ) -> Result<Option<ExcludeSelectItem>, ParserError> {
8238        let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
8239            if self.consume_token(&Token::LParen) {
8240                let columns =
8241                    self.parse_comma_separated(|parser| parser.parse_identifier(false))?;
8242                self.expect_token(&Token::RParen)?;
8243                Some(ExcludeSelectItem::Multiple(columns))
8244            } else {
8245                let column = self.parse_identifier(false)?;
8246                Some(ExcludeSelectItem::Single(column))
8247            }
8248        } else {
8249            None
8250        };
8251
8252        Ok(opt_exclude)
8253    }
8254
8255    /// Parse an [`Except`](ExceptSelectItem) information for wildcard select items.
8256    ///
8257    /// If it is not possible to parse it, will return an option.
8258    pub fn parse_optional_select_item_except(
8259        &mut self,
8260    ) -> Result<Option<ExceptSelectItem>, ParserError> {
8261        let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
8262            if self.peek_token().token == Token::LParen {
8263                let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
8264                match &idents[..] {
8265                    [] => {
8266                        return self.expected(
8267                            "at least one column should be parsed by the expect clause",
8268                            self.peek_token(),
8269                        )?;
8270                    }
8271                    [first, idents @ ..] => Some(ExceptSelectItem {
8272                        first_element: first.clone(),
8273                        additional_elements: idents.to_vec(),
8274                    }),
8275                }
8276            } else {
8277                // Clickhouse allows EXCEPT column_name
8278                let ident = self.parse_identifier(false)?;
8279                Some(ExceptSelectItem {
8280                    first_element: ident,
8281                    additional_elements: vec![],
8282                })
8283            }
8284        } else {
8285            None
8286        };
8287
8288        Ok(opt_except)
8289    }
8290
8291    /// Parse a [`Rename`](RenameSelectItem) information for wildcard select items.
8292    pub fn parse_optional_select_item_rename(
8293        &mut self,
8294    ) -> Result<Option<RenameSelectItem>, ParserError> {
8295        let opt_rename = if self.parse_keyword(Keyword::RENAME) {
8296            if self.consume_token(&Token::LParen) {
8297                let idents =
8298                    self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
8299                self.expect_token(&Token::RParen)?;
8300                Some(RenameSelectItem::Multiple(idents))
8301            } else {
8302                let ident = self.parse_identifier_with_alias()?;
8303                Some(RenameSelectItem::Single(ident))
8304            }
8305        } else {
8306            None
8307        };
8308
8309        Ok(opt_rename)
8310    }
8311
8312    /// Parse a [`Replace`](ReplaceSelectItem) information for wildcard select items.
8313    pub fn parse_optional_select_item_replace(
8314        &mut self,
8315    ) -> Result<Option<ReplaceSelectItem>, ParserError> {
8316        let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
8317            if self.consume_token(&Token::LParen) {
8318                let items = self.parse_comma_separated(|parser| {
8319                    Ok(Box::new(parser.parse_replace_elements()?))
8320                })?;
8321                self.expect_token(&Token::RParen)?;
8322                Some(ReplaceSelectItem { items })
8323            } else {
8324                let tok = self.next_token();
8325                return self.expected("( after REPLACE but", tok);
8326            }
8327        } else {
8328            None
8329        };
8330
8331        Ok(opt_replace)
8332    }
8333    pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
8334        let expr = self.parse_expr()?;
8335        let as_keyword = self.parse_keyword(Keyword::AS);
8336        let ident = self.parse_identifier(false)?;
8337        Ok(ReplaceSelectElement {
8338            expr,
8339            column_name: ident,
8340            as_keyword,
8341        })
8342    }
8343
8344    /// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
8345    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
8346        let expr = self.parse_expr()?;
8347
8348        let asc = if self.parse_keyword(Keyword::ASC) {
8349            Some(true)
8350        } else if self.parse_keyword(Keyword::DESC) {
8351            Some(false)
8352        } else {
8353            None
8354        };
8355
8356        let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
8357            Some(true)
8358        } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
8359            Some(false)
8360        } else {
8361            None
8362        };
8363
8364        Ok(OrderByExpr {
8365            expr,
8366            asc,
8367            nulls_first,
8368        })
8369    }
8370
8371    /// Parse a TOP clause, MSSQL equivalent of LIMIT,
8372    /// that follows after `SELECT [DISTINCT]`.
8373    pub fn parse_top(&mut self) -> Result<Top, ParserError> {
8374        let quantity = if self.consume_token(&Token::LParen) {
8375            let quantity = self.parse_expr()?;
8376            self.expect_token(&Token::RParen)?;
8377            Some(TopQuantity::Expr(quantity))
8378        } else {
8379            let next_token = self.next_token();
8380            let quantity = match next_token.token {
8381                Token::Number(s, _) => s.parse::<u64>().expect("literal int"),
8382                _ => self.expected("literal int", next_token)?,
8383            };
8384            Some(TopQuantity::Constant(quantity))
8385        };
8386
8387        let percent = self.parse_keyword(Keyword::PERCENT);
8388
8389        let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
8390
8391        Ok(Top {
8392            with_ties,
8393            percent,
8394            quantity,
8395        })
8396    }
8397
8398    /// Parse a LIMIT clause
8399    pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
8400        if self.parse_keyword(Keyword::ALL) {
8401            Ok(None)
8402        } else {
8403            Ok(Some(self.parse_expr()?))
8404        }
8405    }
8406
8407    /// Parse an OFFSET clause
8408    pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
8409        let value = self.parse_expr()?;
8410        let rows = if self.parse_keyword(Keyword::ROW) {
8411            OffsetRows::Row
8412        } else if self.parse_keyword(Keyword::ROWS) {
8413            OffsetRows::Rows
8414        } else {
8415            OffsetRows::None
8416        };
8417        Ok(Offset { value, rows })
8418    }
8419
8420    /// Parse a FETCH clause
8421    pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
8422        self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
8423        let (quantity, percent) = if self
8424            .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
8425            .is_some()
8426        {
8427            (None, false)
8428        } else {
8429            let quantity = Expr::Value(self.parse_value()?);
8430            let percent = self.parse_keyword(Keyword::PERCENT);
8431            self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
8432            (Some(quantity), percent)
8433        };
8434        let with_ties = if self.parse_keyword(Keyword::ONLY) {
8435            false
8436        } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
8437            true
8438        } else {
8439            return self.expected("one of ONLY or WITH TIES", self.peek_token());
8440        };
8441        Ok(Fetch {
8442            with_ties,
8443            percent,
8444            quantity,
8445        })
8446    }
8447
8448    /// Parse a FOR UPDATE/FOR SHARE clause
8449    pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
8450        let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
8451            Keyword::UPDATE => LockType::Update,
8452            Keyword::SHARE => LockType::Share,
8453            _ => unreachable!(),
8454        };
8455        let of = if self.parse_keyword(Keyword::OF) {
8456            Some(self.parse_object_name(false)?)
8457        } else {
8458            None
8459        };
8460        let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
8461            Some(NonBlock::Nowait)
8462        } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
8463            Some(NonBlock::SkipLocked)
8464        } else {
8465            None
8466        };
8467        Ok(LockClause {
8468            lock_type,
8469            of,
8470            nonblock,
8471        })
8472    }
8473
8474    pub fn parse_values(&mut self, allow_empty: bool) -> Result<Values, ParserError> {
8475        let mut explicit_row = false;
8476
8477        let rows = self.parse_comma_separated(|parser| {
8478            if parser.parse_keyword(Keyword::ROW) {
8479                explicit_row = true;
8480            }
8481
8482            parser.expect_token(&Token::LParen)?;
8483            if allow_empty && parser.peek_token().token == Token::RParen {
8484                parser.next_token();
8485                Ok(vec![])
8486            } else {
8487                let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8488                parser.expect_token(&Token::RParen)?;
8489                Ok(exprs)
8490            }
8491        })?;
8492        Ok(Values { explicit_row, rows })
8493    }
8494
8495    pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
8496        self.expect_keyword(Keyword::TRANSACTION)?;
8497        Ok(Statement::StartTransaction {
8498            modes: self.parse_transaction_modes()?,
8499            begin: false,
8500            modifier: None,
8501        })
8502    }
8503
8504    pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
8505        let modifier = if !self.dialect.supports_start_transaction_modifier() {
8506            None
8507        } else if self.parse_keyword(Keyword::DEFERRED) {
8508            Some(TransactionModifier::Deferred)
8509        } else if self.parse_keyword(Keyword::IMMEDIATE) {
8510            Some(TransactionModifier::Immediate)
8511        } else if self.parse_keyword(Keyword::EXCLUSIVE) {
8512            Some(TransactionModifier::Exclusive)
8513        } else {
8514            None
8515        };
8516        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
8517        Ok(Statement::StartTransaction {
8518            modes: self.parse_transaction_modes()?,
8519            begin: true,
8520            modifier,
8521        })
8522    }
8523
8524    pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
8525        Ok(Statement::Commit {
8526            chain: self.parse_commit_rollback_chain()?,
8527        })
8528    }
8529
8530    pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
8531        let mut modes = vec![];
8532        let mut required = false;
8533        loop {
8534            let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
8535                let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
8536                    TransactionIsolationLevel::ReadUncommitted
8537                } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
8538                    TransactionIsolationLevel::ReadCommitted
8539                } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
8540                    TransactionIsolationLevel::RepeatableRead
8541                } else if self.parse_keyword(Keyword::SERIALIZABLE) {
8542                    TransactionIsolationLevel::Serializable
8543                } else {
8544                    self.expected("isolation level", self.peek_token())?
8545                };
8546                TransactionMode::IsolationLevel(iso_level)
8547            } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
8548                TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8549            } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
8550                TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8551            } else if required {
8552                self.expected("transaction mode", self.peek_token())?
8553            } else {
8554                break;
8555            };
8556            modes.push(mode);
8557            // ANSI requires a comma after each transaction mode, but
8558            // PostgreSQL, for historical reasons, does not. We follow
8559            // PostgreSQL in making the comma optional, since that is strictly
8560            // more general.
8561            required = self.consume_token(&Token::Comma);
8562        }
8563        Ok(modes)
8564    }
8565
8566    pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
8567        Ok(Statement::Commit {
8568            chain: self.parse_commit_rollback_chain()?,
8569        })
8570    }
8571
8572    pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
8573        let chain = self.parse_commit_rollback_chain()?;
8574        let savepoint = self.parse_rollback_savepoint()?;
8575
8576        Ok(Statement::Rollback { chain, savepoint })
8577    }
8578
8579    pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8580        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
8581        if self.parse_keyword(Keyword::AND) {
8582            let chain = !self.parse_keyword(Keyword::NO);
8583            self.expect_keyword(Keyword::CHAIN)?;
8584            Ok(chain)
8585        } else {
8586            Ok(false)
8587        }
8588    }
8589
8590    pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
8591        if self.parse_keyword(Keyword::TO) {
8592            let _ = self.parse_keyword(Keyword::SAVEPOINT);
8593            let savepoint = self.parse_identifier(false)?;
8594
8595            Ok(Some(savepoint))
8596        } else {
8597            Ok(None)
8598        }
8599    }
8600
8601    pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
8602        let prepare = self.parse_keyword(Keyword::PREPARE);
8603        let name = self.parse_identifier(false)?;
8604        Ok(Statement::Deallocate { name, prepare })
8605    }
8606
8607    pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
8608        let name = self.parse_identifier(false)?;
8609
8610        let mut parameters = vec![];
8611        if self.consume_token(&Token::LParen) {
8612            parameters = self.parse_comma_separated(Parser::parse_expr)?;
8613            self.expect_token(&Token::RParen)?;
8614        }
8615
8616        Ok(Statement::Execute { name, parameters })
8617    }
8618
8619    pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
8620        let name = self.parse_identifier(false)?;
8621
8622        let mut data_types = vec![];
8623        if self.consume_token(&Token::LParen) {
8624            data_types = self.parse_comma_separated(Parser::parse_data_type)?;
8625            self.expect_token(&Token::RParen)?;
8626        }
8627
8628        self.expect_keyword(Keyword::AS)?;
8629        let statement = Box::new(self.parse_statement()?);
8630        Ok(Statement::Prepare {
8631            name,
8632            data_types,
8633            statement,
8634        })
8635    }
8636
8637    pub fn parse_merge_clauses(&mut self) -> Result<Vec<MergeClause>, ParserError> {
8638        let mut clauses: Vec<MergeClause> = vec![];
8639        loop {
8640            if self.peek_token() == Token::EOF || self.peek_token() == Token::SemiColon {
8641                break;
8642            }
8643            self.expect_keyword(Keyword::WHEN)?;
8644
8645            let is_not_matched = self.parse_keyword(Keyword::NOT);
8646            self.expect_keyword(Keyword::MATCHED)?;
8647
8648            let predicate = if self.parse_keyword(Keyword::AND) {
8649                Some(self.parse_expr()?)
8650            } else {
8651                None
8652            };
8653
8654            self.expect_keyword(Keyword::THEN)?;
8655
8656            clauses.push(
8657                match self.parse_one_of_keywords(&[
8658                    Keyword::UPDATE,
8659                    Keyword::INSERT,
8660                    Keyword::DELETE,
8661                ]) {
8662                    Some(Keyword::UPDATE) => {
8663                        if is_not_matched {
8664                            return Err(ParserError::ParserError(
8665                                "UPDATE in NOT MATCHED merge clause".to_string(),
8666                            ));
8667                        }
8668                        self.expect_keyword(Keyword::SET)?;
8669                        let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8670                        MergeClause::MatchedUpdate {
8671                            predicate,
8672                            assignments,
8673                        }
8674                    }
8675                    Some(Keyword::DELETE) => {
8676                        if is_not_matched {
8677                            return Err(ParserError::ParserError(
8678                                "DELETE in NOT MATCHED merge clause".to_string(),
8679                            ));
8680                        }
8681                        MergeClause::MatchedDelete(predicate)
8682                    }
8683                    Some(Keyword::INSERT) => {
8684                        if !is_not_matched {
8685                            return Err(ParserError::ParserError(
8686                                "INSERT in MATCHED merge clause".to_string(),
8687                            ));
8688                        }
8689                        let is_mysql = dialect_of!(self is MySqlDialect);
8690                        let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
8691                        self.expect_keyword(Keyword::VALUES)?;
8692                        let values = self.parse_values(is_mysql)?;
8693                        MergeClause::NotMatched {
8694                            predicate,
8695                            columns,
8696                            values,
8697                        }
8698                    }
8699                    Some(_) => {
8700                        return Err(ParserError::ParserError(
8701                            "expected UPDATE, DELETE or INSERT in merge clause".to_string(),
8702                        ));
8703                    }
8704                    None => {
8705                        return Err(ParserError::ParserError(
8706                            "expected UPDATE, DELETE or INSERT in merge clause".to_string(),
8707                        ));
8708                    }
8709                },
8710            );
8711        }
8712        Ok(clauses)
8713    }
8714
8715    pub fn parse_merge(&mut self) -> Result<Statement, ParserError> {
8716        let into = self.parse_keyword(Keyword::INTO);
8717
8718        let table = self.parse_table_factor()?;
8719
8720        self.expect_keyword(Keyword::USING)?;
8721        let source = self.parse_table_factor()?;
8722        self.expect_keyword(Keyword::ON)?;
8723        let on = self.parse_expr()?;
8724        let clauses = self.parse_merge_clauses()?;
8725
8726        Ok(Statement::Merge {
8727            into,
8728            table,
8729            source,
8730            on: Box::new(on),
8731            clauses,
8732        })
8733    }
8734
8735    fn parse_pragma_value(&mut self) -> Result<Value, ParserError> {
8736        match self.parse_value()? {
8737            v @ Value::SingleQuotedString(_) => Ok(v),
8738            v @ Value::DoubleQuotedString(_) => Ok(v),
8739            v @ Value::Number(_, _) => Ok(v),
8740            v @ Value::Placeholder(_) => Ok(v),
8741            _ => {
8742                self.prev_token();
8743                self.expected("number or string or ? placeholder", self.peek_token())
8744            }
8745        }
8746    }
8747
8748    // PRAGMA [schema-name '.'] pragma-name [('=' pragma-value) | '(' pragma-value ')']
8749    pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
8750        let name = self.parse_object_name(false)?;
8751        if self.consume_token(&Token::LParen) {
8752            let value = self.parse_pragma_value()?;
8753            self.expect_token(&Token::RParen)?;
8754            Ok(Statement::Pragma {
8755                name,
8756                value: Some(value),
8757                is_eq: false,
8758            })
8759        } else if self.consume_token(&Token::Eq) {
8760            Ok(Statement::Pragma {
8761                name,
8762                value: Some(self.parse_pragma_value()?),
8763                is_eq: true,
8764            })
8765        } else {
8766            Ok(Statement::Pragma {
8767                name,
8768                value: None,
8769                is_eq: false,
8770            })
8771        }
8772    }
8773
8774    /// ```sql
8775    /// CREATE [ { TEMPORARY | TEMP } ] SEQUENCE [ IF NOT EXISTS ] <sequence_name>
8776    /// ```
8777    ///
8778    /// See [Postgres docs](https://www.postgresql.org/docs/current/sql-createsequence.html) for more details.
8779    pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
8780        //[ IF NOT EXISTS ]
8781        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8782        //name
8783        let name = self.parse_object_name(false)?;
8784        //[ AS data_type ]
8785        let mut data_type: Option<DataType> = None;
8786        if self.parse_keywords(&[Keyword::AS]) {
8787            data_type = Some(self.parse_data_type()?)
8788        }
8789        let sequence_options = self.parse_create_sequence_options()?;
8790        // [ OWNED BY { table_name.column_name | NONE } ]
8791        let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
8792            if self.parse_keywords(&[Keyword::NONE]) {
8793                Some(ObjectName(vec![Ident::new("NONE")]))
8794            } else {
8795                Some(self.parse_object_name(false)?)
8796            }
8797        } else {
8798            None
8799        };
8800        Ok(Statement::CreateSequence {
8801            temporary,
8802            if_not_exists,
8803            name,
8804            data_type,
8805            sequence_options,
8806            owned_by,
8807        })
8808    }
8809
8810    fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
8811        let mut sequence_options = vec![];
8812        //[ INCREMENT [ BY ] increment ]
8813        if self.parse_keywords(&[Keyword::INCREMENT]) {
8814            if self.parse_keywords(&[Keyword::BY]) {
8815                sequence_options.push(SequenceOptions::IncrementBy(
8816                    Expr::Value(self.parse_number_value()?),
8817                    true,
8818                ));
8819            } else {
8820                sequence_options.push(SequenceOptions::IncrementBy(
8821                    Expr::Value(self.parse_number_value()?),
8822                    false,
8823                ));
8824            }
8825        }
8826        //[ MINVALUE minvalue | NO MINVALUE ]
8827        if self.parse_keyword(Keyword::MINVALUE) {
8828            sequence_options.push(SequenceOptions::MinValue(Some(Expr::Value(
8829                self.parse_number_value()?,
8830            ))));
8831        } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
8832            sequence_options.push(SequenceOptions::MinValue(None));
8833        }
8834        //[ MAXVALUE maxvalue | NO MAXVALUE ]
8835        if self.parse_keywords(&[Keyword::MAXVALUE]) {
8836            sequence_options.push(SequenceOptions::MaxValue(Some(Expr::Value(
8837                self.parse_number_value()?,
8838            ))));
8839        } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
8840            sequence_options.push(SequenceOptions::MaxValue(None));
8841        }
8842
8843        //[ START [ WITH ] start ]
8844        if self.parse_keywords(&[Keyword::START]) {
8845            if self.parse_keywords(&[Keyword::WITH]) {
8846                sequence_options.push(SequenceOptions::StartWith(
8847                    Expr::Value(self.parse_number_value()?),
8848                    true,
8849                ));
8850            } else {
8851                sequence_options.push(SequenceOptions::StartWith(
8852                    Expr::Value(self.parse_number_value()?),
8853                    false,
8854                ));
8855            }
8856        }
8857        //[ CACHE cache ]
8858        if self.parse_keywords(&[Keyword::CACHE]) {
8859            sequence_options.push(SequenceOptions::Cache(Expr::Value(
8860                self.parse_number_value()?,
8861            )));
8862        }
8863        // [ [ NO ] CYCLE ]
8864        if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
8865            sequence_options.push(SequenceOptions::Cycle(true));
8866        } else if self.parse_keywords(&[Keyword::CYCLE]) {
8867            sequence_options.push(SequenceOptions::Cycle(false));
8868        }
8869
8870        Ok(sequence_options)
8871    }
8872
8873    /// The index of the first unprocessed token.
8874    pub fn index(&self) -> usize {
8875        self.index
8876    }
8877
8878    pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
8879        let ident = self.parse_identifier(false)?;
8880        self.expect_keyword(Keyword::AS)?;
8881        self.expect_token(&Token::LParen)?;
8882        let window_spec = self.parse_window_spec()?;
8883        Ok(NamedWindowDefinition(ident, window_spec))
8884    }
8885
8886    pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
8887        let name = self.parse_object_name(false)?;
8888        let params = self.parse_optional_procedure_parameters()?;
8889        self.expect_keyword(Keyword::AS)?;
8890        self.expect_keyword(Keyword::BEGIN)?;
8891        let statements = self.parse_statements()?;
8892        self.expect_keyword(Keyword::END)?;
8893        Ok(Statement::CreateProcedure {
8894            name,
8895            or_alter,
8896            params,
8897            body: statements,
8898        })
8899    }
8900
8901    pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
8902        let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
8903            self.parse_comma_separated(Parser::parse_expr)?
8904        } else {
8905            vec![]
8906        };
8907        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8908            self.parse_comma_separated(Parser::parse_order_by_expr)?
8909        } else {
8910            vec![]
8911        };
8912        let window_frame = if !self.consume_token(&Token::RParen) {
8913            let window_frame = self.parse_window_frame()?;
8914            self.expect_token(&Token::RParen)?;
8915            Some(window_frame)
8916        } else {
8917            None
8918        };
8919        Ok(WindowSpec {
8920            partition_by,
8921            order_by,
8922            window_frame,
8923        })
8924    }
8925
8926    pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
8927        let name = self.parse_object_name(false)?;
8928        self.expect_keyword(Keyword::AS)?;
8929
8930        let mut attributes = vec![];
8931        if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
8932            return Ok(Statement::CreateType {
8933                name,
8934                representation: UserDefinedTypeRepresentation::Composite { attributes },
8935            });
8936        }
8937
8938        loop {
8939            let attr_name = self.parse_identifier(false)?;
8940            let attr_data_type = self.parse_data_type()?;
8941            let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
8942                Some(self.parse_object_name(false)?)
8943            } else {
8944                None
8945            };
8946            attributes.push(UserDefinedTypeCompositeAttributeDef {
8947                name: attr_name,
8948                data_type: attr_data_type,
8949                collation: attr_collation,
8950            });
8951            let comma = self.consume_token(&Token::Comma);
8952            if self.consume_token(&Token::RParen) {
8953                // allow a trailing comma
8954                break;
8955            } else if !comma {
8956                return self.expected("',' or ')' after attribute definition", self.peek_token());
8957            }
8958        }
8959
8960        Ok(Statement::CreateType {
8961            name,
8962            representation: UserDefinedTypeRepresentation::Composite { attributes },
8963        })
8964    }
8965
8966    fn parse_partitions(&mut self) -> Result<Vec<Ident>, ParserError> {
8967        self.expect_token(&Token::LParen)?;
8968        let partitions = self.parse_comma_separated(|p| p.parse_identifier(false))?;
8969        self.expect_token(&Token::RParen)?;
8970        Ok(partitions)
8971    }
8972
8973    /// Consume the parser and return its underlying token buffer
8974    pub fn into_tokens(self) -> Vec<TokenWithLocation> {
8975        self.tokens
8976    }
8977}
8978
8979impl Word {
8980    pub fn to_ident(&self) -> Ident {
8981        Ident {
8982            value: self.value.clone(),
8983            quote_style: self.quote_style,
8984        }
8985    }
8986}
8987
8988#[cfg(test)]
8989mod tests {
8990    use crate::test_utils::{all_dialects, TestedDialects};
8991
8992    use super::*;
8993
8994    #[test]
8995    fn test_prev_index() {
8996        let sql = "SELECT version";
8997        all_dialects().run_parser_method(sql, |parser| {
8998            assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
8999            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
9000            parser.prev_token();
9001            assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
9002            assert_eq!(parser.next_token(), Token::make_word("version", None));
9003            parser.prev_token();
9004            assert_eq!(parser.peek_token(), Token::make_word("version", None));
9005            assert_eq!(parser.next_token(), Token::make_word("version", None));
9006            assert_eq!(parser.peek_token(), Token::EOF);
9007            parser.prev_token();
9008            assert_eq!(parser.next_token(), Token::make_word("version", None));
9009            assert_eq!(parser.next_token(), Token::EOF);
9010            assert_eq!(parser.next_token(), Token::EOF);
9011            parser.prev_token();
9012        });
9013    }
9014
9015    #[cfg(test)]
9016    mod test_parse_data_type {
9017        use crate::ast::{
9018            CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
9019        };
9020        use crate::dialect::{AnsiDialect, GenericDialect};
9021        use crate::test_utils::TestedDialects;
9022
9023        macro_rules! test_parse_data_type {
9024            ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
9025                $dialect.run_parser_method(&*$input, |parser| {
9026                    let data_type = parser.parse_data_type().unwrap();
9027                    assert_eq!($expected_type, data_type);
9028                    assert_eq!($input.to_string(), data_type.to_string());
9029                });
9030            }};
9031        }
9032
9033        #[test]
9034        fn test_ansii_character_string_types() {
9035            // Character string types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-string-type>
9036            let dialect = TestedDialects {
9037                dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9038                options: None,
9039            };
9040
9041            test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
9042
9043            test_parse_data_type!(
9044                dialect,
9045                "CHARACTER(20)",
9046                DataType::Character(Some(CharacterLength::IntegerLength {
9047                    length: 20,
9048                    unit: None
9049                }))
9050            );
9051
9052            test_parse_data_type!(
9053                dialect,
9054                "CHARACTER(20 CHARACTERS)",
9055                DataType::Character(Some(CharacterLength::IntegerLength {
9056                    length: 20,
9057                    unit: Some(CharLengthUnits::Characters)
9058                }))
9059            );
9060
9061            test_parse_data_type!(
9062                dialect,
9063                "CHARACTER(20 OCTETS)",
9064                DataType::Character(Some(CharacterLength::IntegerLength {
9065                    length: 20,
9066                    unit: Some(CharLengthUnits::Octets)
9067                }))
9068            );
9069
9070            test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
9071
9072            test_parse_data_type!(
9073                dialect,
9074                "CHAR(20)",
9075                DataType::Char(Some(CharacterLength::IntegerLength {
9076                    length: 20,
9077                    unit: None
9078                }))
9079            );
9080
9081            test_parse_data_type!(
9082                dialect,
9083                "CHAR(20 CHARACTERS)",
9084                DataType::Char(Some(CharacterLength::IntegerLength {
9085                    length: 20,
9086                    unit: Some(CharLengthUnits::Characters)
9087                }))
9088            );
9089
9090            test_parse_data_type!(
9091                dialect,
9092                "CHAR(20 OCTETS)",
9093                DataType::Char(Some(CharacterLength::IntegerLength {
9094                    length: 20,
9095                    unit: Some(CharLengthUnits::Octets)
9096                }))
9097            );
9098
9099            test_parse_data_type!(
9100                dialect,
9101                "CHARACTER VARYING(20)",
9102                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
9103                    length: 20,
9104                    unit: None
9105                }))
9106            );
9107
9108            test_parse_data_type!(
9109                dialect,
9110                "CHARACTER VARYING(20 CHARACTERS)",
9111                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
9112                    length: 20,
9113                    unit: Some(CharLengthUnits::Characters)
9114                }))
9115            );
9116
9117            test_parse_data_type!(
9118                dialect,
9119                "CHARACTER VARYING(20 OCTETS)",
9120                DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
9121                    length: 20,
9122                    unit: Some(CharLengthUnits::Octets)
9123                }))
9124            );
9125
9126            test_parse_data_type!(
9127                dialect,
9128                "CHAR VARYING(20)",
9129                DataType::CharVarying(Some(CharacterLength::IntegerLength {
9130                    length: 20,
9131                    unit: None
9132                }))
9133            );
9134
9135            test_parse_data_type!(
9136                dialect,
9137                "CHAR VARYING(20 CHARACTERS)",
9138                DataType::CharVarying(Some(CharacterLength::IntegerLength {
9139                    length: 20,
9140                    unit: Some(CharLengthUnits::Characters)
9141                }))
9142            );
9143
9144            test_parse_data_type!(
9145                dialect,
9146                "CHAR VARYING(20 OCTETS)",
9147                DataType::CharVarying(Some(CharacterLength::IntegerLength {
9148                    length: 20,
9149                    unit: Some(CharLengthUnits::Octets)
9150                }))
9151            );
9152
9153            test_parse_data_type!(
9154                dialect,
9155                "VARCHAR(20)",
9156                DataType::Varchar(Some(CharacterLength::IntegerLength {
9157                    length: 20,
9158                    unit: None
9159                }))
9160            );
9161        }
9162
9163        #[test]
9164        fn test_ansii_character_large_object_types() {
9165            // Character large object types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-length>
9166            let dialect = TestedDialects {
9167                dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9168                options: None,
9169            };
9170
9171            test_parse_data_type!(
9172                dialect,
9173                "CHARACTER LARGE OBJECT",
9174                DataType::CharacterLargeObject(None)
9175            );
9176            test_parse_data_type!(
9177                dialect,
9178                "CHARACTER LARGE OBJECT(20)",
9179                DataType::CharacterLargeObject(Some(20))
9180            );
9181
9182            test_parse_data_type!(
9183                dialect,
9184                "CHAR LARGE OBJECT",
9185                DataType::CharLargeObject(None)
9186            );
9187            test_parse_data_type!(
9188                dialect,
9189                "CHAR LARGE OBJECT(20)",
9190                DataType::CharLargeObject(Some(20))
9191            );
9192
9193            test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
9194            test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
9195        }
9196
9197        #[test]
9198        fn test_parse_custom_types() {
9199            let dialect = TestedDialects {
9200                dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9201                options: None,
9202            };
9203            test_parse_data_type!(
9204                dialect,
9205                "GEOMETRY",
9206                DataType::Custom(ObjectName(vec!["GEOMETRY".into()]), vec![])
9207            );
9208
9209            test_parse_data_type!(
9210                dialect,
9211                "GEOMETRY(POINT)",
9212                DataType::Custom(
9213                    ObjectName(vec!["GEOMETRY".into()]),
9214                    vec!["POINT".to_string()]
9215                )
9216            );
9217
9218            test_parse_data_type!(
9219                dialect,
9220                "GEOMETRY(POINT, 4326)",
9221                DataType::Custom(
9222                    ObjectName(vec!["GEOMETRY".into()]),
9223                    vec!["POINT".to_string(), "4326".to_string()]
9224                )
9225            );
9226        }
9227
9228        #[test]
9229        fn test_ansii_exact_numeric_types() {
9230            // Exact numeric types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type>
9231            let dialect = TestedDialects {
9232                dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9233                options: None,
9234            };
9235
9236            test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
9237
9238            test_parse_data_type!(
9239                dialect,
9240                "NUMERIC(2)",
9241                DataType::Numeric(ExactNumberInfo::Precision(2))
9242            );
9243
9244            test_parse_data_type!(
9245                dialect,
9246                "NUMERIC(2,10)",
9247                DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
9248            );
9249
9250            test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
9251
9252            test_parse_data_type!(
9253                dialect,
9254                "DECIMAL(2)",
9255                DataType::Decimal(ExactNumberInfo::Precision(2))
9256            );
9257
9258            test_parse_data_type!(
9259                dialect,
9260                "DECIMAL(2,10)",
9261                DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
9262            );
9263
9264            test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
9265
9266            test_parse_data_type!(
9267                dialect,
9268                "DEC(2)",
9269                DataType::Dec(ExactNumberInfo::Precision(2))
9270            );
9271
9272            test_parse_data_type!(
9273                dialect,
9274                "DEC(2,10)",
9275                DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
9276            );
9277        }
9278
9279        #[test]
9280        fn test_ansii_date_type() {
9281            // Datetime types: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type>
9282            let dialect = TestedDialects {
9283                dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9284                options: None,
9285            };
9286
9287            test_parse_data_type!(dialect, "DATE", DataType::Date);
9288
9289            test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
9290
9291            test_parse_data_type!(
9292                dialect,
9293                "TIME(6)",
9294                DataType::Time(Some(6), TimezoneInfo::None)
9295            );
9296
9297            test_parse_data_type!(
9298                dialect,
9299                "TIME WITH TIME ZONE",
9300                DataType::Time(None, TimezoneInfo::WithTimeZone)
9301            );
9302
9303            test_parse_data_type!(
9304                dialect,
9305                "TIME(6) WITH TIME ZONE",
9306                DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
9307            );
9308
9309            test_parse_data_type!(
9310                dialect,
9311                "TIME WITHOUT TIME ZONE",
9312                DataType::Time(None, TimezoneInfo::WithoutTimeZone)
9313            );
9314
9315            test_parse_data_type!(
9316                dialect,
9317                "TIME(6) WITHOUT TIME ZONE",
9318                DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
9319            );
9320
9321            test_parse_data_type!(
9322                dialect,
9323                "TIMESTAMP",
9324                DataType::Timestamp(None, TimezoneInfo::None)
9325            );
9326
9327            test_parse_data_type!(
9328                dialect,
9329                "TIMESTAMP(22)",
9330                DataType::Timestamp(Some(22), TimezoneInfo::None)
9331            );
9332
9333            test_parse_data_type!(
9334                dialect,
9335                "TIMESTAMP(22) WITH TIME ZONE",
9336                DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
9337            );
9338
9339            test_parse_data_type!(
9340                dialect,
9341                "TIMESTAMP(33) WITHOUT TIME ZONE",
9342                DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
9343            );
9344        }
9345    }
9346
9347    #[test]
9348    fn test_parse_schema_name() {
9349        // The expected name should be identical as the input name, that's why I don't receive both
9350        macro_rules! test_parse_schema_name {
9351            ($input:expr, $expected_name:expr $(,)?) => {{
9352                all_dialects().run_parser_method(&*$input, |parser| {
9353                    let schema_name = parser.parse_schema_name().unwrap();
9354                    // Validate that the structure is the same as expected
9355                    assert_eq!(schema_name, $expected_name);
9356                    // Validate that the input and the expected structure serialization are the same
9357                    assert_eq!(schema_name.to_string(), $input.to_string());
9358                });
9359            }};
9360        }
9361
9362        let dummy_name = ObjectName(vec![Ident::new("dummy_name")]);
9363        let dummy_authorization = Ident::new("dummy_authorization");
9364
9365        test_parse_schema_name!(
9366            format!("{dummy_name}"),
9367            SchemaName::Simple(dummy_name.clone())
9368        );
9369
9370        test_parse_schema_name!(
9371            format!("AUTHORIZATION {dummy_authorization}"),
9372            SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
9373        );
9374        test_parse_schema_name!(
9375            format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
9376            SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
9377        );
9378    }
9379
9380    #[test]
9381    fn mysql_parse_index_table_constraint() {
9382        macro_rules! test_parse_table_constraint {
9383            ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
9384                $dialect.run_parser_method(&*$input, |parser| {
9385                    let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
9386                    // Validate that the structure is the same as expected
9387                    assert_eq!(constraint, $expected);
9388                    // Validate that the input and the expected structure serialization are the same
9389                    assert_eq!(constraint.to_string(), $input.to_string());
9390                });
9391            }};
9392        }
9393
9394        let dialect = TestedDialects {
9395            dialects: vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})],
9396            options: None,
9397        };
9398
9399        test_parse_table_constraint!(
9400            dialect,
9401            "INDEX (c1)",
9402            TableConstraint::Index {
9403                display_as_key: false,
9404                name: None,
9405                index_type: None,
9406                columns: vec![Ident::new("c1")],
9407            }
9408        );
9409
9410        test_parse_table_constraint!(
9411            dialect,
9412            "KEY (c1)",
9413            TableConstraint::Index {
9414                display_as_key: true,
9415                name: None,
9416                index_type: None,
9417                columns: vec![Ident::new("c1")],
9418            }
9419        );
9420
9421        test_parse_table_constraint!(
9422            dialect,
9423            "INDEX 'index' (c1, c2)",
9424            TableConstraint::Index {
9425                display_as_key: false,
9426                name: Some(Ident::with_quote('\'', "index")),
9427                index_type: None,
9428                columns: vec![Ident::new("c1"), Ident::new("c2")],
9429            }
9430        );
9431
9432        test_parse_table_constraint!(
9433            dialect,
9434            "INDEX USING BTREE (c1)",
9435            TableConstraint::Index {
9436                display_as_key: false,
9437                name: None,
9438                index_type: Some(IndexType::BTree),
9439                columns: vec![Ident::new("c1")],
9440            }
9441        );
9442
9443        test_parse_table_constraint!(
9444            dialect,
9445            "INDEX USING HASH (c1)",
9446            TableConstraint::Index {
9447                display_as_key: false,
9448                name: None,
9449                index_type: Some(IndexType::Hash),
9450                columns: vec![Ident::new("c1")],
9451            }
9452        );
9453
9454        test_parse_table_constraint!(
9455            dialect,
9456            "INDEX idx_name USING BTREE (c1)",
9457            TableConstraint::Index {
9458                display_as_key: false,
9459                name: Some(Ident::new("idx_name")),
9460                index_type: Some(IndexType::BTree),
9461                columns: vec![Ident::new("c1")],
9462            }
9463        );
9464
9465        test_parse_table_constraint!(
9466            dialect,
9467            "INDEX idx_name USING HASH (c1)",
9468            TableConstraint::Index {
9469                display_as_key: false,
9470                name: Some(Ident::new("idx_name")),
9471                index_type: Some(IndexType::Hash),
9472                columns: vec![Ident::new("c1")],
9473            }
9474        );
9475    }
9476
9477    #[test]
9478    fn test_tokenizer_error_loc() {
9479        let sql = "foo '";
9480        let ast = Parser::parse_sql(&GenericDialect, sql);
9481        assert_eq!(
9482            ast,
9483            Err(ParserError::TokenizerError(
9484                "Unterminated string literal at Line: 1, Column 5".to_string()
9485            ))
9486        );
9487    }
9488
9489    #[test]
9490    fn test_parser_error_loc() {
9491        let sql = "SELECT this is a syntax error";
9492        let ast = Parser::parse_sql(&GenericDialect, sql);
9493        assert_eq!(
9494            ast,
9495            Err(ParserError::ParserError(
9496                "Expected [NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS, found: a at Line: 1, Column 16"
9497                    .to_string()
9498            ))
9499        );
9500    }
9501
9502    #[test]
9503    fn test_nested_explain_error() {
9504        let sql = "EXPLAIN EXPLAIN SELECT 1";
9505        let ast = Parser::parse_sql(&GenericDialect, sql);
9506        assert_eq!(
9507            ast,
9508            Err(ParserError::ParserError(
9509                "Explain must be root of the plan".to_string()
9510            ))
9511        );
9512    }
9513
9514    #[test]
9515    fn test_parse_multipart_identifier_positive() {
9516        let dialect = TestedDialects {
9517            dialects: vec![Box::new(GenericDialect {})],
9518            options: None,
9519        };
9520
9521        // parse multipart with quotes
9522        let expected = vec![
9523            Ident {
9524                value: "CATALOG".to_string(),
9525                quote_style: None,
9526            },
9527            Ident {
9528                value: "F(o)o. \"bar".to_string(),
9529                quote_style: Some('"'),
9530            },
9531            Ident {
9532                value: "table".to_string(),
9533                quote_style: None,
9534            },
9535        ];
9536        dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
9537            let actual = parser.parse_multipart_identifier().unwrap();
9538            assert_eq!(expected, actual);
9539        });
9540
9541        // allow whitespace between ident parts
9542        let expected = vec![
9543            Ident {
9544                value: "CATALOG".to_string(),
9545                quote_style: None,
9546            },
9547            Ident {
9548                value: "table".to_string(),
9549                quote_style: None,
9550            },
9551        ];
9552        dialect.run_parser_method("CATALOG . table", |parser| {
9553            let actual = parser.parse_multipart_identifier().unwrap();
9554            assert_eq!(expected, actual);
9555        });
9556    }
9557
9558    #[test]
9559    fn test_parse_multipart_identifier_negative() {
9560        macro_rules! test_parse_multipart_identifier_error {
9561            ($input:expr, $expected_err:expr $(,)?) => {{
9562                all_dialects().run_parser_method(&*$input, |parser| {
9563                    let actual_err = parser.parse_multipart_identifier().unwrap_err();
9564                    assert_eq!(actual_err.to_string(), $expected_err);
9565                });
9566            }};
9567        }
9568
9569        test_parse_multipart_identifier_error!(
9570            "",
9571            "sql parser error: Empty input when parsing identifier",
9572        );
9573
9574        test_parse_multipart_identifier_error!(
9575            "*schema.table",
9576            "sql parser error: Unexpected token in identifier: *",
9577        );
9578
9579        test_parse_multipart_identifier_error!(
9580            "schema.table*",
9581            "sql parser error: Unexpected token in identifier: *",
9582        );
9583
9584        test_parse_multipart_identifier_error!(
9585            "schema.table.",
9586            "sql parser error: Trailing period in identifier",
9587        );
9588
9589        test_parse_multipart_identifier_error!(
9590            "schema.*",
9591            "sql parser error: Unexpected token following period in identifier: *",
9592        );
9593    }
9594
9595    #[test]
9596    fn test_mysql_partition_selection() {
9597        let sql = "SELECT * FROM employees PARTITION (p0, p2)";
9598        let expected = vec!["p0", "p2"];
9599
9600        let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
9601        assert_eq!(ast.len(), 1);
9602        if let Statement::Query(v) = &ast[0] {
9603            if let SetExpr::Select(select) = &*v.body {
9604                assert_eq!(select.from.len(), 1);
9605                let from: &TableWithJoins = &select.from[0];
9606                let table_factor = &from.relation;
9607                if let TableFactor::Table { partitions, .. } = table_factor {
9608                    let actual: Vec<&str> = partitions
9609                        .iter()
9610                        .map(|ident| ident.value.as_str())
9611                        .collect();
9612                    assert_eq!(expected, actual);
9613                }
9614            }
9615        } else {
9616            panic!("fail to parse mysql partition selection");
9617        }
9618    }
9619}