1#[cfg(not(feature = "std"))]
16use alloc::{
17 boxed::Box,
18 collections::{BTreeMap, BTreeSet},
19 format,
20 string::{String, ToString},
21 vec,
22 vec::Vec,
23};
24use core::{
25 fmt::{self, Display},
26 str::FromStr,
27};
28#[cfg(feature = "std")]
29use std::collections::{BTreeMap, BTreeSet};
30
31use helpers::attached_token::AttachedToken;
32
33use log::debug;
34
35use recursion::RecursionCounter;
36use IsLateral::*;
37use IsOptional::*;
38
39use crate::ast::*;
40use crate::ast::{
41 comments,
42 helpers::{
43 key_value_options::{
44 KeyValueOption, KeyValueOptionKind, KeyValueOptions, KeyValueOptionsDelimiter,
45 },
46 stmt_create_table::{CreateTableBuilder, CreateTableConfiguration},
47 },
48};
49use crate::dialect::*;
50use crate::keywords::{Keyword, ALL_KEYWORDS};
51use crate::tokenizer::*;
52use sqlparser::parser::ParserState::ColumnDefinition;
53
54#[derive(Debug, Clone, PartialEq, Eq)]
56pub enum ParserError {
57 TokenizerError(String),
59 ParserError(String),
61 RecursionLimitExceeded,
63}
64
65macro_rules! parser_err {
67 ($MSG:expr, $loc:expr) => {
68 Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
69 };
70}
71
72mod alter;
73mod merge;
74
75#[cfg(feature = "std")]
76mod recursion {
78 use std::cell::Cell;
79 use std::rc::Rc;
80
81 use super::ParserError;
82
83 pub(crate) struct RecursionCounter {
94 remaining_depth: Rc<Cell<usize>>,
95 }
96
97 impl RecursionCounter {
98 pub fn new(remaining_depth: usize) -> Self {
101 Self {
102 remaining_depth: Rc::new(remaining_depth.into()),
103 }
104 }
105
106 pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
113 let old_value = self.remaining_depth.get();
114 if old_value == 0 {
116 Err(ParserError::RecursionLimitExceeded)
117 } else {
118 self.remaining_depth.set(old_value - 1);
119 Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
120 }
121 }
122 }
123
124 pub struct DepthGuard {
126 remaining_depth: Rc<Cell<usize>>,
127 }
128
129 impl DepthGuard {
130 fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
131 Self { remaining_depth }
132 }
133 }
134 impl Drop for DepthGuard {
135 fn drop(&mut self) {
136 let old_value = self.remaining_depth.get();
137 self.remaining_depth.set(old_value + 1);
138 }
139 }
140}
141
142#[cfg(not(feature = "std"))]
143mod recursion {
144 pub(crate) struct RecursionCounter {}
150
151 impl RecursionCounter {
152 pub fn new(_remaining_depth: usize) -> Self {
153 Self {}
154 }
155 pub fn try_decrease(&self) -> Result<DepthGuard, super::ParserError> {
156 Ok(DepthGuard {})
157 }
158 }
159
160 pub struct DepthGuard {}
161}
162
163#[derive(PartialEq, Eq)]
164pub enum IsOptional {
166 Optional,
168 Mandatory,
170}
171
172pub enum IsLateral {
174 Lateral,
176 NotLateral,
178}
179
180pub enum WildcardExpr {
182 Expr(Expr),
184 QualifiedWildcard(ObjectName),
186 Wildcard,
188}
189
190impl From<TokenizerError> for ParserError {
191 fn from(e: TokenizerError) -> Self {
192 ParserError::TokenizerError(e.to_string())
193 }
194}
195
196impl fmt::Display for ParserError {
197 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
198 write!(
199 f,
200 "sql parser error: {}",
201 match self {
202 ParserError::TokenizerError(s) => s,
203 ParserError::ParserError(s) => s,
204 ParserError::RecursionLimitExceeded => "recursion limit exceeded",
205 }
206 )
207 }
208}
209
210impl core::error::Error for ParserError {}
211
212const DEFAULT_REMAINING_DEPTH: usize = 50;
214
215const EOF_TOKEN: TokenWithSpan = TokenWithSpan {
217 token: Token::EOF,
218 span: Span {
219 start: Location { line: 0, column: 0 },
220 end: Location { line: 0, column: 0 },
221 },
222};
223
224struct MatchedTrailingBracket(bool);
237
238impl From<bool> for MatchedTrailingBracket {
239 fn from(value: bool) -> Self {
240 Self(value)
241 }
242}
243
244#[derive(Debug, Clone, PartialEq, Eq)]
246pub struct ParserOptions {
247 pub trailing_commas: bool,
249 pub unescape: bool,
252 pub require_semicolon_stmt_delimiter: bool,
255}
256
257impl Default for ParserOptions {
258 fn default() -> Self {
259 Self {
260 trailing_commas: false,
261 unescape: true,
262 require_semicolon_stmt_delimiter: true,
263 }
264 }
265}
266
267impl ParserOptions {
268 pub fn new() -> Self {
270 Default::default()
271 }
272
273 pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
285 self.trailing_commas = trailing_commas;
286 self
287 }
288
289 pub fn with_unescape(mut self, unescape: bool) -> Self {
292 self.unescape = unescape;
293 self
294 }
295}
296
297#[derive(Copy, Clone)]
298enum ParserState {
299 Normal,
301 ConnectBy,
305 ColumnDefinition,
311}
312
313pub struct Parser<'a> {
352 tokens: Vec<TokenWithSpan>,
354 index: usize,
356 state: ParserState,
358 dialect: &'a dyn Dialect,
360 options: ParserOptions,
364 recursion_counter: RecursionCounter,
366 failed_prefix_positions: BTreeMap<usize, ExprPrefixError>,
369 failed_reserved_word_prefix_positions: BTreeMap<usize, ExprPrefixError>,
372 failed_derived_table_factor_positions: BTreeSet<usize>,
376}
377
378#[derive(Debug, Clone, Copy)]
381enum ExprPrefixError {
382 RecursionLimitExceeded,
383 Err,
384}
385
386impl From<&ParserError> for ExprPrefixError {
387 fn from(e: &ParserError) -> Self {
388 match e {
389 ParserError::RecursionLimitExceeded => Self::RecursionLimitExceeded,
390 _ => Self::Err,
391 }
392 }
393}
394
395impl<'a> Parser<'a> {
396 pub fn new(dialect: &'a dyn Dialect) -> Self {
412 Self {
413 tokens: vec![],
414 index: 0,
415 state: ParserState::Normal,
416 dialect,
417 recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
418 options: ParserOptions::new().with_trailing_commas(dialect.supports_trailing_commas()),
419 failed_prefix_positions: BTreeMap::new(),
420 failed_reserved_word_prefix_positions: BTreeMap::new(),
421 failed_derived_table_factor_positions: BTreeSet::new(),
422 }
423 }
424
425 pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
448 self.recursion_counter = RecursionCounter::new(recursion_limit);
449 self
450 }
451
452 pub fn with_options(mut self, options: ParserOptions) -> Self {
475 self.options = options;
476 self
477 }
478
479 pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithSpan>) -> Self {
481 self.tokens = tokens;
482 self.index = 0;
483 self.failed_prefix_positions.clear();
484 self.failed_reserved_word_prefix_positions.clear();
485 self.failed_derived_table_factor_positions.clear();
486 self
487 }
488
489 pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
491 let tokens_with_locations: Vec<TokenWithSpan> = tokens
493 .into_iter()
494 .map(|token| TokenWithSpan {
495 token,
496 span: Span::empty(),
497 })
498 .collect();
499 self.with_tokens_with_locations(tokens_with_locations)
500 }
501
502 pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
509 debug!("Parsing sql '{sql}'...");
510 let tokens = Tokenizer::new(self.dialect, sql)
511 .with_unescape(self.options.unescape)
512 .tokenize_with_location()?;
513 Ok(self.with_tokens_with_locations(tokens))
514 }
515
516 pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
532 let mut stmts = Vec::new();
533 let mut expecting_statement_delimiter = false;
534 loop {
535 while self.consume_token(&Token::SemiColon) {
537 expecting_statement_delimiter = false;
538 }
539
540 if !self.options.require_semicolon_stmt_delimiter {
541 expecting_statement_delimiter = false;
542 }
543
544 match &self.peek_token_ref().token {
545 Token::EOF => break,
546
547 Token::Word(word)
549 if expecting_statement_delimiter && word.keyword == Keyword::END =>
550 {
551 break;
552 }
553 _ => {}
554 }
555
556 if expecting_statement_delimiter {
557 return self.expected_ref("end of statement", self.peek_token_ref());
558 }
559
560 let statement = self.parse_statement()?;
561 stmts.push(statement);
562 expecting_statement_delimiter = true;
563 }
564 Ok(stmts)
565 }
566
567 pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
583 Parser::new(dialect).try_with_sql(sql)?.parse_statements()
584 }
585
586 pub fn parse_sql_with_comments(
591 dialect: &'a dyn Dialect,
592 sql: &str,
593 ) -> Result<(Vec<Statement>, comments::Comments), ParserError> {
594 let mut p = Parser::new(dialect).try_with_sql(sql)?;
595 p.parse_statements().map(|stmts| (stmts, p.into_comments()))
596 }
597
598 pub fn into_comments(self) -> comments::Comments {
600 let mut comments = comments::Comments::default();
601 for t in self.tokens.into_iter() {
602 match t.token {
603 Token::Whitespace(Whitespace::SingleLineComment { comment, prefix }) => {
604 comments.offer(comments::CommentWithSpan {
605 comment: comments::Comment::SingleLine {
606 content: comment,
607 prefix,
608 },
609 span: t.span,
610 });
611 }
612 Token::Whitespace(Whitespace::MultiLineComment(comment)) => {
613 comments.offer(comments::CommentWithSpan {
614 comment: comments::Comment::MultiLine(comment),
615 span: t.span,
616 });
617 }
618 _ => {}
619 }
620 }
621 comments
622 }
623
624 pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
627 let _guard = self.recursion_counter.try_decrease()?;
628
629 if let Some(statement) = self.dialect.parse_statement(self) {
631 return statement;
632 }
633
634 let next_token = self.next_token();
635 match &next_token.token {
636 Token::Word(w) => match w.keyword {
637 Keyword::KILL => self.parse_kill(),
638 Keyword::FLUSH => self.parse_flush(),
639 Keyword::DESC => self.parse_explain(DescribeAlias::Desc),
640 Keyword::DESCRIBE => self.parse_explain(DescribeAlias::Describe),
641 Keyword::EXPLAIN => self.parse_explain(DescribeAlias::Explain),
642 Keyword::ANALYZE => self.parse_analyze().map(Into::into),
643 Keyword::CASE => {
644 self.prev_token();
645 self.parse_case_stmt().map(Into::into)
646 }
647 Keyword::IF => {
648 self.prev_token();
649 self.parse_if_stmt().map(Into::into)
650 }
651 Keyword::WHILE => {
652 self.prev_token();
653 self.parse_while().map(Into::into)
654 }
655 Keyword::RAISE => {
656 self.prev_token();
657 self.parse_raise_stmt().map(Into::into)
658 }
659 Keyword::SELECT | Keyword::WITH | Keyword::VALUES | Keyword::FROM => {
660 self.prev_token();
661 self.parse_query().map(Into::into)
662 }
663 Keyword::TRUNCATE => self.parse_truncate().map(Into::into),
664 Keyword::ATTACH => {
665 if dialect_of!(self is DuckDbDialect) {
666 self.parse_attach_duckdb_database()
667 } else {
668 self.parse_attach_database()
669 }
670 }
671 Keyword::DETACH if self.dialect.supports_detach() => {
672 self.parse_detach_duckdb_database()
673 }
674 Keyword::MSCK => self.parse_msck().map(Into::into),
675 Keyword::CREATE => self.parse_create(),
676 Keyword::CACHE => self.parse_cache_table(),
677 Keyword::DROP => self.parse_drop(),
678 Keyword::DISCARD => self.parse_discard(),
679 Keyword::DECLARE => self.parse_declare(),
680 Keyword::FETCH => self.parse_fetch_statement(),
681 Keyword::DELETE => self.parse_delete(next_token),
682 Keyword::INSERT => self.parse_insert(next_token),
683 Keyword::REPLACE => self.parse_replace(next_token),
684 Keyword::UNCACHE => self.parse_uncache_table(),
685 Keyword::UPDATE => self.parse_update(next_token),
686 Keyword::ALTER => self.parse_alter(),
687 Keyword::CALL => self.parse_call(),
688 Keyword::COPY => self.parse_copy(),
689 Keyword::OPEN => {
690 self.prev_token();
691 self.parse_open()
692 }
693 Keyword::CLOSE => self.parse_close(),
694 Keyword::SET => self.parse_set(),
695 Keyword::SHOW => self.parse_show(),
696 Keyword::USE => self.parse_use(),
697 Keyword::GRANT => self.parse_grant().map(Into::into),
698 Keyword::DENY => {
699 self.prev_token();
700 self.parse_deny()
701 }
702 Keyword::REVOKE => self.parse_revoke().map(Into::into),
703 Keyword::START => self.parse_start_transaction(),
704 Keyword::BEGIN => self.parse_begin(),
705 Keyword::END => self.parse_end(),
706 Keyword::SAVEPOINT => self.parse_savepoint(),
707 Keyword::RELEASE => self.parse_release(),
708 Keyword::COMMIT => self.parse_commit(),
709 Keyword::RAISERROR => Ok(self.parse_raiserror()?),
710 Keyword::THROW => {
711 self.prev_token();
712 self.parse_throw().map(Into::into)
713 }
714 Keyword::ROLLBACK => self.parse_rollback(),
715 Keyword::ABORT => self.parse_abort(),
716 Keyword::ASSERT => self.parse_assert(),
717 Keyword::DEALLOCATE => self.parse_deallocate(),
720 Keyword::EXECUTE | Keyword::EXEC => self.parse_execute(),
721 Keyword::PREPARE => self.parse_prepare(),
722 Keyword::MERGE => self.parse_merge(next_token).map(Into::into),
723 Keyword::LISTEN if self.dialect.supports_listen_notify() => self.parse_listen(),
726 Keyword::UNLISTEN if self.dialect.supports_listen_notify() => self.parse_unlisten(),
727 Keyword::NOTIFY if self.dialect.supports_listen_notify() => self.parse_notify(),
728 Keyword::PRAGMA => self.parse_pragma(),
730 Keyword::UNLOAD => {
731 self.prev_token();
732 self.parse_unload()
733 }
734 Keyword::RENAME => self.parse_rename(),
735 Keyword::INSTALL if self.dialect.supports_install() => self.parse_install(),
737 Keyword::LOAD => self.parse_load(),
738 Keyword::LOCK => {
739 self.prev_token();
740 self.parse_lock_statement().map(Into::into)
741 }
742 Keyword::OPTIMIZE if self.dialect.supports_optimize_table() => {
743 self.parse_optimize_table()
744 }
745 Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
747 Keyword::PRINT => self.parse_print(),
748 Keyword::WAITFOR => self.parse_waitfor(),
750 Keyword::RETURN => self.parse_return(),
751 Keyword::EXPORT => {
752 self.prev_token();
753 self.parse_export_data()
754 }
755 Keyword::VACUUM => {
756 self.prev_token();
757 self.parse_vacuum()
758 }
759 Keyword::RESET => self.parse_reset().map(Into::into),
760 _ => self.expected("an SQL statement", next_token),
761 },
762 Token::LParen => {
763 self.prev_token();
764 self.parse_query().map(Into::into)
765 }
766 _ => self.expected("an SQL statement", next_token),
767 }
768 }
769
770 pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
774 let case_token = self.expect_keyword(Keyword::CASE)?;
775
776 let match_expr = if self.peek_keyword(Keyword::WHEN) {
777 None
778 } else {
779 Some(self.parse_expr()?)
780 };
781
782 self.expect_keyword_is(Keyword::WHEN)?;
783 let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
784 parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
785 })?;
786
787 let else_block = if self.parse_keyword(Keyword::ELSE) {
788 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
789 } else {
790 None
791 };
792
793 let mut end_case_token = self.expect_keyword(Keyword::END)?;
794 if self.peek_keyword(Keyword::CASE) {
795 end_case_token = self.expect_keyword(Keyword::CASE)?;
796 }
797
798 Ok(CaseStatement {
799 case_token: AttachedToken(case_token),
800 match_expr,
801 when_blocks,
802 else_block,
803 end_case_token: AttachedToken(end_case_token),
804 })
805 }
806
807 pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
811 self.expect_keyword_is(Keyword::IF)?;
812 let if_block = self.parse_conditional_statement_block(&[
813 Keyword::ELSE,
814 Keyword::ELSEIF,
815 Keyword::END,
816 ])?;
817
818 let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
819 self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
820 parser.parse_conditional_statement_block(&[
821 Keyword::ELSEIF,
822 Keyword::ELSE,
823 Keyword::END,
824 ])
825 })?
826 } else {
827 vec![]
828 };
829
830 let else_block = if self.parse_keyword(Keyword::ELSE) {
831 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
832 } else {
833 None
834 };
835
836 self.expect_keyword_is(Keyword::END)?;
837 let end_token = self.expect_keyword(Keyword::IF)?;
838
839 Ok(IfStatement {
840 if_block,
841 elseif_blocks,
842 else_block,
843 end_token: Some(AttachedToken(end_token)),
844 })
845 }
846
847 fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
851 self.expect_keyword_is(Keyword::WHILE)?;
852 let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
853
854 Ok(WhileStatement { while_block })
855 }
856
857 fn parse_conditional_statement_block(
865 &mut self,
866 terminal_keywords: &[Keyword],
867 ) -> Result<ConditionalStatementBlock, ParserError> {
868 let start_token = self.get_current_token().clone(); let mut then_token = None;
870
871 let condition = match &start_token.token {
872 Token::Word(w) if w.keyword == Keyword::ELSE => None,
873 Token::Word(w) if w.keyword == Keyword::WHILE => {
874 let expr = self.parse_expr()?;
875 Some(expr)
876 }
877 _ => {
878 let expr = self.parse_expr()?;
879 then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
880 Some(expr)
881 }
882 };
883
884 let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
885
886 Ok(ConditionalStatementBlock {
887 start_token: AttachedToken(start_token),
888 condition,
889 then_token,
890 conditional_statements,
891 })
892 }
893
894 pub(crate) fn parse_conditional_statements(
897 &mut self,
898 terminal_keywords: &[Keyword],
899 ) -> Result<ConditionalStatements, ParserError> {
900 let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
901 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
902 let statements = self.parse_statement_list(terminal_keywords)?;
903 let end_token = self.expect_keyword(Keyword::END)?;
904
905 ConditionalStatements::BeginEnd(BeginEndStatements {
906 begin_token: AttachedToken(begin_token),
907 statements,
908 end_token: AttachedToken(end_token),
909 })
910 } else {
911 ConditionalStatements::Sequence {
912 statements: self.parse_statement_list(terminal_keywords)?,
913 }
914 };
915 Ok(conditional_statements)
916 }
917
918 pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
922 self.expect_keyword_is(Keyword::RAISE)?;
923
924 let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
925 self.expect_token(&Token::Eq)?;
926 Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
927 } else {
928 self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
929 };
930
931 Ok(RaiseStatement { value })
932 }
933 pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
937 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
938
939 self.expect_keyword_is(Keyword::ON)?;
940 let token = self.next_token();
941
942 let (object_type, object_name) = match token.token {
943 Token::Word(w) if w.keyword == Keyword::COLLATION => {
944 (CommentObject::Collation, self.parse_object_name(false)?)
945 }
946 Token::Word(w) if w.keyword == Keyword::COLUMN => {
947 (CommentObject::Column, self.parse_object_name(false)?)
948 }
949 Token::Word(w) if w.keyword == Keyword::DATABASE => {
950 (CommentObject::Database, self.parse_object_name(false)?)
951 }
952 Token::Word(w) if w.keyword == Keyword::DOMAIN => {
953 (CommentObject::Domain, self.parse_object_name(false)?)
954 }
955 Token::Word(w) if w.keyword == Keyword::EXTENSION => {
956 (CommentObject::Extension, self.parse_object_name(false)?)
957 }
958 Token::Word(w) if w.keyword == Keyword::FUNCTION => {
959 (CommentObject::Function, self.parse_object_name(false)?)
960 }
961 Token::Word(w) if w.keyword == Keyword::INDEX => {
962 (CommentObject::Index, self.parse_object_name(false)?)
963 }
964 Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
965 self.expect_keyword_is(Keyword::VIEW)?;
966 (
967 CommentObject::MaterializedView,
968 self.parse_object_name(false)?,
969 )
970 }
971 Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
972 (CommentObject::Procedure, self.parse_object_name(false)?)
973 }
974 Token::Word(w) if w.keyword == Keyword::ROLE => {
975 (CommentObject::Role, self.parse_object_name(false)?)
976 }
977 Token::Word(w) if w.keyword == Keyword::SCHEMA => {
978 (CommentObject::Schema, self.parse_object_name(false)?)
979 }
980 Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
981 (CommentObject::Sequence, self.parse_object_name(false)?)
982 }
983 Token::Word(w) if w.keyword == Keyword::TABLE => {
984 (CommentObject::Table, self.parse_object_name(false)?)
985 }
986 Token::Word(w) if w.keyword == Keyword::TYPE => {
987 (CommentObject::Type, self.parse_object_name(false)?)
988 }
989 Token::Word(w) if w.keyword == Keyword::USER => {
990 (CommentObject::User, self.parse_object_name(false)?)
991 }
992 Token::Word(w) if w.keyword == Keyword::VIEW => {
993 (CommentObject::View, self.parse_object_name(false)?)
994 }
995 _ => self.expected("comment object_type", token)?,
996 };
997
998 self.expect_keyword_is(Keyword::IS)?;
999 let comment = if self.parse_keyword(Keyword::NULL) {
1000 None
1001 } else {
1002 Some(self.parse_literal_string()?)
1003 };
1004 Ok(Statement::Comment {
1005 object_type,
1006 object_name,
1007 comment,
1008 if_exists,
1009 })
1010 }
1011
1012 pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
1014 let mut channel = None;
1015 let mut tables: Vec<ObjectName> = vec![];
1016 let mut read_lock = false;
1017 let mut export = false;
1018
1019 if !dialect_of!(self is MySqlDialect | GenericDialect) {
1020 return parser_err!(
1021 "Unsupported statement FLUSH",
1022 self.peek_token_ref().span.start
1023 );
1024 }
1025
1026 let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
1027 Some(FlushLocation::NoWriteToBinlog)
1028 } else if self.parse_keyword(Keyword::LOCAL) {
1029 Some(FlushLocation::Local)
1030 } else {
1031 None
1032 };
1033
1034 let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
1035 FlushType::BinaryLogs
1036 } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
1037 FlushType::EngineLogs
1038 } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1039 FlushType::ErrorLogs
1040 } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1041 FlushType::GeneralLogs
1042 } else if self.parse_keywords(&[Keyword::HOSTS]) {
1043 FlushType::Hosts
1044 } else if self.parse_keyword(Keyword::PRIVILEGES) {
1045 FlushType::Privileges
1046 } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1047 FlushType::OptimizerCosts
1048 } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1049 if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1050 channel = Some(self.parse_object_name(false)?.to_string());
1051 }
1052 FlushType::RelayLogs
1053 } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1054 FlushType::SlowLogs
1055 } else if self.parse_keyword(Keyword::STATUS) {
1056 FlushType::Status
1057 } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1058 FlushType::UserResources
1059 } else if self.parse_keywords(&[Keyword::LOGS]) {
1060 FlushType::Logs
1061 } else if self.parse_keywords(&[Keyword::TABLES]) {
1062 loop {
1063 let next_token = self.next_token();
1064 match &next_token.token {
1065 Token::Word(w) => match w.keyword {
1066 Keyword::WITH => {
1067 read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1068 }
1069 Keyword::FOR => {
1070 export = self.parse_keyword(Keyword::EXPORT);
1071 }
1072 Keyword::NoKeyword => {
1073 self.prev_token();
1074 tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1075 }
1076 _ => {}
1077 },
1078 _ => {
1079 break;
1080 }
1081 }
1082 }
1083
1084 FlushType::Tables
1085 } else {
1086 return self.expected_ref(
1087 "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1088 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1089 self.peek_token_ref(),
1090 );
1091 };
1092
1093 Ok(Statement::Flush {
1094 object_type,
1095 location,
1096 channel,
1097 read_lock,
1098 export,
1099 tables,
1100 })
1101 }
1102
1103 pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1105 let repair = self.parse_keyword(Keyword::REPAIR);
1106 self.expect_keyword_is(Keyword::TABLE)?;
1107 let table_name = self.parse_object_name(false)?;
1108 let partition_action = self
1109 .maybe_parse(|parser| {
1110 let pa = match parser.parse_one_of_keywords(&[
1111 Keyword::ADD,
1112 Keyword::DROP,
1113 Keyword::SYNC,
1114 ]) {
1115 Some(Keyword::ADD) => Some(AddDropSync::ADD),
1116 Some(Keyword::DROP) => Some(AddDropSync::DROP),
1117 Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1118 _ => None,
1119 };
1120 parser.expect_keyword_is(Keyword::PARTITIONS)?;
1121 Ok(pa)
1122 })?
1123 .unwrap_or_default();
1124 Ok(Msck {
1125 repair,
1126 table_name,
1127 partition_action,
1128 })
1129 }
1130
1131 pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1133 let table = self.parse_keyword(Keyword::TABLE);
1134 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1135
1136 let table_names = self.parse_comma_separated(|p| {
1137 let only = p.parse_keyword(Keyword::ONLY);
1138 let name = p.parse_object_name(false)?;
1139 let has_asterisk = p.consume_token(&Token::Mul);
1140 Ok(TruncateTableTarget {
1141 name,
1142 only,
1143 has_asterisk,
1144 })
1145 })?;
1146
1147 let mut partitions = None;
1148 if self.parse_keyword(Keyword::PARTITION) {
1149 self.expect_token(&Token::LParen)?;
1150 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1151 self.expect_token(&Token::RParen)?;
1152 }
1153
1154 let mut identity = None;
1155 let mut cascade = None;
1156
1157 if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1158 identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1159 Some(TruncateIdentityOption::Restart)
1160 } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1161 Some(TruncateIdentityOption::Continue)
1162 } else {
1163 None
1164 };
1165
1166 cascade = self.parse_cascade_option();
1167 };
1168
1169 let on_cluster = self.parse_optional_on_cluster()?;
1170
1171 Ok(Truncate {
1172 table_names,
1173 partitions,
1174 table,
1175 if_exists,
1176 identity,
1177 cascade,
1178 on_cluster,
1179 })
1180 }
1181
1182 fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1183 if self.parse_keyword(Keyword::CASCADE) {
1184 Some(CascadeOption::Cascade)
1185 } else if self.parse_keyword(Keyword::RESTRICT) {
1186 Some(CascadeOption::Restrict)
1187 } else {
1188 None
1189 }
1190 }
1191
1192 pub fn parse_attach_duckdb_database_options(
1194 &mut self,
1195 ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1196 if !self.consume_token(&Token::LParen) {
1197 return Ok(vec![]);
1198 }
1199
1200 let mut options = vec![];
1201 loop {
1202 if self.parse_keyword(Keyword::READ_ONLY) {
1203 let boolean = if self.parse_keyword(Keyword::TRUE) {
1204 Some(true)
1205 } else if self.parse_keyword(Keyword::FALSE) {
1206 Some(false)
1207 } else {
1208 None
1209 };
1210 options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1211 } else if self.parse_keyword(Keyword::TYPE) {
1212 let ident = self.parse_identifier()?;
1213 options.push(AttachDuckDBDatabaseOption::Type(ident));
1214 } else {
1215 return self
1216 .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1217 };
1218
1219 if self.consume_token(&Token::RParen) {
1220 return Ok(options);
1221 } else if self.consume_token(&Token::Comma) {
1222 continue;
1223 } else {
1224 return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1225 }
1226 }
1227 }
1228
1229 pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1231 let database = self.parse_keyword(Keyword::DATABASE);
1232 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1233 let database_path = self.parse_identifier()?;
1234 let database_alias = if self.parse_keyword(Keyword::AS) {
1235 Some(self.parse_identifier()?)
1236 } else {
1237 None
1238 };
1239
1240 let attach_options = self.parse_attach_duckdb_database_options()?;
1241 Ok(Statement::AttachDuckDBDatabase {
1242 if_not_exists,
1243 database,
1244 database_path,
1245 database_alias,
1246 attach_options,
1247 })
1248 }
1249
1250 pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1252 let database = self.parse_keyword(Keyword::DATABASE);
1253 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1254 let database_alias = self.parse_identifier()?;
1255 Ok(Statement::DetachDuckDBDatabase {
1256 if_exists,
1257 database,
1258 database_alias,
1259 })
1260 }
1261
1262 pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1264 let database = self.parse_keyword(Keyword::DATABASE);
1265 let database_file_name = self.parse_expr()?;
1266 self.expect_keyword_is(Keyword::AS)?;
1267 let schema_name = self.parse_identifier()?;
1268 Ok(Statement::AttachDatabase {
1269 database,
1270 schema_name,
1271 database_file_name,
1272 })
1273 }
1274
1275 pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1277 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1278 let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1279 let mut for_columns = false;
1280 let mut cache_metadata = false;
1281 let mut noscan = false;
1282 let mut partitions = None;
1283 let mut compute_statistics = false;
1284 let mut columns = vec![];
1285
1286 if table_name.is_some() && self.consume_token(&Token::LParen) {
1288 columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1289 self.expect_token(&Token::RParen)?;
1290 }
1291
1292 loop {
1293 match self.parse_one_of_keywords(&[
1294 Keyword::PARTITION,
1295 Keyword::FOR,
1296 Keyword::CACHE,
1297 Keyword::NOSCAN,
1298 Keyword::COMPUTE,
1299 ]) {
1300 Some(Keyword::PARTITION) => {
1301 self.expect_token(&Token::LParen)?;
1302 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1303 self.expect_token(&Token::RParen)?;
1304 }
1305 Some(Keyword::NOSCAN) => noscan = true,
1306 Some(Keyword::FOR) => {
1307 self.expect_keyword_is(Keyword::COLUMNS)?;
1308
1309 columns = self
1310 .maybe_parse(|parser| {
1311 parser.parse_comma_separated(|p| p.parse_identifier())
1312 })?
1313 .unwrap_or_default();
1314 for_columns = true
1315 }
1316 Some(Keyword::CACHE) => {
1317 self.expect_keyword_is(Keyword::METADATA)?;
1318 cache_metadata = true
1319 }
1320 Some(Keyword::COMPUTE) => {
1321 self.expect_keyword_is(Keyword::STATISTICS)?;
1322 compute_statistics = true
1323 }
1324 _ => break,
1325 }
1326 }
1327
1328 Ok(Analyze {
1329 has_table_keyword,
1330 table_name,
1331 for_columns,
1332 columns,
1333 partitions,
1334 cache_metadata,
1335 noscan,
1336 compute_statistics,
1337 })
1338 }
1339
1340 pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1342 let index = self.index;
1343
1344 let next_token = self.next_token();
1345 match next_token.token {
1346 t @ (Token::Word(_) | Token::SingleQuotedString(_))
1347 if self.peek_token_ref().token == Token::Period =>
1348 {
1349 let mut id_parts: Vec<Ident> = vec![match t {
1350 Token::Word(w) => w.into_ident(next_token.span),
1351 Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1352 _ => {
1353 return Err(ParserError::ParserError(
1354 "Internal parser error: unexpected token type".to_string(),
1355 ))
1356 }
1357 }];
1358
1359 while self.consume_token(&Token::Period) {
1360 let next_token = self.next_token();
1361 match next_token.token {
1362 Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1363 Token::SingleQuotedString(s) => {
1364 id_parts.push(Ident::with_quote('\'', s))
1366 }
1367 Token::Placeholder(s) => {
1368 id_parts.push(Ident::new(s))
1371 }
1372 Token::Mul => {
1373 return Ok(Expr::QualifiedWildcard(
1374 ObjectName::from(id_parts),
1375 AttachedToken(next_token),
1376 ));
1377 }
1378 _ => {
1379 return self.expected("an identifier or a '*' after '.'", next_token);
1380 }
1381 }
1382 }
1383 }
1384 Token::Mul => {
1385 return Ok(Expr::Wildcard(AttachedToken(next_token)));
1386 }
1387 Token::LParen => {
1389 let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1390 if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1391 let mul_token = self.next_token(); self.next_token(); return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1394 }
1395 }
1396 _ => (),
1397 };
1398
1399 self.index = index;
1400 self.parse_expr()
1401 }
1402
1403 pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1405 self.parse_subexpr(self.dialect.prec_unknown())
1406 }
1407
1408 pub fn parse_expr_with_alias_and_order_by(
1410 &mut self,
1411 ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1412 let expr = self.parse_expr()?;
1413
1414 fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1415 explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1416 }
1417 let alias = self.parse_optional_alias_inner(None, validator)?;
1418 let order_by = OrderByOptions {
1419 sort: self.parse_optional_order_by_sort(),
1420 nulls_first: None,
1421 };
1422 Ok(ExprWithAliasAndOrderBy {
1423 expr: ExprWithAlias { expr, alias },
1424 order_by,
1425 })
1426 }
1427
1428 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1430 pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1431 let _guard = self.recursion_counter.try_decrease()?;
1432 debug!("parsing expr");
1433 let mut expr = self.parse_prefix()?;
1434
1435 expr = self.parse_compound_expr(expr, vec![])?;
1436
1437 if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1441 expr = Expr::Collate {
1442 expr: Box::new(expr),
1443 collation: self.parse_object_name(false)?,
1444 };
1445 }
1446
1447 debug!("prefix: {expr:?}");
1448 loop {
1449 let next_precedence = self.get_next_precedence()?;
1450 debug!("next precedence: {next_precedence:?}");
1451
1452 if precedence >= next_precedence {
1453 break;
1454 }
1455
1456 if Token::Period == self.peek_token_ref().token {
1459 break;
1460 }
1461
1462 expr = self.parse_infix(expr, next_precedence)?;
1463 }
1464 Ok(expr)
1465 }
1466
1467 pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1469 let condition = self.parse_expr()?;
1470 let message = if self.parse_keyword(Keyword::AS) {
1471 Some(self.parse_expr()?)
1472 } else {
1473 None
1474 };
1475
1476 Ok(Statement::Assert { condition, message })
1477 }
1478
1479 pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1481 let name = self.parse_identifier()?;
1482 Ok(Statement::Savepoint { name })
1483 }
1484
1485 pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1487 let _ = self.parse_keyword(Keyword::SAVEPOINT);
1488 let name = self.parse_identifier()?;
1489
1490 Ok(Statement::ReleaseSavepoint { name })
1491 }
1492
1493 pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1495 let channel = self.parse_identifier()?;
1496 Ok(Statement::LISTEN { channel })
1497 }
1498
1499 pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1501 let channel = if self.consume_token(&Token::Mul) {
1502 Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1503 } else {
1504 match self.parse_identifier() {
1505 Ok(expr) => expr,
1506 _ => {
1507 self.prev_token();
1508 return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1509 }
1510 }
1511 };
1512 Ok(Statement::UNLISTEN { channel })
1513 }
1514
1515 pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1517 let channel = self.parse_identifier()?;
1518 let payload = if self.consume_token(&Token::Comma) {
1519 Some(self.parse_literal_string()?)
1520 } else {
1521 None
1522 };
1523 Ok(Statement::NOTIFY { channel, payload })
1524 }
1525
1526 pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1528 if self.peek_keyword(Keyword::TABLE) {
1529 self.expect_keyword(Keyword::TABLE)?;
1530 let rename_tables = self.parse_comma_separated(|parser| {
1531 let old_name = parser.parse_object_name(false)?;
1532 parser.expect_keyword(Keyword::TO)?;
1533 let new_name = parser.parse_object_name(false)?;
1534
1535 Ok(RenameTable { old_name, new_name })
1536 })?;
1537 Ok(rename_tables.into())
1538 } else {
1539 self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1540 }
1541 }
1542
1543 fn parse_expr_prefix_by_reserved_word(
1546 &mut self,
1547 w: &Word,
1548 w_span: Span,
1549 ) -> Result<Option<Expr>, ParserError> {
1550 match w.keyword {
1551 Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1552 self.prev_token();
1553 Ok(Some(Expr::Value(self.parse_value()?)))
1554 }
1555 Keyword::NULL => {
1556 self.prev_token();
1557 Ok(Some(Expr::Value(self.parse_value()?)))
1558 }
1559 Keyword::CURRENT_CATALOG
1560 | Keyword::CURRENT_USER
1561 | Keyword::SESSION_USER
1562 | Keyword::USER
1563 if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1564 {
1565 Ok(Some(Expr::Function(Function {
1566 name: ObjectName::from(vec![w.to_ident(w_span)]),
1567 uses_odbc_syntax: false,
1568 parameters: FunctionArguments::None,
1569 args: FunctionArguments::None,
1570 null_treatment: None,
1571 filter: None,
1572 over: None,
1573 within_group: vec![],
1574 })))
1575 }
1576 Keyword::CURRENT_TIMESTAMP
1577 | Keyword::CURRENT_TIME
1578 | Keyword::CURRENT_DATE
1579 | Keyword::LOCALTIME
1580 | Keyword::LOCALTIMESTAMP => {
1581 Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1582 }
1583 Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1584 Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1585 Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1586 Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1587 Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1588 Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1589 Keyword::EXISTS
1590 if !dialect_of!(self is DatabricksDialect)
1592 || matches!(
1593 self.peek_nth_token_ref(1).token,
1594 Token::Word(Word {
1595 keyword: Keyword::SELECT | Keyword::WITH,
1596 ..
1597 })
1598 ) =>
1599 {
1600 Ok(Some(self.parse_exists_expr(false)?))
1601 }
1602 Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1603 Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1604 Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1605 Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1606 Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1607 }
1608 Keyword::SUBSTR | Keyword::SUBSTRING => {
1609 self.prev_token();
1610 Ok(Some(self.parse_substring()?))
1611 }
1612 Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1613 Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1614 Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1615 Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1617 self.expect_token(&Token::LBracket)?;
1618 Ok(Some(self.parse_array_expr(true)?))
1619 }
1620 Keyword::ARRAY
1621 if self.peek_token_ref().token == Token::LParen
1622 && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1623 {
1624 self.expect_token(&Token::LParen)?;
1625 let query = self.parse_query()?;
1626 self.expect_token(&Token::RParen)?;
1627 Ok(Some(Expr::Function(Function {
1628 name: ObjectName::from(vec![w.to_ident(w_span)]),
1629 uses_odbc_syntax: false,
1630 parameters: FunctionArguments::None,
1631 args: FunctionArguments::Subquery(query),
1632 filter: None,
1633 null_treatment: None,
1634 over: None,
1635 within_group: vec![],
1636 })))
1637 }
1638 Keyword::NOT => Ok(Some(self.parse_not()?)),
1639 Keyword::MATCH if self.dialect.supports_match_against() => {
1640 Ok(Some(self.parse_match_against()?))
1641 }
1642 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1643 let struct_expr = self.parse_struct_literal()?;
1644 Ok(Some(struct_expr))
1645 }
1646 Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1647 let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1648 Ok(Some(Expr::Prior(Box::new(expr))))
1649 }
1650 Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1651 Ok(Some(self.parse_duckdb_map_literal()?))
1652 }
1653 Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1654 Ok(Some(self.parse_lambda_expr()?))
1655 }
1656 _ if self.dialect.supports_geometric_types() => match w.keyword {
1657 Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1658 Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1659 Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1660 Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1661 Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1662 Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1663 Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1664 _ => Ok(None),
1665 },
1666 _ => Ok(None),
1667 }
1668 }
1669
1670 fn parse_expr_prefix_by_unreserved_word(
1672 &mut self,
1673 w: &Word,
1674 w_span: Span,
1675 ) -> Result<Expr, ParserError> {
1676 let is_outer_join = self.peek_outer_join_operator();
1677 match &self.peek_token_ref().token {
1678 Token::LParen if !is_outer_join => {
1679 let id_parts = vec![w.to_ident(w_span)];
1680 self.parse_function(ObjectName::from(id_parts))
1681 }
1682 Token::SingleQuotedString(_)
1684 | Token::DoubleQuotedString(_)
1685 | Token::HexStringLiteral(_)
1686 if w.value.starts_with('_') =>
1687 {
1688 Ok(Expr::Prefixed {
1689 prefix: w.to_ident(w_span),
1690 value: self.parse_introduced_string_expr()?.into(),
1691 })
1692 }
1693 Token::SingleQuotedString(_)
1695 | Token::DoubleQuotedString(_)
1696 | Token::HexStringLiteral(_)
1697 if w.value.starts_with('_') =>
1698 {
1699 Ok(Expr::Prefixed {
1700 prefix: w.to_ident(w_span),
1701 value: self.parse_introduced_string_expr()?.into(),
1702 })
1703 }
1704 Token::Arrow if self.dialect.supports_lambda_functions() => {
1708 self.expect_token(&Token::Arrow)?;
1709 Ok(Expr::Lambda(LambdaFunction {
1710 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1711 name: w.to_ident(w_span),
1712 data_type: None,
1713 }),
1714 body: Box::new(self.parse_expr()?),
1715 syntax: LambdaSyntax::Arrow,
1716 }))
1717 }
1718 Token::Word(_)
1722 if self.dialect.supports_lambda_functions()
1723 && self.peek_nth_token_ref(1).token == Token::Arrow =>
1724 {
1725 let data_type = self.parse_data_type()?;
1726 self.expect_token(&Token::Arrow)?;
1727 Ok(Expr::Lambda(LambdaFunction {
1728 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1729 name: w.to_ident(w_span),
1730 data_type: Some(data_type),
1731 }),
1732 body: Box::new(self.parse_expr()?),
1733 syntax: LambdaSyntax::Arrow,
1734 }))
1735 }
1736 _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1737 }
1738 }
1739
1740 fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1743 if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1744 ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1745 } else {
1746 false
1747 }
1748 }
1749
1750 pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1752 if let Some(prefix) = self.dialect.parse_prefix(self) {
1754 return prefix;
1755 }
1756
1757 let start_index = self.index;
1763 if let Some(&cached) = self.failed_prefix_positions.get(&start_index) {
1764 return self.cached_prefix_error(cached, self.peek_token_ref());
1765 }
1766 let result = self.parse_prefix_inner();
1767 if let Err(ref e) = result {
1768 self.failed_prefix_positions.insert(start_index, e.into());
1769 }
1770 result
1771 }
1772
1773 fn cached_prefix_error<T>(
1775 &self,
1776 cached: ExprPrefixError,
1777 found: &TokenWithSpan,
1778 ) -> Result<T, ParserError> {
1779 match cached {
1780 ExprPrefixError::RecursionLimitExceeded => Err(ParserError::RecursionLimitExceeded),
1781 ExprPrefixError::Err => self.expected_ref("an expression", found),
1782 }
1783 }
1784
1785 fn parse_prefix_inner(&mut self) -> Result<Expr, ParserError> {
1786 let loc = self.peek_token_ref().span.start;
1803 let opt_expr = self.maybe_parse(|parser| {
1804 match parser.parse_data_type()? {
1805 DataType::Interval { .. } => parser.parse_interval(),
1806 DataType::Custom(ref name, ref modifiers)
1817 if modifiers.is_empty()
1818 && Self::is_simple_unquoted_object_name(name, "xml")
1819 && parser.dialect.supports_xml_expressions() =>
1820 {
1821 Ok(Expr::TypedString(TypedString {
1822 data_type: DataType::Custom(name.clone(), modifiers.clone()),
1823 value: parser.parse_value()?,
1824 uses_odbc_syntax: false,
1825 }))
1826 }
1827 DataType::Custom(..) => parser_err!("dummy", loc),
1828 DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1830 Ok(Expr::Cast {
1831 kind: CastKind::Cast,
1832 expr: Box::new(parser.parse_expr()?),
1833 data_type: DataType::Binary(None),
1834 array: false,
1835 format: None,
1836 })
1837 }
1838 data_type => Ok(Expr::TypedString(TypedString {
1839 data_type,
1840 value: parser.parse_value()?,
1841 uses_odbc_syntax: false,
1842 })),
1843 }
1844 })?;
1845
1846 if let Some(expr) = opt_expr {
1847 return Ok(expr);
1848 }
1849
1850 let dialect = self.dialect;
1854
1855 self.advance_token();
1856 let next_token_index = self.get_current_index();
1857 let next_token = self.get_current_token();
1858 let span = next_token.span;
1859 let expr = match &next_token.token {
1860 Token::Word(w) => {
1861 let w = w.clone();
1870 let try_parse_result = if let Some(&cached) = self
1877 .failed_reserved_word_prefix_positions
1878 .get(&next_token_index)
1879 {
1880 self.cached_prefix_error(cached, self.get_current_token())
1881 } else {
1882 self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span))
1883 };
1884 match try_parse_result {
1885 Ok(Some(expr)) => Ok(expr),
1887
1888 Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1890
1891 Err(e) => {
1898 self.failed_reserved_word_prefix_positions
1899 .insert(next_token_index, (&e).into());
1900 if !self.dialect.is_reserved_for_identifier(w.keyword) {
1901 if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1902 parser.parse_expr_prefix_by_unreserved_word(&w, span)
1903 }) {
1904 return Ok(expr);
1905 }
1906 }
1907 return Err(e);
1908 }
1909 }
1910 } Token::LBracket => self.parse_array_expr(false),
1913 tok @ Token::Minus | tok @ Token::Plus => {
1914 let op = if *tok == Token::Plus {
1915 UnaryOperator::Plus
1916 } else {
1917 UnaryOperator::Minus
1918 };
1919 Ok(Expr::UnaryOp {
1920 op,
1921 expr: Box::new(
1922 self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1923 ),
1924 })
1925 }
1926 Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1927 op: UnaryOperator::BangNot,
1928 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1929 }),
1930 tok @ Token::DoubleExclamationMark
1931 | tok @ Token::PGSquareRoot
1932 | tok @ Token::PGCubeRoot
1933 | tok @ Token::AtSign
1934 if dialect_is!(dialect is PostgreSqlDialect) =>
1935 {
1936 let op = match tok {
1937 Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1938 Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1939 Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1940 Token::AtSign => UnaryOperator::PGAbs,
1941 _ => {
1942 return Err(ParserError::ParserError(
1943 "Internal parser error: unexpected unary operator token".to_string(),
1944 ))
1945 }
1946 };
1947 Ok(Expr::UnaryOp {
1948 op,
1949 expr: Box::new(
1950 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1951 ),
1952 })
1953 }
1954 Token::Tilde => Ok(Expr::UnaryOp {
1955 op: UnaryOperator::BitwiseNot,
1956 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1957 }),
1958 tok @ Token::Sharp
1959 | tok @ Token::AtDashAt
1960 | tok @ Token::AtAt
1961 | tok @ Token::QuestionMarkDash
1962 | tok @ Token::QuestionPipe
1963 if self.dialect.supports_geometric_types() =>
1964 {
1965 let op = match tok {
1966 Token::Sharp => UnaryOperator::Hash,
1967 Token::AtDashAt => UnaryOperator::AtDashAt,
1968 Token::AtAt => UnaryOperator::DoubleAt,
1969 Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1970 Token::QuestionPipe => UnaryOperator::QuestionPipe,
1971 _ => {
1972 return Err(ParserError::ParserError(format!(
1973 "Unexpected token in unary operator parsing: {tok:?}"
1974 )))
1975 }
1976 };
1977 Ok(Expr::UnaryOp {
1978 op,
1979 expr: Box::new(
1980 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1981 ),
1982 })
1983 }
1984 Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1985 {
1986 self.prev_token();
1987 Ok(Expr::Value(self.parse_value()?))
1988 }
1989 Token::UnicodeStringLiteral(_) => {
1990 self.prev_token();
1991 Ok(Expr::Value(self.parse_value()?))
1992 }
1993 Token::Number(_, _)
1994 | Token::SingleQuotedString(_)
1995 | Token::DoubleQuotedString(_)
1996 | Token::TripleSingleQuotedString(_)
1997 | Token::TripleDoubleQuotedString(_)
1998 | Token::DollarQuotedString(_)
1999 | Token::SingleQuotedByteStringLiteral(_)
2000 | Token::DoubleQuotedByteStringLiteral(_)
2001 | Token::TripleSingleQuotedByteStringLiteral(_)
2002 | Token::TripleDoubleQuotedByteStringLiteral(_)
2003 | Token::SingleQuotedRawStringLiteral(_)
2004 | Token::DoubleQuotedRawStringLiteral(_)
2005 | Token::TripleSingleQuotedRawStringLiteral(_)
2006 | Token::TripleDoubleQuotedRawStringLiteral(_)
2007 | Token::NationalStringLiteral(_)
2008 | Token::QuoteDelimitedStringLiteral(_)
2009 | Token::NationalQuoteDelimitedStringLiteral(_)
2010 | Token::HexStringLiteral(_) => {
2011 self.prev_token();
2012 Ok(Expr::Value(self.parse_value()?))
2013 }
2014 Token::LParen => {
2015 let expr =
2016 if let Some(expr) = self.try_parse_expr_sub_query()? {
2017 expr
2018 } else if let Some(lambda) = self.try_parse_lambda()? {
2019 return Ok(lambda);
2020 } else {
2021 let exprs = self.with_state(ParserState::Normal, |p| {
2032 p.parse_comma_separated(Parser::parse_expr)
2033 })?;
2034 match exprs.len() {
2035 0 => return Err(ParserError::ParserError(
2036 "Internal parser error: parse_comma_separated returned empty list"
2037 .to_string(),
2038 )),
2039 1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
2040 _ => Expr::Tuple(exprs),
2041 }
2042 };
2043 self.expect_token(&Token::RParen)?;
2044 Ok(expr)
2045 }
2046 Token::Placeholder(_) | Token::Colon | Token::AtSign => {
2047 self.prev_token();
2048 Ok(Expr::Value(self.parse_value()?))
2049 }
2050 Token::LBrace => {
2051 self.prev_token();
2052 self.parse_lbrace_expr()
2053 }
2054 _ => self.expected_at("an expression", next_token_index),
2055 }?;
2056
2057 Ok(expr)
2058 }
2059
2060 fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
2061 Ok(Expr::TypedString(TypedString {
2062 data_type: DataType::GeometricType(kind),
2063 value: self.parse_value()?,
2064 uses_odbc_syntax: false,
2065 }))
2066 }
2067
2068 pub fn parse_compound_expr(
2075 &mut self,
2076 root: Expr,
2077 mut chain: Vec<AccessExpr>,
2078 ) -> Result<Expr, ParserError> {
2079 let mut ending_wildcard: Option<TokenWithSpan> = None;
2080 loop {
2081 if self.consume_token(&Token::Period) {
2082 let next_token = self.peek_token_ref();
2083 match &next_token.token {
2084 Token::Mul => {
2085 if dialect_of!(self is PostgreSqlDialect) {
2088 ending_wildcard = Some(self.next_token());
2089 } else {
2090 self.prev_token(); }
2097
2098 break;
2099 }
2100 Token::SingleQuotedString(s) => {
2101 let expr =
2102 Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2103 chain.push(AccessExpr::Dot(expr));
2104 self.advance_token(); }
2106 Token::Placeholder(s) => {
2107 let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2110 chain.push(AccessExpr::Dot(expr));
2111 self.advance_token(); }
2113 _ => {
2121 let word_field_no_lparen =
2129 matches!(self.peek_token_ref().token, Token::Word(_))
2130 && self.peek_nth_token_ref(1).token != Token::LParen;
2131
2132 let expr = if word_field_no_lparen {
2133 None
2134 } else {
2135 self.maybe_parse(|parser| {
2136 let expr = parser.parse_prefix()?;
2137 match &expr {
2138 Expr::CompoundFieldAccess { .. }
2139 | Expr::CompoundIdentifier(_)
2140 | Expr::Identifier(_)
2141 | Expr::Value(_)
2142 | Expr::Function(_) => Ok(expr),
2143 _ => parser.expected_ref(
2144 "an identifier or value",
2145 parser.peek_token_ref(),
2146 ),
2147 }
2148 })?
2149 };
2150
2151 match expr {
2152 Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2161 chain.push(AccessExpr::Dot(*root));
2162 chain.extend(access_chain);
2163 }
2164 Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2165 parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2166 ),
2167 Some(expr) => {
2168 chain.push(AccessExpr::Dot(expr));
2169 }
2170 None => {
2174 chain.push(AccessExpr::Dot(Expr::Identifier(
2175 self.parse_identifier()?,
2176 )));
2177 }
2178 }
2179 }
2180 }
2181 } else if !self.dialect.supports_partiql()
2182 && self.peek_token_ref().token == Token::LBracket
2183 {
2184 self.parse_multi_dim_subscript(&mut chain)?;
2185 } else {
2186 break;
2187 }
2188 }
2189
2190 let tok_index = self.get_current_index();
2191 if let Some(wildcard_token) = ending_wildcard {
2192 if !Self::is_all_ident(&root, &chain) {
2193 return self
2194 .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2195 };
2196 Ok(Expr::QualifiedWildcard(
2197 ObjectName::from(Self::exprs_to_idents(root, chain)?),
2198 AttachedToken(wildcard_token),
2199 ))
2200 } else if self.maybe_parse_outer_join_operator() {
2201 if !Self::is_all_ident(&root, &chain) {
2202 return self.expected_at("column identifier before (+)", tok_index);
2203 };
2204 let expr = if chain.is_empty() {
2205 root
2206 } else {
2207 Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2208 };
2209 Ok(Expr::OuterJoin(expr.into()))
2210 } else {
2211 Self::build_compound_expr(root, chain)
2212 }
2213 }
2214
2215 fn build_compound_expr(
2220 root: Expr,
2221 mut access_chain: Vec<AccessExpr>,
2222 ) -> Result<Expr, ParserError> {
2223 if access_chain.is_empty() {
2224 return Ok(root);
2225 }
2226
2227 if Self::is_all_ident(&root, &access_chain) {
2228 return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2229 root,
2230 access_chain,
2231 )?));
2232 }
2233
2234 if matches!(root, Expr::Identifier(_))
2239 && matches!(
2240 access_chain.last(),
2241 Some(AccessExpr::Dot(Expr::Function(_)))
2242 )
2243 && access_chain
2244 .iter()
2245 .rev()
2246 .skip(1) .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2248 {
2249 let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2250 return parser_err!("expected function expression", root.span().start);
2251 };
2252
2253 let compound_func_name = [root]
2254 .into_iter()
2255 .chain(access_chain.into_iter().flat_map(|access| match access {
2256 AccessExpr::Dot(expr) => Some(expr),
2257 _ => None,
2258 }))
2259 .flat_map(|expr| match expr {
2260 Expr::Identifier(ident) => Some(ident),
2261 _ => None,
2262 })
2263 .map(ObjectNamePart::Identifier)
2264 .chain(func.name.0)
2265 .collect::<Vec<_>>();
2266 func.name = ObjectName(compound_func_name);
2267
2268 return Ok(Expr::Function(func));
2269 }
2270
2271 if access_chain.len() == 1
2276 && matches!(
2277 access_chain.last(),
2278 Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2279 )
2280 {
2281 let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2282 return parser_err!("expected (+) expression", root.span().start);
2283 };
2284
2285 if !Self::is_all_ident(&root, &[]) {
2286 return parser_err!("column identifier before (+)", root.span().start);
2287 };
2288
2289 let token_start = root.span().start;
2290 let mut idents = Self::exprs_to_idents(root, vec![])?;
2291 match *inner_expr {
2292 Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2293 Expr::Identifier(suffix) => idents.push(suffix),
2294 _ => {
2295 return parser_err!("column identifier before (+)", token_start);
2296 }
2297 }
2298
2299 return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2300 }
2301
2302 Ok(Expr::CompoundFieldAccess {
2303 root: Box::new(root),
2304 access_chain,
2305 })
2306 }
2307
2308 fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2309 match k {
2310 Keyword::LOCAL => Some(ContextModifier::Local),
2311 Keyword::GLOBAL => Some(ContextModifier::Global),
2312 Keyword::SESSION => Some(ContextModifier::Session),
2313 _ => None,
2314 }
2315 }
2316
2317 fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2319 if !matches!(root, Expr::Identifier(_)) {
2320 return false;
2321 }
2322 fields
2323 .iter()
2324 .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2325 }
2326
2327 fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2329 let mut idents = vec![];
2330 if let Expr::Identifier(root) = root {
2331 idents.push(root);
2332 for x in fields {
2333 if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2334 idents.push(ident);
2335 } else {
2336 return parser_err!(
2337 format!("Expected identifier, found: {}", x),
2338 x.span().start
2339 );
2340 }
2341 }
2342 Ok(idents)
2343 } else {
2344 parser_err!(
2345 format!("Expected identifier, found: {}", root),
2346 root.span().start
2347 )
2348 }
2349 }
2350
2351 fn peek_outer_join_operator(&mut self) -> bool {
2353 if !self.dialect.supports_outer_join_operator() {
2354 return false;
2355 }
2356
2357 let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2358 Token::LParen == maybe_lparen.token
2359 && Token::Plus == maybe_plus.token
2360 && Token::RParen == maybe_rparen.token
2361 }
2362
2363 fn maybe_parse_outer_join_operator(&mut self) -> bool {
2366 self.dialect.supports_outer_join_operator()
2367 && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2368 }
2369
2370 pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2372 self.expect_token(&Token::LParen)?;
2373 let options = self.parse_comma_separated(Self::parse_utility_option)?;
2374 self.expect_token(&Token::RParen)?;
2375
2376 Ok(options)
2377 }
2378
2379 fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2380 let name = self.parse_identifier()?;
2381
2382 let next_token = self.peek_token_ref();
2383 if next_token == &Token::Comma || next_token == &Token::RParen {
2384 return Ok(UtilityOption { name, arg: None });
2385 }
2386 let arg = self.parse_expr()?;
2387
2388 Ok(UtilityOption {
2389 name,
2390 arg: Some(arg),
2391 })
2392 }
2393
2394 fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2395 if !self.peek_sub_query() {
2396 return Ok(None);
2397 }
2398
2399 Ok(Some(Expr::Subquery(self.parse_query()?)))
2400 }
2401
2402 fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2403 if !self.dialect.supports_lambda_functions() {
2404 return Ok(None);
2405 }
2406 self.maybe_parse(|p| {
2407 let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2408 p.expect_token(&Token::RParen)?;
2409 p.expect_token(&Token::Arrow)?;
2410 let expr = p.parse_expr()?;
2411 Ok(Expr::Lambda(LambdaFunction {
2412 params: OneOrManyWithParens::Many(params),
2413 body: Box::new(expr),
2414 syntax: LambdaSyntax::Arrow,
2415 }))
2416 })
2417 }
2418
2419 fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2429 let params = self.parse_lambda_function_parameters()?;
2431 self.expect_token(&Token::Colon)?;
2433 let body = self.parse_expr()?;
2435 Ok(Expr::Lambda(LambdaFunction {
2436 params,
2437 body: Box::new(body),
2438 syntax: LambdaSyntax::LambdaKeyword,
2439 }))
2440 }
2441
2442 fn parse_lambda_function_parameters(
2444 &mut self,
2445 ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2446 let params = if self.consume_token(&Token::LParen) {
2448 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2450 self.expect_token(&Token::RParen)?;
2451 OneOrManyWithParens::Many(params)
2452 } else {
2453 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2455 if params.len() == 1 {
2456 OneOrManyWithParens::One(params.into_iter().next().unwrap())
2457 } else {
2458 OneOrManyWithParens::Many(params)
2459 }
2460 };
2461 Ok(params)
2462 }
2463
2464 fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2466 let name = self.parse_identifier()?;
2467 let data_type = match &self.peek_token_ref().token {
2468 Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2469 _ => None,
2470 };
2471 Ok(LambdaFunctionParameter { name, data_type })
2472 }
2473
2474 fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2481 if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2483 return Ok(Some(expr));
2484 }
2485 self.maybe_parse_odbc_body_datetime()
2487 }
2488
2489 fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2500 self.maybe_parse(|p| {
2501 let token = p.next_token().clone();
2502 let word_string = token.token.to_string();
2503 let data_type = match word_string.as_str() {
2504 "t" => DataType::Time(None, TimezoneInfo::None),
2505 "d" => DataType::Date,
2506 "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2507 _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2508 };
2509 let value = p.parse_value()?;
2510 Ok(Expr::TypedString(TypedString {
2511 data_type,
2512 value,
2513 uses_odbc_syntax: true,
2514 }))
2515 })
2516 }
2517
2518 fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2527 self.maybe_parse(|p| {
2528 p.expect_keyword(Keyword::FN)?;
2529 let fn_name = p.parse_object_name(false)?;
2530 let mut fn_call = p.parse_function_call(fn_name)?;
2531 fn_call.uses_odbc_syntax = true;
2532 Ok(Expr::Function(fn_call))
2533 })
2534 }
2535
2536 pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2538 self.parse_function_call(name).map(Expr::Function)
2539 }
2540
2541 fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2542 self.expect_token(&Token::LParen)?;
2543
2544 if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2547 let subquery = self.parse_query()?;
2548 self.expect_token(&Token::RParen)?;
2549 return Ok(Function {
2550 name,
2551 uses_odbc_syntax: false,
2552 parameters: FunctionArguments::None,
2553 args: FunctionArguments::Subquery(subquery),
2554 filter: None,
2555 null_treatment: None,
2556 over: None,
2557 within_group: vec![],
2558 });
2559 }
2560
2561 let mut args = self.parse_function_argument_list()?;
2562 let mut parameters = FunctionArguments::None;
2563 if dialect_of!(self is ClickHouseDialect | GenericDialect)
2566 && self.consume_token(&Token::LParen)
2567 {
2568 parameters = FunctionArguments::List(args);
2569 args = self.parse_function_argument_list()?;
2570 }
2571
2572 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2573 self.expect_token(&Token::LParen)?;
2574 self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2575 let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2576 self.expect_token(&Token::RParen)?;
2577 order_by
2578 } else {
2579 vec![]
2580 };
2581
2582 let filter = if self.dialect.supports_filter_during_aggregation()
2583 && self.parse_keyword(Keyword::FILTER)
2584 && self.consume_token(&Token::LParen)
2585 && self.parse_keyword(Keyword::WHERE)
2586 {
2587 let filter = Some(Box::new(self.parse_expr()?));
2588 self.expect_token(&Token::RParen)?;
2589 filter
2590 } else {
2591 None
2592 };
2593
2594 let null_treatment = if args
2597 .clauses
2598 .iter()
2599 .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2600 {
2601 self.parse_null_treatment()?
2602 } else {
2603 None
2604 };
2605
2606 let over = if self.parse_keyword(Keyword::OVER) {
2607 if self.consume_token(&Token::LParen) {
2608 let window_spec = self.parse_window_spec()?;
2609 Some(WindowType::WindowSpec(window_spec))
2610 } else {
2611 Some(WindowType::NamedWindow(self.parse_identifier()?))
2612 }
2613 } else {
2614 None
2615 };
2616
2617 Ok(Function {
2618 name,
2619 uses_odbc_syntax: false,
2620 parameters,
2621 args: FunctionArguments::List(args),
2622 null_treatment,
2623 filter,
2624 over,
2625 within_group,
2626 })
2627 }
2628
2629 fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2631 match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2632 Some(keyword) => {
2633 self.expect_keyword_is(Keyword::NULLS)?;
2634
2635 Ok(match keyword {
2636 Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2637 Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2638 _ => None,
2639 })
2640 }
2641 None => Ok(None),
2642 }
2643 }
2644
2645 pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2647 let args = if self.consume_token(&Token::LParen) {
2648 FunctionArguments::List(self.parse_function_argument_list()?)
2649 } else {
2650 FunctionArguments::None
2651 };
2652 Ok(Expr::Function(Function {
2653 name,
2654 uses_odbc_syntax: false,
2655 parameters: FunctionArguments::None,
2656 args,
2657 filter: None,
2658 over: None,
2659 null_treatment: None,
2660 within_group: vec![],
2661 }))
2662 }
2663
2664 pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2666 let next_token = self.next_token();
2667 match &next_token.token {
2668 Token::Word(w) => match w.keyword {
2669 Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2670 Keyword::RANGE => Ok(WindowFrameUnits::Range),
2671 Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2672 _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2673 },
2674 _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2675 }
2676 }
2677
2678 pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2680 let units = self.parse_window_frame_units()?;
2681 let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2682 let start_bound = self.parse_window_frame_bound()?;
2683 self.expect_keyword_is(Keyword::AND)?;
2684 let end_bound = Some(self.parse_window_frame_bound()?);
2685 (start_bound, end_bound)
2686 } else {
2687 (self.parse_window_frame_bound()?, None)
2688 };
2689 Ok(WindowFrame {
2690 units,
2691 start_bound,
2692 end_bound,
2693 })
2694 }
2695
2696 pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2698 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2699 Ok(WindowFrameBound::CurrentRow)
2700 } else {
2701 let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2702 None
2703 } else {
2704 Some(Box::new(match &self.peek_token_ref().token {
2705 Token::SingleQuotedString(_) => self.parse_interval()?,
2706 _ => self.parse_expr()?,
2707 }))
2708 };
2709 if self.parse_keyword(Keyword::PRECEDING) {
2710 Ok(WindowFrameBound::Preceding(rows))
2711 } else if self.parse_keyword(Keyword::FOLLOWING) {
2712 Ok(WindowFrameBound::Following(rows))
2713 } else {
2714 self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2715 }
2716 }
2717 }
2718
2719 fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2721 if self.dialect.supports_group_by_expr() {
2722 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2723 self.expect_token(&Token::LParen)?;
2724 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2725 self.expect_token(&Token::RParen)?;
2726 Ok(Expr::GroupingSets(result))
2727 } else if self.parse_keyword(Keyword::CUBE) {
2728 self.expect_token(&Token::LParen)?;
2729 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2730 self.expect_token(&Token::RParen)?;
2731 Ok(Expr::Cube(result))
2732 } else if self.parse_keyword(Keyword::ROLLUP) {
2733 self.expect_token(&Token::LParen)?;
2734 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2735 self.expect_token(&Token::RParen)?;
2736 Ok(Expr::Rollup(result))
2737 } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2738 Ok(Expr::Tuple(vec![]))
2742 } else {
2743 self.parse_expr()
2744 }
2745 } else {
2746 self.parse_expr()
2748 }
2749 }
2750
2751 fn parse_tuple(
2755 &mut self,
2756 lift_singleton: bool,
2757 allow_empty: bool,
2758 ) -> Result<Vec<Expr>, ParserError> {
2759 if lift_singleton {
2760 if self.consume_token(&Token::LParen) {
2761 let result = if allow_empty && self.consume_token(&Token::RParen) {
2762 vec![]
2763 } else {
2764 let result = self.parse_comma_separated(Parser::parse_expr)?;
2765 self.expect_token(&Token::RParen)?;
2766 result
2767 };
2768 Ok(result)
2769 } else {
2770 Ok(vec![self.parse_expr()?])
2771 }
2772 } else {
2773 self.expect_token(&Token::LParen)?;
2774 let result = if allow_empty && self.consume_token(&Token::RParen) {
2775 vec![]
2776 } else {
2777 let result = self.parse_comma_separated(Parser::parse_expr)?;
2778 self.expect_token(&Token::RParen)?;
2779 result
2780 };
2781 Ok(result)
2782 }
2783 }
2784
2785 pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2787 let case_token = AttachedToken(self.get_current_token().clone());
2788 let mut operand = None;
2789 if !self.parse_keyword(Keyword::WHEN) {
2790 operand = Some(Box::new(self.parse_expr()?));
2791 self.expect_keyword_is(Keyword::WHEN)?;
2792 }
2793 let mut conditions = vec![];
2794 loop {
2795 let condition = self.parse_expr()?;
2796 self.expect_keyword_is(Keyword::THEN)?;
2797 let result = self.parse_expr()?;
2798 conditions.push(CaseWhen { condition, result });
2799 if !self.parse_keyword(Keyword::WHEN) {
2800 break;
2801 }
2802 }
2803 let else_result = if self.parse_keyword(Keyword::ELSE) {
2804 Some(Box::new(self.parse_expr()?))
2805 } else {
2806 None
2807 };
2808 let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2809 Ok(Expr::Case {
2810 case_token,
2811 end_token,
2812 operand,
2813 conditions,
2814 else_result,
2815 })
2816 }
2817
2818 pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2820 if self.parse_keyword(Keyword::FORMAT) {
2821 let value = self.parse_value()?;
2822 match self.parse_optional_time_zone()? {
2823 Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2824 None => Ok(Some(CastFormat::Value(value))),
2825 }
2826 } else {
2827 Ok(None)
2828 }
2829 }
2830
2831 pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2833 if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2834 self.parse_value().map(Some)
2835 } else {
2836 Ok(None)
2837 }
2838 }
2839
2840 fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2842 self.expect_token(&Token::LParen)?;
2843 let data_type = self.parse_data_type()?;
2844 self.expect_token(&Token::Comma)?;
2845 let expr = self.parse_expr()?;
2846 let styles = if self.consume_token(&Token::Comma) {
2847 self.parse_comma_separated(Parser::parse_expr)?
2848 } else {
2849 Default::default()
2850 };
2851 self.expect_token(&Token::RParen)?;
2852 Ok(Expr::Convert {
2853 is_try,
2854 expr: Box::new(expr),
2855 data_type: Some(data_type),
2856 charset: None,
2857 target_before_value: true,
2858 styles,
2859 })
2860 }
2861
2862 pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2867 if self.dialect.convert_type_before_value() {
2868 return self.parse_mssql_convert(is_try);
2869 }
2870 self.expect_token(&Token::LParen)?;
2871 let expr = self.parse_expr()?;
2872 if self.parse_keyword(Keyword::USING) {
2873 let charset = self.parse_object_name(false)?;
2874 self.expect_token(&Token::RParen)?;
2875 return Ok(Expr::Convert {
2876 is_try,
2877 expr: Box::new(expr),
2878 data_type: None,
2879 charset: Some(charset),
2880 target_before_value: false,
2881 styles: vec![],
2882 });
2883 }
2884 self.expect_token(&Token::Comma)?;
2885 let data_type = self.parse_data_type()?;
2886 let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2887 Some(self.parse_object_name(false)?)
2888 } else {
2889 None
2890 };
2891 self.expect_token(&Token::RParen)?;
2892 Ok(Expr::Convert {
2893 is_try,
2894 expr: Box::new(expr),
2895 data_type: Some(data_type),
2896 charset,
2897 target_before_value: false,
2898 styles: vec![],
2899 })
2900 }
2901
2902 pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2904 self.expect_token(&Token::LParen)?;
2905 let expr = self.parse_expr()?;
2906 self.expect_keyword_is(Keyword::AS)?;
2907 let data_type = self.parse_data_type()?;
2908 let array = self.parse_keyword(Keyword::ARRAY);
2909 let format = self.parse_optional_cast_format()?;
2910 self.expect_token(&Token::RParen)?;
2911 Ok(Expr::Cast {
2912 kind,
2913 expr: Box::new(expr),
2914 data_type,
2915 array,
2916 format,
2917 })
2918 }
2919
2920 pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2922 self.expect_token(&Token::LParen)?;
2923 let exists_node = Expr::Exists {
2924 negated,
2925 subquery: self.parse_query()?,
2926 };
2927 self.expect_token(&Token::RParen)?;
2928 Ok(exists_node)
2929 }
2930
2931 pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2933 self.expect_token(&Token::LParen)?;
2934 let field = self.parse_date_time_field()?;
2935
2936 let syntax = if self.parse_keyword(Keyword::FROM) {
2937 ExtractSyntax::From
2938 } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2939 {
2940 ExtractSyntax::Comma
2941 } else {
2942 return Err(ParserError::ParserError(
2943 "Expected 'FROM' or ','".to_string(),
2944 ));
2945 };
2946
2947 let expr = self.parse_expr()?;
2948 self.expect_token(&Token::RParen)?;
2949 Ok(Expr::Extract {
2950 field,
2951 expr: Box::new(expr),
2952 syntax,
2953 })
2954 }
2955
2956 pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2958 self.expect_token(&Token::LParen)?;
2959 let expr = self.parse_expr()?;
2960 let field = if self.parse_keyword(Keyword::TO) {
2962 CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2964 } else if self.consume_token(&Token::Comma) {
2965 let v = self.parse_value()?;
2967 if matches!(v.value, Value::Number(_, _)) {
2968 CeilFloorKind::Scale(v)
2969 } else {
2970 return Err(ParserError::ParserError(
2971 "Scale field can only be of number type".to_string(),
2972 ));
2973 }
2974 } else {
2975 CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2976 };
2977 self.expect_token(&Token::RParen)?;
2978 if is_ceil {
2979 Ok(Expr::Ceil {
2980 expr: Box::new(expr),
2981 field,
2982 })
2983 } else {
2984 Ok(Expr::Floor {
2985 expr: Box::new(expr),
2986 field,
2987 })
2988 }
2989 }
2990
2991 pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2993 let between_prec = self.dialect.prec_value(Precedence::Between);
2994 let position_expr = self.maybe_parse(|p| {
2995 p.expect_token(&Token::LParen)?;
2997
2998 let expr = p.parse_subexpr(between_prec)?;
3000 p.expect_keyword_is(Keyword::IN)?;
3001 let from = p.parse_expr()?;
3002 p.expect_token(&Token::RParen)?;
3003 Ok(Expr::Position {
3004 expr: Box::new(expr),
3005 r#in: Box::new(from),
3006 })
3007 })?;
3008 match position_expr {
3009 Some(expr) => Ok(expr),
3010 None => self.parse_function(ObjectName::from(vec![ident])),
3013 }
3014 }
3015
3016 pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
3018 let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
3019 Keyword::SUBSTR => true,
3020 Keyword::SUBSTRING => false,
3021 _ => {
3022 self.prev_token();
3023 return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
3024 }
3025 };
3026 self.expect_token(&Token::LParen)?;
3027 let expr = self.parse_expr()?;
3028 let mut from_expr = None;
3029 let special = self.consume_token(&Token::Comma);
3030 if special || self.parse_keyword(Keyword::FROM) {
3031 from_expr = Some(self.parse_expr()?);
3032 }
3033
3034 let mut to_expr = None;
3035 if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
3036 to_expr = Some(self.parse_expr()?);
3037 }
3038 self.expect_token(&Token::RParen)?;
3039
3040 Ok(Expr::Substring {
3041 expr: Box::new(expr),
3042 substring_from: from_expr.map(Box::new),
3043 substring_for: to_expr.map(Box::new),
3044 special,
3045 shorthand,
3046 })
3047 }
3048
3049 pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
3053 self.expect_token(&Token::LParen)?;
3055 let expr = self.parse_expr()?;
3056 self.expect_keyword_is(Keyword::PLACING)?;
3057 let what_expr = self.parse_expr()?;
3058 self.expect_keyword_is(Keyword::FROM)?;
3059 let from_expr = self.parse_expr()?;
3060 let mut for_expr = None;
3061 if self.parse_keyword(Keyword::FOR) {
3062 for_expr = Some(self.parse_expr()?);
3063 }
3064 self.expect_token(&Token::RParen)?;
3065
3066 Ok(Expr::Overlay {
3067 expr: Box::new(expr),
3068 overlay_what: Box::new(what_expr),
3069 overlay_from: Box::new(from_expr),
3070 overlay_for: for_expr.map(Box::new),
3071 })
3072 }
3073
3074 pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
3080 self.expect_token(&Token::LParen)?;
3081 let mut trim_where = None;
3082 if let Token::Word(word) = &self.peek_token_ref().token {
3083 if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
3084 trim_where = Some(self.parse_trim_where()?);
3085 }
3086 }
3087 let expr = self.parse_expr()?;
3088 if self.parse_keyword(Keyword::FROM) {
3089 let trim_what = Box::new(expr);
3090 let expr = self.parse_expr()?;
3091 self.expect_token(&Token::RParen)?;
3092 Ok(Expr::Trim {
3093 expr: Box::new(expr),
3094 trim_where,
3095 trim_what: Some(trim_what),
3096 trim_characters: None,
3097 })
3098 } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
3099 {
3100 let characters = self.parse_comma_separated(Parser::parse_expr)?;
3101 self.expect_token(&Token::RParen)?;
3102 Ok(Expr::Trim {
3103 expr: Box::new(expr),
3104 trim_where: None,
3105 trim_what: None,
3106 trim_characters: Some(characters),
3107 })
3108 } else {
3109 self.expect_token(&Token::RParen)?;
3110 Ok(Expr::Trim {
3111 expr: Box::new(expr),
3112 trim_where,
3113 trim_what: None,
3114 trim_characters: None,
3115 })
3116 }
3117 }
3118
3119 pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3123 let next_token = self.next_token();
3124 match &next_token.token {
3125 Token::Word(w) => match w.keyword {
3126 Keyword::BOTH => Ok(TrimWhereField::Both),
3127 Keyword::LEADING => Ok(TrimWhereField::Leading),
3128 Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3129 _ => self.expected("trim_where field", next_token)?,
3130 },
3131 _ => self.expected("trim_where field", next_token),
3132 }
3133 }
3134
3135 pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3138 let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3139 self.expect_token(&Token::RBracket)?;
3140 Ok(Expr::Array(Array { elem: exprs, named }))
3141 }
3142
3143 pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3147 if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3148 if self.parse_keyword(Keyword::ERROR) {
3149 Ok(Some(ListAggOnOverflow::Error))
3150 } else {
3151 self.expect_keyword_is(Keyword::TRUNCATE)?;
3152 let filler = match &self.peek_token_ref().token {
3153 Token::Word(w)
3154 if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3155 {
3156 None
3157 }
3158 Token::SingleQuotedString(_)
3159 | Token::EscapedStringLiteral(_)
3160 | Token::UnicodeStringLiteral(_)
3161 | Token::NationalStringLiteral(_)
3162 | Token::QuoteDelimitedStringLiteral(_)
3163 | Token::NationalQuoteDelimitedStringLiteral(_)
3164 | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3165 _ => self.expected_ref(
3166 "either filler, WITH, or WITHOUT in LISTAGG",
3167 self.peek_token_ref(),
3168 )?,
3169 };
3170 let with_count = self.parse_keyword(Keyword::WITH);
3171 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3172 self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3173 }
3174 self.expect_keyword_is(Keyword::COUNT)?;
3175 Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3176 }
3177 } else {
3178 Ok(None)
3179 }
3180 }
3181
3182 pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3189 let next_token = self.next_token();
3190 match &next_token.token {
3191 Token::Word(w) => match w.keyword {
3192 Keyword::YEAR => Ok(DateTimeField::Year),
3193 Keyword::YEARS => Ok(DateTimeField::Years),
3194 Keyword::MONTH => Ok(DateTimeField::Month),
3195 Keyword::MONTHS => Ok(DateTimeField::Months),
3196 Keyword::WEEK => {
3197 let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3198 && self.consume_token(&Token::LParen)
3199 {
3200 let week_day = self.parse_identifier()?;
3201 self.expect_token(&Token::RParen)?;
3202 Some(week_day)
3203 } else {
3204 None
3205 };
3206 Ok(DateTimeField::Week(week_day))
3207 }
3208 Keyword::WEEKS => Ok(DateTimeField::Weeks),
3209 Keyword::DAY => Ok(DateTimeField::Day),
3210 Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3211 Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3212 Keyword::DAYS => Ok(DateTimeField::Days),
3213 Keyword::DATE => Ok(DateTimeField::Date),
3214 Keyword::DATETIME => Ok(DateTimeField::Datetime),
3215 Keyword::HOUR => Ok(DateTimeField::Hour),
3216 Keyword::HOURS => Ok(DateTimeField::Hours),
3217 Keyword::MINUTE => Ok(DateTimeField::Minute),
3218 Keyword::MINUTES => Ok(DateTimeField::Minutes),
3219 Keyword::SECOND => Ok(DateTimeField::Second),
3220 Keyword::SECONDS => Ok(DateTimeField::Seconds),
3221 Keyword::CENTURY => Ok(DateTimeField::Century),
3222 Keyword::DECADE => Ok(DateTimeField::Decade),
3223 Keyword::DOY => Ok(DateTimeField::Doy),
3224 Keyword::DOW => Ok(DateTimeField::Dow),
3225 Keyword::EPOCH => Ok(DateTimeField::Epoch),
3226 Keyword::ISODOW => Ok(DateTimeField::Isodow),
3227 Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3228 Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3229 Keyword::JULIAN => Ok(DateTimeField::Julian),
3230 Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3231 Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3232 Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3233 Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3234 Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3235 Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3236 Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3237 Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3238 Keyword::QUARTER => Ok(DateTimeField::Quarter),
3239 Keyword::TIME => Ok(DateTimeField::Time),
3240 Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3241 Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3242 Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3243 Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3244 Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3245 _ if self.dialect.allow_extract_custom() => {
3246 self.prev_token();
3247 let custom = self.parse_identifier()?;
3248 Ok(DateTimeField::Custom(custom))
3249 }
3250 _ => self.expected("date/time field", next_token),
3251 },
3252 Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3253 self.prev_token();
3254 let custom = self.parse_identifier()?;
3255 Ok(DateTimeField::Custom(custom))
3256 }
3257 _ => self.expected("date/time field", next_token),
3258 }
3259 }
3260
3261 pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3265 match &self.peek_token_ref().token {
3266 Token::Word(w) => match w.keyword {
3267 Keyword::EXISTS => {
3268 let negated = true;
3269 let _ = self.parse_keyword(Keyword::EXISTS);
3270 self.parse_exists_expr(negated)
3271 }
3272 _ => Ok(Expr::UnaryOp {
3273 op: UnaryOperator::Not,
3274 expr: Box::new(
3275 self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3276 ),
3277 }),
3278 },
3279 _ => Ok(Expr::UnaryOp {
3280 op: UnaryOperator::Not,
3281 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3282 }),
3283 }
3284 }
3285
3286 fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3296 let token = self.expect_token(&Token::LBrace)?;
3297
3298 if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3299 self.expect_token(&Token::RBrace)?;
3300 return Ok(fn_expr);
3301 }
3302
3303 if self.dialect.supports_dictionary_syntax() {
3304 self.prev_token(); return self.parse_dictionary();
3306 }
3307
3308 self.expected("an expression", token)
3309 }
3310
3311 pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3317 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3318
3319 self.expect_keyword_is(Keyword::AGAINST)?;
3320
3321 self.expect_token(&Token::LParen)?;
3322
3323 let match_value = self.parse_value()?;
3325
3326 let in_natural_language_mode_keywords = &[
3327 Keyword::IN,
3328 Keyword::NATURAL,
3329 Keyword::LANGUAGE,
3330 Keyword::MODE,
3331 ];
3332
3333 let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3334
3335 let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3336
3337 let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3338 if self.parse_keywords(with_query_expansion_keywords) {
3339 Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3340 } else {
3341 Some(SearchModifier::InNaturalLanguageMode)
3342 }
3343 } else if self.parse_keywords(in_boolean_mode_keywords) {
3344 Some(SearchModifier::InBooleanMode)
3345 } else if self.parse_keywords(with_query_expansion_keywords) {
3346 Some(SearchModifier::WithQueryExpansion)
3347 } else {
3348 None
3349 };
3350
3351 self.expect_token(&Token::RParen)?;
3352
3353 Ok(Expr::MatchAgainst {
3354 columns,
3355 match_value,
3356 opt_search_modifier,
3357 })
3358 }
3359
3360 pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3376 let value = if self.dialect.require_interval_qualifier() {
3385 self.parse_expr()?
3387 } else {
3388 self.parse_prefix()?
3391 };
3392
3393 let leading_field = if self.next_token_is_temporal_unit() {
3399 Some(self.parse_date_time_field()?)
3400 } else if self.dialect.require_interval_qualifier() {
3401 return parser_err!(
3402 "INTERVAL requires a unit after the literal value",
3403 self.peek_token_ref().span.start
3404 );
3405 } else {
3406 None
3407 };
3408
3409 let (leading_precision, last_field, fsec_precision) =
3410 if leading_field == Some(DateTimeField::Second) {
3411 let last_field = None;
3417 let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3418 (leading_precision, last_field, fsec_precision)
3419 } else {
3420 let leading_precision = self.parse_optional_precision()?;
3421 if self.parse_keyword(Keyword::TO) {
3422 let last_field = Some(self.parse_date_time_field()?);
3423 let fsec_precision = if last_field == Some(DateTimeField::Second) {
3424 self.parse_optional_precision()?
3425 } else {
3426 None
3427 };
3428 (leading_precision, last_field, fsec_precision)
3429 } else {
3430 (leading_precision, None, None)
3431 }
3432 };
3433
3434 Ok(Expr::Interval(Interval {
3435 value: Box::new(value),
3436 leading_field,
3437 leading_precision,
3438 last_field,
3439 fractional_seconds_precision: fsec_precision,
3440 }))
3441 }
3442
3443 pub fn next_token_is_temporal_unit(&mut self) -> bool {
3446 if let Token::Word(word) = &self.peek_token_ref().token {
3447 matches!(
3448 word.keyword,
3449 Keyword::YEAR
3450 | Keyword::YEARS
3451 | Keyword::MONTH
3452 | Keyword::MONTHS
3453 | Keyword::WEEK
3454 | Keyword::WEEKS
3455 | Keyword::DAY
3456 | Keyword::DAYS
3457 | Keyword::HOUR
3458 | Keyword::HOURS
3459 | Keyword::MINUTE
3460 | Keyword::MINUTES
3461 | Keyword::SECOND
3462 | Keyword::SECONDS
3463 | Keyword::CENTURY
3464 | Keyword::DECADE
3465 | Keyword::DOW
3466 | Keyword::DOY
3467 | Keyword::EPOCH
3468 | Keyword::ISODOW
3469 | Keyword::ISOYEAR
3470 | Keyword::JULIAN
3471 | Keyword::MICROSECOND
3472 | Keyword::MICROSECONDS
3473 | Keyword::MILLENIUM
3474 | Keyword::MILLENNIUM
3475 | Keyword::MILLISECOND
3476 | Keyword::MILLISECONDS
3477 | Keyword::NANOSECOND
3478 | Keyword::NANOSECONDS
3479 | Keyword::QUARTER
3480 | Keyword::TIMEZONE
3481 | Keyword::TIMEZONE_HOUR
3482 | Keyword::TIMEZONE_MINUTE
3483 )
3484 } else {
3485 false
3486 }
3487 }
3488
3489 fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3497 self.prev_token();
3499 let (fields, trailing_bracket) =
3500 self.parse_struct_type_def(Self::parse_struct_field_def)?;
3501 if trailing_bracket.0 {
3502 return parser_err!(
3503 "unmatched > in STRUCT literal",
3504 self.peek_token_ref().span.start
3505 );
3506 }
3507
3508 self.expect_token(&Token::LParen)?;
3510 let values = self
3511 .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3512 self.expect_token(&Token::RParen)?;
3513
3514 Ok(Expr::Struct { values, fields })
3515 }
3516
3517 fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3531 let expr = self.parse_expr()?;
3532 if self.parse_keyword(Keyword::AS) {
3533 if typed_syntax {
3534 return parser_err!("Typed syntax does not allow AS", {
3535 self.prev_token();
3536 self.peek_token_ref().span.start
3537 });
3538 }
3539 let field_name = self.parse_identifier()?;
3540 Ok(Expr::Named {
3541 expr: expr.into(),
3542 name: field_name,
3543 })
3544 } else {
3545 Ok(expr)
3546 }
3547 }
3548
3549 fn parse_struct_type_def<F>(
3562 &mut self,
3563 mut elem_parser: F,
3564 ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3565 where
3566 F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3567 {
3568 self.expect_keyword_is(Keyword::STRUCT)?;
3569
3570 if self.peek_token_ref().token != Token::Lt {
3572 return Ok((Default::default(), false.into()));
3573 }
3574 self.next_token();
3575
3576 let mut field_defs = vec![];
3577 let trailing_bracket = loop {
3578 let (def, trailing_bracket) = elem_parser(self)?;
3579 field_defs.push(def);
3580 if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3582 break trailing_bracket;
3583 }
3584 };
3585
3586 Ok((
3587 field_defs,
3588 self.expect_closing_angle_bracket(trailing_bracket)?,
3589 ))
3590 }
3591
3592 fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3594 self.expect_keyword_is(Keyword::STRUCT)?;
3595 self.expect_token(&Token::LParen)?;
3596 let struct_body = self.parse_comma_separated(|parser| {
3597 let field_name = parser.parse_identifier()?;
3598 let field_type = parser.parse_data_type()?;
3599
3600 Ok(StructField {
3601 field_name: Some(field_name),
3602 field_type,
3603 options: None,
3604 })
3605 });
3606 self.expect_token(&Token::RParen)?;
3607 struct_body
3608 }
3609
3610 fn parse_struct_field_def(
3622 &mut self,
3623 ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3624 let is_named_field = matches!(
3627 (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3628 (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3629 );
3630
3631 let field_name = if is_named_field {
3632 let name = self.parse_identifier()?;
3633 let _ = self.consume_token(&Token::Colon);
3634 Some(name)
3635 } else {
3636 None
3637 };
3638
3639 let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3640
3641 let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3642 Ok((
3643 StructField {
3644 field_name,
3645 field_type,
3646 options,
3647 },
3648 trailing_bracket,
3649 ))
3650 }
3651
3652 fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3662 self.expect_keyword_is(Keyword::UNION)?;
3663
3664 self.expect_token(&Token::LParen)?;
3665
3666 let fields = self.parse_comma_separated(|p| {
3667 Ok(UnionField {
3668 field_name: p.parse_identifier()?,
3669 field_type: p.parse_data_type()?,
3670 })
3671 })?;
3672
3673 self.expect_token(&Token::RParen)?;
3674
3675 Ok(fields)
3676 }
3677
3678 fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3689 self.expect_token(&Token::LBrace)?;
3690
3691 let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3692
3693 self.expect_token(&Token::RBrace)?;
3694
3695 Ok(Expr::Dictionary(fields))
3696 }
3697
3698 fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3709 let key = self.parse_identifier()?;
3710
3711 self.expect_token(&Token::Colon)?;
3712
3713 let expr = self.parse_expr()?;
3714
3715 Ok(DictionaryField {
3716 key,
3717 value: Box::new(expr),
3718 })
3719 }
3720
3721 fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3731 self.expect_token(&Token::LBrace)?;
3732 let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3733 self.expect_token(&Token::RBrace)?;
3734 Ok(Expr::Map(Map { entries: fields }))
3735 }
3736
3737 fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3747 let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3749
3750 self.expect_token(&Token::Colon)?;
3751
3752 let value = self.parse_expr()?;
3753
3754 Ok(MapEntry {
3755 key: Box::new(key),
3756 value: Box::new(value),
3757 })
3758 }
3759
3760 fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3770 self.expect_keyword_is(Keyword::MAP)?;
3771 self.expect_token(&Token::LParen)?;
3772 let key_data_type = self.parse_data_type()?;
3773 self.expect_token(&Token::Comma)?;
3774 let value_data_type = self.parse_data_type()?;
3775 self.expect_token(&Token::RParen)?;
3776
3777 Ok((key_data_type, value_data_type))
3778 }
3779
3780 fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3790 self.expect_keyword_is(Keyword::TUPLE)?;
3791 self.expect_token(&Token::LParen)?;
3792 let mut field_defs = vec![];
3793 loop {
3794 let (def, _) = self.parse_struct_field_def()?;
3795 field_defs.push(def);
3796 if !self.consume_token(&Token::Comma) {
3797 break;
3798 }
3799 }
3800 self.expect_token(&Token::RParen)?;
3801
3802 Ok(field_defs)
3803 }
3804
3805 fn expect_closing_angle_bracket(
3810 &mut self,
3811 trailing_bracket: MatchedTrailingBracket,
3812 ) -> Result<MatchedTrailingBracket, ParserError> {
3813 let trailing_bracket = if !trailing_bracket.0 {
3814 match &self.peek_token_ref().token {
3815 Token::Gt => {
3816 self.next_token();
3817 false.into()
3818 }
3819 Token::ShiftRight => {
3820 self.next_token();
3821 true.into()
3822 }
3823 _ => return self.expected_ref(">", self.peek_token_ref()),
3824 }
3825 } else {
3826 false.into()
3827 };
3828
3829 Ok(trailing_bracket)
3830 }
3831
3832 pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3834 if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3836 return infix;
3837 }
3838
3839 let dialect = self.dialect;
3840
3841 self.advance_token();
3842 let tok = self.get_current_token();
3843 debug!("infix: {tok:?}");
3844 let tok_index = self.get_current_index();
3845 let span = tok.span;
3846 let regular_binary_operator = match &tok.token {
3847 Token::Spaceship => Some(BinaryOperator::Spaceship),
3848 Token::DoubleEq => Some(BinaryOperator::Eq),
3849 Token::Assignment => Some(BinaryOperator::Assignment),
3850 Token::Eq => Some(BinaryOperator::Eq),
3851 Token::Neq => Some(BinaryOperator::NotEq),
3852 Token::Gt => Some(BinaryOperator::Gt),
3853 Token::GtEq => Some(BinaryOperator::GtEq),
3854 Token::Lt => Some(BinaryOperator::Lt),
3855 Token::LtEq => Some(BinaryOperator::LtEq),
3856 Token::Plus => Some(BinaryOperator::Plus),
3857 Token::Minus => Some(BinaryOperator::Minus),
3858 Token::Mul => Some(BinaryOperator::Multiply),
3859 Token::Mod => Some(BinaryOperator::Modulo),
3860 Token::StringConcat => Some(BinaryOperator::StringConcat),
3861 Token::Pipe => Some(BinaryOperator::BitwiseOr),
3862 Token::Caret => {
3863 if dialect_is!(dialect is PostgreSqlDialect) {
3866 Some(BinaryOperator::PGExp)
3867 } else {
3868 Some(BinaryOperator::BitwiseXor)
3869 }
3870 }
3871 Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3872 Token::Div => Some(BinaryOperator::Divide),
3873 Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3874 Some(BinaryOperator::DuckIntegerDivide)
3875 }
3876 Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3877 Some(BinaryOperator::PGBitwiseShiftLeft)
3878 }
3879 Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3880 Some(BinaryOperator::PGBitwiseShiftRight)
3881 }
3882 Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3883 Some(BinaryOperator::PGBitwiseXor)
3884 }
3885 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3886 Some(BinaryOperator::PGOverlap)
3887 }
3888 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3889 Some(BinaryOperator::PGOverlap)
3890 }
3891 Token::Overlap if dialect.supports_double_ampersand_operator() => {
3892 Some(BinaryOperator::And)
3893 }
3894 Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3895 Some(BinaryOperator::PGStartsWith)
3896 }
3897 Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3898 Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3899 Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3900 Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3901 Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3902 Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3903 Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3904 Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3905 Token::Arrow => Some(BinaryOperator::Arrow),
3906 Token::LongArrow => Some(BinaryOperator::LongArrow),
3907 Token::HashArrow => Some(BinaryOperator::HashArrow),
3908 Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3909 Token::AtArrow => Some(BinaryOperator::AtArrow),
3910 Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3911 Token::HashMinus => Some(BinaryOperator::HashMinus),
3912 Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3913 Token::AtAt => Some(BinaryOperator::AtAt),
3914 Token::Question => Some(BinaryOperator::Question),
3915 Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3916 Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3917 Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3918 Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3919 Some(BinaryOperator::DoubleHash)
3920 }
3921
3922 Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3923 Some(BinaryOperator::AndLt)
3924 }
3925 Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3926 Some(BinaryOperator::AndGt)
3927 }
3928 Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3929 Some(BinaryOperator::QuestionDash)
3930 }
3931 Token::AmpersandLeftAngleBracketVerticalBar
3932 if self.dialect.supports_geometric_types() =>
3933 {
3934 Some(BinaryOperator::AndLtPipe)
3935 }
3936 Token::VerticalBarAmpersandRightAngleBracket
3937 if self.dialect.supports_geometric_types() =>
3938 {
3939 Some(BinaryOperator::PipeAndGt)
3940 }
3941 Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3942 Some(BinaryOperator::LtDashGt)
3943 }
3944 Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3945 Some(BinaryOperator::LtCaret)
3946 }
3947 Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3948 Some(BinaryOperator::GtCaret)
3949 }
3950 Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3951 Some(BinaryOperator::QuestionHash)
3952 }
3953 Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3954 Some(BinaryOperator::QuestionDoublePipe)
3955 }
3956 Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3957 Some(BinaryOperator::QuestionDashPipe)
3958 }
3959 Token::TildeEqual if self.dialect.supports_geometric_types() => {
3960 Some(BinaryOperator::TildeEq)
3961 }
3962 Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3963 Some(BinaryOperator::LtLtPipe)
3964 }
3965 Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3966 Some(BinaryOperator::PipeGtGt)
3967 }
3968 Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3969
3970 Token::Word(w) => match w.keyword {
3971 Keyword::AND => Some(BinaryOperator::And),
3972 Keyword::OR => Some(BinaryOperator::Or),
3973 Keyword::XOR => Some(BinaryOperator::Xor),
3974 Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3975 Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3976 Some(BinaryOperator::PGCustomBinaryOperator(
3981 self.parse_pg_operator_ident_parts()?,
3982 ))
3983 }
3984 _ => None,
3985 },
3986 _ => None,
3987 };
3988
3989 let tok = self.token_at(tok_index);
3990 if let Some(op) = regular_binary_operator {
3991 if let Some(keyword) =
3992 self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
3993 {
3994 self.expect_token(&Token::LParen)?;
3995 let right = if self.peek_sub_query() {
3996 self.prev_token(); self.parse_subexpr(precedence)?
4000 } else {
4001 let right = self.parse_subexpr(precedence)?;
4003 self.expect_token(&Token::RParen)?;
4004 right
4005 };
4006
4007 if !matches!(
4008 op,
4009 BinaryOperator::Gt
4010 | BinaryOperator::Lt
4011 | BinaryOperator::GtEq
4012 | BinaryOperator::LtEq
4013 | BinaryOperator::Eq
4014 | BinaryOperator::NotEq
4015 | BinaryOperator::PGRegexMatch
4016 | BinaryOperator::PGRegexIMatch
4017 | BinaryOperator::PGRegexNotMatch
4018 | BinaryOperator::PGRegexNotIMatch
4019 | BinaryOperator::PGLikeMatch
4020 | BinaryOperator::PGILikeMatch
4021 | BinaryOperator::PGNotLikeMatch
4022 | BinaryOperator::PGNotILikeMatch
4023 ) {
4024 return parser_err!(
4025 format!(
4026 "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
4027 ),
4028 span.start
4029 );
4030 };
4031
4032 Ok(match keyword {
4033 Keyword::ALL => Expr::AllOp {
4034 left: Box::new(expr),
4035 compare_op: op,
4036 right: Box::new(right),
4037 },
4038 Keyword::ANY | Keyword::SOME => Expr::AnyOp {
4039 left: Box::new(expr),
4040 compare_op: op,
4041 right: Box::new(right),
4042 is_some: keyword == Keyword::SOME,
4043 },
4044 unexpected_keyword => return Err(ParserError::ParserError(
4045 format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
4046 )),
4047 })
4048 } else {
4049 Ok(Expr::BinaryOp {
4050 left: Box::new(expr),
4051 op,
4052 right: Box::new(self.parse_subexpr(precedence)?),
4053 })
4054 }
4055 } else if let Token::Word(w) = &tok.token {
4056 match w.keyword {
4057 Keyword::IS => {
4058 if self.parse_keyword(Keyword::NULL) {
4059 Ok(Expr::IsNull(Box::new(expr)))
4060 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
4061 Ok(Expr::IsNotNull(Box::new(expr)))
4062 } else if self.parse_keywords(&[Keyword::TRUE]) {
4063 Ok(Expr::IsTrue(Box::new(expr)))
4064 } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
4065 Ok(Expr::IsNotTrue(Box::new(expr)))
4066 } else if self.parse_keywords(&[Keyword::FALSE]) {
4067 Ok(Expr::IsFalse(Box::new(expr)))
4068 } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
4069 Ok(Expr::IsNotFalse(Box::new(expr)))
4070 } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
4071 Ok(Expr::IsUnknown(Box::new(expr)))
4072 } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
4073 Ok(Expr::IsNotUnknown(Box::new(expr)))
4074 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
4075 let expr2 = self.parse_expr()?;
4076 Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
4077 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
4078 {
4079 let expr2 = self.parse_expr()?;
4080 Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
4081 } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
4082 Ok(is_normalized)
4083 } else {
4084 self.expected_ref(
4085 "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS",
4086 self.peek_token_ref(),
4087 )
4088 }
4089 }
4090 Keyword::AT => {
4091 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4092 Ok(Expr::AtTimeZone {
4093 timestamp: Box::new(expr),
4094 time_zone: Box::new(self.parse_subexpr(precedence)?),
4095 })
4096 }
4097 Keyword::NOT
4098 | Keyword::IN
4099 | Keyword::BETWEEN
4100 | Keyword::LIKE
4101 | Keyword::ILIKE
4102 | Keyword::SIMILAR
4103 | Keyword::REGEXP
4104 | Keyword::RLIKE => {
4105 self.prev_token();
4106 let negated = self.parse_keyword(Keyword::NOT);
4107 let regexp = self.parse_keyword(Keyword::REGEXP);
4108 let rlike = self.parse_keyword(Keyword::RLIKE);
4109 let null = if !self.in_column_definition_state() {
4110 self.parse_keyword(Keyword::NULL)
4111 } else {
4112 false
4113 };
4114 if regexp || rlike {
4115 Ok(Expr::RLike {
4116 negated,
4117 expr: Box::new(expr),
4118 pattern: Box::new(
4119 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4120 ),
4121 regexp,
4122 })
4123 } else if negated && null {
4124 Ok(Expr::IsNotNull(Box::new(expr)))
4125 } else if self.parse_keyword(Keyword::IN) {
4126 self.parse_in(expr, negated)
4127 } else if self.parse_keyword(Keyword::BETWEEN) {
4128 self.parse_between(expr, negated)
4129 } else if self.parse_keyword(Keyword::LIKE) {
4130 Ok(Expr::Like {
4131 negated,
4132 any: self.parse_keyword(Keyword::ANY),
4133 expr: Box::new(expr),
4134 pattern: Box::new(
4135 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4136 ),
4137 escape_char: self.parse_escape_char()?,
4138 })
4139 } else if self.parse_keyword(Keyword::ILIKE) {
4140 Ok(Expr::ILike {
4141 negated,
4142 any: self.parse_keyword(Keyword::ANY),
4143 expr: Box::new(expr),
4144 pattern: Box::new(
4145 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4146 ),
4147 escape_char: self.parse_escape_char()?,
4148 })
4149 } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4150 Ok(Expr::SimilarTo {
4151 negated,
4152 expr: Box::new(expr),
4153 pattern: Box::new(
4154 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4155 ),
4156 escape_char: self.parse_escape_char()?,
4157 })
4158 } else {
4159 self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4160 }
4161 }
4162 Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4163 Ok(Expr::IsNotNull(Box::new(expr)))
4164 }
4165 Keyword::MEMBER => {
4166 if self.parse_keyword(Keyword::OF) {
4167 self.expect_token(&Token::LParen)?;
4168 let array = self.parse_expr()?;
4169 self.expect_token(&Token::RParen)?;
4170 Ok(Expr::MemberOf(MemberOf {
4171 value: Box::new(expr),
4172 array: Box::new(array),
4173 }))
4174 } else {
4175 self.expected_ref("OF after MEMBER", self.peek_token_ref())
4176 }
4177 }
4178 _ => parser_err!(
4180 format!("No infix parser for token {:?}", tok.token),
4181 tok.span.start
4182 ),
4183 }
4184 } else if Token::DoubleColon == *tok {
4185 Ok(Expr::Cast {
4186 kind: CastKind::DoubleColon,
4187 expr: Box::new(expr),
4188 data_type: self.parse_data_type()?,
4189 array: false,
4190 format: None,
4191 })
4192 } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4193 Ok(Expr::UnaryOp {
4194 op: UnaryOperator::PGPostfixFactorial,
4195 expr: Box::new(expr),
4196 })
4197 } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4198 || (Token::Colon == *tok)
4199 {
4200 self.prev_token();
4201 self.parse_json_access(expr)
4202 } else {
4203 parser_err!(
4205 format!("No infix parser for token {:?}", tok.token),
4206 tok.span.start
4207 )
4208 }
4209 }
4210
4211 pub fn parse_escape_char(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
4213 if self.parse_keyword(Keyword::ESCAPE) {
4214 Ok(Some(self.parse_value()?))
4215 } else {
4216 Ok(None)
4217 }
4218 }
4219
4220 fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4230 let lower_bound = if self.consume_token(&Token::Colon) {
4232 None
4233 } else {
4234 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4236 };
4237
4238 if self.consume_token(&Token::RBracket) {
4240 if let Some(lower_bound) = lower_bound {
4241 return Ok(Subscript::Index { index: lower_bound });
4242 };
4243 return Ok(Subscript::Slice {
4244 lower_bound,
4245 upper_bound: None,
4246 stride: None,
4247 });
4248 }
4249
4250 if lower_bound.is_some() {
4252 self.expect_token(&Token::Colon)?;
4253 }
4254
4255 let upper_bound = if self.consume_token(&Token::RBracket) {
4257 return Ok(Subscript::Slice {
4258 lower_bound,
4259 upper_bound: None,
4260 stride: None,
4261 });
4262 } else {
4263 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4265 };
4266
4267 if self.consume_token(&Token::RBracket) {
4269 return Ok(Subscript::Slice {
4270 lower_bound,
4271 upper_bound,
4272 stride: None,
4273 });
4274 }
4275
4276 self.expect_token(&Token::Colon)?;
4278 let stride = if self.consume_token(&Token::RBracket) {
4279 None
4280 } else {
4281 Some(self.parse_expr()?)
4282 };
4283
4284 if stride.is_some() {
4285 self.expect_token(&Token::RBracket)?;
4286 }
4287
4288 Ok(Subscript::Slice {
4289 lower_bound,
4290 upper_bound,
4291 stride,
4292 })
4293 }
4294
4295 pub fn parse_multi_dim_subscript(
4297 &mut self,
4298 chain: &mut Vec<AccessExpr>,
4299 ) -> Result<(), ParserError> {
4300 while self.consume_token(&Token::LBracket) {
4301 self.parse_subscript(chain)?;
4302 }
4303 Ok(())
4304 }
4305
4306 fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4310 let subscript = self.parse_subscript_inner()?;
4311 chain.push(AccessExpr::Subscript(subscript));
4312 Ok(())
4313 }
4314
4315 fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4316 let token = self.next_token();
4317 match token.token {
4318 Token::Word(Word {
4319 value,
4320 quote_style: quote_style @ (Some('"') | Some('`') | None),
4323 keyword: _,
4326 }) => Ok(JsonPathElem::Dot {
4327 key: value,
4328 quoted: quote_style.is_some(),
4329 }),
4330
4331 Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4335
4336 _ => self.expected("variant object key name", token),
4337 }
4338 }
4339
4340 fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4341 let path = self.parse_json_path()?;
4342 Ok(Expr::JsonAccess {
4343 value: Box::new(expr),
4344 path,
4345 })
4346 }
4347
4348 fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4349 let mut path = Vec::new();
4350 loop {
4351 match self.next_token().token {
4352 Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4353 self.next_token();
4354 let key = self.parse_wildcard_expr()?;
4355 self.expect_token(&Token::RBracket)?;
4356 path.push(JsonPathElem::ColonBracket { key });
4357 }
4358 Token::Colon if path.is_empty() => {
4359 path.push(self.parse_json_path_object_key()?);
4360 }
4361 Token::Period if !path.is_empty() => {
4362 path.push(self.parse_json_path_object_key()?);
4363 }
4364 Token::LBracket => {
4365 let key = self.parse_wildcard_expr()?;
4366 self.expect_token(&Token::RBracket)?;
4367
4368 path.push(JsonPathElem::Bracket { key });
4369 }
4370 _ => {
4371 self.prev_token();
4372 break;
4373 }
4374 };
4375 }
4376
4377 debug_assert!(!path.is_empty());
4378 Ok(JsonPath { path })
4379 }
4380
4381 pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4383 if self.parse_keyword(Keyword::UNNEST) {
4386 self.expect_token(&Token::LParen)?;
4387 let array_expr = self.parse_expr()?;
4388 self.expect_token(&Token::RParen)?;
4389 return Ok(Expr::InUnnest {
4390 expr: Box::new(expr),
4391 array_expr: Box::new(array_expr),
4392 negated,
4393 });
4394 }
4395 if self.dialect.supports_in_unparenthesized_expr()
4396 && self.peek_token_ref().token != Token::LParen
4397 {
4398 return Ok(Expr::InList {
4399 expr: Box::new(expr),
4400 list: vec![self.parse_expr()?],
4401 negated,
4402 });
4403 }
4404 self.expect_token(&Token::LParen)?;
4405 let in_op = match self.maybe_parse(|p| p.parse_query())? {
4406 Some(subquery) => Expr::InSubquery {
4407 expr: Box::new(expr),
4408 subquery,
4409 negated,
4410 },
4411 None => Expr::InList {
4412 expr: Box::new(expr),
4413 list: if self.dialect.supports_in_empty_list() {
4414 self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4415 } else {
4416 self.parse_comma_separated(Parser::parse_expr)?
4417 },
4418 negated,
4419 },
4420 };
4421 self.expect_token(&Token::RParen)?;
4422 Ok(in_op)
4423 }
4424
4425 pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4427 let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4430 self.expect_keyword_is(Keyword::AND)?;
4431 let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4432 Ok(Expr::Between {
4433 expr: Box::new(expr),
4434 negated,
4435 low: Box::new(low),
4436 high: Box::new(high),
4437 })
4438 }
4439
4440 pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4442 Ok(Expr::Cast {
4443 kind: CastKind::DoubleColon,
4444 expr: Box::new(expr),
4445 data_type: self.parse_data_type()?,
4446 array: false,
4447 format: None,
4448 })
4449 }
4450
4451 pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4453 self.dialect.get_next_precedence_default(self)
4454 }
4455
4456 pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4459 self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4460 }
4461
4462 pub fn peek_token(&self) -> TokenWithSpan {
4467 self.peek_nth_token(0)
4468 }
4469
4470 pub fn peek_token_ref(&self) -> &TokenWithSpan {
4473 self.peek_nth_token_ref(0)
4474 }
4475
4476 pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4499 self.peek_tokens_with_location()
4500 .map(|with_loc| with_loc.token)
4501 }
4502
4503 pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4508 let mut index = self.index;
4509 core::array::from_fn(|_| loop {
4510 let token = self.tokens.get(index);
4511 index += 1;
4512 if let Some(TokenWithSpan {
4513 token: Token::Whitespace(_),
4514 span: _,
4515 }) = token
4516 {
4517 continue;
4518 }
4519 break token.cloned().unwrap_or(TokenWithSpan {
4520 token: Token::EOF,
4521 span: Span::empty(),
4522 });
4523 })
4524 }
4525
4526 pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4531 let mut index = self.index;
4532 core::array::from_fn(|_| loop {
4533 let token = self.tokens.get(index);
4534 index += 1;
4535 if let Some(TokenWithSpan {
4536 token: Token::Whitespace(_),
4537 span: _,
4538 }) = token
4539 {
4540 continue;
4541 }
4542 break token.unwrap_or(&EOF_TOKEN);
4543 })
4544 }
4545
4546 pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4548 self.peek_nth_token_ref(n).clone()
4549 }
4550
4551 pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4553 let mut index = self.index;
4554 loop {
4555 index += 1;
4556 match self.tokens.get(index - 1) {
4557 Some(TokenWithSpan {
4558 token: Token::Whitespace(_),
4559 span: _,
4560 }) => continue,
4561 non_whitespace => {
4562 if n == 0 {
4563 return non_whitespace.unwrap_or(&EOF_TOKEN);
4564 }
4565 n -= 1;
4566 }
4567 }
4568 }
4569 }
4570
4571 pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4574 self.peek_nth_token_no_skip(0)
4575 }
4576
4577 pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4579 self.tokens
4580 .get(self.index + n)
4581 .cloned()
4582 .unwrap_or(TokenWithSpan {
4583 token: Token::EOF,
4584 span: Span::empty(),
4585 })
4586 }
4587
4588 fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4590 self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4591 }
4592
4593 fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4597 let index = self.index;
4598 let matched = self.parse_keywords(expected);
4599 self.index = index;
4600 matched
4601 }
4602
4603 pub fn next_token(&mut self) -> TokenWithSpan {
4608 self.advance_token();
4609 self.get_current_token().clone()
4610 }
4611
4612 pub fn get_current_index(&self) -> usize {
4617 self.index.saturating_sub(1)
4618 }
4619
4620 pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4622 self.index += 1;
4623 self.tokens.get(self.index - 1)
4624 }
4625
4626 pub fn advance_token(&mut self) {
4630 loop {
4631 self.index += 1;
4632 match self.tokens.get(self.index - 1) {
4633 Some(TokenWithSpan {
4634 token: Token::Whitespace(_),
4635 span: _,
4636 }) => continue,
4637 _ => break,
4638 }
4639 }
4640 }
4641
4642 pub fn get_current_token(&self) -> &TokenWithSpan {
4646 self.token_at(self.index.saturating_sub(1))
4647 }
4648
4649 pub fn get_previous_token(&self) -> &TokenWithSpan {
4653 self.token_at(self.index.saturating_sub(2))
4654 }
4655
4656 pub fn get_next_token(&self) -> &TokenWithSpan {
4660 self.token_at(self.index)
4661 }
4662
4663 pub fn prev_token(&mut self) {
4670 loop {
4671 assert!(self.index > 0);
4672 self.index -= 1;
4673 if let Some(TokenWithSpan {
4674 token: Token::Whitespace(_),
4675 span: _,
4676 }) = self.tokens.get(self.index)
4677 {
4678 continue;
4679 }
4680 return;
4681 }
4682 }
4683
4684 pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4686 parser_err!(
4687 format!("Expected: {expected}, found: {found}"),
4688 found.span.start
4689 )
4690 }
4691
4692 pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4694 parser_err!(
4695 format!("Expected: {expected}, found: {found}"),
4696 found.span.start
4697 )
4698 }
4699
4700 pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4702 let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4703 parser_err!(
4704 format!("Expected: {expected}, found: {found}"),
4705 found.span.start
4706 )
4707 }
4708
4709 #[must_use]
4712 pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4713 if self.peek_keyword(expected) {
4714 self.advance_token();
4715 true
4716 } else {
4717 false
4718 }
4719 }
4720
4721 #[must_use]
4722 pub fn peek_keyword(&self, expected: Keyword) -> bool {
4726 matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4727 }
4728
4729 pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4737 self.keyword_with_tokens(expected, tokens, true)
4738 }
4739
4740 pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4745 self.keyword_with_tokens(expected, tokens, false)
4746 }
4747
4748 fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4749 match &self.peek_token_ref().token {
4750 Token::Word(w) if expected == w.keyword => {
4751 for (idx, token) in tokens.iter().enumerate() {
4752 if self.peek_nth_token_ref(idx + 1).token != *token {
4753 return false;
4754 }
4755 }
4756
4757 if consume {
4758 for _ in 0..(tokens.len() + 1) {
4759 self.advance_token();
4760 }
4761 }
4762
4763 true
4764 }
4765 _ => false,
4766 }
4767 }
4768
4769 #[must_use]
4773 pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4774 self.parse_keywords_indexed(keywords).is_some()
4775 }
4776
4777 #[must_use]
4780 fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4781 let start_index = self.index;
4782 let mut first_keyword_index = None;
4783 for &keyword in keywords {
4784 if !self.parse_keyword(keyword) {
4785 self.index = start_index;
4786 return None;
4787 }
4788 if first_keyword_index.is_none() {
4789 first_keyword_index = Some(self.index.saturating_sub(1));
4790 }
4791 }
4792 first_keyword_index
4793 }
4794
4795 #[must_use]
4798 pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4799 for keyword in keywords {
4800 if self.peek_keyword(*keyword) {
4801 return Some(*keyword);
4802 }
4803 }
4804 None
4805 }
4806
4807 #[must_use]
4811 pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4812 match &self.peek_token_ref().token {
4813 Token::Word(w) => {
4814 keywords
4815 .iter()
4816 .find(|keyword| **keyword == w.keyword)
4817 .map(|keyword| {
4818 self.advance_token();
4819 *keyword
4820 })
4821 }
4822 _ => None,
4823 }
4824 }
4825
4826 pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4829 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4830 Ok(keyword)
4831 } else {
4832 let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4833 self.expected_ref(
4834 &format!("one of {}", keywords.join(" or ")),
4835 self.peek_token_ref(),
4836 )
4837 }
4838 }
4839
4840 pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4845 if self.parse_keyword(expected) {
4846 Ok(self.get_current_token().clone())
4847 } else {
4848 self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4849 }
4850 }
4851
4852 pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4858 if self.parse_keyword(expected) {
4859 Ok(())
4860 } else {
4861 self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4862 }
4863 }
4864
4865 pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4868 for &kw in expected {
4869 self.expect_keyword_is(kw)?;
4870 }
4871 Ok(())
4872 }
4873
4874 #[must_use]
4878 pub fn consume_token(&mut self, expected: &Token) -> bool {
4879 if self.peek_token_ref() == expected {
4880 self.advance_token();
4881 true
4882 } else {
4883 false
4884 }
4885 }
4886
4887 #[must_use]
4891 pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4892 let index = self.index;
4893 for token in tokens {
4894 if !self.consume_token(token) {
4895 self.index = index;
4896 return false;
4897 }
4898 }
4899 true
4900 }
4901
4902 pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4904 if self.peek_token_ref() == expected {
4905 Ok(self.next_token())
4906 } else {
4907 self.expected_ref(&expected.to_string(), self.peek_token_ref())
4908 }
4909 }
4910
4911 fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4912 where
4913 <T as FromStr>::Err: Display,
4914 {
4915 s.parse::<T>().map_err(|e| {
4916 ParserError::ParserError(format!(
4917 "Could not parse '{s}' as {}: {e}{loc}",
4918 core::any::type_name::<T>()
4919 ))
4920 })
4921 }
4922
4923 pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4925 let trailing_commas =
4931 self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4932
4933 self.parse_comma_separated_with_trailing_commas(
4934 |p| p.parse_select_item(),
4935 trailing_commas,
4936 Self::is_reserved_for_column_alias,
4937 )
4938 }
4939
4940 pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4942 let mut values = vec![];
4943 loop {
4944 values.push(self.parse_grant_permission()?);
4945 if !self.consume_token(&Token::Comma) {
4946 break;
4947 } else if self.options.trailing_commas {
4948 match &self.peek_token_ref().token {
4949 Token::Word(kw) if kw.keyword == Keyword::ON => {
4950 break;
4951 }
4952 Token::RParen
4953 | Token::SemiColon
4954 | Token::EOF
4955 | Token::RBracket
4956 | Token::RBrace => break,
4957 _ => continue,
4958 }
4959 }
4960 }
4961 Ok(values)
4962 }
4963
4964 fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4966 let trailing_commas = self.dialect.supports_from_trailing_commas();
4967
4968 self.parse_comma_separated_with_trailing_commas(
4969 Parser::parse_table_and_joins,
4970 trailing_commas,
4971 |kw, parser| !self.dialect.is_table_factor(kw, parser),
4972 )
4973 }
4974
4975 fn is_parse_comma_separated_end_with_trailing_commas<R>(
4982 &mut self,
4983 trailing_commas: bool,
4984 is_reserved_keyword: &R,
4985 ) -> bool
4986 where
4987 R: Fn(&Keyword, &mut Parser) -> bool,
4988 {
4989 if !self.consume_token(&Token::Comma) {
4990 true
4991 } else if trailing_commas {
4992 let token = self.next_token().token;
4993 let is_end = match token {
4994 Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
4995 Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
4996 true
4997 }
4998 _ => false,
4999 };
5000 self.prev_token();
5001
5002 is_end
5003 } else {
5004 false
5005 }
5006 }
5007
5008 fn is_parse_comma_separated_end(&mut self) -> bool {
5011 self.is_parse_comma_separated_end_with_trailing_commas(
5012 self.options.trailing_commas,
5013 &Self::is_reserved_for_column_alias,
5014 )
5015 }
5016
5017 pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
5019 where
5020 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5021 {
5022 self.parse_comma_separated_with_trailing_commas(
5023 f,
5024 self.options.trailing_commas,
5025 Self::is_reserved_for_column_alias,
5026 )
5027 }
5028
5029 fn parse_comma_separated_with_trailing_commas<T, F, R>(
5034 &mut self,
5035 mut f: F,
5036 trailing_commas: bool,
5037 is_reserved_keyword: R,
5038 ) -> Result<Vec<T>, ParserError>
5039 where
5040 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5041 R: Fn(&Keyword, &mut Parser) -> bool,
5042 {
5043 let mut values = vec![];
5044 loop {
5045 values.push(f(self)?);
5046 if self.is_parse_comma_separated_end_with_trailing_commas(
5047 trailing_commas,
5048 &is_reserved_keyword,
5049 ) {
5050 break;
5051 }
5052 }
5053 Ok(values)
5054 }
5055
5056 fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
5058 where
5059 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5060 {
5061 let mut values = vec![];
5062 loop {
5063 values.push(f(self)?);
5064 if !self.consume_token(&Token::Period) {
5065 break;
5066 }
5067 }
5068 Ok(values)
5069 }
5070
5071 pub fn parse_keyword_separated<T, F>(
5073 &mut self,
5074 keyword: Keyword,
5075 mut f: F,
5076 ) -> Result<Vec<T>, ParserError>
5077 where
5078 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5079 {
5080 let mut values = vec![];
5081 loop {
5082 values.push(f(self)?);
5083 if !self.parse_keyword(keyword) {
5084 break;
5085 }
5086 }
5087 Ok(values)
5088 }
5089
5090 pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5092 where
5093 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5094 {
5095 self.expect_token(&Token::LParen)?;
5096 let res = f(self)?;
5097 self.expect_token(&Token::RParen)?;
5098 Ok(res)
5099 }
5100
5101 pub fn parse_comma_separated0<T, F>(
5104 &mut self,
5105 f: F,
5106 end_token: Token,
5107 ) -> Result<Vec<T>, ParserError>
5108 where
5109 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5110 {
5111 if self.peek_token_ref().token == end_token {
5112 return Ok(vec![]);
5113 }
5114
5115 if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5116 let _ = self.consume_token(&Token::Comma);
5117 return Ok(vec![]);
5118 }
5119
5120 self.parse_comma_separated(f)
5121 }
5122
5123 pub(crate) fn parse_statement_list(
5127 &mut self,
5128 terminal_keywords: &[Keyword],
5129 ) -> Result<Vec<Statement>, ParserError> {
5130 let mut values = vec![];
5131 loop {
5132 match &self.peek_nth_token_ref(0).token {
5133 Token::EOF => break,
5134 Token::Word(w)
5135 if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5136 {
5137 break;
5138 }
5139 _ => {}
5140 }
5141
5142 values.push(self.parse_statement()?);
5143 self.expect_token(&Token::SemiColon)?;
5144 }
5145 Ok(values)
5146 }
5147
5148 fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5152 !parser.dialect.is_column_alias(kw, parser)
5153 }
5154
5155 pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5159 where
5160 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5161 {
5162 match self.try_parse(f) {
5163 Ok(t) => Ok(Some(t)),
5164 Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5165 _ => Ok(None),
5166 }
5167 }
5168
5169 pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5171 where
5172 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5173 {
5174 let index = self.index;
5175 match f(self) {
5176 Ok(t) => Ok(t),
5177 Err(e) => {
5178 self.index = index;
5180 Err(e)
5181 }
5182 }
5183 }
5184
5185 pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5188 let loc = self.peek_token_ref().span.start;
5189 let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5190 Some(Keyword::ALL) => {
5191 if self.peek_keyword(Keyword::DISTINCT) {
5192 return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5193 }
5194 Some(Distinct::All)
5195 }
5196 Some(Keyword::DISTINCT) => {
5197 if self.peek_keyword(Keyword::ALL) {
5198 return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5199 }
5200 Some(Distinct::Distinct)
5201 }
5202 None => return Ok(None),
5203 _ => return parser_err!("ALL or DISTINCT", loc),
5204 };
5205
5206 let Some(Distinct::Distinct) = distinct else {
5207 return Ok(distinct);
5208 };
5209 if !self.parse_keyword(Keyword::ON) {
5210 return Ok(Some(Distinct::Distinct));
5211 }
5212
5213 self.expect_token(&Token::LParen)?;
5214 let col_names = if self.consume_token(&Token::RParen) {
5215 self.prev_token();
5216 Vec::new()
5217 } else {
5218 self.parse_comma_separated(Parser::parse_expr)?
5219 };
5220 self.expect_token(&Token::RParen)?;
5221 Ok(Some(Distinct::On(col_names)))
5222 }
5223
5224 pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5226 let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5227 let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5228 let multiset = self.maybe_parse_multiset();
5229 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5230 let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5231 let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5232 let global: Option<bool> = if global {
5233 Some(true)
5234 } else if local {
5235 Some(false)
5236 } else {
5237 None
5238 };
5239 let temporary = self
5240 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5241 .is_some();
5242 let volatile = self.parse_keyword(Keyword::VOLATILE);
5243 let unlogged = self.peek_keywords(&[Keyword::UNLOGGED, Keyword::TABLE]);
5244 if unlogged {
5245 self.expect_keyword(Keyword::UNLOGGED)?;
5246 }
5247 let persistent = dialect_of!(self is DuckDbDialect)
5248 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5249 let create_view_params = self.parse_create_view_params()?;
5250 if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5251 self.parse_create_snapshot_table().map(Into::into)
5252 } else if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5253 self.parse_create_text_search().map(Into::into)
5254 } else if self.parse_keyword(Keyword::TABLE) {
5255 self.parse_create_table(
5256 or_replace, temporary, unlogged, global, transient, volatile, multiset,
5257 )
5258 .map(Into::into)
5259 } else if self.peek_keyword(Keyword::MATERIALIZED)
5260 || self.peek_keyword(Keyword::VIEW)
5261 || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5262 || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5263 {
5264 self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5265 .map(Into::into)
5266 } else if self.parse_keyword(Keyword::POLICY) {
5267 self.parse_create_policy().map(Into::into)
5268 } else if self.parse_keyword(Keyword::EXTERNAL) {
5269 self.parse_create_external_table(or_replace).map(Into::into)
5270 } else if self.parse_keyword(Keyword::FUNCTION) {
5271 self.parse_create_function(or_alter, or_replace, temporary)
5272 } else if self.parse_keyword(Keyword::DOMAIN) {
5273 self.parse_create_domain().map(Into::into)
5274 } else if self.parse_keyword(Keyword::TRIGGER) {
5275 self.parse_create_trigger(temporary, or_alter, or_replace, false)
5276 .map(Into::into)
5277 } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5278 self.parse_create_trigger(temporary, or_alter, or_replace, true)
5279 .map(Into::into)
5280 } else if self.parse_keyword(Keyword::MACRO) {
5281 self.parse_create_macro(or_replace, temporary)
5282 } else if self.parse_keyword(Keyword::SECRET) {
5283 self.parse_create_secret(or_replace, temporary, persistent)
5284 } else if self.parse_keyword(Keyword::USER) {
5285 self.parse_create_user(or_replace).map(Into::into)
5286 } else if or_replace {
5287 self.expected_ref(
5288 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5289 self.peek_token_ref(),
5290 )
5291 } else if self.parse_keyword(Keyword::EXTENSION) {
5292 self.parse_create_extension().map(Into::into)
5293 } else if self.parse_keyword(Keyword::INDEX) {
5294 self.parse_create_index(false).map(Into::into)
5295 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5296 self.parse_create_index(true).map(Into::into)
5297 } else if dialect_of!(self is GenericDialect | MySqlDialect)
5298 && self.parse_keywords(&[Keyword::FULLTEXT, Keyword::INDEX])
5299 {
5300 self.parse_create_fulltext_or_spatial_index(FullTextOrSpatialKind::Fulltext)
5301 .map(Into::into)
5302 } else if dialect_of!(self is GenericDialect | MySqlDialect)
5303 && self.parse_keywords(&[Keyword::SPATIAL, Keyword::INDEX])
5304 {
5305 self.parse_create_fulltext_or_spatial_index(FullTextOrSpatialKind::Spatial)
5306 .map(Into::into)
5307 } else if self.parse_keyword(Keyword::VIRTUAL) {
5308 self.parse_create_virtual_table()
5309 } else if self.parse_keyword(Keyword::SCHEMA) {
5310 self.parse_create_schema()
5311 } else if self.parse_keyword(Keyword::DATABASE) {
5312 self.parse_create_database()
5313 } else if self.parse_keyword(Keyword::ROLE) {
5314 self.parse_create_role().map(Into::into)
5315 } else if self.parse_keyword(Keyword::SEQUENCE) {
5316 self.parse_create_sequence(temporary)
5317 } else if self.parse_keyword(Keyword::COLLATION) {
5318 self.parse_create_collation().map(Into::into)
5319 } else if self.parse_keyword(Keyword::TYPE) {
5320 self.parse_create_type()
5321 } else if self.parse_keyword(Keyword::PROCEDURE) {
5322 self.parse_create_procedure(or_alter)
5323 } else if self.parse_keyword(Keyword::CONNECTOR) {
5324 self.parse_create_connector().map(Into::into)
5325 } else if self.parse_keyword(Keyword::OPERATOR) {
5326 if self.parse_keyword(Keyword::FAMILY) {
5328 self.parse_create_operator_family().map(Into::into)
5329 } else if self.parse_keyword(Keyword::CLASS) {
5330 self.parse_create_operator_class().map(Into::into)
5331 } else {
5332 self.parse_create_operator().map(Into::into)
5333 }
5334 } else if self.parse_keyword(Keyword::SERVER) {
5335 self.parse_pg_create_server()
5336 } else {
5337 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5338 }
5339 }
5340
5341 fn parse_text_search_object_type(&mut self) -> Result<TextSearchObjectType, ParserError> {
5342 match self.expect_one_of_keywords(&[
5343 Keyword::DICTIONARY,
5344 Keyword::CONFIGURATION,
5345 Keyword::TEMPLATE,
5346 Keyword::PARSER,
5347 ])? {
5348 Keyword::DICTIONARY => Ok(TextSearchObjectType::Dictionary),
5349 Keyword::CONFIGURATION => Ok(TextSearchObjectType::Configuration),
5350 Keyword::TEMPLATE => Ok(TextSearchObjectType::Template),
5351 Keyword::PARSER => Ok(TextSearchObjectType::Parser),
5352 unexpected_keyword => Err(ParserError::ParserError(format!(
5353 "Internal parser error: expected any of {{DICTIONARY, CONFIGURATION, TEMPLATE, PARSER}}, got {unexpected_keyword:?}"
5354 ))),
5355 }
5356 }
5357
5358 pub fn parse_create_text_search(&mut self) -> Result<CreateTextSearch, ParserError> {
5360 self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
5361 let object_type = self.parse_text_search_object_type()?;
5362 let name = self.parse_object_name(false)?;
5363 self.expect_token(&Token::LParen)?;
5364 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
5365 self.expect_token(&Token::RParen)?;
5366 Ok(CreateTextSearch {
5367 object_type,
5368 name,
5369 options,
5370 })
5371 }
5372
5373 fn parse_alter_text_search_option(&mut self) -> Result<AlterTextSearchOption, ParserError> {
5374 let key = self.parse_identifier()?;
5375 let value = if self.consume_token(&Token::Eq) {
5376 Some(self.parse_expr()?)
5377 } else {
5378 None
5379 };
5380 Ok(AlterTextSearchOption { key, value })
5381 }
5382
5383 pub fn parse_alter_text_search(&mut self) -> Result<AlterTextSearch, ParserError> {
5385 self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
5386 let object_type = self.parse_text_search_object_type()?;
5387 let name = self.parse_object_name(false)?;
5388
5389 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5390 AlterTextSearchOperation::RenameTo {
5391 new_name: self.parse_identifier()?,
5392 }
5393 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
5394 AlterTextSearchOperation::OwnerTo(self.parse_owner()?)
5395 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5396 AlterTextSearchOperation::SetSchema {
5397 schema_name: self.parse_object_name(false)?,
5398 }
5399 } else if self.consume_token(&Token::LParen) {
5400 let options = self.parse_comma_separated(Parser::parse_alter_text_search_option)?;
5401 self.expect_token(&Token::RParen)?;
5402 AlterTextSearchOperation::SetOptions { options }
5403 } else {
5404 let expected = "RENAME TO, OWNER TO, SET SCHEMA, or (...) after ALTER TEXT SEARCH";
5405 return self.expected_ref(expected, self.peek_token_ref());
5406 };
5407
5408 Ok(AlterTextSearch {
5409 object_type,
5410 name,
5411 operation,
5412 })
5413 }
5414
5415 fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5416 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5417 let name = self.parse_identifier()?;
5418 let options = self
5419 .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5420 .options;
5421 let with_tags = self.parse_keyword(Keyword::WITH);
5422 let tags = if self.parse_keyword(Keyword::TAG) {
5423 self.parse_key_value_options(true, &[])?.options
5424 } else {
5425 vec![]
5426 };
5427 Ok(CreateUser {
5428 or_replace,
5429 if_not_exists,
5430 name,
5431 options: KeyValueOptions {
5432 options,
5433 delimiter: KeyValueOptionsDelimiter::Space,
5434 },
5435 with_tags,
5436 tags: KeyValueOptions {
5437 options: tags,
5438 delimiter: KeyValueOptionsDelimiter::Comma,
5439 },
5440 })
5441 }
5442
5443 pub fn parse_create_secret(
5445 &mut self,
5446 or_replace: bool,
5447 temporary: bool,
5448 persistent: bool,
5449 ) -> Result<Statement, ParserError> {
5450 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5451
5452 let mut storage_specifier = None;
5453 let mut name = None;
5454 if self.peek_token_ref().token != Token::LParen {
5455 if self.parse_keyword(Keyword::IN) {
5456 storage_specifier = self.parse_identifier().ok()
5457 } else {
5458 name = self.parse_identifier().ok();
5459 }
5460
5461 if storage_specifier.is_none()
5463 && self.peek_token_ref().token != Token::LParen
5464 && self.parse_keyword(Keyword::IN)
5465 {
5466 storage_specifier = self.parse_identifier().ok();
5467 }
5468 }
5469
5470 self.expect_token(&Token::LParen)?;
5471 self.expect_keyword_is(Keyword::TYPE)?;
5472 let secret_type = self.parse_identifier()?;
5473
5474 let mut options = Vec::new();
5475 if self.consume_token(&Token::Comma) {
5476 options.append(&mut self.parse_comma_separated(|p| {
5477 let key = p.parse_identifier()?;
5478 let value = p.parse_identifier()?;
5479 Ok(SecretOption { key, value })
5480 })?);
5481 }
5482 self.expect_token(&Token::RParen)?;
5483
5484 let temp = match (temporary, persistent) {
5485 (true, false) => Some(true),
5486 (false, true) => Some(false),
5487 (false, false) => None,
5488 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5489 };
5490
5491 Ok(Statement::CreateSecret {
5492 or_replace,
5493 temporary: temp,
5494 if_not_exists,
5495 name,
5496 storage_specifier,
5497 secret_type,
5498 options,
5499 })
5500 }
5501
5502 pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5504 let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5505 if self.parse_keyword(Keyword::TABLE) {
5506 let table_name = self.parse_object_name(false)?;
5507 if self.peek_token_ref().token != Token::EOF {
5508 if let Token::Word(word) = &self.peek_token_ref().token {
5509 if word.keyword == Keyword::OPTIONS {
5510 options = self.parse_options(Keyword::OPTIONS)?
5511 }
5512 };
5513
5514 if self.peek_token_ref().token != Token::EOF {
5515 let (a, q) = self.parse_as_query()?;
5516 has_as = a;
5517 query = Some(q);
5518 }
5519
5520 Ok(Statement::Cache {
5521 table_flag,
5522 table_name,
5523 has_as,
5524 options,
5525 query,
5526 })
5527 } else {
5528 Ok(Statement::Cache {
5529 table_flag,
5530 table_name,
5531 has_as,
5532 options,
5533 query,
5534 })
5535 }
5536 } else {
5537 table_flag = Some(self.parse_object_name(false)?);
5538 if self.parse_keyword(Keyword::TABLE) {
5539 let table_name = self.parse_object_name(false)?;
5540 if self.peek_token_ref().token != Token::EOF {
5541 if let Token::Word(word) = &self.peek_token_ref().token {
5542 if word.keyword == Keyword::OPTIONS {
5543 options = self.parse_options(Keyword::OPTIONS)?
5544 }
5545 };
5546
5547 if self.peek_token_ref().token != Token::EOF {
5548 let (a, q) = self.parse_as_query()?;
5549 has_as = a;
5550 query = Some(q);
5551 }
5552
5553 Ok(Statement::Cache {
5554 table_flag,
5555 table_name,
5556 has_as,
5557 options,
5558 query,
5559 })
5560 } else {
5561 Ok(Statement::Cache {
5562 table_flag,
5563 table_name,
5564 has_as,
5565 options,
5566 query,
5567 })
5568 }
5569 } else {
5570 if self.peek_token_ref().token == Token::EOF {
5571 self.prev_token();
5572 }
5573 self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5574 }
5575 }
5576 }
5577
5578 pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5580 match &self.peek_token_ref().token {
5581 Token::Word(word) => match word.keyword {
5582 Keyword::AS => {
5583 self.next_token();
5584 Ok((true, self.parse_query()?))
5585 }
5586 _ => Ok((false, self.parse_query()?)),
5587 },
5588 _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5589 }
5590 }
5591
5592 pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5594 self.expect_keyword_is(Keyword::TABLE)?;
5595 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5596 let table_name = self.parse_object_name(false)?;
5597 Ok(Statement::UNCache {
5598 table_name,
5599 if_exists,
5600 })
5601 }
5602
5603 pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5605 self.expect_keyword_is(Keyword::TABLE)?;
5606 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5607 let table_name = self.parse_object_name(false)?;
5608 self.expect_keyword_is(Keyword::USING)?;
5609 let module_name = self.parse_identifier()?;
5610 let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5615 Ok(Statement::CreateVirtualTable {
5616 name: table_name,
5617 if_not_exists,
5618 module_name,
5619 module_args,
5620 })
5621 }
5622
5623 pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5625 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5626
5627 let schema_name = self.parse_schema_name()?;
5628
5629 let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5630 Some(self.parse_expr()?)
5631 } else {
5632 None
5633 };
5634
5635 let with = if self.peek_keyword(Keyword::WITH) {
5636 Some(self.parse_options(Keyword::WITH)?)
5637 } else {
5638 None
5639 };
5640
5641 let options = if self.peek_keyword(Keyword::OPTIONS) {
5642 Some(self.parse_options(Keyword::OPTIONS)?)
5643 } else {
5644 None
5645 };
5646
5647 let clone = if self.parse_keyword(Keyword::CLONE) {
5648 Some(self.parse_object_name(false)?)
5649 } else {
5650 None
5651 };
5652
5653 Ok(Statement::CreateSchema {
5654 schema_name,
5655 if_not_exists,
5656 with,
5657 options,
5658 default_collate_spec,
5659 clone,
5660 })
5661 }
5662
5663 fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5664 if self.parse_keyword(Keyword::AUTHORIZATION) {
5665 Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5666 } else {
5667 let name = self.parse_object_name(false)?;
5668
5669 if self.parse_keyword(Keyword::AUTHORIZATION) {
5670 Ok(SchemaName::NamedAuthorization(
5671 name,
5672 self.parse_identifier()?,
5673 ))
5674 } else {
5675 Ok(SchemaName::Simple(name))
5676 }
5677 }
5678 }
5679
5680 pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5682 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5683 let db_name = self.parse_object_name(false)?;
5684 let mut location = None;
5685 let mut managed_location = None;
5686 loop {
5687 match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5688 Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5689 Some(Keyword::MANAGEDLOCATION) => {
5690 managed_location = Some(self.parse_literal_string()?)
5691 }
5692 _ => break,
5693 }
5694 }
5695 let clone = if self.parse_keyword(Keyword::CLONE) {
5696 Some(self.parse_object_name(false)?)
5697 } else {
5698 None
5699 };
5700
5701 let mut default_charset = None;
5709 let mut default_collation = None;
5710 loop {
5711 let has_default = self.parse_keyword(Keyword::DEFAULT);
5712 if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5713 || self.parse_keyword(Keyword::CHARSET)
5714 {
5715 let _ = self.consume_token(&Token::Eq);
5716 default_charset = Some(self.parse_identifier()?.value);
5717 } else if self.parse_keyword(Keyword::COLLATE) {
5718 let _ = self.consume_token(&Token::Eq);
5719 default_collation = Some(self.parse_identifier()?.value);
5720 } else if has_default {
5721 self.prev_token();
5723 break;
5724 } else {
5725 break;
5726 }
5727 }
5728
5729 Ok(Statement::CreateDatabase {
5730 db_name,
5731 if_not_exists: ine,
5732 location,
5733 managed_location,
5734 or_replace: false,
5735 transient: false,
5736 clone,
5737 data_retention_time_in_days: None,
5738 max_data_extension_time_in_days: None,
5739 external_volume: None,
5740 catalog: None,
5741 replace_invalid_characters: None,
5742 default_ddl_collation: None,
5743 storage_serialization_policy: None,
5744 comment: None,
5745 default_charset,
5746 default_collation,
5747 catalog_sync: None,
5748 catalog_sync_namespace_mode: None,
5749 catalog_sync_namespace_flatten_delimiter: None,
5750 with_tags: None,
5751 with_contacts: None,
5752 })
5753 }
5754
5755 pub fn parse_optional_create_function_using(
5757 &mut self,
5758 ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5759 if !self.parse_keyword(Keyword::USING) {
5760 return Ok(None);
5761 };
5762 let keyword =
5763 self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5764
5765 let uri = self.parse_literal_string()?;
5766
5767 match keyword {
5768 Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5769 Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5770 Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5771 _ => self.expected(
5772 "JAR, FILE or ARCHIVE, got {:?}",
5773 TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5774 ),
5775 }
5776 }
5777
5778 pub fn parse_create_function(
5780 &mut self,
5781 or_alter: bool,
5782 or_replace: bool,
5783 temporary: bool,
5784 ) -> Result<Statement, ParserError> {
5785 if dialect_of!(self is HiveDialect) {
5786 self.parse_hive_create_function(or_replace, temporary)
5787 .map(Into::into)
5788 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5789 self.parse_postgres_create_function(or_replace, temporary)
5790 .map(Into::into)
5791 } else if dialect_of!(self is DuckDbDialect) {
5792 self.parse_create_macro(or_replace, temporary)
5793 } else if dialect_of!(self is BigQueryDialect) {
5794 self.parse_bigquery_create_function(or_replace, temporary)
5795 .map(Into::into)
5796 } else if dialect_of!(self is MsSqlDialect) {
5797 self.parse_mssql_create_function(or_alter, or_replace, temporary)
5798 .map(Into::into)
5799 } else {
5800 self.prev_token();
5801 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5802 }
5803 }
5804
5805 fn parse_postgres_create_function(
5809 &mut self,
5810 or_replace: bool,
5811 temporary: bool,
5812 ) -> Result<CreateFunction, ParserError> {
5813 let name = self.parse_object_name(false)?;
5814
5815 self.expect_token(&Token::LParen)?;
5816 let args = if Token::RParen != self.peek_token_ref().token {
5817 self.parse_comma_separated(Parser::parse_function_arg)?
5818 } else {
5819 vec![]
5820 };
5821 self.expect_token(&Token::RParen)?;
5822
5823 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5824 Some(self.parse_function_return_type()?)
5825 } else {
5826 None
5827 };
5828
5829 #[derive(Default)]
5830 struct Body {
5831 language: Option<Ident>,
5832 behavior: Option<FunctionBehavior>,
5833 function_body: Option<CreateFunctionBody>,
5834 called_on_null: Option<FunctionCalledOnNull>,
5835 parallel: Option<FunctionParallel>,
5836 security: Option<FunctionSecurity>,
5837 }
5838 let mut body = Body::default();
5839 let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5840 loop {
5841 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5842 if field.is_some() {
5843 return Err(ParserError::ParserError(format!(
5844 "{name} specified more than once",
5845 )));
5846 }
5847 Ok(())
5848 }
5849 if self.parse_keyword(Keyword::AS) {
5850 ensure_not_set(&body.function_body, "AS")?;
5851 body.function_body = Some(self.parse_create_function_body_string()?);
5852 } else if self.parse_keyword(Keyword::LANGUAGE) {
5853 ensure_not_set(&body.language, "LANGUAGE")?;
5854 body.language = Some(self.parse_identifier()?);
5855 } else if self.parse_keyword(Keyword::IMMUTABLE) {
5856 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5857 body.behavior = Some(FunctionBehavior::Immutable);
5858 } else if self.parse_keyword(Keyword::STABLE) {
5859 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5860 body.behavior = Some(FunctionBehavior::Stable);
5861 } else if self.parse_keyword(Keyword::VOLATILE) {
5862 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5863 body.behavior = Some(FunctionBehavior::Volatile);
5864 } else if self.parse_keywords(&[
5865 Keyword::CALLED,
5866 Keyword::ON,
5867 Keyword::NULL,
5868 Keyword::INPUT,
5869 ]) {
5870 ensure_not_set(
5871 &body.called_on_null,
5872 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5873 )?;
5874 body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5875 } else if self.parse_keywords(&[
5876 Keyword::RETURNS,
5877 Keyword::NULL,
5878 Keyword::ON,
5879 Keyword::NULL,
5880 Keyword::INPUT,
5881 ]) {
5882 ensure_not_set(
5883 &body.called_on_null,
5884 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5885 )?;
5886 body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5887 } else if self.parse_keyword(Keyword::STRICT) {
5888 ensure_not_set(
5889 &body.called_on_null,
5890 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5891 )?;
5892 body.called_on_null = Some(FunctionCalledOnNull::Strict);
5893 } else if self.parse_keyword(Keyword::PARALLEL) {
5894 ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5895 if self.parse_keyword(Keyword::UNSAFE) {
5896 body.parallel = Some(FunctionParallel::Unsafe);
5897 } else if self.parse_keyword(Keyword::RESTRICTED) {
5898 body.parallel = Some(FunctionParallel::Restricted);
5899 } else if self.parse_keyword(Keyword::SAFE) {
5900 body.parallel = Some(FunctionParallel::Safe);
5901 } else {
5902 return self
5903 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5904 }
5905 } else if self.parse_keyword(Keyword::SECURITY) {
5906 ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5907 if self.parse_keyword(Keyword::DEFINER) {
5908 body.security = Some(FunctionSecurity::Definer);
5909 } else if self.parse_keyword(Keyword::INVOKER) {
5910 body.security = Some(FunctionSecurity::Invoker);
5911 } else {
5912 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5913 }
5914 } else if self.parse_keyword(Keyword::SET) {
5915 let name = self.parse_object_name(false)?;
5916 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5917 FunctionSetValue::FromCurrent
5918 } else {
5919 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5920 return self.expected_ref("= or TO", self.peek_token_ref());
5921 }
5922 if self.parse_keyword(Keyword::DEFAULT) {
5923 FunctionSetValue::Default
5924 } else {
5925 let values = self.parse_comma_separated(Parser::parse_expr)?;
5926 FunctionSetValue::Values(values)
5927 }
5928 };
5929 set_params.push(FunctionDefinitionSetParam { name, value });
5930 } else if self.parse_keyword(Keyword::RETURN) {
5931 ensure_not_set(&body.function_body, "RETURN")?;
5932 body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5933 } else {
5934 break;
5935 }
5936 }
5937
5938 Ok(CreateFunction {
5939 or_alter: false,
5940 or_replace,
5941 temporary,
5942 name,
5943 args: Some(args),
5944 return_type,
5945 behavior: body.behavior,
5946 called_on_null: body.called_on_null,
5947 parallel: body.parallel,
5948 security: body.security,
5949 set_params,
5950 language: body.language,
5951 function_body: body.function_body,
5952 if_not_exists: false,
5953 using: None,
5954 determinism_specifier: None,
5955 options: None,
5956 remote_connection: None,
5957 })
5958 }
5959
5960 fn parse_hive_create_function(
5964 &mut self,
5965 or_replace: bool,
5966 temporary: bool,
5967 ) -> Result<CreateFunction, ParserError> {
5968 let name = self.parse_object_name(false)?;
5969 self.expect_keyword_is(Keyword::AS)?;
5970
5971 let body = self.parse_create_function_body_string()?;
5972 let using = self.parse_optional_create_function_using()?;
5973
5974 Ok(CreateFunction {
5975 or_alter: false,
5976 or_replace,
5977 temporary,
5978 name,
5979 function_body: Some(body),
5980 using,
5981 if_not_exists: false,
5982 args: None,
5983 return_type: None,
5984 behavior: None,
5985 called_on_null: None,
5986 parallel: None,
5987 security: None,
5988 set_params: vec![],
5989 language: None,
5990 determinism_specifier: None,
5991 options: None,
5992 remote_connection: None,
5993 })
5994 }
5995
5996 fn parse_bigquery_create_function(
6000 &mut self,
6001 or_replace: bool,
6002 temporary: bool,
6003 ) -> Result<CreateFunction, ParserError> {
6004 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6005 let (name, args) = self.parse_create_function_name_and_params()?;
6006
6007 let return_type = if self.parse_keyword(Keyword::RETURNS) {
6008 Some(self.parse_function_return_type()?)
6009 } else {
6010 None
6011 };
6012
6013 let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
6014 Some(FunctionDeterminismSpecifier::Deterministic)
6015 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
6016 Some(FunctionDeterminismSpecifier::NotDeterministic)
6017 } else {
6018 None
6019 };
6020
6021 let language = if self.parse_keyword(Keyword::LANGUAGE) {
6022 Some(self.parse_identifier()?)
6023 } else {
6024 None
6025 };
6026
6027 let remote_connection =
6028 if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
6029 Some(self.parse_object_name(false)?)
6030 } else {
6031 None
6032 };
6033
6034 let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
6037
6038 let function_body = if remote_connection.is_none() {
6039 self.expect_keyword_is(Keyword::AS)?;
6040 let expr = self.parse_expr()?;
6041 if options.is_none() {
6042 options = self.maybe_parse_options(Keyword::OPTIONS)?;
6043 Some(CreateFunctionBody::AsBeforeOptions {
6044 body: expr,
6045 link_symbol: None,
6046 })
6047 } else {
6048 Some(CreateFunctionBody::AsAfterOptions(expr))
6049 }
6050 } else {
6051 None
6052 };
6053
6054 Ok(CreateFunction {
6055 or_alter: false,
6056 or_replace,
6057 temporary,
6058 if_not_exists,
6059 name,
6060 args: Some(args),
6061 return_type,
6062 function_body,
6063 language,
6064 determinism_specifier,
6065 options,
6066 remote_connection,
6067 using: None,
6068 behavior: None,
6069 called_on_null: None,
6070 parallel: None,
6071 security: None,
6072 set_params: vec![],
6073 })
6074 }
6075
6076 fn parse_mssql_create_function(
6080 &mut self,
6081 or_alter: bool,
6082 or_replace: bool,
6083 temporary: bool,
6084 ) -> Result<CreateFunction, ParserError> {
6085 let (name, args) = self.parse_create_function_name_and_params()?;
6086
6087 self.expect_keyword(Keyword::RETURNS)?;
6088
6089 let return_table = self.maybe_parse(|p| {
6090 let return_table_name = p.parse_identifier()?;
6091
6092 p.expect_keyword_is(Keyword::TABLE)?;
6093 p.prev_token();
6094
6095 let table_column_defs = match p.parse_data_type()? {
6096 DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
6097 table_column_defs
6098 }
6099 _ => parser_err!(
6100 "Expected table column definitions after TABLE keyword",
6101 p.peek_token_ref().span.start
6102 )?,
6103 };
6104
6105 Ok(DataType::NamedTable {
6106 name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
6107 columns: table_column_defs,
6108 })
6109 })?;
6110
6111 let data_type = match return_table {
6112 Some(table_type) => table_type,
6113 None => self.parse_data_type()?,
6114 };
6115 let return_type = Some(FunctionReturnType::DataType(data_type));
6116
6117 let _ = self.parse_keyword(Keyword::AS);
6118
6119 let function_body = if self.peek_keyword(Keyword::BEGIN) {
6120 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
6121 let statements = self.parse_statement_list(&[Keyword::END])?;
6122 let end_token = self.expect_keyword(Keyword::END)?;
6123
6124 Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
6125 begin_token: AttachedToken(begin_token),
6126 statements,
6127 end_token: AttachedToken(end_token),
6128 }))
6129 } else if self.parse_keyword(Keyword::RETURN) {
6130 if self.peek_token_ref().token == Token::LParen {
6131 Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
6132 } else if self.peek_keyword(Keyword::SELECT) {
6133 let select = self.parse_select()?;
6134 Some(CreateFunctionBody::AsReturnSelect(select))
6135 } else {
6136 parser_err!(
6137 "Expected a subquery (or bare SELECT statement) after RETURN",
6138 self.peek_token_ref().span.start
6139 )?
6140 }
6141 } else {
6142 parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
6143 };
6144
6145 Ok(CreateFunction {
6146 or_alter,
6147 or_replace,
6148 temporary,
6149 if_not_exists: false,
6150 name,
6151 args: Some(args),
6152 return_type,
6153 function_body,
6154 language: None,
6155 determinism_specifier: None,
6156 options: None,
6157 remote_connection: None,
6158 using: None,
6159 behavior: None,
6160 called_on_null: None,
6161 parallel: None,
6162 security: None,
6163 set_params: vec![],
6164 })
6165 }
6166
6167 fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
6168 if self.parse_keyword(Keyword::SETOF) {
6169 Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
6170 } else {
6171 Ok(FunctionReturnType::DataType(self.parse_data_type()?))
6172 }
6173 }
6174
6175 fn parse_create_function_name_and_params(
6176 &mut self,
6177 ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
6178 let name = self.parse_object_name(false)?;
6179 let parse_function_param =
6180 |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
6181 let name = parser.parse_identifier()?;
6182 let data_type = parser.parse_data_type()?;
6183 let default_expr = if parser.consume_token(&Token::Eq) {
6184 Some(parser.parse_expr()?)
6185 } else {
6186 None
6187 };
6188
6189 Ok(OperateFunctionArg {
6190 mode: None,
6191 name: Some(name),
6192 data_type,
6193 default_expr,
6194 })
6195 };
6196 self.expect_token(&Token::LParen)?;
6197 let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6198 self.expect_token(&Token::RParen)?;
6199 Ok((name, args))
6200 }
6201
6202 fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6203 let mode = if self.parse_keyword(Keyword::IN) {
6204 Some(ArgMode::In)
6205 } else if self.parse_keyword(Keyword::OUT) {
6206 Some(ArgMode::Out)
6207 } else if self.parse_keyword(Keyword::INOUT) {
6208 Some(ArgMode::InOut)
6209 } else if self.parse_keyword(Keyword::VARIADIC) {
6210 Some(ArgMode::Variadic)
6211 } else {
6212 None
6213 };
6214
6215 let mut name = None;
6217 let mut data_type = self.parse_data_type()?;
6218
6219 let data_type_idx = self.get_current_index();
6223
6224 fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6226 if parser.peek_keyword(Keyword::DEFAULT) {
6227 parser_err!(
6229 "The DEFAULT keyword is not a type",
6230 parser.peek_token_ref().span.start
6231 )
6232 } else {
6233 parser.parse_data_type()
6234 }
6235 }
6236
6237 if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6238 let token = self.token_at(data_type_idx);
6239
6240 if !matches!(token.token, Token::Word(_)) {
6242 return self.expected("a name or type", token.clone());
6243 }
6244
6245 name = Some(Ident::new(token.to_string()));
6246 data_type = next_data_type;
6247 }
6248
6249 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6250 {
6251 Some(self.parse_expr()?)
6252 } else {
6253 None
6254 };
6255 Ok(OperateFunctionArg {
6256 mode,
6257 name,
6258 data_type,
6259 default_expr,
6260 })
6261 }
6262
6263 fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6264 let mode = if self.parse_keyword(Keyword::IN) {
6265 Some(ArgMode::In)
6266 } else {
6267 if self
6268 .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6269 .is_some()
6270 {
6271 return self.expected_ref(
6272 "IN or argument type in aggregate signature",
6273 self.peek_token_ref(),
6274 );
6275 }
6276 None
6277 };
6278
6279 let mut name = None;
6282 let mut data_type = self.parse_data_type()?;
6283 let data_type_idx = self.get_current_index();
6284
6285 fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6286 if parser.peek_keyword(Keyword::DEFAULT)
6287 || parser.peek_keyword(Keyword::ORDER)
6288 || parser.peek_token_ref().token == Token::Comma
6289 || parser.peek_token_ref().token == Token::RParen
6290 {
6291 parser_err!(
6293 "The current token cannot start an aggregate argument type",
6294 parser.peek_token_ref().span.start
6295 )
6296 } else {
6297 parser.parse_data_type()
6298 }
6299 }
6300
6301 if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6302 let token = self.token_at(data_type_idx);
6303 if !matches!(token.token, Token::Word(_)) {
6304 return self.expected("a name or type", token.clone());
6305 }
6306
6307 name = Some(Ident::new(token.to_string()));
6308 data_type = next_data_type;
6309 }
6310
6311 if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6312 return self.expected_ref(
6313 "',' or ')' or ORDER BY after aggregate argument type",
6314 self.peek_token_ref(),
6315 );
6316 }
6317
6318 Ok(OperateFunctionArg {
6319 mode,
6320 name,
6321 data_type,
6322 default_expr: None,
6323 })
6324 }
6325
6326 pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6332 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6333 {
6334 self.prev_token();
6335 return self.expected_ref("an object type after DROP", self.peek_token_ref());
6336 }
6337 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6338 let trigger_name = self.parse_object_name(false)?;
6339 let table_name = if self.parse_keyword(Keyword::ON) {
6340 Some(self.parse_object_name(false)?)
6341 } else {
6342 None
6343 };
6344 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6345 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6346 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6347 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6348 format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6349 )),
6350 None => None,
6351 };
6352 Ok(DropTrigger {
6353 if_exists,
6354 trigger_name,
6355 table_name,
6356 option,
6357 })
6358 }
6359
6360 pub fn parse_create_trigger(
6362 &mut self,
6363 temporary: bool,
6364 or_alter: bool,
6365 or_replace: bool,
6366 is_constraint: bool,
6367 ) -> Result<CreateTrigger, ParserError> {
6368 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6369 {
6370 self.prev_token();
6371 return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6372 }
6373
6374 let name = self.parse_object_name(false)?;
6375 let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6376
6377 let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6378 self.expect_keyword_is(Keyword::ON)?;
6379 let table_name = self.parse_object_name(false)?;
6380
6381 let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6382 self.parse_object_name(true).ok()
6383 } else {
6384 None
6385 };
6386
6387 let characteristics = self.parse_constraint_characteristics()?;
6388
6389 let mut referencing = vec![];
6390 if self.parse_keyword(Keyword::REFERENCING) {
6391 while let Some(refer) = self.parse_trigger_referencing()? {
6392 referencing.push(refer);
6393 }
6394 }
6395
6396 let trigger_object = if self.parse_keyword(Keyword::FOR) {
6397 let include_each = self.parse_keyword(Keyword::EACH);
6398 let trigger_object =
6399 match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6400 Keyword::ROW => TriggerObject::Row,
6401 Keyword::STATEMENT => TriggerObject::Statement,
6402 unexpected_keyword => return Err(ParserError::ParserError(
6403 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6404 )),
6405 };
6406
6407 Some(if include_each {
6408 TriggerObjectKind::ForEach(trigger_object)
6409 } else {
6410 TriggerObjectKind::For(trigger_object)
6411 })
6412 } else {
6413 let _ = self.parse_keyword(Keyword::FOR);
6414
6415 None
6416 };
6417
6418 let condition = self
6419 .parse_keyword(Keyword::WHEN)
6420 .then(|| self.parse_expr())
6421 .transpose()?;
6422
6423 let mut exec_body = None;
6424 let mut statements = None;
6425 if self.parse_keyword(Keyword::EXECUTE) {
6426 exec_body = Some(self.parse_trigger_exec_body()?);
6427 } else {
6428 statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6429 }
6430
6431 Ok(CreateTrigger {
6432 or_alter,
6433 temporary,
6434 or_replace,
6435 is_constraint,
6436 name,
6437 period,
6438 period_before_table: true,
6439 events,
6440 table_name,
6441 referenced_table_name,
6442 referencing,
6443 trigger_object,
6444 condition,
6445 exec_body,
6446 statements_as: false,
6447 statements,
6448 characteristics,
6449 })
6450 }
6451
6452 pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6454 Ok(
6455 match self.expect_one_of_keywords(&[
6456 Keyword::FOR,
6457 Keyword::BEFORE,
6458 Keyword::AFTER,
6459 Keyword::INSTEAD,
6460 ])? {
6461 Keyword::FOR => TriggerPeriod::For,
6462 Keyword::BEFORE => TriggerPeriod::Before,
6463 Keyword::AFTER => TriggerPeriod::After,
6464 Keyword::INSTEAD => self
6465 .expect_keyword_is(Keyword::OF)
6466 .map(|_| TriggerPeriod::InsteadOf)?,
6467 unexpected_keyword => return Err(ParserError::ParserError(
6468 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6469 )),
6470 },
6471 )
6472 }
6473
6474 pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6476 Ok(
6477 match self.expect_one_of_keywords(&[
6478 Keyword::INSERT,
6479 Keyword::UPDATE,
6480 Keyword::DELETE,
6481 Keyword::TRUNCATE,
6482 ])? {
6483 Keyword::INSERT => TriggerEvent::Insert,
6484 Keyword::UPDATE => {
6485 if self.parse_keyword(Keyword::OF) {
6486 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6487 TriggerEvent::Update(cols)
6488 } else {
6489 TriggerEvent::Update(vec![])
6490 }
6491 }
6492 Keyword::DELETE => TriggerEvent::Delete,
6493 Keyword::TRUNCATE => TriggerEvent::Truncate,
6494 unexpected_keyword => return Err(ParserError::ParserError(
6495 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6496 )),
6497 },
6498 )
6499 }
6500
6501 pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6503 let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6504 Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6505 TriggerReferencingType::OldTable
6506 }
6507 Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6508 TriggerReferencingType::NewTable
6509 }
6510 _ => {
6511 return Ok(None);
6512 }
6513 };
6514
6515 let is_as = self.parse_keyword(Keyword::AS);
6516 let transition_relation_name = self.parse_object_name(false)?;
6517 Ok(Some(TriggerReferencing {
6518 refer_type,
6519 is_as,
6520 transition_relation_name,
6521 }))
6522 }
6523
6524 pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6526 Ok(TriggerExecBody {
6527 exec_type: match self
6528 .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6529 {
6530 Keyword::FUNCTION => TriggerExecBodyType::Function,
6531 Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6532 unexpected_keyword => return Err(ParserError::ParserError(
6533 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6534 )),
6535 },
6536 func_desc: self.parse_function_desc()?,
6537 })
6538 }
6539
6540 pub fn parse_create_macro(
6542 &mut self,
6543 or_replace: bool,
6544 temporary: bool,
6545 ) -> Result<Statement, ParserError> {
6546 if dialect_of!(self is DuckDbDialect | GenericDialect) {
6547 let name = self.parse_object_name(false)?;
6548 self.expect_token(&Token::LParen)?;
6549 let args = if self.consume_token(&Token::RParen) {
6550 self.prev_token();
6551 None
6552 } else {
6553 Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6554 };
6555
6556 self.expect_token(&Token::RParen)?;
6557 self.expect_keyword_is(Keyword::AS)?;
6558
6559 Ok(Statement::CreateMacro {
6560 or_replace,
6561 temporary,
6562 name,
6563 args,
6564 definition: if self.parse_keyword(Keyword::TABLE) {
6565 MacroDefinition::Table(self.parse_query()?)
6566 } else {
6567 MacroDefinition::Expr(self.parse_expr()?)
6568 },
6569 })
6570 } else {
6571 self.prev_token();
6572 self.expected_ref("an object type after CREATE", self.peek_token_ref())
6573 }
6574 }
6575
6576 fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6577 let name = self.parse_identifier()?;
6578
6579 let default_expr =
6580 if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6581 Some(self.parse_expr()?)
6582 } else {
6583 None
6584 };
6585 Ok(MacroArg { name, default_expr })
6586 }
6587
6588 pub fn parse_create_external_table(
6590 &mut self,
6591 or_replace: bool,
6592 ) -> Result<CreateTable, ParserError> {
6593 self.expect_keyword_is(Keyword::TABLE)?;
6594 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6595 let table_name = self.parse_object_name(false)?;
6596 let (columns, constraints) = self.parse_columns()?;
6597
6598 let hive_distribution = self.parse_hive_distribution()?;
6599 let hive_formats = self.parse_hive_formats()?;
6600
6601 let file_format = if let Some(ref hf) = hive_formats {
6602 if let Some(ref ff) = hf.storage {
6603 match ff {
6604 HiveIOFormat::FileFormat { format } => Some(*format),
6605 _ => None,
6606 }
6607 } else {
6608 None
6609 }
6610 } else {
6611 None
6612 };
6613 let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6614
6615 let with_connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
6616 Some(self.parse_object_name(false)?)
6617 } else {
6618 None
6619 };
6620 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6621 let table_options = if !table_properties.is_empty() {
6622 CreateTableOptions::TableProperties(table_properties)
6623 } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6624 CreateTableOptions::Options(options)
6625 } else {
6626 CreateTableOptions::None
6627 };
6628 Ok(CreateTableBuilder::new(table_name)
6629 .columns(columns)
6630 .constraints(constraints)
6631 .hive_distribution(hive_distribution)
6632 .hive_formats(hive_formats)
6633 .table_options(table_options)
6634 .with_connection(with_connection)
6635 .or_replace(or_replace)
6636 .if_not_exists(if_not_exists)
6637 .external(true)
6638 .file_format(file_format)
6639 .location(location)
6640 .build())
6641 }
6642
6643 pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6647 self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6648 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6649 let table_name = self.parse_object_name(true)?;
6650
6651 self.expect_keyword_is(Keyword::CLONE)?;
6652 let clone = Some(self.parse_object_name(true)?);
6653
6654 let version =
6655 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6656 {
6657 Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6658 } else {
6659 None
6660 };
6661
6662 let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6663 CreateTableOptions::Options(options)
6664 } else {
6665 CreateTableOptions::None
6666 };
6667
6668 Ok(CreateTableBuilder::new(table_name)
6669 .snapshot(true)
6670 .if_not_exists(if_not_exists)
6671 .clone_clause(clone)
6672 .version(version)
6673 .table_options(table_options)
6674 .build())
6675 }
6676
6677 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6679 let next_token = self.next_token();
6680 match &next_token.token {
6681 Token::Word(w) => match w.keyword {
6682 Keyword::AVRO => Ok(FileFormat::AVRO),
6683 Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6684 Keyword::ORC => Ok(FileFormat::ORC),
6685 Keyword::PARQUET => Ok(FileFormat::PARQUET),
6686 Keyword::RCFILE => Ok(FileFormat::RCFILE),
6687 Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6688 Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6689 _ => self.expected("fileformat", next_token),
6690 },
6691 _ => self.expected("fileformat", next_token),
6692 }
6693 }
6694
6695 fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6696 if self.consume_token(&Token::Eq) {
6697 Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6698 } else {
6699 Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6700 }
6701 }
6702
6703 pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6705 let next_token = self.next_token();
6706 match &next_token.token {
6707 Token::Word(w) => match w.keyword {
6708 Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6709 Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6710 Keyword::JSON => Ok(AnalyzeFormat::JSON),
6711 Keyword::TREE => Ok(AnalyzeFormat::TREE),
6712 _ => self.expected("fileformat", next_token),
6713 },
6714 _ => self.expected("fileformat", next_token),
6715 }
6716 }
6717
6718 pub fn parse_create_view(
6720 &mut self,
6721 or_alter: bool,
6722 or_replace: bool,
6723 temporary: bool,
6724 create_view_params: Option<CreateViewParams>,
6725 ) -> Result<CreateView, ParserError> {
6726 let secure = self.parse_keyword(Keyword::SECURE);
6727 let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6728 self.expect_keyword_is(Keyword::VIEW)?;
6729 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6730 let if_not_exists_first =
6733 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6734 let name = self.parse_object_name(allow_unquoted_hyphen)?;
6735 let name_before_not_exists = !if_not_exists_first
6736 && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6737 let if_not_exists = if_not_exists_first || name_before_not_exists;
6738 let mut copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6739 let columns = self.parse_view_columns()?;
6742 if !copy_grants {
6746 copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6747 }
6748 let mut options = CreateTableOptions::None;
6749 let with_options = self.parse_options(Keyword::WITH)?;
6750 if !with_options.is_empty() {
6751 options = CreateTableOptions::With(with_options);
6752 }
6753
6754 let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6755 self.expect_keyword_is(Keyword::BY)?;
6756 self.parse_parenthesized_column_list(Optional, false)?
6757 } else {
6758 vec![]
6759 };
6760
6761 if dialect_of!(self is BigQueryDialect | GenericDialect) {
6762 if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6763 if !opts.is_empty() {
6764 options = CreateTableOptions::Options(opts);
6765 }
6766 };
6767 }
6768
6769 let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6770 && self.parse_keyword(Keyword::TO)
6771 {
6772 Some(self.parse_object_name(false)?)
6773 } else {
6774 None
6775 };
6776
6777 let comment = if self.dialect.supports_create_view_comment_syntax()
6778 && self.parse_keyword(Keyword::COMMENT)
6779 {
6780 self.expect_token(&Token::Eq)?;
6781 Some(self.parse_comment_value()?)
6782 } else {
6783 None
6784 };
6785
6786 self.expect_keyword_is(Keyword::AS)?;
6787 let query = self.parse_query()?;
6788 let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6791 && self.parse_keywords(&[
6792 Keyword::WITH,
6793 Keyword::NO,
6794 Keyword::SCHEMA,
6795 Keyword::BINDING,
6796 ]);
6797
6798 Ok(CreateView {
6799 or_alter,
6800 name,
6801 columns,
6802 query,
6803 materialized,
6804 secure,
6805 or_replace,
6806 options,
6807 cluster_by,
6808 comment,
6809 with_no_schema_binding,
6810 if_not_exists,
6811 temporary,
6812 copy_grants,
6813 to,
6814 params: create_view_params,
6815 name_before_not_exists,
6816 })
6817 }
6818
6819 fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6823 let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6824 self.expect_token(&Token::Eq)?;
6825 Some(
6826 match self.expect_one_of_keywords(&[
6827 Keyword::UNDEFINED,
6828 Keyword::MERGE,
6829 Keyword::TEMPTABLE,
6830 ])? {
6831 Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6832 Keyword::MERGE => CreateViewAlgorithm::Merge,
6833 Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6834 _ => {
6835 self.prev_token();
6836 let found = self.next_token();
6837 return self
6838 .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6839 }
6840 },
6841 )
6842 } else {
6843 None
6844 };
6845 let definer = if self.parse_keyword(Keyword::DEFINER) {
6846 self.expect_token(&Token::Eq)?;
6847 Some(self.parse_grantee_name()?)
6848 } else {
6849 None
6850 };
6851 let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6852 Some(
6853 match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6854 Keyword::DEFINER => CreateViewSecurity::Definer,
6855 Keyword::INVOKER => CreateViewSecurity::Invoker,
6856 _ => {
6857 self.prev_token();
6858 let found = self.next_token();
6859 return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6860 }
6861 },
6862 )
6863 } else {
6864 None
6865 };
6866 if algorithm.is_some() || definer.is_some() || security.is_some() {
6867 Ok(Some(CreateViewParams {
6868 algorithm,
6869 definer,
6870 security,
6871 }))
6872 } else {
6873 Ok(None)
6874 }
6875 }
6876
6877 pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6879 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6880 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6881
6882 let _ = self.parse_keyword(Keyword::WITH); let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6885 vec![Keyword::AUTHORIZATION]
6886 } else if dialect_of!(self is PostgreSqlDialect) {
6887 vec![
6888 Keyword::LOGIN,
6889 Keyword::NOLOGIN,
6890 Keyword::INHERIT,
6891 Keyword::NOINHERIT,
6892 Keyword::BYPASSRLS,
6893 Keyword::NOBYPASSRLS,
6894 Keyword::PASSWORD,
6895 Keyword::CREATEDB,
6896 Keyword::NOCREATEDB,
6897 Keyword::CREATEROLE,
6898 Keyword::NOCREATEROLE,
6899 Keyword::SUPERUSER,
6900 Keyword::NOSUPERUSER,
6901 Keyword::REPLICATION,
6902 Keyword::NOREPLICATION,
6903 Keyword::CONNECTION,
6904 Keyword::VALID,
6905 Keyword::IN,
6906 Keyword::ROLE,
6907 Keyword::ADMIN,
6908 Keyword::USER,
6909 ]
6910 } else {
6911 vec![]
6912 };
6913
6914 let mut authorization_owner = None;
6916 let mut login = None;
6918 let mut inherit = None;
6919 let mut bypassrls = None;
6920 let mut password = None;
6921 let mut create_db = None;
6922 let mut create_role = None;
6923 let mut superuser = None;
6924 let mut replication = None;
6925 let mut connection_limit = None;
6926 let mut valid_until = None;
6927 let mut in_role = vec![];
6928 let mut in_group = vec![];
6929 let mut role = vec![];
6930 let mut user = vec![];
6931 let mut admin = vec![];
6932
6933 while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6934 let loc = self
6935 .tokens
6936 .get(self.index - 1)
6937 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6938 match keyword {
6939 Keyword::AUTHORIZATION => {
6940 if authorization_owner.is_some() {
6941 parser_err!("Found multiple AUTHORIZATION", loc)
6942 } else {
6943 authorization_owner = Some(self.parse_object_name(false)?);
6944 Ok(())
6945 }
6946 }
6947 Keyword::LOGIN | Keyword::NOLOGIN => {
6948 if login.is_some() {
6949 parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6950 } else {
6951 login = Some(keyword == Keyword::LOGIN);
6952 Ok(())
6953 }
6954 }
6955 Keyword::INHERIT | Keyword::NOINHERIT => {
6956 if inherit.is_some() {
6957 parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6958 } else {
6959 inherit = Some(keyword == Keyword::INHERIT);
6960 Ok(())
6961 }
6962 }
6963 Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6964 if bypassrls.is_some() {
6965 parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6966 } else {
6967 bypassrls = Some(keyword == Keyword::BYPASSRLS);
6968 Ok(())
6969 }
6970 }
6971 Keyword::CREATEDB | Keyword::NOCREATEDB => {
6972 if create_db.is_some() {
6973 parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6974 } else {
6975 create_db = Some(keyword == Keyword::CREATEDB);
6976 Ok(())
6977 }
6978 }
6979 Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6980 if create_role.is_some() {
6981 parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6982 } else {
6983 create_role = Some(keyword == Keyword::CREATEROLE);
6984 Ok(())
6985 }
6986 }
6987 Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6988 if superuser.is_some() {
6989 parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6990 } else {
6991 superuser = Some(keyword == Keyword::SUPERUSER);
6992 Ok(())
6993 }
6994 }
6995 Keyword::REPLICATION | Keyword::NOREPLICATION => {
6996 if replication.is_some() {
6997 parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6998 } else {
6999 replication = Some(keyword == Keyword::REPLICATION);
7000 Ok(())
7001 }
7002 }
7003 Keyword::PASSWORD => {
7004 if password.is_some() {
7005 parser_err!("Found multiple PASSWORD", loc)
7006 } else {
7007 password = if self.parse_keyword(Keyword::NULL) {
7008 Some(Password::NullPassword)
7009 } else {
7010 Some(Password::Password(Expr::Value(self.parse_value()?)))
7011 };
7012 Ok(())
7013 }
7014 }
7015 Keyword::CONNECTION => {
7016 self.expect_keyword_is(Keyword::LIMIT)?;
7017 if connection_limit.is_some() {
7018 parser_err!("Found multiple CONNECTION LIMIT", loc)
7019 } else {
7020 connection_limit = Some(Expr::Value(self.parse_number_value()?));
7021 Ok(())
7022 }
7023 }
7024 Keyword::VALID => {
7025 self.expect_keyword_is(Keyword::UNTIL)?;
7026 if valid_until.is_some() {
7027 parser_err!("Found multiple VALID UNTIL", loc)
7028 } else {
7029 valid_until = Some(Expr::Value(self.parse_value()?));
7030 Ok(())
7031 }
7032 }
7033 Keyword::IN => {
7034 if self.parse_keyword(Keyword::ROLE) {
7035 if !in_role.is_empty() {
7036 parser_err!("Found multiple IN ROLE", loc)
7037 } else {
7038 in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
7039 Ok(())
7040 }
7041 } else if self.parse_keyword(Keyword::GROUP) {
7042 if !in_group.is_empty() {
7043 parser_err!("Found multiple IN GROUP", loc)
7044 } else {
7045 in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
7046 Ok(())
7047 }
7048 } else {
7049 self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
7050 }
7051 }
7052 Keyword::ROLE => {
7053 if !role.is_empty() {
7054 parser_err!("Found multiple ROLE", loc)
7055 } else {
7056 role = self.parse_comma_separated(|p| p.parse_identifier())?;
7057 Ok(())
7058 }
7059 }
7060 Keyword::USER => {
7061 if !user.is_empty() {
7062 parser_err!("Found multiple USER", loc)
7063 } else {
7064 user = self.parse_comma_separated(|p| p.parse_identifier())?;
7065 Ok(())
7066 }
7067 }
7068 Keyword::ADMIN => {
7069 if !admin.is_empty() {
7070 parser_err!("Found multiple ADMIN", loc)
7071 } else {
7072 admin = self.parse_comma_separated(|p| p.parse_identifier())?;
7073 Ok(())
7074 }
7075 }
7076 _ => break,
7077 }?
7078 }
7079
7080 Ok(CreateRole {
7081 names,
7082 if_not_exists,
7083 login,
7084 inherit,
7085 bypassrls,
7086 password,
7087 create_db,
7088 create_role,
7089 replication,
7090 superuser,
7091 connection_limit,
7092 valid_until,
7093 in_role,
7094 in_group,
7095 role,
7096 user,
7097 admin,
7098 authorization_owner,
7099 })
7100 }
7101
7102 pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
7104 let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
7105 Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
7106 Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
7107 Some(Keyword::SESSION_USER) => Owner::SessionUser,
7108 Some(unexpected_keyword) => return Err(ParserError::ParserError(
7109 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
7110 )),
7111 None => {
7112 match self.parse_identifier() {
7113 Ok(ident) => Owner::Ident(ident),
7114 Err(e) => {
7115 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
7116 }
7117 }
7118 }
7119 };
7120 Ok(owner)
7121 }
7122
7123 fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
7125 let name = self.parse_object_name(false)?;
7126 self.expect_keyword_is(Keyword::AS)?;
7127 let data_type = self.parse_data_type()?;
7128 let collation = if self.parse_keyword(Keyword::COLLATE) {
7129 Some(self.parse_identifier()?)
7130 } else {
7131 None
7132 };
7133 let default = if self.parse_keyword(Keyword::DEFAULT) {
7134 Some(self.parse_expr()?)
7135 } else {
7136 None
7137 };
7138 let mut constraints = Vec::new();
7139 while let Some(constraint) = self.parse_optional_table_constraint()? {
7140 constraints.push(constraint);
7141 }
7142
7143 Ok(CreateDomain {
7144 name,
7145 data_type,
7146 collation,
7147 default,
7148 constraints,
7149 })
7150 }
7151
7152 pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
7162 let name = self.parse_identifier()?;
7163 self.expect_keyword_is(Keyword::ON)?;
7164 let table_name = self.parse_object_name(false)?;
7165
7166 let policy_type = if self.parse_keyword(Keyword::AS) {
7167 let keyword =
7168 self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
7169 Some(match keyword {
7170 Keyword::PERMISSIVE => CreatePolicyType::Permissive,
7171 Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
7172 unexpected_keyword => return Err(ParserError::ParserError(
7173 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
7174 )),
7175 })
7176 } else {
7177 None
7178 };
7179
7180 let command = if self.parse_keyword(Keyword::FOR) {
7181 let keyword = self.expect_one_of_keywords(&[
7182 Keyword::ALL,
7183 Keyword::SELECT,
7184 Keyword::INSERT,
7185 Keyword::UPDATE,
7186 Keyword::DELETE,
7187 ])?;
7188 Some(match keyword {
7189 Keyword::ALL => CreatePolicyCommand::All,
7190 Keyword::SELECT => CreatePolicyCommand::Select,
7191 Keyword::INSERT => CreatePolicyCommand::Insert,
7192 Keyword::UPDATE => CreatePolicyCommand::Update,
7193 Keyword::DELETE => CreatePolicyCommand::Delete,
7194 unexpected_keyword => return Err(ParserError::ParserError(
7195 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7196 )),
7197 })
7198 } else {
7199 None
7200 };
7201
7202 let to = if self.parse_keyword(Keyword::TO) {
7203 Some(self.parse_comma_separated(|p| p.parse_owner())?)
7204 } else {
7205 None
7206 };
7207
7208 let using = if self.parse_keyword(Keyword::USING) {
7209 self.expect_token(&Token::LParen)?;
7210 let expr = self.parse_expr()?;
7211 self.expect_token(&Token::RParen)?;
7212 Some(expr)
7213 } else {
7214 None
7215 };
7216
7217 let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7218 self.expect_token(&Token::LParen)?;
7219 let expr = self.parse_expr()?;
7220 self.expect_token(&Token::RParen)?;
7221 Some(expr)
7222 } else {
7223 None
7224 };
7225
7226 Ok(CreatePolicy {
7227 name,
7228 table_name,
7229 policy_type,
7230 command,
7231 to,
7232 using,
7233 with_check,
7234 })
7235 }
7236
7237 pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7247 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7248 let name = self.parse_identifier()?;
7249
7250 let connector_type = if self.parse_keyword(Keyword::TYPE) {
7251 Some(self.parse_literal_string()?)
7252 } else {
7253 None
7254 };
7255
7256 let url = if self.parse_keyword(Keyword::URL) {
7257 Some(self.parse_literal_string()?)
7258 } else {
7259 None
7260 };
7261
7262 let comment = self.parse_optional_inline_comment()?;
7263
7264 let with_dcproperties =
7265 match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7266 properties if !properties.is_empty() => Some(properties),
7267 _ => None,
7268 };
7269
7270 Ok(CreateConnector {
7271 name,
7272 if_not_exists,
7273 connector_type,
7274 url,
7275 comment,
7276 with_dcproperties,
7277 })
7278 }
7279
7280 fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7286 let mut parts = vec![];
7287 loop {
7288 parts.push(ObjectNamePart::Identifier(Ident::new(
7289 self.next_token().to_string(),
7290 )));
7291 if !self.consume_token(&Token::Period) {
7292 break;
7293 }
7294 }
7295 Ok(ObjectName(parts))
7296 }
7297
7298 pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7302 let name = self.parse_operator_name()?;
7303 self.expect_token(&Token::LParen)?;
7304
7305 let mut function: Option<ObjectName> = None;
7306 let mut is_procedure = false;
7307 let mut left_arg: Option<DataType> = None;
7308 let mut right_arg: Option<DataType> = None;
7309 let mut options: Vec<OperatorOption> = Vec::new();
7310
7311 loop {
7312 let keyword = self.expect_one_of_keywords(&[
7313 Keyword::FUNCTION,
7314 Keyword::PROCEDURE,
7315 Keyword::LEFTARG,
7316 Keyword::RIGHTARG,
7317 Keyword::COMMUTATOR,
7318 Keyword::NEGATOR,
7319 Keyword::RESTRICT,
7320 Keyword::JOIN,
7321 Keyword::HASHES,
7322 Keyword::MERGES,
7323 ])?;
7324
7325 match keyword {
7326 Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7327 options.push(OperatorOption::Hashes);
7328 }
7329 Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7330 options.push(OperatorOption::Merges);
7331 }
7332 Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7333 self.expect_token(&Token::Eq)?;
7334 function = Some(self.parse_object_name(false)?);
7335 is_procedure = keyword == Keyword::PROCEDURE;
7336 }
7337 Keyword::LEFTARG if left_arg.is_none() => {
7338 self.expect_token(&Token::Eq)?;
7339 left_arg = Some(self.parse_data_type()?);
7340 }
7341 Keyword::RIGHTARG if right_arg.is_none() => {
7342 self.expect_token(&Token::Eq)?;
7343 right_arg = Some(self.parse_data_type()?);
7344 }
7345 Keyword::COMMUTATOR
7346 if !options
7347 .iter()
7348 .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7349 {
7350 self.expect_token(&Token::Eq)?;
7351 if self.parse_keyword(Keyword::OPERATOR) {
7352 self.expect_token(&Token::LParen)?;
7353 let op = self.parse_operator_name()?;
7354 self.expect_token(&Token::RParen)?;
7355 options.push(OperatorOption::Commutator(op));
7356 } else {
7357 options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7358 }
7359 }
7360 Keyword::NEGATOR
7361 if !options
7362 .iter()
7363 .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7364 {
7365 self.expect_token(&Token::Eq)?;
7366 if self.parse_keyword(Keyword::OPERATOR) {
7367 self.expect_token(&Token::LParen)?;
7368 let op = self.parse_operator_name()?;
7369 self.expect_token(&Token::RParen)?;
7370 options.push(OperatorOption::Negator(op));
7371 } else {
7372 options.push(OperatorOption::Negator(self.parse_operator_name()?));
7373 }
7374 }
7375 Keyword::RESTRICT
7376 if !options
7377 .iter()
7378 .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7379 {
7380 self.expect_token(&Token::Eq)?;
7381 options.push(OperatorOption::Restrict(Some(
7382 self.parse_object_name(false)?,
7383 )));
7384 }
7385 Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7386 self.expect_token(&Token::Eq)?;
7387 options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7388 }
7389 _ => {
7390 return Err(ParserError::ParserError(format!(
7391 "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7392 keyword
7393 )))
7394 }
7395 }
7396
7397 if !self.consume_token(&Token::Comma) {
7398 break;
7399 }
7400 }
7401
7402 self.expect_token(&Token::RParen)?;
7404
7405 let function = function.ok_or_else(|| {
7407 ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7408 })?;
7409
7410 Ok(CreateOperator {
7411 name,
7412 function,
7413 is_procedure,
7414 left_arg,
7415 right_arg,
7416 options,
7417 })
7418 }
7419
7420 pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7424 let name = self.parse_object_name(false)?;
7425 self.expect_keyword(Keyword::USING)?;
7426 let using = self.parse_identifier()?;
7427
7428 Ok(CreateOperatorFamily { name, using })
7429 }
7430
7431 pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7435 let name = self.parse_object_name(false)?;
7436 let default = self.parse_keyword(Keyword::DEFAULT);
7437 self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7438 let for_type = self.parse_data_type()?;
7439 self.expect_keyword(Keyword::USING)?;
7440 let using = self.parse_identifier()?;
7441
7442 let family = if self.parse_keyword(Keyword::FAMILY) {
7443 Some(self.parse_object_name(false)?)
7444 } else {
7445 None
7446 };
7447
7448 self.expect_keyword(Keyword::AS)?;
7449
7450 let mut items = vec![];
7451 loop {
7452 if self.parse_keyword(Keyword::OPERATOR) {
7453 let strategy_number = self.parse_literal_uint()?;
7454 let operator_name = self.parse_operator_name()?;
7455
7456 let op_types = if self.consume_token(&Token::LParen) {
7458 let left = self.parse_data_type()?;
7459 self.expect_token(&Token::Comma)?;
7460 let right = self.parse_data_type()?;
7461 self.expect_token(&Token::RParen)?;
7462 Some(OperatorArgTypes { left, right })
7463 } else {
7464 None
7465 };
7466
7467 let purpose = if self.parse_keyword(Keyword::FOR) {
7469 if self.parse_keyword(Keyword::SEARCH) {
7470 Some(OperatorPurpose::ForSearch)
7471 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7472 let sort_family = self.parse_object_name(false)?;
7473 Some(OperatorPurpose::ForOrderBy { sort_family })
7474 } else {
7475 return self
7476 .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7477 }
7478 } else {
7479 None
7480 };
7481
7482 items.push(OperatorClassItem::Operator {
7483 strategy_number,
7484 operator_name,
7485 op_types,
7486 purpose,
7487 });
7488 } else if self.parse_keyword(Keyword::FUNCTION) {
7489 let support_number = self.parse_literal_uint()?;
7490
7491 let op_types = if self.consume_token(&Token::LParen)
7493 && self.peek_token_ref().token != Token::RParen
7494 {
7495 let mut types = vec![];
7496 loop {
7497 types.push(self.parse_data_type()?);
7498 if !self.consume_token(&Token::Comma) {
7499 break;
7500 }
7501 }
7502 self.expect_token(&Token::RParen)?;
7503 Some(types)
7504 } else if self.consume_token(&Token::LParen) {
7505 self.expect_token(&Token::RParen)?;
7506 Some(vec![])
7507 } else {
7508 None
7509 };
7510
7511 let function_name = self.parse_object_name(false)?;
7512
7513 let argument_types = if self.consume_token(&Token::LParen) {
7515 let mut types = vec![];
7516 loop {
7517 if self.peek_token_ref().token == Token::RParen {
7518 break;
7519 }
7520 types.push(self.parse_data_type()?);
7521 if !self.consume_token(&Token::Comma) {
7522 break;
7523 }
7524 }
7525 self.expect_token(&Token::RParen)?;
7526 types
7527 } else {
7528 vec![]
7529 };
7530
7531 items.push(OperatorClassItem::Function {
7532 support_number,
7533 op_types,
7534 function_name,
7535 argument_types,
7536 });
7537 } else if self.parse_keyword(Keyword::STORAGE) {
7538 let storage_type = self.parse_data_type()?;
7539 items.push(OperatorClassItem::Storage { storage_type });
7540 } else {
7541 break;
7542 }
7543
7544 if !self.consume_token(&Token::Comma) {
7546 break;
7547 }
7548 }
7549
7550 Ok(CreateOperatorClass {
7551 name,
7552 default,
7553 for_type,
7554 using,
7555 family,
7556 items,
7557 })
7558 }
7559
7560 pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7562 let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7564 && self.parse_keyword(Keyword::TEMPORARY);
7565 let persistent = dialect_of!(self is DuckDbDialect)
7566 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7567
7568 let object_type = if self.parse_keyword(Keyword::TABLE) {
7569 ObjectType::Table
7570 } else if self.parse_keyword(Keyword::COLLATION) {
7571 ObjectType::Collation
7572 } else if self.parse_keyword(Keyword::VIEW) {
7573 ObjectType::View
7574 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7575 ObjectType::MaterializedView
7576 } else if self.parse_keyword(Keyword::INDEX) {
7577 ObjectType::Index
7578 } else if self.parse_keyword(Keyword::ROLE) {
7579 ObjectType::Role
7580 } else if self.parse_keyword(Keyword::SCHEMA) {
7581 ObjectType::Schema
7582 } else if self.parse_keyword(Keyword::DATABASE) {
7583 ObjectType::Database
7584 } else if self.parse_keyword(Keyword::SEQUENCE) {
7585 ObjectType::Sequence
7586 } else if self.parse_keyword(Keyword::STAGE) {
7587 ObjectType::Stage
7588 } else if self.parse_keyword(Keyword::TYPE) {
7589 ObjectType::Type
7590 } else if self.parse_keyword(Keyword::USER) {
7591 ObjectType::User
7592 } else if self.parse_keyword(Keyword::STREAM) {
7593 ObjectType::Stream
7594 } else if self.parse_keyword(Keyword::FUNCTION) {
7595 return self.parse_drop_function().map(Into::into);
7596 } else if self.parse_keyword(Keyword::POLICY) {
7597 return self.parse_drop_policy().map(Into::into);
7598 } else if self.parse_keyword(Keyword::CONNECTOR) {
7599 return self.parse_drop_connector();
7600 } else if self.parse_keyword(Keyword::DOMAIN) {
7601 return self.parse_drop_domain().map(Into::into);
7602 } else if self.parse_keyword(Keyword::PROCEDURE) {
7603 return self.parse_drop_procedure();
7604 } else if self.parse_keyword(Keyword::SECRET) {
7605 return self.parse_drop_secret(temporary, persistent);
7606 } else if self.parse_keyword(Keyword::TRIGGER) {
7607 return self.parse_drop_trigger().map(Into::into);
7608 } else if self.parse_keyword(Keyword::EXTENSION) {
7609 return self.parse_drop_extension();
7610 } else if self.parse_keyword(Keyword::OPERATOR) {
7611 return if self.parse_keyword(Keyword::FAMILY) {
7613 self.parse_drop_operator_family()
7614 } else if self.parse_keyword(Keyword::CLASS) {
7615 self.parse_drop_operator_class()
7616 } else {
7617 self.parse_drop_operator()
7618 };
7619 } else {
7620 return self.expected_ref(
7621 "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7622 self.peek_token_ref(),
7623 );
7624 };
7625 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7628 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7629
7630 let loc = self.peek_token_ref().span.start;
7631 let cascade = self.parse_keyword(Keyword::CASCADE);
7632 let restrict = self.parse_keyword(Keyword::RESTRICT);
7633 let purge = self.parse_keyword(Keyword::PURGE);
7634 if cascade && restrict {
7635 return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7636 }
7637 if object_type == ObjectType::Role && (cascade || restrict || purge) {
7638 return parser_err!(
7639 "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7640 loc
7641 );
7642 }
7643 let table = if self.parse_keyword(Keyword::ON) {
7644 Some(self.parse_object_name(false)?)
7645 } else {
7646 None
7647 };
7648 Ok(Statement::Drop {
7649 object_type,
7650 if_exists,
7651 names,
7652 cascade,
7653 restrict,
7654 purge,
7655 temporary,
7656 table,
7657 })
7658 }
7659
7660 fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7661 match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7662 Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7663 Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7664 _ => None,
7665 }
7666 }
7667
7668 fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7673 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7674 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7675 let drop_behavior = self.parse_optional_drop_behavior();
7676 Ok(DropFunction {
7677 if_exists,
7678 func_desc,
7679 drop_behavior,
7680 })
7681 }
7682
7683 fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7689 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7690 let name = self.parse_identifier()?;
7691 self.expect_keyword_is(Keyword::ON)?;
7692 let table_name = self.parse_object_name(false)?;
7693 let drop_behavior = self.parse_optional_drop_behavior();
7694 Ok(DropPolicy {
7695 if_exists,
7696 name,
7697 table_name,
7698 drop_behavior,
7699 })
7700 }
7701 fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7707 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7708 let name = self.parse_identifier()?;
7709 Ok(Statement::DropConnector { if_exists, name })
7710 }
7711
7712 fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7716 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7717 let name = self.parse_object_name(false)?;
7718 let drop_behavior = self.parse_optional_drop_behavior();
7719 Ok(DropDomain {
7720 if_exists,
7721 name,
7722 drop_behavior,
7723 })
7724 }
7725
7726 fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7731 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7732 let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7733 let drop_behavior = self.parse_optional_drop_behavior();
7734 Ok(Statement::DropProcedure {
7735 if_exists,
7736 proc_desc,
7737 drop_behavior,
7738 })
7739 }
7740
7741 fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7742 let name = self.parse_object_name(false)?;
7743
7744 let args = if self.consume_token(&Token::LParen) {
7745 if self.consume_token(&Token::RParen) {
7746 Some(vec![])
7747 } else {
7748 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7749 self.expect_token(&Token::RParen)?;
7750 Some(args)
7751 }
7752 } else {
7753 None
7754 };
7755
7756 Ok(FunctionDesc { name, args })
7757 }
7758
7759 fn parse_drop_secret(
7761 &mut self,
7762 temporary: bool,
7763 persistent: bool,
7764 ) -> Result<Statement, ParserError> {
7765 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7766 let name = self.parse_identifier()?;
7767 let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7768 self.parse_identifier().ok()
7769 } else {
7770 None
7771 };
7772 let temp = match (temporary, persistent) {
7773 (true, false) => Some(true),
7774 (false, true) => Some(false),
7775 (false, false) => None,
7776 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7777 };
7778
7779 Ok(Statement::DropSecret {
7780 if_exists,
7781 temporary: temp,
7782 name,
7783 storage_specifier,
7784 })
7785 }
7786
7787 pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7797 if dialect_of!(self is BigQueryDialect) {
7798 return self.parse_big_query_declare();
7799 }
7800 if dialect_of!(self is SnowflakeDialect) {
7801 return self.parse_snowflake_declare();
7802 }
7803 if dialect_of!(self is MsSqlDialect) {
7804 return self.parse_mssql_declare();
7805 }
7806
7807 let name = self.parse_identifier()?;
7808
7809 let binary = Some(self.parse_keyword(Keyword::BINARY));
7810 let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7811 Some(true)
7812 } else if self.parse_keyword(Keyword::ASENSITIVE) {
7813 Some(false)
7814 } else {
7815 None
7816 };
7817 let scroll = if self.parse_keyword(Keyword::SCROLL) {
7818 Some(true)
7819 } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7820 Some(false)
7821 } else {
7822 None
7823 };
7824
7825 self.expect_keyword_is(Keyword::CURSOR)?;
7826 let declare_type = Some(DeclareType::Cursor);
7827
7828 let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7829 Some(keyword) => {
7830 self.expect_keyword_is(Keyword::HOLD)?;
7831
7832 match keyword {
7833 Keyword::WITH => Some(true),
7834 Keyword::WITHOUT => Some(false),
7835 unexpected_keyword => return Err(ParserError::ParserError(
7836 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7837 )),
7838 }
7839 }
7840 None => None,
7841 };
7842
7843 self.expect_keyword_is(Keyword::FOR)?;
7844
7845 let query = Some(self.parse_query()?);
7846
7847 Ok(Statement::Declare {
7848 stmts: vec![Declare {
7849 names: vec![name],
7850 data_type: None,
7851 assignment: None,
7852 declare_type,
7853 binary,
7854 sensitive,
7855 scroll,
7856 hold,
7857 for_query: query,
7858 }],
7859 })
7860 }
7861
7862 pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7870 let names = self.parse_comma_separated(Parser::parse_identifier)?;
7871
7872 let data_type = match &self.peek_token_ref().token {
7873 Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7874 _ => Some(self.parse_data_type()?),
7875 };
7876
7877 let expr = if data_type.is_some() {
7878 if self.parse_keyword(Keyword::DEFAULT) {
7879 Some(self.parse_expr()?)
7880 } else {
7881 None
7882 }
7883 } else {
7884 self.expect_keyword_is(Keyword::DEFAULT)?;
7887 Some(self.parse_expr()?)
7888 };
7889
7890 Ok(Statement::Declare {
7891 stmts: vec![Declare {
7892 names,
7893 data_type,
7894 assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7895 declare_type: None,
7896 binary: None,
7897 sensitive: None,
7898 scroll: None,
7899 hold: None,
7900 for_query: None,
7901 }],
7902 })
7903 }
7904
7905 pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7930 let mut stmts = vec![];
7931 loop {
7932 let name = self.parse_identifier()?;
7933 let (declare_type, for_query, assigned_expr, data_type) =
7934 if self.parse_keyword(Keyword::CURSOR) {
7935 self.expect_keyword_is(Keyword::FOR)?;
7936 match &self.peek_token_ref().token {
7937 Token::Word(w) if w.keyword == Keyword::SELECT => (
7938 Some(DeclareType::Cursor),
7939 Some(self.parse_query()?),
7940 None,
7941 None,
7942 ),
7943 _ => (
7944 Some(DeclareType::Cursor),
7945 None,
7946 Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7947 None,
7948 ),
7949 }
7950 } else if self.parse_keyword(Keyword::RESULTSET) {
7951 let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7952 self.parse_snowflake_variable_declaration_expression()?
7953 } else {
7954 None
7956 };
7957
7958 (Some(DeclareType::ResultSet), None, assigned_expr, None)
7959 } else if self.parse_keyword(Keyword::EXCEPTION) {
7960 let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7961 Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7962 } else {
7963 None
7965 };
7966
7967 (Some(DeclareType::Exception), None, assigned_expr, None)
7968 } else {
7969 let (assigned_expr, data_type) = if let Some(assigned_expr) =
7971 self.parse_snowflake_variable_declaration_expression()?
7972 {
7973 (Some(assigned_expr), None)
7974 } else if let Token::Word(_) = &self.peek_token_ref().token {
7975 let data_type = self.parse_data_type()?;
7976 (
7977 self.parse_snowflake_variable_declaration_expression()?,
7978 Some(data_type),
7979 )
7980 } else {
7981 (None, None)
7982 };
7983 (None, None, assigned_expr, data_type)
7984 };
7985 let stmt = Declare {
7986 names: vec![name],
7987 data_type,
7988 assignment: assigned_expr,
7989 declare_type,
7990 binary: None,
7991 sensitive: None,
7992 scroll: None,
7993 hold: None,
7994 for_query,
7995 };
7996
7997 stmts.push(stmt);
7998 if self.consume_token(&Token::SemiColon) {
7999 match &self.peek_token_ref().token {
8000 Token::Word(w)
8001 if ALL_KEYWORDS
8002 .binary_search(&w.value.to_uppercase().as_str())
8003 .is_err() =>
8004 {
8005 continue;
8007 }
8008 _ => {
8009 self.prev_token();
8011 }
8012 }
8013 }
8014
8015 break;
8016 }
8017
8018 Ok(Statement::Declare { stmts })
8019 }
8020
8021 pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
8033 let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
8034
8035 Ok(Statement::Declare { stmts })
8036 }
8037
8038 pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
8049 let name = {
8050 let ident = self.parse_identifier()?;
8051 if !ident.value.starts_with('@')
8052 && !matches!(
8053 &self.peek_token_ref().token,
8054 Token::Word(w) if w.keyword == Keyword::CURSOR
8055 )
8056 {
8057 Err(ParserError::TokenizerError(
8058 "Invalid MsSql variable declaration.".to_string(),
8059 ))
8060 } else {
8061 Ok(ident)
8062 }
8063 }?;
8064
8065 let (declare_type, data_type) = match &self.peek_token_ref().token {
8066 Token::Word(w) => match w.keyword {
8067 Keyword::CURSOR => {
8068 self.next_token();
8069 (Some(DeclareType::Cursor), None)
8070 }
8071 Keyword::AS => {
8072 self.next_token();
8073 (None, Some(self.parse_data_type()?))
8074 }
8075 _ => (None, Some(self.parse_data_type()?)),
8076 },
8077 _ => (None, Some(self.parse_data_type()?)),
8078 };
8079
8080 let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
8081 self.next_token();
8082 let query = Some(self.parse_query()?);
8083 (query, None)
8084 } else {
8085 let assignment = self.parse_mssql_variable_declaration_expression()?;
8086 (None, assignment)
8087 };
8088
8089 Ok(Declare {
8090 names: vec![name],
8091 data_type,
8092 assignment,
8093 declare_type,
8094 binary: None,
8095 sensitive: None,
8096 scroll: None,
8097 hold: None,
8098 for_query,
8099 })
8100 }
8101
8102 pub fn parse_snowflake_variable_declaration_expression(
8110 &mut self,
8111 ) -> Result<Option<DeclareAssignment>, ParserError> {
8112 Ok(match &self.peek_token_ref().token {
8113 Token::Word(w) if w.keyword == Keyword::DEFAULT => {
8114 self.next_token(); Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
8116 }
8117 Token::Assignment => {
8118 self.next_token(); Some(DeclareAssignment::DuckAssignment(Box::new(
8120 self.parse_expr()?,
8121 )))
8122 }
8123 _ => None,
8124 })
8125 }
8126
8127 pub fn parse_mssql_variable_declaration_expression(
8134 &mut self,
8135 ) -> Result<Option<DeclareAssignment>, ParserError> {
8136 Ok(match &self.peek_token_ref().token {
8137 Token::Eq => {
8138 self.next_token(); Some(DeclareAssignment::MsSqlAssignment(Box::new(
8140 self.parse_expr()?,
8141 )))
8142 }
8143 _ => None,
8144 })
8145 }
8146
8147 pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
8149 let direction = if self.parse_keyword(Keyword::NEXT) {
8150 FetchDirection::Next
8151 } else if self.parse_keyword(Keyword::PRIOR) {
8152 FetchDirection::Prior
8153 } else if self.parse_keyword(Keyword::FIRST) {
8154 FetchDirection::First
8155 } else if self.parse_keyword(Keyword::LAST) {
8156 FetchDirection::Last
8157 } else if self.parse_keyword(Keyword::ABSOLUTE) {
8158 FetchDirection::Absolute {
8159 limit: self.parse_number_value()?,
8160 }
8161 } else if self.parse_keyword(Keyword::RELATIVE) {
8162 FetchDirection::Relative {
8163 limit: self.parse_number_value()?,
8164 }
8165 } else if self.parse_keyword(Keyword::FORWARD) {
8166 if self.parse_keyword(Keyword::ALL) {
8167 FetchDirection::ForwardAll
8168 } else {
8169 FetchDirection::Forward {
8170 limit: Some(self.parse_number_value()?),
8172 }
8173 }
8174 } else if self.parse_keyword(Keyword::BACKWARD) {
8175 if self.parse_keyword(Keyword::ALL) {
8176 FetchDirection::BackwardAll
8177 } else {
8178 FetchDirection::Backward {
8179 limit: Some(self.parse_number_value()?),
8181 }
8182 }
8183 } else if self.parse_keyword(Keyword::ALL) {
8184 FetchDirection::All
8185 } else {
8186 FetchDirection::Count {
8187 limit: self.parse_number_value()?,
8188 }
8189 };
8190
8191 let position = if self.peek_keyword(Keyword::FROM) {
8192 self.expect_keyword(Keyword::FROM)?;
8193 FetchPosition::From
8194 } else if self.peek_keyword(Keyword::IN) {
8195 self.expect_keyword(Keyword::IN)?;
8196 FetchPosition::In
8197 } else {
8198 return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8199 };
8200
8201 let name = self.parse_identifier()?;
8202
8203 let into = if self.parse_keyword(Keyword::INTO) {
8204 Some(self.parse_object_name(false)?)
8205 } else {
8206 None
8207 };
8208
8209 Ok(Statement::Fetch {
8210 name,
8211 direction,
8212 position,
8213 into,
8214 })
8215 }
8216
8217 pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8219 let object_type = if self.parse_keyword(Keyword::ALL) {
8220 DiscardObject::ALL
8221 } else if self.parse_keyword(Keyword::PLANS) {
8222 DiscardObject::PLANS
8223 } else if self.parse_keyword(Keyword::SEQUENCES) {
8224 DiscardObject::SEQUENCES
8225 } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8226 DiscardObject::TEMP
8227 } else {
8228 return self.expected_ref(
8229 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8230 self.peek_token_ref(),
8231 );
8232 };
8233 Ok(Statement::Discard { object_type })
8234 }
8235
8236 pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8238 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8239 let r#async = self.parse_keyword(Keyword::ASYNC);
8240 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8241
8242 let mut using = None;
8243
8244 let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8245 let index_name = self.parse_object_name(false)?;
8246 using = self.parse_optional_using_then_index_type()?;
8248 self.expect_keyword_is(Keyword::ON)?;
8249 Some(index_name)
8250 } else {
8251 None
8252 };
8253
8254 let table_name = self.parse_object_name(false)?;
8255
8256 using = self.parse_optional_using_then_index_type()?.or(using);
8259
8260 let columns = self.parse_parenthesized_index_column_list()?;
8261
8262 let include = if self.parse_keyword(Keyword::INCLUDE) {
8263 self.expect_token(&Token::LParen)?;
8264 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8265 self.expect_token(&Token::RParen)?;
8266 columns
8267 } else {
8268 vec![]
8269 };
8270
8271 let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8272 let not = self.parse_keyword(Keyword::NOT);
8273 self.expect_keyword_is(Keyword::DISTINCT)?;
8274 Some(!not)
8275 } else {
8276 None
8277 };
8278
8279 let with = if self.dialect.supports_create_index_with_clause()
8280 && self.parse_keyword(Keyword::WITH)
8281 {
8282 self.expect_token(&Token::LParen)?;
8283 let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8284 self.expect_token(&Token::RParen)?;
8285 with_params
8286 } else {
8287 Vec::new()
8288 };
8289
8290 let predicate = if self.parse_keyword(Keyword::WHERE) {
8291 Some(self.parse_expr()?)
8292 } else {
8293 None
8294 };
8295
8296 let index_options = self.parse_index_options()?;
8302
8303 let mut alter_options = Vec::new();
8305 while self
8306 .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8307 .is_some()
8308 {
8309 alter_options.push(self.parse_alter_table_operation()?)
8310 }
8311
8312 Ok(CreateIndex {
8313 name: index_name,
8314 table_name,
8315 using,
8316 columns,
8317 unique,
8318 concurrently,
8319 r#async,
8320 if_not_exists,
8321 include,
8322 nulls_distinct,
8323 with,
8324 predicate,
8325 index_options,
8326 alter_options,
8327 fulltext_or_spatial: None,
8328 })
8329 }
8330
8331 pub fn parse_create_fulltext_or_spatial_index(
8345 &mut self,
8346 kind: FullTextOrSpatialKind,
8347 ) -> Result<CreateIndex, ParserError> {
8348 let index_name = if self.parse_keyword(Keyword::ON) {
8350 None
8351 } else {
8352 let name = self.parse_object_name(false)?;
8353 self.expect_keyword_is(Keyword::ON)?;
8354 Some(name)
8355 };
8356
8357 let table_name = self.parse_object_name(false)?;
8358
8359 let using = self.parse_optional_using_then_index_type()?;
8361
8362 let columns = self.parse_parenthesized_index_column_list()?;
8363
8364 let index_options = self.parse_index_options()?;
8366
8367 let mut alter_options = Vec::new();
8369 while self
8370 .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8371 .is_some()
8372 {
8373 alter_options.push(self.parse_alter_table_operation()?)
8374 }
8375
8376 Ok(CreateIndex {
8377 name: index_name,
8378 table_name,
8379 using,
8380 columns,
8381 unique: false,
8382 concurrently: false,
8383 r#async: false,
8384 if_not_exists: false,
8385 include: vec![],
8386 nulls_distinct: None,
8387 with: vec![],
8388 predicate: None,
8389 index_options,
8390 alter_options,
8391 fulltext_or_spatial: Some(kind),
8392 })
8393 }
8394
8395 pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8397 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8398 let name = self.parse_identifier()?;
8399
8400 let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8401 let schema = if self.parse_keyword(Keyword::SCHEMA) {
8402 Some(self.parse_identifier()?)
8403 } else {
8404 None
8405 };
8406
8407 let version = if self.parse_keyword(Keyword::VERSION) {
8408 Some(self.parse_identifier()?)
8409 } else {
8410 None
8411 };
8412
8413 let cascade = self.parse_keyword(Keyword::CASCADE);
8414
8415 (schema, version, cascade)
8416 } else {
8417 (None, None, false)
8418 };
8419
8420 Ok(CreateExtension {
8421 name,
8422 if_not_exists,
8423 schema,
8424 version,
8425 cascade,
8426 })
8427 }
8428
8429 pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8431 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8432 let name = self.parse_object_name(false)?;
8433
8434 let definition = if self.parse_keyword(Keyword::FROM) {
8435 CreateCollationDefinition::From(self.parse_object_name(false)?)
8436 } else if self.consume_token(&Token::LParen) {
8437 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8438 self.expect_token(&Token::RParen)?;
8439 CreateCollationDefinition::Options(options)
8440 } else {
8441 return self.expected_ref(
8442 "FROM or parenthesized option list after CREATE COLLATION name",
8443 self.peek_token_ref(),
8444 );
8445 };
8446
8447 Ok(CreateCollation {
8448 if_not_exists,
8449 name,
8450 definition,
8451 })
8452 }
8453
8454 pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8456 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8457 let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8458 let cascade_or_restrict =
8459 self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8460 Ok(Statement::DropExtension(DropExtension {
8461 names,
8462 if_exists,
8463 cascade_or_restrict: cascade_or_restrict
8464 .map(|k| match k {
8465 Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8466 Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8467 _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8468 })
8469 .transpose()?,
8470 }))
8471 }
8472
8473 pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8476 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8477 let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8478 let drop_behavior = self.parse_optional_drop_behavior();
8479 Ok(Statement::DropOperator(DropOperator {
8480 if_exists,
8481 operators,
8482 drop_behavior,
8483 }))
8484 }
8485
8486 fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8489 let name = self.parse_operator_name()?;
8490 self.expect_token(&Token::LParen)?;
8491
8492 let left_type = if self.parse_keyword(Keyword::NONE) {
8494 None
8495 } else {
8496 Some(self.parse_data_type()?)
8497 };
8498
8499 self.expect_token(&Token::Comma)?;
8500
8501 let right_type = self.parse_data_type()?;
8503
8504 self.expect_token(&Token::RParen)?;
8505
8506 Ok(DropOperatorSignature {
8507 name,
8508 left_type,
8509 right_type,
8510 })
8511 }
8512
8513 pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8517 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8518 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8519 self.expect_keyword(Keyword::USING)?;
8520 let using = self.parse_identifier()?;
8521 let drop_behavior = self.parse_optional_drop_behavior();
8522 Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8523 if_exists,
8524 names,
8525 using,
8526 drop_behavior,
8527 }))
8528 }
8529
8530 pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8534 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8535 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8536 self.expect_keyword(Keyword::USING)?;
8537 let using = self.parse_identifier()?;
8538 let drop_behavior = self.parse_optional_drop_behavior();
8539 Ok(Statement::DropOperatorClass(DropOperatorClass {
8540 if_exists,
8541 names,
8542 using,
8543 drop_behavior,
8544 }))
8545 }
8546
8547 pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8551 if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8552 self.expect_token(&Token::LParen)?;
8553 let columns =
8554 self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8555 self.expect_token(&Token::RParen)?;
8556 Ok(HiveDistributionStyle::PARTITIONED { columns })
8557 } else {
8558 Ok(HiveDistributionStyle::NONE)
8559 }
8560 }
8561
8562 fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8566 let token = self.next_token();
8567 match &token.token {
8568 Token::Word(w) => match w.keyword {
8569 Keyword::AUTO => Ok(DistStyle::Auto),
8570 Keyword::EVEN => Ok(DistStyle::Even),
8571 Keyword::KEY => Ok(DistStyle::Key),
8572 Keyword::ALL => Ok(DistStyle::All),
8573 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8574 },
8575 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8576 }
8577 }
8578
8579 pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8581 let mut hive_format: Option<HiveFormat> = None;
8582 loop {
8583 match self.parse_one_of_keywords(&[
8584 Keyword::ROW,
8585 Keyword::STORED,
8586 Keyword::LOCATION,
8587 Keyword::WITH,
8588 Keyword::USING,
8589 ]) {
8590 Some(Keyword::ROW) => {
8591 hive_format
8592 .get_or_insert_with(HiveFormat::default)
8593 .row_format = Some(self.parse_row_format()?);
8594 }
8595 Some(Keyword::STORED) => {
8596 self.expect_keyword_is(Keyword::AS)?;
8597 if self.parse_keyword(Keyword::INPUTFORMAT) {
8598 let input_format = self.parse_expr()?;
8599 self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8600 let output_format = self.parse_expr()?;
8601 hive_format.get_or_insert_with(HiveFormat::default).storage =
8602 Some(HiveIOFormat::IOF {
8603 input_format,
8604 output_format,
8605 });
8606 } else {
8607 let format = self.parse_file_format()?;
8608 hive_format.get_or_insert_with(HiveFormat::default).storage =
8609 Some(HiveIOFormat::FileFormat { format });
8610 }
8611 }
8612 Some(Keyword::LOCATION) => {
8613 hive_format.get_or_insert_with(HiveFormat::default).location =
8614 Some(self.parse_literal_string()?);
8615 }
8616 Some(Keyword::WITH) => {
8617 self.prev_token();
8618 let properties = self
8619 .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8620 if !properties.is_empty() {
8621 hive_format
8622 .get_or_insert_with(HiveFormat::default)
8623 .serde_properties = Some(properties);
8624 } else {
8625 break;
8626 }
8627 }
8628 Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8629 let format = self.parse_identifier()?;
8630 hive_format.get_or_insert_with(HiveFormat::default).storage =
8631 Some(HiveIOFormat::Using { format });
8632 }
8633 Some(Keyword::USING) => {
8634 self.prev_token();
8636 break;
8637 }
8638 None => break,
8639 _ => break,
8640 }
8641 }
8642
8643 Ok(hive_format)
8644 }
8645
8646 pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8648 self.expect_keyword_is(Keyword::FORMAT)?;
8649 match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8650 Some(Keyword::SERDE) => {
8651 let class = self.parse_literal_string()?;
8652 Ok(HiveRowFormat::SERDE { class })
8653 }
8654 _ => {
8655 let mut row_delimiters = vec![];
8656
8657 loop {
8658 match self.parse_one_of_keywords(&[
8659 Keyword::FIELDS,
8660 Keyword::COLLECTION,
8661 Keyword::MAP,
8662 Keyword::LINES,
8663 Keyword::NULL,
8664 ]) {
8665 Some(Keyword::FIELDS)
8666 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8667 {
8668 row_delimiters.push(HiveRowDelimiter {
8669 delimiter: HiveDelimiter::FieldsTerminatedBy,
8670 char: self.parse_identifier()?,
8671 });
8672
8673 if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8674 row_delimiters.push(HiveRowDelimiter {
8675 delimiter: HiveDelimiter::FieldsEscapedBy,
8676 char: self.parse_identifier()?,
8677 });
8678 }
8679 }
8680 Some(Keyword::COLLECTION)
8681 if self.parse_keywords(&[
8682 Keyword::ITEMS,
8683 Keyword::TERMINATED,
8684 Keyword::BY,
8685 ]) =>
8686 {
8687 row_delimiters.push(HiveRowDelimiter {
8688 delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8689 char: self.parse_identifier()?,
8690 });
8691 }
8692 Some(Keyword::MAP)
8693 if self.parse_keywords(&[
8694 Keyword::KEYS,
8695 Keyword::TERMINATED,
8696 Keyword::BY,
8697 ]) =>
8698 {
8699 row_delimiters.push(HiveRowDelimiter {
8700 delimiter: HiveDelimiter::MapKeysTerminatedBy,
8701 char: self.parse_identifier()?,
8702 });
8703 }
8704 Some(Keyword::LINES)
8705 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8706 {
8707 row_delimiters.push(HiveRowDelimiter {
8708 delimiter: HiveDelimiter::LinesTerminatedBy,
8709 char: self.parse_identifier()?,
8710 });
8711 }
8712 Some(Keyword::NULL)
8713 if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8714 {
8715 row_delimiters.push(HiveRowDelimiter {
8716 delimiter: HiveDelimiter::NullDefinedAs,
8717 char: self.parse_identifier()?,
8718 });
8719 }
8720 _ => {
8721 break;
8722 }
8723 }
8724 }
8725
8726 Ok(HiveRowFormat::DELIMITED {
8727 delimiters: row_delimiters,
8728 })
8729 }
8730 }
8731 }
8732
8733 fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8734 if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8735 Ok(Some(self.parse_identifier()?))
8736 } else {
8737 Ok(None)
8738 }
8739 }
8740
8741 #[allow(clippy::too_many_arguments)]
8743 pub fn parse_create_table(
8744 &mut self,
8745 or_replace: bool,
8746 temporary: bool,
8747 unlogged: bool,
8748 global: Option<bool>,
8749 transient: bool,
8750 volatile: bool,
8751 multiset: Option<bool>,
8752 ) -> Result<CreateTable, ParserError> {
8753 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8754 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8755 let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8756
8757 let fallback = if self.dialect.supports_leading_comma_before_table_options()
8758 && self.consume_token(&Token::Comma)
8759 {
8760 let fallback = self.maybe_parse_fallback()?;
8761 if fallback.is_none() {
8762 self.prev_token(); }
8764 fallback
8765 } else {
8766 None
8767 };
8768
8769 let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8780 Some(self.parse_object_name(allow_unquoted_hyphen)?)
8781 } else {
8782 None
8783 };
8784
8785 let on_cluster = self.parse_optional_on_cluster()?;
8787
8788 let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8789
8790 let clone = if self.parse_keyword(Keyword::CLONE) {
8791 self.parse_object_name(allow_unquoted_hyphen).ok()
8792 } else {
8793 None
8794 };
8795
8796 let (columns, constraints) = self.parse_columns()?;
8798 let comment_after_column_def =
8799 if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8800 let next_token = self.next_token();
8801 match next_token.token {
8802 Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8803 _ => self.expected("comment", next_token)?,
8804 }
8805 } else {
8806 None
8807 };
8808
8809 let for_values = if partition_of.is_some() {
8811 if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8812 Some(self.parse_partition_for_values()?)
8813 } else {
8814 return self.expected_ref(
8815 "FOR VALUES or DEFAULT after PARTITION OF",
8816 self.peek_token_ref(),
8817 );
8818 }
8819 } else {
8820 None
8821 };
8822
8823 let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8825
8826 let hive_distribution = self.parse_hive_distribution()?;
8827 let clustered_by = self.parse_optional_clustered_by()?;
8828 let hive_formats = self.parse_hive_formats()?;
8829
8830 let create_table_config = self.parse_optional_create_table_config()?;
8831
8832 let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8835 && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8836 {
8837 Some(Box::new(self.parse_expr()?))
8838 } else {
8839 None
8840 };
8841
8842 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8843 if self.consume_token(&Token::LParen) {
8844 let columns = if self.peek_token_ref().token != Token::RParen {
8845 self.parse_comma_separated(|p| p.parse_expr())?
8846 } else {
8847 vec![]
8848 };
8849 self.expect_token(&Token::RParen)?;
8850 Some(OneOrManyWithParens::Many(columns))
8851 } else {
8852 Some(OneOrManyWithParens::One(self.parse_expr()?))
8853 }
8854 } else {
8855 None
8856 };
8857
8858 let partition_by = if create_table_config.partition_by.is_none()
8861 && self.dialect.supports_partition_by_after_order_by()
8862 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8863 {
8864 Some(Box::new(self.parse_expr()?))
8865 } else {
8866 create_table_config.partition_by
8867 };
8868
8869 let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8870 Some(self.parse_create_table_on_commit()?)
8871 } else {
8872 None
8873 };
8874
8875 let strict = self.parse_keyword(Keyword::STRICT);
8876
8877 let backup = if self.parse_keyword(Keyword::BACKUP) {
8879 let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8880 Some(keyword == Keyword::YES)
8881 } else {
8882 None
8883 };
8884
8885 let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8887 Some(self.parse_dist_style()?)
8888 } else {
8889 None
8890 };
8891 let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8892 self.expect_token(&Token::LParen)?;
8893 let expr = self.parse_expr()?;
8894 self.expect_token(&Token::RParen)?;
8895 Some(expr)
8896 } else {
8897 None
8898 };
8899 let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8900 self.expect_token(&Token::LParen)?;
8901 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8902 self.expect_token(&Token::RParen)?;
8903 Some(columns)
8904 } else {
8905 None
8906 };
8907
8908 let query = if self.parse_keyword(Keyword::AS) {
8910 Some(self.parse_query()?)
8911 } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8912 {
8913 self.prev_token();
8915 Some(self.parse_query()?)
8916 } else {
8917 None
8918 };
8919
8920 let with_data = if query.is_some() {
8922 self.maybe_parse_with_data()?
8923 } else {
8924 None
8925 };
8926
8927 Ok(CreateTableBuilder::new(table_name)
8928 .temporary(temporary)
8929 .unlogged(unlogged)
8930 .columns(columns)
8931 .constraints(constraints)
8932 .or_replace(or_replace)
8933 .if_not_exists(if_not_exists)
8934 .transient(transient)
8935 .volatile(volatile)
8936 .multiset(multiset)
8937 .fallback(fallback)
8938 .hive_distribution(hive_distribution)
8939 .hive_formats(hive_formats)
8940 .global(global)
8941 .query(query)
8942 .without_rowid(without_rowid)
8943 .like(like)
8944 .clone_clause(clone)
8945 .comment_after_column_def(comment_after_column_def)
8946 .order_by(order_by)
8947 .on_commit(on_commit)
8948 .on_cluster(on_cluster)
8949 .clustered_by(clustered_by)
8950 .partition_by(partition_by)
8951 .cluster_by(create_table_config.cluster_by)
8952 .inherits(create_table_config.inherits)
8953 .partition_of(partition_of)
8954 .for_values(for_values)
8955 .table_options(create_table_config.table_options)
8956 .primary_key(primary_key)
8957 .with_data(with_data)
8958 .strict(strict)
8959 .backup(backup)
8960 .diststyle(diststyle)
8961 .distkey(distkey)
8962 .sortkey(sortkey)
8963 .build())
8964 }
8965
8966 fn maybe_parse_multiset(&mut self) -> Option<bool> {
8968 match self.parse_one_of_keywords(&[Keyword::SET, Keyword::MULTISET]) {
8969 Some(Keyword::MULTISET) => Some(true),
8970 Some(Keyword::SET) => Some(false),
8971 _ => None,
8972 }
8973 }
8974
8975 fn maybe_parse_fallback(&mut self) -> Result<Option<bool>, ParserError> {
8977 if self.parse_keywords(&[Keyword::NO, Keyword::FALLBACK]) {
8978 Ok(Some(false))
8979 } else if self.parse_keyword(Keyword::FALLBACK) {
8980 Ok(Some(true))
8981 } else {
8982 Ok(None)
8983 }
8984 }
8985
8986 fn maybe_parse_with_data(&mut self) -> Result<Option<WithData>, ParserError> {
8988 let data = if self.parse_keywords(&[Keyword::WITH, Keyword::DATA]) {
8989 true
8990 } else if self.parse_keywords(&[Keyword::WITH, Keyword::NO, Keyword::DATA]) {
8991 false
8992 } else {
8993 return Ok(None);
8994 };
8995
8996 let statistics = if self.parse_keywords(&[Keyword::AND, Keyword::STATISTICS]) {
8997 Some(true)
8998 } else if self.parse_keywords(&[Keyword::AND, Keyword::NO, Keyword::STATISTICS]) {
8999 Some(false)
9000 } else {
9001 None
9002 };
9003
9004 Ok(Some(WithData { data, statistics }))
9005 }
9006
9007 fn maybe_parse_create_table_like(
9008 &mut self,
9009 allow_unquoted_hyphen: bool,
9010 ) -> Result<Option<CreateTableLikeKind>, ParserError> {
9011 let like = if self.dialect.supports_create_table_like_parenthesized()
9012 && self.consume_token(&Token::LParen)
9013 {
9014 if self.parse_keyword(Keyword::LIKE) {
9015 let name = self.parse_object_name(allow_unquoted_hyphen)?;
9016 let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
9017 Some(CreateTableLikeDefaults::Including)
9018 } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
9019 Some(CreateTableLikeDefaults::Excluding)
9020 } else {
9021 None
9022 };
9023 self.expect_token(&Token::RParen)?;
9024 Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
9025 name,
9026 defaults,
9027 }))
9028 } else {
9029 self.prev_token();
9031 None
9032 }
9033 } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
9034 let name = self.parse_object_name(allow_unquoted_hyphen)?;
9035 Some(CreateTableLikeKind::Plain(CreateTableLike {
9036 name,
9037 defaults: None,
9038 }))
9039 } else {
9040 None
9041 };
9042 Ok(like)
9043 }
9044
9045 pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
9046 if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
9047 Ok(OnCommit::DeleteRows)
9048 } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
9049 Ok(OnCommit::PreserveRows)
9050 } else if self.parse_keywords(&[Keyword::DROP]) {
9051 Ok(OnCommit::Drop)
9052 } else {
9053 parser_err!(
9054 "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
9055 self.peek_token_ref()
9056 )
9057 }
9058 }
9059
9060 fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
9066 if self.parse_keyword(Keyword::DEFAULT) {
9067 return Ok(ForValues::Default);
9068 }
9069
9070 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
9071
9072 if self.parse_keyword(Keyword::IN) {
9073 self.expect_token(&Token::LParen)?;
9075 if self.peek_token_ref().token == Token::RParen {
9076 return self.expected_ref("at least one value", self.peek_token_ref());
9077 }
9078 let values = self.parse_comma_separated(Parser::parse_expr)?;
9079 self.expect_token(&Token::RParen)?;
9080 Ok(ForValues::In(values))
9081 } else if self.parse_keyword(Keyword::FROM) {
9082 self.expect_token(&Token::LParen)?;
9084 if self.peek_token_ref().token == Token::RParen {
9085 return self.expected_ref("at least one value", self.peek_token_ref());
9086 }
9087 let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9088 self.expect_token(&Token::RParen)?;
9089 self.expect_keyword(Keyword::TO)?;
9090 self.expect_token(&Token::LParen)?;
9091 if self.peek_token_ref().token == Token::RParen {
9092 return self.expected_ref("at least one value", self.peek_token_ref());
9093 }
9094 let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9095 self.expect_token(&Token::RParen)?;
9096 Ok(ForValues::From { from, to })
9097 } else if self.parse_keyword(Keyword::WITH) {
9098 self.expect_token(&Token::LParen)?;
9100 self.expect_keyword(Keyword::MODULUS)?;
9101 let modulus = self.parse_literal_uint()?;
9102 self.expect_token(&Token::Comma)?;
9103 self.expect_keyword(Keyword::REMAINDER)?;
9104 let remainder = self.parse_literal_uint()?;
9105 self.expect_token(&Token::RParen)?;
9106 Ok(ForValues::With { modulus, remainder })
9107 } else {
9108 self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
9109 }
9110 }
9111
9112 fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
9114 if self.parse_keyword(Keyword::MINVALUE) {
9115 Ok(PartitionBoundValue::MinValue)
9116 } else if self.parse_keyword(Keyword::MAXVALUE) {
9117 Ok(PartitionBoundValue::MaxValue)
9118 } else {
9119 Ok(PartitionBoundValue::Expr(self.parse_expr()?))
9120 }
9121 }
9122
9123 fn parse_optional_create_table_config(
9129 &mut self,
9130 ) -> Result<CreateTableConfiguration, ParserError> {
9131 let mut table_options = CreateTableOptions::None;
9132
9133 let inherits = if self.parse_keyword(Keyword::INHERITS) {
9134 Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
9135 } else {
9136 None
9137 };
9138
9139 let with_options = self.parse_options(Keyword::WITH)?;
9141 if !with_options.is_empty() {
9142 table_options = CreateTableOptions::With(with_options)
9143 }
9144
9145 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
9146 if !table_properties.is_empty() {
9147 table_options = CreateTableOptions::TableProperties(table_properties);
9148 }
9149 let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
9150 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
9151 {
9152 Some(Box::new(self.parse_expr()?))
9153 } else {
9154 None
9155 };
9156
9157 let mut cluster_by = None;
9158 if dialect_of!(self is BigQueryDialect | GenericDialect) {
9159 if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
9160 cluster_by = Some(WrappedCollection::NoWrapping(
9161 self.parse_comma_separated(|p| p.parse_expr())?,
9162 ));
9163 };
9164
9165 if let Token::Word(word) = &self.peek_token_ref().token {
9166 if word.keyword == Keyword::OPTIONS {
9167 table_options =
9168 CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
9169 }
9170 };
9171 }
9172
9173 if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
9174 let plain_options = self.parse_plain_options()?;
9175 if !plain_options.is_empty() {
9176 table_options = CreateTableOptions::Plain(plain_options)
9177 }
9178 };
9179
9180 Ok(CreateTableConfiguration {
9181 partition_by,
9182 cluster_by,
9183 inherits,
9184 table_options,
9185 })
9186 }
9187
9188 fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
9189 if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
9192 return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
9193 }
9194
9195 if self.parse_keywords(&[Keyword::COMMENT]) {
9198 let has_eq = self.consume_token(&Token::Eq);
9199 let value = self.next_token();
9200
9201 let comment = match (has_eq, value.token) {
9202 (true, Token::SingleQuotedString(s)) => {
9203 Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
9204 }
9205 (false, Token::SingleQuotedString(s)) => {
9206 Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
9207 }
9208 (_, token) => {
9209 self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
9210 }
9211 };
9212 return comment;
9213 }
9214
9215 if self.parse_keywords(&[Keyword::ENGINE]) {
9218 let _ = self.consume_token(&Token::Eq);
9219 let value = self.next_token();
9220
9221 let engine = match value.token {
9222 Token::Word(w) => {
9223 let parameters = if self.peek_token_ref().token == Token::LParen {
9224 self.parse_parenthesized_identifiers()?
9225 } else {
9226 vec![]
9227 };
9228
9229 Ok(Some(SqlOption::NamedParenthesizedList(
9230 NamedParenthesizedList {
9231 key: Ident::new("ENGINE"),
9232 name: Some(Ident::new(w.value)),
9233 values: parameters,
9234 },
9235 )))
9236 }
9237 _ => {
9238 return self.expected("Token::Word", value)?;
9239 }
9240 };
9241
9242 return engine;
9243 }
9244
9245 if self.parse_keywords(&[Keyword::TABLESPACE]) {
9247 let _ = self.consume_token(&Token::Eq);
9248 let value = self.next_token();
9249
9250 let tablespace = match value.token {
9251 Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
9252 let storage = match self.parse_keyword(Keyword::STORAGE) {
9253 true => {
9254 let _ = self.consume_token(&Token::Eq);
9255 let storage_token = self.next_token();
9256 match &storage_token.token {
9257 Token::Word(w) => match w.value.to_uppercase().as_str() {
9258 "DISK" => Some(StorageType::Disk),
9259 "MEMORY" => Some(StorageType::Memory),
9260 _ => self
9261 .expected("Storage type (DISK or MEMORY)", storage_token)?,
9262 },
9263 _ => self.expected("Token::Word", storage_token)?,
9264 }
9265 }
9266 false => None,
9267 };
9268
9269 Ok(Some(SqlOption::TableSpace(TablespaceOption {
9270 name,
9271 storage,
9272 })))
9273 }
9274 _ => {
9275 return self.expected("Token::Word", value)?;
9276 }
9277 };
9278
9279 return tablespace;
9280 }
9281
9282 if self.parse_keyword(Keyword::UNION) {
9284 let _ = self.consume_token(&Token::Eq);
9285 let value = self.next_token();
9286
9287 match value.token {
9288 Token::LParen => {
9289 let tables: Vec<Ident> =
9290 self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9291 self.expect_token(&Token::RParen)?;
9292
9293 return Ok(Some(SqlOption::NamedParenthesizedList(
9294 NamedParenthesizedList {
9295 key: Ident::new("UNION"),
9296 name: None,
9297 values: tables,
9298 },
9299 )));
9300 }
9301 _ => {
9302 return self.expected("Token::LParen", value)?;
9303 }
9304 }
9305 }
9306
9307 let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9309 Ident::new("DEFAULT CHARSET")
9310 } else if self.parse_keyword(Keyword::CHARSET) {
9311 Ident::new("CHARSET")
9312 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9313 Ident::new("DEFAULT CHARACTER SET")
9314 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9315 Ident::new("CHARACTER SET")
9316 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9317 Ident::new("DEFAULT COLLATE")
9318 } else if self.parse_keyword(Keyword::COLLATE) {
9319 Ident::new("COLLATE")
9320 } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9321 Ident::new("DATA DIRECTORY")
9322 } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9323 Ident::new("INDEX DIRECTORY")
9324 } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9325 Ident::new("KEY_BLOCK_SIZE")
9326 } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9327 Ident::new("ROW_FORMAT")
9328 } else if self.parse_keyword(Keyword::PACK_KEYS) {
9329 Ident::new("PACK_KEYS")
9330 } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9331 Ident::new("STATS_AUTO_RECALC")
9332 } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9333 Ident::new("STATS_PERSISTENT")
9334 } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9335 Ident::new("STATS_SAMPLE_PAGES")
9336 } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9337 Ident::new("DELAY_KEY_WRITE")
9338 } else if self.parse_keyword(Keyword::COMPRESSION) {
9339 Ident::new("COMPRESSION")
9340 } else if self.parse_keyword(Keyword::ENCRYPTION) {
9341 Ident::new("ENCRYPTION")
9342 } else if self.parse_keyword(Keyword::MAX_ROWS) {
9343 Ident::new("MAX_ROWS")
9344 } else if self.parse_keyword(Keyword::MIN_ROWS) {
9345 Ident::new("MIN_ROWS")
9346 } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9347 Ident::new("AUTOEXTEND_SIZE")
9348 } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9349 Ident::new("AVG_ROW_LENGTH")
9350 } else if self.parse_keyword(Keyword::CHECKSUM) {
9351 Ident::new("CHECKSUM")
9352 } else if self.parse_keyword(Keyword::CONNECTION) {
9353 Ident::new("CONNECTION")
9354 } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9355 Ident::new("ENGINE_ATTRIBUTE")
9356 } else if self.parse_keyword(Keyword::PASSWORD) {
9357 Ident::new("PASSWORD")
9358 } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9359 Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9360 } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9361 Ident::new("INSERT_METHOD")
9362 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9363 Ident::new("AUTO_INCREMENT")
9364 } else {
9365 return Ok(None);
9366 };
9367
9368 let _ = self.consume_token(&Token::Eq);
9369
9370 let value = match self
9371 .maybe_parse(|parser| parser.parse_value())?
9372 .map(Expr::Value)
9373 {
9374 Some(expr) => expr,
9375 None => Expr::Identifier(self.parse_identifier()?),
9376 };
9377
9378 Ok(Some(SqlOption::KeyValue { key, value }))
9379 }
9380
9381 pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9383 let mut options = Vec::new();
9384
9385 while let Some(option) = self.parse_plain_option()? {
9386 options.push(option);
9387 let _ = self.consume_token(&Token::Comma);
9390 }
9391
9392 Ok(options)
9393 }
9394
9395 pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9397 let comment = if self.parse_keyword(Keyword::COMMENT) {
9398 let has_eq = self.consume_token(&Token::Eq);
9399 let comment = self.parse_comment_value()?;
9400 Some(if has_eq {
9401 CommentDef::WithEq(comment)
9402 } else {
9403 CommentDef::WithoutEq(comment)
9404 })
9405 } else {
9406 None
9407 };
9408 Ok(comment)
9409 }
9410
9411 pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9413 let next_token = self.next_token();
9414 let value = match next_token.token {
9415 Token::SingleQuotedString(str) => str,
9416 Token::DollarQuotedString(str) => str.value,
9417 _ => self.expected("string literal", next_token)?,
9418 };
9419 Ok(value)
9420 }
9421
9422 pub fn parse_optional_procedure_parameters(
9424 &mut self,
9425 ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9426 let mut params = vec![];
9427 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9428 return Ok(Some(params));
9429 }
9430 loop {
9431 if let Token::Word(_) = &self.peek_token_ref().token {
9432 params.push(self.parse_procedure_param()?)
9433 }
9434 let comma = self.consume_token(&Token::Comma);
9435 if self.consume_token(&Token::RParen) {
9436 break;
9438 } else if !comma {
9439 return self.expected_ref(
9440 "',' or ')' after parameter definition",
9441 self.peek_token_ref(),
9442 );
9443 }
9444 }
9445 Ok(Some(params))
9446 }
9447
9448 pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9450 let mut columns = vec![];
9451 let mut constraints = vec![];
9452 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9453 return Ok((columns, constraints));
9454 }
9455
9456 loop {
9457 if let Some(constraint) = self.parse_optional_table_constraint()? {
9458 constraints.push(constraint);
9459 } else if let Token::Word(_) = &self.peek_token_ref().token {
9460 columns.push(self.parse_column_def()?);
9461 } else {
9462 return self.expected_ref(
9463 "column name or constraint definition",
9464 self.peek_token_ref(),
9465 );
9466 }
9467
9468 let comma = self.consume_token(&Token::Comma);
9469 let rparen = self.peek_token_ref().token == Token::RParen;
9470
9471 if !comma && !rparen {
9472 return self
9473 .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9474 };
9475
9476 if rparen
9477 && (!comma
9478 || self.dialect.supports_column_definition_trailing_commas()
9479 || self.options.trailing_commas)
9480 {
9481 let _ = self.consume_token(&Token::RParen);
9482 break;
9483 }
9484 }
9485
9486 Ok((columns, constraints))
9487 }
9488
9489 pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9491 let mode = if self.parse_keyword(Keyword::IN) {
9492 Some(ArgMode::In)
9493 } else if self.parse_keyword(Keyword::OUT) {
9494 Some(ArgMode::Out)
9495 } else if self.parse_keyword(Keyword::INOUT) {
9496 Some(ArgMode::InOut)
9497 } else {
9498 None
9499 };
9500 let name = self.parse_identifier()?;
9501 let data_type = self.parse_data_type()?;
9502 let default = if self.consume_token(&Token::Eq) {
9503 Some(self.parse_expr()?)
9504 } else {
9505 None
9506 };
9507
9508 Ok(ProcedureParam {
9509 name,
9510 data_type,
9511 mode,
9512 default,
9513 })
9514 }
9515
9516 pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9518 self.parse_column_def_inner(false)
9519 }
9520
9521 fn parse_column_def_inner(
9522 &mut self,
9523 optional_data_type: bool,
9524 ) -> Result<ColumnDef, ParserError> {
9525 let col_name = self.parse_identifier()?;
9526 let data_type = if self.is_column_type_sqlite_unspecified() {
9527 DataType::Unspecified
9528 } else if optional_data_type {
9529 self.maybe_parse(|parser| parser.parse_data_type())?
9530 .unwrap_or(DataType::Unspecified)
9531 } else {
9532 self.parse_data_type()?
9533 };
9534 let mut options = vec![];
9535 loop {
9536 if self.parse_keyword(Keyword::CONSTRAINT) {
9537 let name = Some(self.parse_identifier()?);
9538 if let Some(option) = self.parse_optional_column_option()? {
9539 options.push(ColumnOptionDef { name, option });
9540 } else {
9541 return self.expected_ref(
9542 "constraint details after CONSTRAINT <name>",
9543 self.peek_token_ref(),
9544 );
9545 }
9546 } else if let Some(option) = self.parse_optional_column_option()? {
9547 options.push(ColumnOptionDef { name: None, option });
9548 } else {
9549 break;
9550 };
9551 }
9552 Ok(ColumnDef {
9553 name: col_name,
9554 data_type,
9555 options,
9556 })
9557 }
9558
9559 fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9560 if dialect_of!(self is SQLiteDialect) {
9561 match &self.peek_token_ref().token {
9562 Token::Word(word) => matches!(
9563 word.keyword,
9564 Keyword::CONSTRAINT
9565 | Keyword::PRIMARY
9566 | Keyword::NOT
9567 | Keyword::UNIQUE
9568 | Keyword::CHECK
9569 | Keyword::DEFAULT
9570 | Keyword::COLLATE
9571 | Keyword::REFERENCES
9572 | Keyword::GENERATED
9573 | Keyword::AS
9574 ),
9575 _ => true, }
9577 } else {
9578 false
9579 }
9580 }
9581
9582 pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9584 if let Some(option) = self.dialect.parse_column_option(self)? {
9585 return option;
9586 }
9587
9588 self.with_state(
9589 ColumnDefinition,
9590 |parser| -> Result<Option<ColumnOption>, ParserError> {
9591 parser.parse_optional_column_option_inner()
9592 },
9593 )
9594 }
9595
9596 fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9597 if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9598 Ok(Some(ColumnOption::CharacterSet(
9599 self.parse_object_name(false)?,
9600 )))
9601 } else if self.parse_keywords(&[Keyword::COLLATE]) {
9602 Ok(Some(ColumnOption::Collation(
9603 self.parse_object_name(false)?,
9604 )))
9605 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9606 Ok(Some(ColumnOption::NotNull))
9607 } else if self.parse_keywords(&[Keyword::COMMENT]) {
9608 Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9609 } else if self.parse_keyword(Keyword::NULL) {
9610 Ok(Some(ColumnOption::Null))
9611 } else if self.parse_keyword(Keyword::DEFAULT) {
9612 Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9613 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9614 && self.parse_keyword(Keyword::MATERIALIZED)
9615 {
9616 Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9617 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9618 && self.parse_keyword(Keyword::ALIAS)
9619 {
9620 Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9621 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9622 && self.parse_keyword(Keyword::EPHEMERAL)
9623 {
9624 if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9627 Ok(Some(ColumnOption::Ephemeral(None)))
9628 } else {
9629 Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9630 }
9631 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9632 let characteristics = self.parse_constraint_characteristics()?;
9633 Ok(Some(
9634 PrimaryKeyConstraint {
9635 name: None,
9636 index_name: None,
9637 index_type: None,
9638 columns: vec![],
9639 index_options: vec![],
9640 characteristics,
9641 }
9642 .into(),
9643 ))
9644 } else if self.parse_keyword(Keyword::UNIQUE) {
9645 let index_type_display =
9646 if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9647 KeyOrIndexDisplay::Key
9648 } else {
9649 KeyOrIndexDisplay::None
9650 };
9651 let characteristics = self.parse_constraint_characteristics()?;
9652 Ok(Some(
9653 UniqueConstraint {
9654 name: None,
9655 index_name: None,
9656 index_type_display,
9657 index_type: None,
9658 columns: vec![],
9659 index_options: vec![],
9660 characteristics,
9661 nulls_distinct: NullsDistinctOption::None,
9662 }
9663 .into(),
9664 ))
9665 } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9666 let characteristics = self.parse_constraint_characteristics()?;
9669 Ok(Some(
9670 PrimaryKeyConstraint {
9671 name: None,
9672 index_name: None,
9673 index_type: None,
9674 columns: vec![],
9675 index_options: vec![],
9676 characteristics,
9677 }
9678 .into(),
9679 ))
9680 } else if self.parse_keyword(Keyword::REFERENCES) {
9681 let foreign_table = self.parse_object_name(false)?;
9682 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9685 let mut match_kind = None;
9686 let mut on_delete = None;
9687 let mut on_update = None;
9688 loop {
9689 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9690 match_kind = Some(self.parse_match_kind()?);
9691 } else if on_delete.is_none()
9692 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9693 {
9694 on_delete = Some(self.parse_referential_action()?);
9695 } else if on_update.is_none()
9696 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9697 {
9698 on_update = Some(self.parse_referential_action()?);
9699 } else {
9700 break;
9701 }
9702 }
9703 let characteristics = self.parse_constraint_characteristics()?;
9704
9705 Ok(Some(
9706 ForeignKeyConstraint {
9707 name: None, index_name: None, columns: vec![], foreign_table,
9711 referred_columns,
9712 on_delete,
9713 on_update,
9714 match_kind,
9715 characteristics,
9716 }
9717 .into(),
9718 ))
9719 } else if self.parse_keyword(Keyword::CHECK) {
9720 self.expect_token(&Token::LParen)?;
9721 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9723 self.expect_token(&Token::RParen)?;
9724
9725 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9726 Some(true)
9727 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9728 Some(false)
9729 } else {
9730 None
9731 };
9732
9733 Ok(Some(
9734 CheckConstraint {
9735 name: None, expr: Box::new(expr),
9737 enforced,
9738 }
9739 .into(),
9740 ))
9741 } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9742 && dialect_of!(self is MySqlDialect | GenericDialect)
9743 {
9744 Ok(Some(ColumnOption::DialectSpecific(vec![
9746 Token::make_keyword("AUTO_INCREMENT"),
9747 ])))
9748 } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9749 && dialect_of!(self is SQLiteDialect | GenericDialect)
9750 {
9751 Ok(Some(ColumnOption::DialectSpecific(vec![
9753 Token::make_keyword("AUTOINCREMENT"),
9754 ])))
9755 } else if self.parse_keyword(Keyword::ASC)
9756 && self.dialect.supports_asc_desc_in_column_definition()
9757 {
9758 Ok(Some(ColumnOption::DialectSpecific(vec![
9760 Token::make_keyword("ASC"),
9761 ])))
9762 } else if self.parse_keyword(Keyword::DESC)
9763 && self.dialect.supports_asc_desc_in_column_definition()
9764 {
9765 Ok(Some(ColumnOption::DialectSpecific(vec![
9767 Token::make_keyword("DESC"),
9768 ])))
9769 } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9770 && dialect_of!(self is MySqlDialect | GenericDialect)
9771 {
9772 let expr = self.parse_expr()?;
9773 Ok(Some(ColumnOption::OnUpdate(expr)))
9774 } else if self.parse_keyword(Keyword::GENERATED) {
9775 self.parse_optional_column_option_generated()
9776 } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9777 && self.parse_keyword(Keyword::OPTIONS)
9778 {
9779 self.prev_token();
9780 Ok(Some(ColumnOption::Options(
9781 self.parse_options(Keyword::OPTIONS)?,
9782 )))
9783 } else if self.parse_keyword(Keyword::AS)
9784 && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9785 {
9786 self.parse_optional_column_option_as()
9787 } else if self.parse_keyword(Keyword::SRID)
9788 && dialect_of!(self is MySqlDialect | GenericDialect)
9789 {
9790 Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9791 } else if self.parse_keyword(Keyword::IDENTITY)
9792 && dialect_of!(self is MsSqlDialect | GenericDialect)
9793 {
9794 let parameters = if self.consume_token(&Token::LParen) {
9795 let seed = self.parse_number()?;
9796 self.expect_token(&Token::Comma)?;
9797 let increment = self.parse_number()?;
9798 self.expect_token(&Token::RParen)?;
9799
9800 Some(IdentityPropertyFormatKind::FunctionCall(
9801 IdentityParameters { seed, increment },
9802 ))
9803 } else {
9804 None
9805 };
9806 Ok(Some(ColumnOption::Identity(
9807 IdentityPropertyKind::Identity(IdentityProperty {
9808 parameters,
9809 order: None,
9810 }),
9811 )))
9812 } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9813 && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9814 {
9815 Ok(Some(ColumnOption::OnConflict(
9817 self.expect_one_of_keywords(&[
9818 Keyword::ROLLBACK,
9819 Keyword::ABORT,
9820 Keyword::FAIL,
9821 Keyword::IGNORE,
9822 Keyword::REPLACE,
9823 ])?,
9824 )))
9825 } else if self.parse_keyword(Keyword::INVISIBLE) {
9826 Ok(Some(ColumnOption::Invisible))
9827 } else {
9828 Ok(None)
9829 }
9830 }
9831
9832 pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9833 let name = self.parse_object_name(false)?;
9834 self.expect_token(&Token::Eq)?;
9835 let value = self.parse_literal_string()?;
9836
9837 Ok(Tag::new(name, value))
9838 }
9839
9840 fn parse_optional_column_option_generated(
9841 &mut self,
9842 ) -> Result<Option<ColumnOption>, ParserError> {
9843 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9844 let mut sequence_options = vec![];
9845 if self.expect_token(&Token::LParen).is_ok() {
9846 sequence_options = self.parse_create_sequence_options()?;
9847 self.expect_token(&Token::RParen)?;
9848 }
9849 Ok(Some(ColumnOption::Generated {
9850 generated_as: GeneratedAs::Always,
9851 sequence_options: Some(sequence_options),
9852 generation_expr: None,
9853 generation_expr_mode: None,
9854 generated_keyword: true,
9855 }))
9856 } else if self.parse_keywords(&[
9857 Keyword::BY,
9858 Keyword::DEFAULT,
9859 Keyword::AS,
9860 Keyword::IDENTITY,
9861 ]) {
9862 let mut sequence_options = vec![];
9863 if self.expect_token(&Token::LParen).is_ok() {
9864 sequence_options = self.parse_create_sequence_options()?;
9865 self.expect_token(&Token::RParen)?;
9866 }
9867 Ok(Some(ColumnOption::Generated {
9868 generated_as: GeneratedAs::ByDefault,
9869 sequence_options: Some(sequence_options),
9870 generation_expr: None,
9871 generation_expr_mode: None,
9872 generated_keyword: true,
9873 }))
9874 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9875 if self.expect_token(&Token::LParen).is_ok() {
9876 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9877 self.expect_token(&Token::RParen)?;
9878 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9879 Ok((
9880 GeneratedAs::ExpStored,
9881 Some(GeneratedExpressionMode::Stored),
9882 ))
9883 } else if dialect_of!(self is PostgreSqlDialect) {
9884 self.expected_ref("STORED", self.peek_token_ref())
9886 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9887 Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9888 } else {
9889 Ok((GeneratedAs::Always, None))
9890 }?;
9891
9892 Ok(Some(ColumnOption::Generated {
9893 generated_as: gen_as,
9894 sequence_options: None,
9895 generation_expr: Some(expr),
9896 generation_expr_mode: expr_mode,
9897 generated_keyword: true,
9898 }))
9899 } else {
9900 Ok(None)
9901 }
9902 } else {
9903 Ok(None)
9904 }
9905 }
9906
9907 fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9908 self.expect_token(&Token::LParen)?;
9910 let expr = self.parse_expr()?;
9911 self.expect_token(&Token::RParen)?;
9912
9913 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9914 (
9915 GeneratedAs::ExpStored,
9916 Some(GeneratedExpressionMode::Stored),
9917 )
9918 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9919 (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9920 } else {
9921 (GeneratedAs::Always, None)
9922 };
9923
9924 Ok(Some(ColumnOption::Generated {
9925 generated_as: gen_as,
9926 sequence_options: None,
9927 generation_expr: Some(expr),
9928 generation_expr_mode: expr_mode,
9929 generated_keyword: false,
9930 }))
9931 }
9932
9933 pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9935 let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9936 && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9937 {
9938 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9939
9940 let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9941 self.expect_token(&Token::LParen)?;
9942 let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9943 self.expect_token(&Token::RParen)?;
9944 Some(sorted_by_columns)
9945 } else {
9946 None
9947 };
9948
9949 self.expect_keyword_is(Keyword::INTO)?;
9950 let num_buckets = self.parse_number_value()?.value;
9951 self.expect_keyword_is(Keyword::BUCKETS)?;
9952 Some(ClusteredBy {
9953 columns,
9954 sorted_by,
9955 num_buckets,
9956 })
9957 } else {
9958 None
9959 };
9960 Ok(clustered_by)
9961 }
9962
9963 pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9967 if self.parse_keyword(Keyword::RESTRICT) {
9968 Ok(ReferentialAction::Restrict)
9969 } else if self.parse_keyword(Keyword::CASCADE) {
9970 Ok(ReferentialAction::Cascade)
9971 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9972 Ok(ReferentialAction::SetNull)
9973 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9974 Ok(ReferentialAction::NoAction)
9975 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9976 Ok(ReferentialAction::SetDefault)
9977 } else {
9978 self.expected_ref(
9979 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9980 self.peek_token_ref(),
9981 )
9982 }
9983 }
9984
9985 pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9987 if self.parse_keyword(Keyword::FULL) {
9988 Ok(ConstraintReferenceMatchKind::Full)
9989 } else if self.parse_keyword(Keyword::PARTIAL) {
9990 Ok(ConstraintReferenceMatchKind::Partial)
9991 } else if self.parse_keyword(Keyword::SIMPLE) {
9992 Ok(ConstraintReferenceMatchKind::Simple)
9993 } else {
9994 self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9995 }
9996 }
9997
9998 fn parse_constraint_using_index(
10001 &mut self,
10002 name: Option<Ident>,
10003 ) -> Result<ConstraintUsingIndex, ParserError> {
10004 let index_name = self.parse_identifier()?;
10005 let characteristics = self.parse_constraint_characteristics()?;
10006 Ok(ConstraintUsingIndex {
10007 name,
10008 index_name,
10009 characteristics,
10010 })
10011 }
10012
10013 pub fn parse_constraint_characteristics(
10015 &mut self,
10016 ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
10017 let mut cc = ConstraintCharacteristics::default();
10018
10019 loop {
10020 if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
10021 {
10022 cc.deferrable = Some(false);
10023 } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
10024 cc.deferrable = Some(true);
10025 } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
10026 if self.parse_keyword(Keyword::DEFERRED) {
10027 cc.initially = Some(DeferrableInitial::Deferred);
10028 } else if self.parse_keyword(Keyword::IMMEDIATE) {
10029 cc.initially = Some(DeferrableInitial::Immediate);
10030 } else {
10031 self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
10032 }
10033 } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
10034 cc.enforced = Some(true);
10035 } else if cc.enforced.is_none()
10036 && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
10037 {
10038 cc.enforced = Some(false);
10039 } else {
10040 break;
10041 }
10042 }
10043
10044 if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
10045 Ok(Some(cc))
10046 } else {
10047 Ok(None)
10048 }
10049 }
10050
10051 pub fn parse_optional_table_constraint(
10053 &mut self,
10054 ) -> Result<Option<TableConstraint>, ParserError> {
10055 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
10056 if self.dialect.supports_constraint_keyword_without_name()
10057 && self
10058 .peek_one_of_keywords(&[
10059 Keyword::CHECK,
10060 Keyword::PRIMARY,
10061 Keyword::UNIQUE,
10062 Keyword::FOREIGN,
10063 ])
10064 .is_some()
10065 {
10066 None
10067 } else {
10068 Some(self.parse_identifier()?)
10069 }
10070 } else {
10071 None
10072 };
10073
10074 let next_token = self.next_token();
10075 match next_token.token {
10076 Token::Word(w) if w.keyword == Keyword::UNIQUE => {
10077 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10080 return Ok(Some(TableConstraint::UniqueUsingIndex(
10081 self.parse_constraint_using_index(name)?,
10082 )));
10083 }
10084
10085 let index_type_display = self.parse_index_type_display();
10086 if !dialect_of!(self is GenericDialect | MySqlDialect)
10087 && !index_type_display.is_none()
10088 {
10089 return self.expected_ref(
10090 "`index_name` or `(column_name [, ...])`",
10091 self.peek_token_ref(),
10092 );
10093 }
10094
10095 let nulls_distinct = self.parse_optional_nulls_distinct()?;
10096
10097 let index_name = self.parse_optional_ident()?;
10099 let index_type = self.parse_optional_using_then_index_type()?;
10100
10101 let columns = self.parse_parenthesized_index_column_list()?;
10102 let index_options = self.parse_index_options()?;
10103 let characteristics = self.parse_constraint_characteristics()?;
10104 Ok(Some(
10105 UniqueConstraint {
10106 name,
10107 index_name,
10108 index_type_display,
10109 index_type,
10110 columns,
10111 index_options,
10112 characteristics,
10113 nulls_distinct,
10114 }
10115 .into(),
10116 ))
10117 }
10118 Token::Word(w) if w.keyword == Keyword::PRIMARY => {
10119 self.expect_keyword_is(Keyword::KEY)?;
10121
10122 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10125 return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
10126 self.parse_constraint_using_index(name)?,
10127 )));
10128 }
10129
10130 let index_name = self.parse_optional_ident()?;
10132 let index_type = self.parse_optional_using_then_index_type()?;
10133
10134 let columns = self.parse_parenthesized_index_column_list()?;
10135 let index_options = self.parse_index_options()?;
10136 let characteristics = self.parse_constraint_characteristics()?;
10137 Ok(Some(
10138 PrimaryKeyConstraint {
10139 name,
10140 index_name,
10141 index_type,
10142 columns,
10143 index_options,
10144 characteristics,
10145 }
10146 .into(),
10147 ))
10148 }
10149 Token::Word(w) if w.keyword == Keyword::FOREIGN => {
10150 self.expect_keyword_is(Keyword::KEY)?;
10151 let index_name = self.parse_optional_ident()?;
10152 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
10153 self.expect_keyword_is(Keyword::REFERENCES)?;
10154 let foreign_table = self.parse_object_name(false)?;
10155 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
10156 let mut match_kind = None;
10157 let mut on_delete = None;
10158 let mut on_update = None;
10159 loop {
10160 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
10161 match_kind = Some(self.parse_match_kind()?);
10162 } else if on_delete.is_none()
10163 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
10164 {
10165 on_delete = Some(self.parse_referential_action()?);
10166 } else if on_update.is_none()
10167 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
10168 {
10169 on_update = Some(self.parse_referential_action()?);
10170 } else {
10171 break;
10172 }
10173 }
10174
10175 let characteristics = self.parse_constraint_characteristics()?;
10176
10177 Ok(Some(
10178 ForeignKeyConstraint {
10179 name,
10180 index_name,
10181 columns,
10182 foreign_table,
10183 referred_columns,
10184 on_delete,
10185 on_update,
10186 match_kind,
10187 characteristics,
10188 }
10189 .into(),
10190 ))
10191 }
10192 Token::Word(w) if w.keyword == Keyword::CHECK => {
10193 self.expect_token(&Token::LParen)?;
10194 let expr = Box::new(self.parse_expr()?);
10195 self.expect_token(&Token::RParen)?;
10196
10197 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
10198 Some(true)
10199 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
10200 Some(false)
10201 } else {
10202 None
10203 };
10204
10205 Ok(Some(
10206 CheckConstraint {
10207 name,
10208 expr,
10209 enforced,
10210 }
10211 .into(),
10212 ))
10213 }
10214 Token::Word(w)
10215 if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
10216 && dialect_of!(self is GenericDialect | MySqlDialect)
10217 && name.is_none() =>
10218 {
10219 let display_as_key = w.keyword == Keyword::KEY;
10220
10221 let name = match &self.peek_token_ref().token {
10222 Token::Word(word) if word.keyword == Keyword::USING => None,
10223 _ => self.parse_optional_ident()?,
10224 };
10225
10226 let index_type = self.parse_optional_using_then_index_type()?;
10227 let columns = self.parse_parenthesized_index_column_list()?;
10228 let index_options = self.parse_index_options()?;
10229
10230 Ok(Some(
10231 IndexConstraint {
10232 display_as_key,
10233 name,
10234 index_type,
10235 columns,
10236 index_options,
10237 }
10238 .into(),
10239 ))
10240 }
10241 Token::Word(w)
10242 if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
10243 && dialect_of!(self is GenericDialect | MySqlDialect) =>
10244 {
10245 if let Some(name) = name {
10246 return self.expected(
10247 "FULLTEXT or SPATIAL option without constraint name",
10248 TokenWithSpan {
10249 token: Token::make_keyword(&name.to_string()),
10250 span: next_token.span,
10251 },
10252 );
10253 }
10254
10255 let fulltext = w.keyword == Keyword::FULLTEXT;
10256
10257 let index_type_display = self.parse_index_type_display();
10258
10259 let opt_index_name = self.parse_optional_ident()?;
10260
10261 let columns = self.parse_parenthesized_index_column_list()?;
10262
10263 Ok(Some(
10264 FullTextOrSpatialConstraint {
10265 fulltext,
10266 index_type_display,
10267 opt_index_name,
10268 columns,
10269 }
10270 .into(),
10271 ))
10272 }
10273 Token::Word(w)
10274 if w.keyword == Keyword::EXCLUDE && self.dialect.supports_exclude_constraint() =>
10275 {
10276 if name.is_some()
10281 || self.peek_keyword(Keyword::USING)
10282 || self.peek_token_ref().token == Token::LParen
10283 {
10284 Ok(Some(self.parse_exclude_constraint(name)?.into()))
10285 } else {
10286 self.prev_token();
10287 Ok(None)
10288 }
10289 }
10290 _ => {
10291 if name.is_some() {
10292 self.expected("PRIMARY, UNIQUE, FOREIGN, CHECK, or EXCLUDE", next_token)
10293 } else {
10294 self.prev_token();
10295 Ok(None)
10296 }
10297 }
10298 }
10299 }
10300
10301 fn parse_exclude_constraint(
10303 &mut self,
10304 name: Option<Ident>,
10305 ) -> Result<ExcludeConstraint, ParserError> {
10306 let index_method = if self.parse_keyword(Keyword::USING) {
10307 Some(self.parse_identifier()?)
10308 } else {
10309 None
10310 };
10311
10312 self.expect_token(&Token::LParen)?;
10313 let elements = self.parse_comma_separated(|p| p.parse_exclude_constraint_element())?;
10314 self.expect_token(&Token::RParen)?;
10315
10316 let include = if self.parse_keyword(Keyword::INCLUDE) {
10317 self.expect_token(&Token::LParen)?;
10318 let cols = self.parse_comma_separated(|p| p.parse_identifier())?;
10319 self.expect_token(&Token::RParen)?;
10320 cols
10321 } else {
10322 vec![]
10323 };
10324
10325 let where_clause = if self.parse_keyword(Keyword::WHERE) {
10326 self.expect_token(&Token::LParen)?;
10327 let predicate = self.parse_expr()?;
10328 self.expect_token(&Token::RParen)?;
10329 Some(Box::new(predicate))
10330 } else {
10331 None
10332 };
10333
10334 let characteristics = self.parse_constraint_characteristics()?;
10335
10336 Ok(ExcludeConstraint {
10337 name,
10338 index_method,
10339 elements,
10340 include,
10341 where_clause,
10342 characteristics,
10343 })
10344 }
10345
10346 fn parse_exclude_constraint_element(
10347 &mut self,
10348 ) -> Result<ExcludeConstraintElement, ParserError> {
10349 let column = self.parse_create_index_expr()?;
10350 self.expect_keyword_is(Keyword::WITH)?;
10351 let operator = self.parse_exclude_constraint_operator()?;
10352 Ok(ExcludeConstraintElement { column, operator })
10353 }
10354
10355 fn parse_exclude_constraint_operator(
10357 &mut self,
10358 ) -> Result<ExcludeConstraintOperator, ParserError> {
10359 if self.parse_keyword(Keyword::OPERATOR) {
10360 return Ok(ExcludeConstraintOperator::PGOperator(
10361 self.parse_pg_operator_ident_parts()?,
10362 ));
10363 }
10364
10365 let operator_token = self.next_token();
10366 Ok(ExcludeConstraintOperator::Token(
10367 operator_token.token.to_string(),
10368 ))
10369 }
10370
10371 fn parse_pg_operator_ident_parts(&mut self) -> Result<Vec<String>, ParserError> {
10376 self.expect_token(&Token::LParen)?;
10377 if self.peek_token_ref().token == Token::RParen {
10378 let token = self.next_token();
10379 return self.expected("operator name", token);
10380 }
10381 let mut idents = vec![];
10382 loop {
10383 self.advance_token();
10384 idents.push(self.get_current_token().to_string());
10385 if !self.consume_token(&Token::Period) {
10386 break;
10387 }
10388 }
10389 self.expect_token(&Token::RParen)?;
10390 Ok(idents)
10391 }
10392
10393 fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10394 Ok(if self.parse_keyword(Keyword::NULLS) {
10395 let not = self.parse_keyword(Keyword::NOT);
10396 self.expect_keyword_is(Keyword::DISTINCT)?;
10397 if not {
10398 NullsDistinctOption::NotDistinct
10399 } else {
10400 NullsDistinctOption::Distinct
10401 }
10402 } else {
10403 NullsDistinctOption::None
10404 })
10405 }
10406
10407 pub fn maybe_parse_options(
10409 &mut self,
10410 keyword: Keyword,
10411 ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10412 if let Token::Word(word) = &self.peek_token_ref().token {
10413 if word.keyword == keyword {
10414 return Ok(Some(self.parse_options(keyword)?));
10415 }
10416 };
10417 Ok(None)
10418 }
10419
10420 pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10422 if self.parse_keyword(keyword) {
10423 self.expect_token(&Token::LParen)?;
10424 let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10425 self.expect_token(&Token::RParen)?;
10426 Ok(options)
10427 } else {
10428 Ok(vec![])
10429 }
10430 }
10431
10432 pub fn parse_options_with_keywords(
10434 &mut self,
10435 keywords: &[Keyword],
10436 ) -> Result<Vec<SqlOption>, ParserError> {
10437 if self.parse_keywords(keywords) {
10438 self.expect_token(&Token::LParen)?;
10439 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10440 self.expect_token(&Token::RParen)?;
10441 Ok(options)
10442 } else {
10443 Ok(vec![])
10444 }
10445 }
10446
10447 pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10449 Ok(if self.parse_keyword(Keyword::BTREE) {
10450 IndexType::BTree
10451 } else if self.parse_keyword(Keyword::HASH) {
10452 IndexType::Hash
10453 } else if self.parse_keyword(Keyword::GIN) {
10454 IndexType::GIN
10455 } else if self.parse_keyword(Keyword::GIST) {
10456 IndexType::GiST
10457 } else if self.parse_keyword(Keyword::SPGIST) {
10458 IndexType::SPGiST
10459 } else if self.parse_keyword(Keyword::BRIN) {
10460 IndexType::BRIN
10461 } else if self.parse_keyword(Keyword::BLOOM) {
10462 IndexType::Bloom
10463 } else {
10464 IndexType::Custom(self.parse_identifier()?)
10465 })
10466 }
10467
10468 pub fn parse_optional_using_then_index_type(
10475 &mut self,
10476 ) -> Result<Option<IndexType>, ParserError> {
10477 if self.parse_keyword(Keyword::USING) {
10478 Ok(Some(self.parse_index_type()?))
10479 } else {
10480 Ok(None)
10481 }
10482 }
10483
10484 pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10488 self.maybe_parse(|parser| parser.parse_identifier())
10489 }
10490
10491 #[must_use]
10492 pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10494 if self.parse_keyword(Keyword::KEY) {
10495 KeyOrIndexDisplay::Key
10496 } else if self.parse_keyword(Keyword::INDEX) {
10497 KeyOrIndexDisplay::Index
10498 } else {
10499 KeyOrIndexDisplay::None
10500 }
10501 }
10502
10503 pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10505 if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10506 Ok(Some(IndexOption::Using(index_type)))
10507 } else if self.parse_keyword(Keyword::COMMENT) {
10508 let s = self.parse_literal_string()?;
10509 Ok(Some(IndexOption::Comment(s)))
10510 } else {
10511 Ok(None)
10512 }
10513 }
10514
10515 pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10517 let mut options = Vec::new();
10518
10519 loop {
10520 match self.parse_optional_index_option()? {
10521 Some(index_option) => options.push(index_option),
10522 None => return Ok(options),
10523 }
10524 }
10525 }
10526
10527 pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10529 let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10530
10531 match &self.peek_token_ref().token {
10532 Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10533 Ok(SqlOption::Ident(self.parse_identifier()?))
10534 }
10535 Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10536 self.parse_option_partition()
10537 }
10538 Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10539 self.parse_option_clustered()
10540 }
10541 _ => {
10542 let name = self.parse_identifier()?;
10543 self.expect_token(&Token::Eq)?;
10544 let value = self.parse_expr()?;
10545
10546 Ok(SqlOption::KeyValue { key: name, value })
10547 }
10548 }
10549 }
10550
10551 pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10553 if self.parse_keywords(&[
10554 Keyword::CLUSTERED,
10555 Keyword::COLUMNSTORE,
10556 Keyword::INDEX,
10557 Keyword::ORDER,
10558 ]) {
10559 Ok(SqlOption::Clustered(
10560 TableOptionsClustered::ColumnstoreIndexOrder(
10561 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10562 ),
10563 ))
10564 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10565 Ok(SqlOption::Clustered(
10566 TableOptionsClustered::ColumnstoreIndex,
10567 ))
10568 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10569 self.expect_token(&Token::LParen)?;
10570
10571 let columns = self.parse_comma_separated(|p| {
10572 let name = p.parse_identifier()?;
10573 let asc = p.parse_asc_desc();
10574
10575 Ok(ClusteredIndex { name, asc })
10576 })?;
10577
10578 self.expect_token(&Token::RParen)?;
10579
10580 Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10581 } else {
10582 Err(ParserError::ParserError(
10583 "invalid CLUSTERED sequence".to_string(),
10584 ))
10585 }
10586 }
10587
10588 pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10590 self.expect_keyword_is(Keyword::PARTITION)?;
10591 self.expect_token(&Token::LParen)?;
10592 let column_name = self.parse_identifier()?;
10593
10594 self.expect_keyword_is(Keyword::RANGE)?;
10595 let range_direction = if self.parse_keyword(Keyword::LEFT) {
10596 Some(PartitionRangeDirection::Left)
10597 } else if self.parse_keyword(Keyword::RIGHT) {
10598 Some(PartitionRangeDirection::Right)
10599 } else {
10600 None
10601 };
10602
10603 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10604 self.expect_token(&Token::LParen)?;
10605
10606 let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10607
10608 self.expect_token(&Token::RParen)?;
10609 self.expect_token(&Token::RParen)?;
10610
10611 Ok(SqlOption::Partition {
10612 column_name,
10613 range_direction,
10614 for_values,
10615 })
10616 }
10617
10618 pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10620 self.expect_token(&Token::LParen)?;
10621 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10622 self.expect_token(&Token::RParen)?;
10623 Ok(Partition::Partitions(partitions))
10624 }
10625
10626 pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10628 self.expect_token(&Token::LParen)?;
10629 self.expect_keyword_is(Keyword::SELECT)?;
10630 let projection = self.parse_projection()?;
10631 let group_by = self.parse_optional_group_by()?;
10632 let order_by = self.parse_optional_order_by()?;
10633 self.expect_token(&Token::RParen)?;
10634 Ok(ProjectionSelect {
10635 projection,
10636 group_by,
10637 order_by,
10638 })
10639 }
10640 pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10642 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10643 let name = self.parse_identifier()?;
10644 let query = self.parse_projection_select()?;
10645 Ok(AlterTableOperation::AddProjection {
10646 if_not_exists,
10647 name,
10648 select: query,
10649 })
10650 }
10651
10652 fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10656 self.expect_keyword_is(Keyword::ALTER)?;
10657 self.expect_keyword_is(Keyword::SORTKEY)?;
10658 self.expect_token(&Token::LParen)?;
10659 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10660 self.expect_token(&Token::RParen)?;
10661 Ok(AlterTableOperation::AlterSortKey { columns })
10662 }
10663
10664 pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10666 let operation = if self.parse_keyword(Keyword::ADD) {
10667 if let Some(constraint) = self.parse_optional_table_constraint()? {
10668 let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10669 AlterTableOperation::AddConstraint {
10670 constraint,
10671 not_valid,
10672 }
10673 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10674 && self.parse_keyword(Keyword::PROJECTION)
10675 {
10676 return self.parse_alter_table_add_projection();
10677 } else {
10678 let if_not_exists =
10679 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10680 let mut new_partitions = vec![];
10681 loop {
10682 if self.parse_keyword(Keyword::PARTITION) {
10683 new_partitions.push(self.parse_partition()?);
10684 } else {
10685 break;
10686 }
10687 }
10688 if !new_partitions.is_empty() {
10689 AlterTableOperation::AddPartitions {
10690 if_not_exists,
10691 new_partitions,
10692 }
10693 } else {
10694 let column_keyword = self.parse_keyword(Keyword::COLUMN);
10695
10696 let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10697 {
10698 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10699 || if_not_exists
10700 } else {
10701 false
10702 };
10703
10704 let column_def = self.parse_column_def()?;
10705
10706 let column_position = self.parse_column_position()?;
10707
10708 AlterTableOperation::AddColumn {
10709 column_keyword,
10710 if_not_exists,
10711 column_def,
10712 column_position,
10713 }
10714 }
10715 }
10716 } else if self.parse_keyword(Keyword::RENAME) {
10717 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10718 let old_name = self.parse_identifier()?;
10719 self.expect_keyword_is(Keyword::TO)?;
10720 let new_name = self.parse_identifier()?;
10721 AlterTableOperation::RenameConstraint { old_name, new_name }
10722 } else if self.parse_keyword(Keyword::TO) {
10723 let table_name = self.parse_object_name(false)?;
10724 AlterTableOperation::RenameTable {
10725 table_name: RenameTableNameKind::To(table_name),
10726 }
10727 } else if self.parse_keyword(Keyword::AS) {
10728 let table_name = self.parse_object_name(false)?;
10729 AlterTableOperation::RenameTable {
10730 table_name: RenameTableNameKind::As(table_name),
10731 }
10732 } else {
10733 let _ = self.parse_keyword(Keyword::COLUMN); let old_column_name = self.parse_identifier()?;
10735 self.expect_keyword_is(Keyword::TO)?;
10736 let new_column_name = self.parse_identifier()?;
10737 AlterTableOperation::RenameColumn {
10738 old_column_name,
10739 new_column_name,
10740 }
10741 }
10742 } else if self.parse_keyword(Keyword::DISABLE) {
10743 if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10744 AlterTableOperation::DisableRowLevelSecurity {}
10745 } else if self.parse_keyword(Keyword::RULE) {
10746 let name = self.parse_identifier()?;
10747 AlterTableOperation::DisableRule { name }
10748 } else if self.parse_keyword(Keyword::TRIGGER) {
10749 let name = self.parse_identifier()?;
10750 AlterTableOperation::DisableTrigger { name }
10751 } else {
10752 return self.expected_ref(
10753 "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10754 self.peek_token_ref(),
10755 );
10756 }
10757 } else if self.parse_keyword(Keyword::ENABLE) {
10758 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10759 let name = self.parse_identifier()?;
10760 AlterTableOperation::EnableAlwaysRule { name }
10761 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10762 let name = self.parse_identifier()?;
10763 AlterTableOperation::EnableAlwaysTrigger { name }
10764 } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10765 AlterTableOperation::EnableRowLevelSecurity {}
10766 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10767 let name = self.parse_identifier()?;
10768 AlterTableOperation::EnableReplicaRule { name }
10769 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10770 let name = self.parse_identifier()?;
10771 AlterTableOperation::EnableReplicaTrigger { name }
10772 } else if self.parse_keyword(Keyword::RULE) {
10773 let name = self.parse_identifier()?;
10774 AlterTableOperation::EnableRule { name }
10775 } else if self.parse_keyword(Keyword::TRIGGER) {
10776 let name = self.parse_identifier()?;
10777 AlterTableOperation::EnableTrigger { name }
10778 } else {
10779 return self.expected_ref(
10780 "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10781 self.peek_token_ref(),
10782 );
10783 }
10784 } else if self.parse_keywords(&[
10785 Keyword::FORCE,
10786 Keyword::ROW,
10787 Keyword::LEVEL,
10788 Keyword::SECURITY,
10789 ]) {
10790 AlterTableOperation::ForceRowLevelSecurity
10791 } else if self.parse_keywords(&[
10792 Keyword::NO,
10793 Keyword::FORCE,
10794 Keyword::ROW,
10795 Keyword::LEVEL,
10796 Keyword::SECURITY,
10797 ]) {
10798 AlterTableOperation::NoForceRowLevelSecurity
10799 } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10800 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10801 {
10802 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10803 let name = self.parse_identifier()?;
10804 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10805 Some(self.parse_identifier()?)
10806 } else {
10807 None
10808 };
10809 AlterTableOperation::ClearProjection {
10810 if_exists,
10811 name,
10812 partition,
10813 }
10814 } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10815 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10816 {
10817 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10818 let name = self.parse_identifier()?;
10819 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10820 Some(self.parse_identifier()?)
10821 } else {
10822 None
10823 };
10824 AlterTableOperation::MaterializeProjection {
10825 if_exists,
10826 name,
10827 partition,
10828 }
10829 } else if self.parse_keyword(Keyword::DROP) {
10830 if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10831 self.expect_token(&Token::LParen)?;
10832 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10833 self.expect_token(&Token::RParen)?;
10834 AlterTableOperation::DropPartitions {
10835 partitions,
10836 if_exists: true,
10837 }
10838 } else if self.parse_keyword(Keyword::PARTITION) {
10839 self.expect_token(&Token::LParen)?;
10840 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10841 self.expect_token(&Token::RParen)?;
10842 AlterTableOperation::DropPartitions {
10843 partitions,
10844 if_exists: false,
10845 }
10846 } else if self.parse_keyword(Keyword::CONSTRAINT) {
10847 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10848 let name = self.parse_identifier()?;
10849 let drop_behavior = self.parse_optional_drop_behavior();
10850 AlterTableOperation::DropConstraint {
10851 if_exists,
10852 name,
10853 drop_behavior,
10854 }
10855 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10856 let drop_behavior = self.parse_optional_drop_behavior();
10857 AlterTableOperation::DropPrimaryKey { drop_behavior }
10858 } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10859 let name = self.parse_identifier()?;
10860 let drop_behavior = self.parse_optional_drop_behavior();
10861 AlterTableOperation::DropForeignKey {
10862 name,
10863 drop_behavior,
10864 }
10865 } else if self.parse_keyword(Keyword::INDEX) {
10866 let name = self.parse_identifier()?;
10867 AlterTableOperation::DropIndex { name }
10868 } else if self.parse_keyword(Keyword::PROJECTION)
10869 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10870 {
10871 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10872 let name = self.parse_identifier()?;
10873 AlterTableOperation::DropProjection { if_exists, name }
10874 } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10875 AlterTableOperation::DropClusteringKey
10876 } else {
10877 let has_column_keyword = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10879 let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10880 self.parse_comma_separated(Parser::parse_identifier)?
10881 } else {
10882 vec![self.parse_identifier()?]
10883 };
10884 let drop_behavior = self.parse_optional_drop_behavior();
10885 AlterTableOperation::DropColumn {
10886 has_column_keyword,
10887 column_names,
10888 if_exists,
10889 drop_behavior,
10890 }
10891 }
10892 } else if self.parse_keyword(Keyword::PARTITION) {
10893 self.expect_token(&Token::LParen)?;
10894 let before = self.parse_comma_separated(Parser::parse_expr)?;
10895 self.expect_token(&Token::RParen)?;
10896 self.expect_keyword_is(Keyword::RENAME)?;
10897 self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10898 self.expect_token(&Token::LParen)?;
10899 let renames = self.parse_comma_separated(Parser::parse_expr)?;
10900 self.expect_token(&Token::RParen)?;
10901 AlterTableOperation::RenamePartitions {
10902 old_partitions: before,
10903 new_partitions: renames,
10904 }
10905 } else if self.parse_keyword(Keyword::CHANGE) {
10906 let _ = self.parse_keyword(Keyword::COLUMN); let old_name = self.parse_identifier()?;
10908 let new_name = self.parse_identifier()?;
10909 let data_type = self.parse_data_type()?;
10910 let mut options = vec![];
10911 while let Some(option) = self.parse_optional_column_option()? {
10912 options.push(option);
10913 }
10914
10915 let column_position = self.parse_column_position()?;
10916
10917 AlterTableOperation::ChangeColumn {
10918 old_name,
10919 new_name,
10920 data_type,
10921 options,
10922 column_position,
10923 }
10924 } else if self.parse_keyword(Keyword::MODIFY) {
10925 let _ = self.parse_keyword(Keyword::COLUMN); let col_name = self.parse_identifier()?;
10927 let data_type = self.parse_data_type()?;
10928 let mut options = vec![];
10929 while let Some(option) = self.parse_optional_column_option()? {
10930 options.push(option);
10931 }
10932
10933 let column_position = self.parse_column_position()?;
10934
10935 AlterTableOperation::ModifyColumn {
10936 col_name,
10937 data_type,
10938 options,
10939 column_position,
10940 }
10941 } else if self.parse_keyword(Keyword::ALTER) {
10942 if self.peek_keyword(Keyword::SORTKEY) {
10943 self.prev_token();
10944 return self.parse_alter_sort_key();
10945 }
10946
10947 let _ = self.parse_keyword(Keyword::COLUMN); let column_name = self.parse_identifier()?;
10949 let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10950
10951 let op: AlterColumnOperation = if self.parse_keywords(&[
10952 Keyword::SET,
10953 Keyword::NOT,
10954 Keyword::NULL,
10955 ]) {
10956 AlterColumnOperation::SetNotNull {}
10957 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10958 AlterColumnOperation::DropNotNull {}
10959 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10960 AlterColumnOperation::SetDefault {
10961 value: self.parse_expr()?,
10962 }
10963 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10964 AlterColumnOperation::DropDefault {}
10965 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10966 self.parse_set_data_type(true)?
10967 } else if self.parse_keyword(Keyword::TYPE) {
10968 self.parse_set_data_type(false)?
10969 } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10970 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10971 Some(GeneratedAs::Always)
10972 } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10973 Some(GeneratedAs::ByDefault)
10974 } else {
10975 None
10976 };
10977
10978 self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10979
10980 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10981
10982 if self.peek_token_ref().token == Token::LParen {
10983 self.expect_token(&Token::LParen)?;
10984 sequence_options = Some(self.parse_create_sequence_options()?);
10985 self.expect_token(&Token::RParen)?;
10986 }
10987
10988 AlterColumnOperation::AddGenerated {
10989 generated_as,
10990 sequence_options,
10991 }
10992 } else {
10993 let message = if is_postgresql {
10994 "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10995 } else {
10996 "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10997 };
10998
10999 return self.expected_ref(message, self.peek_token_ref());
11000 };
11001 AlterTableOperation::AlterColumn { column_name, op }
11002 } else if self.parse_keyword(Keyword::SWAP) {
11003 self.expect_keyword_is(Keyword::WITH)?;
11004 let table_name = self.parse_object_name(false)?;
11005 AlterTableOperation::SwapWith { table_name }
11006 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
11007 && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
11008 {
11009 let new_owner = self.parse_owner()?;
11010 AlterTableOperation::OwnerTo { new_owner }
11011 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11012 && self.parse_keyword(Keyword::ATTACH)
11013 {
11014 AlterTableOperation::AttachPartition {
11015 partition: self.parse_part_or_partition()?,
11016 }
11017 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11018 && self.parse_keyword(Keyword::DETACH)
11019 {
11020 AlterTableOperation::DetachPartition {
11021 partition: self.parse_part_or_partition()?,
11022 }
11023 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11024 && self.parse_keyword(Keyword::FREEZE)
11025 {
11026 let partition = self.parse_part_or_partition()?;
11027 let with_name = if self.parse_keyword(Keyword::WITH) {
11028 self.expect_keyword_is(Keyword::NAME)?;
11029 Some(self.parse_identifier()?)
11030 } else {
11031 None
11032 };
11033 AlterTableOperation::FreezePartition {
11034 partition,
11035 with_name,
11036 }
11037 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11038 && self.parse_keyword(Keyword::UNFREEZE)
11039 {
11040 let partition = self.parse_part_or_partition()?;
11041 let with_name = if self.parse_keyword(Keyword::WITH) {
11042 self.expect_keyword_is(Keyword::NAME)?;
11043 Some(self.parse_identifier()?)
11044 } else {
11045 None
11046 };
11047 AlterTableOperation::UnfreezePartition {
11048 partition,
11049 with_name,
11050 }
11051 } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
11052 self.expect_token(&Token::LParen)?;
11053 let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
11054 self.expect_token(&Token::RParen)?;
11055 AlterTableOperation::ClusterBy { exprs }
11056 } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
11057 AlterTableOperation::SuspendRecluster
11058 } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
11059 AlterTableOperation::ResumeRecluster
11060 } else if self.parse_keyword(Keyword::LOCK) {
11061 let equals = self.consume_token(&Token::Eq);
11062 let lock = match self.parse_one_of_keywords(&[
11063 Keyword::DEFAULT,
11064 Keyword::EXCLUSIVE,
11065 Keyword::NONE,
11066 Keyword::SHARED,
11067 ]) {
11068 Some(Keyword::DEFAULT) => AlterTableLock::Default,
11069 Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
11070 Some(Keyword::NONE) => AlterTableLock::None,
11071 Some(Keyword::SHARED) => AlterTableLock::Shared,
11072 _ => self.expected_ref(
11073 "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
11074 self.peek_token_ref(),
11075 )?,
11076 };
11077 AlterTableOperation::Lock { equals, lock }
11078 } else if self.parse_keyword(Keyword::ALGORITHM) {
11079 let equals = self.consume_token(&Token::Eq);
11080 let algorithm = match self.parse_one_of_keywords(&[
11081 Keyword::DEFAULT,
11082 Keyword::INSTANT,
11083 Keyword::INPLACE,
11084 Keyword::COPY,
11085 ]) {
11086 Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
11087 Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
11088 Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
11089 Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
11090 _ => self.expected_ref(
11091 "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
11092 self.peek_token_ref(),
11093 )?,
11094 };
11095 AlterTableOperation::Algorithm { equals, algorithm }
11096 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
11097 let equals = self.consume_token(&Token::Eq);
11098 let value = self.parse_number_value()?;
11099 AlterTableOperation::AutoIncrement { equals, value }
11100 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
11101 let identity = if self.parse_keyword(Keyword::NOTHING) {
11102 ReplicaIdentity::Nothing
11103 } else if self.parse_keyword(Keyword::FULL) {
11104 ReplicaIdentity::Full
11105 } else if self.parse_keyword(Keyword::DEFAULT) {
11106 ReplicaIdentity::Default
11107 } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
11108 ReplicaIdentity::Index(self.parse_identifier()?)
11109 } else {
11110 return self.expected_ref(
11111 "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
11112 self.peek_token_ref(),
11113 );
11114 };
11115
11116 AlterTableOperation::ReplicaIdentity { identity }
11117 } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11118 let name = self.parse_identifier()?;
11119 AlterTableOperation::ValidateConstraint { name }
11120 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOGGED]) {
11121 AlterTableOperation::SetLogged
11122 } else if self.parse_keywords(&[Keyword::SET, Keyword::UNLOGGED]) {
11123 AlterTableOperation::SetUnlogged
11124 } else {
11125 let mut options =
11126 self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
11127 if !options.is_empty() {
11128 AlterTableOperation::SetTblProperties {
11129 table_properties: options,
11130 }
11131 } else {
11132 options = self.parse_options(Keyword::SET)?;
11133 if !options.is_empty() {
11134 AlterTableOperation::SetOptionsParens { options }
11135 } else {
11136 return self.expected_ref(
11137 "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
11138 self.peek_token_ref(),
11139 );
11140 }
11141 }
11142 };
11143 Ok(operation)
11144 }
11145
11146 fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
11147 let data_type = self.parse_data_type()?;
11148 let using = if self.dialect.supports_alter_column_type_using()
11149 && self.parse_keyword(Keyword::USING)
11150 {
11151 Some(self.parse_expr()?)
11152 } else {
11153 None
11154 };
11155 Ok(AlterColumnOperation::SetDataType {
11156 data_type,
11157 using,
11158 had_set,
11159 })
11160 }
11161
11162 fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
11163 let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
11164 match keyword {
11165 Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
11166 Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
11167 unexpected_keyword => Err(ParserError::ParserError(
11169 format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
11170 )),
11171 }
11172 }
11173
11174 pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
11176 if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
11177 return self.parse_alter_text_search().map(Into::into);
11178 }
11179
11180 let object_type = self.expect_one_of_keywords(&[
11181 Keyword::VIEW,
11182 Keyword::TYPE,
11183 Keyword::COLLATION,
11184 Keyword::TABLE,
11185 Keyword::INDEX,
11186 Keyword::FUNCTION,
11187 Keyword::AGGREGATE,
11188 Keyword::ROLE,
11189 Keyword::POLICY,
11190 Keyword::CONNECTOR,
11191 Keyword::ICEBERG,
11192 Keyword::SCHEMA,
11193 Keyword::USER,
11194 Keyword::OPERATOR,
11195 ])?;
11196 match object_type {
11197 Keyword::SCHEMA => {
11198 self.prev_token();
11199 self.prev_token();
11200 self.parse_alter_schema()
11201 }
11202 Keyword::VIEW => self.parse_alter_view(),
11203 Keyword::TYPE => self.parse_alter_type(),
11204 Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
11205 Keyword::TABLE => self.parse_alter_table(false),
11206 Keyword::ICEBERG => {
11207 self.expect_keyword(Keyword::TABLE)?;
11208 self.parse_alter_table(true)
11209 }
11210 Keyword::INDEX => {
11211 let index_name = self.parse_object_name(false)?;
11212 let operation = if self.parse_keyword(Keyword::RENAME) {
11213 if self.parse_keyword(Keyword::TO) {
11214 let index_name = self.parse_object_name(false)?;
11215 AlterIndexOperation::RenameIndex { index_name }
11216 } else {
11217 return self.expected_ref("TO after RENAME", self.peek_token_ref());
11218 }
11219 } else {
11220 return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
11221 };
11222
11223 Ok(Statement::AlterIndex {
11224 name: index_name,
11225 operation,
11226 })
11227 }
11228 Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
11229 Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
11230 Keyword::OPERATOR => {
11231 if self.parse_keyword(Keyword::FAMILY) {
11232 self.parse_alter_operator_family().map(Into::into)
11233 } else if self.parse_keyword(Keyword::CLASS) {
11234 self.parse_alter_operator_class().map(Into::into)
11235 } else {
11236 self.parse_alter_operator().map(Into::into)
11237 }
11238 }
11239 Keyword::ROLE => self.parse_alter_role(),
11240 Keyword::POLICY => self.parse_alter_policy().map(Into::into),
11241 Keyword::CONNECTOR => self.parse_alter_connector(),
11242 Keyword::USER if self.dialect.supports_alter_user_as_alter_role() => {
11243 self.parse_alter_role()
11244 }
11245 Keyword::USER => self.parse_alter_user().map(Into::into),
11246 unexpected_keyword => Err(ParserError::ParserError(
11248 format!("Internal parser error: expected any of {{TEXT SEARCH, VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
11249 )),
11250 }
11251 }
11252
11253 fn parse_alter_aggregate_signature(
11254 &mut self,
11255 ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
11256 let name = self.parse_object_name(false)?;
11257 self.expect_token(&Token::LParen)?;
11258
11259 if self.consume_token(&Token::Mul) {
11260 self.expect_token(&Token::RParen)?;
11261 return Ok((
11262 FunctionDesc {
11263 name,
11264 args: Some(vec![]),
11265 },
11266 true,
11267 None,
11268 ));
11269 }
11270
11271 let args =
11272 if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
11273 vec![]
11274 } else {
11275 self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
11276 };
11277
11278 let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11279 Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
11280 } else {
11281 None
11282 };
11283
11284 self.expect_token(&Token::RParen)?;
11285 Ok((
11286 FunctionDesc {
11287 name,
11288 args: Some(args),
11289 },
11290 false,
11291 aggregate_order_by,
11292 ))
11293 }
11294
11295 fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
11296 let action = if self.parse_keywords(&[
11297 Keyword::CALLED,
11298 Keyword::ON,
11299 Keyword::NULL,
11300 Keyword::INPUT,
11301 ]) {
11302 Some(AlterFunctionAction::CalledOnNull(
11303 FunctionCalledOnNull::CalledOnNullInput,
11304 ))
11305 } else if self.parse_keywords(&[
11306 Keyword::RETURNS,
11307 Keyword::NULL,
11308 Keyword::ON,
11309 Keyword::NULL,
11310 Keyword::INPUT,
11311 ]) {
11312 Some(AlterFunctionAction::CalledOnNull(
11313 FunctionCalledOnNull::ReturnsNullOnNullInput,
11314 ))
11315 } else if self.parse_keyword(Keyword::STRICT) {
11316 Some(AlterFunctionAction::CalledOnNull(
11317 FunctionCalledOnNull::Strict,
11318 ))
11319 } else if self.parse_keyword(Keyword::IMMUTABLE) {
11320 Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
11321 } else if self.parse_keyword(Keyword::STABLE) {
11322 Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
11323 } else if self.parse_keyword(Keyword::VOLATILE) {
11324 Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
11325 } else if self.parse_keyword(Keyword::NOT) {
11326 self.expect_keyword(Keyword::LEAKPROOF)?;
11327 Some(AlterFunctionAction::Leakproof(false))
11328 } else if self.parse_keyword(Keyword::LEAKPROOF) {
11329 Some(AlterFunctionAction::Leakproof(true))
11330 } else if self.parse_keyword(Keyword::EXTERNAL) {
11331 self.expect_keyword(Keyword::SECURITY)?;
11332 let security = if self.parse_keyword(Keyword::DEFINER) {
11333 FunctionSecurity::Definer
11334 } else if self.parse_keyword(Keyword::INVOKER) {
11335 FunctionSecurity::Invoker
11336 } else {
11337 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11338 };
11339 Some(AlterFunctionAction::Security {
11340 external: true,
11341 security,
11342 })
11343 } else if self.parse_keyword(Keyword::SECURITY) {
11344 let security = if self.parse_keyword(Keyword::DEFINER) {
11345 FunctionSecurity::Definer
11346 } else if self.parse_keyword(Keyword::INVOKER) {
11347 FunctionSecurity::Invoker
11348 } else {
11349 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11350 };
11351 Some(AlterFunctionAction::Security {
11352 external: false,
11353 security,
11354 })
11355 } else if self.parse_keyword(Keyword::PARALLEL) {
11356 let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11357 FunctionParallel::Unsafe
11358 } else if self.parse_keyword(Keyword::RESTRICTED) {
11359 FunctionParallel::Restricted
11360 } else if self.parse_keyword(Keyword::SAFE) {
11361 FunctionParallel::Safe
11362 } else {
11363 return self
11364 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11365 };
11366 Some(AlterFunctionAction::Parallel(parallel))
11367 } else if self.parse_keyword(Keyword::COST) {
11368 Some(AlterFunctionAction::Cost(self.parse_number()?))
11369 } else if self.parse_keyword(Keyword::ROWS) {
11370 Some(AlterFunctionAction::Rows(self.parse_number()?))
11371 } else if self.parse_keyword(Keyword::SUPPORT) {
11372 Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11373 } else if self.parse_keyword(Keyword::SET) {
11374 let name = self.parse_object_name(false)?;
11375 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11376 FunctionSetValue::FromCurrent
11377 } else {
11378 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11379 return self.expected_ref("= or TO", self.peek_token_ref());
11380 }
11381 if self.parse_keyword(Keyword::DEFAULT) {
11382 FunctionSetValue::Default
11383 } else {
11384 FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11385 }
11386 };
11387 Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11388 name,
11389 value,
11390 }))
11391 } else if self.parse_keyword(Keyword::RESET) {
11392 let reset_config = if self.parse_keyword(Keyword::ALL) {
11393 ResetConfig::ALL
11394 } else {
11395 ResetConfig::ConfigName(self.parse_object_name(false)?)
11396 };
11397 Some(AlterFunctionAction::Reset(reset_config))
11398 } else {
11399 None
11400 };
11401
11402 Ok(action)
11403 }
11404
11405 fn parse_alter_function_actions(
11406 &mut self,
11407 ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11408 let mut actions = vec![];
11409 while let Some(action) = self.parse_alter_function_action()? {
11410 actions.push(action);
11411 }
11412 if actions.is_empty() {
11413 return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11414 }
11415 let restrict = self.parse_keyword(Keyword::RESTRICT);
11416 Ok((actions, restrict))
11417 }
11418
11419 pub fn parse_alter_function(
11421 &mut self,
11422 kind: AlterFunctionKind,
11423 ) -> Result<Statement, ParserError> {
11424 let (function, aggregate_star, aggregate_order_by) = match kind {
11425 AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
11426 AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11427 };
11428
11429 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11430 let new_name = self.parse_identifier()?;
11431 AlterFunctionOperation::RenameTo { new_name }
11432 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11433 AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11434 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11435 AlterFunctionOperation::SetSchema {
11436 schema_name: self.parse_object_name(false)?,
11437 }
11438 } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
11439 if !self.parse_keyword(Keyword::DEPENDS) {
11440 return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11441 }
11442 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11443 AlterFunctionOperation::DependsOnExtension {
11444 no: true,
11445 extension_name: self.parse_object_name(false)?,
11446 }
11447 } else if matches!(kind, AlterFunctionKind::Function)
11448 && self.parse_keyword(Keyword::DEPENDS)
11449 {
11450 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11451 AlterFunctionOperation::DependsOnExtension {
11452 no: false,
11453 extension_name: self.parse_object_name(false)?,
11454 }
11455 } else if matches!(kind, AlterFunctionKind::Function) {
11456 let (actions, restrict) = self.parse_alter_function_actions()?;
11457 AlterFunctionOperation::Actions { actions, restrict }
11458 } else {
11459 return self.expected_ref(
11460 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11461 self.peek_token_ref(),
11462 );
11463 };
11464
11465 Ok(Statement::AlterFunction(AlterFunction {
11466 kind,
11467 function,
11468 aggregate_order_by,
11469 aggregate_star,
11470 operation,
11471 }))
11472 }
11473
11474 pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11476 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11477 let only = self.parse_keyword(Keyword::ONLY); let table_name = self.parse_object_name(false)?;
11479 let on_cluster = self.parse_optional_on_cluster()?;
11480 let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11481
11482 let mut location = None;
11483 if self.parse_keyword(Keyword::LOCATION) {
11484 location = Some(HiveSetLocation {
11485 has_set: false,
11486 location: self.parse_identifier()?,
11487 });
11488 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11489 location = Some(HiveSetLocation {
11490 has_set: true,
11491 location: self.parse_identifier()?,
11492 });
11493 }
11494
11495 let end_token = if self.peek_token_ref().token == Token::SemiColon {
11496 self.peek_token_ref().clone()
11497 } else {
11498 self.get_current_token().clone()
11499 };
11500
11501 Ok(AlterTable {
11502 name: table_name,
11503 if_exists,
11504 only,
11505 operations,
11506 location,
11507 on_cluster,
11508 table_type: if iceberg {
11509 Some(AlterTableType::Iceberg)
11510 } else {
11511 None
11512 },
11513 end_token: AttachedToken(end_token),
11514 }
11515 .into())
11516 }
11517
11518 pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11520 let name = self.parse_object_name(false)?;
11521 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11522
11523 let with_options = self.parse_options(Keyword::WITH)?;
11524
11525 self.expect_keyword_is(Keyword::AS)?;
11526 let query = self.parse_query()?;
11527
11528 Ok(Statement::AlterView {
11529 name,
11530 columns,
11531 query,
11532 with_options,
11533 })
11534 }
11535
11536 pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11538 let name = self.parse_object_name(false)?;
11539
11540 if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11541 let new_name = self.parse_identifier()?;
11542 Ok(Statement::AlterType(AlterType {
11543 name,
11544 operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11545 }))
11546 } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11547 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11548 let new_enum_value = self.parse_identifier()?;
11549 let position = if self.parse_keyword(Keyword::BEFORE) {
11550 Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11551 } else if self.parse_keyword(Keyword::AFTER) {
11552 Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11553 } else {
11554 None
11555 };
11556
11557 Ok(Statement::AlterType(AlterType {
11558 name,
11559 operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11560 if_not_exists,
11561 value: new_enum_value,
11562 position,
11563 }),
11564 }))
11565 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11566 let existing_enum_value = self.parse_identifier()?;
11567 self.expect_keyword(Keyword::TO)?;
11568 let new_enum_value = self.parse_identifier()?;
11569
11570 Ok(Statement::AlterType(AlterType {
11571 name,
11572 operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11573 from: existing_enum_value,
11574 to: new_enum_value,
11575 }),
11576 }))
11577 } else {
11578 self.expected_ref(
11579 "{RENAME TO | { RENAME | ADD } VALUE}",
11580 self.peek_token_ref(),
11581 )
11582 }
11583 }
11584
11585 pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11589 let name = self.parse_object_name(false)?;
11590 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11591 AlterCollationOperation::RenameTo {
11592 new_name: self.parse_identifier()?,
11593 }
11594 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11595 AlterCollationOperation::OwnerTo(self.parse_owner()?)
11596 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11597 AlterCollationOperation::SetSchema {
11598 schema_name: self.parse_object_name(false)?,
11599 }
11600 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11601 AlterCollationOperation::RefreshVersion
11602 } else {
11603 return self.expected_ref(
11604 "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11605 self.peek_token_ref(),
11606 );
11607 };
11608
11609 Ok(AlterCollation { name, operation })
11610 }
11611
11612 pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11616 let name = self.parse_operator_name()?;
11617
11618 self.expect_token(&Token::LParen)?;
11620
11621 let left_type = if self.parse_keyword(Keyword::NONE) {
11622 None
11623 } else {
11624 Some(self.parse_data_type()?)
11625 };
11626
11627 self.expect_token(&Token::Comma)?;
11628 let right_type = self.parse_data_type()?;
11629 self.expect_token(&Token::RParen)?;
11630
11631 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11633 let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11634 Owner::CurrentRole
11635 } else if self.parse_keyword(Keyword::CURRENT_USER) {
11636 Owner::CurrentUser
11637 } else if self.parse_keyword(Keyword::SESSION_USER) {
11638 Owner::SessionUser
11639 } else {
11640 Owner::Ident(self.parse_identifier()?)
11641 };
11642 AlterOperatorOperation::OwnerTo(owner)
11643 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11644 let schema_name = self.parse_object_name(false)?;
11645 AlterOperatorOperation::SetSchema { schema_name }
11646 } else if self.parse_keyword(Keyword::SET) {
11647 self.expect_token(&Token::LParen)?;
11648
11649 let mut options = Vec::new();
11650 loop {
11651 let keyword = self.expect_one_of_keywords(&[
11652 Keyword::RESTRICT,
11653 Keyword::JOIN,
11654 Keyword::COMMUTATOR,
11655 Keyword::NEGATOR,
11656 Keyword::HASHES,
11657 Keyword::MERGES,
11658 ])?;
11659
11660 match keyword {
11661 Keyword::RESTRICT => {
11662 self.expect_token(&Token::Eq)?;
11663 let proc_name = if self.parse_keyword(Keyword::NONE) {
11664 None
11665 } else {
11666 Some(self.parse_object_name(false)?)
11667 };
11668 options.push(OperatorOption::Restrict(proc_name));
11669 }
11670 Keyword::JOIN => {
11671 self.expect_token(&Token::Eq)?;
11672 let proc_name = if self.parse_keyword(Keyword::NONE) {
11673 None
11674 } else {
11675 Some(self.parse_object_name(false)?)
11676 };
11677 options.push(OperatorOption::Join(proc_name));
11678 }
11679 Keyword::COMMUTATOR => {
11680 self.expect_token(&Token::Eq)?;
11681 let op_name = self.parse_operator_name()?;
11682 options.push(OperatorOption::Commutator(op_name));
11683 }
11684 Keyword::NEGATOR => {
11685 self.expect_token(&Token::Eq)?;
11686 let op_name = self.parse_operator_name()?;
11687 options.push(OperatorOption::Negator(op_name));
11688 }
11689 Keyword::HASHES => {
11690 options.push(OperatorOption::Hashes);
11691 }
11692 Keyword::MERGES => {
11693 options.push(OperatorOption::Merges);
11694 }
11695 unexpected_keyword => return Err(ParserError::ParserError(
11696 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11697 )),
11698 }
11699
11700 if !self.consume_token(&Token::Comma) {
11701 break;
11702 }
11703 }
11704
11705 self.expect_token(&Token::RParen)?;
11706 AlterOperatorOperation::Set { options }
11707 } else {
11708 return self.expected_ref(
11709 "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11710 self.peek_token_ref(),
11711 );
11712 };
11713
11714 Ok(AlterOperator {
11715 name,
11716 left_type,
11717 right_type,
11718 operation,
11719 })
11720 }
11721
11722 fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11724 let strategy_number = self.parse_literal_uint()?;
11725 let operator_name = self.parse_operator_name()?;
11726
11727 self.expect_token(&Token::LParen)?;
11729 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11730 self.expect_token(&Token::RParen)?;
11731
11732 let purpose = if self.parse_keyword(Keyword::FOR) {
11734 if self.parse_keyword(Keyword::SEARCH) {
11735 Some(OperatorPurpose::ForSearch)
11736 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11737 let sort_family = self.parse_object_name(false)?;
11738 Some(OperatorPurpose::ForOrderBy { sort_family })
11739 } else {
11740 return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11741 }
11742 } else {
11743 None
11744 };
11745
11746 Ok(OperatorFamilyItem::Operator {
11747 strategy_number,
11748 operator_name,
11749 op_types,
11750 purpose,
11751 })
11752 }
11753
11754 fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11756 let support_number = self.parse_literal_uint()?;
11757
11758 let op_types =
11760 if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11761 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11762 self.expect_token(&Token::RParen)?;
11763 Some(types)
11764 } else if self.consume_token(&Token::LParen) {
11765 self.expect_token(&Token::RParen)?;
11766 Some(vec![])
11767 } else {
11768 None
11769 };
11770
11771 let function_name = self.parse_object_name(false)?;
11772
11773 let argument_types = if self.consume_token(&Token::LParen) {
11775 if self.peek_token_ref().token == Token::RParen {
11776 self.expect_token(&Token::RParen)?;
11777 vec![]
11778 } else {
11779 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11780 self.expect_token(&Token::RParen)?;
11781 types
11782 }
11783 } else {
11784 vec![]
11785 };
11786
11787 Ok(OperatorFamilyItem::Function {
11788 support_number,
11789 op_types,
11790 function_name,
11791 argument_types,
11792 })
11793 }
11794
11795 fn parse_operator_family_drop_operator(
11797 &mut self,
11798 ) -> Result<OperatorFamilyDropItem, ParserError> {
11799 let strategy_number = self.parse_literal_uint()?;
11800
11801 self.expect_token(&Token::LParen)?;
11803 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11804 self.expect_token(&Token::RParen)?;
11805
11806 Ok(OperatorFamilyDropItem::Operator {
11807 strategy_number,
11808 op_types,
11809 })
11810 }
11811
11812 fn parse_operator_family_drop_function(
11814 &mut self,
11815 ) -> Result<OperatorFamilyDropItem, ParserError> {
11816 let support_number = self.parse_literal_uint()?;
11817
11818 self.expect_token(&Token::LParen)?;
11820 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11821 self.expect_token(&Token::RParen)?;
11822
11823 Ok(OperatorFamilyDropItem::Function {
11824 support_number,
11825 op_types,
11826 })
11827 }
11828
11829 fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11831 if self.parse_keyword(Keyword::OPERATOR) {
11832 self.parse_operator_family_add_operator()
11833 } else if self.parse_keyword(Keyword::FUNCTION) {
11834 self.parse_operator_family_add_function()
11835 } else {
11836 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11837 }
11838 }
11839
11840 fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11842 if self.parse_keyword(Keyword::OPERATOR) {
11843 self.parse_operator_family_drop_operator()
11844 } else if self.parse_keyword(Keyword::FUNCTION) {
11845 self.parse_operator_family_drop_function()
11846 } else {
11847 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11848 }
11849 }
11850
11851 pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11854 let name = self.parse_object_name(false)?;
11855 self.expect_keyword(Keyword::USING)?;
11856 let using = self.parse_identifier()?;
11857
11858 let operation = if self.parse_keyword(Keyword::ADD) {
11859 let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11860 AlterOperatorFamilyOperation::Add { items }
11861 } else if self.parse_keyword(Keyword::DROP) {
11862 let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11863 AlterOperatorFamilyOperation::Drop { items }
11864 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11865 let new_name = self.parse_object_name(false)?;
11866 AlterOperatorFamilyOperation::RenameTo { new_name }
11867 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11868 let owner = self.parse_owner()?;
11869 AlterOperatorFamilyOperation::OwnerTo(owner)
11870 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11871 let schema_name = self.parse_object_name(false)?;
11872 AlterOperatorFamilyOperation::SetSchema { schema_name }
11873 } else {
11874 return self.expected_ref(
11875 "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11876 self.peek_token_ref(),
11877 );
11878 };
11879
11880 Ok(AlterOperatorFamily {
11881 name,
11882 using,
11883 operation,
11884 })
11885 }
11886
11887 pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11891 let name = self.parse_object_name(false)?;
11892 self.expect_keyword(Keyword::USING)?;
11893 let using = self.parse_identifier()?;
11894
11895 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11896 let new_name = self.parse_object_name(false)?;
11897 AlterOperatorClassOperation::RenameTo { new_name }
11898 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11899 let owner = self.parse_owner()?;
11900 AlterOperatorClassOperation::OwnerTo(owner)
11901 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11902 let schema_name = self.parse_object_name(false)?;
11903 AlterOperatorClassOperation::SetSchema { schema_name }
11904 } else {
11905 return self.expected_ref(
11906 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11907 self.peek_token_ref(),
11908 );
11909 };
11910
11911 Ok(AlterOperatorClass {
11912 name,
11913 using,
11914 operation,
11915 })
11916 }
11917
11918 pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11922 self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11923 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11924 let name = self.parse_object_name(false)?;
11925 let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11926 self.prev_token();
11927 let options = self.parse_options(Keyword::OPTIONS)?;
11928 AlterSchemaOperation::SetOptionsParens { options }
11929 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11930 let collate = self.parse_expr()?;
11931 AlterSchemaOperation::SetDefaultCollate { collate }
11932 } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11933 let replica = self.parse_identifier()?;
11934 let options = if self.peek_keyword(Keyword::OPTIONS) {
11935 Some(self.parse_options(Keyword::OPTIONS)?)
11936 } else {
11937 None
11938 };
11939 AlterSchemaOperation::AddReplica { replica, options }
11940 } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11941 let replica = self.parse_identifier()?;
11942 AlterSchemaOperation::DropReplica { replica }
11943 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11944 let new_name = self.parse_object_name(false)?;
11945 AlterSchemaOperation::Rename { name: new_name }
11946 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11947 let owner = self.parse_owner()?;
11948 AlterSchemaOperation::OwnerTo { owner }
11949 } else {
11950 return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11951 };
11952 Ok(Statement::AlterSchema(AlterSchema {
11953 name,
11954 if_exists,
11955 operations: vec![operation],
11956 }))
11957 }
11958
11959 pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11962 let object_name = self.parse_object_name(false)?;
11963 if self.peek_token_ref().token == Token::LParen {
11964 match self.parse_function(object_name)? {
11965 Expr::Function(f) => Ok(Statement::Call(f)),
11966 other => parser_err!(
11967 format!("Expected a simple procedure call but found: {other}"),
11968 self.peek_token_ref().span.start
11969 ),
11970 }
11971 } else {
11972 Ok(Statement::Call(Function {
11973 name: object_name,
11974 uses_odbc_syntax: false,
11975 parameters: FunctionArguments::None,
11976 args: FunctionArguments::None,
11977 over: None,
11978 filter: None,
11979 null_treatment: None,
11980 within_group: vec![],
11981 }))
11982 }
11983 }
11984
11985 pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11987 let source;
11988 if self.consume_token(&Token::LParen) {
11989 source = CopySource::Query(self.parse_query()?);
11990 self.expect_token(&Token::RParen)?;
11991 } else {
11992 let table_name = self.parse_object_name(false)?;
11993 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11994 source = CopySource::Table {
11995 table_name,
11996 columns,
11997 };
11998 }
11999 let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
12000 Some(Keyword::FROM) => false,
12001 Some(Keyword::TO) => true,
12002 _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
12003 };
12004 if !to {
12005 if let CopySource::Query(_) = source {
12008 return Err(ParserError::ParserError(
12009 "COPY ... FROM does not support query as a source".to_string(),
12010 ));
12011 }
12012 }
12013 let target = if self.parse_keyword(Keyword::STDIN) {
12014 CopyTarget::Stdin
12015 } else if self.parse_keyword(Keyword::STDOUT) {
12016 CopyTarget::Stdout
12017 } else if self.parse_keyword(Keyword::PROGRAM) {
12018 CopyTarget::Program {
12019 command: self.parse_literal_string()?,
12020 }
12021 } else {
12022 CopyTarget::File {
12023 filename: self.parse_literal_string()?,
12024 }
12025 };
12026 let _ = self.parse_keyword(Keyword::WITH); let mut options = vec![];
12028 if self.consume_token(&Token::LParen) {
12029 options = self.parse_comma_separated(Parser::parse_copy_option)?;
12030 self.expect_token(&Token::RParen)?;
12031 }
12032 let mut legacy_options = vec![];
12033 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
12034 legacy_options.push(opt);
12035 }
12036 let values =
12037 if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
12038 self.expect_token(&Token::SemiColon)?;
12039 self.parse_tsv()
12040 } else {
12041 vec![]
12042 };
12043 Ok(Statement::Copy {
12044 source,
12045 to,
12046 target,
12047 options,
12048 legacy_options,
12049 values,
12050 })
12051 }
12052
12053 fn parse_open(&mut self) -> Result<Statement, ParserError> {
12055 self.expect_keyword(Keyword::OPEN)?;
12056 Ok(Statement::Open(OpenStatement {
12057 cursor_name: self.parse_identifier()?,
12058 }))
12059 }
12060
12061 pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
12063 let cursor = if self.parse_keyword(Keyword::ALL) {
12064 CloseCursor::All
12065 } else {
12066 let name = self.parse_identifier()?;
12067
12068 CloseCursor::Specific { name }
12069 };
12070
12071 Ok(Statement::Close { cursor })
12072 }
12073
12074 fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
12075 let ret = match self.parse_one_of_keywords(&[
12076 Keyword::FORMAT,
12077 Keyword::FREEZE,
12078 Keyword::DELIMITER,
12079 Keyword::NULL,
12080 Keyword::HEADER,
12081 Keyword::QUOTE,
12082 Keyword::ESCAPE,
12083 Keyword::FORCE_QUOTE,
12084 Keyword::FORCE_NOT_NULL,
12085 Keyword::FORCE_NULL,
12086 Keyword::ENCODING,
12087 ]) {
12088 Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
12089 Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
12090 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12091 Some(Keyword::FALSE)
12092 )),
12093 Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
12094 Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
12095 Some(Keyword::HEADER) => CopyOption::Header(!matches!(
12096 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12097 Some(Keyword::FALSE)
12098 )),
12099 Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
12100 Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
12101 Some(Keyword::FORCE_QUOTE) => {
12102 CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
12103 }
12104 Some(Keyword::FORCE_NOT_NULL) => {
12105 CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12106 }
12107 Some(Keyword::FORCE_NULL) => {
12108 CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12109 }
12110 Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
12111 _ => self.expected_ref("option", self.peek_token_ref())?,
12112 };
12113 Ok(ret)
12114 }
12115
12116 fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
12117 if self.parse_keyword(Keyword::FORMAT) {
12119 let _ = self.parse_keyword(Keyword::AS);
12120 }
12121
12122 let ret = match self.parse_one_of_keywords(&[
12123 Keyword::ACCEPTANYDATE,
12124 Keyword::ACCEPTINVCHARS,
12125 Keyword::ADDQUOTES,
12126 Keyword::ALLOWOVERWRITE,
12127 Keyword::BINARY,
12128 Keyword::BLANKSASNULL,
12129 Keyword::BZIP2,
12130 Keyword::CLEANPATH,
12131 Keyword::COMPUPDATE,
12132 Keyword::CREDENTIALS,
12133 Keyword::CSV,
12134 Keyword::DATEFORMAT,
12135 Keyword::DELIMITER,
12136 Keyword::EMPTYASNULL,
12137 Keyword::ENCRYPTED,
12138 Keyword::ESCAPE,
12139 Keyword::EXTENSION,
12140 Keyword::FIXEDWIDTH,
12141 Keyword::GZIP,
12142 Keyword::HEADER,
12143 Keyword::IAM_ROLE,
12144 Keyword::IGNOREHEADER,
12145 Keyword::JSON,
12146 Keyword::MANIFEST,
12147 Keyword::MAXFILESIZE,
12148 Keyword::NULL,
12149 Keyword::PARALLEL,
12150 Keyword::PARQUET,
12151 Keyword::PARTITION,
12152 Keyword::REGION,
12153 Keyword::REMOVEQUOTES,
12154 Keyword::ROWGROUPSIZE,
12155 Keyword::STATUPDATE,
12156 Keyword::TIMEFORMAT,
12157 Keyword::TRUNCATECOLUMNS,
12158 Keyword::ZSTD,
12159 ]) {
12160 Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
12161 Some(Keyword::ACCEPTINVCHARS) => {
12162 let _ = self.parse_keyword(Keyword::AS); let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12164 Some(self.parse_literal_string()?)
12165 } else {
12166 None
12167 };
12168 CopyLegacyOption::AcceptInvChars(ch)
12169 }
12170 Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
12171 Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
12172 Some(Keyword::BINARY) => CopyLegacyOption::Binary,
12173 Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
12174 Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
12175 Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
12176 Some(Keyword::COMPUPDATE) => {
12177 let preset = self.parse_keyword(Keyword::PRESET);
12178 let enabled = match self.parse_one_of_keywords(&[
12179 Keyword::TRUE,
12180 Keyword::FALSE,
12181 Keyword::ON,
12182 Keyword::OFF,
12183 ]) {
12184 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12185 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12186 _ => None,
12187 };
12188 CopyLegacyOption::CompUpdate { preset, enabled }
12189 }
12190 Some(Keyword::CREDENTIALS) => {
12191 CopyLegacyOption::Credentials(self.parse_literal_string()?)
12192 }
12193 Some(Keyword::CSV) => CopyLegacyOption::Csv({
12194 let mut opts = vec![];
12195 while let Some(opt) =
12196 self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
12197 {
12198 opts.push(opt);
12199 }
12200 opts
12201 }),
12202 Some(Keyword::DATEFORMAT) => {
12203 let _ = self.parse_keyword(Keyword::AS);
12204 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12205 Some(self.parse_literal_string()?)
12206 } else {
12207 None
12208 };
12209 CopyLegacyOption::DateFormat(fmt)
12210 }
12211 Some(Keyword::DELIMITER) => {
12212 let _ = self.parse_keyword(Keyword::AS);
12213 CopyLegacyOption::Delimiter(self.parse_literal_char()?)
12214 }
12215 Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
12216 Some(Keyword::ENCRYPTED) => {
12217 let auto = self.parse_keyword(Keyword::AUTO);
12218 CopyLegacyOption::Encrypted { auto }
12219 }
12220 Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
12221 Some(Keyword::EXTENSION) => {
12222 let ext = self.parse_literal_string()?;
12223 CopyLegacyOption::Extension(ext)
12224 }
12225 Some(Keyword::FIXEDWIDTH) => {
12226 let spec = self.parse_literal_string()?;
12227 CopyLegacyOption::FixedWidth(spec)
12228 }
12229 Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
12230 Some(Keyword::HEADER) => CopyLegacyOption::Header,
12231 Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
12232 Some(Keyword::IGNOREHEADER) => {
12233 let _ = self.parse_keyword(Keyword::AS);
12234 let num_rows = self.parse_literal_uint()?;
12235 CopyLegacyOption::IgnoreHeader(num_rows)
12236 }
12237 Some(Keyword::JSON) => {
12238 let _ = self.parse_keyword(Keyword::AS);
12239 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12240 Some(self.parse_literal_string()?)
12241 } else {
12242 None
12243 };
12244 CopyLegacyOption::Json(fmt)
12245 }
12246 Some(Keyword::MANIFEST) => {
12247 let verbose = self.parse_keyword(Keyword::VERBOSE);
12248 CopyLegacyOption::Manifest { verbose }
12249 }
12250 Some(Keyword::MAXFILESIZE) => {
12251 let _ = self.parse_keyword(Keyword::AS);
12252 let size = self.parse_number_value()?;
12253 let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12254 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12255 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12256 _ => None,
12257 };
12258 CopyLegacyOption::MaxFileSize(FileSize { size, unit })
12259 }
12260 Some(Keyword::NULL) => {
12261 let _ = self.parse_keyword(Keyword::AS);
12262 CopyLegacyOption::Null(self.parse_literal_string()?)
12263 }
12264 Some(Keyword::PARALLEL) => {
12265 let enabled = match self.parse_one_of_keywords(&[
12266 Keyword::TRUE,
12267 Keyword::FALSE,
12268 Keyword::ON,
12269 Keyword::OFF,
12270 ]) {
12271 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12272 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12273 _ => None,
12274 };
12275 CopyLegacyOption::Parallel(enabled)
12276 }
12277 Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
12278 Some(Keyword::PARTITION) => {
12279 self.expect_keyword(Keyword::BY)?;
12280 let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
12281 let include = self.parse_keyword(Keyword::INCLUDE);
12282 CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
12283 }
12284 Some(Keyword::REGION) => {
12285 let _ = self.parse_keyword(Keyword::AS);
12286 let region = self.parse_literal_string()?;
12287 CopyLegacyOption::Region(region)
12288 }
12289 Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
12290 Some(Keyword::ROWGROUPSIZE) => {
12291 let _ = self.parse_keyword(Keyword::AS);
12292 let file_size = self.parse_file_size()?;
12293 CopyLegacyOption::RowGroupSize(file_size)
12294 }
12295 Some(Keyword::STATUPDATE) => {
12296 let enabled = match self.parse_one_of_keywords(&[
12297 Keyword::TRUE,
12298 Keyword::FALSE,
12299 Keyword::ON,
12300 Keyword::OFF,
12301 ]) {
12302 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12303 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12304 _ => None,
12305 };
12306 CopyLegacyOption::StatUpdate(enabled)
12307 }
12308 Some(Keyword::TIMEFORMAT) => {
12309 let _ = self.parse_keyword(Keyword::AS);
12310 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12311 Some(self.parse_literal_string()?)
12312 } else {
12313 None
12314 };
12315 CopyLegacyOption::TimeFormat(fmt)
12316 }
12317 Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
12318 Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
12319 _ => self.expected_ref("option", self.peek_token_ref())?,
12320 };
12321 Ok(ret)
12322 }
12323
12324 fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
12325 let size = self.parse_number_value()?;
12326 let unit = self.maybe_parse_file_size_unit();
12327 Ok(FileSize { size, unit })
12328 }
12329
12330 fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
12331 match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12332 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12333 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12334 _ => None,
12335 }
12336 }
12337
12338 fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12339 if self.parse_keyword(Keyword::DEFAULT) {
12340 Ok(IamRoleKind::Default)
12341 } else {
12342 let arn = self.parse_literal_string()?;
12343 Ok(IamRoleKind::Arn(arn))
12344 }
12345 }
12346
12347 fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12348 let ret = match self.parse_one_of_keywords(&[
12349 Keyword::HEADER,
12350 Keyword::QUOTE,
12351 Keyword::ESCAPE,
12352 Keyword::FORCE,
12353 ]) {
12354 Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12355 Some(Keyword::QUOTE) => {
12356 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12358 }
12359 Some(Keyword::ESCAPE) => {
12360 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12362 }
12363 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12364 CopyLegacyCsvOption::ForceNotNull(
12365 self.parse_comma_separated(|p| p.parse_identifier())?,
12366 )
12367 }
12368 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12369 CopyLegacyCsvOption::ForceQuote(
12370 self.parse_comma_separated(|p| p.parse_identifier())?,
12371 )
12372 }
12373 _ => self.expected_ref("csv option", self.peek_token_ref())?,
12374 };
12375 Ok(ret)
12376 }
12377
12378 fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12379 let s = self.parse_literal_string()?;
12380 if s.len() != 1 {
12381 let loc = self
12382 .tokens
12383 .get(self.index - 1)
12384 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12385 return parser_err!(format!("Expect a char, found {s:?}"), loc);
12386 }
12387 Ok(s.chars().next().unwrap())
12388 }
12389
12390 pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12393 self.parse_tab_value()
12394 }
12395
12396 pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12398 let mut values = vec![];
12399 let mut content = String::new();
12400 while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12401 match t {
12402 Token::Whitespace(Whitespace::Tab) => {
12403 values.push(Some(core::mem::take(&mut content)));
12404 }
12405 Token::Whitespace(Whitespace::Newline) => {
12406 values.push(Some(core::mem::take(&mut content)));
12407 }
12408 Token::Backslash => {
12409 if self.consume_token(&Token::Period) {
12410 return values;
12411 }
12412 if let Token::Word(w) = self.next_token().token {
12413 if w.value == "N" {
12414 values.push(None);
12415 }
12416 }
12417 }
12418 _ => {
12419 content.push_str(&t.to_string());
12420 }
12421 }
12422 }
12423 values
12424 }
12425
12426 pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12428 let next_token = self.next_token();
12429 let span = next_token.span;
12430 let ok_value = |value: Value| Ok(value.with_span(span));
12431 match next_token.token {
12432 Token::Word(w) => match w.keyword {
12433 Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12434 ok_value(Value::Boolean(true))
12435 }
12436 Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12437 ok_value(Value::Boolean(false))
12438 }
12439 Keyword::NULL => ok_value(Value::Null),
12440 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12441 Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12442 Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12443 _ => self.expected(
12444 "A value?",
12445 TokenWithSpan {
12446 token: Token::Word(w),
12447 span,
12448 },
12449 )?,
12450 },
12451 _ => self.expected(
12452 "a concrete value",
12453 TokenWithSpan {
12454 token: Token::Word(w),
12455 span,
12456 },
12457 ),
12458 },
12459 Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12463 Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12464 self.maybe_concat_string_literal(s.to_string()),
12465 )),
12466 Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12467 self.maybe_concat_string_literal(s.to_string()),
12468 )),
12469 Token::TripleSingleQuotedString(ref s) => {
12470 ok_value(Value::TripleSingleQuotedString(s.to_string()))
12471 }
12472 Token::TripleDoubleQuotedString(ref s) => {
12473 ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12474 }
12475 Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12476 Token::SingleQuotedByteStringLiteral(ref s) => {
12477 ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12478 }
12479 Token::DoubleQuotedByteStringLiteral(ref s) => {
12480 ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12481 }
12482 Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12483 ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12484 }
12485 Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12486 ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12487 }
12488 Token::SingleQuotedRawStringLiteral(ref s) => {
12489 ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12490 }
12491 Token::DoubleQuotedRawStringLiteral(ref s) => {
12492 ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12493 }
12494 Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12495 ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12496 }
12497 Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12498 ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12499 }
12500 Token::NationalStringLiteral(ref s) => {
12501 ok_value(Value::NationalStringLiteral(s.to_string()))
12502 }
12503 Token::QuoteDelimitedStringLiteral(v) => {
12504 ok_value(Value::QuoteDelimitedStringLiteral(v))
12505 }
12506 Token::NationalQuoteDelimitedStringLiteral(v) => {
12507 ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12508 }
12509 Token::EscapedStringLiteral(ref s) => {
12510 ok_value(Value::EscapedStringLiteral(s.to_string()))
12511 }
12512 Token::UnicodeStringLiteral(ref s) => {
12513 ok_value(Value::UnicodeStringLiteral(s.to_string()))
12514 }
12515 Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12516 Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12517 tok @ Token::Colon | tok @ Token::AtSign => {
12518 let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12526 let ident = match next_token.token {
12527 Token::Word(w) => Ok(w.into_ident(next_token.span)),
12528 Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12529 _ => self.expected("placeholder", next_token),
12530 }?;
12531 Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12532 .with_span(Span::new(span.start, ident.span.end)))
12533 }
12534 unexpected => self.expected(
12535 "a value",
12536 TokenWithSpan {
12537 token: unexpected,
12538 span,
12539 },
12540 ),
12541 }
12542 }
12543
12544 fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12545 if self.dialect.supports_string_literal_concatenation() {
12546 while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12547 self.peek_token_ref().token
12548 {
12549 str.push_str(s);
12550 self.advance_token();
12551 }
12552 } else if self
12553 .dialect
12554 .supports_string_literal_concatenation_with_newline()
12555 {
12556 let mut after_newline = false;
12559 loop {
12560 match self.peek_token_no_skip().token {
12561 Token::Whitespace(Whitespace::Newline) => {
12562 after_newline = true;
12563 self.next_token_no_skip();
12564 }
12565 Token::Whitespace(_) => {
12566 self.next_token_no_skip();
12567 }
12568 Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12569 if after_newline =>
12570 {
12571 str.push_str(s.clone().as_str());
12572 self.next_token_no_skip();
12573 after_newline = false;
12574 }
12575 _ => break,
12576 }
12577 }
12578 }
12579
12580 str
12581 }
12582
12583 pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12585 let value_wrapper = self.parse_value()?;
12586 match &value_wrapper.value {
12587 Value::Number(_, _) => Ok(value_wrapper),
12588 Value::Placeholder(_) => Ok(value_wrapper),
12589 _ => {
12590 self.prev_token();
12591 self.expected_ref("literal number", self.peek_token_ref())
12592 }
12593 }
12594 }
12595
12596 pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12599 let next_token = self.next_token();
12600 match next_token.token {
12601 Token::Plus => Ok(Expr::UnaryOp {
12602 op: UnaryOperator::Plus,
12603 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12604 }),
12605 Token::Minus => Ok(Expr::UnaryOp {
12606 op: UnaryOperator::Minus,
12607 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12608 }),
12609 _ => {
12610 self.prev_token();
12611 Ok(Expr::Value(self.parse_number_value()?))
12612 }
12613 }
12614 }
12615
12616 fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12617 let next_token = self.next_token();
12618 let span = next_token.span;
12619 match next_token.token {
12620 Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12621 Value::SingleQuotedString(s.to_string()).with_span(span),
12622 )),
12623 Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12624 Value::DoubleQuotedString(s.to_string()).with_span(span),
12625 )),
12626 Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12627 Value::HexStringLiteral(s.to_string()).with_span(span),
12628 )),
12629 unexpected => self.expected(
12630 "a string value",
12631 TokenWithSpan {
12632 token: unexpected,
12633 span,
12634 },
12635 ),
12636 }
12637 }
12638
12639 pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12641 let next_token = self.next_token();
12642 match next_token.token {
12643 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12644 _ => self.expected("literal int", next_token),
12645 }
12646 }
12647
12648 fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12651 let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12652 let peek_token = parser.peek_token();
12653 let span = peek_token.span;
12654 match peek_token.token {
12655 Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12656 {
12657 parser.next_token();
12658 Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12659 }
12660 _ => Ok(Expr::Value(
12661 Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12662 )),
12663 }
12664 };
12665
12666 Ok(CreateFunctionBody::AsBeforeOptions {
12667 body: parse_string_expr(self)?,
12668 link_symbol: if self.consume_token(&Token::Comma) {
12669 Some(parse_string_expr(self)?)
12670 } else {
12671 None
12672 },
12673 })
12674 }
12675
12676 pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12678 let next_token = self.next_token();
12679 match next_token.token {
12680 Token::Word(Word {
12681 value,
12682 keyword: Keyword::NoKeyword,
12683 ..
12684 }) => Ok(value),
12685 Token::SingleQuotedString(s) => Ok(s),
12686 Token::DoubleQuotedString(s) => Ok(s),
12687 Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12688 Ok(s)
12689 }
12690 Token::UnicodeStringLiteral(s) => Ok(s),
12691 _ => self.expected("literal string", next_token),
12692 }
12693 }
12694
12695 pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12697 match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12698 Some(Keyword::TRUE) => Ok(true),
12699 Some(Keyword::FALSE) => Ok(false),
12700 _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12701 }
12702 }
12703
12704 pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12706 let neg = self.parse_keyword(Keyword::NOT);
12707 let normalized_form = self.maybe_parse(|parser| {
12708 match parser.parse_one_of_keywords(&[
12709 Keyword::NFC,
12710 Keyword::NFD,
12711 Keyword::NFKC,
12712 Keyword::NFKD,
12713 ]) {
12714 Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12715 Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12716 Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12717 Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12718 _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12719 }
12720 })?;
12721 if self.parse_keyword(Keyword::NORMALIZED) {
12722 return Ok(Expr::IsNormalized {
12723 expr: Box::new(expr),
12724 form: normalized_form,
12725 negated: neg,
12726 });
12727 }
12728 self.expected_ref("unicode normalization form", self.peek_token_ref())
12729 }
12730
12731 pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12733 self.expect_token(&Token::LParen)?;
12734 let values = self.parse_comma_separated(|parser| {
12735 let name = parser.parse_literal_string()?;
12736 let e = if parser.consume_token(&Token::Eq) {
12737 let value = parser.parse_number()?;
12738 EnumMember::NamedValue(name, value)
12739 } else {
12740 EnumMember::Name(name)
12741 };
12742 Ok(e)
12743 })?;
12744 self.expect_token(&Token::RParen)?;
12745
12746 Ok(values)
12747 }
12748
12749 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12751 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12752 if trailing_bracket.0 {
12753 return parser_err!(
12754 format!("unmatched > after parsing data type {ty}"),
12755 self.peek_token_ref()
12756 );
12757 }
12758
12759 Ok(ty)
12760 }
12761
12762 fn parse_data_type_helper(
12763 &mut self,
12764 ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12765 let dialect = self.dialect;
12766 self.advance_token();
12767 let next_token = self.get_current_token();
12768 let next_token_index = self.get_current_index();
12769
12770 let mut trailing_bracket: MatchedTrailingBracket = false.into();
12771 let mut data = match &next_token.token {
12772 Token::Word(w) => match w.keyword {
12773 Keyword::BOOLEAN => Ok(DataType::Boolean),
12774 Keyword::BOOL => Ok(DataType::Bool),
12775 Keyword::FLOAT => {
12776 let precision = self.parse_exact_number_optional_precision_scale()?;
12777
12778 if self.parse_keyword(Keyword::UNSIGNED) {
12779 Ok(DataType::FloatUnsigned(precision))
12780 } else {
12781 Ok(DataType::Float(precision))
12782 }
12783 }
12784 Keyword::REAL => {
12785 if self.parse_keyword(Keyword::UNSIGNED) {
12786 Ok(DataType::RealUnsigned)
12787 } else {
12788 Ok(DataType::Real)
12789 }
12790 }
12791 Keyword::FLOAT4 => Ok(DataType::Float4),
12792 Keyword::FLOAT32 => Ok(DataType::Float32),
12793 Keyword::FLOAT64 => Ok(DataType::Float64),
12794 Keyword::FLOAT8 => Ok(DataType::Float8),
12795 Keyword::DOUBLE => {
12796 if self.parse_keyword(Keyword::PRECISION) {
12797 if self.parse_keyword(Keyword::UNSIGNED) {
12798 Ok(DataType::DoublePrecisionUnsigned)
12799 } else {
12800 Ok(DataType::DoublePrecision)
12801 }
12802 } else {
12803 let precision = self.parse_exact_number_optional_precision_scale()?;
12804
12805 if self.parse_keyword(Keyword::UNSIGNED) {
12806 Ok(DataType::DoubleUnsigned(precision))
12807 } else {
12808 Ok(DataType::Double(precision))
12809 }
12810 }
12811 }
12812 Keyword::TINYINT => {
12813 let optional_precision = self.parse_optional_precision();
12814 if self.parse_keyword(Keyword::UNSIGNED) {
12815 Ok(DataType::TinyIntUnsigned(optional_precision?))
12816 } else {
12817 if dialect.supports_data_type_signed_suffix() {
12818 let _ = self.parse_keyword(Keyword::SIGNED);
12819 }
12820 Ok(DataType::TinyInt(optional_precision?))
12821 }
12822 }
12823 Keyword::INT2 => {
12824 let optional_precision = self.parse_optional_precision();
12825 if self.parse_keyword(Keyword::UNSIGNED) {
12826 Ok(DataType::Int2Unsigned(optional_precision?))
12827 } else {
12828 Ok(DataType::Int2(optional_precision?))
12829 }
12830 }
12831 Keyword::SMALLINT => {
12832 let optional_precision = self.parse_optional_precision();
12833 if self.parse_keyword(Keyword::UNSIGNED) {
12834 Ok(DataType::SmallIntUnsigned(optional_precision?))
12835 } else {
12836 if dialect.supports_data_type_signed_suffix() {
12837 let _ = self.parse_keyword(Keyword::SIGNED);
12838 }
12839 Ok(DataType::SmallInt(optional_precision?))
12840 }
12841 }
12842 Keyword::MEDIUMINT => {
12843 let optional_precision = self.parse_optional_precision();
12844 if self.parse_keyword(Keyword::UNSIGNED) {
12845 Ok(DataType::MediumIntUnsigned(optional_precision?))
12846 } else {
12847 if dialect.supports_data_type_signed_suffix() {
12848 let _ = self.parse_keyword(Keyword::SIGNED);
12849 }
12850 Ok(DataType::MediumInt(optional_precision?))
12851 }
12852 }
12853 Keyword::INT => {
12854 let optional_precision = self.parse_optional_precision();
12855 if self.parse_keyword(Keyword::UNSIGNED) {
12856 Ok(DataType::IntUnsigned(optional_precision?))
12857 } else {
12858 if dialect.supports_data_type_signed_suffix() {
12859 let _ = self.parse_keyword(Keyword::SIGNED);
12860 }
12861 Ok(DataType::Int(optional_precision?))
12862 }
12863 }
12864 Keyword::INT4 => {
12865 let optional_precision = self.parse_optional_precision();
12866 if self.parse_keyword(Keyword::UNSIGNED) {
12867 Ok(DataType::Int4Unsigned(optional_precision?))
12868 } else {
12869 Ok(DataType::Int4(optional_precision?))
12870 }
12871 }
12872 Keyword::INT8 => {
12873 let optional_precision = self.parse_optional_precision();
12874 if self.parse_keyword(Keyword::UNSIGNED) {
12875 Ok(DataType::Int8Unsigned(optional_precision?))
12876 } else {
12877 Ok(DataType::Int8(optional_precision?))
12878 }
12879 }
12880 Keyword::INT16 => Ok(DataType::Int16),
12881 Keyword::INT32 => Ok(DataType::Int32),
12882 Keyword::INT64 => Ok(DataType::Int64),
12883 Keyword::INT128 => Ok(DataType::Int128),
12884 Keyword::INT256 => Ok(DataType::Int256),
12885 Keyword::INTEGER => {
12886 let optional_precision = self.parse_optional_precision();
12887 if self.parse_keyword(Keyword::UNSIGNED) {
12888 Ok(DataType::IntegerUnsigned(optional_precision?))
12889 } else {
12890 if dialect.supports_data_type_signed_suffix() {
12891 let _ = self.parse_keyword(Keyword::SIGNED);
12892 }
12893 Ok(DataType::Integer(optional_precision?))
12894 }
12895 }
12896 Keyword::BIGINT => {
12897 let optional_precision = self.parse_optional_precision();
12898 if self.parse_keyword(Keyword::UNSIGNED) {
12899 Ok(DataType::BigIntUnsigned(optional_precision?))
12900 } else {
12901 if dialect.supports_data_type_signed_suffix() {
12902 let _ = self.parse_keyword(Keyword::SIGNED);
12903 }
12904 Ok(DataType::BigInt(optional_precision?))
12905 }
12906 }
12907 Keyword::HUGEINT => Ok(DataType::HugeInt),
12908 Keyword::UBIGINT => Ok(DataType::UBigInt),
12909 Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12910 Keyword::USMALLINT => Ok(DataType::USmallInt),
12911 Keyword::UTINYINT => Ok(DataType::UTinyInt),
12912 Keyword::UINT8 => Ok(DataType::UInt8),
12913 Keyword::UINT16 => Ok(DataType::UInt16),
12914 Keyword::UINT32 => Ok(DataType::UInt32),
12915 Keyword::UINT64 => Ok(DataType::UInt64),
12916 Keyword::UINT128 => Ok(DataType::UInt128),
12917 Keyword::UINT256 => Ok(DataType::UInt256),
12918 Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12919 Keyword::NVARCHAR => {
12920 Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12921 }
12922 Keyword::CHARACTER => {
12923 if self.parse_keyword(Keyword::VARYING) {
12924 Ok(DataType::CharacterVarying(
12925 self.parse_optional_character_length()?,
12926 ))
12927 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12928 Ok(DataType::CharacterLargeObject(
12929 self.parse_optional_precision()?,
12930 ))
12931 } else {
12932 Ok(DataType::Character(self.parse_optional_character_length()?))
12933 }
12934 }
12935 Keyword::CHAR => {
12936 if self.parse_keyword(Keyword::VARYING) {
12937 Ok(DataType::CharVarying(
12938 self.parse_optional_character_length()?,
12939 ))
12940 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12941 Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12942 } else {
12943 Ok(DataType::Char(self.parse_optional_character_length()?))
12944 }
12945 }
12946 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12947 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12948 Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12949 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12950 Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12951 Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12952 Keyword::LONGBLOB => Ok(DataType::LongBlob),
12953 Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12954 Ok(DataType::BigInt(None))
12955 }
12956 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12957 Keyword::BIT => {
12958 if self.parse_keyword(Keyword::VARYING) {
12959 Ok(DataType::BitVarying(self.parse_optional_precision()?))
12960 } else {
12961 Ok(DataType::Bit(self.parse_optional_precision()?))
12962 }
12963 }
12964 Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12965 Keyword::UUID => Ok(DataType::Uuid),
12966 Keyword::DATE => Ok(DataType::Date),
12967 Keyword::DATE32 => Ok(DataType::Date32),
12968 Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12969 Keyword::DATETIME64 => {
12970 self.prev_token();
12971 let (precision, time_zone) = self.parse_datetime_64()?;
12972 Ok(DataType::Datetime64(precision, time_zone))
12973 }
12974 Keyword::TIMESTAMP => {
12975 let precision = self.parse_optional_precision()?;
12976 let tz = if self.parse_keyword(Keyword::WITH) {
12977 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12978 TimezoneInfo::WithTimeZone
12979 } else if self.parse_keyword(Keyword::WITHOUT) {
12980 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12981 TimezoneInfo::WithoutTimeZone
12982 } else {
12983 TimezoneInfo::None
12984 };
12985 Ok(DataType::Timestamp(precision, tz))
12986 }
12987 Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
12988 self.parse_optional_precision()?,
12989 TimezoneInfo::Tz,
12990 )),
12991 Keyword::TIMESTAMP_NTZ => {
12992 Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
12993 }
12994 Keyword::TIME => {
12995 let precision = self.parse_optional_precision()?;
12996 let tz = if self.parse_keyword(Keyword::WITH) {
12997 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12998 TimezoneInfo::WithTimeZone
12999 } else if self.parse_keyword(Keyword::WITHOUT) {
13000 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13001 TimezoneInfo::WithoutTimeZone
13002 } else {
13003 TimezoneInfo::None
13004 };
13005 Ok(DataType::Time(precision, tz))
13006 }
13007 Keyword::TIMETZ => Ok(DataType::Time(
13008 self.parse_optional_precision()?,
13009 TimezoneInfo::Tz,
13010 )),
13011 Keyword::INTERVAL => {
13012 if self.dialect.supports_interval_options() {
13013 let fields = self.maybe_parse_optional_interval_fields()?;
13014 let precision = self.parse_optional_precision()?;
13015 Ok(DataType::Interval { fields, precision })
13016 } else {
13017 Ok(DataType::Interval {
13018 fields: None,
13019 precision: None,
13020 })
13021 }
13022 }
13023 Keyword::JSON => Ok(DataType::JSON),
13024 Keyword::JSONB => Ok(DataType::JSONB),
13025 Keyword::REGCLASS => Ok(DataType::Regclass),
13026 Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
13027 Keyword::FIXEDSTRING => {
13028 self.expect_token(&Token::LParen)?;
13029 let character_length = self.parse_literal_uint()?;
13030 self.expect_token(&Token::RParen)?;
13031 Ok(DataType::FixedString(character_length))
13032 }
13033 Keyword::TEXT => {
13034 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13035 Ok(DataType::Custom(
13036 ObjectName::from(vec![Ident::new("TEXT")]),
13037 modifiers,
13038 ))
13039 } else {
13040 Ok(DataType::Text)
13041 }
13042 }
13043 Keyword::TINYTEXT => Ok(DataType::TinyText),
13044 Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
13045 Keyword::LONGTEXT => Ok(DataType::LongText),
13046 Keyword::BYTEA => Ok(DataType::Bytea),
13047 Keyword::NUMERIC => Ok(DataType::Numeric(
13048 self.parse_exact_number_optional_precision_scale()?,
13049 )),
13050 Keyword::DECIMAL => {
13051 let precision = self.parse_exact_number_optional_precision_scale()?;
13052
13053 if self.parse_keyword(Keyword::UNSIGNED) {
13054 Ok(DataType::DecimalUnsigned(precision))
13055 } else {
13056 Ok(DataType::Decimal(precision))
13057 }
13058 }
13059 Keyword::DEC => {
13060 let precision = self.parse_exact_number_optional_precision_scale()?;
13061
13062 if self.parse_keyword(Keyword::UNSIGNED) {
13063 Ok(DataType::DecUnsigned(precision))
13064 } else {
13065 Ok(DataType::Dec(precision))
13066 }
13067 }
13068 Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
13069 self.parse_exact_number_optional_precision_scale()?,
13070 )),
13071 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
13072 self.parse_exact_number_optional_precision_scale()?,
13073 )),
13074 Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
13075 Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
13076 Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
13077 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
13078 Keyword::ARRAY => {
13079 if self.dialect.supports_array_typedef_without_element_type() {
13080 Ok(DataType::Array(ArrayElemTypeDef::None))
13081 } else if dialect_of!(self is ClickHouseDialect) {
13082 Ok(self.parse_sub_type(|internal_type| {
13083 DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
13084 })?)
13085 } else {
13086 self.expect_token(&Token::Lt)?;
13087 let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
13088 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13089 Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
13090 inside_type,
13091 ))))
13092 }
13093 }
13094 Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
13095 self.prev_token();
13096 let field_defs = self.parse_duckdb_struct_type_def()?;
13097 Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
13098 }
13099 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
13100 self.prev_token();
13101 let (field_defs, _trailing_bracket) =
13102 self.parse_struct_type_def(Self::parse_struct_field_def)?;
13103 trailing_bracket = _trailing_bracket;
13104 Ok(DataType::Struct(
13105 field_defs,
13106 StructBracketKind::AngleBrackets,
13107 ))
13108 }
13109 Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
13110 self.prev_token();
13111 let fields = self.parse_union_type_def()?;
13112 Ok(DataType::Union(fields))
13113 }
13114 Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13115 Ok(self.parse_sub_type(DataType::Nullable)?)
13116 }
13117 Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13118 Ok(self.parse_sub_type(DataType::LowCardinality)?)
13119 }
13120 Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
13121 self.expect_token(&Token::Lt)?;
13122 let key_data_type = self.parse_data_type()?;
13123 self.expect_token(&Token::Comma)?;
13124 let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
13125 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13126 Ok(DataType::Map(
13127 Box::new(key_data_type),
13128 Box::new(value_data_type),
13129 MapBracketKind::AngleBrackets,
13130 ))
13131 }
13132 Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13133 self.prev_token();
13134 let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
13135 Ok(DataType::Map(
13136 Box::new(key_data_type),
13137 Box::new(value_data_type),
13138 MapBracketKind::Parentheses,
13139 ))
13140 }
13141 Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13142 self.expect_token(&Token::LParen)?;
13143 let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
13144 self.expect_token(&Token::RParen)?;
13145 Ok(DataType::Nested(field_defs))
13146 }
13147 Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13148 self.prev_token();
13149 let field_defs = self.parse_click_house_tuple_def()?;
13150 Ok(DataType::Tuple(field_defs))
13151 }
13152 Keyword::TRIGGER => Ok(DataType::Trigger),
13153 Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
13154 let _ = self.parse_keyword(Keyword::TYPE);
13155 Ok(DataType::AnyType)
13156 }
13157 Keyword::TABLE => {
13158 if self.peek_token_ref().token == Token::LParen {
13161 let columns = self.parse_returns_table_columns()?;
13162 Ok(DataType::Table(Some(columns)))
13163 } else {
13164 Ok(DataType::Table(None))
13165 }
13166 }
13167 Keyword::SIGNED => {
13168 if self.parse_keyword(Keyword::INTEGER) {
13169 Ok(DataType::SignedInteger)
13170 } else {
13171 Ok(DataType::Signed)
13172 }
13173 }
13174 Keyword::UNSIGNED => {
13175 if self.parse_keyword(Keyword::INTEGER) {
13176 Ok(DataType::UnsignedInteger)
13177 } else {
13178 Ok(DataType::Unsigned)
13179 }
13180 }
13181 Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13182 Ok(DataType::TsVector)
13183 }
13184 Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13185 Ok(DataType::TsQuery)
13186 }
13187 _ => {
13188 self.prev_token();
13189 let type_name = self.parse_object_name(false)?;
13190 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13191 Ok(DataType::Custom(type_name, modifiers))
13192 } else {
13193 Ok(DataType::Custom(type_name, vec![]))
13194 }
13195 }
13196 },
13197 _ => self.expected_at("a data type name", next_token_index),
13198 }?;
13199
13200 if self.dialect.supports_array_typedef_with_brackets() {
13201 while self.consume_token(&Token::LBracket) {
13202 let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13204 self.expect_token(&Token::RBracket)?;
13205 data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
13206 }
13207 }
13208 Ok((data, trailing_bracket))
13209 }
13210
13211 fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
13212 self.parse_column_def()
13213 }
13214
13215 fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
13216 self.expect_token(&Token::LParen)?;
13217 let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
13218 self.expect_token(&Token::RParen)?;
13219 Ok(columns)
13220 }
13221
13222 pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
13224 self.expect_token(&Token::LParen)?;
13225 let mut values = Vec::new();
13226 loop {
13227 let next_token = self.next_token();
13228 match next_token.token {
13229 Token::SingleQuotedString(value) => values.push(value),
13230 _ => self.expected("a string", next_token)?,
13231 }
13232 let next_token = self.next_token();
13233 match next_token.token {
13234 Token::Comma => (),
13235 Token::RParen => break,
13236 _ => self.expected(", or }", next_token)?,
13237 }
13238 }
13239 Ok(values)
13240 }
13241
13242 pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13244 let ident = self.parse_identifier()?;
13245 self.expect_keyword_is(Keyword::AS)?;
13246 let alias = self.parse_identifier()?;
13247 Ok(IdentWithAlias { ident, alias })
13248 }
13249
13250 fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13252 let ident = self.parse_identifier()?;
13253 let _after_as = self.parse_keyword(Keyword::AS);
13254 let alias = self.parse_identifier()?;
13255 Ok(IdentWithAlias { ident, alias })
13256 }
13257
13258 fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
13260 self.parse_comma_separated(|parser| {
13261 parser.expect_token(&Token::LParen)?;
13262 let query = parser.parse_query()?;
13263 parser.expect_token(&Token::RParen)?;
13264 Ok(*query)
13265 })
13266 }
13267
13268 fn parse_distinct_required_set_quantifier(
13270 &mut self,
13271 operator_name: &str,
13272 ) -> Result<SetQuantifier, ParserError> {
13273 let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
13274 match quantifier {
13275 SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
13276 _ => Err(ParserError::ParserError(format!(
13277 "{operator_name} pipe operator requires DISTINCT modifier",
13278 ))),
13279 }
13280 }
13281
13282 fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13284 if self.parse_keyword(Keyword::AS) {
13285 Ok(Some(self.parse_identifier()?))
13286 } else {
13287 self.maybe_parse(|parser| parser.parse_identifier())
13289 }
13290 }
13291
13292 fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13294 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13295 parser.dialect.is_select_item_alias(explicit, kw, parser)
13296 }
13297 self.parse_optional_alias_inner(None, validator)
13298 }
13299
13300 pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
13304 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13305 parser.dialect.is_table_factor_alias(explicit, kw, parser)
13306 }
13307 let explicit = self.peek_keyword(Keyword::AS);
13308 match self.parse_optional_alias_inner(None, validator)? {
13309 Some(name) => {
13310 let columns = self.parse_table_alias_column_defs()?;
13311 let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
13312 Some(self.parse_identifier()?)
13313 } else {
13314 None
13315 };
13316 Ok(Some(TableAlias {
13317 explicit,
13318 name,
13319 columns,
13320 at,
13321 }))
13322 }
13323 None => Ok(None),
13324 }
13325 }
13326
13327 fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
13328 let mut hints = vec![];
13329 while let Some(hint_type) =
13330 self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
13331 {
13332 let hint_type = match hint_type {
13333 Keyword::USE => TableIndexHintType::Use,
13334 Keyword::IGNORE => TableIndexHintType::Ignore,
13335 Keyword::FORCE => TableIndexHintType::Force,
13336 _ => {
13337 return self.expected_ref(
13338 "expected to match USE/IGNORE/FORCE keyword",
13339 self.peek_token_ref(),
13340 )
13341 }
13342 };
13343 let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13344 Some(Keyword::INDEX) => TableIndexType::Index,
13345 Some(Keyword::KEY) => TableIndexType::Key,
13346 _ => {
13347 return self
13348 .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13349 }
13350 };
13351 let for_clause = if self.parse_keyword(Keyword::FOR) {
13352 let clause = if self.parse_keyword(Keyword::JOIN) {
13353 TableIndexHintForClause::Join
13354 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13355 TableIndexHintForClause::OrderBy
13356 } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13357 TableIndexHintForClause::GroupBy
13358 } else {
13359 return self.expected_ref(
13360 "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13361 self.peek_token_ref(),
13362 );
13363 };
13364 Some(clause)
13365 } else {
13366 None
13367 };
13368
13369 self.expect_token(&Token::LParen)?;
13370 let index_names = if self.peek_token_ref().token != Token::RParen {
13371 self.parse_comma_separated(Parser::parse_identifier)?
13372 } else {
13373 vec![]
13374 };
13375 self.expect_token(&Token::RParen)?;
13376 hints.push(TableIndexHints {
13377 hint_type,
13378 index_type,
13379 for_clause,
13380 index_names,
13381 });
13382 }
13383 Ok(hints)
13384 }
13385
13386 pub fn parse_optional_alias(
13390 &mut self,
13391 reserved_kwds: &[Keyword],
13392 ) -> Result<Option<Ident>, ParserError> {
13393 fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13394 false
13395 }
13396 self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13397 }
13398
13399 fn parse_optional_alias_inner<F>(
13406 &mut self,
13407 reserved_kwds: Option<&[Keyword]>,
13408 validator: F,
13409 ) -> Result<Option<Ident>, ParserError>
13410 where
13411 F: Fn(bool, &Keyword, &mut Parser) -> bool,
13412 {
13413 let after_as = self.parse_keyword(Keyword::AS);
13414
13415 let next_token = self.next_token();
13416 match next_token.token {
13417 Token::Word(w)
13420 if reserved_kwds.is_some()
13421 && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13422 {
13423 Ok(Some(w.into_ident(next_token.span)))
13424 }
13425 Token::Word(w) if validator(after_as, &w.keyword, self) => {
13429 Ok(Some(w.into_ident(next_token.span)))
13430 }
13431 Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13433 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13434 _ => {
13435 if after_as {
13436 return self.expected("an identifier after AS", next_token);
13437 }
13438 self.prev_token();
13439 Ok(None) }
13441 }
13442 }
13443
13444 pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13446 if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13447 let expressions = if self.parse_keyword(Keyword::ALL) {
13448 None
13449 } else {
13450 Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13451 };
13452
13453 let mut modifiers = vec![];
13454 if self.dialect.supports_group_by_with_modifier() {
13455 loop {
13456 if !self.parse_keyword(Keyword::WITH) {
13457 break;
13458 }
13459 let keyword = self.expect_one_of_keywords(&[
13460 Keyword::ROLLUP,
13461 Keyword::CUBE,
13462 Keyword::TOTALS,
13463 ])?;
13464 modifiers.push(match keyword {
13465 Keyword::ROLLUP => GroupByWithModifier::Rollup,
13466 Keyword::CUBE => GroupByWithModifier::Cube,
13467 Keyword::TOTALS => GroupByWithModifier::Totals,
13468 _ => {
13469 return parser_err!(
13470 "BUG: expected to match GroupBy modifier keyword",
13471 self.peek_token_ref().span.start
13472 )
13473 }
13474 });
13475 }
13476 }
13477 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13478 self.expect_token(&Token::LParen)?;
13479 let result = self.parse_comma_separated(|p| {
13480 if p.peek_token_ref().token == Token::LParen {
13481 p.parse_tuple(true, true)
13482 } else {
13483 Ok(vec![p.parse_expr()?])
13484 }
13485 })?;
13486 self.expect_token(&Token::RParen)?;
13487 modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13488 result,
13489 )));
13490 };
13491 let group_by = match expressions {
13492 None => GroupByExpr::All(modifiers),
13493 Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13494 };
13495 Ok(Some(group_by))
13496 } else {
13497 Ok(None)
13498 }
13499 }
13500
13501 pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13503 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13504 let order_by =
13505 if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13506 let order_by_options = self.parse_order_by_options()?;
13507 OrderBy {
13508 kind: OrderByKind::All(order_by_options),
13509 interpolate: None,
13510 }
13511 } else {
13512 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13513 let interpolate = if self.dialect.supports_interpolate() {
13514 self.parse_interpolations()?
13515 } else {
13516 None
13517 };
13518 OrderBy {
13519 kind: OrderByKind::Expressions(exprs),
13520 interpolate,
13521 }
13522 };
13523 Ok(Some(order_by))
13524 } else {
13525 Ok(None)
13526 }
13527 }
13528
13529 fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13530 let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13531 Some(self.parse_offset()?)
13532 } else {
13533 None
13534 };
13535
13536 let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13537 let expr = self.parse_limit()?;
13538
13539 if self.dialect.supports_limit_comma()
13540 && offset.is_none()
13541 && expr.is_some() && self.consume_token(&Token::Comma)
13543 {
13544 let offset = expr.ok_or_else(|| {
13545 ParserError::ParserError(
13546 "Missing offset for LIMIT <offset>, <limit>".to_string(),
13547 )
13548 })?;
13549 return Ok(Some(LimitClause::OffsetCommaLimit {
13550 offset,
13551 limit: self.parse_expr()?,
13552 }));
13553 }
13554
13555 let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13556 Some(self.parse_comma_separated(Parser::parse_expr)?)
13557 } else {
13558 None
13559 };
13560
13561 (Some(expr), limit_by)
13562 } else {
13563 (None, None)
13564 };
13565
13566 if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13567 offset = Some(self.parse_offset()?);
13568 }
13569
13570 if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13571 Ok(Some(LimitClause::LimitOffset {
13572 limit: limit.unwrap_or_default(),
13573 offset,
13574 limit_by: limit_by.unwrap_or_default(),
13575 }))
13576 } else {
13577 Ok(None)
13578 }
13579 }
13580
13581 pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13584 if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13585 let fn_name = self.parse_object_name(false)?;
13586 self.parse_function_call(fn_name)
13587 .map(TableObject::TableFunction)
13588 } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13589 self.parse_parenthesized(|p| p.parse_query())
13590 .map(TableObject::TableQuery)
13591 } else {
13592 self.parse_object_name(false).map(TableObject::TableName)
13593 }
13594 }
13595
13596 pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13603 self.parse_object_name_inner(in_table_clause, false)
13604 }
13605
13606 fn parse_object_name_inner(
13616 &mut self,
13617 in_table_clause: bool,
13618 allow_wildcards: bool,
13619 ) -> Result<ObjectName, ParserError> {
13620 let mut parts = vec![];
13621 if dialect_of!(self is BigQueryDialect) && in_table_clause {
13622 loop {
13623 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13624 parts.push(ObjectNamePart::Identifier(ident));
13625 if !self.consume_token(&Token::Period) && !end_with_period {
13626 break;
13627 }
13628 }
13629 } else {
13630 loop {
13631 if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13632 let span = self.next_token().span;
13633 parts.push(ObjectNamePart::Identifier(Ident {
13634 value: Token::Mul.to_string(),
13635 quote_style: None,
13636 span,
13637 }));
13638 } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13639 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13640 parts.push(ObjectNamePart::Identifier(ident));
13641 if !self.consume_token(&Token::Period) && !end_with_period {
13642 break;
13643 }
13644 } else if self.dialect.supports_object_name_double_dot_notation()
13645 && parts.len() == 1
13646 && matches!(self.peek_token_ref().token, Token::Period)
13647 {
13648 parts.push(ObjectNamePart::Identifier(Ident::new("")));
13650 } else {
13651 let ident = self.parse_identifier()?;
13652 let part = if self
13653 .dialect
13654 .is_identifier_generating_function_name(&ident, &parts)
13655 {
13656 self.expect_token(&Token::LParen)?;
13657 let args: Vec<FunctionArg> =
13658 self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13659 self.expect_token(&Token::RParen)?;
13660 ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13661 } else {
13662 ObjectNamePart::Identifier(ident)
13663 };
13664 parts.push(part);
13665 }
13666
13667 if !self.consume_token(&Token::Period) {
13668 break;
13669 }
13670 }
13671 }
13672
13673 if dialect_of!(self is BigQueryDialect)
13676 && parts.iter().any(|part| {
13677 part.as_ident()
13678 .is_some_and(|ident| ident.value.contains('.'))
13679 })
13680 {
13681 parts = parts
13682 .into_iter()
13683 .flat_map(|part| match part.as_ident() {
13684 Some(ident) => ident
13685 .value
13686 .split('.')
13687 .map(|value| {
13688 ObjectNamePart::Identifier(Ident {
13689 value: value.into(),
13690 quote_style: ident.quote_style,
13691 span: ident.span,
13692 })
13693 })
13694 .collect::<Vec<_>>(),
13695 None => vec![part],
13696 })
13697 .collect()
13698 }
13699
13700 Ok(ObjectName(parts))
13701 }
13702
13703 pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13705 let mut idents = vec![];
13706 loop {
13707 let token = self.peek_token_ref();
13708 match &token.token {
13709 Token::Word(w) => {
13710 idents.push(w.to_ident(token.span));
13711 }
13712 Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13713 break
13714 }
13715 _ => {}
13716 }
13717 self.advance_token();
13718 }
13719 Ok(idents)
13720 }
13721
13722 pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13762 let mut idents = vec![];
13763
13764 let next_token = self.next_token();
13766 match next_token.token {
13767 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13768 Token::EOF => {
13769 return Err(ParserError::ParserError(
13770 "Empty input when parsing identifier".to_string(),
13771 ))?
13772 }
13773 token => {
13774 return Err(ParserError::ParserError(format!(
13775 "Unexpected token in identifier: {token}"
13776 )))?
13777 }
13778 };
13779
13780 loop {
13782 match self.next_token().token {
13783 Token::Period => {
13785 let next_token = self.next_token();
13786 match next_token.token {
13787 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13788 Token::EOF => {
13789 return Err(ParserError::ParserError(
13790 "Trailing period in identifier".to_string(),
13791 ))?
13792 }
13793 token => {
13794 return Err(ParserError::ParserError(format!(
13795 "Unexpected token following period in identifier: {token}"
13796 )))?
13797 }
13798 }
13799 }
13800 Token::EOF => break,
13801 token => {
13802 return Err(ParserError::ParserError(format!(
13803 "Unexpected token in identifier: {token}"
13804 )))?;
13805 }
13806 }
13807 }
13808
13809 Ok(idents)
13810 }
13811
13812 pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13814 let next_token = self.next_token();
13815 match next_token.token {
13816 Token::Word(w) => Ok(w.into_ident(next_token.span)),
13817 Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13818 Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13819 _ => self.expected("identifier", next_token),
13820 }
13821 }
13822
13823 fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13834 match self.peek_token().token {
13835 Token::Word(w) => {
13836 let quote_style_is_none = w.quote_style.is_none();
13837 let mut requires_whitespace = false;
13838 let mut ident = w.into_ident(self.next_token().span);
13839 if quote_style_is_none {
13840 while matches!(self.peek_token_no_skip().token, Token::Minus) {
13841 self.next_token();
13842 ident.value.push('-');
13843
13844 let token = self
13845 .next_token_no_skip()
13846 .cloned()
13847 .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13848 requires_whitespace = match token.token {
13849 Token::Word(next_word) if next_word.quote_style.is_none() => {
13850 ident.value.push_str(&next_word.value);
13851 false
13852 }
13853 Token::Number(s, false) => {
13854 if s.ends_with('.') {
13861 let Some(s) = s.split('.').next().filter(|s| {
13862 !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13863 }) else {
13864 return self.expected(
13865 "continuation of hyphenated identifier",
13866 TokenWithSpan::new(Token::Number(s, false), token.span),
13867 );
13868 };
13869 ident.value.push_str(s);
13870 return Ok((ident, true));
13871 } else {
13872 ident.value.push_str(&s);
13873 }
13874 !matches!(self.peek_token_ref().token, Token::Period)
13877 }
13878 _ => {
13879 return self
13880 .expected("continuation of hyphenated identifier", token);
13881 }
13882 }
13883 }
13884
13885 if requires_whitespace {
13888 let token = self.next_token();
13889 if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13890 return self
13891 .expected("whitespace following hyphenated identifier", token);
13892 }
13893 }
13894 }
13895 Ok((ident, false))
13896 }
13897 _ => Ok((self.parse_identifier()?, false)),
13898 }
13899 }
13900
13901 fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13903 if self.consume_token(&Token::LParen) {
13904 if self.peek_token_ref().token == Token::RParen {
13905 self.next_token();
13906 Ok(vec![])
13907 } else {
13908 let cols = self.parse_comma_separated_with_trailing_commas(
13909 Parser::parse_view_column,
13910 self.dialect.supports_column_definition_trailing_commas(),
13911 Self::is_reserved_for_column_alias,
13912 )?;
13913 self.expect_token(&Token::RParen)?;
13914 Ok(cols)
13915 }
13916 } else {
13917 Ok(vec![])
13918 }
13919 }
13920
13921 fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13923 let name = self.parse_identifier()?;
13924 let options = self.parse_view_column_options()?;
13925 let data_type = if dialect_of!(self is ClickHouseDialect) {
13926 Some(self.parse_data_type()?)
13927 } else {
13928 None
13929 };
13930 Ok(ViewColumnDef {
13931 name,
13932 data_type,
13933 options,
13934 })
13935 }
13936
13937 fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13938 let mut options = Vec::new();
13939 loop {
13940 let option = self.parse_optional_column_option()?;
13941 if let Some(option) = option {
13942 options.push(option);
13943 } else {
13944 break;
13945 }
13946 }
13947 if options.is_empty() {
13948 Ok(None)
13949 } else if self.dialect.supports_space_separated_column_options() {
13950 Ok(Some(ColumnOptions::SpaceSeparated(options)))
13951 } else {
13952 Ok(Some(ColumnOptions::CommaSeparated(options)))
13953 }
13954 }
13955
13956 pub fn parse_parenthesized_column_list(
13959 &mut self,
13960 optional: IsOptional,
13961 allow_empty: bool,
13962 ) -> Result<Vec<Ident>, ParserError> {
13963 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
13964 }
13965
13966 pub fn parse_parenthesized_compound_identifier_list(
13968 &mut self,
13969 optional: IsOptional,
13970 allow_empty: bool,
13971 ) -> Result<Vec<Expr>, ParserError> {
13972 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13973 Ok(Expr::CompoundIdentifier(
13974 p.parse_period_separated(|p| p.parse_identifier())?,
13975 ))
13976 })
13977 }
13978
13979 fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
13982 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
13983 p.parse_create_index_expr()
13984 })
13985 }
13986
13987 pub fn parse_parenthesized_qualified_column_list(
13990 &mut self,
13991 optional: IsOptional,
13992 allow_empty: bool,
13993 ) -> Result<Vec<ObjectName>, ParserError> {
13994 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13995 p.parse_object_name(true)
13996 })
13997 }
13998
13999 fn parse_parenthesized_column_list_inner<F, T>(
14002 &mut self,
14003 optional: IsOptional,
14004 allow_empty: bool,
14005 mut f: F,
14006 ) -> Result<Vec<T>, ParserError>
14007 where
14008 F: FnMut(&mut Parser) -> Result<T, ParserError>,
14009 {
14010 if self.consume_token(&Token::LParen) {
14011 if allow_empty && self.peek_token_ref().token == Token::RParen {
14012 self.next_token();
14013 Ok(vec![])
14014 } else {
14015 let cols = self.parse_comma_separated(|p| f(p))?;
14016 self.expect_token(&Token::RParen)?;
14017 Ok(cols)
14018 }
14019 } else if optional == Optional {
14020 Ok(vec![])
14021 } else {
14022 self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
14023 }
14024 }
14025
14026 fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
14028 if self.consume_token(&Token::LParen) {
14029 let cols = self.parse_comma_separated(|p| {
14030 let name = p.parse_identifier()?;
14031 let data_type = p.maybe_parse(|p| p.parse_data_type())?;
14032 Ok(TableAliasColumnDef { name, data_type })
14033 })?;
14034 self.expect_token(&Token::RParen)?;
14035 Ok(cols)
14036 } else {
14037 Ok(vec![])
14038 }
14039 }
14040
14041 pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
14043 self.expect_token(&Token::LParen)?;
14044 let n = self.parse_literal_uint()?;
14045 self.expect_token(&Token::RParen)?;
14046 Ok(n)
14047 }
14048
14049 pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
14051 if self.consume_token(&Token::LParen) {
14052 let n = self.parse_literal_uint()?;
14053 self.expect_token(&Token::RParen)?;
14054 Ok(Some(n))
14055 } else {
14056 Ok(None)
14057 }
14058 }
14059
14060 fn maybe_parse_optional_interval_fields(
14061 &mut self,
14062 ) -> Result<Option<IntervalFields>, ParserError> {
14063 match self.parse_one_of_keywords(&[
14064 Keyword::YEAR,
14066 Keyword::DAY,
14067 Keyword::HOUR,
14068 Keyword::MINUTE,
14069 Keyword::MONTH,
14071 Keyword::SECOND,
14072 ]) {
14073 Some(Keyword::YEAR) => {
14074 if self.peek_keyword(Keyword::TO) {
14075 self.expect_keyword(Keyword::TO)?;
14076 self.expect_keyword(Keyword::MONTH)?;
14077 Ok(Some(IntervalFields::YearToMonth))
14078 } else {
14079 Ok(Some(IntervalFields::Year))
14080 }
14081 }
14082 Some(Keyword::DAY) => {
14083 if self.peek_keyword(Keyword::TO) {
14084 self.expect_keyword(Keyword::TO)?;
14085 match self.expect_one_of_keywords(&[
14086 Keyword::HOUR,
14087 Keyword::MINUTE,
14088 Keyword::SECOND,
14089 ])? {
14090 Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
14091 Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
14092 Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
14093 _ => {
14094 self.prev_token();
14095 self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
14096 }
14097 }
14098 } else {
14099 Ok(Some(IntervalFields::Day))
14100 }
14101 }
14102 Some(Keyword::HOUR) => {
14103 if self.peek_keyword(Keyword::TO) {
14104 self.expect_keyword(Keyword::TO)?;
14105 match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
14106 Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
14107 Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
14108 _ => {
14109 self.prev_token();
14110 self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
14111 }
14112 }
14113 } else {
14114 Ok(Some(IntervalFields::Hour))
14115 }
14116 }
14117 Some(Keyword::MINUTE) => {
14118 if self.peek_keyword(Keyword::TO) {
14119 self.expect_keyword(Keyword::TO)?;
14120 self.expect_keyword(Keyword::SECOND)?;
14121 Ok(Some(IntervalFields::MinuteToSecond))
14122 } else {
14123 Ok(Some(IntervalFields::Minute))
14124 }
14125 }
14126 Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
14127 Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
14128 Some(_) => {
14129 self.prev_token();
14130 self.expected_ref(
14131 "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
14132 self.peek_token_ref(),
14133 )
14134 }
14135 None => Ok(None),
14136 }
14137 }
14138
14139 pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
14147 self.expect_keyword_is(Keyword::DATETIME64)?;
14148 self.expect_token(&Token::LParen)?;
14149 let precision = self.parse_literal_uint()?;
14150 let time_zone = if self.consume_token(&Token::Comma) {
14151 Some(self.parse_literal_string()?)
14152 } else {
14153 None
14154 };
14155 self.expect_token(&Token::RParen)?;
14156 Ok((precision, time_zone))
14157 }
14158
14159 pub fn parse_optional_character_length(
14161 &mut self,
14162 ) -> Result<Option<CharacterLength>, ParserError> {
14163 if self.consume_token(&Token::LParen) {
14164 let character_length = self.parse_character_length()?;
14165 self.expect_token(&Token::RParen)?;
14166 Ok(Some(character_length))
14167 } else {
14168 Ok(None)
14169 }
14170 }
14171
14172 pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
14174 if self.consume_token(&Token::LParen) {
14175 let binary_length = self.parse_binary_length()?;
14176 self.expect_token(&Token::RParen)?;
14177 Ok(Some(binary_length))
14178 } else {
14179 Ok(None)
14180 }
14181 }
14182
14183 pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
14185 if self.parse_keyword(Keyword::MAX) {
14186 return Ok(CharacterLength::Max);
14187 }
14188 let length = self.parse_literal_uint()?;
14189 let unit = if self.parse_keyword(Keyword::CHARACTERS) {
14190 Some(CharLengthUnits::Characters)
14191 } else if self.parse_keyword(Keyword::OCTETS) {
14192 Some(CharLengthUnits::Octets)
14193 } else {
14194 None
14195 };
14196 Ok(CharacterLength::IntegerLength { length, unit })
14197 }
14198
14199 pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
14201 if self.parse_keyword(Keyword::MAX) {
14202 return Ok(BinaryLength::Max);
14203 }
14204 let length = self.parse_literal_uint()?;
14205 Ok(BinaryLength::IntegerLength { length })
14206 }
14207
14208 pub fn parse_optional_precision_scale(
14210 &mut self,
14211 ) -> Result<(Option<u64>, Option<u64>), ParserError> {
14212 if self.consume_token(&Token::LParen) {
14213 let n = self.parse_literal_uint()?;
14214 let scale = if self.consume_token(&Token::Comma) {
14215 Some(self.parse_literal_uint()?)
14216 } else {
14217 None
14218 };
14219 self.expect_token(&Token::RParen)?;
14220 Ok((Some(n), scale))
14221 } else {
14222 Ok((None, None))
14223 }
14224 }
14225
14226 pub fn parse_exact_number_optional_precision_scale(
14228 &mut self,
14229 ) -> Result<ExactNumberInfo, ParserError> {
14230 if self.consume_token(&Token::LParen) {
14231 let precision = self.parse_literal_uint()?;
14232 let scale = if self.consume_token(&Token::Comma) {
14233 Some(self.parse_signed_integer()?)
14234 } else {
14235 None
14236 };
14237
14238 self.expect_token(&Token::RParen)?;
14239
14240 match scale {
14241 None => Ok(ExactNumberInfo::Precision(precision)),
14242 Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
14243 }
14244 } else {
14245 Ok(ExactNumberInfo::None)
14246 }
14247 }
14248
14249 fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
14251 let is_negative = self.consume_token(&Token::Minus);
14252
14253 if !is_negative {
14254 let _ = self.consume_token(&Token::Plus);
14255 }
14256
14257 let current_token = self.peek_token_ref();
14258 match ¤t_token.token {
14259 Token::Number(s, _) => {
14260 let s = s.clone();
14261 let span_start = current_token.span.start;
14262 self.advance_token();
14263 let value = Self::parse::<i64>(s, span_start)?;
14264 Ok(if is_negative { -value } else { value })
14265 }
14266 _ => self.expected_ref("number", current_token),
14267 }
14268 }
14269
14270 pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
14272 if self.consume_token(&Token::LParen) {
14273 let mut modifiers = Vec::new();
14274 loop {
14275 let next_token = self.next_token();
14276 match next_token.token {
14277 Token::Word(w) => modifiers.push(w.to_string()),
14278 Token::Number(n, _) => modifiers.push(n),
14279 Token::SingleQuotedString(s) => modifiers.push(s),
14280
14281 Token::Comma => {
14282 continue;
14283 }
14284 Token::RParen => {
14285 break;
14286 }
14287 _ => self.expected("type modifiers", next_token)?,
14288 }
14289 }
14290
14291 Ok(Some(modifiers))
14292 } else {
14293 Ok(None)
14294 }
14295 }
14296
14297 fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
14299 where
14300 F: FnOnce(Box<DataType>) -> DataType,
14301 {
14302 self.expect_token(&Token::LParen)?;
14303 let inside_type = self.parse_data_type()?;
14304 self.expect_token(&Token::RParen)?;
14305 Ok(parent_type(inside_type.into()))
14306 }
14307
14308 fn parse_delete_setexpr_boxed(
14312 &mut self,
14313 delete_token: TokenWithSpan,
14314 ) -> Result<Box<SetExpr>, ParserError> {
14315 Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
14316 }
14317
14318 pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
14320 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14321 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
14322 if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
14325 (vec![], false)
14326 } else {
14327 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
14328 self.expect_keyword_is(Keyword::FROM)?;
14329 (tables, true)
14330 }
14331 } else {
14332 (vec![], true)
14333 };
14334
14335 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14336
14337 let output = self.maybe_parse_output_clause()?;
14338
14339 let using = if self.parse_keyword(Keyword::USING) {
14340 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14341 } else {
14342 None
14343 };
14344 let selection = if self.parse_keyword(Keyword::WHERE) {
14345 Some(self.parse_expr()?)
14346 } else {
14347 None
14348 };
14349 let returning = if self.parse_keyword(Keyword::RETURNING) {
14350 Some(self.parse_comma_separated(Parser::parse_select_item)?)
14351 } else {
14352 None
14353 };
14354 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14355 self.parse_comma_separated(Parser::parse_order_by_expr)?
14356 } else {
14357 vec![]
14358 };
14359 let limit = if self.parse_keyword(Keyword::LIMIT) {
14360 self.parse_limit()?
14361 } else {
14362 None
14363 };
14364
14365 Ok(Statement::Delete(Delete {
14366 delete_token: delete_token.into(),
14367 optimizer_hints,
14368 tables,
14369 from: if with_from_keyword {
14370 FromTable::WithFromKeyword(from)
14371 } else {
14372 FromTable::WithoutKeyword(from)
14373 },
14374 using,
14375 selection,
14376 returning,
14377 output,
14378 order_by,
14379 limit,
14380 }))
14381 }
14382
14383 pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14386 let modifier_keyword =
14387 self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14388
14389 let id = self.parse_literal_uint()?;
14390
14391 let modifier = match modifier_keyword {
14392 Some(Keyword::CONNECTION) => Some(KillType::Connection),
14393 Some(Keyword::QUERY) => Some(KillType::Query),
14394 Some(Keyword::MUTATION) => {
14395 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14396 Some(KillType::Mutation)
14397 } else {
14398 self.expected_ref(
14399 "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14400 self.peek_token_ref(),
14401 )?
14402 }
14403 }
14404 _ => None,
14405 };
14406
14407 Ok(Statement::Kill { modifier, id })
14408 }
14409
14410 pub fn parse_explain(
14412 &mut self,
14413 describe_alias: DescribeAlias,
14414 ) -> Result<Statement, ParserError> {
14415 let mut analyze = false;
14416 let mut verbose = false;
14417 let mut query_plan = false;
14418 let mut estimate = false;
14419 let mut format = None;
14420 let mut options = None;
14421
14422 if describe_alias == DescribeAlias::Explain
14425 && self.dialect.supports_explain_with_utility_options()
14426 && self.peek_token_ref().token == Token::LParen
14427 {
14428 options = Some(self.parse_utility_options()?)
14429 } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14430 query_plan = true;
14431 } else if self.parse_keyword(Keyword::ESTIMATE) {
14432 estimate = true;
14433 } else {
14434 analyze = self.parse_keyword(Keyword::ANALYZE);
14435 verbose = self.parse_keyword(Keyword::VERBOSE);
14436 if self.parse_keyword(Keyword::FORMAT) {
14437 format = Some(self.parse_analyze_format_kind()?);
14438 }
14439 }
14440
14441 match self.maybe_parse(|parser| parser.parse_statement())? {
14442 Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14443 ParserError::ParserError("Explain must be root of the plan".to_string()),
14444 ),
14445 Some(statement) => Ok(Statement::Explain {
14446 describe_alias,
14447 analyze,
14448 verbose,
14449 query_plan,
14450 estimate,
14451 statement: Box::new(statement),
14452 format,
14453 options,
14454 }),
14455 _ => {
14456 let hive_format =
14457 match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14458 Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14459 Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14460 _ => None,
14461 };
14462
14463 let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14464 self.parse_keyword(Keyword::TABLE)
14466 } else {
14467 false
14468 };
14469
14470 let table_name = self.parse_object_name(false)?;
14471 Ok(Statement::ExplainTable {
14472 describe_alias,
14473 hive_format,
14474 has_table_keyword,
14475 table_name,
14476 })
14477 }
14478 }
14479 }
14480
14481 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14486 pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14487 let _guard = self.recursion_counter.try_decrease()?;
14488 let with = if self.parse_keyword(Keyword::WITH) {
14489 let with_token = self.get_current_token();
14490 Some(With {
14491 with_token: with_token.clone().into(),
14492 recursive: self.parse_keyword(Keyword::RECURSIVE),
14493 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14494 })
14495 } else {
14496 None
14497 };
14498 if self.parse_keyword(Keyword::INSERT) {
14499 Ok(Query {
14500 with,
14501 body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14502 order_by: None,
14503 limit_clause: None,
14504 fetch: None,
14505 locks: vec![],
14506 for_clause: None,
14507 settings: None,
14508 format_clause: None,
14509 pipe_operators: vec![],
14510 }
14511 .into())
14512 } else if self.parse_keyword(Keyword::UPDATE) {
14513 Ok(Query {
14514 with,
14515 body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14516 order_by: None,
14517 limit_clause: None,
14518 fetch: None,
14519 locks: vec![],
14520 for_clause: None,
14521 settings: None,
14522 format_clause: None,
14523 pipe_operators: vec![],
14524 }
14525 .into())
14526 } else if self.parse_keyword(Keyword::DELETE) {
14527 Ok(Query {
14528 with,
14529 body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14530 limit_clause: None,
14531 order_by: None,
14532 fetch: None,
14533 locks: vec![],
14534 for_clause: None,
14535 settings: None,
14536 format_clause: None,
14537 pipe_operators: vec![],
14538 }
14539 .into())
14540 } else if self.parse_keyword(Keyword::MERGE) {
14541 Ok(Query {
14542 with,
14543 body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14544 limit_clause: None,
14545 order_by: None,
14546 fetch: None,
14547 locks: vec![],
14548 for_clause: None,
14549 settings: None,
14550 format_clause: None,
14551 pipe_operators: vec![],
14552 }
14553 .into())
14554 } else {
14555 let body = self.parse_query_body(self.dialect.prec_unknown())?;
14556
14557 let order_by = self.parse_optional_order_by()?;
14558
14559 let limit_clause = self.parse_optional_limit_clause()?;
14560
14561 let settings = self.parse_settings()?;
14562
14563 let fetch = if self.parse_keyword(Keyword::FETCH) {
14564 Some(self.parse_fetch()?)
14565 } else {
14566 None
14567 };
14568
14569 let mut for_clause = None;
14570 let mut locks = Vec::new();
14571 while self.parse_keyword(Keyword::FOR) {
14572 if let Some(parsed_for_clause) = self.parse_for_clause()? {
14573 for_clause = Some(parsed_for_clause);
14574 break;
14575 } else {
14576 locks.push(self.parse_lock()?);
14577 }
14578 }
14579 let format_clause =
14580 if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14581 if self.parse_keyword(Keyword::NULL) {
14582 Some(FormatClause::Null)
14583 } else {
14584 let ident = self.parse_identifier()?;
14585 Some(FormatClause::Identifier(ident))
14586 }
14587 } else {
14588 None
14589 };
14590
14591 let pipe_operators = if self.dialect.supports_pipe_operator() {
14592 self.parse_pipe_operators()?
14593 } else {
14594 Vec::new()
14595 };
14596
14597 Ok(Query {
14598 with,
14599 body,
14600 order_by,
14601 limit_clause,
14602 fetch,
14603 locks,
14604 for_clause,
14605 settings,
14606 format_clause,
14607 pipe_operators,
14608 }
14609 .into())
14610 }
14611 }
14612
14613 fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14614 let mut pipe_operators = Vec::new();
14615
14616 while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14617 let kw = self.expect_one_of_keywords(&[
14618 Keyword::SELECT,
14619 Keyword::EXTEND,
14620 Keyword::SET,
14621 Keyword::DROP,
14622 Keyword::AS,
14623 Keyword::WHERE,
14624 Keyword::LIMIT,
14625 Keyword::AGGREGATE,
14626 Keyword::ORDER,
14627 Keyword::TABLESAMPLE,
14628 Keyword::RENAME,
14629 Keyword::UNION,
14630 Keyword::INTERSECT,
14631 Keyword::EXCEPT,
14632 Keyword::CALL,
14633 Keyword::PIVOT,
14634 Keyword::UNPIVOT,
14635 Keyword::JOIN,
14636 Keyword::INNER,
14637 Keyword::LEFT,
14638 Keyword::RIGHT,
14639 Keyword::FULL,
14640 Keyword::CROSS,
14641 ])?;
14642 match kw {
14643 Keyword::SELECT => {
14644 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14645 pipe_operators.push(PipeOperator::Select { exprs })
14646 }
14647 Keyword::EXTEND => {
14648 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14649 pipe_operators.push(PipeOperator::Extend { exprs })
14650 }
14651 Keyword::SET => {
14652 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14653 pipe_operators.push(PipeOperator::Set { assignments })
14654 }
14655 Keyword::DROP => {
14656 let columns = self.parse_identifiers()?;
14657 pipe_operators.push(PipeOperator::Drop { columns })
14658 }
14659 Keyword::AS => {
14660 let alias = self.parse_identifier()?;
14661 pipe_operators.push(PipeOperator::As { alias })
14662 }
14663 Keyword::WHERE => {
14664 let expr = self.parse_expr()?;
14665 pipe_operators.push(PipeOperator::Where { expr })
14666 }
14667 Keyword::LIMIT => {
14668 let expr = self.parse_expr()?;
14669 let offset = if self.parse_keyword(Keyword::OFFSET) {
14670 Some(self.parse_expr()?)
14671 } else {
14672 None
14673 };
14674 pipe_operators.push(PipeOperator::Limit { expr, offset })
14675 }
14676 Keyword::AGGREGATE => {
14677 let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14678 vec![]
14679 } else {
14680 self.parse_comma_separated(|parser| {
14681 parser.parse_expr_with_alias_and_order_by()
14682 })?
14683 };
14684
14685 let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14686 self.parse_comma_separated(|parser| {
14687 parser.parse_expr_with_alias_and_order_by()
14688 })?
14689 } else {
14690 vec![]
14691 };
14692
14693 pipe_operators.push(PipeOperator::Aggregate {
14694 full_table_exprs,
14695 group_by_expr,
14696 })
14697 }
14698 Keyword::ORDER => {
14699 self.expect_one_of_keywords(&[Keyword::BY])?;
14700 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14701 pipe_operators.push(PipeOperator::OrderBy { exprs })
14702 }
14703 Keyword::TABLESAMPLE => {
14704 let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14705 pipe_operators.push(PipeOperator::TableSample { sample });
14706 }
14707 Keyword::RENAME => {
14708 let mappings =
14709 self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14710 pipe_operators.push(PipeOperator::Rename { mappings });
14711 }
14712 Keyword::UNION => {
14713 let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14714 let queries = self.parse_pipe_operator_queries()?;
14715 pipe_operators.push(PipeOperator::Union {
14716 set_quantifier,
14717 queries,
14718 });
14719 }
14720 Keyword::INTERSECT => {
14721 let set_quantifier =
14722 self.parse_distinct_required_set_quantifier("INTERSECT")?;
14723 let queries = self.parse_pipe_operator_queries()?;
14724 pipe_operators.push(PipeOperator::Intersect {
14725 set_quantifier,
14726 queries,
14727 });
14728 }
14729 Keyword::EXCEPT => {
14730 let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14731 let queries = self.parse_pipe_operator_queries()?;
14732 pipe_operators.push(PipeOperator::Except {
14733 set_quantifier,
14734 queries,
14735 });
14736 }
14737 Keyword::CALL => {
14738 let function_name = self.parse_object_name(false)?;
14739 let function_expr = self.parse_function(function_name)?;
14740 if let Expr::Function(function) = function_expr {
14741 let alias = self.parse_identifier_optional_alias()?;
14742 pipe_operators.push(PipeOperator::Call { function, alias });
14743 } else {
14744 return Err(ParserError::ParserError(
14745 "Expected function call after CALL".to_string(),
14746 ));
14747 }
14748 }
14749 Keyword::PIVOT => {
14750 self.expect_token(&Token::LParen)?;
14751 let aggregate_functions =
14752 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14753 self.expect_keyword_is(Keyword::FOR)?;
14754 let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14755 self.expect_keyword_is(Keyword::IN)?;
14756
14757 self.expect_token(&Token::LParen)?;
14758 let value_source = if self.parse_keyword(Keyword::ANY) {
14759 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14760 self.parse_comma_separated(Parser::parse_order_by_expr)?
14761 } else {
14762 vec![]
14763 };
14764 PivotValueSource::Any(order_by)
14765 } else if self.peek_sub_query() {
14766 PivotValueSource::Subquery(self.parse_query()?)
14767 } else {
14768 PivotValueSource::List(
14769 self.parse_comma_separated(Self::parse_expr_with_alias)?,
14770 )
14771 };
14772 self.expect_token(&Token::RParen)?;
14773 self.expect_token(&Token::RParen)?;
14774
14775 let alias = self.parse_identifier_optional_alias()?;
14776
14777 pipe_operators.push(PipeOperator::Pivot {
14778 aggregate_functions,
14779 value_column,
14780 value_source,
14781 alias,
14782 });
14783 }
14784 Keyword::UNPIVOT => {
14785 self.expect_token(&Token::LParen)?;
14786 let value_column = self.parse_identifier()?;
14787 self.expect_keyword(Keyword::FOR)?;
14788 let name_column = self.parse_identifier()?;
14789 self.expect_keyword(Keyword::IN)?;
14790
14791 self.expect_token(&Token::LParen)?;
14792 let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14793 self.expect_token(&Token::RParen)?;
14794
14795 self.expect_token(&Token::RParen)?;
14796
14797 let alias = self.parse_identifier_optional_alias()?;
14798
14799 pipe_operators.push(PipeOperator::Unpivot {
14800 value_column,
14801 name_column,
14802 unpivot_columns,
14803 alias,
14804 });
14805 }
14806 Keyword::JOIN
14807 | Keyword::INNER
14808 | Keyword::LEFT
14809 | Keyword::RIGHT
14810 | Keyword::FULL
14811 | Keyword::CROSS => {
14812 self.prev_token();
14813 let mut joins = self.parse_joins()?;
14814 if joins.len() != 1 {
14815 return Err(ParserError::ParserError(
14816 "Join pipe operator must have a single join".to_string(),
14817 ));
14818 }
14819 let join = joins.swap_remove(0);
14820 pipe_operators.push(PipeOperator::Join(join))
14821 }
14822 unhandled => {
14823 return Err(ParserError::ParserError(format!(
14824 "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14825 )))
14826 }
14827 }
14828 }
14829 Ok(pipe_operators)
14830 }
14831
14832 fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14833 let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14834 {
14835 let key_values = self.parse_comma_separated(|p| {
14836 let key = p.parse_identifier()?;
14837 p.expect_token(&Token::Eq)?;
14838 let value = p.parse_expr()?;
14839 Ok(Setting { key, value })
14840 })?;
14841 Some(key_values)
14842 } else {
14843 None
14844 };
14845 Ok(settings)
14846 }
14847
14848 pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14850 if self.parse_keyword(Keyword::XML) {
14851 Ok(Some(self.parse_for_xml()?))
14852 } else if self.parse_keyword(Keyword::JSON) {
14853 Ok(Some(self.parse_for_json()?))
14854 } else if self.parse_keyword(Keyword::BROWSE) {
14855 Ok(Some(ForClause::Browse))
14856 } else {
14857 Ok(None)
14858 }
14859 }
14860
14861 pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14863 let for_xml = if self.parse_keyword(Keyword::RAW) {
14864 let mut element_name = None;
14865 if self.peek_token_ref().token == Token::LParen {
14866 self.expect_token(&Token::LParen)?;
14867 element_name = Some(self.parse_literal_string()?);
14868 self.expect_token(&Token::RParen)?;
14869 }
14870 ForXml::Raw(element_name)
14871 } else if self.parse_keyword(Keyword::AUTO) {
14872 ForXml::Auto
14873 } else if self.parse_keyword(Keyword::EXPLICIT) {
14874 ForXml::Explicit
14875 } else if self.parse_keyword(Keyword::PATH) {
14876 let mut element_name = None;
14877 if self.peek_token_ref().token == Token::LParen {
14878 self.expect_token(&Token::LParen)?;
14879 element_name = Some(self.parse_literal_string()?);
14880 self.expect_token(&Token::RParen)?;
14881 }
14882 ForXml::Path(element_name)
14883 } else {
14884 return Err(ParserError::ParserError(
14885 "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14886 ));
14887 };
14888 let mut elements = false;
14889 let mut binary_base64 = false;
14890 let mut root = None;
14891 let mut r#type = false;
14892 while self.peek_token_ref().token == Token::Comma {
14893 self.next_token();
14894 if self.parse_keyword(Keyword::ELEMENTS) {
14895 elements = true;
14896 } else if self.parse_keyword(Keyword::BINARY) {
14897 self.expect_keyword_is(Keyword::BASE64)?;
14898 binary_base64 = true;
14899 } else if self.parse_keyword(Keyword::ROOT) {
14900 self.expect_token(&Token::LParen)?;
14901 root = Some(self.parse_literal_string()?);
14902 self.expect_token(&Token::RParen)?;
14903 } else if self.parse_keyword(Keyword::TYPE) {
14904 r#type = true;
14905 }
14906 }
14907 Ok(ForClause::Xml {
14908 for_xml,
14909 elements,
14910 binary_base64,
14911 root,
14912 r#type,
14913 })
14914 }
14915
14916 pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14918 let for_json = if self.parse_keyword(Keyword::AUTO) {
14919 ForJson::Auto
14920 } else if self.parse_keyword(Keyword::PATH) {
14921 ForJson::Path
14922 } else {
14923 return Err(ParserError::ParserError(
14924 "Expected FOR JSON [AUTO | PATH ]".to_string(),
14925 ));
14926 };
14927 let mut root = None;
14928 let mut include_null_values = false;
14929 let mut without_array_wrapper = false;
14930 while self.peek_token_ref().token == Token::Comma {
14931 self.next_token();
14932 if self.parse_keyword(Keyword::ROOT) {
14933 self.expect_token(&Token::LParen)?;
14934 root = Some(self.parse_literal_string()?);
14935 self.expect_token(&Token::RParen)?;
14936 } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14937 include_null_values = true;
14938 } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14939 without_array_wrapper = true;
14940 }
14941 }
14942 Ok(ForClause::Json {
14943 for_json,
14944 root,
14945 include_null_values,
14946 without_array_wrapper,
14947 })
14948 }
14949
14950 pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
14952 let name = self.parse_identifier()?;
14953
14954 let as_optional = self.dialect.supports_cte_without_as();
14955
14956 if as_optional && !self.peek_keyword(Keyword::AS) {
14958 if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
14959 p.expect_token(&Token::LParen)?;
14960 let query = p.parse_query()?;
14961 let closing_paren_token = p.expect_token(&Token::RParen)?;
14962 Ok((query, closing_paren_token))
14963 })? {
14964 let mut cte = Cte {
14965 alias: TableAlias {
14966 explicit: false,
14967 name,
14968 columns: vec![],
14969 at: None,
14970 },
14971 query,
14972 from: None,
14973 materialized: None,
14974 closing_paren_token: closing_paren_token.into(),
14975 };
14976 if self.parse_keyword(Keyword::FROM) {
14977 cte.from = Some(self.parse_identifier()?);
14978 }
14979 return Ok(cte);
14980 }
14981 }
14982
14983 let columns = if self.parse_keyword(Keyword::AS) {
14985 vec![]
14986 } else {
14987 let columns = self.parse_table_alias_column_defs()?;
14988 if as_optional {
14989 let _ = self.parse_keyword(Keyword::AS);
14990 } else {
14991 self.expect_keyword_is(Keyword::AS)?;
14992 }
14993 columns
14994 };
14995
14996 let mut is_materialized = None;
14997 if dialect_of!(self is PostgreSqlDialect) {
14998 if self.parse_keyword(Keyword::MATERIALIZED) {
14999 is_materialized = Some(CteAsMaterialized::Materialized);
15000 } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
15001 is_materialized = Some(CteAsMaterialized::NotMaterialized);
15002 }
15003 }
15004
15005 self.expect_token(&Token::LParen)?;
15006 let query = self.parse_query()?;
15007 let closing_paren_token = self.expect_token(&Token::RParen)?;
15008
15009 let mut cte = Cte {
15010 alias: TableAlias {
15011 explicit: false,
15012 name,
15013 columns,
15014 at: None,
15015 },
15016 query,
15017 from: None,
15018 materialized: is_materialized,
15019 closing_paren_token: closing_paren_token.into(),
15020 };
15021 if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
15022 cte.from = Some(self.parse_identifier()?);
15023 }
15024 Ok(cte)
15025 }
15026
15027 pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
15036 let expr = if self.peek_keyword(Keyword::SELECT)
15039 || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
15040 {
15041 SetExpr::Select(self.parse_select().map(Box::new)?)
15042 } else if self.consume_token(&Token::LParen) {
15043 let subquery = self.parse_query()?;
15045 self.expect_token(&Token::RParen)?;
15046 SetExpr::Query(subquery)
15047 } else if self.parse_keyword(Keyword::VALUES) {
15048 let is_mysql = dialect_of!(self is MySqlDialect);
15049 SetExpr::Values(self.parse_values(is_mysql, false)?)
15050 } else if self.parse_keyword(Keyword::VALUE) {
15051 let is_mysql = dialect_of!(self is MySqlDialect);
15052 SetExpr::Values(self.parse_values(is_mysql, true)?)
15053 } else if self.parse_keyword(Keyword::TABLE) {
15054 SetExpr::Table(Box::new(self.parse_as_table()?))
15055 } else {
15056 return self.expected_ref(
15057 "SELECT, VALUES, or a subquery in the query body",
15058 self.peek_token_ref(),
15059 );
15060 };
15061
15062 self.parse_remaining_set_exprs(expr, precedence)
15063 }
15064
15065 fn parse_remaining_set_exprs(
15069 &mut self,
15070 mut expr: SetExpr,
15071 precedence: u8,
15072 ) -> Result<Box<SetExpr>, ParserError> {
15073 loop {
15074 let op = self.parse_set_operator(&self.peek_token().token);
15076 let next_precedence = match op {
15077 Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
15079 10
15080 }
15081 Some(SetOperator::Intersect) => 20,
15083 None => break,
15085 };
15086 if precedence >= next_precedence {
15087 break;
15088 }
15089 self.next_token(); let set_quantifier = self.parse_set_quantifier(&op);
15091 expr = SetExpr::SetOperation {
15092 left: Box::new(expr),
15093 op: op.unwrap(),
15094 set_quantifier,
15095 right: self.parse_query_body(next_precedence)?,
15096 };
15097 }
15098
15099 Ok(expr.into())
15100 }
15101
15102 pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
15104 match token {
15105 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
15106 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
15107 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
15108 Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
15109 _ => None,
15110 }
15111 }
15112
15113 pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
15115 match op {
15116 Some(
15117 SetOperator::Except
15118 | SetOperator::Intersect
15119 | SetOperator::Union
15120 | SetOperator::Minus,
15121 ) => {
15122 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
15123 SetQuantifier::DistinctByName
15124 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15125 SetQuantifier::ByName
15126 } else if self.parse_keyword(Keyword::ALL) {
15127 if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15128 SetQuantifier::AllByName
15129 } else {
15130 SetQuantifier::All
15131 }
15132 } else if self.parse_keyword(Keyword::DISTINCT) {
15133 SetQuantifier::Distinct
15134 } else {
15135 SetQuantifier::None
15136 }
15137 }
15138 _ => SetQuantifier::None,
15139 }
15140 }
15141
15142 pub fn parse_select(&mut self) -> Result<Select, ParserError> {
15144 let mut from_first = None;
15145
15146 if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
15147 let from_token = self.expect_keyword(Keyword::FROM)?;
15148 let from = self.parse_table_with_joins()?;
15149 if !self.peek_keyword(Keyword::SELECT) {
15150 return Ok(Select {
15151 select_token: AttachedToken(from_token),
15152 optimizer_hints: vec![],
15153 distinct: None,
15154 select_modifiers: None,
15155 top: None,
15156 top_before_distinct: false,
15157 projection: vec![],
15158 exclude: None,
15159 into: None,
15160 from,
15161 lateral_views: vec![],
15162 prewhere: None,
15163 selection: None,
15164 group_by: GroupByExpr::Expressions(vec![], vec![]),
15165 cluster_by: vec![],
15166 distribute_by: vec![],
15167 sort_by: vec![],
15168 having: None,
15169 named_window: vec![],
15170 window_before_qualify: false,
15171 qualify: None,
15172 value_table_mode: None,
15173 connect_by: vec![],
15174 flavor: SelectFlavor::FromFirstNoSelect,
15175 });
15176 }
15177 from_first = Some(from);
15178 }
15179
15180 let select_token = self.expect_keyword(Keyword::SELECT)?;
15181 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
15182 let value_table_mode = self.parse_value_table_mode()?;
15183
15184 let (select_modifiers, distinct_select_modifier) =
15185 if self.dialect.supports_select_modifiers() {
15186 self.parse_select_modifiers()?
15187 } else {
15188 (None, None)
15189 };
15190
15191 let mut top_before_distinct = false;
15192 let mut top = None;
15193 if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15194 top = Some(self.parse_top()?);
15195 top_before_distinct = true;
15196 }
15197
15198 let distinct = if distinct_select_modifier.is_some() {
15199 distinct_select_modifier
15200 } else {
15201 self.parse_all_or_distinct()?
15202 };
15203
15204 if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15205 top = Some(self.parse_top()?);
15206 }
15207
15208 let projection =
15209 if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
15210 vec![]
15211 } else {
15212 self.parse_projection()?
15213 };
15214
15215 let exclude = if self.dialect.supports_select_exclude() {
15216 self.parse_optional_select_item_exclude()?
15217 } else {
15218 None
15219 };
15220
15221 let into = if self.parse_keyword(Keyword::INTO) {
15222 Some(self.parse_select_into()?)
15223 } else {
15224 None
15225 };
15226
15227 let (from, from_first) = if let Some(from) = from_first.take() {
15233 (from, true)
15234 } else if self.parse_keyword(Keyword::FROM) {
15235 (self.parse_table_with_joins()?, false)
15236 } else {
15237 (vec![], false)
15238 };
15239
15240 let mut lateral_views = vec![];
15241 loop {
15242 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
15243 let outer = self.parse_keyword(Keyword::OUTER);
15244 let lateral_view = self.parse_expr()?;
15245 let lateral_view_name = self.parse_object_name(false)?;
15246 let lateral_col_alias = self
15247 .parse_comma_separated(|parser| {
15248 parser.parse_optional_alias(&[
15249 Keyword::WHERE,
15250 Keyword::GROUP,
15251 Keyword::CLUSTER,
15252 Keyword::HAVING,
15253 Keyword::LATERAL,
15254 ]) })?
15256 .into_iter()
15257 .flatten()
15258 .collect();
15259
15260 lateral_views.push(LateralView {
15261 lateral_view,
15262 lateral_view_name,
15263 lateral_col_alias,
15264 outer,
15265 });
15266 } else {
15267 break;
15268 }
15269 }
15270
15271 let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
15272 {
15273 Some(self.parse_expr()?)
15274 } else {
15275 None
15276 };
15277
15278 let selection = if self.parse_keyword(Keyword::WHERE) {
15279 Some(self.parse_expr()?)
15280 } else {
15281 None
15282 };
15283
15284 let connect_by = self.maybe_parse_connect_by()?;
15285
15286 let group_by = self
15287 .parse_optional_group_by()?
15288 .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
15289
15290 let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
15291 self.parse_comma_separated(Parser::parse_expr)?
15292 } else {
15293 vec![]
15294 };
15295
15296 let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
15297 self.parse_comma_separated(Parser::parse_expr)?
15298 } else {
15299 vec![]
15300 };
15301
15302 let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
15303 self.parse_comma_separated(Parser::parse_order_by_expr)?
15304 } else {
15305 vec![]
15306 };
15307
15308 let having = if self.parse_keyword(Keyword::HAVING) {
15309 Some(self.parse_expr()?)
15310 } else {
15311 None
15312 };
15313
15314 let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
15316 {
15317 let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
15318 if self.parse_keyword(Keyword::QUALIFY) {
15319 (named_windows, Some(self.parse_expr()?), true)
15320 } else {
15321 (named_windows, None, true)
15322 }
15323 } else if self.parse_keyword(Keyword::QUALIFY) {
15324 let qualify = Some(self.parse_expr()?);
15325 if self.parse_keyword(Keyword::WINDOW) {
15326 (
15327 self.parse_comma_separated(Parser::parse_named_window)?,
15328 qualify,
15329 false,
15330 )
15331 } else {
15332 (Default::default(), qualify, false)
15333 }
15334 } else {
15335 Default::default()
15336 };
15337
15338 Ok(Select {
15339 select_token: AttachedToken(select_token),
15340 optimizer_hints,
15341 distinct,
15342 select_modifiers,
15343 top,
15344 top_before_distinct,
15345 projection,
15346 exclude,
15347 into,
15348 from,
15349 lateral_views,
15350 prewhere,
15351 selection,
15352 group_by,
15353 cluster_by,
15354 distribute_by,
15355 sort_by,
15356 having,
15357 named_window: named_windows,
15358 window_before_qualify,
15359 qualify,
15360 value_table_mode,
15361 connect_by,
15362 flavor: if from_first {
15363 SelectFlavor::FromFirst
15364 } else {
15365 SelectFlavor::Standard
15366 },
15367 })
15368 }
15369
15370 fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15379 let supports_hints = self.dialect.supports_comment_optimizer_hint();
15380 if !supports_hints {
15381 return Ok(vec![]);
15382 }
15383 let mut hints = vec![];
15384 loop {
15385 let t = self.peek_nth_token_no_skip_ref(0);
15386 let Token::Whitespace(ws) = &t.token else {
15387 break;
15388 };
15389 match ws {
15390 Whitespace::SingleLineComment { comment, prefix } => {
15391 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15392 hints.push(OptimizerHint {
15393 prefix: hint_prefix,
15394 text,
15395 style: OptimizerHintStyle::SingleLine {
15396 prefix: prefix.clone(),
15397 },
15398 });
15399 }
15400 self.next_token_no_skip();
15401 }
15402 Whitespace::MultiLineComment(comment) => {
15403 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15404 hints.push(OptimizerHint {
15405 prefix: hint_prefix,
15406 text,
15407 style: OptimizerHintStyle::MultiLine,
15408 });
15409 }
15410 self.next_token_no_skip();
15411 }
15412 Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15413 self.next_token_no_skip();
15414 }
15415 }
15416 }
15417 Ok(hints)
15418 }
15419
15420 fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15423 let (before_plus, text) = comment.split_once('+')?;
15424 if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15425 Some((before_plus.to_string(), text.to_string()))
15426 } else {
15427 None
15428 }
15429 }
15430
15431 fn parse_select_modifiers(
15438 &mut self,
15439 ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15440 let mut modifiers = SelectModifiers::default();
15441 let mut distinct = None;
15442
15443 let keywords = &[
15444 Keyword::ALL,
15445 Keyword::DISTINCT,
15446 Keyword::DISTINCTROW,
15447 Keyword::HIGH_PRIORITY,
15448 Keyword::STRAIGHT_JOIN,
15449 Keyword::SQL_SMALL_RESULT,
15450 Keyword::SQL_BIG_RESULT,
15451 Keyword::SQL_BUFFER_RESULT,
15452 Keyword::SQL_NO_CACHE,
15453 Keyword::SQL_CALC_FOUND_ROWS,
15454 ];
15455
15456 while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15457 match keyword {
15458 Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15459 self.prev_token();
15460 distinct = self.parse_all_or_distinct()?;
15461 }
15462 Keyword::DISTINCTROW if distinct.is_none() => {
15464 distinct = Some(Distinct::Distinct);
15465 }
15466 Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15467 Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15468 Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15469 Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15470 Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15471 Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15472 Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15473 _ => {
15474 self.prev_token();
15475 return self.expected_ref(
15476 "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15477 self.peek_token_ref(),
15478 );
15479 }
15480 }
15481 }
15482
15483 let select_modifiers = if modifiers.is_any_set() {
15486 Some(modifiers)
15487 } else {
15488 None
15489 };
15490 Ok((select_modifiers, distinct))
15491 }
15492
15493 fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15494 if !dialect_of!(self is BigQueryDialect) {
15495 return Ok(None);
15496 }
15497
15498 let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15499 Some(ValueTableMode::DistinctAsValue)
15500 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15501 Some(ValueTableMode::DistinctAsStruct)
15502 } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15503 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15504 {
15505 Some(ValueTableMode::AsValue)
15506 } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15507 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15508 {
15509 Some(ValueTableMode::AsStruct)
15510 } else if self.parse_keyword(Keyword::AS) {
15511 self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15512 } else {
15513 None
15514 };
15515
15516 Ok(mode)
15517 }
15518
15519 fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15523 where
15524 F: FnMut(&mut Parser) -> Result<T, ParserError>,
15525 {
15526 let current_state = self.state;
15527 self.state = state;
15528 let res = f(self);
15529 self.state = current_state;
15530 res
15531 }
15532
15533 pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15535 let mut clauses = Vec::with_capacity(2);
15536 loop {
15537 if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15538 clauses.push(ConnectByKind::StartWith {
15539 start_token: self.token_at(idx).clone().into(),
15540 condition: self.parse_expr()?.into(),
15541 });
15542 } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15543 {
15544 clauses.push(ConnectByKind::ConnectBy {
15545 connect_token: self.token_at(idx).clone().into(),
15546 nocycle: self.parse_keyword(Keyword::NOCYCLE),
15547 relationships: self.with_state(ParserState::ConnectBy, |parser| {
15548 parser.parse_comma_separated(Parser::parse_expr)
15549 })?,
15550 });
15551 } else {
15552 break;
15553 }
15554 }
15555 Ok(clauses)
15556 }
15557
15558 pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15560 let token1 = self.next_token();
15561 let token2 = self.next_token();
15562 let token3 = self.next_token();
15563
15564 let table_name;
15565 let schema_name;
15566 if token2 == Token::Period {
15567 match token1.token {
15568 Token::Word(w) => {
15569 schema_name = w.value;
15570 }
15571 _ => {
15572 return self.expected("Schema name", token1);
15573 }
15574 }
15575 match token3.token {
15576 Token::Word(w) => {
15577 table_name = w.value;
15578 }
15579 _ => {
15580 return self.expected("Table name", token3);
15581 }
15582 }
15583 Ok(Table {
15584 table_name: Some(table_name),
15585 schema_name: Some(schema_name),
15586 })
15587 } else {
15588 match token1.token {
15589 Token::Word(w) => {
15590 table_name = w.value;
15591 }
15592 _ => {
15593 return self.expected("Table name", token1);
15594 }
15595 }
15596 Ok(Table {
15597 table_name: Some(table_name),
15598 schema_name: None,
15599 })
15600 }
15601 }
15602
15603 fn parse_set_role(
15605 &mut self,
15606 modifier: Option<ContextModifier>,
15607 ) -> Result<Statement, ParserError> {
15608 self.expect_keyword_is(Keyword::ROLE)?;
15609
15610 let role_name = if self.parse_keyword(Keyword::NONE) {
15611 None
15612 } else {
15613 Some(self.parse_identifier()?)
15614 };
15615 Ok(Statement::Set(Set::SetRole {
15616 context_modifier: modifier,
15617 role_name,
15618 }))
15619 }
15620
15621 fn parse_set_values(
15622 &mut self,
15623 parenthesized_assignment: bool,
15624 ) -> Result<Vec<Expr>, ParserError> {
15625 let mut values = vec![];
15626
15627 if parenthesized_assignment {
15628 self.expect_token(&Token::LParen)?;
15629 }
15630
15631 loop {
15632 let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15633 expr
15634 } else if let Ok(expr) = self.parse_expr() {
15635 expr
15636 } else {
15637 self.expected_ref("variable value", self.peek_token_ref())?
15638 };
15639
15640 values.push(value);
15641 if self.consume_token(&Token::Comma) {
15642 continue;
15643 }
15644
15645 if parenthesized_assignment {
15646 self.expect_token(&Token::RParen)?;
15647 }
15648 return Ok(values);
15649 }
15650 }
15651
15652 fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15653 let modifier =
15654 self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15655
15656 Self::keyword_to_modifier(modifier)
15657 }
15658
15659 fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15661 let scope = self.parse_context_modifier();
15662
15663 let name = if self.dialect.supports_parenthesized_set_variables()
15664 && self.consume_token(&Token::LParen)
15665 {
15666 self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15670 } else {
15671 self.parse_object_name(false)?
15672 };
15673
15674 if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15675 return self.expected_ref("assignment operator", self.peek_token_ref());
15676 }
15677
15678 let value = self.parse_expr()?;
15679
15680 Ok(SetAssignment { scope, name, value })
15681 }
15682
15683 fn parse_set(&mut self) -> Result<Statement, ParserError> {
15684 let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15685
15686 let scope = if !hivevar {
15688 self.parse_context_modifier()
15689 } else {
15690 None
15691 };
15692
15693 if hivevar {
15694 self.expect_token(&Token::Colon)?;
15695 }
15696
15697 if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15698 return Ok(set_role_stmt);
15699 }
15700
15701 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15703 || self.parse_keyword(Keyword::TIMEZONE)
15704 {
15705 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15706 return Ok(Set::SingleAssignment {
15707 scope,
15708 hivevar,
15709 variable: ObjectName::from(vec!["TIMEZONE".into()]),
15710 values: self.parse_set_values(false)?,
15711 }
15712 .into());
15713 } else {
15714 return Ok(Set::SetTimeZone {
15718 local: scope == Some(ContextModifier::Local),
15719 value: self.parse_expr()?,
15720 }
15721 .into());
15722 }
15723 } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15724 if self.parse_keyword(Keyword::DEFAULT) {
15725 return Ok(Set::SetNamesDefault {}.into());
15726 }
15727 let charset_name = self.parse_identifier()?;
15728 let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15729 Some(self.parse_literal_string()?)
15730 } else {
15731 None
15732 };
15733
15734 return Ok(Set::SetNames {
15735 charset_name,
15736 collation_name,
15737 }
15738 .into());
15739 } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15740 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15741 return Ok(Set::SetTransaction {
15742 modes: self.parse_transaction_modes()?,
15743 snapshot: None,
15744 session: true,
15745 }
15746 .into());
15747 } else if self.parse_keyword(Keyword::TRANSACTION) {
15748 if self.parse_keyword(Keyword::SNAPSHOT) {
15749 let snapshot_id = self.parse_value()?;
15750 return Ok(Set::SetTransaction {
15751 modes: vec![],
15752 snapshot: Some(snapshot_id),
15753 session: false,
15754 }
15755 .into());
15756 }
15757 return Ok(Set::SetTransaction {
15758 modes: self.parse_transaction_modes()?,
15759 snapshot: None,
15760 session: false,
15761 }
15762 .into());
15763 } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15764 let scope = match scope {
15765 Some(s) => s,
15766 None => {
15767 return self.expected_at(
15768 "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15769 self.get_current_index(),
15770 )
15771 }
15772 };
15773 let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15774 SetSessionAuthorizationParamKind::Default
15775 } else {
15776 let value = self.parse_identifier()?;
15777 SetSessionAuthorizationParamKind::User(value)
15778 };
15779 return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15780 scope,
15781 kind: auth_value,
15782 })
15783 .into());
15784 }
15785
15786 if self.dialect.supports_comma_separated_set_assignments() {
15787 if scope.is_some() {
15788 self.prev_token();
15789 }
15790
15791 if let Some(assignments) = self
15792 .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15793 {
15794 return if assignments.len() > 1 {
15795 Ok(Set::MultipleAssignments { assignments }.into())
15796 } else {
15797 let SetAssignment { scope, name, value } =
15798 assignments.into_iter().next().ok_or_else(|| {
15799 ParserError::ParserError("Expected at least one assignment".to_string())
15800 })?;
15801
15802 Ok(Set::SingleAssignment {
15803 scope,
15804 hivevar,
15805 variable: name,
15806 values: vec![value],
15807 }
15808 .into())
15809 };
15810 }
15811 }
15812
15813 let variables = if self.dialect.supports_parenthesized_set_variables()
15814 && self.consume_token(&Token::LParen)
15815 {
15816 let vars = OneOrManyWithParens::Many(
15817 self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15818 .into_iter()
15819 .map(|ident| ObjectName::from(vec![ident]))
15820 .collect(),
15821 );
15822 self.expect_token(&Token::RParen)?;
15823 vars
15824 } else {
15825 OneOrManyWithParens::One(self.parse_object_name(false)?)
15826 };
15827
15828 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15829 let stmt = match variables {
15830 OneOrManyWithParens::One(var) => Set::SingleAssignment {
15831 scope,
15832 hivevar,
15833 variable: var,
15834 values: self.parse_set_values(false)?,
15835 },
15836 OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15837 variables: vars,
15838 values: self.parse_set_values(true)?,
15839 },
15840 };
15841
15842 return Ok(stmt.into());
15843 }
15844
15845 if self.dialect.supports_set_stmt_without_operator() {
15846 self.prev_token();
15847 return self.parse_set_session_params();
15848 };
15849
15850 self.expected_ref("equals sign or TO", self.peek_token_ref())
15851 }
15852
15853 pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15855 if self.parse_keyword(Keyword::STATISTICS) {
15856 let topic = match self.parse_one_of_keywords(&[
15857 Keyword::IO,
15858 Keyword::PROFILE,
15859 Keyword::TIME,
15860 Keyword::XML,
15861 ]) {
15862 Some(Keyword::IO) => SessionParamStatsTopic::IO,
15863 Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15864 Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15865 Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15866 _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15867 };
15868 let value = self.parse_session_param_value()?;
15869 Ok(
15870 Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15871 topic,
15872 value,
15873 }))
15874 .into(),
15875 )
15876 } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15877 let obj = self.parse_object_name(false)?;
15878 let value = self.parse_session_param_value()?;
15879 Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15880 SetSessionParamIdentityInsert { obj, value },
15881 ))
15882 .into())
15883 } else if self.parse_keyword(Keyword::OFFSETS) {
15884 let keywords = self.parse_comma_separated(|parser| {
15885 let next_token = parser.next_token();
15886 match &next_token.token {
15887 Token::Word(w) => Ok(w.to_string()),
15888 _ => parser.expected("SQL keyword", next_token),
15889 }
15890 })?;
15891 let value = self.parse_session_param_value()?;
15892 Ok(
15893 Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15894 keywords,
15895 value,
15896 }))
15897 .into(),
15898 )
15899 } else {
15900 let names = self.parse_comma_separated(|parser| {
15901 let next_token = parser.next_token();
15902 match next_token.token {
15903 Token::Word(w) => Ok(w.to_string()),
15904 _ => parser.expected("Session param name", next_token),
15905 }
15906 })?;
15907 let value = self.parse_expr()?.to_string();
15908 Ok(
15909 Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15910 names,
15911 value,
15912 }))
15913 .into(),
15914 )
15915 }
15916 }
15917
15918 fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15919 if self.parse_keyword(Keyword::ON) {
15920 Ok(SessionParamValue::On)
15921 } else if self.parse_keyword(Keyword::OFF) {
15922 Ok(SessionParamValue::Off)
15923 } else {
15924 self.expected_ref("ON or OFF", self.peek_token_ref())
15925 }
15926 }
15927
15928 pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15930 let terse = self.parse_keyword(Keyword::TERSE);
15931 let extended = self.parse_keyword(Keyword::EXTENDED);
15932 let full = self.parse_keyword(Keyword::FULL);
15933 let session = self.parse_keyword(Keyword::SESSION);
15934 let global = self.parse_keyword(Keyword::GLOBAL);
15935 let external = self.parse_keyword(Keyword::EXTERNAL);
15936 if self
15937 .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15938 .is_some()
15939 {
15940 Ok(self.parse_show_columns(extended, full)?)
15941 } else if self.parse_keyword(Keyword::TABLES) {
15942 Ok(self.parse_show_tables(terse, extended, full, external)?)
15943 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15944 Ok(self.parse_show_views(terse, true)?)
15945 } else if self.parse_keyword(Keyword::VIEWS) {
15946 Ok(self.parse_show_views(terse, false)?)
15947 } else if self.parse_keyword(Keyword::FUNCTIONS) {
15948 Ok(self.parse_show_functions()?)
15949 } else if self.parse_keyword(Keyword::PROCESSLIST) {
15950 Ok(Statement::ShowProcessList { full })
15951 } else if extended || full {
15952 Err(ParserError::ParserError(
15953 "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
15954 ))
15955 } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
15956 Ok(self.parse_show_create()?)
15957 } else if self.parse_keyword(Keyword::COLLATION) {
15958 Ok(self.parse_show_collation()?)
15959 } else if self.parse_keyword(Keyword::VARIABLES)
15960 && dialect_of!(self is MySqlDialect | GenericDialect)
15961 {
15962 Ok(Statement::ShowVariables {
15963 filter: self.parse_show_statement_filter()?,
15964 session,
15965 global,
15966 })
15967 } else if self.parse_keyword(Keyword::STATUS)
15968 && dialect_of!(self is MySqlDialect | GenericDialect)
15969 {
15970 Ok(Statement::ShowStatus {
15971 filter: self.parse_show_statement_filter()?,
15972 session,
15973 global,
15974 })
15975 } else if self.parse_keyword(Keyword::CATALOGS) {
15976 self.parse_show_catalogs(terse)
15977 } else if self.parse_keyword(Keyword::DATABASES) {
15978 self.parse_show_databases(terse)
15979 } else if self.parse_keyword(Keyword::SCHEMAS) {
15980 self.parse_show_schemas(terse)
15981 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
15982 self.parse_show_charset(false)
15983 } else if self.parse_keyword(Keyword::CHARSET) {
15984 self.parse_show_charset(true)
15985 } else {
15986 Ok(Statement::ShowVariable {
15987 variable: self.parse_identifiers()?,
15988 })
15989 }
15990 }
15991
15992 fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
15993 Ok(Statement::ShowCharset(ShowCharset {
15995 is_shorthand,
15996 filter: self.parse_show_statement_filter()?,
15997 }))
15998 }
15999
16000 fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
16001 let history = self.parse_keyword(Keyword::HISTORY);
16002 let show_options = self.parse_show_stmt_options()?;
16003 Ok(Statement::ShowCatalogs {
16004 terse,
16005 history,
16006 show_options,
16007 })
16008 }
16009
16010 fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
16011 let history = self.parse_keyword(Keyword::HISTORY);
16012 let show_options = self.parse_show_stmt_options()?;
16013 Ok(Statement::ShowDatabases {
16014 terse,
16015 history,
16016 show_options,
16017 })
16018 }
16019
16020 fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
16021 let history = self.parse_keyword(Keyword::HISTORY);
16022 let show_options = self.parse_show_stmt_options()?;
16023 Ok(Statement::ShowSchemas {
16024 terse,
16025 history,
16026 show_options,
16027 })
16028 }
16029
16030 pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
16032 let obj_type = match self.expect_one_of_keywords(&[
16033 Keyword::TABLE,
16034 Keyword::TRIGGER,
16035 Keyword::FUNCTION,
16036 Keyword::PROCEDURE,
16037 Keyword::EVENT,
16038 Keyword::VIEW,
16039 ])? {
16040 Keyword::TABLE => Ok(ShowCreateObject::Table),
16041 Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
16042 Keyword::FUNCTION => Ok(ShowCreateObject::Function),
16043 Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
16044 Keyword::EVENT => Ok(ShowCreateObject::Event),
16045 Keyword::VIEW => Ok(ShowCreateObject::View),
16046 keyword => Err(ParserError::ParserError(format!(
16047 "Unable to map keyword to ShowCreateObject: {keyword:?}"
16048 ))),
16049 }?;
16050
16051 let obj_name = self.parse_object_name(false)?;
16052
16053 Ok(Statement::ShowCreate { obj_type, obj_name })
16054 }
16055
16056 pub fn parse_show_columns(
16058 &mut self,
16059 extended: bool,
16060 full: bool,
16061 ) -> Result<Statement, ParserError> {
16062 let show_options = self.parse_show_stmt_options()?;
16063 Ok(Statement::ShowColumns {
16064 extended,
16065 full,
16066 show_options,
16067 })
16068 }
16069
16070 fn parse_show_tables(
16071 &mut self,
16072 terse: bool,
16073 extended: bool,
16074 full: bool,
16075 external: bool,
16076 ) -> Result<Statement, ParserError> {
16077 let history = !external && self.parse_keyword(Keyword::HISTORY);
16078 let show_options = self.parse_show_stmt_options()?;
16079 Ok(Statement::ShowTables {
16080 terse,
16081 history,
16082 extended,
16083 full,
16084 external,
16085 show_options,
16086 })
16087 }
16088
16089 fn parse_show_views(
16090 &mut self,
16091 terse: bool,
16092 materialized: bool,
16093 ) -> Result<Statement, ParserError> {
16094 let show_options = self.parse_show_stmt_options()?;
16095 Ok(Statement::ShowViews {
16096 materialized,
16097 terse,
16098 show_options,
16099 })
16100 }
16101
16102 pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
16104 let filter = self.parse_show_statement_filter()?;
16105 Ok(Statement::ShowFunctions { filter })
16106 }
16107
16108 pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
16110 let filter = self.parse_show_statement_filter()?;
16111 Ok(Statement::ShowCollation { filter })
16112 }
16113
16114 pub fn parse_show_statement_filter(
16116 &mut self,
16117 ) -> Result<Option<ShowStatementFilter>, ParserError> {
16118 if self.parse_keyword(Keyword::LIKE) {
16119 Ok(Some(ShowStatementFilter::Like(
16120 self.parse_literal_string()?,
16121 )))
16122 } else if self.parse_keyword(Keyword::ILIKE) {
16123 Ok(Some(ShowStatementFilter::ILike(
16124 self.parse_literal_string()?,
16125 )))
16126 } else if self.parse_keyword(Keyword::WHERE) {
16127 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
16128 } else {
16129 self.maybe_parse(|parser| -> Result<String, ParserError> {
16130 parser.parse_literal_string()
16131 })?
16132 .map_or(Ok(None), |filter| {
16133 Ok(Some(ShowStatementFilter::NoKeyword(filter)))
16134 })
16135 }
16136 }
16137
16138 pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
16140 let parsed_keyword = if dialect_of!(self is HiveDialect) {
16142 if self.parse_keyword(Keyword::DEFAULT) {
16144 return Ok(Statement::Use(Use::Default));
16145 }
16146 None } else if dialect_of!(self is DatabricksDialect) {
16148 self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
16149 } else if dialect_of!(self is SnowflakeDialect) {
16150 self.parse_one_of_keywords(&[
16151 Keyword::DATABASE,
16152 Keyword::SCHEMA,
16153 Keyword::WAREHOUSE,
16154 Keyword::ROLE,
16155 Keyword::SECONDARY,
16156 ])
16157 } else {
16158 None };
16160
16161 let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
16162 self.parse_secondary_roles()?
16163 } else {
16164 let obj_name = self.parse_object_name(false)?;
16165 match parsed_keyword {
16166 Some(Keyword::CATALOG) => Use::Catalog(obj_name),
16167 Some(Keyword::DATABASE) => Use::Database(obj_name),
16168 Some(Keyword::SCHEMA) => Use::Schema(obj_name),
16169 Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
16170 Some(Keyword::ROLE) => Use::Role(obj_name),
16171 _ => Use::Object(obj_name),
16172 }
16173 };
16174
16175 Ok(Statement::Use(result))
16176 }
16177
16178 fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
16179 self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
16180 if self.parse_keyword(Keyword::NONE) {
16181 Ok(Use::SecondaryRoles(SecondaryRoles::None))
16182 } else if self.parse_keyword(Keyword::ALL) {
16183 Ok(Use::SecondaryRoles(SecondaryRoles::All))
16184 } else {
16185 let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
16186 Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
16187 }
16188 }
16189
16190 pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
16192 let relation = self.parse_table_factor()?;
16193 let joins = self.parse_joins()?;
16197 Ok(TableWithJoins { relation, joins })
16198 }
16199
16200 fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
16201 let mut joins = vec![];
16202 loop {
16203 let global = self.parse_keyword(Keyword::GLOBAL);
16204 let join = if self.parse_keyword(Keyword::CROSS) {
16205 let join_operator = if self.parse_keyword(Keyword::JOIN) {
16206 JoinOperator::CrossJoin(JoinConstraint::None)
16207 } else if self.parse_keyword(Keyword::APPLY) {
16208 JoinOperator::CrossApply
16210 } else {
16211 return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
16212 };
16213 let relation = self.parse_table_factor()?;
16214 let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
16215 && self.dialect.supports_cross_join_constraint()
16216 {
16217 let constraint = self.parse_join_constraint(false)?;
16218 JoinOperator::CrossJoin(constraint)
16219 } else {
16220 join_operator
16221 };
16222 Join {
16223 relation,
16224 global,
16225 join_operator,
16226 }
16227 } else if self.parse_keyword(Keyword::OUTER) {
16228 self.expect_keyword_is(Keyword::APPLY)?;
16230 Join {
16231 relation: self.parse_table_factor()?,
16232 global,
16233 join_operator: JoinOperator::OuterApply,
16234 }
16235 } else if self.parse_keyword(Keyword::ASOF) {
16236 self.expect_keyword_is(Keyword::JOIN)?;
16237 let relation = self.parse_table_factor()?;
16238 self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
16239 let match_condition = self.parse_parenthesized(Self::parse_expr)?;
16240 Join {
16241 relation,
16242 global,
16243 join_operator: JoinOperator::AsOf {
16244 match_condition,
16245 constraint: self.parse_join_constraint(false)?,
16246 },
16247 }
16248 } else if self.dialect.supports_array_join_syntax()
16249 && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
16250 {
16251 Join {
16253 relation: self.parse_table_factor()?,
16254 global,
16255 join_operator: JoinOperator::InnerArrayJoin,
16256 }
16257 } else if self.dialect.supports_array_join_syntax()
16258 && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
16259 {
16260 Join {
16262 relation: self.parse_table_factor()?,
16263 global,
16264 join_operator: JoinOperator::LeftArrayJoin,
16265 }
16266 } else if self.dialect.supports_array_join_syntax()
16267 && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
16268 {
16269 Join {
16271 relation: self.parse_table_factor()?,
16272 global,
16273 join_operator: JoinOperator::ArrayJoin,
16274 }
16275 } else {
16276 let natural = self.parse_keyword(Keyword::NATURAL);
16277 let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
16278 w.keyword
16279 } else {
16280 Keyword::NoKeyword
16281 };
16282
16283 let join_operator_type = match peek_keyword {
16284 Keyword::INNER | Keyword::JOIN => {
16285 let inner = self.parse_keyword(Keyword::INNER); self.expect_keyword_is(Keyword::JOIN)?;
16287 if inner {
16288 JoinOperator::Inner
16289 } else {
16290 JoinOperator::Join
16291 }
16292 }
16293 kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
16294 let _ = self.next_token(); let is_left = kw == Keyword::LEFT;
16296 let join_type = self.parse_one_of_keywords(&[
16297 Keyword::OUTER,
16298 Keyword::SEMI,
16299 Keyword::ANTI,
16300 Keyword::JOIN,
16301 ]);
16302 match join_type {
16303 Some(Keyword::OUTER) => {
16304 self.expect_keyword_is(Keyword::JOIN)?;
16305 if is_left {
16306 JoinOperator::LeftOuter
16307 } else {
16308 JoinOperator::RightOuter
16309 }
16310 }
16311 Some(Keyword::SEMI) => {
16312 self.expect_keyword_is(Keyword::JOIN)?;
16313 if is_left {
16314 JoinOperator::LeftSemi
16315 } else {
16316 JoinOperator::RightSemi
16317 }
16318 }
16319 Some(Keyword::ANTI) => {
16320 self.expect_keyword_is(Keyword::JOIN)?;
16321 if is_left {
16322 JoinOperator::LeftAnti
16323 } else {
16324 JoinOperator::RightAnti
16325 }
16326 }
16327 Some(Keyword::JOIN) => {
16328 if is_left {
16329 JoinOperator::Left
16330 } else {
16331 JoinOperator::Right
16332 }
16333 }
16334 _ => {
16335 return Err(ParserError::ParserError(format!(
16336 "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16337 )))
16338 }
16339 }
16340 }
16341 Keyword::ANTI => {
16342 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16344 JoinOperator::Anti
16345 }
16346 Keyword::SEMI => {
16347 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16349 JoinOperator::Semi
16350 }
16351 Keyword::FULL => {
16352 let _ = self.next_token(); let _ = self.parse_keyword(Keyword::OUTER); self.expect_keyword_is(Keyword::JOIN)?;
16355 JoinOperator::FullOuter
16356 }
16357 Keyword::OUTER => {
16358 return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16359 }
16360 Keyword::STRAIGHT_JOIN => {
16361 let _ = self.next_token(); JoinOperator::StraightJoin
16363 }
16364 _ if natural => {
16365 return self
16366 .expected_ref("a join type after NATURAL", self.peek_token_ref());
16367 }
16368 _ => break,
16369 };
16370 let mut relation = self.parse_table_factor()?;
16371
16372 if !self
16373 .dialect
16374 .supports_left_associative_joins_without_parens()
16375 && !natural
16376 && self.peek_parens_less_nested_join()
16377 {
16378 let joins = self.parse_joins()?;
16379 relation = TableFactor::NestedJoin {
16380 table_with_joins: Box::new(TableWithJoins { relation, joins }),
16381 alias: None,
16382 };
16383 }
16384
16385 let join_constraint = self.parse_join_constraint(natural)?;
16386 Join {
16387 relation,
16388 global,
16389 join_operator: join_operator_type(join_constraint),
16390 }
16391 };
16392 joins.push(join);
16393 }
16394 Ok(joins)
16395 }
16396
16397 fn peek_parens_less_nested_join(&self) -> bool {
16398 matches!(
16399 self.peek_token_ref().token,
16400 Token::Word(Word {
16401 keyword: Keyword::JOIN
16402 | Keyword::INNER
16403 | Keyword::LEFT
16404 | Keyword::RIGHT
16405 | Keyword::FULL,
16406 ..
16407 })
16408 )
16409 }
16410
16411 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16413 pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16414 let _guard = self.recursion_counter.try_decrease()?;
16415 if self.parse_keyword(Keyword::LATERAL) {
16416 if self.consume_token(&Token::LParen) {
16418 self.parse_derived_table_factor(Lateral)
16419 } else {
16420 let name = self.parse_object_name(false)?;
16421 self.expect_token(&Token::LParen)?;
16422 let args = self.parse_optional_args()?;
16423 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16424 let alias = self.maybe_parse_table_alias()?;
16425 Ok(TableFactor::Function {
16426 lateral: true,
16427 name,
16428 args,
16429 with_ordinality,
16430 alias,
16431 })
16432 }
16433 } else if self.parse_keyword(Keyword::TABLE) {
16434 self.expect_token(&Token::LParen)?;
16436 let expr = self.parse_expr()?;
16437 self.expect_token(&Token::RParen)?;
16438 let alias = self.maybe_parse_table_alias()?;
16439 Ok(TableFactor::TableFunction { expr, alias })
16440 } else if self.consume_token(&Token::LParen) {
16441 let derived_pos = self.index;
16467 let derived = if self
16468 .failed_derived_table_factor_positions
16469 .contains(&derived_pos)
16470 {
16471 None
16472 } else {
16473 match self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))? {
16474 Some(t) => Some(t),
16475 None => {
16476 self.failed_derived_table_factor_positions
16477 .insert(derived_pos);
16478 None
16479 }
16480 }
16481 };
16482 if let Some(mut table) = derived {
16483 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16484 {
16485 table = match kw {
16486 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16487 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16488 unexpected_keyword => return Err(ParserError::ParserError(
16489 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16490 )),
16491 }
16492 }
16493 return Ok(table);
16494 }
16495
16496 let mut table_and_joins = self.parse_table_and_joins()?;
16503
16504 #[allow(clippy::if_same_then_else)]
16505 if !table_and_joins.joins.is_empty() {
16506 self.expect_token(&Token::RParen)?;
16507 let alias = self.maybe_parse_table_alias()?;
16508 Ok(TableFactor::NestedJoin {
16509 table_with_joins: Box::new(table_and_joins),
16510 alias,
16511 }) } else if let TableFactor::NestedJoin {
16513 table_with_joins: _,
16514 alias: _,
16515 } = &table_and_joins.relation
16516 {
16517 self.expect_token(&Token::RParen)?;
16520 let alias = self.maybe_parse_table_alias()?;
16521 Ok(TableFactor::NestedJoin {
16522 table_with_joins: Box::new(table_and_joins),
16523 alias,
16524 })
16525 } else if self.dialect.supports_parens_around_table_factor() {
16526 self.expect_token(&Token::RParen)?;
16533
16534 if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16535 match &mut table_and_joins.relation {
16538 TableFactor::Derived { alias, .. }
16539 | TableFactor::Table { alias, .. }
16540 | TableFactor::Function { alias, .. }
16541 | TableFactor::UNNEST { alias, .. }
16542 | TableFactor::JsonTable { alias, .. }
16543 | TableFactor::XmlTable { alias, .. }
16544 | TableFactor::OpenJsonTable { alias, .. }
16545 | TableFactor::TableFunction { alias, .. }
16546 | TableFactor::Pivot { alias, .. }
16547 | TableFactor::Unpivot { alias, .. }
16548 | TableFactor::MatchRecognize { alias, .. }
16549 | TableFactor::SemanticView { alias, .. }
16550 | TableFactor::NestedJoin { alias, .. } => {
16551 if let Some(inner_alias) = alias {
16553 return Err(ParserError::ParserError(format!(
16554 "duplicate alias {inner_alias}"
16555 )));
16556 }
16557 alias.replace(outer_alias);
16561 }
16562 };
16563 }
16564 Ok(table_and_joins.relation)
16566 } else {
16567 self.expected_ref("joined table", self.peek_token_ref())
16570 }
16571 } else if self.dialect.supports_values_as_table_factor()
16572 && matches!(
16573 self.peek_tokens(),
16574 [
16575 Token::Word(Word {
16576 keyword: Keyword::VALUES,
16577 ..
16578 }),
16579 Token::LParen
16580 ]
16581 )
16582 {
16583 self.expect_keyword_is(Keyword::VALUES)?;
16584
16585 let values = SetExpr::Values(self.parse_values(false, false)?);
16589 let alias = self.maybe_parse_table_alias()?;
16590 Ok(TableFactor::Derived {
16591 lateral: false,
16592 subquery: Box::new(Query {
16593 with: None,
16594 body: Box::new(values),
16595 order_by: None,
16596 limit_clause: None,
16597 fetch: None,
16598 locks: vec![],
16599 for_clause: None,
16600 settings: None,
16601 format_clause: None,
16602 pipe_operators: vec![],
16603 }),
16604 alias,
16605 sample: None,
16606 })
16607 } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16608 && self.parse_keyword(Keyword::UNNEST)
16609 {
16610 self.expect_token(&Token::LParen)?;
16611 let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16612 self.expect_token(&Token::RParen)?;
16613
16614 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16615 let alias = match self.maybe_parse_table_alias() {
16616 Ok(Some(alias)) => Some(alias),
16617 Ok(None) => None,
16618 Err(e) => return Err(e),
16619 };
16620
16621 let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16622 Ok(()) => true,
16623 Err(_) => false,
16624 };
16625
16626 let with_offset_alias = if with_offset {
16627 match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16628 Ok(Some(alias)) => Some(alias),
16629 Ok(None) => None,
16630 Err(e) => return Err(e),
16631 }
16632 } else {
16633 None
16634 };
16635
16636 Ok(TableFactor::UNNEST {
16637 alias,
16638 array_exprs,
16639 with_offset,
16640 with_offset_alias,
16641 with_ordinality,
16642 })
16643 } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16644 let json_expr = self.parse_expr()?;
16645 self.expect_token(&Token::Comma)?;
16646 let json_path = self.parse_value()?;
16647 self.expect_keyword_is(Keyword::COLUMNS)?;
16648 self.expect_token(&Token::LParen)?;
16649 let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16650 self.expect_token(&Token::RParen)?;
16651 self.expect_token(&Token::RParen)?;
16652 let alias = self.maybe_parse_table_alias()?;
16653 Ok(TableFactor::JsonTable {
16654 json_expr,
16655 json_path,
16656 columns,
16657 alias,
16658 })
16659 } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16660 self.prev_token();
16661 self.parse_open_json_table_factor()
16662 } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16663 self.prev_token();
16664 self.parse_xml_table_factor()
16665 } else if self.dialect.supports_semantic_view_table_factor()
16666 && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16667 {
16668 self.parse_semantic_view_table_factor()
16669 } else if self.peek_token_ref().token == Token::AtSign {
16670 self.parse_snowflake_stage_table_factor()
16672 } else {
16673 let name = self.parse_object_name(true)?;
16674
16675 let json_path = match &self.peek_token_ref().token {
16676 Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16677 _ => None,
16678 };
16679
16680 let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16681 && self.parse_keyword(Keyword::PARTITION)
16682 {
16683 self.parse_parenthesized_identifiers()?
16684 } else {
16685 vec![]
16686 };
16687
16688 let version = self.maybe_parse_table_version()?;
16690
16691 let args = if self.consume_token(&Token::LParen) {
16693 Some(self.parse_table_function_args()?)
16694 } else {
16695 None
16696 };
16697
16698 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16699
16700 let mut sample = None;
16701 if self.dialect.supports_table_sample_before_alias() {
16702 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16703 sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16704 }
16705 }
16706
16707 let alias = self.maybe_parse_table_alias()?;
16708
16709 let index_hints = if self.dialect.supports_table_hints() {
16711 self.maybe_parse(|p| p.parse_table_index_hints())?
16712 .unwrap_or(vec![])
16713 } else {
16714 vec![]
16715 };
16716
16717 let mut with_hints = vec![];
16719 if self.parse_keyword(Keyword::WITH) {
16720 if self.consume_token(&Token::LParen) {
16721 with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16722 self.expect_token(&Token::RParen)?;
16723 } else {
16724 self.prev_token();
16726 }
16727 };
16728
16729 if !self.dialect.supports_table_sample_before_alias() {
16730 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16731 sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16732 }
16733 }
16734
16735 let mut table = TableFactor::Table {
16736 name,
16737 alias,
16738 args,
16739 with_hints,
16740 version,
16741 partitions,
16742 with_ordinality,
16743 json_path,
16744 sample,
16745 index_hints,
16746 };
16747
16748 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16749 table = match kw {
16750 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16751 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16752 unexpected_keyword => return Err(ParserError::ParserError(
16753 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16754 )),
16755 }
16756 }
16757
16758 if self.dialect.supports_match_recognize()
16759 && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16760 {
16761 table = self.parse_match_recognize(table)?;
16762 }
16763
16764 Ok(table)
16765 }
16766 }
16767
16768 fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16773 let name = crate::dialect::parse_snowflake_stage_name(self)?;
16775
16776 let args = if self.consume_token(&Token::LParen) {
16778 Some(self.parse_table_function_args()?)
16779 } else {
16780 None
16781 };
16782
16783 let alias = self.maybe_parse_table_alias()?;
16784
16785 Ok(TableFactor::Table {
16786 name,
16787 alias,
16788 args,
16789 with_hints: vec![],
16790 version: None,
16791 partitions: vec![],
16792 with_ordinality: false,
16793 json_path: None,
16794 sample: None,
16795 index_hints: vec![],
16796 })
16797 }
16798
16799 fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16800 let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16801 TableSampleModifier::TableSample
16802 } else if self.parse_keyword(Keyword::SAMPLE) {
16803 TableSampleModifier::Sample
16804 } else {
16805 return Ok(None);
16806 };
16807 self.parse_table_sample(modifier).map(Some)
16808 }
16809
16810 fn parse_table_sample(
16811 &mut self,
16812 modifier: TableSampleModifier,
16813 ) -> Result<Box<TableSample>, ParserError> {
16814 let name = match self.parse_one_of_keywords(&[
16815 Keyword::BERNOULLI,
16816 Keyword::ROW,
16817 Keyword::SYSTEM,
16818 Keyword::BLOCK,
16819 ]) {
16820 Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16821 Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16822 Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16823 Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16824 _ => None,
16825 };
16826
16827 let parenthesized = self.consume_token(&Token::LParen);
16828
16829 let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16830 let selected_bucket = self.parse_number_value()?;
16831 self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16832 let total = self.parse_number_value()?;
16833 let on = if self.parse_keyword(Keyword::ON) {
16834 Some(self.parse_expr()?)
16835 } else {
16836 None
16837 };
16838 (
16839 None,
16840 Some(TableSampleBucket {
16841 bucket: selected_bucket,
16842 total,
16843 on,
16844 }),
16845 )
16846 } else {
16847 let value = match self.maybe_parse(|p| p.parse_expr())? {
16848 Some(num) => num,
16849 None => {
16850 let next_token = self.next_token();
16851 if let Token::Word(w) = next_token.token {
16852 Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16853 } else {
16854 return parser_err!(
16855 "Expecting number or byte length e.g. 100M",
16856 self.peek_token_ref().span.start
16857 );
16858 }
16859 }
16860 };
16861 let unit = if self.parse_keyword(Keyword::ROWS) {
16862 Some(TableSampleUnit::Rows)
16863 } else if self.parse_keyword(Keyword::PERCENT) {
16864 Some(TableSampleUnit::Percent)
16865 } else {
16866 None
16867 };
16868 (
16869 Some(TableSampleQuantity {
16870 parenthesized,
16871 value,
16872 unit,
16873 }),
16874 None,
16875 )
16876 };
16877 if parenthesized {
16878 self.expect_token(&Token::RParen)?;
16879 }
16880
16881 let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16882 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16883 } else if self.parse_keyword(Keyword::SEED) {
16884 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16885 } else {
16886 None
16887 };
16888
16889 let offset = if self.parse_keyword(Keyword::OFFSET) {
16890 Some(self.parse_expr()?)
16891 } else {
16892 None
16893 };
16894
16895 Ok(Box::new(TableSample {
16896 modifier,
16897 name,
16898 quantity,
16899 seed,
16900 bucket,
16901 offset,
16902 }))
16903 }
16904
16905 fn parse_table_sample_seed(
16906 &mut self,
16907 modifier: TableSampleSeedModifier,
16908 ) -> Result<TableSampleSeed, ParserError> {
16909 self.expect_token(&Token::LParen)?;
16910 let value = self.parse_number_value()?;
16911 self.expect_token(&Token::RParen)?;
16912 Ok(TableSampleSeed { modifier, value })
16913 }
16914
16915 fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16918 self.expect_token(&Token::LParen)?;
16919 let json_expr = self.parse_expr()?;
16920 let json_path = if self.consume_token(&Token::Comma) {
16921 Some(self.parse_value()?)
16922 } else {
16923 None
16924 };
16925 self.expect_token(&Token::RParen)?;
16926 let columns = if self.parse_keyword(Keyword::WITH) {
16927 self.expect_token(&Token::LParen)?;
16928 let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16929 self.expect_token(&Token::RParen)?;
16930 columns
16931 } else {
16932 Vec::new()
16933 };
16934 let alias = self.maybe_parse_table_alias()?;
16935 Ok(TableFactor::OpenJsonTable {
16936 json_expr,
16937 json_path,
16938 columns,
16939 alias,
16940 })
16941 }
16942
16943 fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16944 self.expect_token(&Token::LParen)?;
16945 let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
16946 self.expect_token(&Token::LParen)?;
16947 let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
16948 self.expect_token(&Token::RParen)?;
16949 self.expect_token(&Token::Comma)?;
16950 namespaces
16951 } else {
16952 vec![]
16953 };
16954 let row_expression = self.parse_expr()?;
16955 let passing = self.parse_xml_passing_clause()?;
16956 self.expect_keyword_is(Keyword::COLUMNS)?;
16957 let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
16958 self.expect_token(&Token::RParen)?;
16959 let alias = self.maybe_parse_table_alias()?;
16960 Ok(TableFactor::XmlTable {
16961 namespaces,
16962 row_expression,
16963 passing,
16964 columns,
16965 alias,
16966 })
16967 }
16968
16969 fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
16970 let uri = self.parse_expr()?;
16971 self.expect_keyword_is(Keyword::AS)?;
16972 let name = self.parse_identifier()?;
16973 Ok(XmlNamespaceDefinition { uri, name })
16974 }
16975
16976 fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
16977 let name = self.parse_identifier()?;
16978
16979 let option = if self.parse_keyword(Keyword::FOR) {
16980 self.expect_keyword(Keyword::ORDINALITY)?;
16981 XmlTableColumnOption::ForOrdinality
16982 } else {
16983 let r#type = self.parse_data_type()?;
16984 let mut path = None;
16985 let mut default = None;
16986
16987 if self.parse_keyword(Keyword::PATH) {
16988 path = Some(self.parse_expr()?);
16989 }
16990
16991 if self.parse_keyword(Keyword::DEFAULT) {
16992 default = Some(self.parse_expr()?);
16993 }
16994
16995 let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
16996 if !not_null {
16997 let _ = self.parse_keyword(Keyword::NULL);
16999 }
17000
17001 XmlTableColumnOption::NamedInfo {
17002 r#type,
17003 path,
17004 default,
17005 nullable: !not_null,
17006 }
17007 };
17008 Ok(XmlTableColumn { name, option })
17009 }
17010
17011 fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
17012 let mut arguments = vec![];
17013 if self.parse_keyword(Keyword::PASSING) {
17014 loop {
17015 let by_value =
17016 self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
17017 let expr = self.parse_expr()?;
17018 let alias = if self.parse_keyword(Keyword::AS) {
17019 Some(self.parse_identifier()?)
17020 } else {
17021 None
17022 };
17023 arguments.push(XmlPassingArgument {
17024 expr,
17025 alias,
17026 by_value,
17027 });
17028 if !self.consume_token(&Token::Comma) {
17029 break;
17030 }
17031 }
17032 }
17033 Ok(XmlPassingClause { arguments })
17034 }
17035
17036 fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17038 self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
17039 self.expect_token(&Token::LParen)?;
17040
17041 let name = self.parse_object_name(true)?;
17042
17043 let mut dimensions = Vec::new();
17045 let mut metrics = Vec::new();
17046 let mut facts = Vec::new();
17047 let mut where_clause = None;
17048
17049 while self.peek_token_ref().token != Token::RParen {
17050 if self.parse_keyword(Keyword::DIMENSIONS) {
17051 if !dimensions.is_empty() {
17052 return Err(ParserError::ParserError(
17053 "DIMENSIONS clause can only be specified once".to_string(),
17054 ));
17055 }
17056 dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17057 } else if self.parse_keyword(Keyword::METRICS) {
17058 if !metrics.is_empty() {
17059 return Err(ParserError::ParserError(
17060 "METRICS clause can only be specified once".to_string(),
17061 ));
17062 }
17063 metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17064 } else if self.parse_keyword(Keyword::FACTS) {
17065 if !facts.is_empty() {
17066 return Err(ParserError::ParserError(
17067 "FACTS clause can only be specified once".to_string(),
17068 ));
17069 }
17070 facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17071 } else if self.parse_keyword(Keyword::WHERE) {
17072 if where_clause.is_some() {
17073 return Err(ParserError::ParserError(
17074 "WHERE clause can only be specified once".to_string(),
17075 ));
17076 }
17077 where_clause = Some(self.parse_expr()?);
17078 } else {
17079 let tok = self.peek_token_ref();
17080 return parser_err!(
17081 format!(
17082 "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
17083 tok.token
17084 ),
17085 tok.span.start
17086 )?;
17087 }
17088 }
17089
17090 self.expect_token(&Token::RParen)?;
17091
17092 let alias = self.maybe_parse_table_alias()?;
17093
17094 Ok(TableFactor::SemanticView {
17095 name,
17096 dimensions,
17097 metrics,
17098 facts,
17099 where_clause,
17100 alias,
17101 })
17102 }
17103
17104 fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
17105 self.expect_token(&Token::LParen)?;
17106
17107 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
17108 self.parse_comma_separated(Parser::parse_expr)?
17109 } else {
17110 vec![]
17111 };
17112
17113 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17114 self.parse_comma_separated(Parser::parse_order_by_expr)?
17115 } else {
17116 vec![]
17117 };
17118
17119 let measures = if self.parse_keyword(Keyword::MEASURES) {
17120 self.parse_comma_separated(|p| {
17121 let expr = p.parse_expr()?;
17122 let _ = p.parse_keyword(Keyword::AS);
17123 let alias = p.parse_identifier()?;
17124 Ok(Measure { expr, alias })
17125 })?
17126 } else {
17127 vec![]
17128 };
17129
17130 let rows_per_match =
17131 if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
17132 Some(RowsPerMatch::OneRow)
17133 } else if self.parse_keywords(&[
17134 Keyword::ALL,
17135 Keyword::ROWS,
17136 Keyword::PER,
17137 Keyword::MATCH,
17138 ]) {
17139 Some(RowsPerMatch::AllRows(
17140 if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
17141 Some(EmptyMatchesMode::Show)
17142 } else if self.parse_keywords(&[
17143 Keyword::OMIT,
17144 Keyword::EMPTY,
17145 Keyword::MATCHES,
17146 ]) {
17147 Some(EmptyMatchesMode::Omit)
17148 } else if self.parse_keywords(&[
17149 Keyword::WITH,
17150 Keyword::UNMATCHED,
17151 Keyword::ROWS,
17152 ]) {
17153 Some(EmptyMatchesMode::WithUnmatched)
17154 } else {
17155 None
17156 },
17157 ))
17158 } else {
17159 None
17160 };
17161
17162 let after_match_skip =
17163 if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
17164 if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
17165 Some(AfterMatchSkip::PastLastRow)
17166 } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
17167 Some(AfterMatchSkip::ToNextRow)
17168 } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
17169 Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
17170 } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
17171 Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
17172 } else {
17173 let found = self.next_token();
17174 return self.expected("after match skip option", found);
17175 }
17176 } else {
17177 None
17178 };
17179
17180 self.expect_keyword_is(Keyword::PATTERN)?;
17181 let pattern = self.parse_parenthesized(Self::parse_pattern)?;
17182
17183 self.expect_keyword_is(Keyword::DEFINE)?;
17184
17185 let symbols = self.parse_comma_separated(|p| {
17186 let symbol = p.parse_identifier()?;
17187 p.expect_keyword_is(Keyword::AS)?;
17188 let definition = p.parse_expr()?;
17189 Ok(SymbolDefinition { symbol, definition })
17190 })?;
17191
17192 self.expect_token(&Token::RParen)?;
17193
17194 let alias = self.maybe_parse_table_alias()?;
17195
17196 Ok(TableFactor::MatchRecognize {
17197 table: Box::new(table),
17198 partition_by,
17199 order_by,
17200 measures,
17201 rows_per_match,
17202 after_match_skip,
17203 pattern,
17204 symbols,
17205 alias,
17206 })
17207 }
17208
17209 fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17210 match self.next_token().token {
17211 Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
17212 Token::Placeholder(s) if s == "$" => {
17213 Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
17214 }
17215 Token::LBrace => {
17216 self.expect_token(&Token::Minus)?;
17217 let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
17218 self.expect_token(&Token::Minus)?;
17219 self.expect_token(&Token::RBrace)?;
17220 Ok(MatchRecognizePattern::Exclude(symbol))
17221 }
17222 Token::Word(Word {
17223 value,
17224 quote_style: None,
17225 ..
17226 }) if value == "PERMUTE" => {
17227 self.expect_token(&Token::LParen)?;
17228 let symbols = self.parse_comma_separated(|p| {
17229 p.parse_identifier().map(MatchRecognizeSymbol::Named)
17230 })?;
17231 self.expect_token(&Token::RParen)?;
17232 Ok(MatchRecognizePattern::Permute(symbols))
17233 }
17234 Token::LParen => {
17235 let pattern = self.parse_pattern()?;
17236 self.expect_token(&Token::RParen)?;
17237 Ok(MatchRecognizePattern::Group(Box::new(pattern)))
17238 }
17239 _ => {
17240 self.prev_token();
17241 self.parse_identifier()
17242 .map(MatchRecognizeSymbol::Named)
17243 .map(MatchRecognizePattern::Symbol)
17244 }
17245 }
17246 }
17247
17248 fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17249 let mut pattern = self.parse_base_pattern()?;
17250 loop {
17251 let token = self.next_token();
17252 let quantifier = match token.token {
17253 Token::Mul => RepetitionQuantifier::ZeroOrMore,
17254 Token::Plus => RepetitionQuantifier::OneOrMore,
17255 Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
17256 Token::LBrace => {
17257 let token = self.next_token();
17259 match token.token {
17260 Token::Comma => {
17261 let next_token = self.next_token();
17262 let Token::Number(n, _) = next_token.token else {
17263 return self.expected("literal number", next_token);
17264 };
17265 self.expect_token(&Token::RBrace)?;
17266 RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
17267 }
17268 Token::Number(n, _) if self.consume_token(&Token::Comma) => {
17269 let next_token = self.next_token();
17270 match next_token.token {
17271 Token::Number(m, _) => {
17272 self.expect_token(&Token::RBrace)?;
17273 RepetitionQuantifier::Range(
17274 Self::parse(n, token.span.start)?,
17275 Self::parse(m, token.span.start)?,
17276 )
17277 }
17278 Token::RBrace => {
17279 RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
17280 }
17281 _ => {
17282 return self.expected("} or upper bound", next_token);
17283 }
17284 }
17285 }
17286 Token::Number(n, _) => {
17287 self.expect_token(&Token::RBrace)?;
17288 RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
17289 }
17290 _ => return self.expected("quantifier range", token),
17291 }
17292 }
17293 _ => {
17294 self.prev_token();
17295 break;
17296 }
17297 };
17298 pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
17299 }
17300 Ok(pattern)
17301 }
17302
17303 fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17304 let mut patterns = vec![self.parse_repetition_pattern()?];
17305 while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
17306 patterns.push(self.parse_repetition_pattern()?);
17307 }
17308 match <[MatchRecognizePattern; 1]>::try_from(patterns) {
17309 Ok([pattern]) => Ok(pattern),
17310 Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
17311 }
17312 }
17313
17314 fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17315 let pattern = self.parse_concat_pattern()?;
17316 if self.consume_token(&Token::Pipe) {
17317 match self.parse_pattern()? {
17318 MatchRecognizePattern::Alternation(mut patterns) => {
17320 patterns.insert(0, pattern);
17321 Ok(MatchRecognizePattern::Alternation(patterns))
17322 }
17323 next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
17324 }
17325 } else {
17326 Ok(pattern)
17327 }
17328 }
17329
17330 pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
17332 if self.dialect.supports_table_versioning() {
17333 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
17334 {
17335 let expr = self.parse_expr()?;
17336 return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
17337 } else if self.peek_keyword(Keyword::CHANGES) {
17338 return self.parse_table_version_changes().map(Some);
17339 } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
17340 let func_name = self.parse_object_name(true)?;
17341 let func = self.parse_function(func_name)?;
17342 return Ok(Some(TableVersion::Function(func)));
17343 } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
17344 let expr = self.parse_expr()?;
17345 return Ok(Some(TableVersion::TimestampAsOf(expr)));
17346 } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
17347 let expr = Expr::Value(self.parse_number_value()?);
17348 return Ok(Some(TableVersion::VersionAsOf(expr)));
17349 }
17350 }
17351 Ok(None)
17352 }
17353
17354 fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17365 let changes_name = self.parse_object_name(true)?;
17366 let changes = self.parse_function(changes_name)?;
17367 let at_name = self.parse_object_name(true)?;
17368 let at = self.parse_function(at_name)?;
17369 let end = if self.peek_keyword(Keyword::END) {
17370 let end_name = self.parse_object_name(true)?;
17371 Some(self.parse_function(end_name)?)
17372 } else {
17373 None
17374 };
17375 Ok(TableVersion::Changes { changes, at, end })
17376 }
17377
17378 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17381 if self.parse_keyword(Keyword::NESTED) {
17382 let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17383 let path = self.parse_value()?;
17384 self.expect_keyword_is(Keyword::COLUMNS)?;
17385 let columns = self.parse_parenthesized(|p| {
17386 p.parse_comma_separated(Self::parse_json_table_column_def)
17387 })?;
17388 return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17389 path,
17390 columns,
17391 }));
17392 }
17393 let name = self.parse_identifier()?;
17394 if self.parse_keyword(Keyword::FOR) {
17395 self.expect_keyword_is(Keyword::ORDINALITY)?;
17396 return Ok(JsonTableColumn::ForOrdinality(name));
17397 }
17398 let r#type = self.parse_data_type()?;
17399 let exists = self.parse_keyword(Keyword::EXISTS);
17400 self.expect_keyword_is(Keyword::PATH)?;
17401 let path = self.parse_value()?;
17402 let mut on_empty = None;
17403 let mut on_error = None;
17404 while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17405 if self.parse_keyword(Keyword::EMPTY) {
17406 on_empty = Some(error_handling);
17407 } else {
17408 self.expect_keyword_is(Keyword::ERROR)?;
17409 on_error = Some(error_handling);
17410 }
17411 }
17412 Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17413 name,
17414 r#type,
17415 path,
17416 exists,
17417 on_empty,
17418 on_error,
17419 }))
17420 }
17421
17422 pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17430 let name = self.parse_identifier()?;
17431 let r#type = self.parse_data_type()?;
17432 let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17433 self.next_token();
17434 Some(path)
17435 } else {
17436 None
17437 };
17438 let as_json = self.parse_keyword(Keyword::AS);
17439 if as_json {
17440 self.expect_keyword_is(Keyword::JSON)?;
17441 }
17442 Ok(OpenJsonTableColumn {
17443 name,
17444 r#type,
17445 path,
17446 as_json,
17447 })
17448 }
17449
17450 fn parse_json_table_column_error_handling(
17451 &mut self,
17452 ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17453 let res = if self.parse_keyword(Keyword::NULL) {
17454 JsonTableColumnErrorHandling::Null
17455 } else if self.parse_keyword(Keyword::ERROR) {
17456 JsonTableColumnErrorHandling::Error
17457 } else if self.parse_keyword(Keyword::DEFAULT) {
17458 JsonTableColumnErrorHandling::Default(self.parse_value()?)
17459 } else {
17460 return Ok(None);
17461 };
17462 self.expect_keyword_is(Keyword::ON)?;
17463 Ok(Some(res))
17464 }
17465
17466 pub fn parse_derived_table_factor(
17468 &mut self,
17469 lateral: IsLateral,
17470 ) -> Result<TableFactor, ParserError> {
17471 let subquery = self.parse_query()?;
17472 self.expect_token(&Token::RParen)?;
17473 let alias = self.maybe_parse_table_alias()?;
17474
17475 let sample = self
17477 .maybe_parse_table_sample()?
17478 .map(TableSampleKind::AfterTableAlias);
17479
17480 Ok(TableFactor::Derived {
17481 lateral: match lateral {
17482 Lateral => true,
17483 NotLateral => false,
17484 },
17485 subquery,
17486 alias,
17487 sample,
17488 })
17489 }
17490
17491 pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17514 let expr = self.parse_expr()?;
17515 let alias = if self.parse_keyword(Keyword::AS) {
17516 Some(self.parse_identifier()?)
17517 } else {
17518 None
17519 };
17520
17521 Ok(ExprWithAlias { expr, alias })
17522 }
17523
17524 fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17528 let expr = self.parse_expr()?;
17529 let alias = self.parse_identifier_optional_alias()?;
17530 Ok(ExprWithAlias { expr, alias })
17531 }
17532
17533 fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17535 let function_name = match self.next_token().token {
17536 Token::Word(w) => Ok(w.value),
17537 _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17538 }?;
17539 let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17540 let alias = {
17541 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17542 kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17544 }
17545 self.parse_optional_alias_inner(None, validator)?
17546 };
17547 Ok(ExprWithAlias { expr, alias })
17548 }
17549
17550 pub fn parse_pivot_table_factor(
17552 &mut self,
17553 table: TableFactor,
17554 ) -> Result<TableFactor, ParserError> {
17555 self.expect_token(&Token::LParen)?;
17556 let aggregate_functions =
17557 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17558 self.expect_keyword_is(Keyword::FOR)?;
17559 let value_column = if self.peek_token_ref().token == Token::LParen {
17560 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17561 p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17562 })?
17563 } else {
17564 vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17565 };
17566 self.expect_keyword_is(Keyword::IN)?;
17567
17568 self.expect_token(&Token::LParen)?;
17569 let value_source = if self.parse_keyword(Keyword::ANY) {
17570 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17571 self.parse_comma_separated(Parser::parse_order_by_expr)?
17572 } else {
17573 vec![]
17574 };
17575 PivotValueSource::Any(order_by)
17576 } else if self.peek_sub_query() {
17577 PivotValueSource::Subquery(self.parse_query()?)
17578 } else {
17579 PivotValueSource::List(
17580 self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17581 )
17582 };
17583 self.expect_token(&Token::RParen)?;
17584
17585 let default_on_null =
17586 if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17587 self.expect_token(&Token::LParen)?;
17588 let expr = self.parse_expr()?;
17589 self.expect_token(&Token::RParen)?;
17590 Some(expr)
17591 } else {
17592 None
17593 };
17594
17595 self.expect_token(&Token::RParen)?;
17596 let alias = self.maybe_parse_table_alias()?;
17597 Ok(TableFactor::Pivot {
17598 table: Box::new(table),
17599 aggregate_functions,
17600 value_column,
17601 value_source,
17602 default_on_null,
17603 alias,
17604 })
17605 }
17606
17607 pub fn parse_unpivot_table_factor(
17609 &mut self,
17610 table: TableFactor,
17611 ) -> Result<TableFactor, ParserError> {
17612 let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17613 self.expect_keyword_is(Keyword::NULLS)?;
17614 Some(NullInclusion::IncludeNulls)
17615 } else if self.parse_keyword(Keyword::EXCLUDE) {
17616 self.expect_keyword_is(Keyword::NULLS)?;
17617 Some(NullInclusion::ExcludeNulls)
17618 } else {
17619 None
17620 };
17621 self.expect_token(&Token::LParen)?;
17622 let value = self.parse_expr()?;
17623 self.expect_keyword_is(Keyword::FOR)?;
17624 let name = self.parse_identifier()?;
17625 self.expect_keyword_is(Keyword::IN)?;
17626 let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17627 p.parse_expr_with_alias()
17628 })?;
17629 self.expect_token(&Token::RParen)?;
17630 let alias = self.maybe_parse_table_alias()?;
17631 Ok(TableFactor::Unpivot {
17632 table: Box::new(table),
17633 value,
17634 null_inclusion,
17635 name,
17636 columns,
17637 alias,
17638 })
17639 }
17640
17641 pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17643 if natural {
17644 Ok(JoinConstraint::Natural)
17645 } else if self.parse_keyword(Keyword::ON) {
17646 let constraint = self.parse_expr()?;
17647 Ok(JoinConstraint::On(constraint))
17648 } else if self.parse_keyword(Keyword::USING) {
17649 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17650 Ok(JoinConstraint::Using(columns))
17651 } else {
17652 Ok(JoinConstraint::None)
17653 }
17655 }
17656
17657 pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17659 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17660
17661 self.expect_keyword_is(Keyword::TO)?;
17662 let grantees = self.parse_grantees()?;
17663
17664 let with_grant_option =
17665 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17666
17667 let current_grants =
17668 if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17669 Some(CurrentGrantsKind::CopyCurrentGrants)
17670 } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17671 Some(CurrentGrantsKind::RevokeCurrentGrants)
17672 } else {
17673 None
17674 };
17675
17676 let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17677 Some(self.parse_identifier()?)
17678 } else {
17679 None
17680 };
17681
17682 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17683 Some(self.parse_identifier()?)
17684 } else {
17685 None
17686 };
17687
17688 Ok(Grant {
17689 privileges,
17690 objects,
17691 grantees,
17692 with_grant_option,
17693 as_grantor,
17694 granted_by,
17695 current_grants,
17696 })
17697 }
17698
17699 fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17700 let mut values = vec![];
17701 let mut grantee_type = GranteesType::None;
17702 loop {
17703 let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17704 GranteesType::Role
17705 } else if self.parse_keyword(Keyword::USER) {
17706 GranteesType::User
17707 } else if self.parse_keyword(Keyword::SHARE) {
17708 GranteesType::Share
17709 } else if self.parse_keyword(Keyword::GROUP) {
17710 GranteesType::Group
17711 } else if self.parse_keyword(Keyword::PUBLIC) {
17712 GranteesType::Public
17713 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17714 GranteesType::DatabaseRole
17715 } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17716 GranteesType::ApplicationRole
17717 } else if self.parse_keyword(Keyword::APPLICATION) {
17718 GranteesType::Application
17719 } else {
17720 grantee_type.clone() };
17722
17723 if self
17724 .dialect
17725 .get_reserved_grantees_types()
17726 .contains(&new_grantee_type)
17727 {
17728 self.prev_token();
17729 } else {
17730 grantee_type = new_grantee_type;
17731 }
17732
17733 let grantee = if grantee_type == GranteesType::Public {
17734 Grantee {
17735 grantee_type: grantee_type.clone(),
17736 name: None,
17737 }
17738 } else {
17739 let mut name = self.parse_grantee_name()?;
17740 if self.consume_token(&Token::Colon) {
17741 let ident = self.parse_identifier()?;
17745 if let GranteeName::ObjectName(namespace) = name {
17746 name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17747 format!("{namespace}:{ident}"),
17748 )]));
17749 };
17750 }
17751 Grantee {
17752 grantee_type: grantee_type.clone(),
17753 name: Some(name),
17754 }
17755 };
17756
17757 values.push(grantee);
17758
17759 if !self.consume_token(&Token::Comma) {
17760 break;
17761 }
17762 }
17763
17764 Ok(values)
17765 }
17766
17767 pub fn parse_grant_deny_revoke_privileges_objects(
17769 &mut self,
17770 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17771 let privileges = if self.parse_keyword(Keyword::ALL) {
17772 Privileges::All {
17773 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17774 }
17775 } else {
17776 let actions = self.parse_actions_list()?;
17777 Privileges::Actions(actions)
17778 };
17779
17780 let objects = if self.parse_keyword(Keyword::ON) {
17781 if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17782 Some(GrantObjects::AllTablesInSchema {
17783 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17784 })
17785 } else if self.parse_keywords(&[
17786 Keyword::ALL,
17787 Keyword::EXTERNAL,
17788 Keyword::TABLES,
17789 Keyword::IN,
17790 Keyword::SCHEMA,
17791 ]) {
17792 Some(GrantObjects::AllExternalTablesInSchema {
17793 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17794 })
17795 } else if self.parse_keywords(&[
17796 Keyword::ALL,
17797 Keyword::VIEWS,
17798 Keyword::IN,
17799 Keyword::SCHEMA,
17800 ]) {
17801 Some(GrantObjects::AllViewsInSchema {
17802 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17803 })
17804 } else if self.parse_keywords(&[
17805 Keyword::ALL,
17806 Keyword::MATERIALIZED,
17807 Keyword::VIEWS,
17808 Keyword::IN,
17809 Keyword::SCHEMA,
17810 ]) {
17811 Some(GrantObjects::AllMaterializedViewsInSchema {
17812 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17813 })
17814 } else if self.parse_keywords(&[
17815 Keyword::ALL,
17816 Keyword::FUNCTIONS,
17817 Keyword::IN,
17818 Keyword::SCHEMA,
17819 ]) {
17820 Some(GrantObjects::AllFunctionsInSchema {
17821 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17822 })
17823 } else if self.parse_keywords(&[
17824 Keyword::FUTURE,
17825 Keyword::SCHEMAS,
17826 Keyword::IN,
17827 Keyword::DATABASE,
17828 ]) {
17829 Some(GrantObjects::FutureSchemasInDatabase {
17830 databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17831 })
17832 } else if self.parse_keywords(&[
17833 Keyword::FUTURE,
17834 Keyword::TABLES,
17835 Keyword::IN,
17836 Keyword::SCHEMA,
17837 ]) {
17838 Some(GrantObjects::FutureTablesInSchema {
17839 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17840 })
17841 } else if self.parse_keywords(&[
17842 Keyword::FUTURE,
17843 Keyword::EXTERNAL,
17844 Keyword::TABLES,
17845 Keyword::IN,
17846 Keyword::SCHEMA,
17847 ]) {
17848 Some(GrantObjects::FutureExternalTablesInSchema {
17849 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17850 })
17851 } else if self.parse_keywords(&[
17852 Keyword::FUTURE,
17853 Keyword::VIEWS,
17854 Keyword::IN,
17855 Keyword::SCHEMA,
17856 ]) {
17857 Some(GrantObjects::FutureViewsInSchema {
17858 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17859 })
17860 } else if self.parse_keywords(&[
17861 Keyword::FUTURE,
17862 Keyword::MATERIALIZED,
17863 Keyword::VIEWS,
17864 Keyword::IN,
17865 Keyword::SCHEMA,
17866 ]) {
17867 Some(GrantObjects::FutureMaterializedViewsInSchema {
17868 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17869 })
17870 } else if self.parse_keywords(&[
17871 Keyword::ALL,
17872 Keyword::SEQUENCES,
17873 Keyword::IN,
17874 Keyword::SCHEMA,
17875 ]) {
17876 Some(GrantObjects::AllSequencesInSchema {
17877 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17878 })
17879 } else if self.parse_keywords(&[
17880 Keyword::FUTURE,
17881 Keyword::SEQUENCES,
17882 Keyword::IN,
17883 Keyword::SCHEMA,
17884 ]) {
17885 Some(GrantObjects::FutureSequencesInSchema {
17886 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17887 })
17888 } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17889 Some(GrantObjects::ResourceMonitors(
17890 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17891 ))
17892 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17893 Some(GrantObjects::ComputePools(
17894 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17895 ))
17896 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17897 Some(GrantObjects::FailoverGroup(
17898 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17899 ))
17900 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17901 Some(GrantObjects::ReplicationGroup(
17902 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17903 ))
17904 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17905 Some(GrantObjects::ExternalVolumes(
17906 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17907 ))
17908 } else {
17909 let object_type = self.parse_one_of_keywords(&[
17910 Keyword::SEQUENCE,
17911 Keyword::DATABASE,
17912 Keyword::SCHEMA,
17913 Keyword::TABLE,
17914 Keyword::VIEW,
17915 Keyword::WAREHOUSE,
17916 Keyword::INTEGRATION,
17917 Keyword::VIEW,
17918 Keyword::WAREHOUSE,
17919 Keyword::INTEGRATION,
17920 Keyword::USER,
17921 Keyword::CONNECTION,
17922 Keyword::PROCEDURE,
17923 Keyword::FUNCTION,
17924 ]);
17925 let objects =
17926 self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
17927 match object_type {
17928 Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
17929 Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
17930 Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
17931 Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
17932 Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
17933 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
17934 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
17935 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
17936 kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
17937 if let Some(name) = objects?.first() {
17938 self.parse_grant_procedure_or_function(name, &kw)?
17939 } else {
17940 self.expected_ref("procedure or function name", self.peek_token_ref())?
17941 }
17942 }
17943 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
17944 Some(unexpected_keyword) => return Err(ParserError::ParserError(
17945 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
17946 )),
17947 }
17948 }
17949 } else {
17950 None
17951 };
17952
17953 Ok((privileges, objects))
17954 }
17955
17956 fn parse_grant_procedure_or_function(
17957 &mut self,
17958 name: &ObjectName,
17959 kw: &Option<Keyword>,
17960 ) -> Result<Option<GrantObjects>, ParserError> {
17961 let arg_types = if self.consume_token(&Token::LParen) {
17962 let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
17963 self.expect_token(&Token::RParen)?;
17964 list
17965 } else {
17966 vec![]
17967 };
17968 match kw {
17969 Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
17970 name: name.clone(),
17971 arg_types,
17972 })),
17973 Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
17974 name: name.clone(),
17975 arg_types,
17976 })),
17977 _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
17978 }
17979 }
17980
17981 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
17983 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
17984 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
17985 if columns.is_empty() {
17986 Ok(None)
17987 } else {
17988 Ok(Some(columns))
17989 }
17990 }
17991
17992 if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
17994 Ok(Action::ImportedPrivileges)
17995 } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
17996 Ok(Action::AddSearchOptimization)
17997 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
17998 Ok(Action::AttachListing)
17999 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
18000 Ok(Action::AttachPolicy)
18001 } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
18002 Ok(Action::BindServiceEndpoint)
18003 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
18004 let role = self.parse_object_name(false)?;
18005 Ok(Action::DatabaseRole { role })
18006 } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
18007 Ok(Action::EvolveSchema)
18008 } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
18009 Ok(Action::ImportShare)
18010 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
18011 Ok(Action::ManageVersions)
18012 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
18013 Ok(Action::ManageReleases)
18014 } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
18015 Ok(Action::OverrideShareRestrictions)
18016 } else if self.parse_keywords(&[
18017 Keyword::PURCHASE,
18018 Keyword::DATA,
18019 Keyword::EXCHANGE,
18020 Keyword::LISTING,
18021 ]) {
18022 Ok(Action::PurchaseDataExchangeListing)
18023 } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
18024 Ok(Action::ResolveAll)
18025 } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
18026 Ok(Action::ReadSession)
18027
18028 } else if self.parse_keyword(Keyword::APPLY) {
18030 let apply_type = self.parse_action_apply_type()?;
18031 Ok(Action::Apply { apply_type })
18032 } else if self.parse_keyword(Keyword::APPLYBUDGET) {
18033 Ok(Action::ApplyBudget)
18034 } else if self.parse_keyword(Keyword::AUDIT) {
18035 Ok(Action::Audit)
18036 } else if self.parse_keyword(Keyword::CONNECT) {
18037 Ok(Action::Connect)
18038 } else if self.parse_keyword(Keyword::CREATE) {
18039 let obj_type = self.maybe_parse_action_create_object_type();
18040 Ok(Action::Create { obj_type })
18041 } else if self.parse_keyword(Keyword::DELETE) {
18042 Ok(Action::Delete)
18043 } else if self.parse_keyword(Keyword::EXEC) {
18044 let obj_type = self.maybe_parse_action_execute_obj_type();
18045 Ok(Action::Exec { obj_type })
18046 } else if self.parse_keyword(Keyword::EXECUTE) {
18047 let obj_type = self.maybe_parse_action_execute_obj_type();
18048 Ok(Action::Execute { obj_type })
18049 } else if self.parse_keyword(Keyword::FAILOVER) {
18050 Ok(Action::Failover)
18051 } else if self.parse_keyword(Keyword::INSERT) {
18052 Ok(Action::Insert {
18053 columns: parse_columns(self)?,
18054 })
18055 } else if self.parse_keyword(Keyword::MANAGE) {
18056 let manage_type = self.parse_action_manage_type()?;
18057 Ok(Action::Manage { manage_type })
18058 } else if self.parse_keyword(Keyword::MODIFY) {
18059 let modify_type = self.parse_action_modify_type();
18060 Ok(Action::Modify { modify_type })
18061 } else if self.parse_keyword(Keyword::MONITOR) {
18062 let monitor_type = self.parse_action_monitor_type();
18063 Ok(Action::Monitor { monitor_type })
18064 } else if self.parse_keyword(Keyword::OPERATE) {
18065 Ok(Action::Operate)
18066 } else if self.parse_keyword(Keyword::REFERENCES) {
18067 Ok(Action::References {
18068 columns: parse_columns(self)?,
18069 })
18070 } else if self.parse_keyword(Keyword::READ) {
18071 Ok(Action::Read)
18072 } else if self.parse_keyword(Keyword::REPLICATE) {
18073 Ok(Action::Replicate)
18074 } else if self.parse_keyword(Keyword::ROLE) {
18075 let role = self.parse_object_name(false)?;
18076 Ok(Action::Role { role })
18077 } else if self.parse_keyword(Keyword::SELECT) {
18078 Ok(Action::Select {
18079 columns: parse_columns(self)?,
18080 })
18081 } else if self.parse_keyword(Keyword::TEMPORARY) {
18082 Ok(Action::Temporary)
18083 } else if self.parse_keyword(Keyword::TRIGGER) {
18084 Ok(Action::Trigger)
18085 } else if self.parse_keyword(Keyword::TRUNCATE) {
18086 Ok(Action::Truncate)
18087 } else if self.parse_keyword(Keyword::UPDATE) {
18088 Ok(Action::Update {
18089 columns: parse_columns(self)?,
18090 })
18091 } else if self.parse_keyword(Keyword::USAGE) {
18092 Ok(Action::Usage)
18093 } else if self.parse_keyword(Keyword::OWNERSHIP) {
18094 Ok(Action::Ownership)
18095 } else if self.parse_keyword(Keyword::DROP) {
18096 Ok(Action::Drop)
18097 } else {
18098 self.expected_ref("a privilege keyword", self.peek_token_ref())?
18099 }
18100 }
18101
18102 fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
18103 if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
18105 Some(ActionCreateObjectType::ApplicationPackage)
18106 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18107 Some(ActionCreateObjectType::ComputePool)
18108 } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
18109 Some(ActionCreateObjectType::DataExchangeListing)
18110 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18111 Some(ActionCreateObjectType::ExternalVolume)
18112 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18113 Some(ActionCreateObjectType::FailoverGroup)
18114 } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
18115 Some(ActionCreateObjectType::NetworkPolicy)
18116 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
18117 Some(ActionCreateObjectType::OrganiationListing)
18118 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18119 Some(ActionCreateObjectType::ReplicationGroup)
18120 }
18121 else if self.parse_keyword(Keyword::ACCOUNT) {
18123 Some(ActionCreateObjectType::Account)
18124 } else if self.parse_keyword(Keyword::APPLICATION) {
18125 Some(ActionCreateObjectType::Application)
18126 } else if self.parse_keyword(Keyword::DATABASE) {
18127 Some(ActionCreateObjectType::Database)
18128 } else if self.parse_keyword(Keyword::INTEGRATION) {
18129 Some(ActionCreateObjectType::Integration)
18130 } else if self.parse_keyword(Keyword::ROLE) {
18131 Some(ActionCreateObjectType::Role)
18132 } else if self.parse_keyword(Keyword::SCHEMA) {
18133 Some(ActionCreateObjectType::Schema)
18134 } else if self.parse_keyword(Keyword::SHARE) {
18135 Some(ActionCreateObjectType::Share)
18136 } else if self.parse_keyword(Keyword::USER) {
18137 Some(ActionCreateObjectType::User)
18138 } else if self.parse_keyword(Keyword::WAREHOUSE) {
18139 Some(ActionCreateObjectType::Warehouse)
18140 } else {
18141 None
18142 }
18143 }
18144
18145 fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
18146 if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
18147 Ok(ActionApplyType::AggregationPolicy)
18148 } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
18149 Ok(ActionApplyType::AuthenticationPolicy)
18150 } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
18151 Ok(ActionApplyType::JoinPolicy)
18152 } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
18153 Ok(ActionApplyType::MaskingPolicy)
18154 } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
18155 Ok(ActionApplyType::PackagesPolicy)
18156 } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
18157 Ok(ActionApplyType::PasswordPolicy)
18158 } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
18159 Ok(ActionApplyType::ProjectionPolicy)
18160 } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
18161 Ok(ActionApplyType::RowAccessPolicy)
18162 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
18163 Ok(ActionApplyType::SessionPolicy)
18164 } else if self.parse_keyword(Keyword::TAG) {
18165 Ok(ActionApplyType::Tag)
18166 } else {
18167 self.expected_ref("GRANT APPLY type", self.peek_token_ref())
18168 }
18169 }
18170
18171 fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
18172 if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
18173 Some(ActionExecuteObjectType::DataMetricFunction)
18174 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
18175 Some(ActionExecuteObjectType::ManagedAlert)
18176 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
18177 Some(ActionExecuteObjectType::ManagedTask)
18178 } else if self.parse_keyword(Keyword::ALERT) {
18179 Some(ActionExecuteObjectType::Alert)
18180 } else if self.parse_keyword(Keyword::TASK) {
18181 Some(ActionExecuteObjectType::Task)
18182 } else {
18183 None
18184 }
18185 }
18186
18187 fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
18188 if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
18189 Ok(ActionManageType::AccountSupportCases)
18190 } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
18191 Ok(ActionManageType::EventSharing)
18192 } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
18193 Ok(ActionManageType::ListingAutoFulfillment)
18194 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
18195 Ok(ActionManageType::OrganizationSupportCases)
18196 } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
18197 Ok(ActionManageType::UserSupportCases)
18198 } else if self.parse_keyword(Keyword::GRANTS) {
18199 Ok(ActionManageType::Grants)
18200 } else if self.parse_keyword(Keyword::WAREHOUSES) {
18201 Ok(ActionManageType::Warehouses)
18202 } else {
18203 self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
18204 }
18205 }
18206
18207 fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
18208 if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
18209 Some(ActionModifyType::LogLevel)
18210 } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
18211 Some(ActionModifyType::TraceLevel)
18212 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
18213 Some(ActionModifyType::SessionLogLevel)
18214 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
18215 Some(ActionModifyType::SessionTraceLevel)
18216 } else {
18217 None
18218 }
18219 }
18220
18221 fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
18222 if self.parse_keyword(Keyword::EXECUTION) {
18223 Some(ActionMonitorType::Execution)
18224 } else if self.parse_keyword(Keyword::SECURITY) {
18225 Some(ActionMonitorType::Security)
18226 } else if self.parse_keyword(Keyword::USAGE) {
18227 Some(ActionMonitorType::Usage)
18228 } else {
18229 None
18230 }
18231 }
18232
18233 pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
18235 let mut name = self.parse_object_name(false)?;
18236 if self.dialect.supports_user_host_grantee()
18237 && name.0.len() == 1
18238 && name.0[0].as_ident().is_some()
18239 && self.consume_token(&Token::AtSign)
18240 {
18241 let user = name.0.pop().unwrap().as_ident().unwrap().clone();
18242 let host = self.parse_identifier()?;
18243 Ok(GranteeName::UserHost { user, host })
18244 } else {
18245 Ok(GranteeName::ObjectName(name))
18246 }
18247 }
18248
18249 pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
18251 self.expect_keyword(Keyword::DENY)?;
18252
18253 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18254 let objects = match objects {
18255 Some(o) => o,
18256 None => {
18257 return parser_err!(
18258 "DENY statements must specify an object",
18259 self.peek_token_ref().span.start
18260 )
18261 }
18262 };
18263
18264 self.expect_keyword_is(Keyword::TO)?;
18265 let grantees = self.parse_grantees()?;
18266 let cascade = self.parse_cascade_option();
18267 let granted_by = if self.parse_keywords(&[Keyword::AS]) {
18268 Some(self.parse_identifier()?)
18269 } else {
18270 None
18271 };
18272
18273 Ok(Statement::Deny(DenyStatement {
18274 privileges,
18275 objects,
18276 grantees,
18277 cascade,
18278 granted_by,
18279 }))
18280 }
18281
18282 pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
18284 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18285
18286 self.expect_keyword_is(Keyword::FROM)?;
18287 let grantees = self.parse_grantees()?;
18288
18289 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
18290 Some(self.parse_identifier()?)
18291 } else {
18292 None
18293 };
18294
18295 let cascade = self.parse_cascade_option();
18296
18297 Ok(Revoke {
18298 privileges,
18299 objects,
18300 grantees,
18301 granted_by,
18302 cascade,
18303 })
18304 }
18305
18306 pub fn parse_replace(
18308 &mut self,
18309 replace_token: TokenWithSpan,
18310 ) -> Result<Statement, ParserError> {
18311 if !dialect_of!(self is MySqlDialect | GenericDialect) {
18312 return parser_err!(
18313 "Unsupported statement REPLACE",
18314 self.peek_token_ref().span.start
18315 );
18316 }
18317
18318 let mut insert = self.parse_insert(replace_token)?;
18319 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
18320 *replace_into = true;
18321 }
18322
18323 Ok(insert)
18324 }
18325
18326 fn parse_insert_setexpr_boxed(
18330 &mut self,
18331 insert_token: TokenWithSpan,
18332 ) -> Result<Box<SetExpr>, ParserError> {
18333 Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
18334 }
18335
18336 pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
18338 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18339 let or = self.parse_conflict_clause();
18340 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
18341 None
18342 } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
18343 Some(MysqlInsertPriority::LowPriority)
18344 } else if self.parse_keyword(Keyword::DELAYED) {
18345 Some(MysqlInsertPriority::Delayed)
18346 } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
18347 Some(MysqlInsertPriority::HighPriority)
18348 } else {
18349 None
18350 };
18351
18352 let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
18353 && self.parse_keyword(Keyword::IGNORE);
18354
18355 let replace_into = false;
18356
18357 let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18358 let into = self.parse_keyword(Keyword::INTO);
18359
18360 let local = self.parse_keyword(Keyword::LOCAL);
18361
18362 if self.parse_keyword(Keyword::DIRECTORY) {
18363 let path = self.parse_literal_string()?;
18364 let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18365 Some(self.parse_file_format()?)
18366 } else {
18367 None
18368 };
18369 let source = self.parse_query()?;
18370 Ok(Statement::Directory {
18371 local,
18372 path,
18373 overwrite,
18374 file_format,
18375 source,
18376 })
18377 } else {
18378 let table = self.parse_keyword(Keyword::TABLE);
18380 let table_object = self.parse_table_object()?;
18381
18382 let table_alias = if self.dialect.supports_insert_table_alias()
18383 && !self.peek_sub_query()
18384 && self
18385 .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18386 .is_none()
18387 {
18388 if self.parse_keyword(Keyword::AS) {
18389 Some(TableAliasWithoutColumns {
18390 explicit: true,
18391 alias: self.parse_identifier()?,
18392 })
18393 } else {
18394 self.maybe_parse(|parser| parser.parse_identifier())?
18395 .map(|alias| TableAliasWithoutColumns {
18396 explicit: false,
18397 alias,
18398 })
18399 }
18400 } else {
18401 None
18402 };
18403
18404 let is_mysql = dialect_of!(self is MySqlDialect);
18405
18406 let (columns, partitioned, after_columns, output, source, assignments) = if self
18407 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18408 {
18409 (vec![], None, vec![], None, None, vec![])
18410 } else {
18411 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18412 let columns =
18413 self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18414
18415 let partitioned = self.parse_insert_partition()?;
18416 let after_columns = if dialect_of!(self is HiveDialect) {
18418 self.parse_parenthesized_column_list(Optional, false)?
18419 } else {
18420 vec![]
18421 };
18422 (columns, partitioned, after_columns)
18423 } else {
18424 Default::default()
18425 };
18426
18427 let output = self.maybe_parse_output_clause()?;
18428
18429 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18430 || self.peek_keyword(Keyword::SETTINGS)
18431 {
18432 (None, vec![])
18433 } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18434 (None, self.parse_comma_separated(Parser::parse_assignment)?)
18435 } else {
18436 (Some(self.parse_query()?), vec![])
18437 };
18438
18439 (
18440 columns,
18441 partitioned,
18442 after_columns,
18443 output,
18444 source,
18445 assignments,
18446 )
18447 };
18448
18449 let (format_clause, settings) = if self.dialect.supports_insert_format() {
18450 let settings = self.parse_settings()?;
18453
18454 let format = if self.parse_keyword(Keyword::FORMAT) {
18455 Some(self.parse_input_format_clause()?)
18456 } else {
18457 None
18458 };
18459
18460 (format, settings)
18461 } else {
18462 Default::default()
18463 };
18464
18465 let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18466 && self.parse_keyword(Keyword::AS)
18467 {
18468 let row_alias = self.parse_object_name(false)?;
18469 let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18470 Some(InsertAliases {
18471 row_alias,
18472 col_aliases,
18473 })
18474 } else {
18475 None
18476 };
18477
18478 let on = if self.parse_keyword(Keyword::ON) {
18479 if self.parse_keyword(Keyword::CONFLICT) {
18480 let conflict_target =
18481 if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18482 Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18483 } else if self.peek_token_ref().token == Token::LParen {
18484 Some(ConflictTarget::Columns(
18485 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18486 ))
18487 } else {
18488 None
18489 };
18490
18491 self.expect_keyword_is(Keyword::DO)?;
18492 let action = if self.parse_keyword(Keyword::NOTHING) {
18493 OnConflictAction::DoNothing
18494 } else {
18495 self.expect_keyword_is(Keyword::UPDATE)?;
18496 self.expect_keyword_is(Keyword::SET)?;
18497 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18498 let selection = if self.parse_keyword(Keyword::WHERE) {
18499 Some(self.parse_expr()?)
18500 } else {
18501 None
18502 };
18503 OnConflictAction::DoUpdate(DoUpdate {
18504 assignments,
18505 selection,
18506 })
18507 };
18508
18509 Some(OnInsert::OnConflict(OnConflict {
18510 conflict_target,
18511 action,
18512 }))
18513 } else {
18514 self.expect_keyword_is(Keyword::DUPLICATE)?;
18515 self.expect_keyword_is(Keyword::KEY)?;
18516 self.expect_keyword_is(Keyword::UPDATE)?;
18517 let l = self.parse_comma_separated(Parser::parse_assignment)?;
18518
18519 Some(OnInsert::DuplicateKeyUpdate(l))
18520 }
18521 } else {
18522 None
18523 };
18524
18525 let returning = if self.parse_keyword(Keyword::RETURNING) {
18526 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18527 } else {
18528 None
18529 };
18530
18531 Ok(Insert {
18532 insert_token: insert_token.into(),
18533 optimizer_hints,
18534 or,
18535 table: table_object,
18536 table_alias,
18537 ignore,
18538 into,
18539 overwrite,
18540 partitioned,
18541 columns,
18542 after_columns,
18543 source,
18544 assignments,
18545 has_table_keyword: table,
18546 on,
18547 returning,
18548 output,
18549 replace_into,
18550 priority,
18551 insert_alias,
18552 settings,
18553 format_clause,
18554 multi_table_insert_type: None,
18555 multi_table_into_clauses: vec![],
18556 multi_table_when_clauses: vec![],
18557 multi_table_else_clause: None,
18558 }
18559 .into())
18560 }
18561 }
18562
18563 pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18567 let ident = self.parse_identifier()?;
18568 let values = self
18569 .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18570 .unwrap_or_default();
18571
18572 Ok(InputFormatClause { ident, values })
18573 }
18574
18575 fn peek_subquery_start(&mut self) -> bool {
18578 let mut i = 0;
18582 loop {
18583 match &self.peek_nth_token_ref(i).token {
18584 Token::LParen => i += 1,
18585 Token::Word(w) if w.keyword == Keyword::SELECT => return i > 0,
18586 _ => return false,
18587 }
18588 }
18589 }
18590
18591 fn peek_subquery_or_cte_start(&mut self) -> bool {
18595 matches!(
18596 self.peek_tokens_ref(),
18597 [
18598 TokenWithSpan {
18599 token: Token::LParen,
18600 ..
18601 },
18602 TokenWithSpan {
18603 token: Token::Word(Word {
18604 keyword: Keyword::SELECT | Keyword::WITH,
18605 ..
18606 }),
18607 ..
18608 },
18609 ]
18610 )
18611 }
18612
18613 fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18614 if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18615 Some(SqliteOnConflict::Replace)
18616 } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18617 Some(SqliteOnConflict::Rollback)
18618 } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18619 Some(SqliteOnConflict::Abort)
18620 } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18621 Some(SqliteOnConflict::Fail)
18622 } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18623 Some(SqliteOnConflict::Ignore)
18624 } else if self.parse_keyword(Keyword::REPLACE) {
18625 Some(SqliteOnConflict::Replace)
18626 } else {
18627 None
18628 }
18629 }
18630
18631 pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18633 if self.parse_keyword(Keyword::PARTITION) {
18634 self.expect_token(&Token::LParen)?;
18635 let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18636 self.expect_token(&Token::RParen)?;
18637 Ok(partition_cols)
18638 } else {
18639 Ok(None)
18640 }
18641 }
18642
18643 pub fn parse_load_data_table_format(
18645 &mut self,
18646 ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18647 if self.parse_keyword(Keyword::INPUTFORMAT) {
18648 let input_format = self.parse_expr()?;
18649 self.expect_keyword_is(Keyword::SERDE)?;
18650 let serde = self.parse_expr()?;
18651 Ok(Some(HiveLoadDataFormat {
18652 input_format,
18653 serde,
18654 }))
18655 } else {
18656 Ok(None)
18657 }
18658 }
18659
18660 fn parse_update_setexpr_boxed(
18664 &mut self,
18665 update_token: TokenWithSpan,
18666 ) -> Result<Box<SetExpr>, ParserError> {
18667 Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18668 }
18669
18670 pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18672 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18673 let or = self.parse_conflict_clause();
18674 let table = self.parse_table_and_joins()?;
18675 let from_before_set = if self.parse_keyword(Keyword::FROM) {
18676 Some(UpdateTableFromKind::BeforeSet(
18677 self.parse_table_with_joins()?,
18678 ))
18679 } else {
18680 None
18681 };
18682 self.expect_keyword(Keyword::SET)?;
18683 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18684
18685 let output = self.maybe_parse_output_clause()?;
18686
18687 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18688 Some(UpdateTableFromKind::AfterSet(
18689 self.parse_table_with_joins()?,
18690 ))
18691 } else {
18692 from_before_set
18693 };
18694 let selection = if self.parse_keyword(Keyword::WHERE) {
18695 Some(self.parse_expr()?)
18696 } else {
18697 None
18698 };
18699 let returning = if self.parse_keyword(Keyword::RETURNING) {
18700 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18701 } else {
18702 None
18703 };
18704 let order_by = if self.dialect.supports_update_order_by()
18705 && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18706 {
18707 self.parse_comma_separated(Parser::parse_order_by_expr)?
18708 } else {
18709 vec![]
18710 };
18711 let limit = if self.parse_keyword(Keyword::LIMIT) {
18712 Some(self.parse_expr()?)
18713 } else {
18714 None
18715 };
18716 Ok(Update {
18717 update_token: update_token.into(),
18718 optimizer_hints,
18719 table,
18720 assignments,
18721 from,
18722 selection,
18723 returning,
18724 output,
18725 or,
18726 order_by,
18727 limit,
18728 }
18729 .into())
18730 }
18731
18732 pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18734 let target = self.parse_assignment_target()?;
18735 self.expect_token(&Token::Eq)?;
18736 let value = self.parse_expr()?;
18737 Ok(Assignment { target, value })
18738 }
18739
18740 pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18742 if self.consume_token(&Token::LParen) {
18743 let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18744 self.expect_token(&Token::RParen)?;
18745 Ok(AssignmentTarget::Tuple(columns))
18746 } else {
18747 let column = self.parse_object_name(false)?;
18748 Ok(AssignmentTarget::ColumnName(column))
18749 }
18750 }
18751
18752 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18754 let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18755 self.maybe_parse(|p| {
18756 let name = p.parse_expr()?;
18757 let operator = p.parse_function_named_arg_operator()?;
18758 let arg = p.parse_wildcard_expr()?.into();
18759 Ok(FunctionArg::ExprNamed {
18760 name,
18761 arg,
18762 operator,
18763 })
18764 })?
18765 } else {
18766 self.maybe_parse(|p| {
18767 let name = p.parse_identifier()?;
18768 let operator = p.parse_function_named_arg_operator()?;
18769 let arg = p.parse_wildcard_expr()?.into();
18770 Ok(FunctionArg::Named {
18771 name,
18772 arg,
18773 operator,
18774 })
18775 })?
18776 };
18777 if let Some(arg) = arg {
18778 return Ok(arg);
18779 }
18780 let wildcard_expr = self.parse_wildcard_expr()?;
18781 let arg_expr: FunctionArgExpr = match wildcard_expr {
18782 Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18783 let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18786 if opts.opt_exclude.is_some()
18787 || opts.opt_except.is_some()
18788 || opts.opt_replace.is_some()
18789 || opts.opt_rename.is_some()
18790 || opts.opt_ilike.is_some()
18791 {
18792 FunctionArgExpr::WildcardWithOptions(opts)
18793 } else {
18794 wildcard_expr.into()
18795 }
18796 }
18797 other => other.into(),
18798 };
18799 let arg_expr = match arg_expr {
18801 FunctionArgExpr::Expr(expr)
18802 if self.dialect.supports_aliased_function_args()
18803 && self.parse_keyword(Keyword::AS) =>
18804 {
18805 FunctionArgExpr::Expr(Expr::Named {
18806 expr: expr.into(),
18807 name: self.parse_identifier()?,
18808 })
18809 }
18810 other => other,
18811 };
18812 Ok(FunctionArg::Unnamed(arg_expr))
18813 }
18814
18815 fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18816 if self.parse_keyword(Keyword::VALUE) {
18817 return Ok(FunctionArgOperator::Value);
18818 }
18819 let tok = self.next_token();
18820 match tok.token {
18821 Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18822 Ok(FunctionArgOperator::RightArrow)
18823 }
18824 Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18825 Ok(FunctionArgOperator::Equals)
18826 }
18827 Token::Assignment
18828 if self
18829 .dialect
18830 .supports_named_fn_args_with_assignment_operator() =>
18831 {
18832 Ok(FunctionArgOperator::Assignment)
18833 }
18834 Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18835 Ok(FunctionArgOperator::Colon)
18836 }
18837 _ => {
18838 self.prev_token();
18839 self.expected("argument operator", tok)
18840 }
18841 }
18842 }
18843
18844 pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18846 if self.consume_token(&Token::RParen) {
18847 Ok(vec![])
18848 } else {
18849 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18850 self.expect_token(&Token::RParen)?;
18851 Ok(args)
18852 }
18853 }
18854
18855 fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18856 if self.consume_token(&Token::RParen) {
18857 return Ok(TableFunctionArgs {
18858 args: vec![],
18859 settings: None,
18860 });
18861 }
18862 let mut args = vec![];
18863 let settings = loop {
18864 if let Some(settings) = self.parse_settings()? {
18865 break Some(settings);
18866 }
18867 args.push(self.parse_function_args()?);
18868 if self.is_parse_comma_separated_end() {
18869 break None;
18870 }
18871 };
18872 self.expect_token(&Token::RParen)?;
18873 Ok(TableFunctionArgs { args, settings })
18874 }
18875
18876 fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18885 let mut clauses = vec![];
18886
18887 if let Some(null_clause) = self.parse_json_null_clause() {
18890 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18891 }
18892
18893 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18894 clauses.push(FunctionArgumentClause::JsonReturningClause(
18895 json_returning_clause,
18896 ));
18897 }
18898
18899 if self.consume_token(&Token::RParen) {
18900 return Ok(FunctionArgumentList {
18901 duplicate_treatment: None,
18902 args: vec![],
18903 clauses,
18904 });
18905 }
18906
18907 let duplicate_treatment = self.parse_duplicate_treatment()?;
18908 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18909
18910 if self.dialect.supports_window_function_null_treatment_arg() {
18911 if let Some(null_treatment) = self.parse_null_treatment()? {
18912 clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
18913 }
18914 }
18915
18916 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
18917 clauses.push(FunctionArgumentClause::OrderBy(
18918 self.parse_comma_separated(Parser::parse_order_by_expr)?,
18919 ));
18920 }
18921
18922 if self.parse_keyword(Keyword::LIMIT) {
18923 clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
18924 }
18925
18926 if dialect_of!(self is GenericDialect | BigQueryDialect)
18927 && self.parse_keyword(Keyword::HAVING)
18928 {
18929 let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
18930 Keyword::MIN => HavingBoundKind::Min,
18931 Keyword::MAX => HavingBoundKind::Max,
18932 unexpected_keyword => return Err(ParserError::ParserError(
18933 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
18934 )),
18935 };
18936 clauses.push(FunctionArgumentClause::Having(HavingBound(
18937 kind,
18938 self.parse_expr()?,
18939 )))
18940 }
18941
18942 if dialect_of!(self is GenericDialect | MySqlDialect)
18943 && self.parse_keyword(Keyword::SEPARATOR)
18944 {
18945 clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
18946 }
18947
18948 if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
18949 clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
18950 }
18951
18952 if let Some(null_clause) = self.parse_json_null_clause() {
18953 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18954 }
18955
18956 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18957 clauses.push(FunctionArgumentClause::JsonReturningClause(
18958 json_returning_clause,
18959 ));
18960 }
18961
18962 self.expect_token(&Token::RParen)?;
18963 Ok(FunctionArgumentList {
18964 duplicate_treatment,
18965 args,
18966 clauses,
18967 })
18968 }
18969
18970 fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
18971 if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
18972 Some(JsonNullClause::AbsentOnNull)
18973 } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
18974 Some(JsonNullClause::NullOnNull)
18975 } else {
18976 None
18977 }
18978 }
18979
18980 fn maybe_parse_json_returning_clause(
18981 &mut self,
18982 ) -> Result<Option<JsonReturningClause>, ParserError> {
18983 if self.parse_keyword(Keyword::RETURNING) {
18984 let data_type = self.parse_data_type()?;
18985 Ok(Some(JsonReturningClause { data_type }))
18986 } else {
18987 Ok(None)
18988 }
18989 }
18990
18991 fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
18992 let loc = self.peek_token_ref().span.start;
18993 match (
18994 self.parse_keyword(Keyword::ALL),
18995 self.parse_keyword(Keyword::DISTINCT),
18996 ) {
18997 (true, false) => Ok(Some(DuplicateTreatment::All)),
18998 (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
18999 (false, false) => Ok(None),
19000 (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
19001 }
19002 }
19003
19004 pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
19006 let prefix = self
19007 .parse_one_of_keywords(
19008 self.dialect
19009 .get_reserved_keywords_for_select_item_operator(),
19010 )
19011 .map(|keyword| Ident::new(format!("{keyword:?}")));
19012
19013 match self.parse_wildcard_expr()? {
19014 Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
19015 SelectItemQualifiedWildcardKind::ObjectName(prefix),
19016 self.parse_wildcard_additional_options(token.0)?,
19017 )),
19018 Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
19019 self.parse_wildcard_additional_options(token.0)?,
19020 )),
19021 Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
19022 parser_err!(
19023 format!("Expected an expression, found: {}", v),
19024 self.peek_token_ref().span.start
19025 )
19026 }
19027 Expr::BinaryOp {
19028 left,
19029 op: BinaryOperator::Eq,
19030 right,
19031 } if self.dialect.supports_eq_alias_assignment()
19032 && matches!(left.as_ref(), Expr::Identifier(_)) =>
19033 {
19034 let Expr::Identifier(alias) = *left else {
19035 return parser_err!(
19036 "BUG: expected identifier expression as alias",
19037 self.peek_token_ref().span.start
19038 );
19039 };
19040 Ok(SelectItem::ExprWithAlias {
19041 expr: *right,
19042 alias,
19043 })
19044 }
19045 expr if self.dialect.supports_select_expr_star()
19046 && self.consume_tokens(&[Token::Period, Token::Mul]) =>
19047 {
19048 let wildcard_token = self.get_previous_token().clone();
19049 Ok(SelectItem::QualifiedWildcard(
19050 SelectItemQualifiedWildcardKind::Expr(expr),
19051 self.parse_wildcard_additional_options(wildcard_token)?,
19052 ))
19053 }
19054 expr if self.dialect.supports_select_item_multi_column_alias()
19055 && self.peek_keyword(Keyword::AS)
19056 && self.peek_nth_token(1).token == Token::LParen =>
19057 {
19058 self.expect_keyword(Keyword::AS)?;
19059 self.expect_token(&Token::LParen)?;
19060 let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
19061 self.expect_token(&Token::RParen)?;
19062 Ok(SelectItem::ExprWithAliases {
19063 expr: maybe_prefixed_expr(expr, prefix),
19064 aliases,
19065 })
19066 }
19067 expr => self
19068 .maybe_parse_select_item_alias()
19069 .map(|alias| match alias {
19070 Some(alias) => SelectItem::ExprWithAlias {
19071 expr: maybe_prefixed_expr(expr, prefix),
19072 alias,
19073 },
19074 None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
19075 }),
19076 }
19077 }
19078
19079 pub fn parse_wildcard_additional_options(
19083 &mut self,
19084 wildcard_token: TokenWithSpan,
19085 ) -> Result<WildcardAdditionalOptions, ParserError> {
19086 let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
19087 self.parse_optional_select_item_ilike()?
19088 } else {
19089 None
19090 };
19091 let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
19092 {
19093 self.parse_optional_select_item_exclude()?
19094 } else {
19095 None
19096 };
19097 let opt_except = if self.dialect.supports_select_wildcard_except() {
19098 self.parse_optional_select_item_except()?
19099 } else {
19100 None
19101 };
19102 let opt_replace = if self.dialect.supports_select_wildcard_replace() {
19103 self.parse_optional_select_item_replace()?
19104 } else {
19105 None
19106 };
19107 let opt_rename = if self.dialect.supports_select_wildcard_rename() {
19108 self.parse_optional_select_item_rename()?
19109 } else {
19110 None
19111 };
19112
19113 let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
19114 self.maybe_parse_select_item_alias()?
19115 } else {
19116 None
19117 };
19118
19119 Ok(WildcardAdditionalOptions {
19120 wildcard_token: wildcard_token.into(),
19121 opt_ilike,
19122 opt_exclude,
19123 opt_except,
19124 opt_rename,
19125 opt_replace,
19126 opt_alias,
19127 })
19128 }
19129
19130 pub fn parse_optional_select_item_ilike(
19134 &mut self,
19135 ) -> Result<Option<IlikeSelectItem>, ParserError> {
19136 let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
19137 let next_token = self.next_token();
19138 let pattern = match next_token.token {
19139 Token::SingleQuotedString(s) => s,
19140 _ => return self.expected("ilike pattern", next_token),
19141 };
19142 Some(IlikeSelectItem { pattern })
19143 } else {
19144 None
19145 };
19146 Ok(opt_ilike)
19147 }
19148
19149 pub fn parse_optional_select_item_exclude(
19153 &mut self,
19154 ) -> Result<Option<ExcludeSelectItem>, ParserError> {
19155 let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
19156 if self.consume_token(&Token::LParen) {
19157 let columns =
19158 self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
19159 self.expect_token(&Token::RParen)?;
19160 Some(ExcludeSelectItem::Multiple(columns))
19161 } else {
19162 let column = self.parse_object_name(false)?;
19163 Some(ExcludeSelectItem::Single(column))
19164 }
19165 } else {
19166 None
19167 };
19168
19169 Ok(opt_exclude)
19170 }
19171
19172 pub fn parse_optional_select_item_except(
19176 &mut self,
19177 ) -> Result<Option<ExceptSelectItem>, ParserError> {
19178 let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
19179 if self.peek_token_ref().token == Token::LParen {
19180 let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
19181 match &idents[..] {
19182 [] => {
19183 return self.expected_ref(
19184 "at least one column should be parsed by the expect clause",
19185 self.peek_token_ref(),
19186 )?;
19187 }
19188 [first, idents @ ..] => Some(ExceptSelectItem {
19189 first_element: first.clone(),
19190 additional_elements: idents.to_vec(),
19191 }),
19192 }
19193 } else {
19194 let ident = self.parse_identifier()?;
19196 Some(ExceptSelectItem {
19197 first_element: ident,
19198 additional_elements: vec![],
19199 })
19200 }
19201 } else {
19202 None
19203 };
19204
19205 Ok(opt_except)
19206 }
19207
19208 pub fn parse_optional_select_item_rename(
19210 &mut self,
19211 ) -> Result<Option<RenameSelectItem>, ParserError> {
19212 let opt_rename = if self.parse_keyword(Keyword::RENAME) {
19213 if self.consume_token(&Token::LParen) {
19214 let idents =
19215 self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
19216 self.expect_token(&Token::RParen)?;
19217 Some(RenameSelectItem::Multiple(idents))
19218 } else {
19219 let ident = self.parse_identifier_with_alias()?;
19220 Some(RenameSelectItem::Single(ident))
19221 }
19222 } else {
19223 None
19224 };
19225
19226 Ok(opt_rename)
19227 }
19228
19229 pub fn parse_optional_select_item_replace(
19231 &mut self,
19232 ) -> Result<Option<ReplaceSelectItem>, ParserError> {
19233 let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
19234 if self.consume_token(&Token::LParen) {
19235 let items = self.parse_comma_separated(|parser| {
19236 Ok(Box::new(parser.parse_replace_elements()?))
19237 })?;
19238 self.expect_token(&Token::RParen)?;
19239 Some(ReplaceSelectItem { items })
19240 } else {
19241 let tok = self.next_token();
19242 return self.expected("( after REPLACE but", tok);
19243 }
19244 } else {
19245 None
19246 };
19247
19248 Ok(opt_replace)
19249 }
19250 pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
19252 let expr = self.parse_expr()?;
19253 let as_keyword = self.parse_keyword(Keyword::AS);
19254 let ident = self.parse_identifier()?;
19255 Ok(ReplaceSelectElement {
19256 expr,
19257 column_name: ident,
19258 as_keyword,
19259 })
19260 }
19261
19262 pub fn parse_asc_desc(&mut self) -> Option<bool> {
19265 if self.parse_keyword(Keyword::ASC) {
19266 Some(true)
19267 } else if self.parse_keyword(Keyword::DESC) {
19268 Some(false)
19269 } else {
19270 None
19271 }
19272 }
19273
19274 fn parse_optional_order_by_sort(&mut self) -> Option<OrderBySort> {
19276 match self.parse_asc_desc() {
19277 Some(true) => Some(OrderBySort::Asc),
19278 Some(false) => Some(OrderBySort::Desc),
19279 None => None,
19280 }
19281 }
19282
19283 pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
19285 self.parse_order_by_expr_inner(false)
19286 .map(|(order_by, _)| order_by)
19287 }
19288
19289 pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
19291 self.parse_order_by_expr_inner(true)
19292 .map(|(column, operator_class)| IndexColumn {
19293 column,
19294 operator_class,
19295 })
19296 }
19297
19298 fn parse_order_by_expr_inner(
19299 &mut self,
19300 with_operator_class: bool,
19301 ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
19302 let expr = self.parse_expr()?;
19303
19304 let operator_class: Option<ObjectName> = if with_operator_class {
19305 if self
19308 .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
19309 .is_some()
19310 {
19311 None
19312 } else {
19313 self.maybe_parse(|parser| parser.parse_object_name(false))?
19314 }
19315 } else {
19316 None
19317 };
19318
19319 let options = if !with_operator_class
19320 && self.dialect.supports_order_by_using_operator()
19321 && self.parse_keyword(Keyword::USING)
19322 {
19323 let op = self.parse_order_by_using_operator()?;
19324 OrderByOptions {
19325 sort: Some(OrderBySort::Using(op)),
19326 nulls_first: self.parse_null_ordering_modifier(),
19327 }
19328 } else {
19329 self.parse_order_by_options()?
19330 };
19331
19332 let with_fill = if self.dialect.supports_with_fill()
19333 && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
19334 {
19335 Some(self.parse_with_fill()?)
19336 } else {
19337 None
19338 };
19339
19340 Ok((
19341 OrderByExpr {
19342 expr,
19343 options,
19344 with_fill,
19345 },
19346 operator_class,
19347 ))
19348 }
19349
19350 fn parse_order_by_using_operator(&mut self) -> Result<ObjectName, ParserError> {
19351 if self.parse_keyword(Keyword::OPERATOR) {
19352 self.expect_token(&Token::LParen)?;
19353 let operator_name = self.parse_operator_name()?;
19354 self.expect_token(&Token::RParen)?;
19355 return Ok(operator_name);
19356 }
19357
19358 let token = self.next_token();
19359 Ok(ObjectName::from(vec![Ident::new(token.token.to_string())]))
19360 }
19361
19362 fn parse_null_ordering_modifier(&mut self) -> Option<bool> {
19363 if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19364 Some(true)
19365 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19366 Some(false)
19367 } else {
19368 None
19369 }
19370 }
19371
19372 fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19373 let sort = self.parse_optional_order_by_sort();
19374 let nulls_first = self.parse_null_ordering_modifier();
19375
19376 Ok(OrderByOptions { sort, nulls_first })
19377 }
19378
19379 pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19383 let from = if self.parse_keyword(Keyword::FROM) {
19384 Some(self.parse_expr()?)
19385 } else {
19386 None
19387 };
19388
19389 let to = if self.parse_keyword(Keyword::TO) {
19390 Some(self.parse_expr()?)
19391 } else {
19392 None
19393 };
19394
19395 let step = if self.parse_keyword(Keyword::STEP) {
19396 Some(self.parse_expr()?)
19397 } else {
19398 None
19399 };
19400
19401 Ok(WithFill { from, to, step })
19402 }
19403
19404 pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19407 if !self.parse_keyword(Keyword::INTERPOLATE) {
19408 return Ok(None);
19409 }
19410
19411 if self.consume_token(&Token::LParen) {
19412 let interpolations =
19413 self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19414 self.expect_token(&Token::RParen)?;
19415 return Ok(Some(Interpolate {
19417 exprs: Some(interpolations),
19418 }));
19419 }
19420
19421 Ok(Some(Interpolate { exprs: None }))
19423 }
19424
19425 pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19427 let column = self.parse_identifier()?;
19428 let expr = if self.parse_keyword(Keyword::AS) {
19429 Some(self.parse_expr()?)
19430 } else {
19431 None
19432 };
19433 Ok(InterpolateExpr { column, expr })
19434 }
19435
19436 pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19439 let quantity = if self.consume_token(&Token::LParen) {
19440 let quantity = self.parse_expr()?;
19441 self.expect_token(&Token::RParen)?;
19442 Some(TopQuantity::Expr(quantity))
19443 } else {
19444 let next_token = self.next_token();
19445 let quantity = match next_token.token {
19446 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19447 _ => self.expected("literal int", next_token)?,
19448 };
19449 Some(TopQuantity::Constant(quantity))
19450 };
19451
19452 let percent = self.parse_keyword(Keyword::PERCENT);
19453
19454 let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19455
19456 Ok(Top {
19457 with_ties,
19458 percent,
19459 quantity,
19460 })
19461 }
19462
19463 pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19465 if self.parse_keyword(Keyword::ALL) {
19466 Ok(None)
19467 } else {
19468 Ok(Some(self.parse_expr()?))
19469 }
19470 }
19471
19472 pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19474 let value = self.parse_expr()?;
19475 let rows = if self.parse_keyword(Keyword::ROW) {
19476 OffsetRows::Row
19477 } else if self.parse_keyword(Keyword::ROWS) {
19478 OffsetRows::Rows
19479 } else {
19480 OffsetRows::None
19481 };
19482 Ok(Offset { value, rows })
19483 }
19484
19485 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19487 let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19488
19489 let (quantity, percent) = if self
19490 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19491 .is_some()
19492 {
19493 (None, false)
19494 } else {
19495 let quantity = Expr::Value(self.parse_value()?);
19496 let percent = self.parse_keyword(Keyword::PERCENT);
19497 let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19498 (Some(quantity), percent)
19499 };
19500
19501 let with_ties = if self.parse_keyword(Keyword::ONLY) {
19502 false
19503 } else {
19504 self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19505 };
19506
19507 Ok(Fetch {
19508 with_ties,
19509 percent,
19510 quantity,
19511 })
19512 }
19513
19514 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19516 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19517 Keyword::UPDATE => LockType::Update,
19518 Keyword::SHARE => LockType::Share,
19519 unexpected_keyword => return Err(ParserError::ParserError(
19520 format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19521 )),
19522 };
19523 let of = if self.parse_keyword(Keyword::OF) {
19524 Some(self.parse_object_name(false)?)
19525 } else {
19526 None
19527 };
19528 let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19529 Some(NonBlock::Nowait)
19530 } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19531 Some(NonBlock::SkipLocked)
19532 } else {
19533 None
19534 };
19535 Ok(LockClause {
19536 lock_type,
19537 of,
19538 nonblock,
19539 })
19540 }
19541
19542 pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19544 self.expect_keyword(Keyword::LOCK)?;
19545
19546 if self.peek_keyword(Keyword::TABLES) {
19547 return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19548 }
19549
19550 let _ = self.parse_keyword(Keyword::TABLE);
19551 let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19552 let lock_mode = if self.parse_keyword(Keyword::IN) {
19553 let lock_mode = self.parse_lock_table_mode()?;
19554 self.expect_keyword(Keyword::MODE)?;
19555 Some(lock_mode)
19556 } else {
19557 None
19558 };
19559 let nowait = self.parse_keyword(Keyword::NOWAIT);
19560
19561 Ok(Lock {
19562 tables,
19563 lock_mode,
19564 nowait,
19565 })
19566 }
19567
19568 fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19569 let only = self.parse_keyword(Keyword::ONLY);
19570 let name = self.parse_object_name(false)?;
19571 let has_asterisk = self.consume_token(&Token::Mul);
19572
19573 Ok(LockTableTarget {
19574 name,
19575 only,
19576 has_asterisk,
19577 })
19578 }
19579
19580 fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19581 if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19582 Ok(LockTableMode::AccessShare)
19583 } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19584 Ok(LockTableMode::AccessExclusive)
19585 } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19586 Ok(LockTableMode::RowShare)
19587 } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19588 Ok(LockTableMode::RowExclusive)
19589 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19590 Ok(LockTableMode::ShareUpdateExclusive)
19591 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19592 Ok(LockTableMode::ShareRowExclusive)
19593 } else if self.parse_keyword(Keyword::SHARE) {
19594 Ok(LockTableMode::Share)
19595 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19596 Ok(LockTableMode::Exclusive)
19597 } else {
19598 self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19599 }
19600 }
19601
19602 pub fn parse_values(
19604 &mut self,
19605 allow_empty: bool,
19606 value_keyword: bool,
19607 ) -> Result<Values, ParserError> {
19608 let mut explicit_row = false;
19609
19610 let rows = self.parse_comma_separated(|parser| {
19611 if parser.parse_keyword(Keyword::ROW) {
19612 explicit_row = true;
19613 }
19614 Ok(Parens {
19615 opening_token: parser.expect_token(&Token::LParen)?.into(),
19616 content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19617 vec![]
19618 } else {
19619 parser.parse_comma_separated(Parser::parse_expr)?
19620 },
19621 closing_token: parser.expect_token(&Token::RParen)?.into(),
19622 })
19623 })?;
19624 Ok(Values {
19625 explicit_row,
19626 rows,
19627 value_keyword,
19628 })
19629 }
19630
19631 pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19633 self.expect_keyword_is(Keyword::TRANSACTION)?;
19634 Ok(Statement::StartTransaction {
19635 modes: self.parse_transaction_modes()?,
19636 begin: false,
19637 transaction: Some(BeginTransactionKind::Transaction),
19638 modifier: None,
19639 statements: vec![],
19640 exception: None,
19641 has_end_keyword: false,
19642 })
19643 }
19644
19645 pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19647 if !self.dialect.supports_start_transaction_modifier() {
19648 None
19649 } else if self.parse_keyword(Keyword::DEFERRED) {
19650 Some(TransactionModifier::Deferred)
19651 } else if self.parse_keyword(Keyword::IMMEDIATE) {
19652 Some(TransactionModifier::Immediate)
19653 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19654 Some(TransactionModifier::Exclusive)
19655 } else if self.parse_keyword(Keyword::TRY) {
19656 Some(TransactionModifier::Try)
19657 } else if self.parse_keyword(Keyword::CATCH) {
19658 Some(TransactionModifier::Catch)
19659 } else {
19660 None
19661 }
19662 }
19663
19664 pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19666 let modifier = self.parse_transaction_modifier();
19667 let transaction =
19668 match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19669 {
19670 Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19671 Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19672 Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19673 _ => None,
19674 };
19675 Ok(Statement::StartTransaction {
19676 modes: self.parse_transaction_modes()?,
19677 begin: true,
19678 transaction,
19679 modifier,
19680 statements: vec![],
19681 exception: None,
19682 has_end_keyword: false,
19683 })
19684 }
19685
19686 pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19688 let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19689
19690 let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19691 let mut when = Vec::new();
19692
19693 while !self.peek_keyword(Keyword::END) {
19695 self.expect_keyword(Keyword::WHEN)?;
19696
19697 let mut idents = Vec::new();
19701
19702 while !self.parse_keyword(Keyword::THEN) {
19703 let ident = self.parse_identifier()?;
19704 idents.push(ident);
19705
19706 self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19707 }
19708
19709 let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19710
19711 when.push(ExceptionWhen { idents, statements });
19712 }
19713
19714 Some(when)
19715 } else {
19716 None
19717 };
19718
19719 self.expect_keyword(Keyword::END)?;
19720
19721 Ok(Statement::StartTransaction {
19722 begin: true,
19723 statements,
19724 exception,
19725 has_end_keyword: true,
19726 transaction: None,
19727 modifier: None,
19728 modes: Default::default(),
19729 })
19730 }
19731
19732 pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19734 let modifier = if !self.dialect.supports_end_transaction_modifier() {
19735 None
19736 } else if self.parse_keyword(Keyword::TRY) {
19737 Some(TransactionModifier::Try)
19738 } else if self.parse_keyword(Keyword::CATCH) {
19739 Some(TransactionModifier::Catch)
19740 } else {
19741 None
19742 };
19743 Ok(Statement::Commit {
19744 chain: self.parse_commit_rollback_chain()?,
19745 end: true,
19746 modifier,
19747 })
19748 }
19749
19750 pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19752 let mut modes = vec![];
19753 let mut required = false;
19754 loop {
19755 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19756 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19757 TransactionIsolationLevel::ReadUncommitted
19758 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19759 TransactionIsolationLevel::ReadCommitted
19760 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19761 TransactionIsolationLevel::RepeatableRead
19762 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19763 TransactionIsolationLevel::Serializable
19764 } else if self.parse_keyword(Keyword::SNAPSHOT) {
19765 TransactionIsolationLevel::Snapshot
19766 } else {
19767 self.expected_ref("isolation level", self.peek_token_ref())?
19768 };
19769 TransactionMode::IsolationLevel(iso_level)
19770 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19771 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19772 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19773 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19774 } else if required {
19775 self.expected_ref("transaction mode", self.peek_token_ref())?
19776 } else {
19777 break;
19778 };
19779 modes.push(mode);
19780 required = self.consume_token(&Token::Comma);
19785 }
19786 Ok(modes)
19787 }
19788
19789 pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19791 Ok(Statement::Commit {
19792 chain: self.parse_commit_rollback_chain()?,
19793 end: false,
19794 modifier: None,
19795 })
19796 }
19797
19798 pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19800 let chain = self.parse_commit_rollback_chain()?;
19801 let savepoint = self.parse_rollback_savepoint()?;
19802
19803 Ok(Statement::Rollback { chain, savepoint })
19804 }
19805
19806 pub fn parse_abort(&mut self) -> Result<Statement, ParserError> {
19812 let chain = self.parse_commit_rollback_chain()?;
19813
19814 Ok(Statement::Rollback {
19815 chain,
19816 savepoint: None,
19817 })
19818 }
19819
19820 pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19822 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19823 if self.parse_keyword(Keyword::AND) {
19824 let chain = !self.parse_keyword(Keyword::NO);
19825 self.expect_keyword_is(Keyword::CHAIN)?;
19826 Ok(chain)
19827 } else {
19828 Ok(false)
19829 }
19830 }
19831
19832 pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19834 if self.parse_keyword(Keyword::TO) {
19835 let _ = self.parse_keyword(Keyword::SAVEPOINT);
19836 let savepoint = self.parse_identifier()?;
19837
19838 Ok(Some(savepoint))
19839 } else {
19840 Ok(None)
19841 }
19842 }
19843
19844 pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19846 self.expect_token(&Token::LParen)?;
19847 let message = Box::new(self.parse_expr()?);
19848 self.expect_token(&Token::Comma)?;
19849 let severity = Box::new(self.parse_expr()?);
19850 self.expect_token(&Token::Comma)?;
19851 let state = Box::new(self.parse_expr()?);
19852 let arguments = if self.consume_token(&Token::Comma) {
19853 self.parse_comma_separated(Parser::parse_expr)?
19854 } else {
19855 vec![]
19856 };
19857 self.expect_token(&Token::RParen)?;
19858 let options = if self.parse_keyword(Keyword::WITH) {
19859 self.parse_comma_separated(Parser::parse_raiserror_option)?
19860 } else {
19861 vec![]
19862 };
19863 Ok(Statement::RaisError {
19864 message,
19865 severity,
19866 state,
19867 arguments,
19868 options,
19869 })
19870 }
19871
19872 pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19874 match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19875 Keyword::LOG => Ok(RaisErrorOption::Log),
19876 Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19877 Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19878 _ => self.expected_ref(
19879 "LOG, NOWAIT OR SETERROR raiserror option",
19880 self.peek_token_ref(),
19881 ),
19882 }
19883 }
19884
19885 pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
19889 self.expect_keyword_is(Keyword::THROW)?;
19890
19891 let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
19892 let (message, state) = if error_number.is_some() {
19893 self.expect_token(&Token::Comma)?;
19894 let message = Box::new(self.parse_expr()?);
19895 self.expect_token(&Token::Comma)?;
19896 let state = Box::new(self.parse_expr()?);
19897 (Some(message), Some(state))
19898 } else {
19899 (None, None)
19900 };
19901
19902 Ok(ThrowStatement {
19903 error_number,
19904 message,
19905 state,
19906 })
19907 }
19908
19909 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
19911 let prepare = self.parse_keyword(Keyword::PREPARE);
19912 let name = self.parse_identifier()?;
19913 Ok(Statement::Deallocate { name, prepare })
19914 }
19915
19916 pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
19918 let immediate =
19919 self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
19920
19921 let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
19927 None
19928 } else {
19929 Some(self.parse_object_name(false)?)
19930 };
19931
19932 let has_parentheses = self.consume_token(&Token::LParen);
19933
19934 let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
19935 let end_token = match (has_parentheses, self.peek_token().token) {
19936 (true, _) => Token::RParen,
19937 (false, Token::EOF) => Token::EOF,
19938 (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
19939 (false, _) => Token::SemiColon,
19940 };
19941
19942 let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
19943
19944 if has_parentheses {
19945 self.expect_token(&Token::RParen)?;
19946 }
19947
19948 let into = if self.parse_keyword(Keyword::INTO) {
19949 self.parse_comma_separated(Self::parse_identifier)?
19950 } else {
19951 vec![]
19952 };
19953
19954 let using = if self.parse_keyword(Keyword::USING) {
19955 self.parse_comma_separated(Self::parse_expr_with_alias)?
19956 } else {
19957 vec![]
19958 };
19959
19960 let output = self.parse_keyword(Keyword::OUTPUT);
19961
19962 let default = self.parse_keyword(Keyword::DEFAULT);
19963
19964 Ok(Statement::Execute {
19965 immediate,
19966 name,
19967 parameters,
19968 has_parentheses,
19969 into,
19970 using,
19971 output,
19972 default,
19973 })
19974 }
19975
19976 pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
19978 let name = self.parse_identifier()?;
19979
19980 let mut data_types = vec![];
19981 if self.consume_token(&Token::LParen) {
19982 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
19983 self.expect_token(&Token::RParen)?;
19984 }
19985
19986 self.expect_keyword_is(Keyword::AS)?;
19987 let statement = Box::new(self.parse_statement()?);
19988 Ok(Statement::Prepare {
19989 name,
19990 data_types,
19991 statement,
19992 })
19993 }
19994
19995 pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
19997 self.expect_keyword(Keyword::UNLOAD)?;
19998 self.expect_token(&Token::LParen)?;
19999 let (query, query_text) =
20000 if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
20001 (None, Some(self.parse_literal_string()?))
20002 } else {
20003 (Some(self.parse_query()?), None)
20004 };
20005 self.expect_token(&Token::RParen)?;
20006
20007 self.expect_keyword_is(Keyword::TO)?;
20008 let to = self.parse_identifier()?;
20009 let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
20010 Some(self.parse_iam_role_kind()?)
20011 } else {
20012 None
20013 };
20014 let with = self.parse_options(Keyword::WITH)?;
20015 let mut options = vec![];
20016 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
20017 options.push(opt);
20018 }
20019 Ok(Statement::Unload {
20020 query,
20021 query_text,
20022 to,
20023 auth,
20024 with,
20025 options,
20026 })
20027 }
20028
20029 fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
20030 let temporary = self
20031 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
20032 .is_some();
20033 let unlogged = self.parse_keyword(Keyword::UNLOGGED);
20034 let table = self.parse_keyword(Keyword::TABLE);
20035 let targets = self.parse_comma_separated(Parser::parse_expr)?;
20036
20037 Ok(SelectInto {
20038 temporary,
20039 unlogged,
20040 table,
20041 targets,
20042 })
20043 }
20044
20045 fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
20046 let v = self.parse_value()?;
20047 match &v.value {
20048 Value::SingleQuotedString(_) => Ok(v),
20049 Value::DoubleQuotedString(_) => Ok(v),
20050 Value::Number(_, _) => Ok(v),
20051 Value::Placeholder(_) => Ok(v),
20052 _ => {
20053 self.prev_token();
20054 self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
20055 }
20056 }
20057 }
20058
20059 pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
20061 let name = self.parse_object_name(false)?;
20062 if self.consume_token(&Token::LParen) {
20063 let value = self.parse_pragma_value()?;
20064 self.expect_token(&Token::RParen)?;
20065 Ok(Statement::Pragma {
20066 name,
20067 value: Some(value),
20068 is_eq: false,
20069 })
20070 } else if self.consume_token(&Token::Eq) {
20071 Ok(Statement::Pragma {
20072 name,
20073 value: Some(self.parse_pragma_value()?),
20074 is_eq: true,
20075 })
20076 } else {
20077 Ok(Statement::Pragma {
20078 name,
20079 value: None,
20080 is_eq: false,
20081 })
20082 }
20083 }
20084
20085 pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
20087 let extension_name = self.parse_identifier()?;
20088
20089 Ok(Statement::Install { extension_name })
20090 }
20091
20092 pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
20094 if self.dialect.supports_load_extension() {
20095 let extension_name = self.parse_identifier()?;
20096 Ok(Statement::Load { extension_name })
20097 } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
20098 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
20099 self.expect_keyword_is(Keyword::INPATH)?;
20100 let inpath = self.parse_literal_string()?;
20101 let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
20102 self.expect_keyword_is(Keyword::INTO)?;
20103 self.expect_keyword_is(Keyword::TABLE)?;
20104 let table_name = self.parse_object_name(false)?;
20105 let partitioned = self.parse_insert_partition()?;
20106 let table_format = self.parse_load_data_table_format()?;
20107 Ok(Statement::LoadData {
20108 local,
20109 inpath,
20110 overwrite,
20111 table_name,
20112 partitioned,
20113 table_format,
20114 })
20115 } else {
20116 self.expected_ref(
20117 "`DATA` or an extension name after `LOAD`",
20118 self.peek_token_ref(),
20119 )
20120 }
20121 }
20122
20123 pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
20135 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
20136
20137 let name = self.parse_object_name(false)?;
20138
20139 let on_cluster = self.parse_optional_on_cluster()?;
20141
20142 let partition = if self.parse_keyword(Keyword::PARTITION) {
20143 if self.parse_keyword(Keyword::ID) {
20144 Some(Partition::Identifier(self.parse_identifier()?))
20145 } else {
20146 Some(Partition::Expr(self.parse_expr()?))
20147 }
20148 } else {
20149 None
20150 };
20151
20152 let include_final = self.parse_keyword(Keyword::FINAL);
20153
20154 let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
20155 if self.parse_keyword(Keyword::BY) {
20156 Some(Deduplicate::ByExpression(self.parse_expr()?))
20157 } else {
20158 Some(Deduplicate::All)
20159 }
20160 } else {
20161 None
20162 };
20163
20164 let predicate = if self.parse_keyword(Keyword::WHERE) {
20166 Some(self.parse_expr()?)
20167 } else {
20168 None
20169 };
20170
20171 let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
20172 self.expect_token(&Token::LParen)?;
20173 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
20174 self.expect_token(&Token::RParen)?;
20175 Some(columns)
20176 } else {
20177 None
20178 };
20179
20180 Ok(Statement::OptimizeTable {
20181 name,
20182 has_table_keyword,
20183 on_cluster,
20184 partition,
20185 include_final,
20186 deduplicate,
20187 predicate,
20188 zorder,
20189 })
20190 }
20191
20192 pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
20198 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20200 let name = self.parse_object_name(false)?;
20202 let mut data_type: Option<DataType> = None;
20204 if self.parse_keywords(&[Keyword::AS]) {
20205 data_type = Some(self.parse_data_type()?)
20206 }
20207 let sequence_options = self.parse_create_sequence_options()?;
20208 let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
20210 if self.parse_keywords(&[Keyword::NONE]) {
20211 Some(ObjectName::from(vec![Ident::new("NONE")]))
20212 } else {
20213 Some(self.parse_object_name(false)?)
20214 }
20215 } else {
20216 None
20217 };
20218 Ok(Statement::CreateSequence {
20219 temporary,
20220 if_not_exists,
20221 name,
20222 data_type,
20223 sequence_options,
20224 owned_by,
20225 })
20226 }
20227
20228 fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
20229 let mut sequence_options = vec![];
20230 if self.parse_keywords(&[Keyword::INCREMENT]) {
20232 if self.parse_keywords(&[Keyword::BY]) {
20233 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
20234 } else {
20235 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
20236 }
20237 }
20238 if self.parse_keyword(Keyword::MINVALUE) {
20240 sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
20241 } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
20242 sequence_options.push(SequenceOptions::MinValue(None));
20243 }
20244 if self.parse_keywords(&[Keyword::MAXVALUE]) {
20246 sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
20247 } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
20248 sequence_options.push(SequenceOptions::MaxValue(None));
20249 }
20250
20251 if self.parse_keywords(&[Keyword::START]) {
20253 if self.parse_keywords(&[Keyword::WITH]) {
20254 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
20255 } else {
20256 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
20257 }
20258 }
20259 if self.parse_keywords(&[Keyword::CACHE]) {
20261 sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
20262 }
20263 if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
20265 sequence_options.push(SequenceOptions::Cycle(true));
20266 } else if self.parse_keywords(&[Keyword::CYCLE]) {
20267 sequence_options.push(SequenceOptions::Cycle(false));
20268 }
20269
20270 Ok(sequence_options)
20271 }
20272
20273 pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
20277 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20278 let name = self.parse_object_name(false)?;
20279
20280 let server_type = if self.parse_keyword(Keyword::TYPE) {
20281 Some(self.parse_identifier()?)
20282 } else {
20283 None
20284 };
20285
20286 let version = if self.parse_keyword(Keyword::VERSION) {
20287 Some(self.parse_identifier()?)
20288 } else {
20289 None
20290 };
20291
20292 self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
20293 let foreign_data_wrapper = self.parse_object_name(false)?;
20294
20295 let mut options = None;
20296 if self.parse_keyword(Keyword::OPTIONS) {
20297 self.expect_token(&Token::LParen)?;
20298 options = Some(self.parse_comma_separated(|p| {
20299 let key = p.parse_identifier()?;
20300 let value = p.parse_identifier()?;
20301 Ok(CreateServerOption { key, value })
20302 })?);
20303 self.expect_token(&Token::RParen)?;
20304 }
20305
20306 Ok(Statement::CreateServer(CreateServerStatement {
20307 name,
20308 if_not_exists: ine,
20309 server_type,
20310 version,
20311 foreign_data_wrapper,
20312 options,
20313 }))
20314 }
20315
20316 pub fn index(&self) -> usize {
20318 self.index
20319 }
20320
20321 pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
20323 let ident = self.parse_identifier()?;
20324 self.expect_keyword_is(Keyword::AS)?;
20325
20326 let window_expr = if self.consume_token(&Token::LParen) {
20327 NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
20328 } else if self.dialect.supports_window_clause_named_window_reference() {
20329 NamedWindowExpr::NamedWindow(self.parse_identifier()?)
20330 } else {
20331 return self.expected_ref("(", self.peek_token_ref());
20332 };
20333
20334 Ok(NamedWindowDefinition(ident, window_expr))
20335 }
20336
20337 pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
20339 let name = self.parse_object_name(false)?;
20340 let params = self.parse_optional_procedure_parameters()?;
20341
20342 let language = if self.parse_keyword(Keyword::LANGUAGE) {
20343 Some(self.parse_identifier()?)
20344 } else {
20345 None
20346 };
20347
20348 self.expect_keyword_is(Keyword::AS)?;
20349
20350 let body = self.parse_conditional_statements(&[Keyword::END])?;
20351
20352 Ok(Statement::CreateProcedure {
20353 name,
20354 or_alter,
20355 params,
20356 language,
20357 body,
20358 })
20359 }
20360
20361 pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
20363 let window_name = match &self.peek_token_ref().token {
20364 Token::Word(word) if word.keyword == Keyword::NoKeyword => {
20365 self.parse_optional_ident()?
20366 }
20367 _ => None,
20368 };
20369
20370 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
20371 self.parse_comma_separated(Parser::parse_expr)?
20372 } else {
20373 vec![]
20374 };
20375 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
20376 self.parse_comma_separated(Parser::parse_order_by_expr)?
20377 } else {
20378 vec![]
20379 };
20380
20381 let window_frame = if !self.consume_token(&Token::RParen) {
20382 let window_frame = self.parse_window_frame()?;
20383 self.expect_token(&Token::RParen)?;
20384 Some(window_frame)
20385 } else {
20386 None
20387 };
20388 Ok(WindowSpec {
20389 window_name,
20390 partition_by,
20391 order_by,
20392 window_frame,
20393 })
20394 }
20395
20396 pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
20398 let name = self.parse_object_name(false)?;
20399
20400 let has_as = self.parse_keyword(Keyword::AS);
20402
20403 if !has_as {
20404 if self.consume_token(&Token::LParen) {
20406 let options = self.parse_create_type_sql_definition_options()?;
20408 self.expect_token(&Token::RParen)?;
20409 return Ok(Statement::CreateType {
20410 name,
20411 representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
20412 });
20413 }
20414
20415 return Ok(Statement::CreateType {
20417 name,
20418 representation: None,
20419 });
20420 }
20421
20422 if self.parse_keyword(Keyword::ENUM) {
20424 self.parse_create_type_enum(name)
20426 } else if self.parse_keyword(Keyword::RANGE) {
20427 self.parse_create_type_range(name)
20429 } else if self.consume_token(&Token::LParen) {
20430 self.parse_create_type_composite(name)
20432 } else {
20433 self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
20434 }
20435 }
20436
20437 fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20441 if self.consume_token(&Token::RParen) {
20442 return Ok(Statement::CreateType {
20444 name,
20445 representation: Some(UserDefinedTypeRepresentation::Composite {
20446 attributes: vec![],
20447 }),
20448 });
20449 }
20450
20451 let mut attributes = vec![];
20452 loop {
20453 let attr_name = self.parse_identifier()?;
20454 let attr_data_type = self.parse_data_type()?;
20455 let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
20456 Some(self.parse_object_name(false)?)
20457 } else {
20458 None
20459 };
20460 attributes.push(UserDefinedTypeCompositeAttributeDef {
20461 name: attr_name,
20462 data_type: attr_data_type,
20463 collation: attr_collation,
20464 });
20465
20466 if !self.consume_token(&Token::Comma) {
20467 break;
20468 }
20469 }
20470 self.expect_token(&Token::RParen)?;
20471
20472 Ok(Statement::CreateType {
20473 name,
20474 representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
20475 })
20476 }
20477
20478 pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20482 self.expect_token(&Token::LParen)?;
20483 let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20484 self.expect_token(&Token::RParen)?;
20485
20486 Ok(Statement::CreateType {
20487 name,
20488 representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
20489 })
20490 }
20491
20492 fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20496 self.expect_token(&Token::LParen)?;
20497 let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
20498 self.expect_token(&Token::RParen)?;
20499
20500 Ok(Statement::CreateType {
20501 name,
20502 representation: Some(UserDefinedTypeRepresentation::Range { options }),
20503 })
20504 }
20505
20506 fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
20508 let keyword = self.parse_one_of_keywords(&[
20509 Keyword::SUBTYPE,
20510 Keyword::SUBTYPE_OPCLASS,
20511 Keyword::COLLATION,
20512 Keyword::CANONICAL,
20513 Keyword::SUBTYPE_DIFF,
20514 Keyword::MULTIRANGE_TYPE_NAME,
20515 ]);
20516
20517 match keyword {
20518 Some(Keyword::SUBTYPE) => {
20519 self.expect_token(&Token::Eq)?;
20520 let data_type = self.parse_data_type()?;
20521 Ok(UserDefinedTypeRangeOption::Subtype(data_type))
20522 }
20523 Some(Keyword::SUBTYPE_OPCLASS) => {
20524 self.expect_token(&Token::Eq)?;
20525 let name = self.parse_object_name(false)?;
20526 Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
20527 }
20528 Some(Keyword::COLLATION) => {
20529 self.expect_token(&Token::Eq)?;
20530 let name = self.parse_object_name(false)?;
20531 Ok(UserDefinedTypeRangeOption::Collation(name))
20532 }
20533 Some(Keyword::CANONICAL) => {
20534 self.expect_token(&Token::Eq)?;
20535 let name = self.parse_object_name(false)?;
20536 Ok(UserDefinedTypeRangeOption::Canonical(name))
20537 }
20538 Some(Keyword::SUBTYPE_DIFF) => {
20539 self.expect_token(&Token::Eq)?;
20540 let name = self.parse_object_name(false)?;
20541 Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20542 }
20543 Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20544 self.expect_token(&Token::Eq)?;
20545 let name = self.parse_object_name(false)?;
20546 Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20547 }
20548 _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20549 }
20550 }
20551
20552 fn parse_create_type_sql_definition_options(
20554 &mut self,
20555 ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20556 self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20557 }
20558
20559 fn parse_sql_definition_option(
20561 &mut self,
20562 ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20563 let keyword = self.parse_one_of_keywords(&[
20564 Keyword::INPUT,
20565 Keyword::OUTPUT,
20566 Keyword::RECEIVE,
20567 Keyword::SEND,
20568 Keyword::TYPMOD_IN,
20569 Keyword::TYPMOD_OUT,
20570 Keyword::ANALYZE,
20571 Keyword::SUBSCRIPT,
20572 Keyword::INTERNALLENGTH,
20573 Keyword::PASSEDBYVALUE,
20574 Keyword::ALIGNMENT,
20575 Keyword::STORAGE,
20576 Keyword::LIKE,
20577 Keyword::CATEGORY,
20578 Keyword::PREFERRED,
20579 Keyword::DEFAULT,
20580 Keyword::ELEMENT,
20581 Keyword::DELIMITER,
20582 Keyword::COLLATABLE,
20583 ]);
20584
20585 match keyword {
20586 Some(Keyword::INPUT) => {
20587 self.expect_token(&Token::Eq)?;
20588 let name = self.parse_object_name(false)?;
20589 Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20590 }
20591 Some(Keyword::OUTPUT) => {
20592 self.expect_token(&Token::Eq)?;
20593 let name = self.parse_object_name(false)?;
20594 Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20595 }
20596 Some(Keyword::RECEIVE) => {
20597 self.expect_token(&Token::Eq)?;
20598 let name = self.parse_object_name(false)?;
20599 Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20600 }
20601 Some(Keyword::SEND) => {
20602 self.expect_token(&Token::Eq)?;
20603 let name = self.parse_object_name(false)?;
20604 Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20605 }
20606 Some(Keyword::TYPMOD_IN) => {
20607 self.expect_token(&Token::Eq)?;
20608 let name = self.parse_object_name(false)?;
20609 Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20610 }
20611 Some(Keyword::TYPMOD_OUT) => {
20612 self.expect_token(&Token::Eq)?;
20613 let name = self.parse_object_name(false)?;
20614 Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20615 }
20616 Some(Keyword::ANALYZE) => {
20617 self.expect_token(&Token::Eq)?;
20618 let name = self.parse_object_name(false)?;
20619 Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20620 }
20621 Some(Keyword::SUBSCRIPT) => {
20622 self.expect_token(&Token::Eq)?;
20623 let name = self.parse_object_name(false)?;
20624 Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20625 }
20626 Some(Keyword::INTERNALLENGTH) => {
20627 self.expect_token(&Token::Eq)?;
20628 if self.parse_keyword(Keyword::VARIABLE) {
20629 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20630 UserDefinedTypeInternalLength::Variable,
20631 ))
20632 } else {
20633 let value = self.parse_literal_uint()?;
20634 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20635 UserDefinedTypeInternalLength::Fixed(value),
20636 ))
20637 }
20638 }
20639 Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20640 Some(Keyword::ALIGNMENT) => {
20641 self.expect_token(&Token::Eq)?;
20642 let align_keyword = self.parse_one_of_keywords(&[
20643 Keyword::CHAR,
20644 Keyword::INT2,
20645 Keyword::INT4,
20646 Keyword::DOUBLE,
20647 ]);
20648 match align_keyword {
20649 Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20650 Alignment::Char,
20651 )),
20652 Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20653 Alignment::Int2,
20654 )),
20655 Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20656 Alignment::Int4,
20657 )),
20658 Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20659 Alignment::Double,
20660 )),
20661 _ => self.expected_ref(
20662 "alignment value (char, int2, int4, or double)",
20663 self.peek_token_ref(),
20664 ),
20665 }
20666 }
20667 Some(Keyword::STORAGE) => {
20668 self.expect_token(&Token::Eq)?;
20669 let storage_keyword = self.parse_one_of_keywords(&[
20670 Keyword::PLAIN,
20671 Keyword::EXTERNAL,
20672 Keyword::EXTENDED,
20673 Keyword::MAIN,
20674 ]);
20675 match storage_keyword {
20676 Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20677 UserDefinedTypeStorage::Plain,
20678 )),
20679 Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20680 UserDefinedTypeStorage::External,
20681 )),
20682 Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20683 UserDefinedTypeStorage::Extended,
20684 )),
20685 Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20686 UserDefinedTypeStorage::Main,
20687 )),
20688 _ => self.expected_ref(
20689 "storage value (plain, external, extended, or main)",
20690 self.peek_token_ref(),
20691 ),
20692 }
20693 }
20694 Some(Keyword::LIKE) => {
20695 self.expect_token(&Token::Eq)?;
20696 let name = self.parse_object_name(false)?;
20697 Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20698 }
20699 Some(Keyword::CATEGORY) => {
20700 self.expect_token(&Token::Eq)?;
20701 let category_str = self.parse_literal_string()?;
20702 let category_char = category_str.chars().next().ok_or_else(|| {
20703 ParserError::ParserError(
20704 "CATEGORY value must be a single character".to_string(),
20705 )
20706 })?;
20707 Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20708 }
20709 Some(Keyword::PREFERRED) => {
20710 self.expect_token(&Token::Eq)?;
20711 let value =
20712 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20713 Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20714 }
20715 Some(Keyword::DEFAULT) => {
20716 self.expect_token(&Token::Eq)?;
20717 let expr = self.parse_expr()?;
20718 Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20719 }
20720 Some(Keyword::ELEMENT) => {
20721 self.expect_token(&Token::Eq)?;
20722 let data_type = self.parse_data_type()?;
20723 Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20724 }
20725 Some(Keyword::DELIMITER) => {
20726 self.expect_token(&Token::Eq)?;
20727 let delimiter = self.parse_literal_string()?;
20728 Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20729 }
20730 Some(Keyword::COLLATABLE) => {
20731 self.expect_token(&Token::Eq)?;
20732 let value =
20733 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20734 Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20735 }
20736 _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20737 }
20738 }
20739
20740 fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20741 self.expect_token(&Token::LParen)?;
20742 let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20743 self.expect_token(&Token::RParen)?;
20744 Ok(idents)
20745 }
20746
20747 fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20748 if dialect_of!(self is MySqlDialect | GenericDialect) {
20749 if self.parse_keyword(Keyword::FIRST) {
20750 Ok(Some(MySQLColumnPosition::First))
20751 } else if self.parse_keyword(Keyword::AFTER) {
20752 let ident = self.parse_identifier()?;
20753 Ok(Some(MySQLColumnPosition::After(ident)))
20754 } else {
20755 Ok(None)
20756 }
20757 } else {
20758 Ok(None)
20759 }
20760 }
20761
20762 fn parse_print(&mut self) -> Result<Statement, ParserError> {
20764 Ok(Statement::Print(PrintStatement {
20765 message: Box::new(self.parse_expr()?),
20766 }))
20767 }
20768
20769 fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20773 let wait_type = if self.parse_keyword(Keyword::DELAY) {
20774 WaitForType::Delay
20775 } else if self.parse_keyword(Keyword::TIME) {
20776 WaitForType::Time
20777 } else {
20778 return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20779 };
20780 let expr = self.parse_expr()?;
20781 Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20782 }
20783
20784 fn parse_return(&mut self) -> Result<Statement, ParserError> {
20786 match self.maybe_parse(|p| p.parse_expr())? {
20787 Some(expr) => Ok(Statement::Return(ReturnStatement {
20788 value: Some(ReturnStatementValue::Expr(expr)),
20789 })),
20790 None => Ok(Statement::Return(ReturnStatement { value: None })),
20791 }
20792 }
20793
20794 fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20798 self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20799
20800 let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20801 Some(self.parse_object_name(false)?)
20802 } else {
20803 None
20804 };
20805 self.expect_keyword(Keyword::OPTIONS)?;
20806 self.expect_token(&Token::LParen)?;
20807 let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20808 self.expect_token(&Token::RParen)?;
20809 self.expect_keyword(Keyword::AS)?;
20810 let query = self.parse_query()?;
20811 Ok(Statement::ExportData(ExportData {
20812 options,
20813 query,
20814 connection,
20815 }))
20816 }
20817
20818 fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20819 self.expect_keyword(Keyword::VACUUM)?;
20820 let full = self.parse_keyword(Keyword::FULL);
20821 let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20822 let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20823 let reindex = self.parse_keyword(Keyword::REINDEX);
20824 let recluster = self.parse_keyword(Keyword::RECLUSTER);
20825 let (table_name, threshold, boost) =
20826 match self.maybe_parse(|p| p.parse_object_name(false))? {
20827 Some(table_name) => {
20828 let threshold = if self.parse_keyword(Keyword::TO) {
20829 let value = self.parse_value()?;
20830 self.expect_keyword(Keyword::PERCENT)?;
20831 Some(value)
20832 } else {
20833 None
20834 };
20835 let boost = self.parse_keyword(Keyword::BOOST);
20836 (Some(table_name), threshold, boost)
20837 }
20838 _ => (None, None, false),
20839 };
20840 Ok(Statement::Vacuum(VacuumStatement {
20841 full,
20842 sort_only,
20843 delete_only,
20844 reindex,
20845 recluster,
20846 table_name,
20847 threshold,
20848 boost,
20849 }))
20850 }
20851
20852 pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20854 self.tokens
20855 }
20856
20857 fn peek_sub_query(&mut self) -> bool {
20859 self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20860 .is_some()
20861 }
20862
20863 pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20864 let show_in;
20865 let mut filter_position = None;
20866 if self.dialect.supports_show_like_before_in() {
20867 if let Some(filter) = self.parse_show_statement_filter()? {
20868 filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20869 }
20870 show_in = self.maybe_parse_show_stmt_in()?;
20871 } else {
20872 show_in = self.maybe_parse_show_stmt_in()?;
20873 if let Some(filter) = self.parse_show_statement_filter()? {
20874 filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20875 }
20876 }
20877 let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20878 let limit = self.maybe_parse_show_stmt_limit()?;
20879 let from = self.maybe_parse_show_stmt_from()?;
20880 Ok(ShowStatementOptions {
20881 filter_position,
20882 show_in,
20883 starts_with,
20884 limit,
20885 limit_from: from,
20886 })
20887 }
20888
20889 fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
20890 let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
20891 Some(Keyword::FROM) => ShowStatementInClause::FROM,
20892 Some(Keyword::IN) => ShowStatementInClause::IN,
20893 None => return Ok(None),
20894 _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
20895 };
20896
20897 let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
20898 Keyword::ACCOUNT,
20899 Keyword::DATABASE,
20900 Keyword::SCHEMA,
20901 Keyword::TABLE,
20902 Keyword::VIEW,
20903 ]) {
20904 Some(Keyword::DATABASE)
20906 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20907 | self.peek_keyword(Keyword::LIMIT) =>
20908 {
20909 (Some(ShowStatementInParentType::Database), None)
20910 }
20911 Some(Keyword::SCHEMA)
20912 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20913 | self.peek_keyword(Keyword::LIMIT) =>
20914 {
20915 (Some(ShowStatementInParentType::Schema), None)
20916 }
20917 Some(parent_kw) => {
20918 let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
20922 match parent_kw {
20923 Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
20924 Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
20925 Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
20926 Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
20927 Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
20928 _ => {
20929 return self.expected_ref(
20930 "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
20931 self.peek_token_ref(),
20932 )
20933 }
20934 }
20935 }
20936 None => {
20937 let mut parent_name = self.parse_object_name(false)?;
20940 if self
20941 .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
20942 .is_some()
20943 {
20944 parent_name
20945 .0
20946 .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
20947 }
20948 (None, Some(parent_name))
20949 }
20950 };
20951
20952 Ok(Some(ShowStatementIn {
20953 clause,
20954 parent_type,
20955 parent_name,
20956 }))
20957 }
20958
20959 fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20960 if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
20961 Ok(Some(self.parse_value()?))
20962 } else {
20963 Ok(None)
20964 }
20965 }
20966
20967 fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
20968 if self.parse_keyword(Keyword::LIMIT) {
20969 Ok(self.parse_limit()?)
20970 } else {
20971 Ok(None)
20972 }
20973 }
20974
20975 fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20976 if self.parse_keyword(Keyword::FROM) {
20977 Ok(Some(self.parse_value()?))
20978 } else {
20979 Ok(None)
20980 }
20981 }
20982
20983 pub(crate) fn in_column_definition_state(&self) -> bool {
20984 matches!(self.state, ColumnDefinition)
20985 }
20986
20987 pub(crate) fn parse_key_value_options(
20992 &mut self,
20993 parenthesized: bool,
20994 end_words: &[Keyword],
20995 ) -> Result<KeyValueOptions, ParserError> {
20996 let mut options: Vec<KeyValueOption> = Vec::new();
20997 let mut delimiter = KeyValueOptionsDelimiter::Space;
20998 if parenthesized {
20999 self.expect_token(&Token::LParen)?;
21000 }
21001 loop {
21002 match self.next_token().token {
21003 Token::RParen => {
21004 if parenthesized {
21005 break;
21006 } else {
21007 return self.expected_ref(" another option or EOF", self.peek_token_ref());
21008 }
21009 }
21010 Token::EOF => break,
21011 Token::SemiColon => {
21012 self.prev_token();
21013 break;
21014 }
21015 Token::Comma => {
21016 delimiter = KeyValueOptionsDelimiter::Comma;
21017 continue;
21018 }
21019 Token::Word(w) if !end_words.contains(&w.keyword) => {
21020 options.push(self.parse_key_value_option(&w)?)
21021 }
21022 Token::Word(w) if end_words.contains(&w.keyword) => {
21023 self.prev_token();
21024 break;
21025 }
21026 _ => {
21027 return self.expected_ref(
21028 "another option, EOF, SemiColon, Comma or ')'",
21029 self.peek_token_ref(),
21030 )
21031 }
21032 };
21033 }
21034
21035 Ok(KeyValueOptions { delimiter, options })
21036 }
21037
21038 pub(crate) fn parse_key_value_option(
21040 &mut self,
21041 key: &Word,
21042 ) -> Result<KeyValueOption, ParserError> {
21043 self.expect_token(&Token::Eq)?;
21044 let peeked_token = self.peek_token();
21045 match peeked_token.token {
21046 Token::SingleQuotedString(_) => Ok(KeyValueOption {
21047 option_name: key.value.clone(),
21048 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21049 }),
21050 Token::Word(word)
21051 if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
21052 {
21053 Ok(KeyValueOption {
21054 option_name: key.value.clone(),
21055 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21056 })
21057 }
21058 Token::Number(..) => Ok(KeyValueOption {
21059 option_name: key.value.clone(),
21060 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21061 }),
21062 Token::Word(word) => {
21063 self.next_token();
21064 Ok(KeyValueOption {
21065 option_name: key.value.clone(),
21066 option_value: KeyValueOptionKind::Single(
21067 Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
21068 ),
21069 })
21070 }
21071 Token::LParen => {
21072 match self.maybe_parse(|parser| {
21076 parser.expect_token(&Token::LParen)?;
21077 let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
21078 parser.expect_token(&Token::RParen)?;
21079 values
21080 })? {
21081 Some(values) => Ok(KeyValueOption {
21082 option_name: key.value.clone(),
21083 option_value: KeyValueOptionKind::Multi(values),
21084 }),
21085 None => Ok(KeyValueOption {
21086 option_name: key.value.clone(),
21087 option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
21088 self.parse_key_value_options(true, &[])?,
21089 )),
21090 }),
21091 }
21092 }
21093 _ => self.expected_ref("expected option value", self.peek_token_ref()),
21094 }
21095 }
21096
21097 fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
21099 if self.parse_keyword(Keyword::ALL) {
21100 return Ok(ResetStatement { reset: Reset::ALL });
21101 }
21102
21103 let obj = self.parse_object_name(false)?;
21104 Ok(ResetStatement {
21105 reset: Reset::ConfigurationParameter(obj),
21106 })
21107 }
21108}
21109
21110fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
21111 if let Some(prefix) = prefix {
21112 Expr::Prefixed {
21113 prefix,
21114 value: Box::new(expr),
21115 }
21116 } else {
21117 expr
21118 }
21119}
21120
21121impl Word {
21122 pub fn to_ident(&self, span: Span) -> Ident {
21128 Ident {
21129 value: self.value.clone(),
21130 quote_style: self.quote_style,
21131 span,
21132 }
21133 }
21134
21135 pub fn into_ident(self, span: Span) -> Ident {
21140 Ident {
21141 value: self.value,
21142 quote_style: self.quote_style,
21143 span,
21144 }
21145 }
21146}
21147
21148#[cfg(test)]
21149mod tests {
21150 use crate::test_utils::{all_dialects, TestedDialects};
21151
21152 use super::*;
21153
21154 #[test]
21155 fn test_prev_index() {
21156 let sql = "SELECT version";
21157 all_dialects().run_parser_method(sql, |parser| {
21158 assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
21159 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21160 parser.prev_token();
21161 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21162 assert_eq!(parser.next_token(), Token::make_word("version", None));
21163 parser.prev_token();
21164 assert_eq!(parser.peek_token(), Token::make_word("version", None));
21165 assert_eq!(parser.next_token(), Token::make_word("version", None));
21166 assert_eq!(parser.peek_token(), Token::EOF);
21167 parser.prev_token();
21168 assert_eq!(parser.next_token(), Token::make_word("version", None));
21169 assert_eq!(parser.next_token(), Token::EOF);
21170 assert_eq!(parser.next_token(), Token::EOF);
21171 parser.prev_token();
21172 });
21173 }
21174
21175 #[test]
21176 fn test_peek_tokens() {
21177 all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
21178 assert!(matches!(
21179 parser.peek_tokens(),
21180 [Token::Word(Word {
21181 keyword: Keyword::SELECT,
21182 ..
21183 })]
21184 ));
21185
21186 assert!(matches!(
21187 parser.peek_tokens(),
21188 [
21189 Token::Word(Word {
21190 keyword: Keyword::SELECT,
21191 ..
21192 }),
21193 Token::Word(_),
21194 Token::Word(Word {
21195 keyword: Keyword::AS,
21196 ..
21197 }),
21198 ]
21199 ));
21200
21201 for _ in 0..4 {
21202 parser.next_token();
21203 }
21204
21205 assert!(matches!(
21206 parser.peek_tokens(),
21207 [
21208 Token::Word(Word {
21209 keyword: Keyword::FROM,
21210 ..
21211 }),
21212 Token::Word(_),
21213 Token::EOF,
21214 Token::EOF,
21215 ]
21216 ))
21217 })
21218 }
21219
21220 #[cfg(test)]
21221 mod test_parse_data_type {
21222 use crate::ast::{
21223 CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
21224 };
21225 use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
21226 use crate::test_utils::TestedDialects;
21227
21228 macro_rules! test_parse_data_type {
21229 ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
21230 $dialect.run_parser_method(&*$input, |parser| {
21231 let data_type = parser.parse_data_type().unwrap();
21232 assert_eq!($expected_type, data_type);
21233 assert_eq!($input.to_string(), data_type.to_string());
21234 });
21235 }};
21236 }
21237
21238 #[test]
21239 fn test_ansii_character_string_types() {
21240 let dialect =
21242 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21243
21244 test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
21245
21246 test_parse_data_type!(
21247 dialect,
21248 "CHARACTER(20)",
21249 DataType::Character(Some(CharacterLength::IntegerLength {
21250 length: 20,
21251 unit: None
21252 }))
21253 );
21254
21255 test_parse_data_type!(
21256 dialect,
21257 "CHARACTER(20 CHARACTERS)",
21258 DataType::Character(Some(CharacterLength::IntegerLength {
21259 length: 20,
21260 unit: Some(CharLengthUnits::Characters)
21261 }))
21262 );
21263
21264 test_parse_data_type!(
21265 dialect,
21266 "CHARACTER(20 OCTETS)",
21267 DataType::Character(Some(CharacterLength::IntegerLength {
21268 length: 20,
21269 unit: Some(CharLengthUnits::Octets)
21270 }))
21271 );
21272
21273 test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
21274
21275 test_parse_data_type!(
21276 dialect,
21277 "CHAR(20)",
21278 DataType::Char(Some(CharacterLength::IntegerLength {
21279 length: 20,
21280 unit: None
21281 }))
21282 );
21283
21284 test_parse_data_type!(
21285 dialect,
21286 "CHAR(20 CHARACTERS)",
21287 DataType::Char(Some(CharacterLength::IntegerLength {
21288 length: 20,
21289 unit: Some(CharLengthUnits::Characters)
21290 }))
21291 );
21292
21293 test_parse_data_type!(
21294 dialect,
21295 "CHAR(20 OCTETS)",
21296 DataType::Char(Some(CharacterLength::IntegerLength {
21297 length: 20,
21298 unit: Some(CharLengthUnits::Octets)
21299 }))
21300 );
21301
21302 test_parse_data_type!(
21303 dialect,
21304 "CHARACTER VARYING(20)",
21305 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21306 length: 20,
21307 unit: None
21308 }))
21309 );
21310
21311 test_parse_data_type!(
21312 dialect,
21313 "CHARACTER VARYING(20 CHARACTERS)",
21314 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21315 length: 20,
21316 unit: Some(CharLengthUnits::Characters)
21317 }))
21318 );
21319
21320 test_parse_data_type!(
21321 dialect,
21322 "CHARACTER VARYING(20 OCTETS)",
21323 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21324 length: 20,
21325 unit: Some(CharLengthUnits::Octets)
21326 }))
21327 );
21328
21329 test_parse_data_type!(
21330 dialect,
21331 "CHAR VARYING(20)",
21332 DataType::CharVarying(Some(CharacterLength::IntegerLength {
21333 length: 20,
21334 unit: None
21335 }))
21336 );
21337
21338 test_parse_data_type!(
21339 dialect,
21340 "CHAR VARYING(20 CHARACTERS)",
21341 DataType::CharVarying(Some(CharacterLength::IntegerLength {
21342 length: 20,
21343 unit: Some(CharLengthUnits::Characters)
21344 }))
21345 );
21346
21347 test_parse_data_type!(
21348 dialect,
21349 "CHAR VARYING(20 OCTETS)",
21350 DataType::CharVarying(Some(CharacterLength::IntegerLength {
21351 length: 20,
21352 unit: Some(CharLengthUnits::Octets)
21353 }))
21354 );
21355
21356 test_parse_data_type!(
21357 dialect,
21358 "VARCHAR(20)",
21359 DataType::Varchar(Some(CharacterLength::IntegerLength {
21360 length: 20,
21361 unit: None
21362 }))
21363 );
21364 }
21365
21366 #[test]
21367 fn test_ansii_character_large_object_types() {
21368 let dialect =
21370 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21371
21372 test_parse_data_type!(
21373 dialect,
21374 "CHARACTER LARGE OBJECT",
21375 DataType::CharacterLargeObject(None)
21376 );
21377 test_parse_data_type!(
21378 dialect,
21379 "CHARACTER LARGE OBJECT(20)",
21380 DataType::CharacterLargeObject(Some(20))
21381 );
21382
21383 test_parse_data_type!(
21384 dialect,
21385 "CHAR LARGE OBJECT",
21386 DataType::CharLargeObject(None)
21387 );
21388 test_parse_data_type!(
21389 dialect,
21390 "CHAR LARGE OBJECT(20)",
21391 DataType::CharLargeObject(Some(20))
21392 );
21393
21394 test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
21395 test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
21396 }
21397
21398 #[test]
21399 fn test_parse_custom_types() {
21400 let dialect =
21401 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21402
21403 test_parse_data_type!(
21404 dialect,
21405 "GEOMETRY",
21406 DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
21407 );
21408
21409 test_parse_data_type!(
21410 dialect,
21411 "GEOMETRY(POINT)",
21412 DataType::Custom(
21413 ObjectName::from(vec!["GEOMETRY".into()]),
21414 vec!["POINT".to_string()]
21415 )
21416 );
21417
21418 test_parse_data_type!(
21419 dialect,
21420 "GEOMETRY(POINT, 4326)",
21421 DataType::Custom(
21422 ObjectName::from(vec!["GEOMETRY".into()]),
21423 vec!["POINT".to_string(), "4326".to_string()]
21424 )
21425 );
21426 }
21427
21428 #[test]
21429 fn test_ansii_exact_numeric_types() {
21430 let dialect = TestedDialects::new(vec![
21432 Box::new(GenericDialect {}),
21433 Box::new(AnsiDialect {}),
21434 Box::new(PostgreSqlDialect {}),
21435 ]);
21436
21437 test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
21438
21439 test_parse_data_type!(
21440 dialect,
21441 "NUMERIC(2)",
21442 DataType::Numeric(ExactNumberInfo::Precision(2))
21443 );
21444
21445 test_parse_data_type!(
21446 dialect,
21447 "NUMERIC(2,10)",
21448 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
21449 );
21450
21451 test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
21452
21453 test_parse_data_type!(
21454 dialect,
21455 "DECIMAL(2)",
21456 DataType::Decimal(ExactNumberInfo::Precision(2))
21457 );
21458
21459 test_parse_data_type!(
21460 dialect,
21461 "DECIMAL(2,10)",
21462 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
21463 );
21464
21465 test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
21466
21467 test_parse_data_type!(
21468 dialect,
21469 "DEC(2)",
21470 DataType::Dec(ExactNumberInfo::Precision(2))
21471 );
21472
21473 test_parse_data_type!(
21474 dialect,
21475 "DEC(2,10)",
21476 DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
21477 );
21478
21479 test_parse_data_type!(
21481 dialect,
21482 "NUMERIC(10,-2)",
21483 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
21484 );
21485
21486 test_parse_data_type!(
21487 dialect,
21488 "DECIMAL(1000,-10)",
21489 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
21490 );
21491
21492 test_parse_data_type!(
21493 dialect,
21494 "DEC(5,-1000)",
21495 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
21496 );
21497
21498 test_parse_data_type!(
21499 dialect,
21500 "NUMERIC(10,-5)",
21501 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
21502 );
21503
21504 test_parse_data_type!(
21505 dialect,
21506 "DECIMAL(20,-10)",
21507 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
21508 );
21509
21510 test_parse_data_type!(
21511 dialect,
21512 "DEC(5,-2)",
21513 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
21514 );
21515
21516 dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
21517 let data_type = parser.parse_data_type().unwrap();
21518 assert_eq!(
21519 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
21520 data_type
21521 );
21522 assert_eq!("NUMERIC(10,5)", data_type.to_string());
21524 });
21525 }
21526
21527 #[test]
21528 fn test_ansii_date_type() {
21529 let dialect =
21531 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21532
21533 test_parse_data_type!(dialect, "DATE", DataType::Date);
21534
21535 test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
21536
21537 test_parse_data_type!(
21538 dialect,
21539 "TIME(6)",
21540 DataType::Time(Some(6), TimezoneInfo::None)
21541 );
21542
21543 test_parse_data_type!(
21544 dialect,
21545 "TIME WITH TIME ZONE",
21546 DataType::Time(None, TimezoneInfo::WithTimeZone)
21547 );
21548
21549 test_parse_data_type!(
21550 dialect,
21551 "TIME(6) WITH TIME ZONE",
21552 DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21553 );
21554
21555 test_parse_data_type!(
21556 dialect,
21557 "TIME WITHOUT TIME ZONE",
21558 DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21559 );
21560
21561 test_parse_data_type!(
21562 dialect,
21563 "TIME(6) WITHOUT TIME ZONE",
21564 DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21565 );
21566
21567 test_parse_data_type!(
21568 dialect,
21569 "TIMESTAMP",
21570 DataType::Timestamp(None, TimezoneInfo::None)
21571 );
21572
21573 test_parse_data_type!(
21574 dialect,
21575 "TIMESTAMP(22)",
21576 DataType::Timestamp(Some(22), TimezoneInfo::None)
21577 );
21578
21579 test_parse_data_type!(
21580 dialect,
21581 "TIMESTAMP(22) WITH TIME ZONE",
21582 DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21583 );
21584
21585 test_parse_data_type!(
21586 dialect,
21587 "TIMESTAMP(33) WITHOUT TIME ZONE",
21588 DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21589 );
21590 }
21591 }
21592
21593 #[test]
21594 fn test_parse_schema_name() {
21595 macro_rules! test_parse_schema_name {
21597 ($input:expr, $expected_name:expr $(,)?) => {{
21598 all_dialects().run_parser_method(&*$input, |parser| {
21599 let schema_name = parser.parse_schema_name().unwrap();
21600 assert_eq!(schema_name, $expected_name);
21602 assert_eq!(schema_name.to_string(), $input.to_string());
21604 });
21605 }};
21606 }
21607
21608 let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21609 let dummy_authorization = Ident::new("dummy_authorization");
21610
21611 test_parse_schema_name!(
21612 format!("{dummy_name}"),
21613 SchemaName::Simple(dummy_name.clone())
21614 );
21615
21616 test_parse_schema_name!(
21617 format!("AUTHORIZATION {dummy_authorization}"),
21618 SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21619 );
21620 test_parse_schema_name!(
21621 format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21622 SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21623 );
21624 }
21625
21626 #[test]
21627 fn mysql_parse_index_table_constraint() {
21628 macro_rules! test_parse_table_constraint {
21629 ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21630 $dialect.run_parser_method(&*$input, |parser| {
21631 let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21632 assert_eq!(constraint, $expected);
21634 assert_eq!(constraint.to_string(), $input.to_string());
21636 });
21637 }};
21638 }
21639
21640 fn mk_expected_col(name: &str) -> IndexColumn {
21641 IndexColumn {
21642 column: OrderByExpr {
21643 expr: Expr::Identifier(name.into()),
21644 options: OrderByOptions {
21645 sort: None,
21646 nulls_first: None,
21647 },
21648 with_fill: None,
21649 },
21650 operator_class: None,
21651 }
21652 }
21653
21654 let dialect =
21655 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21656
21657 test_parse_table_constraint!(
21658 dialect,
21659 "INDEX (c1)",
21660 IndexConstraint {
21661 display_as_key: false,
21662 name: None,
21663 index_type: None,
21664 columns: vec![mk_expected_col("c1")],
21665 index_options: vec![],
21666 }
21667 .into()
21668 );
21669
21670 test_parse_table_constraint!(
21671 dialect,
21672 "KEY (c1)",
21673 IndexConstraint {
21674 display_as_key: true,
21675 name: None,
21676 index_type: None,
21677 columns: vec![mk_expected_col("c1")],
21678 index_options: vec![],
21679 }
21680 .into()
21681 );
21682
21683 test_parse_table_constraint!(
21684 dialect,
21685 "INDEX 'index' (c1, c2)",
21686 TableConstraint::Index(IndexConstraint {
21687 display_as_key: false,
21688 name: Some(Ident::with_quote('\'', "index")),
21689 index_type: None,
21690 columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21691 index_options: vec![],
21692 })
21693 );
21694
21695 test_parse_table_constraint!(
21696 dialect,
21697 "INDEX USING BTREE (c1)",
21698 IndexConstraint {
21699 display_as_key: false,
21700 name: None,
21701 index_type: Some(IndexType::BTree),
21702 columns: vec![mk_expected_col("c1")],
21703 index_options: vec![],
21704 }
21705 .into()
21706 );
21707
21708 test_parse_table_constraint!(
21709 dialect,
21710 "INDEX USING HASH (c1)",
21711 IndexConstraint {
21712 display_as_key: false,
21713 name: None,
21714 index_type: Some(IndexType::Hash),
21715 columns: vec![mk_expected_col("c1")],
21716 index_options: vec![],
21717 }
21718 .into()
21719 );
21720
21721 test_parse_table_constraint!(
21722 dialect,
21723 "INDEX idx_name USING BTREE (c1)",
21724 IndexConstraint {
21725 display_as_key: false,
21726 name: Some(Ident::new("idx_name")),
21727 index_type: Some(IndexType::BTree),
21728 columns: vec![mk_expected_col("c1")],
21729 index_options: vec![],
21730 }
21731 .into()
21732 );
21733
21734 test_parse_table_constraint!(
21735 dialect,
21736 "INDEX idx_name USING HASH (c1)",
21737 IndexConstraint {
21738 display_as_key: false,
21739 name: Some(Ident::new("idx_name")),
21740 index_type: Some(IndexType::Hash),
21741 columns: vec![mk_expected_col("c1")],
21742 index_options: vec![],
21743 }
21744 .into()
21745 );
21746 }
21747
21748 #[test]
21749 fn test_tokenizer_error_loc() {
21750 let sql = "foo '";
21751 let ast = Parser::parse_sql(&GenericDialect, sql);
21752 assert_eq!(
21753 ast,
21754 Err(ParserError::TokenizerError(
21755 "Unterminated string literal at Line: 1, Column: 5".to_string()
21756 ))
21757 );
21758 }
21759
21760 #[test]
21761 fn test_parser_error_loc() {
21762 let sql = "SELECT this is a syntax error";
21763 let ast = Parser::parse_sql(&GenericDialect, sql);
21764 assert_eq!(
21765 ast,
21766 Err(ParserError::ParserError(
21767 "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
21768 .to_string()
21769 ))
21770 );
21771 }
21772
21773 #[test]
21774 fn test_nested_explain_error() {
21775 let sql = "EXPLAIN EXPLAIN SELECT 1";
21776 let ast = Parser::parse_sql(&GenericDialect, sql);
21777 assert_eq!(
21778 ast,
21779 Err(ParserError::ParserError(
21780 "Explain must be root of the plan".to_string()
21781 ))
21782 );
21783 }
21784
21785 #[test]
21786 fn test_parse_multipart_identifier_positive() {
21787 let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21788
21789 let expected = vec![
21791 Ident {
21792 value: "CATALOG".to_string(),
21793 quote_style: None,
21794 span: Span::empty(),
21795 },
21796 Ident {
21797 value: "F(o)o. \"bar".to_string(),
21798 quote_style: Some('"'),
21799 span: Span::empty(),
21800 },
21801 Ident {
21802 value: "table".to_string(),
21803 quote_style: None,
21804 span: Span::empty(),
21805 },
21806 ];
21807 dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21808 let actual = parser.parse_multipart_identifier().unwrap();
21809 assert_eq!(expected, actual);
21810 });
21811
21812 let expected = vec![
21814 Ident {
21815 value: "CATALOG".to_string(),
21816 quote_style: None,
21817 span: Span::empty(),
21818 },
21819 Ident {
21820 value: "table".to_string(),
21821 quote_style: None,
21822 span: Span::empty(),
21823 },
21824 ];
21825 dialect.run_parser_method("CATALOG . table", |parser| {
21826 let actual = parser.parse_multipart_identifier().unwrap();
21827 assert_eq!(expected, actual);
21828 });
21829 }
21830
21831 #[test]
21832 fn test_parse_multipart_identifier_negative() {
21833 macro_rules! test_parse_multipart_identifier_error {
21834 ($input:expr, $expected_err:expr $(,)?) => {{
21835 all_dialects().run_parser_method(&*$input, |parser| {
21836 let actual_err = parser.parse_multipart_identifier().unwrap_err();
21837 assert_eq!(actual_err.to_string(), $expected_err);
21838 });
21839 }};
21840 }
21841
21842 test_parse_multipart_identifier_error!(
21843 "",
21844 "sql parser error: Empty input when parsing identifier",
21845 );
21846
21847 test_parse_multipart_identifier_error!(
21848 "*schema.table",
21849 "sql parser error: Unexpected token in identifier: *",
21850 );
21851
21852 test_parse_multipart_identifier_error!(
21853 "schema.table*",
21854 "sql parser error: Unexpected token in identifier: *",
21855 );
21856
21857 test_parse_multipart_identifier_error!(
21858 "schema.table.",
21859 "sql parser error: Trailing period in identifier",
21860 );
21861
21862 test_parse_multipart_identifier_error!(
21863 "schema.*",
21864 "sql parser error: Unexpected token following period in identifier: *",
21865 );
21866 }
21867
21868 #[test]
21869 fn test_mysql_partition_selection() {
21870 let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21871 let expected = vec!["p0", "p2"];
21872
21873 let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21874 assert_eq!(ast.len(), 1);
21875 if let Statement::Query(v) = &ast[0] {
21876 if let SetExpr::Select(select) = &*v.body {
21877 assert_eq!(select.from.len(), 1);
21878 let from: &TableWithJoins = &select.from[0];
21879 let table_factor = &from.relation;
21880 if let TableFactor::Table { partitions, .. } = table_factor {
21881 let actual: Vec<&str> = partitions
21882 .iter()
21883 .map(|ident| ident.value.as_str())
21884 .collect();
21885 assert_eq!(expected, actual);
21886 }
21887 }
21888 } else {
21889 panic!("fail to parse mysql partition selection");
21890 }
21891 }
21892
21893 #[test]
21894 fn test_replace_into_placeholders() {
21895 let sql = "REPLACE INTO t (a) VALUES (&a)";
21896
21897 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21898 }
21899
21900 #[test]
21901 fn test_replace_into_set_placeholder() {
21902 let sql = "REPLACE INTO t SET ?";
21903
21904 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21905 }
21906
21907 #[test]
21908 fn test_replace_incomplete() {
21909 let sql = r#"REPLACE"#;
21910
21911 assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
21912 }
21913
21914 #[test]
21915 fn test_placeholder_invalid_whitespace() {
21916 for w in [" ", "/*invalid*/"] {
21917 let sql = format!("\nSELECT\n :{w}fooBar");
21918 assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
21919 }
21920 }
21921}