1#[cfg(not(feature = "std"))]
16use alloc::{
17 boxed::Box,
18 format,
19 string::{String, ToString},
20 vec,
21 vec::Vec,
22};
23use core::{
24 fmt::{self, Display},
25 str::FromStr,
26};
27use helpers::attached_token::AttachedToken;
28
29use log::debug;
30
31use recursion::RecursionCounter;
32use IsLateral::*;
33use IsOptional::*;
34
35use crate::ast::*;
36use crate::ast::{
37 comments,
38 helpers::{
39 key_value_options::{
40 KeyValueOption, KeyValueOptionKind, KeyValueOptions, KeyValueOptionsDelimiter,
41 },
42 stmt_create_table::{CreateTableBuilder, CreateTableConfiguration},
43 },
44};
45use crate::dialect::*;
46use crate::keywords::{Keyword, ALL_KEYWORDS};
47use crate::tokenizer::*;
48use sqlparser::parser::ParserState::ColumnDefinition;
49
50#[derive(Debug, Clone, PartialEq, Eq)]
52pub enum ParserError {
53 TokenizerError(String),
55 ParserError(String),
57 RecursionLimitExceeded,
59}
60
61macro_rules! parser_err {
63 ($MSG:expr, $loc:expr) => {
64 Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
65 };
66}
67
68mod alter;
69mod merge;
70
71#[cfg(feature = "std")]
72mod recursion {
74 use std::cell::Cell;
75 use std::rc::Rc;
76
77 use super::ParserError;
78
79 pub(crate) struct RecursionCounter {
90 remaining_depth: Rc<Cell<usize>>,
91 }
92
93 impl RecursionCounter {
94 pub fn new(remaining_depth: usize) -> Self {
97 Self {
98 remaining_depth: Rc::new(remaining_depth.into()),
99 }
100 }
101
102 pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
109 let old_value = self.remaining_depth.get();
110 if old_value == 0 {
112 Err(ParserError::RecursionLimitExceeded)
113 } else {
114 self.remaining_depth.set(old_value - 1);
115 Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
116 }
117 }
118 }
119
120 pub struct DepthGuard {
122 remaining_depth: Rc<Cell<usize>>,
123 }
124
125 impl DepthGuard {
126 fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
127 Self { remaining_depth }
128 }
129 }
130 impl Drop for DepthGuard {
131 fn drop(&mut self) {
132 let old_value = self.remaining_depth.get();
133 self.remaining_depth.set(old_value + 1);
134 }
135 }
136}
137
138#[cfg(not(feature = "std"))]
139mod recursion {
140 pub(crate) struct RecursionCounter {}
146
147 impl RecursionCounter {
148 pub fn new(_remaining_depth: usize) -> Self {
149 Self {}
150 }
151 pub fn try_decrease(&self) -> Result<DepthGuard, super::ParserError> {
152 Ok(DepthGuard {})
153 }
154 }
155
156 pub struct DepthGuard {}
157}
158
159#[derive(PartialEq, Eq)]
160pub enum IsOptional {
162 Optional,
164 Mandatory,
166}
167
168pub enum IsLateral {
170 Lateral,
172 NotLateral,
174}
175
176pub enum WildcardExpr {
178 Expr(Expr),
180 QualifiedWildcard(ObjectName),
182 Wildcard,
184}
185
186impl From<TokenizerError> for ParserError {
187 fn from(e: TokenizerError) -> Self {
188 ParserError::TokenizerError(e.to_string())
189 }
190}
191
192impl fmt::Display for ParserError {
193 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
194 write!(
195 f,
196 "sql parser error: {}",
197 match self {
198 ParserError::TokenizerError(s) => s,
199 ParserError::ParserError(s) => s,
200 ParserError::RecursionLimitExceeded => "recursion limit exceeded",
201 }
202 )
203 }
204}
205
206impl core::error::Error for ParserError {}
207
208const DEFAULT_REMAINING_DEPTH: usize = 50;
210
211const EOF_TOKEN: TokenWithSpan = TokenWithSpan {
213 token: Token::EOF,
214 span: Span {
215 start: Location { line: 0, column: 0 },
216 end: Location { line: 0, column: 0 },
217 },
218};
219
220struct MatchedTrailingBracket(bool);
233
234impl From<bool> for MatchedTrailingBracket {
235 fn from(value: bool) -> Self {
236 Self(value)
237 }
238}
239
240#[derive(Debug, Clone, PartialEq, Eq)]
242pub struct ParserOptions {
243 pub trailing_commas: bool,
245 pub unescape: bool,
248 pub require_semicolon_stmt_delimiter: bool,
251}
252
253impl Default for ParserOptions {
254 fn default() -> Self {
255 Self {
256 trailing_commas: false,
257 unescape: true,
258 require_semicolon_stmt_delimiter: true,
259 }
260 }
261}
262
263impl ParserOptions {
264 pub fn new() -> Self {
266 Default::default()
267 }
268
269 pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
281 self.trailing_commas = trailing_commas;
282 self
283 }
284
285 pub fn with_unescape(mut self, unescape: bool) -> Self {
288 self.unescape = unescape;
289 self
290 }
291}
292
293#[derive(Copy, Clone)]
294enum ParserState {
295 Normal,
297 ConnectBy,
301 ColumnDefinition,
307}
308
309pub struct Parser<'a> {
348 tokens: Vec<TokenWithSpan>,
350 index: usize,
352 state: ParserState,
354 dialect: &'a dyn Dialect,
356 options: ParserOptions,
360 recursion_counter: RecursionCounter,
362}
363
364impl<'a> Parser<'a> {
365 pub fn new(dialect: &'a dyn Dialect) -> Self {
381 Self {
382 tokens: vec![],
383 index: 0,
384 state: ParserState::Normal,
385 dialect,
386 recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
387 options: ParserOptions::new().with_trailing_commas(dialect.supports_trailing_commas()),
388 }
389 }
390
391 pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
414 self.recursion_counter = RecursionCounter::new(recursion_limit);
415 self
416 }
417
418 pub fn with_options(mut self, options: ParserOptions) -> Self {
441 self.options = options;
442 self
443 }
444
445 pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithSpan>) -> Self {
447 self.tokens = tokens;
448 self.index = 0;
449 self
450 }
451
452 pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
454 let tokens_with_locations: Vec<TokenWithSpan> = tokens
456 .into_iter()
457 .map(|token| TokenWithSpan {
458 token,
459 span: Span::empty(),
460 })
461 .collect();
462 self.with_tokens_with_locations(tokens_with_locations)
463 }
464
465 pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
472 debug!("Parsing sql '{sql}'...");
473 let tokens = Tokenizer::new(self.dialect, sql)
474 .with_unescape(self.options.unescape)
475 .tokenize_with_location()?;
476 Ok(self.with_tokens_with_locations(tokens))
477 }
478
479 pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
495 let mut stmts = Vec::new();
496 let mut expecting_statement_delimiter = false;
497 loop {
498 while self.consume_token(&Token::SemiColon) {
500 expecting_statement_delimiter = false;
501 }
502
503 if !self.options.require_semicolon_stmt_delimiter {
504 expecting_statement_delimiter = false;
505 }
506
507 match &self.peek_token_ref().token {
508 Token::EOF => break,
509
510 Token::Word(word)
512 if expecting_statement_delimiter && word.keyword == Keyword::END =>
513 {
514 break;
515 }
516 _ => {}
517 }
518
519 if expecting_statement_delimiter {
520 return self.expected_ref("end of statement", self.peek_token_ref());
521 }
522
523 let statement = self.parse_statement()?;
524 stmts.push(statement);
525 expecting_statement_delimiter = true;
526 }
527 Ok(stmts)
528 }
529
530 pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
546 Parser::new(dialect).try_with_sql(sql)?.parse_statements()
547 }
548
549 pub fn parse_sql_with_comments(
554 dialect: &'a dyn Dialect,
555 sql: &str,
556 ) -> Result<(Vec<Statement>, comments::Comments), ParserError> {
557 let mut p = Parser::new(dialect).try_with_sql(sql)?;
558 p.parse_statements().map(|stmts| (stmts, p.into_comments()))
559 }
560
561 fn into_comments(self) -> comments::Comments {
563 let mut comments = comments::Comments::default();
564 for t in self.tokens.into_iter() {
565 match t.token {
566 Token::Whitespace(Whitespace::SingleLineComment { comment, prefix }) => {
567 comments.offer(comments::CommentWithSpan {
568 comment: comments::Comment::SingleLine {
569 content: comment,
570 prefix,
571 },
572 span: t.span,
573 });
574 }
575 Token::Whitespace(Whitespace::MultiLineComment(comment)) => {
576 comments.offer(comments::CommentWithSpan {
577 comment: comments::Comment::MultiLine(comment),
578 span: t.span,
579 });
580 }
581 _ => {}
582 }
583 }
584 comments
585 }
586
587 pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
590 let _guard = self.recursion_counter.try_decrease()?;
591
592 if let Some(statement) = self.dialect.parse_statement(self) {
594 return statement;
595 }
596
597 let next_token = self.next_token();
598 match &next_token.token {
599 Token::Word(w) => match w.keyword {
600 Keyword::KILL => self.parse_kill(),
601 Keyword::FLUSH => self.parse_flush(),
602 Keyword::DESC => self.parse_explain(DescribeAlias::Desc),
603 Keyword::DESCRIBE => self.parse_explain(DescribeAlias::Describe),
604 Keyword::EXPLAIN => self.parse_explain(DescribeAlias::Explain),
605 Keyword::ANALYZE => self.parse_analyze().map(Into::into),
606 Keyword::CASE => {
607 self.prev_token();
608 self.parse_case_stmt().map(Into::into)
609 }
610 Keyword::IF => {
611 self.prev_token();
612 self.parse_if_stmt().map(Into::into)
613 }
614 Keyword::WHILE => {
615 self.prev_token();
616 self.parse_while().map(Into::into)
617 }
618 Keyword::RAISE => {
619 self.prev_token();
620 self.parse_raise_stmt().map(Into::into)
621 }
622 Keyword::SELECT | Keyword::WITH | Keyword::VALUES | Keyword::FROM => {
623 self.prev_token();
624 self.parse_query().map(Into::into)
625 }
626 Keyword::TRUNCATE => self.parse_truncate().map(Into::into),
627 Keyword::ATTACH => {
628 if dialect_of!(self is DuckDbDialect) {
629 self.parse_attach_duckdb_database()
630 } else {
631 self.parse_attach_database()
632 }
633 }
634 Keyword::DETACH if self.dialect.supports_detach() => {
635 self.parse_detach_duckdb_database()
636 }
637 Keyword::MSCK => self.parse_msck().map(Into::into),
638 Keyword::CREATE => self.parse_create(),
639 Keyword::CACHE => self.parse_cache_table(),
640 Keyword::DROP => self.parse_drop(),
641 Keyword::DISCARD => self.parse_discard(),
642 Keyword::DECLARE => self.parse_declare(),
643 Keyword::FETCH => self.parse_fetch_statement(),
644 Keyword::DELETE => self.parse_delete(next_token),
645 Keyword::INSERT => self.parse_insert(next_token),
646 Keyword::REPLACE => self.parse_replace(next_token),
647 Keyword::UNCACHE => self.parse_uncache_table(),
648 Keyword::UPDATE => self.parse_update(next_token),
649 Keyword::ALTER => self.parse_alter(),
650 Keyword::CALL => self.parse_call(),
651 Keyword::COPY => self.parse_copy(),
652 Keyword::OPEN => {
653 self.prev_token();
654 self.parse_open()
655 }
656 Keyword::CLOSE => self.parse_close(),
657 Keyword::SET => self.parse_set(),
658 Keyword::SHOW => self.parse_show(),
659 Keyword::USE => self.parse_use(),
660 Keyword::GRANT => self.parse_grant().map(Into::into),
661 Keyword::DENY => {
662 self.prev_token();
663 self.parse_deny()
664 }
665 Keyword::REVOKE => self.parse_revoke().map(Into::into),
666 Keyword::START => self.parse_start_transaction(),
667 Keyword::BEGIN => self.parse_begin(),
668 Keyword::END => self.parse_end(),
669 Keyword::SAVEPOINT => self.parse_savepoint(),
670 Keyword::RELEASE => self.parse_release(),
671 Keyword::COMMIT => self.parse_commit(),
672 Keyword::RAISERROR => Ok(self.parse_raiserror()?),
673 Keyword::THROW => {
674 self.prev_token();
675 self.parse_throw().map(Into::into)
676 }
677 Keyword::ROLLBACK => self.parse_rollback(),
678 Keyword::ASSERT => self.parse_assert(),
679 Keyword::DEALLOCATE => self.parse_deallocate(),
682 Keyword::EXECUTE | Keyword::EXEC => self.parse_execute(),
683 Keyword::PREPARE => self.parse_prepare(),
684 Keyword::MERGE => self.parse_merge(next_token).map(Into::into),
685 Keyword::LISTEN if self.dialect.supports_listen_notify() => self.parse_listen(),
688 Keyword::UNLISTEN if self.dialect.supports_listen_notify() => self.parse_unlisten(),
689 Keyword::NOTIFY if self.dialect.supports_listen_notify() => self.parse_notify(),
690 Keyword::PRAGMA => self.parse_pragma(),
692 Keyword::UNLOAD => {
693 self.prev_token();
694 self.parse_unload()
695 }
696 Keyword::RENAME => self.parse_rename(),
697 Keyword::INSTALL if self.dialect.supports_install() => self.parse_install(),
699 Keyword::LOAD => self.parse_load(),
700 Keyword::LOCK => {
701 self.prev_token();
702 self.parse_lock_statement().map(Into::into)
703 }
704 Keyword::OPTIMIZE if self.dialect.supports_optimize_table() => {
705 self.parse_optimize_table()
706 }
707 Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
709 Keyword::PRINT => self.parse_print(),
710 Keyword::WAITFOR => self.parse_waitfor(),
712 Keyword::RETURN => self.parse_return(),
713 Keyword::EXPORT => {
714 self.prev_token();
715 self.parse_export_data()
716 }
717 Keyword::VACUUM => {
718 self.prev_token();
719 self.parse_vacuum()
720 }
721 Keyword::RESET => self.parse_reset().map(Into::into),
722 Keyword::SECURITY => self.parse_security_label().map(Into::into),
723 _ => self.expected("an SQL statement", next_token),
724 },
725 Token::LParen => {
726 self.prev_token();
727 self.parse_query().map(Into::into)
728 }
729 _ => self.expected("an SQL statement", next_token),
730 }
731 }
732
733 pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
737 let case_token = self.expect_keyword(Keyword::CASE)?;
738
739 let match_expr = if self.peek_keyword(Keyword::WHEN) {
740 None
741 } else {
742 Some(self.parse_expr()?)
743 };
744
745 self.expect_keyword_is(Keyword::WHEN)?;
746 let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
747 parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
748 })?;
749
750 let else_block = if self.parse_keyword(Keyword::ELSE) {
751 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
752 } else {
753 None
754 };
755
756 let mut end_case_token = self.expect_keyword(Keyword::END)?;
757 if self.peek_keyword(Keyword::CASE) {
758 end_case_token = self.expect_keyword(Keyword::CASE)?;
759 }
760
761 Ok(CaseStatement {
762 case_token: AttachedToken(case_token),
763 match_expr,
764 when_blocks,
765 else_block,
766 end_case_token: AttachedToken(end_case_token),
767 })
768 }
769
770 pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
774 self.expect_keyword_is(Keyword::IF)?;
775 let if_block = self.parse_conditional_statement_block(&[
776 Keyword::ELSE,
777 Keyword::ELSEIF,
778 Keyword::END,
779 ])?;
780
781 let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
782 self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
783 parser.parse_conditional_statement_block(&[
784 Keyword::ELSEIF,
785 Keyword::ELSE,
786 Keyword::END,
787 ])
788 })?
789 } else {
790 vec![]
791 };
792
793 let else_block = if self.parse_keyword(Keyword::ELSE) {
794 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
795 } else {
796 None
797 };
798
799 self.expect_keyword_is(Keyword::END)?;
800 let end_token = self.expect_keyword(Keyword::IF)?;
801
802 Ok(IfStatement {
803 if_block,
804 elseif_blocks,
805 else_block,
806 end_token: Some(AttachedToken(end_token)),
807 })
808 }
809
810 fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
814 self.expect_keyword_is(Keyword::WHILE)?;
815 let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
816
817 Ok(WhileStatement { while_block })
818 }
819
820 fn parse_conditional_statement_block(
828 &mut self,
829 terminal_keywords: &[Keyword],
830 ) -> Result<ConditionalStatementBlock, ParserError> {
831 let start_token = self.get_current_token().clone(); let mut then_token = None;
833
834 let condition = match &start_token.token {
835 Token::Word(w) if w.keyword == Keyword::ELSE => None,
836 Token::Word(w) if w.keyword == Keyword::WHILE => {
837 let expr = self.parse_expr()?;
838 Some(expr)
839 }
840 _ => {
841 let expr = self.parse_expr()?;
842 then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
843 Some(expr)
844 }
845 };
846
847 let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
848
849 Ok(ConditionalStatementBlock {
850 start_token: AttachedToken(start_token),
851 condition,
852 then_token,
853 conditional_statements,
854 })
855 }
856
857 pub(crate) fn parse_conditional_statements(
860 &mut self,
861 terminal_keywords: &[Keyword],
862 ) -> Result<ConditionalStatements, ParserError> {
863 let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
864 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
865 let statements = self.parse_statement_list(terminal_keywords)?;
866 let end_token = self.expect_keyword(Keyword::END)?;
867
868 ConditionalStatements::BeginEnd(BeginEndStatements {
869 begin_token: AttachedToken(begin_token),
870 statements,
871 end_token: AttachedToken(end_token),
872 })
873 } else {
874 ConditionalStatements::Sequence {
875 statements: self.parse_statement_list(terminal_keywords)?,
876 }
877 };
878 Ok(conditional_statements)
879 }
880
881 pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
885 self.expect_keyword_is(Keyword::RAISE)?;
886
887 let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
888 self.expect_token(&Token::Eq)?;
889 Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
890 } else {
891 self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
892 };
893
894 Ok(RaiseStatement { value })
895 }
896 pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
900 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
901
902 self.expect_keyword_is(Keyword::ON)?;
903 let token = self.next_token();
904
905 let keyword = match &token.token {
906 Token::Word(w) => Some(w.keyword),
907 _ => None,
908 };
909 let object_type = match keyword {
910 Some(Keyword::MATERIALIZED) => {
911 self.expect_keyword_is(Keyword::VIEW)?;
912 CommentObject::MaterializedView
913 }
914 Some(other) => match CommentObject::from_keyword(other) {
915 Some(obj) => obj,
916 None => return self.expected("comment object_type", token),
917 },
918 None => return self.expected("comment object_type", token),
919 };
920 let object_name = if object_type == CommentObject::Operator {
921 self.parse_operator_name()?
922 } else {
923 self.parse_object_name(false)?
924 };
925
926 let arguments = match object_type {
927 CommentObject::Function | CommentObject::Procedure | CommentObject::Aggregate => {
928 if self.consume_token(&Token::LParen) {
929 let args =
930 self.parse_comma_separated0(Self::parse_function_arg, Token::RParen)?;
931 self.expect_token(&Token::RParen)?;
932 Some(args.into_iter().map(|a| a.data_type).collect())
933 } else {
934 None
935 }
936 }
937 _ => None,
938 };
939
940 if object_type == CommentObject::Aggregate && arguments.is_none() {
941 return Err(ParserError::ParserError(
942 "COMMENT ON AGGREGATE requires an argument list, e.g. AGGREGATE foo(int)".into(),
943 ));
944 }
945
946 let operator_args = if object_type == CommentObject::Operator {
947 self.expect_token(&Token::LParen)?;
948 let left = self.parse_operator_arg_type_or_none()?;
949 self.expect_token(&Token::Comma)?;
950 let right = self.parse_operator_arg_type_or_none()?;
951 self.expect_token(&Token::RParen)?;
952 Some(CommentOperatorArgs { left, right })
953 } else {
954 None
955 };
956
957 let (table_name, on_domain) = match object_type {
958 CommentObject::Trigger | CommentObject::Policy | CommentObject::Rule => {
959 self.expect_keyword_is(Keyword::ON)?;
960 (Some(self.parse_object_name(false)?), false)
961 }
962 CommentObject::Constraint => {
963 self.expect_keyword_is(Keyword::ON)?;
964 let on_domain = self.parse_keyword(Keyword::DOMAIN);
965 (Some(self.parse_object_name(false)?), on_domain)
966 }
967 _ => (None, false),
968 };
969
970 self.expect_keyword_is(Keyword::IS)?;
971 let (comment, comment_dollar_quote) = if self.parse_keyword(Keyword::NULL) {
972 (None, None)
973 } else if let Token::DollarQuotedString(dq) = &self.peek_token_ref().token {
974 let dq = dq.clone();
977 self.next_token();
978 (Some(dq.value.clone()), Some(dq))
979 } else {
980 (Some(self.parse_literal_string()?), None)
981 };
982 Ok(Statement::Comment {
983 object_type,
984 object_name,
985 arguments,
986 operator_args,
987 table_name,
988 on_domain,
989 comment,
990 comment_dollar_quote,
991 if_exists,
992 })
993 }
994
995 pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
997 let mut channel = None;
998 let mut tables: Vec<ObjectName> = vec![];
999 let mut read_lock = false;
1000 let mut export = false;
1001
1002 if !dialect_of!(self is MySqlDialect | GenericDialect) {
1003 return parser_err!(
1004 "Unsupported statement FLUSH",
1005 self.peek_token_ref().span.start
1006 );
1007 }
1008
1009 let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
1010 Some(FlushLocation::NoWriteToBinlog)
1011 } else if self.parse_keyword(Keyword::LOCAL) {
1012 Some(FlushLocation::Local)
1013 } else {
1014 None
1015 };
1016
1017 let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
1018 FlushType::BinaryLogs
1019 } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
1020 FlushType::EngineLogs
1021 } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1022 FlushType::ErrorLogs
1023 } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1024 FlushType::GeneralLogs
1025 } else if self.parse_keywords(&[Keyword::HOSTS]) {
1026 FlushType::Hosts
1027 } else if self.parse_keyword(Keyword::PRIVILEGES) {
1028 FlushType::Privileges
1029 } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1030 FlushType::OptimizerCosts
1031 } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1032 if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1033 channel = Some(self.parse_object_name(false).unwrap().to_string());
1034 }
1035 FlushType::RelayLogs
1036 } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1037 FlushType::SlowLogs
1038 } else if self.parse_keyword(Keyword::STATUS) {
1039 FlushType::Status
1040 } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1041 FlushType::UserResources
1042 } else if self.parse_keywords(&[Keyword::LOGS]) {
1043 FlushType::Logs
1044 } else if self.parse_keywords(&[Keyword::TABLES]) {
1045 loop {
1046 let next_token = self.next_token();
1047 match &next_token.token {
1048 Token::Word(w) => match w.keyword {
1049 Keyword::WITH => {
1050 read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1051 }
1052 Keyword::FOR => {
1053 export = self.parse_keyword(Keyword::EXPORT);
1054 }
1055 Keyword::NoKeyword => {
1056 self.prev_token();
1057 tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1058 }
1059 _ => {}
1060 },
1061 _ => {
1062 break;
1063 }
1064 }
1065 }
1066
1067 FlushType::Tables
1068 } else {
1069 return self.expected_ref(
1070 "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1071 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1072 self.peek_token_ref(),
1073 );
1074 };
1075
1076 Ok(Statement::Flush {
1077 object_type,
1078 location,
1079 channel,
1080 read_lock,
1081 export,
1082 tables,
1083 })
1084 }
1085
1086 pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1088 let repair = self.parse_keyword(Keyword::REPAIR);
1089 self.expect_keyword_is(Keyword::TABLE)?;
1090 let table_name = self.parse_object_name(false)?;
1091 let partition_action = self
1092 .maybe_parse(|parser| {
1093 let pa = match parser.parse_one_of_keywords(&[
1094 Keyword::ADD,
1095 Keyword::DROP,
1096 Keyword::SYNC,
1097 ]) {
1098 Some(Keyword::ADD) => Some(AddDropSync::ADD),
1099 Some(Keyword::DROP) => Some(AddDropSync::DROP),
1100 Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1101 _ => None,
1102 };
1103 parser.expect_keyword_is(Keyword::PARTITIONS)?;
1104 Ok(pa)
1105 })?
1106 .unwrap_or_default();
1107 Ok(Msck {
1108 repair,
1109 table_name,
1110 partition_action,
1111 })
1112 }
1113
1114 pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1116 let table = self.parse_keyword(Keyword::TABLE);
1117 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1118
1119 let table_names = self.parse_comma_separated(|p| {
1120 let only = p.parse_keyword(Keyword::ONLY);
1121 let name = p.parse_object_name(false)?;
1122 let has_asterisk = p.consume_token(&Token::Mul);
1123 Ok(TruncateTableTarget {
1124 name,
1125 only,
1126 has_asterisk,
1127 })
1128 })?;
1129
1130 let mut partitions = None;
1131 if self.parse_keyword(Keyword::PARTITION) {
1132 self.expect_token(&Token::LParen)?;
1133 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1134 self.expect_token(&Token::RParen)?;
1135 }
1136
1137 let mut identity = None;
1138 let mut cascade = None;
1139
1140 if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1141 identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1142 Some(TruncateIdentityOption::Restart)
1143 } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1144 Some(TruncateIdentityOption::Continue)
1145 } else {
1146 None
1147 };
1148
1149 cascade = self.parse_cascade_option();
1150 };
1151
1152 let on_cluster = self.parse_optional_on_cluster()?;
1153
1154 Ok(Truncate {
1155 table_names,
1156 partitions,
1157 table,
1158 if_exists,
1159 identity,
1160 cascade,
1161 on_cluster,
1162 })
1163 }
1164
1165 fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1166 if self.parse_keyword(Keyword::CASCADE) {
1167 Some(CascadeOption::Cascade)
1168 } else if self.parse_keyword(Keyword::RESTRICT) {
1169 Some(CascadeOption::Restrict)
1170 } else {
1171 None
1172 }
1173 }
1174
1175 pub fn parse_attach_duckdb_database_options(
1177 &mut self,
1178 ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1179 if !self.consume_token(&Token::LParen) {
1180 return Ok(vec![]);
1181 }
1182
1183 let mut options = vec![];
1184 loop {
1185 if self.parse_keyword(Keyword::READ_ONLY) {
1186 let boolean = if self.parse_keyword(Keyword::TRUE) {
1187 Some(true)
1188 } else if self.parse_keyword(Keyword::FALSE) {
1189 Some(false)
1190 } else {
1191 None
1192 };
1193 options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1194 } else if self.parse_keyword(Keyword::TYPE) {
1195 let ident = self.parse_identifier()?;
1196 options.push(AttachDuckDBDatabaseOption::Type(ident));
1197 } else {
1198 return self
1199 .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1200 };
1201
1202 if self.consume_token(&Token::RParen) {
1203 return Ok(options);
1204 } else if self.consume_token(&Token::Comma) {
1205 continue;
1206 } else {
1207 return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1208 }
1209 }
1210 }
1211
1212 pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1214 let database = self.parse_keyword(Keyword::DATABASE);
1215 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1216 let database_path = self.parse_identifier()?;
1217 let database_alias = if self.parse_keyword(Keyword::AS) {
1218 Some(self.parse_identifier()?)
1219 } else {
1220 None
1221 };
1222
1223 let attach_options = self.parse_attach_duckdb_database_options()?;
1224 Ok(Statement::AttachDuckDBDatabase {
1225 if_not_exists,
1226 database,
1227 database_path,
1228 database_alias,
1229 attach_options,
1230 })
1231 }
1232
1233 pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1235 let database = self.parse_keyword(Keyword::DATABASE);
1236 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1237 let database_alias = self.parse_identifier()?;
1238 Ok(Statement::DetachDuckDBDatabase {
1239 if_exists,
1240 database,
1241 database_alias,
1242 })
1243 }
1244
1245 pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1247 let database = self.parse_keyword(Keyword::DATABASE);
1248 let database_file_name = self.parse_expr()?;
1249 self.expect_keyword_is(Keyword::AS)?;
1250 let schema_name = self.parse_identifier()?;
1251 Ok(Statement::AttachDatabase {
1252 database,
1253 schema_name,
1254 database_file_name,
1255 })
1256 }
1257
1258 pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1260 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1261 let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1262 let mut for_columns = false;
1263 let mut cache_metadata = false;
1264 let mut noscan = false;
1265 let mut partitions = None;
1266 let mut compute_statistics = false;
1267 let mut columns = vec![];
1268
1269 if table_name.is_some() && self.consume_token(&Token::LParen) {
1271 columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1272 self.expect_token(&Token::RParen)?;
1273 }
1274
1275 loop {
1276 match self.parse_one_of_keywords(&[
1277 Keyword::PARTITION,
1278 Keyword::FOR,
1279 Keyword::CACHE,
1280 Keyword::NOSCAN,
1281 Keyword::COMPUTE,
1282 ]) {
1283 Some(Keyword::PARTITION) => {
1284 self.expect_token(&Token::LParen)?;
1285 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1286 self.expect_token(&Token::RParen)?;
1287 }
1288 Some(Keyword::NOSCAN) => noscan = true,
1289 Some(Keyword::FOR) => {
1290 self.expect_keyword_is(Keyword::COLUMNS)?;
1291
1292 columns = self
1293 .maybe_parse(|parser| {
1294 parser.parse_comma_separated(|p| p.parse_identifier())
1295 })?
1296 .unwrap_or_default();
1297 for_columns = true
1298 }
1299 Some(Keyword::CACHE) => {
1300 self.expect_keyword_is(Keyword::METADATA)?;
1301 cache_metadata = true
1302 }
1303 Some(Keyword::COMPUTE) => {
1304 self.expect_keyword_is(Keyword::STATISTICS)?;
1305 compute_statistics = true
1306 }
1307 _ => break,
1308 }
1309 }
1310
1311 Ok(Analyze {
1312 has_table_keyword,
1313 table_name,
1314 for_columns,
1315 columns,
1316 partitions,
1317 cache_metadata,
1318 noscan,
1319 compute_statistics,
1320 })
1321 }
1322
1323 pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1325 let index = self.index;
1326
1327 let next_token = self.next_token();
1328 match next_token.token {
1329 t @ (Token::Word(_) | Token::SingleQuotedString(_))
1330 if self.peek_token_ref().token == Token::Period =>
1331 {
1332 let mut id_parts: Vec<Ident> = vec![match t {
1333 Token::Word(w) => w.into_ident(next_token.span),
1334 Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1335 _ => {
1336 return Err(ParserError::ParserError(
1337 "Internal parser error: unexpected token type".to_string(),
1338 ))
1339 }
1340 }];
1341
1342 while self.consume_token(&Token::Period) {
1343 let next_token = self.next_token();
1344 match next_token.token {
1345 Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1346 Token::SingleQuotedString(s) => {
1347 id_parts.push(Ident::with_quote('\'', s))
1349 }
1350 Token::Placeholder(s) => {
1351 id_parts.push(Ident::new(s))
1354 }
1355 Token::Mul => {
1356 return Ok(Expr::QualifiedWildcard(
1357 ObjectName::from(id_parts),
1358 AttachedToken(next_token),
1359 ));
1360 }
1361 _ => {
1362 return self.expected("an identifier or a '*' after '.'", next_token);
1363 }
1364 }
1365 }
1366 }
1367 Token::Mul => {
1368 return Ok(Expr::Wildcard(AttachedToken(next_token)));
1369 }
1370 Token::LParen => {
1372 let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1373 if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1374 let mul_token = self.next_token(); self.next_token(); return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1377 }
1378 }
1379 _ => (),
1380 };
1381
1382 self.index = index;
1383 self.parse_expr()
1384 }
1385
1386 pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1388 self.parse_subexpr(self.dialect.prec_unknown())
1389 }
1390
1391 pub fn parse_expr_with_alias_and_order_by(
1393 &mut self,
1394 ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1395 let expr = self.parse_expr()?;
1396
1397 fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1398 explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1399 }
1400 let alias = self.parse_optional_alias_inner(None, validator)?;
1401 let order_by = OrderByOptions {
1402 asc: self.parse_asc_desc(),
1403 nulls_first: None,
1404 };
1405 Ok(ExprWithAliasAndOrderBy {
1406 expr: ExprWithAlias { expr, alias },
1407 order_by,
1408 })
1409 }
1410
1411 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1413 pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1414 let _guard = self.recursion_counter.try_decrease()?;
1415 debug!("parsing expr");
1416 let mut expr = self.parse_prefix()?;
1417
1418 expr = self.parse_compound_expr(expr, vec![])?;
1419
1420 if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1424 expr = Expr::Collate {
1425 expr: Box::new(expr),
1426 collation: self.parse_object_name(false)?,
1427 };
1428 }
1429
1430 debug!("prefix: {expr:?}");
1431 loop {
1432 let next_precedence = self.get_next_precedence()?;
1433 debug!("next precedence: {next_precedence:?}");
1434
1435 if precedence >= next_precedence {
1436 break;
1437 }
1438
1439 if Token::Period == self.peek_token_ref().token {
1442 break;
1443 }
1444
1445 expr = self.parse_infix(expr, next_precedence)?;
1446 }
1447 Ok(expr)
1448 }
1449
1450 pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1452 let condition = self.parse_expr()?;
1453 let message = if self.parse_keyword(Keyword::AS) {
1454 Some(self.parse_expr()?)
1455 } else {
1456 None
1457 };
1458
1459 Ok(Statement::Assert { condition, message })
1460 }
1461
1462 pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1464 let name = self.parse_identifier()?;
1465 Ok(Statement::Savepoint { name })
1466 }
1467
1468 pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1470 let _ = self.parse_keyword(Keyword::SAVEPOINT);
1471 let name = self.parse_identifier()?;
1472
1473 Ok(Statement::ReleaseSavepoint { name })
1474 }
1475
1476 pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1478 let channel = self.parse_identifier()?;
1479 Ok(Statement::LISTEN { channel })
1480 }
1481
1482 pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1484 let channel = if self.consume_token(&Token::Mul) {
1485 Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1486 } else {
1487 match self.parse_identifier() {
1488 Ok(expr) => expr,
1489 _ => {
1490 self.prev_token();
1491 return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1492 }
1493 }
1494 };
1495 Ok(Statement::UNLISTEN { channel })
1496 }
1497
1498 pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1500 let channel = self.parse_identifier()?;
1501 let payload = if self.consume_token(&Token::Comma) {
1502 Some(self.parse_literal_string()?)
1503 } else {
1504 None
1505 };
1506 Ok(Statement::NOTIFY { channel, payload })
1507 }
1508
1509 pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1511 if self.peek_keyword(Keyword::TABLE) {
1512 self.expect_keyword(Keyword::TABLE)?;
1513 let rename_tables = self.parse_comma_separated(|parser| {
1514 let old_name = parser.parse_object_name(false)?;
1515 parser.expect_keyword(Keyword::TO)?;
1516 let new_name = parser.parse_object_name(false)?;
1517
1518 Ok(RenameTable { old_name, new_name })
1519 })?;
1520 Ok(rename_tables.into())
1521 } else {
1522 self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1523 }
1524 }
1525
1526 fn parse_expr_prefix_by_reserved_word(
1529 &mut self,
1530 w: &Word,
1531 w_span: Span,
1532 ) -> Result<Option<Expr>, ParserError> {
1533 match w.keyword {
1534 Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1535 self.prev_token();
1536 Ok(Some(Expr::Value(self.parse_value()?)))
1537 }
1538 Keyword::NULL => {
1539 self.prev_token();
1540 Ok(Some(Expr::Value(self.parse_value()?)))
1541 }
1542 Keyword::CURRENT_CATALOG
1543 | Keyword::CURRENT_USER
1544 | Keyword::SESSION_USER
1545 | Keyword::USER
1546 if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1547 {
1548 Ok(Some(Expr::Function(Function {
1549 name: ObjectName::from(vec![w.to_ident(w_span)]),
1550 uses_odbc_syntax: false,
1551 parameters: FunctionArguments::None,
1552 args: FunctionArguments::None,
1553 null_treatment: None,
1554 filter: None,
1555 over: None,
1556 within_group: vec![],
1557 })))
1558 }
1559 Keyword::CURRENT_TIMESTAMP
1560 | Keyword::CURRENT_TIME
1561 | Keyword::CURRENT_DATE
1562 | Keyword::LOCALTIME
1563 | Keyword::LOCALTIMESTAMP => {
1564 Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1565 }
1566 Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1567 Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1568 Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1569 Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1570 Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1571 Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1572 Keyword::EXISTS
1573 if !dialect_of!(self is DatabricksDialect)
1575 || matches!(
1576 self.peek_nth_token_ref(1).token,
1577 Token::Word(Word {
1578 keyword: Keyword::SELECT | Keyword::WITH,
1579 ..
1580 })
1581 ) =>
1582 {
1583 Ok(Some(self.parse_exists_expr(false)?))
1584 }
1585 Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1586 Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1587 Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1588 Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1589 Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1590 }
1591 Keyword::SUBSTR | Keyword::SUBSTRING => {
1592 self.prev_token();
1593 Ok(Some(self.parse_substring()?))
1594 }
1595 Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1596 Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1597 Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1598 Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1600 self.expect_token(&Token::LBracket)?;
1601 Ok(Some(self.parse_array_expr(true)?))
1602 }
1603 Keyword::ARRAY
1604 if self.peek_token_ref().token == Token::LParen
1605 && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1606 {
1607 self.expect_token(&Token::LParen)?;
1608 let query = self.parse_query()?;
1609 self.expect_token(&Token::RParen)?;
1610 Ok(Some(Expr::Function(Function {
1611 name: ObjectName::from(vec![w.to_ident(w_span)]),
1612 uses_odbc_syntax: false,
1613 parameters: FunctionArguments::None,
1614 args: FunctionArguments::Subquery(query),
1615 filter: None,
1616 null_treatment: None,
1617 over: None,
1618 within_group: vec![],
1619 })))
1620 }
1621 Keyword::NOT => Ok(Some(self.parse_not()?)),
1622 Keyword::MATCH if self.dialect.supports_match_against() => {
1623 Ok(Some(self.parse_match_against()?))
1624 }
1625 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1626 let struct_expr = self.parse_struct_literal()?;
1627 Ok(Some(struct_expr))
1628 }
1629 Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1630 let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1631 Ok(Some(Expr::Prior(Box::new(expr))))
1632 }
1633 Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1634 Ok(Some(self.parse_duckdb_map_literal()?))
1635 }
1636 Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1637 Ok(Some(self.parse_lambda_expr()?))
1638 }
1639 _ if self.dialect.supports_geometric_types() => match w.keyword {
1640 Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1641 Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1642 Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1643 Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1644 Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1645 Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1646 Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1647 _ => Ok(None),
1648 },
1649 _ => Ok(None),
1650 }
1651 }
1652
1653 fn parse_expr_prefix_by_unreserved_word(
1655 &mut self,
1656 w: &Word,
1657 w_span: Span,
1658 ) -> Result<Expr, ParserError> {
1659 let is_outer_join = self.peek_outer_join_operator();
1660 match &self.peek_token_ref().token {
1661 Token::LParen if !is_outer_join => {
1662 let id_parts = vec![w.to_ident(w_span)];
1663 self.parse_function(ObjectName::from(id_parts))
1664 }
1665 Token::SingleQuotedString(_)
1667 | Token::DoubleQuotedString(_)
1668 | Token::HexStringLiteral(_)
1669 if w.value.starts_with('_') =>
1670 {
1671 Ok(Expr::Prefixed {
1672 prefix: w.to_ident(w_span),
1673 value: self.parse_introduced_string_expr()?.into(),
1674 })
1675 }
1676 Token::SingleQuotedString(_)
1678 | Token::DoubleQuotedString(_)
1679 | Token::HexStringLiteral(_)
1680 if w.value.starts_with('_') =>
1681 {
1682 Ok(Expr::Prefixed {
1683 prefix: w.to_ident(w_span),
1684 value: self.parse_introduced_string_expr()?.into(),
1685 })
1686 }
1687 Token::Arrow if self.dialect.supports_lambda_functions() => {
1691 self.expect_token(&Token::Arrow)?;
1692 Ok(Expr::Lambda(LambdaFunction {
1693 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1694 name: w.to_ident(w_span),
1695 data_type: None,
1696 }),
1697 body: Box::new(self.parse_expr()?),
1698 syntax: LambdaSyntax::Arrow,
1699 }))
1700 }
1701 Token::Word(_)
1705 if self.dialect.supports_lambda_functions()
1706 && self.peek_nth_token_ref(1).token == Token::Arrow =>
1707 {
1708 let data_type = self.parse_data_type()?;
1709 self.expect_token(&Token::Arrow)?;
1710 Ok(Expr::Lambda(LambdaFunction {
1711 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1712 name: w.to_ident(w_span),
1713 data_type: Some(data_type),
1714 }),
1715 body: Box::new(self.parse_expr()?),
1716 syntax: LambdaSyntax::Arrow,
1717 }))
1718 }
1719 _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1720 }
1721 }
1722
1723 fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1726 if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1727 ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1728 } else {
1729 false
1730 }
1731 }
1732
1733 pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1735 if let Some(prefix) = self.dialect.parse_prefix(self) {
1737 return prefix;
1738 }
1739
1740 let loc = self.peek_token_ref().span.start;
1757 let opt_expr = self.maybe_parse(|parser| {
1758 match parser.parse_data_type()? {
1759 DataType::Interval { .. } => parser.parse_interval(),
1760 DataType::Custom(ref name, ref modifiers)
1771 if modifiers.is_empty()
1772 && Self::is_simple_unquoted_object_name(name, "xml")
1773 && parser.dialect.supports_xml_expressions() =>
1774 {
1775 Ok(Expr::TypedString(TypedString {
1776 data_type: DataType::Custom(name.clone(), modifiers.clone()),
1777 value: parser.parse_value()?,
1778 uses_odbc_syntax: false,
1779 }))
1780 }
1781 DataType::Custom(..) => parser_err!("dummy", loc),
1782 DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1784 Ok(Expr::Cast {
1785 kind: CastKind::Cast,
1786 expr: Box::new(parser.parse_expr()?),
1787 data_type: DataType::Binary(None),
1788 array: false,
1789 format: None,
1790 })
1791 }
1792 data_type => Ok(Expr::TypedString(TypedString {
1793 data_type,
1794 value: parser.parse_value()?,
1795 uses_odbc_syntax: false,
1796 })),
1797 }
1798 })?;
1799
1800 if let Some(expr) = opt_expr {
1801 return Ok(expr);
1802 }
1803
1804 let dialect = self.dialect;
1808
1809 self.advance_token();
1810 let next_token_index = self.get_current_index();
1811 let next_token = self.get_current_token();
1812 let span = next_token.span;
1813 let expr = match &next_token.token {
1814 Token::Word(w) => {
1815 let w = w.clone();
1824 match self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span)) {
1825 Ok(Some(expr)) => Ok(expr),
1827
1828 Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1830
1831 Err(e) => {
1838 if !self.dialect.is_reserved_for_identifier(w.keyword) {
1839 if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1840 parser.parse_expr_prefix_by_unreserved_word(&w, span)
1841 }) {
1842 return Ok(expr);
1843 }
1844 }
1845 return Err(e);
1846 }
1847 }
1848 } Token::LBracket => self.parse_array_expr(false),
1851 tok @ Token::Minus | tok @ Token::Plus => {
1852 let op = if *tok == Token::Plus {
1853 UnaryOperator::Plus
1854 } else {
1855 UnaryOperator::Minus
1856 };
1857 Ok(Expr::UnaryOp {
1858 op,
1859 expr: Box::new(
1860 self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1861 ),
1862 })
1863 }
1864 Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1865 op: UnaryOperator::BangNot,
1866 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1867 }),
1868 tok @ Token::DoubleExclamationMark
1869 | tok @ Token::PGSquareRoot
1870 | tok @ Token::PGCubeRoot
1871 | tok @ Token::AtSign
1872 if dialect_is!(dialect is PostgreSqlDialect) =>
1873 {
1874 let op = match tok {
1875 Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1876 Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1877 Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1878 Token::AtSign => UnaryOperator::PGAbs,
1879 _ => {
1880 return Err(ParserError::ParserError(
1881 "Internal parser error: unexpected unary operator token".to_string(),
1882 ))
1883 }
1884 };
1885 Ok(Expr::UnaryOp {
1886 op,
1887 expr: Box::new(
1888 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1889 ),
1890 })
1891 }
1892 Token::Tilde => Ok(Expr::UnaryOp {
1893 op: UnaryOperator::BitwiseNot,
1894 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1895 }),
1896 tok @ Token::Sharp
1897 | tok @ Token::AtDashAt
1898 | tok @ Token::AtAt
1899 | tok @ Token::QuestionMarkDash
1900 | tok @ Token::QuestionPipe
1901 if self.dialect.supports_geometric_types() =>
1902 {
1903 let op = match tok {
1904 Token::Sharp => UnaryOperator::Hash,
1905 Token::AtDashAt => UnaryOperator::AtDashAt,
1906 Token::AtAt => UnaryOperator::DoubleAt,
1907 Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1908 Token::QuestionPipe => UnaryOperator::QuestionPipe,
1909 _ => {
1910 return Err(ParserError::ParserError(format!(
1911 "Unexpected token in unary operator parsing: {tok:?}"
1912 )))
1913 }
1914 };
1915 Ok(Expr::UnaryOp {
1916 op,
1917 expr: Box::new(
1918 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1919 ),
1920 })
1921 }
1922 Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1923 {
1924 self.prev_token();
1925 Ok(Expr::Value(self.parse_value()?))
1926 }
1927 Token::UnicodeStringLiteral(_) => {
1928 self.prev_token();
1929 Ok(Expr::Value(self.parse_value()?))
1930 }
1931 Token::Number(_, _)
1932 | Token::SingleQuotedString(_)
1933 | Token::DoubleQuotedString(_)
1934 | Token::TripleSingleQuotedString(_)
1935 | Token::TripleDoubleQuotedString(_)
1936 | Token::DollarQuotedString(_)
1937 | Token::SingleQuotedByteStringLiteral(_)
1938 | Token::DoubleQuotedByteStringLiteral(_)
1939 | Token::TripleSingleQuotedByteStringLiteral(_)
1940 | Token::TripleDoubleQuotedByteStringLiteral(_)
1941 | Token::SingleQuotedRawStringLiteral(_)
1942 | Token::DoubleQuotedRawStringLiteral(_)
1943 | Token::TripleSingleQuotedRawStringLiteral(_)
1944 | Token::TripleDoubleQuotedRawStringLiteral(_)
1945 | Token::NationalStringLiteral(_)
1946 | Token::QuoteDelimitedStringLiteral(_)
1947 | Token::NationalQuoteDelimitedStringLiteral(_)
1948 | Token::HexStringLiteral(_) => {
1949 self.prev_token();
1950 Ok(Expr::Value(self.parse_value()?))
1951 }
1952 Token::LParen => {
1953 let expr =
1954 if let Some(expr) = self.try_parse_expr_sub_query()? {
1955 expr
1956 } else if let Some(lambda) = self.try_parse_lambda()? {
1957 return Ok(lambda);
1958 } else {
1959 let exprs = self.with_state(ParserState::Normal, |p| {
1970 p.parse_comma_separated(Parser::parse_expr)
1971 })?;
1972 match exprs.len() {
1973 0 => return Err(ParserError::ParserError(
1974 "Internal parser error: parse_comma_separated returned empty list"
1975 .to_string(),
1976 )),
1977 1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
1978 _ => Expr::Tuple(exprs),
1979 }
1980 };
1981 self.expect_token(&Token::RParen)?;
1982 Ok(expr)
1983 }
1984 Token::Placeholder(_) | Token::Colon | Token::AtSign => {
1985 self.prev_token();
1986 Ok(Expr::Value(self.parse_value()?))
1987 }
1988 Token::LBrace => {
1989 self.prev_token();
1990 self.parse_lbrace_expr()
1991 }
1992 _ => self.expected_at("an expression", next_token_index),
1993 }?;
1994
1995 Ok(expr)
1996 }
1997
1998 fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
1999 Ok(Expr::TypedString(TypedString {
2000 data_type: DataType::GeometricType(kind),
2001 value: self.parse_value()?,
2002 uses_odbc_syntax: false,
2003 }))
2004 }
2005
2006 pub fn parse_compound_expr(
2013 &mut self,
2014 root: Expr,
2015 mut chain: Vec<AccessExpr>,
2016 ) -> Result<Expr, ParserError> {
2017 let mut ending_wildcard: Option<TokenWithSpan> = None;
2018 loop {
2019 if self.consume_token(&Token::Period) {
2020 let next_token = self.peek_token_ref();
2021 match &next_token.token {
2022 Token::Mul => {
2023 if dialect_of!(self is PostgreSqlDialect) {
2026 ending_wildcard = Some(self.next_token());
2027 } else {
2028 self.prev_token(); }
2035
2036 break;
2037 }
2038 Token::SingleQuotedString(s) => {
2039 let expr =
2040 Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2041 chain.push(AccessExpr::Dot(expr));
2042 self.advance_token(); }
2044 Token::Placeholder(s) => {
2045 let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2048 chain.push(AccessExpr::Dot(expr));
2049 self.advance_token(); }
2051 _ => {
2056 let expr = self.maybe_parse(|parser| {
2057 let expr = parser
2058 .parse_subexpr(parser.dialect.prec_value(Precedence::Period))?;
2059 match &expr {
2060 Expr::CompoundFieldAccess { .. }
2061 | Expr::CompoundIdentifier(_)
2062 | Expr::Identifier(_)
2063 | Expr::Value(_)
2064 | Expr::Function(_) => Ok(expr),
2065 _ => parser.expected_ref(
2066 "an identifier or value",
2067 parser.peek_token_ref(),
2068 ),
2069 }
2070 })?;
2071
2072 match expr {
2073 Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2082 chain.push(AccessExpr::Dot(*root));
2083 chain.extend(access_chain);
2084 }
2085 Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2086 parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2087 ),
2088 Some(expr) => {
2089 chain.push(AccessExpr::Dot(expr));
2090 }
2091 None => {
2095 chain.push(AccessExpr::Dot(Expr::Identifier(
2096 self.parse_identifier()?,
2097 )));
2098 }
2099 }
2100 }
2101 }
2102 } else if !self.dialect.supports_partiql()
2103 && self.peek_token_ref().token == Token::LBracket
2104 {
2105 self.parse_multi_dim_subscript(&mut chain)?;
2106 } else {
2107 break;
2108 }
2109 }
2110
2111 let tok_index = self.get_current_index();
2112 if let Some(wildcard_token) = ending_wildcard {
2113 if !Self::is_all_ident(&root, &chain) {
2114 return self
2115 .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2116 };
2117 Ok(Expr::QualifiedWildcard(
2118 ObjectName::from(Self::exprs_to_idents(root, chain)?),
2119 AttachedToken(wildcard_token),
2120 ))
2121 } else if self.maybe_parse_outer_join_operator() {
2122 if !Self::is_all_ident(&root, &chain) {
2123 return self.expected_at("column identifier before (+)", tok_index);
2124 };
2125 let expr = if chain.is_empty() {
2126 root
2127 } else {
2128 Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2129 };
2130 Ok(Expr::OuterJoin(expr.into()))
2131 } else {
2132 Self::build_compound_expr(root, chain)
2133 }
2134 }
2135
2136 fn build_compound_expr(
2141 root: Expr,
2142 mut access_chain: Vec<AccessExpr>,
2143 ) -> Result<Expr, ParserError> {
2144 if access_chain.is_empty() {
2145 return Ok(root);
2146 }
2147
2148 if Self::is_all_ident(&root, &access_chain) {
2149 return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2150 root,
2151 access_chain,
2152 )?));
2153 }
2154
2155 if matches!(root, Expr::Identifier(_))
2160 && matches!(
2161 access_chain.last(),
2162 Some(AccessExpr::Dot(Expr::Function(_)))
2163 )
2164 && access_chain
2165 .iter()
2166 .rev()
2167 .skip(1) .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2169 {
2170 let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2171 return parser_err!("expected function expression", root.span().start);
2172 };
2173
2174 let compound_func_name = [root]
2175 .into_iter()
2176 .chain(access_chain.into_iter().flat_map(|access| match access {
2177 AccessExpr::Dot(expr) => Some(expr),
2178 _ => None,
2179 }))
2180 .flat_map(|expr| match expr {
2181 Expr::Identifier(ident) => Some(ident),
2182 _ => None,
2183 })
2184 .map(ObjectNamePart::Identifier)
2185 .chain(func.name.0)
2186 .collect::<Vec<_>>();
2187 func.name = ObjectName(compound_func_name);
2188
2189 return Ok(Expr::Function(func));
2190 }
2191
2192 if access_chain.len() == 1
2197 && matches!(
2198 access_chain.last(),
2199 Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2200 )
2201 {
2202 let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2203 return parser_err!("expected (+) expression", root.span().start);
2204 };
2205
2206 if !Self::is_all_ident(&root, &[]) {
2207 return parser_err!("column identifier before (+)", root.span().start);
2208 };
2209
2210 let token_start = root.span().start;
2211 let mut idents = Self::exprs_to_idents(root, vec![])?;
2212 match *inner_expr {
2213 Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2214 Expr::Identifier(suffix) => idents.push(suffix),
2215 _ => {
2216 return parser_err!("column identifier before (+)", token_start);
2217 }
2218 }
2219
2220 return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2221 }
2222
2223 Ok(Expr::CompoundFieldAccess {
2224 root: Box::new(root),
2225 access_chain,
2226 })
2227 }
2228
2229 fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2230 match k {
2231 Keyword::LOCAL => Some(ContextModifier::Local),
2232 Keyword::GLOBAL => Some(ContextModifier::Global),
2233 Keyword::SESSION => Some(ContextModifier::Session),
2234 _ => None,
2235 }
2236 }
2237
2238 fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2240 if !matches!(root, Expr::Identifier(_)) {
2241 return false;
2242 }
2243 fields
2244 .iter()
2245 .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2246 }
2247
2248 fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2250 let mut idents = vec![];
2251 if let Expr::Identifier(root) = root {
2252 idents.push(root);
2253 for x in fields {
2254 if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2255 idents.push(ident);
2256 } else {
2257 return parser_err!(
2258 format!("Expected identifier, found: {}", x),
2259 x.span().start
2260 );
2261 }
2262 }
2263 Ok(idents)
2264 } else {
2265 parser_err!(
2266 format!("Expected identifier, found: {}", root),
2267 root.span().start
2268 )
2269 }
2270 }
2271
2272 fn peek_outer_join_operator(&mut self) -> bool {
2274 if !self.dialect.supports_outer_join_operator() {
2275 return false;
2276 }
2277
2278 let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2279 Token::LParen == maybe_lparen.token
2280 && Token::Plus == maybe_plus.token
2281 && Token::RParen == maybe_rparen.token
2282 }
2283
2284 fn maybe_parse_outer_join_operator(&mut self) -> bool {
2287 self.dialect.supports_outer_join_operator()
2288 && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2289 }
2290
2291 pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2293 self.expect_token(&Token::LParen)?;
2294 let options = self.parse_comma_separated(Self::parse_utility_option)?;
2295 self.expect_token(&Token::RParen)?;
2296
2297 Ok(options)
2298 }
2299
2300 fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2301 let name = self.parse_identifier()?;
2302
2303 let next_token = self.peek_token_ref();
2304 if next_token == &Token::Comma || next_token == &Token::RParen {
2305 return Ok(UtilityOption { name, arg: None });
2306 }
2307 let arg = self.parse_expr()?;
2308
2309 Ok(UtilityOption {
2310 name,
2311 arg: Some(arg),
2312 })
2313 }
2314
2315 fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2316 if !self.peek_sub_query() {
2317 return Ok(None);
2318 }
2319
2320 Ok(Some(Expr::Subquery(self.parse_query()?)))
2321 }
2322
2323 fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2324 if !self.dialect.supports_lambda_functions() {
2325 return Ok(None);
2326 }
2327 self.maybe_parse(|p| {
2328 let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2329 p.expect_token(&Token::RParen)?;
2330 p.expect_token(&Token::Arrow)?;
2331 let expr = p.parse_expr()?;
2332 Ok(Expr::Lambda(LambdaFunction {
2333 params: OneOrManyWithParens::Many(params),
2334 body: Box::new(expr),
2335 syntax: LambdaSyntax::Arrow,
2336 }))
2337 })
2338 }
2339
2340 fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2350 let params = self.parse_lambda_function_parameters()?;
2352 self.expect_token(&Token::Colon)?;
2354 let body = self.parse_expr()?;
2356 Ok(Expr::Lambda(LambdaFunction {
2357 params,
2358 body: Box::new(body),
2359 syntax: LambdaSyntax::LambdaKeyword,
2360 }))
2361 }
2362
2363 fn parse_lambda_function_parameters(
2365 &mut self,
2366 ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2367 let params = if self.consume_token(&Token::LParen) {
2369 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2371 self.expect_token(&Token::RParen)?;
2372 OneOrManyWithParens::Many(params)
2373 } else {
2374 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2376 if params.len() == 1 {
2377 OneOrManyWithParens::One(params.into_iter().next().unwrap())
2378 } else {
2379 OneOrManyWithParens::Many(params)
2380 }
2381 };
2382 Ok(params)
2383 }
2384
2385 fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2387 let name = self.parse_identifier()?;
2388 let data_type = match &self.peek_token_ref().token {
2389 Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2390 _ => None,
2391 };
2392 Ok(LambdaFunctionParameter { name, data_type })
2393 }
2394
2395 fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2402 if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2404 return Ok(Some(expr));
2405 }
2406 self.maybe_parse_odbc_body_datetime()
2408 }
2409
2410 fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2421 self.maybe_parse(|p| {
2422 let token = p.next_token().clone();
2423 let word_string = token.token.to_string();
2424 let data_type = match word_string.as_str() {
2425 "t" => DataType::Time(None, TimezoneInfo::None),
2426 "d" => DataType::Date,
2427 "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2428 _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2429 };
2430 let value = p.parse_value()?;
2431 Ok(Expr::TypedString(TypedString {
2432 data_type,
2433 value,
2434 uses_odbc_syntax: true,
2435 }))
2436 })
2437 }
2438
2439 fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2448 self.maybe_parse(|p| {
2449 p.expect_keyword(Keyword::FN)?;
2450 let fn_name = p.parse_object_name(false)?;
2451 let mut fn_call = p.parse_function_call(fn_name)?;
2452 fn_call.uses_odbc_syntax = true;
2453 Ok(Expr::Function(fn_call))
2454 })
2455 }
2456
2457 pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2459 self.parse_function_call(name).map(Expr::Function)
2460 }
2461
2462 fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2463 self.expect_token(&Token::LParen)?;
2464
2465 if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2468 let subquery = self.parse_query()?;
2469 self.expect_token(&Token::RParen)?;
2470 return Ok(Function {
2471 name,
2472 uses_odbc_syntax: false,
2473 parameters: FunctionArguments::None,
2474 args: FunctionArguments::Subquery(subquery),
2475 filter: None,
2476 null_treatment: None,
2477 over: None,
2478 within_group: vec![],
2479 });
2480 }
2481
2482 let mut args = self.parse_function_argument_list()?;
2483 let mut parameters = FunctionArguments::None;
2484 if dialect_of!(self is ClickHouseDialect | GenericDialect)
2487 && self.consume_token(&Token::LParen)
2488 {
2489 parameters = FunctionArguments::List(args);
2490 args = self.parse_function_argument_list()?;
2491 }
2492
2493 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2494 self.expect_token(&Token::LParen)?;
2495 self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2496 let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2497 self.expect_token(&Token::RParen)?;
2498 order_by
2499 } else {
2500 vec![]
2501 };
2502
2503 let filter = if self.dialect.supports_filter_during_aggregation()
2504 && self.parse_keyword(Keyword::FILTER)
2505 && self.consume_token(&Token::LParen)
2506 && self.parse_keyword(Keyword::WHERE)
2507 {
2508 let filter = Some(Box::new(self.parse_expr()?));
2509 self.expect_token(&Token::RParen)?;
2510 filter
2511 } else {
2512 None
2513 };
2514
2515 let null_treatment = if args
2518 .clauses
2519 .iter()
2520 .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2521 {
2522 self.parse_null_treatment()?
2523 } else {
2524 None
2525 };
2526
2527 let over = if self.parse_keyword(Keyword::OVER) {
2528 if self.consume_token(&Token::LParen) {
2529 let window_spec = self.parse_window_spec()?;
2530 Some(WindowType::WindowSpec(window_spec))
2531 } else {
2532 Some(WindowType::NamedWindow(self.parse_identifier()?))
2533 }
2534 } else {
2535 None
2536 };
2537
2538 Ok(Function {
2539 name,
2540 uses_odbc_syntax: false,
2541 parameters,
2542 args: FunctionArguments::List(args),
2543 null_treatment,
2544 filter,
2545 over,
2546 within_group,
2547 })
2548 }
2549
2550 fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2552 match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2553 Some(keyword) => {
2554 self.expect_keyword_is(Keyword::NULLS)?;
2555
2556 Ok(match keyword {
2557 Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2558 Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2559 _ => None,
2560 })
2561 }
2562 None => Ok(None),
2563 }
2564 }
2565
2566 pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2568 let args = if self.consume_token(&Token::LParen) {
2569 FunctionArguments::List(self.parse_function_argument_list()?)
2570 } else {
2571 FunctionArguments::None
2572 };
2573 Ok(Expr::Function(Function {
2574 name,
2575 uses_odbc_syntax: false,
2576 parameters: FunctionArguments::None,
2577 args,
2578 filter: None,
2579 over: None,
2580 null_treatment: None,
2581 within_group: vec![],
2582 }))
2583 }
2584
2585 pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2587 let next_token = self.next_token();
2588 match &next_token.token {
2589 Token::Word(w) => match w.keyword {
2590 Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2591 Keyword::RANGE => Ok(WindowFrameUnits::Range),
2592 Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2593 _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2594 },
2595 _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2596 }
2597 }
2598
2599 pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2601 let units = self.parse_window_frame_units()?;
2602 let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2603 let start_bound = self.parse_window_frame_bound()?;
2604 self.expect_keyword_is(Keyword::AND)?;
2605 let end_bound = Some(self.parse_window_frame_bound()?);
2606 (start_bound, end_bound)
2607 } else {
2608 (self.parse_window_frame_bound()?, None)
2609 };
2610 Ok(WindowFrame {
2611 units,
2612 start_bound,
2613 end_bound,
2614 })
2615 }
2616
2617 pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2619 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2620 Ok(WindowFrameBound::CurrentRow)
2621 } else {
2622 let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2623 None
2624 } else {
2625 Some(Box::new(match &self.peek_token_ref().token {
2626 Token::SingleQuotedString(_) => self.parse_interval()?,
2627 _ => self.parse_expr()?,
2628 }))
2629 };
2630 if self.parse_keyword(Keyword::PRECEDING) {
2631 Ok(WindowFrameBound::Preceding(rows))
2632 } else if self.parse_keyword(Keyword::FOLLOWING) {
2633 Ok(WindowFrameBound::Following(rows))
2634 } else {
2635 self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2636 }
2637 }
2638 }
2639
2640 fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2642 if self.dialect.supports_group_by_expr() {
2643 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2644 self.expect_token(&Token::LParen)?;
2645 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2646 self.expect_token(&Token::RParen)?;
2647 Ok(Expr::GroupingSets(result))
2648 } else if self.parse_keyword(Keyword::CUBE) {
2649 self.expect_token(&Token::LParen)?;
2650 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2651 self.expect_token(&Token::RParen)?;
2652 Ok(Expr::Cube(result))
2653 } else if self.parse_keyword(Keyword::ROLLUP) {
2654 self.expect_token(&Token::LParen)?;
2655 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2656 self.expect_token(&Token::RParen)?;
2657 Ok(Expr::Rollup(result))
2658 } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2659 Ok(Expr::Tuple(vec![]))
2663 } else {
2664 self.parse_expr()
2665 }
2666 } else {
2667 self.parse_expr()
2669 }
2670 }
2671
2672 fn parse_tuple(
2676 &mut self,
2677 lift_singleton: bool,
2678 allow_empty: bool,
2679 ) -> Result<Vec<Expr>, ParserError> {
2680 if lift_singleton {
2681 if self.consume_token(&Token::LParen) {
2682 let result = if allow_empty && self.consume_token(&Token::RParen) {
2683 vec![]
2684 } else {
2685 let result = self.parse_comma_separated(Parser::parse_expr)?;
2686 self.expect_token(&Token::RParen)?;
2687 result
2688 };
2689 Ok(result)
2690 } else {
2691 Ok(vec![self.parse_expr()?])
2692 }
2693 } else {
2694 self.expect_token(&Token::LParen)?;
2695 let result = if allow_empty && self.consume_token(&Token::RParen) {
2696 vec![]
2697 } else {
2698 let result = self.parse_comma_separated(Parser::parse_expr)?;
2699 self.expect_token(&Token::RParen)?;
2700 result
2701 };
2702 Ok(result)
2703 }
2704 }
2705
2706 pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2708 let case_token = AttachedToken(self.get_current_token().clone());
2709 let mut operand = None;
2710 if !self.parse_keyword(Keyword::WHEN) {
2711 operand = Some(Box::new(self.parse_expr()?));
2712 self.expect_keyword_is(Keyword::WHEN)?;
2713 }
2714 let mut conditions = vec![];
2715 loop {
2716 let condition = self.parse_expr()?;
2717 self.expect_keyword_is(Keyword::THEN)?;
2718 let result = self.parse_expr()?;
2719 conditions.push(CaseWhen { condition, result });
2720 if !self.parse_keyword(Keyword::WHEN) {
2721 break;
2722 }
2723 }
2724 let else_result = if self.parse_keyword(Keyword::ELSE) {
2725 Some(Box::new(self.parse_expr()?))
2726 } else {
2727 None
2728 };
2729 let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2730 Ok(Expr::Case {
2731 case_token,
2732 end_token,
2733 operand,
2734 conditions,
2735 else_result,
2736 })
2737 }
2738
2739 pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2741 if self.parse_keyword(Keyword::FORMAT) {
2742 let value = self.parse_value()?;
2743 match self.parse_optional_time_zone()? {
2744 Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2745 None => Ok(Some(CastFormat::Value(value))),
2746 }
2747 } else {
2748 Ok(None)
2749 }
2750 }
2751
2752 pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2754 if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2755 self.parse_value().map(Some)
2756 } else {
2757 Ok(None)
2758 }
2759 }
2760
2761 fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2763 self.expect_token(&Token::LParen)?;
2764 let data_type = self.parse_data_type()?;
2765 self.expect_token(&Token::Comma)?;
2766 let expr = self.parse_expr()?;
2767 let styles = if self.consume_token(&Token::Comma) {
2768 self.parse_comma_separated(Parser::parse_expr)?
2769 } else {
2770 Default::default()
2771 };
2772 self.expect_token(&Token::RParen)?;
2773 Ok(Expr::Convert {
2774 is_try,
2775 expr: Box::new(expr),
2776 data_type: Some(data_type),
2777 charset: None,
2778 target_before_value: true,
2779 styles,
2780 })
2781 }
2782
2783 pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2788 if self.dialect.convert_type_before_value() {
2789 return self.parse_mssql_convert(is_try);
2790 }
2791 self.expect_token(&Token::LParen)?;
2792 let expr = self.parse_expr()?;
2793 if self.parse_keyword(Keyword::USING) {
2794 let charset = self.parse_object_name(false)?;
2795 self.expect_token(&Token::RParen)?;
2796 return Ok(Expr::Convert {
2797 is_try,
2798 expr: Box::new(expr),
2799 data_type: None,
2800 charset: Some(charset),
2801 target_before_value: false,
2802 styles: vec![],
2803 });
2804 }
2805 self.expect_token(&Token::Comma)?;
2806 let data_type = self.parse_data_type()?;
2807 let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2808 Some(self.parse_object_name(false)?)
2809 } else {
2810 None
2811 };
2812 self.expect_token(&Token::RParen)?;
2813 Ok(Expr::Convert {
2814 is_try,
2815 expr: Box::new(expr),
2816 data_type: Some(data_type),
2817 charset,
2818 target_before_value: false,
2819 styles: vec![],
2820 })
2821 }
2822
2823 pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2825 self.expect_token(&Token::LParen)?;
2826 let expr = self.parse_expr()?;
2827 self.expect_keyword_is(Keyword::AS)?;
2828 let data_type = self.parse_data_type()?;
2829 let array = self.parse_keyword(Keyword::ARRAY);
2830 let format = self.parse_optional_cast_format()?;
2831 self.expect_token(&Token::RParen)?;
2832 Ok(Expr::Cast {
2833 kind,
2834 expr: Box::new(expr),
2835 data_type,
2836 array,
2837 format,
2838 })
2839 }
2840
2841 pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2843 self.expect_token(&Token::LParen)?;
2844 let exists_node = Expr::Exists {
2845 negated,
2846 subquery: self.parse_query()?,
2847 };
2848 self.expect_token(&Token::RParen)?;
2849 Ok(exists_node)
2850 }
2851
2852 pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2854 self.expect_token(&Token::LParen)?;
2855 let field = self.parse_date_time_field()?;
2856
2857 let syntax = if self.parse_keyword(Keyword::FROM) {
2858 ExtractSyntax::From
2859 } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2860 {
2861 ExtractSyntax::Comma
2862 } else {
2863 return Err(ParserError::ParserError(
2864 "Expected 'FROM' or ','".to_string(),
2865 ));
2866 };
2867
2868 let expr = self.parse_expr()?;
2869 self.expect_token(&Token::RParen)?;
2870 Ok(Expr::Extract {
2871 field,
2872 expr: Box::new(expr),
2873 syntax,
2874 })
2875 }
2876
2877 pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2879 self.expect_token(&Token::LParen)?;
2880 let expr = self.parse_expr()?;
2881 let field = if self.parse_keyword(Keyword::TO) {
2883 CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2885 } else if self.consume_token(&Token::Comma) {
2886 let v = self.parse_value()?;
2888 if matches!(v.value, Value::Number(_, _)) {
2889 CeilFloorKind::Scale(v)
2890 } else {
2891 return Err(ParserError::ParserError(
2892 "Scale field can only be of number type".to_string(),
2893 ));
2894 }
2895 } else {
2896 CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2897 };
2898 self.expect_token(&Token::RParen)?;
2899 if is_ceil {
2900 Ok(Expr::Ceil {
2901 expr: Box::new(expr),
2902 field,
2903 })
2904 } else {
2905 Ok(Expr::Floor {
2906 expr: Box::new(expr),
2907 field,
2908 })
2909 }
2910 }
2911
2912 pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2914 let between_prec = self.dialect.prec_value(Precedence::Between);
2915 let position_expr = self.maybe_parse(|p| {
2916 p.expect_token(&Token::LParen)?;
2918
2919 let expr = p.parse_subexpr(between_prec)?;
2921 p.expect_keyword_is(Keyword::IN)?;
2922 let from = p.parse_expr()?;
2923 p.expect_token(&Token::RParen)?;
2924 Ok(Expr::Position {
2925 expr: Box::new(expr),
2926 r#in: Box::new(from),
2927 })
2928 })?;
2929 match position_expr {
2930 Some(expr) => Ok(expr),
2931 None => self.parse_function(ObjectName::from(vec![ident])),
2934 }
2935 }
2936
2937 pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
2939 let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
2940 Keyword::SUBSTR => true,
2941 Keyword::SUBSTRING => false,
2942 _ => {
2943 self.prev_token();
2944 return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
2945 }
2946 };
2947 self.expect_token(&Token::LParen)?;
2948 let expr = self.parse_expr()?;
2949 let mut from_expr = None;
2950 let special = self.consume_token(&Token::Comma);
2951 if special || self.parse_keyword(Keyword::FROM) {
2952 from_expr = Some(self.parse_expr()?);
2953 }
2954
2955 let mut to_expr = None;
2956 if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
2957 to_expr = Some(self.parse_expr()?);
2958 }
2959 self.expect_token(&Token::RParen)?;
2960
2961 Ok(Expr::Substring {
2962 expr: Box::new(expr),
2963 substring_from: from_expr.map(Box::new),
2964 substring_for: to_expr.map(Box::new),
2965 special,
2966 shorthand,
2967 })
2968 }
2969
2970 pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
2974 self.expect_token(&Token::LParen)?;
2976 let expr = self.parse_expr()?;
2977 self.expect_keyword_is(Keyword::PLACING)?;
2978 let what_expr = self.parse_expr()?;
2979 self.expect_keyword_is(Keyword::FROM)?;
2980 let from_expr = self.parse_expr()?;
2981 let mut for_expr = None;
2982 if self.parse_keyword(Keyword::FOR) {
2983 for_expr = Some(self.parse_expr()?);
2984 }
2985 self.expect_token(&Token::RParen)?;
2986
2987 Ok(Expr::Overlay {
2988 expr: Box::new(expr),
2989 overlay_what: Box::new(what_expr),
2990 overlay_from: Box::new(from_expr),
2991 overlay_for: for_expr.map(Box::new),
2992 })
2993 }
2994
2995 pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
3001 self.expect_token(&Token::LParen)?;
3002 let mut trim_where = None;
3003 if let Token::Word(word) = &self.peek_token_ref().token {
3004 if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
3005 trim_where = Some(self.parse_trim_where()?);
3006 }
3007 }
3008 let expr = self.parse_expr()?;
3009 if self.parse_keyword(Keyword::FROM) {
3010 let trim_what = Box::new(expr);
3011 let expr = self.parse_expr()?;
3012 self.expect_token(&Token::RParen)?;
3013 Ok(Expr::Trim {
3014 expr: Box::new(expr),
3015 trim_where,
3016 trim_what: Some(trim_what),
3017 trim_characters: None,
3018 })
3019 } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
3020 {
3021 let characters = self.parse_comma_separated(Parser::parse_expr)?;
3022 self.expect_token(&Token::RParen)?;
3023 Ok(Expr::Trim {
3024 expr: Box::new(expr),
3025 trim_where: None,
3026 trim_what: None,
3027 trim_characters: Some(characters),
3028 })
3029 } else {
3030 self.expect_token(&Token::RParen)?;
3031 Ok(Expr::Trim {
3032 expr: Box::new(expr),
3033 trim_where,
3034 trim_what: None,
3035 trim_characters: None,
3036 })
3037 }
3038 }
3039
3040 pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3044 let next_token = self.next_token();
3045 match &next_token.token {
3046 Token::Word(w) => match w.keyword {
3047 Keyword::BOTH => Ok(TrimWhereField::Both),
3048 Keyword::LEADING => Ok(TrimWhereField::Leading),
3049 Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3050 _ => self.expected("trim_where field", next_token)?,
3051 },
3052 _ => self.expected("trim_where field", next_token),
3053 }
3054 }
3055
3056 pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3059 let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3060 self.expect_token(&Token::RBracket)?;
3061 Ok(Expr::Array(Array { elem: exprs, named }))
3062 }
3063
3064 pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3068 if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3069 if self.parse_keyword(Keyword::ERROR) {
3070 Ok(Some(ListAggOnOverflow::Error))
3071 } else {
3072 self.expect_keyword_is(Keyword::TRUNCATE)?;
3073 let filler = match &self.peek_token_ref().token {
3074 Token::Word(w)
3075 if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3076 {
3077 None
3078 }
3079 Token::SingleQuotedString(_)
3080 | Token::EscapedStringLiteral(_)
3081 | Token::UnicodeStringLiteral(_)
3082 | Token::NationalStringLiteral(_)
3083 | Token::QuoteDelimitedStringLiteral(_)
3084 | Token::NationalQuoteDelimitedStringLiteral(_)
3085 | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3086 _ => self.expected_ref(
3087 "either filler, WITH, or WITHOUT in LISTAGG",
3088 self.peek_token_ref(),
3089 )?,
3090 };
3091 let with_count = self.parse_keyword(Keyword::WITH);
3092 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3093 self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3094 }
3095 self.expect_keyword_is(Keyword::COUNT)?;
3096 Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3097 }
3098 } else {
3099 Ok(None)
3100 }
3101 }
3102
3103 pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3110 let next_token = self.next_token();
3111 match &next_token.token {
3112 Token::Word(w) => match w.keyword {
3113 Keyword::YEAR => Ok(DateTimeField::Year),
3114 Keyword::YEARS => Ok(DateTimeField::Years),
3115 Keyword::MONTH => Ok(DateTimeField::Month),
3116 Keyword::MONTHS => Ok(DateTimeField::Months),
3117 Keyword::WEEK => {
3118 let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3119 && self.consume_token(&Token::LParen)
3120 {
3121 let week_day = self.parse_identifier()?;
3122 self.expect_token(&Token::RParen)?;
3123 Some(week_day)
3124 } else {
3125 None
3126 };
3127 Ok(DateTimeField::Week(week_day))
3128 }
3129 Keyword::WEEKS => Ok(DateTimeField::Weeks),
3130 Keyword::DAY => Ok(DateTimeField::Day),
3131 Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3132 Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3133 Keyword::DAYS => Ok(DateTimeField::Days),
3134 Keyword::DATE => Ok(DateTimeField::Date),
3135 Keyword::DATETIME => Ok(DateTimeField::Datetime),
3136 Keyword::HOUR => Ok(DateTimeField::Hour),
3137 Keyword::HOURS => Ok(DateTimeField::Hours),
3138 Keyword::MINUTE => Ok(DateTimeField::Minute),
3139 Keyword::MINUTES => Ok(DateTimeField::Minutes),
3140 Keyword::SECOND => Ok(DateTimeField::Second),
3141 Keyword::SECONDS => Ok(DateTimeField::Seconds),
3142 Keyword::CENTURY => Ok(DateTimeField::Century),
3143 Keyword::DECADE => Ok(DateTimeField::Decade),
3144 Keyword::DOY => Ok(DateTimeField::Doy),
3145 Keyword::DOW => Ok(DateTimeField::Dow),
3146 Keyword::EPOCH => Ok(DateTimeField::Epoch),
3147 Keyword::ISODOW => Ok(DateTimeField::Isodow),
3148 Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3149 Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3150 Keyword::JULIAN => Ok(DateTimeField::Julian),
3151 Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3152 Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3153 Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3154 Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3155 Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3156 Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3157 Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3158 Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3159 Keyword::QUARTER => Ok(DateTimeField::Quarter),
3160 Keyword::TIME => Ok(DateTimeField::Time),
3161 Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3162 Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3163 Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3164 Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3165 Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3166 _ if self.dialect.allow_extract_custom() => {
3167 self.prev_token();
3168 let custom = self.parse_identifier()?;
3169 Ok(DateTimeField::Custom(custom))
3170 }
3171 _ => self.expected("date/time field", next_token),
3172 },
3173 Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3174 self.prev_token();
3175 let custom = self.parse_identifier()?;
3176 Ok(DateTimeField::Custom(custom))
3177 }
3178 _ => self.expected("date/time field", next_token),
3179 }
3180 }
3181
3182 pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3186 match &self.peek_token_ref().token {
3187 Token::Word(w) => match w.keyword {
3188 Keyword::EXISTS => {
3189 let negated = true;
3190 let _ = self.parse_keyword(Keyword::EXISTS);
3191 self.parse_exists_expr(negated)
3192 }
3193 _ => Ok(Expr::UnaryOp {
3194 op: UnaryOperator::Not,
3195 expr: Box::new(
3196 self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3197 ),
3198 }),
3199 },
3200 _ => Ok(Expr::UnaryOp {
3201 op: UnaryOperator::Not,
3202 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3203 }),
3204 }
3205 }
3206
3207 fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3217 let token = self.expect_token(&Token::LBrace)?;
3218
3219 if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3220 self.expect_token(&Token::RBrace)?;
3221 return Ok(fn_expr);
3222 }
3223
3224 if self.dialect.supports_dictionary_syntax() {
3225 self.prev_token(); return self.parse_dictionary();
3227 }
3228
3229 self.expected("an expression", token)
3230 }
3231
3232 pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3238 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3239
3240 self.expect_keyword_is(Keyword::AGAINST)?;
3241
3242 self.expect_token(&Token::LParen)?;
3243
3244 let match_value = self.parse_value()?;
3246
3247 let in_natural_language_mode_keywords = &[
3248 Keyword::IN,
3249 Keyword::NATURAL,
3250 Keyword::LANGUAGE,
3251 Keyword::MODE,
3252 ];
3253
3254 let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3255
3256 let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3257
3258 let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3259 if self.parse_keywords(with_query_expansion_keywords) {
3260 Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3261 } else {
3262 Some(SearchModifier::InNaturalLanguageMode)
3263 }
3264 } else if self.parse_keywords(in_boolean_mode_keywords) {
3265 Some(SearchModifier::InBooleanMode)
3266 } else if self.parse_keywords(with_query_expansion_keywords) {
3267 Some(SearchModifier::WithQueryExpansion)
3268 } else {
3269 None
3270 };
3271
3272 self.expect_token(&Token::RParen)?;
3273
3274 Ok(Expr::MatchAgainst {
3275 columns,
3276 match_value,
3277 opt_search_modifier,
3278 })
3279 }
3280
3281 pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3297 let value = if self.dialect.require_interval_qualifier() {
3306 self.parse_expr()?
3308 } else {
3309 self.parse_prefix()?
3312 };
3313
3314 let leading_field = if self.next_token_is_temporal_unit() {
3320 Some(self.parse_date_time_field()?)
3321 } else if self.dialect.require_interval_qualifier() {
3322 return parser_err!(
3323 "INTERVAL requires a unit after the literal value",
3324 self.peek_token_ref().span.start
3325 );
3326 } else {
3327 None
3328 };
3329
3330 let (leading_precision, last_field, fsec_precision) =
3331 if leading_field == Some(DateTimeField::Second) {
3332 let last_field = None;
3338 let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3339 (leading_precision, last_field, fsec_precision)
3340 } else {
3341 let leading_precision = self.parse_optional_precision()?;
3342 if self.parse_keyword(Keyword::TO) {
3343 let last_field = Some(self.parse_date_time_field()?);
3344 let fsec_precision = if last_field == Some(DateTimeField::Second) {
3345 self.parse_optional_precision()?
3346 } else {
3347 None
3348 };
3349 (leading_precision, last_field, fsec_precision)
3350 } else {
3351 (leading_precision, None, None)
3352 }
3353 };
3354
3355 Ok(Expr::Interval(Interval {
3356 value: Box::new(value),
3357 leading_field,
3358 leading_precision,
3359 last_field,
3360 fractional_seconds_precision: fsec_precision,
3361 }))
3362 }
3363
3364 pub fn next_token_is_temporal_unit(&mut self) -> bool {
3367 if let Token::Word(word) = &self.peek_token_ref().token {
3368 matches!(
3369 word.keyword,
3370 Keyword::YEAR
3371 | Keyword::YEARS
3372 | Keyword::MONTH
3373 | Keyword::MONTHS
3374 | Keyword::WEEK
3375 | Keyword::WEEKS
3376 | Keyword::DAY
3377 | Keyword::DAYS
3378 | Keyword::HOUR
3379 | Keyword::HOURS
3380 | Keyword::MINUTE
3381 | Keyword::MINUTES
3382 | Keyword::SECOND
3383 | Keyword::SECONDS
3384 | Keyword::CENTURY
3385 | Keyword::DECADE
3386 | Keyword::DOW
3387 | Keyword::DOY
3388 | Keyword::EPOCH
3389 | Keyword::ISODOW
3390 | Keyword::ISOYEAR
3391 | Keyword::JULIAN
3392 | Keyword::MICROSECOND
3393 | Keyword::MICROSECONDS
3394 | Keyword::MILLENIUM
3395 | Keyword::MILLENNIUM
3396 | Keyword::MILLISECOND
3397 | Keyword::MILLISECONDS
3398 | Keyword::NANOSECOND
3399 | Keyword::NANOSECONDS
3400 | Keyword::QUARTER
3401 | Keyword::TIMEZONE
3402 | Keyword::TIMEZONE_HOUR
3403 | Keyword::TIMEZONE_MINUTE
3404 )
3405 } else {
3406 false
3407 }
3408 }
3409
3410 fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3418 self.prev_token();
3420 let (fields, trailing_bracket) =
3421 self.parse_struct_type_def(Self::parse_struct_field_def)?;
3422 if trailing_bracket.0 {
3423 return parser_err!(
3424 "unmatched > in STRUCT literal",
3425 self.peek_token_ref().span.start
3426 );
3427 }
3428
3429 self.expect_token(&Token::LParen)?;
3431 let values = self
3432 .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3433 self.expect_token(&Token::RParen)?;
3434
3435 Ok(Expr::Struct { values, fields })
3436 }
3437
3438 fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3452 let expr = self.parse_expr()?;
3453 if self.parse_keyword(Keyword::AS) {
3454 if typed_syntax {
3455 return parser_err!("Typed syntax does not allow AS", {
3456 self.prev_token();
3457 self.peek_token_ref().span.start
3458 });
3459 }
3460 let field_name = self.parse_identifier()?;
3461 Ok(Expr::Named {
3462 expr: expr.into(),
3463 name: field_name,
3464 })
3465 } else {
3466 Ok(expr)
3467 }
3468 }
3469
3470 fn parse_struct_type_def<F>(
3483 &mut self,
3484 mut elem_parser: F,
3485 ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3486 where
3487 F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3488 {
3489 self.expect_keyword_is(Keyword::STRUCT)?;
3490
3491 if self.peek_token_ref().token != Token::Lt {
3493 return Ok((Default::default(), false.into()));
3494 }
3495 self.next_token();
3496
3497 let mut field_defs = vec![];
3498 let trailing_bracket = loop {
3499 let (def, trailing_bracket) = elem_parser(self)?;
3500 field_defs.push(def);
3501 if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3503 break trailing_bracket;
3504 }
3505 };
3506
3507 Ok((
3508 field_defs,
3509 self.expect_closing_angle_bracket(trailing_bracket)?,
3510 ))
3511 }
3512
3513 fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3515 self.expect_keyword_is(Keyword::STRUCT)?;
3516 self.expect_token(&Token::LParen)?;
3517 let struct_body = self.parse_comma_separated(|parser| {
3518 let field_name = parser.parse_identifier()?;
3519 let field_type = parser.parse_data_type()?;
3520
3521 Ok(StructField {
3522 field_name: Some(field_name),
3523 field_type,
3524 options: None,
3525 })
3526 });
3527 self.expect_token(&Token::RParen)?;
3528 struct_body
3529 }
3530
3531 fn parse_struct_field_def(
3543 &mut self,
3544 ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3545 let is_named_field = matches!(
3548 (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3549 (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3550 );
3551
3552 let field_name = if is_named_field {
3553 let name = self.parse_identifier()?;
3554 let _ = self.consume_token(&Token::Colon);
3555 Some(name)
3556 } else {
3557 None
3558 };
3559
3560 let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3561
3562 let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3563 Ok((
3564 StructField {
3565 field_name,
3566 field_type,
3567 options,
3568 },
3569 trailing_bracket,
3570 ))
3571 }
3572
3573 fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3583 self.expect_keyword_is(Keyword::UNION)?;
3584
3585 self.expect_token(&Token::LParen)?;
3586
3587 let fields = self.parse_comma_separated(|p| {
3588 Ok(UnionField {
3589 field_name: p.parse_identifier()?,
3590 field_type: p.parse_data_type()?,
3591 })
3592 })?;
3593
3594 self.expect_token(&Token::RParen)?;
3595
3596 Ok(fields)
3597 }
3598
3599 fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3610 self.expect_token(&Token::LBrace)?;
3611
3612 let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3613
3614 self.expect_token(&Token::RBrace)?;
3615
3616 Ok(Expr::Dictionary(fields))
3617 }
3618
3619 fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3630 let key = self.parse_identifier()?;
3631
3632 self.expect_token(&Token::Colon)?;
3633
3634 let expr = self.parse_expr()?;
3635
3636 Ok(DictionaryField {
3637 key,
3638 value: Box::new(expr),
3639 })
3640 }
3641
3642 fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3652 self.expect_token(&Token::LBrace)?;
3653 let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3654 self.expect_token(&Token::RBrace)?;
3655 Ok(Expr::Map(Map { entries: fields }))
3656 }
3657
3658 fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3668 let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3670
3671 self.expect_token(&Token::Colon)?;
3672
3673 let value = self.parse_expr()?;
3674
3675 Ok(MapEntry {
3676 key: Box::new(key),
3677 value: Box::new(value),
3678 })
3679 }
3680
3681 fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3691 self.expect_keyword_is(Keyword::MAP)?;
3692 self.expect_token(&Token::LParen)?;
3693 let key_data_type = self.parse_data_type()?;
3694 self.expect_token(&Token::Comma)?;
3695 let value_data_type = self.parse_data_type()?;
3696 self.expect_token(&Token::RParen)?;
3697
3698 Ok((key_data_type, value_data_type))
3699 }
3700
3701 fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3711 self.expect_keyword_is(Keyword::TUPLE)?;
3712 self.expect_token(&Token::LParen)?;
3713 let mut field_defs = vec![];
3714 loop {
3715 let (def, _) = self.parse_struct_field_def()?;
3716 field_defs.push(def);
3717 if !self.consume_token(&Token::Comma) {
3718 break;
3719 }
3720 }
3721 self.expect_token(&Token::RParen)?;
3722
3723 Ok(field_defs)
3724 }
3725
3726 fn expect_closing_angle_bracket(
3731 &mut self,
3732 trailing_bracket: MatchedTrailingBracket,
3733 ) -> Result<MatchedTrailingBracket, ParserError> {
3734 let trailing_bracket = if !trailing_bracket.0 {
3735 match &self.peek_token_ref().token {
3736 Token::Gt => {
3737 self.next_token();
3738 false.into()
3739 }
3740 Token::ShiftRight => {
3741 self.next_token();
3742 true.into()
3743 }
3744 _ => return self.expected_ref(">", self.peek_token_ref()),
3745 }
3746 } else {
3747 false.into()
3748 };
3749
3750 Ok(trailing_bracket)
3751 }
3752
3753 pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3755 if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3757 return infix;
3758 }
3759
3760 let dialect = self.dialect;
3761
3762 self.advance_token();
3763 let tok = self.get_current_token();
3764 debug!("infix: {tok:?}");
3765 let tok_index = self.get_current_index();
3766 let span = tok.span;
3767 let regular_binary_operator = match &tok.token {
3768 Token::Spaceship => Some(BinaryOperator::Spaceship),
3769 Token::DoubleEq => Some(BinaryOperator::Eq),
3770 Token::Assignment => Some(BinaryOperator::Assignment),
3771 Token::Eq => Some(BinaryOperator::Eq),
3772 Token::Neq => Some(BinaryOperator::NotEq),
3773 Token::Gt => Some(BinaryOperator::Gt),
3774 Token::GtEq => Some(BinaryOperator::GtEq),
3775 Token::Lt => Some(BinaryOperator::Lt),
3776 Token::LtEq => Some(BinaryOperator::LtEq),
3777 Token::Plus => Some(BinaryOperator::Plus),
3778 Token::Minus => Some(BinaryOperator::Minus),
3779 Token::Mul => Some(BinaryOperator::Multiply),
3780 Token::Mod => Some(BinaryOperator::Modulo),
3781 Token::StringConcat => Some(BinaryOperator::StringConcat),
3782 Token::Pipe => Some(BinaryOperator::BitwiseOr),
3783 Token::Caret => {
3784 if dialect_is!(dialect is PostgreSqlDialect) {
3787 Some(BinaryOperator::PGExp)
3788 } else {
3789 Some(BinaryOperator::BitwiseXor)
3790 }
3791 }
3792 Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3793 Token::Div => Some(BinaryOperator::Divide),
3794 Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3795 Some(BinaryOperator::DuckIntegerDivide)
3796 }
3797 Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3798 Some(BinaryOperator::PGBitwiseShiftLeft)
3799 }
3800 Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3801 Some(BinaryOperator::PGBitwiseShiftRight)
3802 }
3803 Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3804 Some(BinaryOperator::PGBitwiseXor)
3805 }
3806 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3807 Some(BinaryOperator::PGOverlap)
3808 }
3809 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3810 Some(BinaryOperator::PGOverlap)
3811 }
3812 Token::Overlap if dialect.supports_double_ampersand_operator() => {
3813 Some(BinaryOperator::And)
3814 }
3815 Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3816 Some(BinaryOperator::PGStartsWith)
3817 }
3818 Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3819 Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3820 Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3821 Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3822 Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3823 Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3824 Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3825 Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3826 Token::Arrow => Some(BinaryOperator::Arrow),
3827 Token::LongArrow => Some(BinaryOperator::LongArrow),
3828 Token::HashArrow => Some(BinaryOperator::HashArrow),
3829 Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3830 Token::AtArrow => Some(BinaryOperator::AtArrow),
3831 Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3832 Token::HashMinus => Some(BinaryOperator::HashMinus),
3833 Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3834 Token::AtAt => Some(BinaryOperator::AtAt),
3835 Token::Question => Some(BinaryOperator::Question),
3836 Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3837 Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3838 Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3839 Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3840 Some(BinaryOperator::DoubleHash)
3841 }
3842
3843 Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3844 Some(BinaryOperator::AndLt)
3845 }
3846 Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3847 Some(BinaryOperator::AndGt)
3848 }
3849 Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3850 Some(BinaryOperator::QuestionDash)
3851 }
3852 Token::AmpersandLeftAngleBracketVerticalBar
3853 if self.dialect.supports_geometric_types() =>
3854 {
3855 Some(BinaryOperator::AndLtPipe)
3856 }
3857 Token::VerticalBarAmpersandRightAngleBracket
3858 if self.dialect.supports_geometric_types() =>
3859 {
3860 Some(BinaryOperator::PipeAndGt)
3861 }
3862 Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3863 Some(BinaryOperator::LtDashGt)
3864 }
3865 Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3866 Some(BinaryOperator::LtCaret)
3867 }
3868 Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3869 Some(BinaryOperator::GtCaret)
3870 }
3871 Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3872 Some(BinaryOperator::QuestionHash)
3873 }
3874 Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3875 Some(BinaryOperator::QuestionDoublePipe)
3876 }
3877 Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3878 Some(BinaryOperator::QuestionDashPipe)
3879 }
3880 Token::TildeEqual if self.dialect.supports_geometric_types() => {
3881 Some(BinaryOperator::TildeEq)
3882 }
3883 Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3884 Some(BinaryOperator::LtLtPipe)
3885 }
3886 Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3887 Some(BinaryOperator::PipeGtGt)
3888 }
3889 Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3890
3891 Token::Word(w) => match w.keyword {
3892 Keyword::AND => Some(BinaryOperator::And),
3893 Keyword::OR => Some(BinaryOperator::Or),
3894 Keyword::XOR => Some(BinaryOperator::Xor),
3895 Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3896 Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3897 self.expect_token(&Token::LParen)?;
3898 let mut idents = vec![];
3903 loop {
3904 self.advance_token();
3905 idents.push(self.get_current_token().to_string());
3906 if !self.consume_token(&Token::Period) {
3907 break;
3908 }
3909 }
3910 self.expect_token(&Token::RParen)?;
3911 Some(BinaryOperator::PGCustomBinaryOperator(idents))
3912 }
3913 _ => None,
3914 },
3915 _ => None,
3916 };
3917
3918 let tok = self.token_at(tok_index);
3919 if let Some(op) = regular_binary_operator {
3920 if let Some(keyword) =
3921 self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
3922 {
3923 self.expect_token(&Token::LParen)?;
3924 let right = if self.peek_sub_query() {
3925 self.prev_token(); self.parse_subexpr(precedence)?
3929 } else {
3930 let right = self.parse_subexpr(precedence)?;
3932 self.expect_token(&Token::RParen)?;
3933 right
3934 };
3935
3936 if !matches!(
3937 op,
3938 BinaryOperator::Gt
3939 | BinaryOperator::Lt
3940 | BinaryOperator::GtEq
3941 | BinaryOperator::LtEq
3942 | BinaryOperator::Eq
3943 | BinaryOperator::NotEq
3944 | BinaryOperator::PGRegexMatch
3945 | BinaryOperator::PGRegexIMatch
3946 | BinaryOperator::PGRegexNotMatch
3947 | BinaryOperator::PGRegexNotIMatch
3948 | BinaryOperator::PGLikeMatch
3949 | BinaryOperator::PGILikeMatch
3950 | BinaryOperator::PGNotLikeMatch
3951 | BinaryOperator::PGNotILikeMatch
3952 ) {
3953 return parser_err!(
3954 format!(
3955 "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
3956 ),
3957 span.start
3958 );
3959 };
3960
3961 Ok(match keyword {
3962 Keyword::ALL => Expr::AllOp {
3963 left: Box::new(expr),
3964 compare_op: op,
3965 right: Box::new(right),
3966 },
3967 Keyword::ANY | Keyword::SOME => Expr::AnyOp {
3968 left: Box::new(expr),
3969 compare_op: op,
3970 right: Box::new(right),
3971 is_some: keyword == Keyword::SOME,
3972 },
3973 unexpected_keyword => return Err(ParserError::ParserError(
3974 format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
3975 )),
3976 })
3977 } else {
3978 Ok(Expr::BinaryOp {
3979 left: Box::new(expr),
3980 op,
3981 right: Box::new(self.parse_subexpr(precedence)?),
3982 })
3983 }
3984 } else if let Token::Word(w) = &tok.token {
3985 match w.keyword {
3986 Keyword::IS => {
3987 if self.parse_keyword(Keyword::NULL) {
3988 Ok(Expr::IsNull(Box::new(expr)))
3989 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
3990 Ok(Expr::IsNotNull(Box::new(expr)))
3991 } else if self.parse_keywords(&[Keyword::TRUE]) {
3992 Ok(Expr::IsTrue(Box::new(expr)))
3993 } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
3994 Ok(Expr::IsNotTrue(Box::new(expr)))
3995 } else if self.parse_keywords(&[Keyword::FALSE]) {
3996 Ok(Expr::IsFalse(Box::new(expr)))
3997 } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
3998 Ok(Expr::IsNotFalse(Box::new(expr)))
3999 } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
4000 Ok(Expr::IsUnknown(Box::new(expr)))
4001 } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
4002 Ok(Expr::IsNotUnknown(Box::new(expr)))
4003 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
4004 let expr2 = self.parse_expr()?;
4005 Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
4006 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
4007 {
4008 let expr2 = self.parse_expr()?;
4009 Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
4010 } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
4011 Ok(is_normalized)
4012 } else {
4013 self.expected_ref(
4014 "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS",
4015 self.peek_token_ref(),
4016 )
4017 }
4018 }
4019 Keyword::AT => {
4020 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4021 Ok(Expr::AtTimeZone {
4022 timestamp: Box::new(expr),
4023 time_zone: Box::new(self.parse_subexpr(precedence)?),
4024 })
4025 }
4026 Keyword::NOT
4027 | Keyword::IN
4028 | Keyword::BETWEEN
4029 | Keyword::LIKE
4030 | Keyword::ILIKE
4031 | Keyword::SIMILAR
4032 | Keyword::REGEXP
4033 | Keyword::RLIKE => {
4034 self.prev_token();
4035 let negated = self.parse_keyword(Keyword::NOT);
4036 let regexp = self.parse_keyword(Keyword::REGEXP);
4037 let rlike = self.parse_keyword(Keyword::RLIKE);
4038 let null = if !self.in_column_definition_state() {
4039 self.parse_keyword(Keyword::NULL)
4040 } else {
4041 false
4042 };
4043 if regexp || rlike {
4044 Ok(Expr::RLike {
4045 negated,
4046 expr: Box::new(expr),
4047 pattern: Box::new(
4048 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4049 ),
4050 regexp,
4051 })
4052 } else if negated && null {
4053 Ok(Expr::IsNotNull(Box::new(expr)))
4054 } else if self.parse_keyword(Keyword::IN) {
4055 self.parse_in(expr, negated)
4056 } else if self.parse_keyword(Keyword::BETWEEN) {
4057 self.parse_between(expr, negated)
4058 } else if self.parse_keyword(Keyword::LIKE) {
4059 Ok(Expr::Like {
4060 negated,
4061 any: self.parse_keyword(Keyword::ANY),
4062 expr: Box::new(expr),
4063 pattern: Box::new(
4064 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4065 ),
4066 escape_char: self.parse_escape_char()?,
4067 })
4068 } else if self.parse_keyword(Keyword::ILIKE) {
4069 Ok(Expr::ILike {
4070 negated,
4071 any: self.parse_keyword(Keyword::ANY),
4072 expr: Box::new(expr),
4073 pattern: Box::new(
4074 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4075 ),
4076 escape_char: self.parse_escape_char()?,
4077 })
4078 } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4079 Ok(Expr::SimilarTo {
4080 negated,
4081 expr: Box::new(expr),
4082 pattern: Box::new(
4083 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4084 ),
4085 escape_char: self.parse_escape_char()?,
4086 })
4087 } else {
4088 self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4089 }
4090 }
4091 Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4092 Ok(Expr::IsNotNull(Box::new(expr)))
4093 }
4094 Keyword::MEMBER => {
4095 if self.parse_keyword(Keyword::OF) {
4096 self.expect_token(&Token::LParen)?;
4097 let array = self.parse_expr()?;
4098 self.expect_token(&Token::RParen)?;
4099 Ok(Expr::MemberOf(MemberOf {
4100 value: Box::new(expr),
4101 array: Box::new(array),
4102 }))
4103 } else {
4104 self.expected_ref("OF after MEMBER", self.peek_token_ref())
4105 }
4106 }
4107 _ => parser_err!(
4109 format!("No infix parser for token {:?}", tok.token),
4110 tok.span.start
4111 ),
4112 }
4113 } else if Token::DoubleColon == *tok {
4114 Ok(Expr::Cast {
4115 kind: CastKind::DoubleColon,
4116 expr: Box::new(expr),
4117 data_type: self.parse_data_type()?,
4118 array: false,
4119 format: None,
4120 })
4121 } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4122 Ok(Expr::UnaryOp {
4123 op: UnaryOperator::PGPostfixFactorial,
4124 expr: Box::new(expr),
4125 })
4126 } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4127 || (Token::Colon == *tok)
4128 {
4129 self.prev_token();
4130 self.parse_json_access(expr)
4131 } else {
4132 parser_err!(
4134 format!("No infix parser for token {:?}", tok.token),
4135 tok.span.start
4136 )
4137 }
4138 }
4139
4140 pub fn parse_escape_char(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
4142 if self.parse_keyword(Keyword::ESCAPE) {
4143 Ok(Some(self.parse_value()?))
4144 } else {
4145 Ok(None)
4146 }
4147 }
4148
4149 fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4159 let lower_bound = if self.consume_token(&Token::Colon) {
4161 None
4162 } else {
4163 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4165 };
4166
4167 if self.consume_token(&Token::RBracket) {
4169 if let Some(lower_bound) = lower_bound {
4170 return Ok(Subscript::Index { index: lower_bound });
4171 };
4172 return Ok(Subscript::Slice {
4173 lower_bound,
4174 upper_bound: None,
4175 stride: None,
4176 });
4177 }
4178
4179 if lower_bound.is_some() {
4181 self.expect_token(&Token::Colon)?;
4182 }
4183
4184 let upper_bound = if self.consume_token(&Token::RBracket) {
4186 return Ok(Subscript::Slice {
4187 lower_bound,
4188 upper_bound: None,
4189 stride: None,
4190 });
4191 } else {
4192 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4194 };
4195
4196 if self.consume_token(&Token::RBracket) {
4198 return Ok(Subscript::Slice {
4199 lower_bound,
4200 upper_bound,
4201 stride: None,
4202 });
4203 }
4204
4205 self.expect_token(&Token::Colon)?;
4207 let stride = if self.consume_token(&Token::RBracket) {
4208 None
4209 } else {
4210 Some(self.parse_expr()?)
4211 };
4212
4213 if stride.is_some() {
4214 self.expect_token(&Token::RBracket)?;
4215 }
4216
4217 Ok(Subscript::Slice {
4218 lower_bound,
4219 upper_bound,
4220 stride,
4221 })
4222 }
4223
4224 pub fn parse_multi_dim_subscript(
4226 &mut self,
4227 chain: &mut Vec<AccessExpr>,
4228 ) -> Result<(), ParserError> {
4229 while self.consume_token(&Token::LBracket) {
4230 self.parse_subscript(chain)?;
4231 }
4232 Ok(())
4233 }
4234
4235 fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4239 let subscript = self.parse_subscript_inner()?;
4240 chain.push(AccessExpr::Subscript(subscript));
4241 Ok(())
4242 }
4243
4244 fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4245 let token = self.next_token();
4246 match token.token {
4247 Token::Word(Word {
4248 value,
4249 quote_style: quote_style @ (Some('"') | Some('`') | None),
4252 keyword: _,
4255 }) => Ok(JsonPathElem::Dot {
4256 key: value,
4257 quoted: quote_style.is_some(),
4258 }),
4259
4260 Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4264
4265 _ => self.expected("variant object key name", token),
4266 }
4267 }
4268
4269 fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4270 let path = self.parse_json_path()?;
4271 Ok(Expr::JsonAccess {
4272 value: Box::new(expr),
4273 path,
4274 })
4275 }
4276
4277 fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4278 let mut path = Vec::new();
4279 loop {
4280 match self.next_token().token {
4281 Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4282 self.next_token();
4283 let key = self.parse_wildcard_expr()?;
4284 self.expect_token(&Token::RBracket)?;
4285 path.push(JsonPathElem::ColonBracket { key });
4286 }
4287 Token::Colon if path.is_empty() => {
4288 path.push(self.parse_json_path_object_key()?);
4289 }
4290 Token::Period if !path.is_empty() => {
4291 path.push(self.parse_json_path_object_key()?);
4292 }
4293 Token::LBracket => {
4294 let key = self.parse_wildcard_expr()?;
4295 self.expect_token(&Token::RBracket)?;
4296
4297 path.push(JsonPathElem::Bracket { key });
4298 }
4299 _ => {
4300 self.prev_token();
4301 break;
4302 }
4303 };
4304 }
4305
4306 debug_assert!(!path.is_empty());
4307 Ok(JsonPath { path })
4308 }
4309
4310 pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4312 if self.parse_keyword(Keyword::UNNEST) {
4315 self.expect_token(&Token::LParen)?;
4316 let array_expr = self.parse_expr()?;
4317 self.expect_token(&Token::RParen)?;
4318 return Ok(Expr::InUnnest {
4319 expr: Box::new(expr),
4320 array_expr: Box::new(array_expr),
4321 negated,
4322 });
4323 }
4324 self.expect_token(&Token::LParen)?;
4325 let in_op = match self.maybe_parse(|p| p.parse_query())? {
4326 Some(subquery) => Expr::InSubquery {
4327 expr: Box::new(expr),
4328 subquery,
4329 negated,
4330 },
4331 None => Expr::InList {
4332 expr: Box::new(expr),
4333 list: if self.dialect.supports_in_empty_list() {
4334 self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4335 } else {
4336 self.parse_comma_separated(Parser::parse_expr)?
4337 },
4338 negated,
4339 },
4340 };
4341 self.expect_token(&Token::RParen)?;
4342 Ok(in_op)
4343 }
4344
4345 pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4347 let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4350 self.expect_keyword_is(Keyword::AND)?;
4351 let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4352 Ok(Expr::Between {
4353 expr: Box::new(expr),
4354 negated,
4355 low: Box::new(low),
4356 high: Box::new(high),
4357 })
4358 }
4359
4360 pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4362 Ok(Expr::Cast {
4363 kind: CastKind::DoubleColon,
4364 expr: Box::new(expr),
4365 data_type: self.parse_data_type()?,
4366 array: false,
4367 format: None,
4368 })
4369 }
4370
4371 pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4373 self.dialect.get_next_precedence_default(self)
4374 }
4375
4376 pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4379 self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4380 }
4381
4382 pub fn peek_token(&self) -> TokenWithSpan {
4387 self.peek_nth_token(0)
4388 }
4389
4390 pub fn peek_token_ref(&self) -> &TokenWithSpan {
4393 self.peek_nth_token_ref(0)
4394 }
4395
4396 pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4419 self.peek_tokens_with_location()
4420 .map(|with_loc| with_loc.token)
4421 }
4422
4423 pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4428 let mut index = self.index;
4429 core::array::from_fn(|_| loop {
4430 let token = self.tokens.get(index);
4431 index += 1;
4432 if let Some(TokenWithSpan {
4433 token: Token::Whitespace(_),
4434 span: _,
4435 }) = token
4436 {
4437 continue;
4438 }
4439 break token.cloned().unwrap_or(TokenWithSpan {
4440 token: Token::EOF,
4441 span: Span::empty(),
4442 });
4443 })
4444 }
4445
4446 pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4451 let mut index = self.index;
4452 core::array::from_fn(|_| loop {
4453 let token = self.tokens.get(index);
4454 index += 1;
4455 if let Some(TokenWithSpan {
4456 token: Token::Whitespace(_),
4457 span: _,
4458 }) = token
4459 {
4460 continue;
4461 }
4462 break token.unwrap_or(&EOF_TOKEN);
4463 })
4464 }
4465
4466 pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4468 self.peek_nth_token_ref(n).clone()
4469 }
4470
4471 pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4473 let mut index = self.index;
4474 loop {
4475 index += 1;
4476 match self.tokens.get(index - 1) {
4477 Some(TokenWithSpan {
4478 token: Token::Whitespace(_),
4479 span: _,
4480 }) => continue,
4481 non_whitespace => {
4482 if n == 0 {
4483 return non_whitespace.unwrap_or(&EOF_TOKEN);
4484 }
4485 n -= 1;
4486 }
4487 }
4488 }
4489 }
4490
4491 pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4494 self.peek_nth_token_no_skip(0)
4495 }
4496
4497 pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4499 self.tokens
4500 .get(self.index + n)
4501 .cloned()
4502 .unwrap_or(TokenWithSpan {
4503 token: Token::EOF,
4504 span: Span::empty(),
4505 })
4506 }
4507
4508 fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4510 self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4511 }
4512
4513 fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4517 let index = self.index;
4518 let matched = self.parse_keywords(expected);
4519 self.index = index;
4520 matched
4521 }
4522
4523 pub fn next_token(&mut self) -> TokenWithSpan {
4528 self.advance_token();
4529 self.get_current_token().clone()
4530 }
4531
4532 pub fn get_current_index(&self) -> usize {
4537 self.index.saturating_sub(1)
4538 }
4539
4540 pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4542 self.index += 1;
4543 self.tokens.get(self.index - 1)
4544 }
4545
4546 pub fn advance_token(&mut self) {
4550 loop {
4551 self.index += 1;
4552 match self.tokens.get(self.index - 1) {
4553 Some(TokenWithSpan {
4554 token: Token::Whitespace(_),
4555 span: _,
4556 }) => continue,
4557 _ => break,
4558 }
4559 }
4560 }
4561
4562 pub fn get_current_token(&self) -> &TokenWithSpan {
4566 self.token_at(self.index.saturating_sub(1))
4567 }
4568
4569 pub fn get_previous_token(&self) -> &TokenWithSpan {
4573 self.token_at(self.index.saturating_sub(2))
4574 }
4575
4576 pub fn get_next_token(&self) -> &TokenWithSpan {
4580 self.token_at(self.index)
4581 }
4582
4583 pub fn prev_token(&mut self) {
4590 loop {
4591 assert!(self.index > 0);
4592 self.index -= 1;
4593 if let Some(TokenWithSpan {
4594 token: Token::Whitespace(_),
4595 span: _,
4596 }) = self.tokens.get(self.index)
4597 {
4598 continue;
4599 }
4600 return;
4601 }
4602 }
4603
4604 pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4606 parser_err!(
4607 format!("Expected: {expected}, found: {found}"),
4608 found.span.start
4609 )
4610 }
4611
4612 pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4614 parser_err!(
4615 format!("Expected: {expected}, found: {found}"),
4616 found.span.start
4617 )
4618 }
4619
4620 pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4622 let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4623 parser_err!(
4624 format!("Expected: {expected}, found: {found}"),
4625 found.span.start
4626 )
4627 }
4628
4629 #[must_use]
4632 pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4633 if self.peek_keyword(expected) {
4634 self.advance_token();
4635 true
4636 } else {
4637 false
4638 }
4639 }
4640
4641 #[must_use]
4642 pub fn peek_keyword(&self, expected: Keyword) -> bool {
4646 matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4647 }
4648
4649 pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4657 self.keyword_with_tokens(expected, tokens, true)
4658 }
4659
4660 pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4665 self.keyword_with_tokens(expected, tokens, false)
4666 }
4667
4668 fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4669 match &self.peek_token_ref().token {
4670 Token::Word(w) if expected == w.keyword => {
4671 for (idx, token) in tokens.iter().enumerate() {
4672 if self.peek_nth_token_ref(idx + 1).token != *token {
4673 return false;
4674 }
4675 }
4676
4677 if consume {
4678 for _ in 0..(tokens.len() + 1) {
4679 self.advance_token();
4680 }
4681 }
4682
4683 true
4684 }
4685 _ => false,
4686 }
4687 }
4688
4689 #[must_use]
4693 pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4694 self.parse_keywords_indexed(keywords).is_some()
4695 }
4696
4697 #[must_use]
4700 fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4701 let start_index = self.index;
4702 let mut first_keyword_index = None;
4703 for &keyword in keywords {
4704 if !self.parse_keyword(keyword) {
4705 self.index = start_index;
4706 return None;
4707 }
4708 if first_keyword_index.is_none() {
4709 first_keyword_index = Some(self.index.saturating_sub(1));
4710 }
4711 }
4712 first_keyword_index
4713 }
4714
4715 #[must_use]
4718 pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4719 for keyword in keywords {
4720 if self.peek_keyword(*keyword) {
4721 return Some(*keyword);
4722 }
4723 }
4724 None
4725 }
4726
4727 #[must_use]
4731 pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4732 match &self.peek_token_ref().token {
4733 Token::Word(w) => {
4734 keywords
4735 .iter()
4736 .find(|keyword| **keyword == w.keyword)
4737 .map(|keyword| {
4738 self.advance_token();
4739 *keyword
4740 })
4741 }
4742 _ => None,
4743 }
4744 }
4745
4746 pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4749 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4750 Ok(keyword)
4751 } else {
4752 let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4753 self.expected_ref(
4754 &format!("one of {}", keywords.join(" or ")),
4755 self.peek_token_ref(),
4756 )
4757 }
4758 }
4759
4760 pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4765 if self.parse_keyword(expected) {
4766 Ok(self.get_current_token().clone())
4767 } else {
4768 self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4769 }
4770 }
4771
4772 pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4778 if self.parse_keyword(expected) {
4779 Ok(())
4780 } else {
4781 self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4782 }
4783 }
4784
4785 pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4788 for &kw in expected {
4789 self.expect_keyword_is(kw)?;
4790 }
4791 Ok(())
4792 }
4793
4794 #[must_use]
4798 pub fn consume_token(&mut self, expected: &Token) -> bool {
4799 if self.peek_token_ref() == expected {
4800 self.advance_token();
4801 true
4802 } else {
4803 false
4804 }
4805 }
4806
4807 #[must_use]
4811 pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4812 let index = self.index;
4813 for token in tokens {
4814 if !self.consume_token(token) {
4815 self.index = index;
4816 return false;
4817 }
4818 }
4819 true
4820 }
4821
4822 pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4824 if self.peek_token_ref() == expected {
4825 Ok(self.next_token())
4826 } else {
4827 self.expected_ref(&expected.to_string(), self.peek_token_ref())
4828 }
4829 }
4830
4831 fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4832 where
4833 <T as FromStr>::Err: Display,
4834 {
4835 s.parse::<T>().map_err(|e| {
4836 ParserError::ParserError(format!(
4837 "Could not parse '{s}' as {}: {e}{loc}",
4838 core::any::type_name::<T>()
4839 ))
4840 })
4841 }
4842
4843 pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4845 let trailing_commas =
4851 self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4852
4853 self.parse_comma_separated_with_trailing_commas(
4854 |p| p.parse_select_item(),
4855 trailing_commas,
4856 Self::is_reserved_for_column_alias,
4857 )
4858 }
4859
4860 pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4862 let mut values = vec![];
4863 loop {
4864 values.push(self.parse_grant_permission()?);
4865 if !self.consume_token(&Token::Comma) {
4866 break;
4867 } else if self.options.trailing_commas {
4868 match &self.peek_token_ref().token {
4869 Token::Word(kw) if kw.keyword == Keyword::ON => {
4870 break;
4871 }
4872 Token::RParen
4873 | Token::SemiColon
4874 | Token::EOF
4875 | Token::RBracket
4876 | Token::RBrace => break,
4877 _ => continue,
4878 }
4879 }
4880 }
4881 Ok(values)
4882 }
4883
4884 fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4886 let trailing_commas = self.dialect.supports_from_trailing_commas();
4887
4888 self.parse_comma_separated_with_trailing_commas(
4889 Parser::parse_table_and_joins,
4890 trailing_commas,
4891 |kw, parser| !self.dialect.is_table_factor(kw, parser),
4892 )
4893 }
4894
4895 fn is_parse_comma_separated_end_with_trailing_commas<R>(
4902 &mut self,
4903 trailing_commas: bool,
4904 is_reserved_keyword: &R,
4905 ) -> bool
4906 where
4907 R: Fn(&Keyword, &mut Parser) -> bool,
4908 {
4909 if !self.consume_token(&Token::Comma) {
4910 true
4911 } else if trailing_commas {
4912 let token = self.next_token().token;
4913 let is_end = match token {
4914 Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
4915 Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
4916 true
4917 }
4918 _ => false,
4919 };
4920 self.prev_token();
4921
4922 is_end
4923 } else {
4924 false
4925 }
4926 }
4927
4928 fn is_parse_comma_separated_end(&mut self) -> bool {
4931 self.is_parse_comma_separated_end_with_trailing_commas(
4932 self.options.trailing_commas,
4933 &Self::is_reserved_for_column_alias,
4934 )
4935 }
4936
4937 pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
4939 where
4940 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4941 {
4942 self.parse_comma_separated_with_trailing_commas(
4943 f,
4944 self.options.trailing_commas,
4945 Self::is_reserved_for_column_alias,
4946 )
4947 }
4948
4949 fn parse_comma_separated_with_trailing_commas<T, F, R>(
4954 &mut self,
4955 mut f: F,
4956 trailing_commas: bool,
4957 is_reserved_keyword: R,
4958 ) -> Result<Vec<T>, ParserError>
4959 where
4960 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4961 R: Fn(&Keyword, &mut Parser) -> bool,
4962 {
4963 let mut values = vec![];
4964 loop {
4965 values.push(f(self)?);
4966 if self.is_parse_comma_separated_end_with_trailing_commas(
4967 trailing_commas,
4968 &is_reserved_keyword,
4969 ) {
4970 break;
4971 }
4972 }
4973 Ok(values)
4974 }
4975
4976 fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
4978 where
4979 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4980 {
4981 let mut values = vec![];
4982 loop {
4983 values.push(f(self)?);
4984 if !self.consume_token(&Token::Period) {
4985 break;
4986 }
4987 }
4988 Ok(values)
4989 }
4990
4991 pub fn parse_keyword_separated<T, F>(
4993 &mut self,
4994 keyword: Keyword,
4995 mut f: F,
4996 ) -> Result<Vec<T>, ParserError>
4997 where
4998 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4999 {
5000 let mut values = vec![];
5001 loop {
5002 values.push(f(self)?);
5003 if !self.parse_keyword(keyword) {
5004 break;
5005 }
5006 }
5007 Ok(values)
5008 }
5009
5010 pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5012 where
5013 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5014 {
5015 self.expect_token(&Token::LParen)?;
5016 let res = f(self)?;
5017 self.expect_token(&Token::RParen)?;
5018 Ok(res)
5019 }
5020
5021 pub fn parse_comma_separated0<T, F>(
5024 &mut self,
5025 f: F,
5026 end_token: Token,
5027 ) -> Result<Vec<T>, ParserError>
5028 where
5029 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5030 {
5031 if self.peek_token_ref().token == end_token {
5032 return Ok(vec![]);
5033 }
5034
5035 if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5036 let _ = self.consume_token(&Token::Comma);
5037 return Ok(vec![]);
5038 }
5039
5040 self.parse_comma_separated(f)
5041 }
5042
5043 pub(crate) fn parse_statement_list(
5047 &mut self,
5048 terminal_keywords: &[Keyword],
5049 ) -> Result<Vec<Statement>, ParserError> {
5050 let mut values = vec![];
5051 loop {
5052 match &self.peek_nth_token_ref(0).token {
5053 Token::EOF => break,
5054 Token::Word(w)
5055 if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5056 {
5057 break;
5058 }
5059 _ => {}
5060 }
5061
5062 values.push(self.parse_statement()?);
5063 self.expect_token(&Token::SemiColon)?;
5064 }
5065 Ok(values)
5066 }
5067
5068 fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5072 !parser.dialect.is_column_alias(kw, parser)
5073 }
5074
5075 pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5079 where
5080 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5081 {
5082 match self.try_parse(f) {
5083 Ok(t) => Ok(Some(t)),
5084 Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5085 _ => Ok(None),
5086 }
5087 }
5088
5089 pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5091 where
5092 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5093 {
5094 let index = self.index;
5095 match f(self) {
5096 Ok(t) => Ok(t),
5097 Err(e) => {
5098 self.index = index;
5100 Err(e)
5101 }
5102 }
5103 }
5104
5105 pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5108 let loc = self.peek_token_ref().span.start;
5109 let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5110 Some(Keyword::ALL) => {
5111 if self.peek_keyword(Keyword::DISTINCT) {
5112 return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5113 }
5114 Some(Distinct::All)
5115 }
5116 Some(Keyword::DISTINCT) => {
5117 if self.peek_keyword(Keyword::ALL) {
5118 return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5119 }
5120 Some(Distinct::Distinct)
5121 }
5122 None => return Ok(None),
5123 _ => return parser_err!("ALL or DISTINCT", loc),
5124 };
5125
5126 let Some(Distinct::Distinct) = distinct else {
5127 return Ok(distinct);
5128 };
5129 if !self.parse_keyword(Keyword::ON) {
5130 return Ok(Some(Distinct::Distinct));
5131 }
5132
5133 self.expect_token(&Token::LParen)?;
5134 let col_names = if self.consume_token(&Token::RParen) {
5135 self.prev_token();
5136 Vec::new()
5137 } else {
5138 self.parse_comma_separated(Parser::parse_expr)?
5139 };
5140 self.expect_token(&Token::RParen)?;
5141 Ok(Some(Distinct::On(col_names)))
5142 }
5143
5144 pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5146 let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5147 let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5148 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5149 let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5150 let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5151 let global: Option<bool> = if global {
5152 Some(true)
5153 } else if local {
5154 Some(false)
5155 } else {
5156 None
5157 };
5158 let temporary = self
5159 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5160 .is_some();
5161 let persistent = dialect_of!(self is DuckDbDialect)
5162 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5163 let create_view_params = self.parse_create_view_params()?;
5164 if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5165 self.parse_create_snapshot_table().map(Into::into)
5166 } else if self.parse_keyword(Keyword::TABLE) {
5167 self.parse_create_table(or_replace, temporary, global, transient)
5168 .map(Into::into)
5169 } else if self.peek_keyword(Keyword::MATERIALIZED)
5170 || self.peek_keyword(Keyword::VIEW)
5171 || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5172 || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5173 {
5174 self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5175 .map(Into::into)
5176 } else if self.parse_keyword(Keyword::POLICY) {
5177 self.parse_create_policy().map(Into::into)
5178 } else if self.parse_keyword(Keyword::EXTERNAL) {
5179 self.parse_create_external_table(or_replace).map(Into::into)
5180 } else if self.parse_keyword(Keyword::FUNCTION) {
5181 self.parse_create_function(or_alter, or_replace, temporary)
5182 } else if self.parse_keyword(Keyword::DOMAIN) {
5183 self.parse_create_domain().map(Into::into)
5184 } else if self.parse_keyword(Keyword::TRIGGER) {
5185 self.parse_create_trigger(temporary, or_alter, or_replace, false)
5186 .map(Into::into)
5187 } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5188 self.parse_create_trigger(temporary, or_alter, or_replace, true)
5189 .map(Into::into)
5190 } else if self.parse_keyword(Keyword::MACRO) {
5191 self.parse_create_macro(or_replace, temporary)
5192 } else if self.parse_keyword(Keyword::SECRET) {
5193 self.parse_create_secret(or_replace, temporary, persistent)
5194 } else if self.parse_keyword(Keyword::USER) {
5195 if self.parse_keyword(Keyword::MAPPING) {
5196 self.parse_create_user_mapping().map(Into::into)
5197 } else {
5198 self.parse_create_user(or_replace).map(Into::into)
5199 }
5200 } else if self.parse_keyword(Keyword::AGGREGATE) {
5201 self.parse_create_aggregate(or_replace).map(Into::into)
5202 } else if self.peek_keyword(Keyword::TRUSTED)
5203 || self.peek_keyword(Keyword::PROCEDURAL)
5204 || self.peek_keyword(Keyword::LANGUAGE)
5205 {
5206 let trusted = self.parse_keyword(Keyword::TRUSTED);
5207 let procedural = self.parse_keyword(Keyword::PROCEDURAL);
5208 if self.parse_keyword(Keyword::LANGUAGE) {
5209 self.parse_create_language(or_replace, trusted, procedural)
5210 .map(Into::into)
5211 } else {
5212 self.expected_ref(
5213 "LANGUAGE after TRUSTED or PROCEDURAL",
5214 self.peek_token_ref(),
5215 )
5216 }
5217 } else if self.parse_keyword(Keyword::TRANSFORM) {
5218 self.parse_create_transform(or_replace).map(Into::into)
5219 } else if or_replace {
5220 self.expected_ref(
5221 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5222 self.peek_token_ref(),
5223 )
5224 } else if self.parse_keyword(Keyword::CAST) {
5225 self.parse_create_cast().map(Into::into)
5226 } else if self.parse_keyword(Keyword::CONVERSION) {
5227 self.parse_create_conversion(false).map(Into::into)
5228 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CONVERSION]) {
5229 self.parse_create_conversion(true).map(Into::into)
5230 } else if self.parse_keyword(Keyword::RULE) {
5231 self.parse_create_rule().map(Into::into)
5232 } else if self.parse_keyword(Keyword::EXTENSION) {
5233 self.parse_create_extension().map(Into::into)
5234 } else if self.parse_keyword(Keyword::INDEX) {
5235 self.parse_create_index(false).map(Into::into)
5236 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5237 self.parse_create_index(true).map(Into::into)
5238 } else if self.parse_keyword(Keyword::VIRTUAL) {
5239 self.parse_create_virtual_table()
5240 } else if self.parse_keyword(Keyword::SCHEMA) {
5241 self.parse_create_schema()
5242 } else if self.parse_keyword(Keyword::DATABASE) {
5243 self.parse_create_database()
5244 } else if self.parse_keyword(Keyword::ROLE) {
5245 self.parse_create_role().map(Into::into)
5246 } else if self.parse_keyword(Keyword::SEQUENCE) {
5247 self.parse_create_sequence(temporary)
5248 } else if self.parse_keyword(Keyword::COLLATION) {
5249 self.parse_create_collation().map(Into::into)
5250 } else if self.parse_keyword(Keyword::TYPE) {
5251 self.parse_create_type()
5252 } else if self.parse_keyword(Keyword::PROCEDURE) {
5253 self.parse_create_procedure(or_alter)
5254 } else if self.parse_keyword(Keyword::CONNECTOR) {
5255 self.parse_create_connector().map(Into::into)
5256 } else if self.parse_keyword(Keyword::OPERATOR) {
5257 if self.parse_keyword(Keyword::FAMILY) {
5259 self.parse_create_operator_family().map(Into::into)
5260 } else if self.parse_keyword(Keyword::CLASS) {
5261 self.parse_create_operator_class().map(Into::into)
5262 } else {
5263 self.parse_create_operator().map(Into::into)
5264 }
5265 } else if self.parse_keyword(Keyword::SERVER) {
5266 self.parse_pg_create_server()
5267 } else if self.parse_keyword(Keyword::FOREIGN) {
5268 if self.parse_keywords(&[Keyword::DATA, Keyword::WRAPPER]) {
5269 self.parse_create_foreign_data_wrapper().map(Into::into)
5270 } else if self.parse_keyword(Keyword::TABLE) {
5271 self.parse_create_foreign_table().map(Into::into)
5272 } else {
5273 self.expected_ref(
5274 "DATA WRAPPER or TABLE after CREATE FOREIGN",
5275 self.peek_token_ref(),
5276 )
5277 }
5278 } else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5279 self.parse_create_text_search()
5280 } else if self.parse_keyword(Keyword::PUBLICATION) {
5281 self.parse_create_publication().map(Into::into)
5282 } else if self.parse_keyword(Keyword::SUBSCRIPTION) {
5283 self.parse_create_subscription().map(Into::into)
5284 } else if self.parse_keyword(Keyword::STATISTICS) {
5285 self.parse_create_statistics().map(Into::into)
5286 } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::METHOD]) {
5287 self.parse_create_access_method().map(Into::into)
5288 } else if self.parse_keywords(&[Keyword::EVENT, Keyword::TRIGGER]) {
5289 self.parse_create_event_trigger().map(Into::into)
5290 } else if self.parse_keyword(Keyword::TABLESPACE) {
5291 self.parse_create_tablespace().map(Into::into)
5292 } else {
5293 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5294 }
5295 }
5296
5297 fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5298 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5299 let name = self.parse_identifier()?;
5300 let options = self
5301 .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5302 .options;
5303 let with_tags = self.parse_keyword(Keyword::WITH);
5304 let tags = if self.parse_keyword(Keyword::TAG) {
5305 self.parse_key_value_options(true, &[])?.options
5306 } else {
5307 vec![]
5308 };
5309 Ok(CreateUser {
5310 or_replace,
5311 if_not_exists,
5312 name,
5313 options: KeyValueOptions {
5314 options,
5315 delimiter: KeyValueOptionsDelimiter::Space,
5316 },
5317 with_tags,
5318 tags: KeyValueOptions {
5319 options: tags,
5320 delimiter: KeyValueOptionsDelimiter::Comma,
5321 },
5322 })
5323 }
5324
5325 pub fn parse_create_secret(
5327 &mut self,
5328 or_replace: bool,
5329 temporary: bool,
5330 persistent: bool,
5331 ) -> Result<Statement, ParserError> {
5332 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5333
5334 let mut storage_specifier = None;
5335 let mut name = None;
5336 if self.peek_token_ref().token != Token::LParen {
5337 if self.parse_keyword(Keyword::IN) {
5338 storage_specifier = self.parse_identifier().ok()
5339 } else {
5340 name = self.parse_identifier().ok();
5341 }
5342
5343 if storage_specifier.is_none()
5345 && self.peek_token_ref().token != Token::LParen
5346 && self.parse_keyword(Keyword::IN)
5347 {
5348 storage_specifier = self.parse_identifier().ok();
5349 }
5350 }
5351
5352 self.expect_token(&Token::LParen)?;
5353 self.expect_keyword_is(Keyword::TYPE)?;
5354 let secret_type = self.parse_identifier()?;
5355
5356 let mut options = Vec::new();
5357 if self.consume_token(&Token::Comma) {
5358 options.append(&mut self.parse_comma_separated(|p| {
5359 let key = p.parse_identifier()?;
5360 let value = p.parse_identifier()?;
5361 Ok(SecretOption { key, value })
5362 })?);
5363 }
5364 self.expect_token(&Token::RParen)?;
5365
5366 let temp = match (temporary, persistent) {
5367 (true, false) => Some(true),
5368 (false, true) => Some(false),
5369 (false, false) => None,
5370 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5371 };
5372
5373 Ok(Statement::CreateSecret {
5374 or_replace,
5375 temporary: temp,
5376 if_not_exists,
5377 name,
5378 storage_specifier,
5379 secret_type,
5380 options,
5381 })
5382 }
5383
5384 pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5386 let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5387 if self.parse_keyword(Keyword::TABLE) {
5388 let table_name = self.parse_object_name(false)?;
5389 if self.peek_token_ref().token != Token::EOF {
5390 if let Token::Word(word) = &self.peek_token_ref().token {
5391 if word.keyword == Keyword::OPTIONS {
5392 options = self.parse_options(Keyword::OPTIONS)?
5393 }
5394 };
5395
5396 if self.peek_token_ref().token != Token::EOF {
5397 let (a, q) = self.parse_as_query()?;
5398 has_as = a;
5399 query = Some(q);
5400 }
5401
5402 Ok(Statement::Cache {
5403 table_flag,
5404 table_name,
5405 has_as,
5406 options,
5407 query,
5408 })
5409 } else {
5410 Ok(Statement::Cache {
5411 table_flag,
5412 table_name,
5413 has_as,
5414 options,
5415 query,
5416 })
5417 }
5418 } else {
5419 table_flag = Some(self.parse_object_name(false)?);
5420 if self.parse_keyword(Keyword::TABLE) {
5421 let table_name = self.parse_object_name(false)?;
5422 if self.peek_token_ref().token != Token::EOF {
5423 if let Token::Word(word) = &self.peek_token_ref().token {
5424 if word.keyword == Keyword::OPTIONS {
5425 options = self.parse_options(Keyword::OPTIONS)?
5426 }
5427 };
5428
5429 if self.peek_token_ref().token != Token::EOF {
5430 let (a, q) = self.parse_as_query()?;
5431 has_as = a;
5432 query = Some(q);
5433 }
5434
5435 Ok(Statement::Cache {
5436 table_flag,
5437 table_name,
5438 has_as,
5439 options,
5440 query,
5441 })
5442 } else {
5443 Ok(Statement::Cache {
5444 table_flag,
5445 table_name,
5446 has_as,
5447 options,
5448 query,
5449 })
5450 }
5451 } else {
5452 if self.peek_token_ref().token == Token::EOF {
5453 self.prev_token();
5454 }
5455 self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5456 }
5457 }
5458 }
5459
5460 pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5462 match &self.peek_token_ref().token {
5463 Token::Word(word) => match word.keyword {
5464 Keyword::AS => {
5465 self.next_token();
5466 Ok((true, self.parse_query()?))
5467 }
5468 _ => Ok((false, self.parse_query()?)),
5469 },
5470 _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5471 }
5472 }
5473
5474 pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5476 self.expect_keyword_is(Keyword::TABLE)?;
5477 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5478 let table_name = self.parse_object_name(false)?;
5479 Ok(Statement::UNCache {
5480 table_name,
5481 if_exists,
5482 })
5483 }
5484
5485 pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5487 self.expect_keyword_is(Keyword::TABLE)?;
5488 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5489 let table_name = self.parse_object_name(false)?;
5490 self.expect_keyword_is(Keyword::USING)?;
5491 let module_name = self.parse_identifier()?;
5492 let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5497 Ok(Statement::CreateVirtualTable {
5498 name: table_name,
5499 if_not_exists,
5500 module_name,
5501 module_args,
5502 })
5503 }
5504
5505 pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5507 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5508
5509 let schema_name = self.parse_schema_name()?;
5510
5511 let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5512 Some(self.parse_expr()?)
5513 } else {
5514 None
5515 };
5516
5517 let with = if self.peek_keyword(Keyword::WITH) {
5518 Some(self.parse_options(Keyword::WITH)?)
5519 } else {
5520 None
5521 };
5522
5523 let options = if self.peek_keyword(Keyword::OPTIONS) {
5524 Some(self.parse_options(Keyword::OPTIONS)?)
5525 } else {
5526 None
5527 };
5528
5529 let clone = if self.parse_keyword(Keyword::CLONE) {
5530 Some(self.parse_object_name(false)?)
5531 } else {
5532 None
5533 };
5534
5535 Ok(Statement::CreateSchema {
5536 schema_name,
5537 if_not_exists,
5538 with,
5539 options,
5540 default_collate_spec,
5541 clone,
5542 })
5543 }
5544
5545 fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5546 if self.parse_keyword(Keyword::AUTHORIZATION) {
5547 Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5548 } else {
5549 let name = self.parse_object_name(false)?;
5550
5551 if self.parse_keyword(Keyword::AUTHORIZATION) {
5552 Ok(SchemaName::NamedAuthorization(
5553 name,
5554 self.parse_identifier()?,
5555 ))
5556 } else {
5557 Ok(SchemaName::Simple(name))
5558 }
5559 }
5560 }
5561
5562 pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5564 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5565 let db_name = self.parse_object_name(false)?;
5566 let mut location = None;
5567 let mut managed_location = None;
5568 loop {
5569 match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5570 Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5571 Some(Keyword::MANAGEDLOCATION) => {
5572 managed_location = Some(self.parse_literal_string()?)
5573 }
5574 _ => break,
5575 }
5576 }
5577 let clone = if self.parse_keyword(Keyword::CLONE) {
5578 Some(self.parse_object_name(false)?)
5579 } else {
5580 None
5581 };
5582
5583 let mut default_charset = None;
5591 let mut default_collation = None;
5592 loop {
5593 let has_default = self.parse_keyword(Keyword::DEFAULT);
5594 if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5595 || self.parse_keyword(Keyword::CHARSET)
5596 {
5597 let _ = self.consume_token(&Token::Eq);
5598 default_charset = Some(self.parse_identifier()?.value);
5599 } else if self.parse_keyword(Keyword::COLLATE) {
5600 let _ = self.consume_token(&Token::Eq);
5601 default_collation = Some(self.parse_identifier()?.value);
5602 } else if has_default {
5603 self.prev_token();
5605 break;
5606 } else {
5607 break;
5608 }
5609 }
5610
5611 Ok(Statement::CreateDatabase {
5612 db_name,
5613 if_not_exists: ine,
5614 location,
5615 managed_location,
5616 or_replace: false,
5617 transient: false,
5618 clone,
5619 data_retention_time_in_days: None,
5620 max_data_extension_time_in_days: None,
5621 external_volume: None,
5622 catalog: None,
5623 replace_invalid_characters: None,
5624 default_ddl_collation: None,
5625 storage_serialization_policy: None,
5626 comment: None,
5627 default_charset,
5628 default_collation,
5629 catalog_sync: None,
5630 catalog_sync_namespace_mode: None,
5631 catalog_sync_namespace_flatten_delimiter: None,
5632 with_tags: None,
5633 with_contacts: None,
5634 })
5635 }
5636
5637 pub fn parse_optional_create_function_using(
5639 &mut self,
5640 ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5641 if !self.parse_keyword(Keyword::USING) {
5642 return Ok(None);
5643 };
5644 let keyword =
5645 self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5646
5647 let uri = self.parse_literal_string()?;
5648
5649 match keyword {
5650 Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5651 Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5652 Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5653 _ => self.expected(
5654 "JAR, FILE or ARCHIVE, got {:?}",
5655 TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5656 ),
5657 }
5658 }
5659
5660 pub fn parse_create_function(
5662 &mut self,
5663 or_alter: bool,
5664 or_replace: bool,
5665 temporary: bool,
5666 ) -> Result<Statement, ParserError> {
5667 if dialect_of!(self is HiveDialect) {
5668 self.parse_hive_create_function(or_replace, temporary)
5669 .map(Into::into)
5670 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5671 self.parse_postgres_create_function(or_replace, temporary)
5672 .map(Into::into)
5673 } else if dialect_of!(self is DuckDbDialect) {
5674 self.parse_create_macro(or_replace, temporary)
5675 } else if dialect_of!(self is BigQueryDialect) {
5676 self.parse_bigquery_create_function(or_replace, temporary)
5677 .map(Into::into)
5678 } else if dialect_of!(self is MsSqlDialect) {
5679 self.parse_mssql_create_function(or_alter, or_replace, temporary)
5680 .map(Into::into)
5681 } else {
5682 self.prev_token();
5683 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5684 }
5685 }
5686
5687 fn parse_postgres_create_function(
5691 &mut self,
5692 or_replace: bool,
5693 temporary: bool,
5694 ) -> Result<CreateFunction, ParserError> {
5695 let name = self.parse_object_name(false)?;
5696
5697 self.expect_token(&Token::LParen)?;
5698 let args = if Token::RParen != self.peek_token_ref().token {
5699 self.parse_comma_separated(Parser::parse_function_arg)?
5700 } else {
5701 vec![]
5702 };
5703 self.expect_token(&Token::RParen)?;
5704
5705 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5706 Some(self.parse_function_return_type()?)
5707 } else {
5708 None
5709 };
5710
5711 #[derive(Default)]
5712 struct Body {
5713 language: Option<Ident>,
5714 behavior: Option<FunctionBehavior>,
5715 function_body: Option<CreateFunctionBody>,
5716 called_on_null: Option<FunctionCalledOnNull>,
5717 parallel: Option<FunctionParallel>,
5718 security: Option<FunctionSecurity>,
5719 }
5720 let mut body = Body::default();
5721 let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5722 loop {
5723 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5724 if field.is_some() {
5725 return Err(ParserError::ParserError(format!(
5726 "{name} specified more than once",
5727 )));
5728 }
5729 Ok(())
5730 }
5731 if self.parse_keyword(Keyword::AS) {
5732 ensure_not_set(&body.function_body, "AS")?;
5733 body.function_body = Some(self.parse_create_function_body_string()?);
5734 } else if self.parse_keyword(Keyword::LANGUAGE) {
5735 ensure_not_set(&body.language, "LANGUAGE")?;
5736 body.language = Some(self.parse_identifier()?);
5737 } else if self.parse_keyword(Keyword::IMMUTABLE) {
5738 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5739 body.behavior = Some(FunctionBehavior::Immutable);
5740 } else if self.parse_keyword(Keyword::STABLE) {
5741 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5742 body.behavior = Some(FunctionBehavior::Stable);
5743 } else if self.parse_keyword(Keyword::VOLATILE) {
5744 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5745 body.behavior = Some(FunctionBehavior::Volatile);
5746 } else if self.parse_keywords(&[
5747 Keyword::CALLED,
5748 Keyword::ON,
5749 Keyword::NULL,
5750 Keyword::INPUT,
5751 ]) {
5752 ensure_not_set(
5753 &body.called_on_null,
5754 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5755 )?;
5756 body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5757 } else if self.parse_keywords(&[
5758 Keyword::RETURNS,
5759 Keyword::NULL,
5760 Keyword::ON,
5761 Keyword::NULL,
5762 Keyword::INPUT,
5763 ]) {
5764 ensure_not_set(
5765 &body.called_on_null,
5766 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5767 )?;
5768 body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5769 } else if self.parse_keyword(Keyword::STRICT) {
5770 ensure_not_set(
5771 &body.called_on_null,
5772 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5773 )?;
5774 body.called_on_null = Some(FunctionCalledOnNull::Strict);
5775 } else if self.parse_keyword(Keyword::PARALLEL) {
5776 ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5777 if self.parse_keyword(Keyword::UNSAFE) {
5778 body.parallel = Some(FunctionParallel::Unsafe);
5779 } else if self.parse_keyword(Keyword::RESTRICTED) {
5780 body.parallel = Some(FunctionParallel::Restricted);
5781 } else if self.parse_keyword(Keyword::SAFE) {
5782 body.parallel = Some(FunctionParallel::Safe);
5783 } else {
5784 return self
5785 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5786 }
5787 } else if self.parse_keyword(Keyword::SECURITY) {
5788 ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5789 if self.parse_keyword(Keyword::DEFINER) {
5790 body.security = Some(FunctionSecurity::Definer);
5791 } else if self.parse_keyword(Keyword::INVOKER) {
5792 body.security = Some(FunctionSecurity::Invoker);
5793 } else {
5794 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5795 }
5796 } else if self.parse_keyword(Keyword::SET) {
5797 let name = self.parse_object_name(false)?;
5798 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5799 FunctionSetValue::FromCurrent
5800 } else {
5801 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5802 return self.expected_ref("= or TO", self.peek_token_ref());
5803 }
5804 if self.parse_keyword(Keyword::DEFAULT) {
5805 FunctionSetValue::Default
5806 } else {
5807 let values = self.parse_comma_separated(Parser::parse_expr)?;
5808 FunctionSetValue::Values(values)
5809 }
5810 };
5811 set_params.push(FunctionDefinitionSetParam { name, value });
5812 } else if self.parse_keyword(Keyword::RETURN) {
5813 ensure_not_set(&body.function_body, "RETURN")?;
5814 body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5815 } else {
5816 break;
5817 }
5818 }
5819
5820 Ok(CreateFunction {
5821 or_alter: false,
5822 or_replace,
5823 temporary,
5824 name,
5825 args: Some(args),
5826 return_type,
5827 behavior: body.behavior,
5828 called_on_null: body.called_on_null,
5829 parallel: body.parallel,
5830 security: body.security,
5831 set_params,
5832 language: body.language,
5833 function_body: body.function_body,
5834 if_not_exists: false,
5835 using: None,
5836 determinism_specifier: None,
5837 options: None,
5838 remote_connection: None,
5839 })
5840 }
5841
5842 fn parse_hive_create_function(
5846 &mut self,
5847 or_replace: bool,
5848 temporary: bool,
5849 ) -> Result<CreateFunction, ParserError> {
5850 let name = self.parse_object_name(false)?;
5851 self.expect_keyword_is(Keyword::AS)?;
5852
5853 let body = self.parse_create_function_body_string()?;
5854 let using = self.parse_optional_create_function_using()?;
5855
5856 Ok(CreateFunction {
5857 or_alter: false,
5858 or_replace,
5859 temporary,
5860 name,
5861 function_body: Some(body),
5862 using,
5863 if_not_exists: false,
5864 args: None,
5865 return_type: None,
5866 behavior: None,
5867 called_on_null: None,
5868 parallel: None,
5869 security: None,
5870 set_params: vec![],
5871 language: None,
5872 determinism_specifier: None,
5873 options: None,
5874 remote_connection: None,
5875 })
5876 }
5877
5878 fn parse_bigquery_create_function(
5882 &mut self,
5883 or_replace: bool,
5884 temporary: bool,
5885 ) -> Result<CreateFunction, ParserError> {
5886 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5887 let (name, args) = self.parse_create_function_name_and_params()?;
5888
5889 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5890 Some(self.parse_function_return_type()?)
5891 } else {
5892 None
5893 };
5894
5895 let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
5896 Some(FunctionDeterminismSpecifier::Deterministic)
5897 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
5898 Some(FunctionDeterminismSpecifier::NotDeterministic)
5899 } else {
5900 None
5901 };
5902
5903 let language = if self.parse_keyword(Keyword::LANGUAGE) {
5904 Some(self.parse_identifier()?)
5905 } else {
5906 None
5907 };
5908
5909 let remote_connection =
5910 if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
5911 Some(self.parse_object_name(false)?)
5912 } else {
5913 None
5914 };
5915
5916 let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
5919
5920 let function_body = if remote_connection.is_none() {
5921 self.expect_keyword_is(Keyword::AS)?;
5922 let expr = self.parse_expr()?;
5923 if options.is_none() {
5924 options = self.maybe_parse_options(Keyword::OPTIONS)?;
5925 Some(CreateFunctionBody::AsBeforeOptions {
5926 body: expr,
5927 link_symbol: None,
5928 })
5929 } else {
5930 Some(CreateFunctionBody::AsAfterOptions(expr))
5931 }
5932 } else {
5933 None
5934 };
5935
5936 Ok(CreateFunction {
5937 or_alter: false,
5938 or_replace,
5939 temporary,
5940 if_not_exists,
5941 name,
5942 args: Some(args),
5943 return_type,
5944 function_body,
5945 language,
5946 determinism_specifier,
5947 options,
5948 remote_connection,
5949 using: None,
5950 behavior: None,
5951 called_on_null: None,
5952 parallel: None,
5953 security: None,
5954 set_params: vec![],
5955 })
5956 }
5957
5958 fn parse_mssql_create_function(
5962 &mut self,
5963 or_alter: bool,
5964 or_replace: bool,
5965 temporary: bool,
5966 ) -> Result<CreateFunction, ParserError> {
5967 let (name, args) = self.parse_create_function_name_and_params()?;
5968
5969 self.expect_keyword(Keyword::RETURNS)?;
5970
5971 let return_table = self.maybe_parse(|p| {
5972 let return_table_name = p.parse_identifier()?;
5973
5974 p.expect_keyword_is(Keyword::TABLE)?;
5975 p.prev_token();
5976
5977 let table_column_defs = match p.parse_data_type()? {
5978 DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5979 table_column_defs
5980 }
5981 _ => parser_err!(
5982 "Expected table column definitions after TABLE keyword",
5983 p.peek_token_ref().span.start
5984 )?,
5985 };
5986
5987 Ok(DataType::NamedTable {
5988 name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5989 columns: table_column_defs,
5990 })
5991 })?;
5992
5993 let data_type = match return_table {
5994 Some(table_type) => table_type,
5995 None => self.parse_data_type()?,
5996 };
5997 let return_type = Some(FunctionReturnType::DataType(data_type));
5998
5999 let _ = self.parse_keyword(Keyword::AS);
6000
6001 let function_body = if self.peek_keyword(Keyword::BEGIN) {
6002 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
6003 let statements = self.parse_statement_list(&[Keyword::END])?;
6004 let end_token = self.expect_keyword(Keyword::END)?;
6005
6006 Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
6007 begin_token: AttachedToken(begin_token),
6008 statements,
6009 end_token: AttachedToken(end_token),
6010 }))
6011 } else if self.parse_keyword(Keyword::RETURN) {
6012 if self.peek_token_ref().token == Token::LParen {
6013 Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
6014 } else if self.peek_keyword(Keyword::SELECT) {
6015 let select = self.parse_select()?;
6016 Some(CreateFunctionBody::AsReturnSelect(select))
6017 } else {
6018 parser_err!(
6019 "Expected a subquery (or bare SELECT statement) after RETURN",
6020 self.peek_token_ref().span.start
6021 )?
6022 }
6023 } else {
6024 parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
6025 };
6026
6027 Ok(CreateFunction {
6028 or_alter,
6029 or_replace,
6030 temporary,
6031 if_not_exists: false,
6032 name,
6033 args: Some(args),
6034 return_type,
6035 function_body,
6036 language: None,
6037 determinism_specifier: None,
6038 options: None,
6039 remote_connection: None,
6040 using: None,
6041 behavior: None,
6042 called_on_null: None,
6043 parallel: None,
6044 security: None,
6045 set_params: vec![],
6046 })
6047 }
6048
6049 fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
6050 if self.parse_keyword(Keyword::SETOF) {
6051 Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
6052 } else {
6053 Ok(FunctionReturnType::DataType(self.parse_data_type()?))
6054 }
6055 }
6056
6057 fn parse_create_function_name_and_params(
6058 &mut self,
6059 ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
6060 let name = self.parse_object_name(false)?;
6061 let parse_function_param =
6062 |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
6063 let name = parser.parse_identifier()?;
6064 let data_type = parser.parse_data_type()?;
6065 let default_expr = if parser.consume_token(&Token::Eq) {
6066 Some(parser.parse_expr()?)
6067 } else {
6068 None
6069 };
6070
6071 Ok(OperateFunctionArg {
6072 mode: None,
6073 name: Some(name),
6074 data_type,
6075 default_expr,
6076 })
6077 };
6078 self.expect_token(&Token::LParen)?;
6079 let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6080 self.expect_token(&Token::RParen)?;
6081 Ok((name, args))
6082 }
6083
6084 fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6085 let mode = if self.parse_keyword(Keyword::IN) {
6086 Some(ArgMode::In)
6087 } else if self.parse_keyword(Keyword::OUT) {
6088 Some(ArgMode::Out)
6089 } else if self.parse_keyword(Keyword::INOUT) {
6090 Some(ArgMode::InOut)
6091 } else if self.parse_keyword(Keyword::VARIADIC) {
6092 Some(ArgMode::Variadic)
6093 } else {
6094 None
6095 };
6096
6097 let mut name = None;
6099 let mut data_type = self.parse_data_type()?;
6100
6101 let data_type_idx = self.get_current_index();
6105
6106 fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6108 if parser.peek_keyword(Keyword::DEFAULT) {
6109 parser_err!(
6111 "The DEFAULT keyword is not a type",
6112 parser.peek_token_ref().span.start
6113 )
6114 } else {
6115 parser.parse_data_type()
6116 }
6117 }
6118
6119 if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6120 let token = self.token_at(data_type_idx);
6121
6122 if !matches!(token.token, Token::Word(_)) {
6124 return self.expected("a name or type", token.clone());
6125 }
6126
6127 name = Some(Ident::new(token.to_string()));
6128 data_type = next_data_type;
6129 }
6130
6131 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6132 {
6133 Some(self.parse_expr()?)
6134 } else {
6135 None
6136 };
6137 Ok(OperateFunctionArg {
6138 mode,
6139 name,
6140 data_type,
6141 default_expr,
6142 })
6143 }
6144
6145 fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6146 let mode = if self.parse_keyword(Keyword::IN) {
6147 Some(ArgMode::In)
6148 } else {
6149 if self
6150 .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6151 .is_some()
6152 {
6153 return self.expected_ref(
6154 "IN or argument type in aggregate signature",
6155 self.peek_token_ref(),
6156 );
6157 }
6158 None
6159 };
6160
6161 let mut name = None;
6164 let mut data_type = self.parse_data_type()?;
6165 let data_type_idx = self.get_current_index();
6166
6167 fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6168 if parser.peek_keyword(Keyword::DEFAULT)
6169 || parser.peek_keyword(Keyword::ORDER)
6170 || parser.peek_token_ref().token == Token::Comma
6171 || parser.peek_token_ref().token == Token::RParen
6172 {
6173 parser_err!(
6175 "The current token cannot start an aggregate argument type",
6176 parser.peek_token_ref().span.start
6177 )
6178 } else {
6179 parser.parse_data_type()
6180 }
6181 }
6182
6183 if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6184 let token = self.token_at(data_type_idx);
6185 if !matches!(token.token, Token::Word(_)) {
6186 return self.expected("a name or type", token.clone());
6187 }
6188
6189 name = Some(Ident::new(token.to_string()));
6190 data_type = next_data_type;
6191 }
6192
6193 if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6194 return self.expected_ref(
6195 "',' or ')' or ORDER BY after aggregate argument type",
6196 self.peek_token_ref(),
6197 );
6198 }
6199
6200 Ok(OperateFunctionArg {
6201 mode,
6202 name,
6203 data_type,
6204 default_expr: None,
6205 })
6206 }
6207
6208 pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6214 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6215 {
6216 self.prev_token();
6217 return self.expected_ref("an object type after DROP", self.peek_token_ref());
6218 }
6219 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6220 let trigger_name = self.parse_object_name(false)?;
6221 let table_name = if self.parse_keyword(Keyword::ON) {
6222 Some(self.parse_object_name(false)?)
6223 } else {
6224 None
6225 };
6226 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6227 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6228 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6229 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6230 format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6231 )),
6232 None => None,
6233 };
6234 Ok(DropTrigger {
6235 if_exists,
6236 trigger_name,
6237 table_name,
6238 option,
6239 })
6240 }
6241
6242 pub fn parse_create_trigger(
6244 &mut self,
6245 temporary: bool,
6246 or_alter: bool,
6247 or_replace: bool,
6248 is_constraint: bool,
6249 ) -> Result<CreateTrigger, ParserError> {
6250 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6251 {
6252 self.prev_token();
6253 return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6254 }
6255
6256 let name = self.parse_object_name(false)?;
6257 let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6258
6259 let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6260 self.expect_keyword_is(Keyword::ON)?;
6261 let table_name = self.parse_object_name(false)?;
6262
6263 let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6264 self.parse_object_name(true).ok()
6265 } else {
6266 None
6267 };
6268
6269 let characteristics = self.parse_constraint_characteristics()?;
6270
6271 let mut referencing = vec![];
6272 if self.parse_keyword(Keyword::REFERENCING) {
6273 while let Some(refer) = self.parse_trigger_referencing()? {
6274 referencing.push(refer);
6275 }
6276 }
6277
6278 let trigger_object = if self.parse_keyword(Keyword::FOR) {
6279 let include_each = self.parse_keyword(Keyword::EACH);
6280 let trigger_object =
6281 match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6282 Keyword::ROW => TriggerObject::Row,
6283 Keyword::STATEMENT => TriggerObject::Statement,
6284 unexpected_keyword => return Err(ParserError::ParserError(
6285 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6286 )),
6287 };
6288
6289 Some(if include_each {
6290 TriggerObjectKind::ForEach(trigger_object)
6291 } else {
6292 TriggerObjectKind::For(trigger_object)
6293 })
6294 } else {
6295 let _ = self.parse_keyword(Keyword::FOR);
6296
6297 None
6298 };
6299
6300 let condition = self
6301 .parse_keyword(Keyword::WHEN)
6302 .then(|| self.parse_expr())
6303 .transpose()?;
6304
6305 let mut exec_body = None;
6306 let mut statements = None;
6307 if self.parse_keyword(Keyword::EXECUTE) {
6308 exec_body = Some(self.parse_trigger_exec_body()?);
6309 } else {
6310 statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6311 }
6312
6313 Ok(CreateTrigger {
6314 or_alter,
6315 temporary,
6316 or_replace,
6317 is_constraint,
6318 name,
6319 period,
6320 period_before_table: true,
6321 events,
6322 table_name,
6323 referenced_table_name,
6324 referencing,
6325 trigger_object,
6326 condition,
6327 exec_body,
6328 statements_as: false,
6329 statements,
6330 characteristics,
6331 })
6332 }
6333
6334 pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6336 Ok(
6337 match self.expect_one_of_keywords(&[
6338 Keyword::FOR,
6339 Keyword::BEFORE,
6340 Keyword::AFTER,
6341 Keyword::INSTEAD,
6342 ])? {
6343 Keyword::FOR => TriggerPeriod::For,
6344 Keyword::BEFORE => TriggerPeriod::Before,
6345 Keyword::AFTER => TriggerPeriod::After,
6346 Keyword::INSTEAD => self
6347 .expect_keyword_is(Keyword::OF)
6348 .map(|_| TriggerPeriod::InsteadOf)?,
6349 unexpected_keyword => return Err(ParserError::ParserError(
6350 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6351 )),
6352 },
6353 )
6354 }
6355
6356 pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6358 Ok(
6359 match self.expect_one_of_keywords(&[
6360 Keyword::INSERT,
6361 Keyword::UPDATE,
6362 Keyword::DELETE,
6363 Keyword::TRUNCATE,
6364 ])? {
6365 Keyword::INSERT => TriggerEvent::Insert,
6366 Keyword::UPDATE => {
6367 if self.parse_keyword(Keyword::OF) {
6368 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6369 TriggerEvent::Update(cols)
6370 } else {
6371 TriggerEvent::Update(vec![])
6372 }
6373 }
6374 Keyword::DELETE => TriggerEvent::Delete,
6375 Keyword::TRUNCATE => TriggerEvent::Truncate,
6376 unexpected_keyword => return Err(ParserError::ParserError(
6377 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6378 )),
6379 },
6380 )
6381 }
6382
6383 pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6385 let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6386 Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6387 TriggerReferencingType::OldTable
6388 }
6389 Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6390 TriggerReferencingType::NewTable
6391 }
6392 _ => {
6393 return Ok(None);
6394 }
6395 };
6396
6397 let is_as = self.parse_keyword(Keyword::AS);
6398 let transition_relation_name = self.parse_object_name(false)?;
6399 Ok(Some(TriggerReferencing {
6400 refer_type,
6401 is_as,
6402 transition_relation_name,
6403 }))
6404 }
6405
6406 pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6413 let exec_type = match self
6414 .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6415 {
6416 Keyword::FUNCTION => TriggerExecBodyType::Function,
6417 Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6418 unexpected_keyword => {
6419 return Err(ParserError::ParserError(format!(
6420 "Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"
6421 )))
6422 }
6423 };
6424
6425 let func_name = self.parse_object_name(false)?;
6426
6427 let args = if self.consume_token(&Token::LParen) {
6428 if self.consume_token(&Token::RParen) {
6429 Some(vec![])
6430 } else {
6431 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
6432 self.expect_token(&Token::RParen)?;
6433 Some(exprs)
6434 }
6435 } else {
6436 None
6437 };
6438
6439 Ok(TriggerExecBody {
6440 exec_type,
6441 func_name,
6442 args,
6443 })
6444 }
6445
6446 pub fn parse_create_macro(
6448 &mut self,
6449 or_replace: bool,
6450 temporary: bool,
6451 ) -> Result<Statement, ParserError> {
6452 if dialect_of!(self is DuckDbDialect | GenericDialect) {
6453 let name = self.parse_object_name(false)?;
6454 self.expect_token(&Token::LParen)?;
6455 let args = if self.consume_token(&Token::RParen) {
6456 self.prev_token();
6457 None
6458 } else {
6459 Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6460 };
6461
6462 self.expect_token(&Token::RParen)?;
6463 self.expect_keyword_is(Keyword::AS)?;
6464
6465 Ok(Statement::CreateMacro {
6466 or_replace,
6467 temporary,
6468 name,
6469 args,
6470 definition: if self.parse_keyword(Keyword::TABLE) {
6471 MacroDefinition::Table(self.parse_query()?)
6472 } else {
6473 MacroDefinition::Expr(self.parse_expr()?)
6474 },
6475 })
6476 } else {
6477 self.prev_token();
6478 self.expected_ref("an object type after CREATE", self.peek_token_ref())
6479 }
6480 }
6481
6482 fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6483 let name = self.parse_identifier()?;
6484
6485 let default_expr =
6486 if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6487 Some(self.parse_expr()?)
6488 } else {
6489 None
6490 };
6491 Ok(MacroArg { name, default_expr })
6492 }
6493
6494 pub fn parse_create_external_table(
6496 &mut self,
6497 or_replace: bool,
6498 ) -> Result<CreateTable, ParserError> {
6499 self.expect_keyword_is(Keyword::TABLE)?;
6500 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6501 let table_name = self.parse_object_name(false)?;
6502 let (columns, constraints) = self.parse_columns()?;
6503
6504 let hive_distribution = self.parse_hive_distribution()?;
6505 let hive_formats = self.parse_hive_formats()?;
6506
6507 let file_format = if let Some(ref hf) = hive_formats {
6508 if let Some(ref ff) = hf.storage {
6509 match ff {
6510 HiveIOFormat::FileFormat { format } => Some(*format),
6511 _ => None,
6512 }
6513 } else {
6514 None
6515 }
6516 } else {
6517 None
6518 };
6519 let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6520 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6521 let table_options = if !table_properties.is_empty() {
6522 CreateTableOptions::TableProperties(table_properties)
6523 } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6524 CreateTableOptions::Options(options)
6525 } else {
6526 CreateTableOptions::None
6527 };
6528 Ok(CreateTableBuilder::new(table_name)
6529 .columns(columns)
6530 .constraints(constraints)
6531 .hive_distribution(hive_distribution)
6532 .hive_formats(hive_formats)
6533 .table_options(table_options)
6534 .or_replace(or_replace)
6535 .if_not_exists(if_not_exists)
6536 .external(true)
6537 .file_format(file_format)
6538 .location(location)
6539 .build())
6540 }
6541
6542 pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6546 self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6547 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6548 let table_name = self.parse_object_name(true)?;
6549
6550 self.expect_keyword_is(Keyword::CLONE)?;
6551 let clone = Some(self.parse_object_name(true)?);
6552
6553 let version =
6554 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6555 {
6556 Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6557 } else {
6558 None
6559 };
6560
6561 let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6562 CreateTableOptions::Options(options)
6563 } else {
6564 CreateTableOptions::None
6565 };
6566
6567 Ok(CreateTableBuilder::new(table_name)
6568 .snapshot(true)
6569 .if_not_exists(if_not_exists)
6570 .clone_clause(clone)
6571 .version(version)
6572 .table_options(table_options)
6573 .build())
6574 }
6575
6576 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6578 let next_token = self.next_token();
6579 match &next_token.token {
6580 Token::Word(w) => match w.keyword {
6581 Keyword::AVRO => Ok(FileFormat::AVRO),
6582 Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6583 Keyword::ORC => Ok(FileFormat::ORC),
6584 Keyword::PARQUET => Ok(FileFormat::PARQUET),
6585 Keyword::RCFILE => Ok(FileFormat::RCFILE),
6586 Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6587 Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6588 _ => self.expected("fileformat", next_token),
6589 },
6590 _ => self.expected("fileformat", next_token),
6591 }
6592 }
6593
6594 fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6595 if self.consume_token(&Token::Eq) {
6596 Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6597 } else {
6598 Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6599 }
6600 }
6601
6602 pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6604 let next_token = self.next_token();
6605 match &next_token.token {
6606 Token::Word(w) => match w.keyword {
6607 Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6608 Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6609 Keyword::JSON => Ok(AnalyzeFormat::JSON),
6610 Keyword::TREE => Ok(AnalyzeFormat::TREE),
6611 _ => self.expected("fileformat", next_token),
6612 },
6613 _ => self.expected("fileformat", next_token),
6614 }
6615 }
6616
6617 pub fn parse_create_view(
6619 &mut self,
6620 or_alter: bool,
6621 or_replace: bool,
6622 temporary: bool,
6623 create_view_params: Option<CreateViewParams>,
6624 ) -> Result<CreateView, ParserError> {
6625 let secure = self.parse_keyword(Keyword::SECURE);
6626 let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6627 self.expect_keyword_is(Keyword::VIEW)?;
6628 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6629 let if_not_exists_first =
6632 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6633 let name = self.parse_object_name(allow_unquoted_hyphen)?;
6634 let name_before_not_exists = !if_not_exists_first
6635 && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6636 let if_not_exists = if_not_exists_first || name_before_not_exists;
6637 let copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6638 let columns = self.parse_view_columns()?;
6641 let mut options = CreateTableOptions::None;
6642 let with_options = self.parse_options(Keyword::WITH)?;
6643 if !with_options.is_empty() {
6644 options = CreateTableOptions::With(with_options);
6645 }
6646
6647 let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6648 self.expect_keyword_is(Keyword::BY)?;
6649 self.parse_parenthesized_column_list(Optional, false)?
6650 } else {
6651 vec![]
6652 };
6653
6654 if dialect_of!(self is BigQueryDialect | GenericDialect) {
6655 if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6656 if !opts.is_empty() {
6657 options = CreateTableOptions::Options(opts);
6658 }
6659 };
6660 }
6661
6662 let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6663 && self.parse_keyword(Keyword::TO)
6664 {
6665 Some(self.parse_object_name(false)?)
6666 } else {
6667 None
6668 };
6669
6670 let comment = if self.dialect.supports_create_view_comment_syntax()
6671 && self.parse_keyword(Keyword::COMMENT)
6672 {
6673 self.expect_token(&Token::Eq)?;
6674 Some(self.parse_comment_value()?)
6675 } else {
6676 None
6677 };
6678
6679 self.expect_keyword_is(Keyword::AS)?;
6680 let query = self.parse_query()?;
6681 let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6684 && self.parse_keywords(&[
6685 Keyword::WITH,
6686 Keyword::NO,
6687 Keyword::SCHEMA,
6688 Keyword::BINDING,
6689 ]);
6690
6691 let with_data = if materialized && self.parse_keyword(Keyword::WITH) {
6694 if self.parse_keyword(Keyword::NO) {
6695 self.expect_keyword_is(Keyword::DATA)?;
6696 Some(false)
6697 } else {
6698 self.expect_keyword_is(Keyword::DATA)?;
6699 Some(true)
6700 }
6701 } else {
6702 None
6703 };
6704
6705 Ok(CreateView {
6706 or_alter,
6707 name,
6708 columns,
6709 query,
6710 materialized,
6711 secure,
6712 or_replace,
6713 options,
6714 cluster_by,
6715 comment,
6716 with_no_schema_binding,
6717 if_not_exists,
6718 temporary,
6719 copy_grants,
6720 to,
6721 params: create_view_params,
6722 name_before_not_exists,
6723 with_data,
6724 })
6725 }
6726
6727 fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6731 let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6732 self.expect_token(&Token::Eq)?;
6733 Some(
6734 match self.expect_one_of_keywords(&[
6735 Keyword::UNDEFINED,
6736 Keyword::MERGE,
6737 Keyword::TEMPTABLE,
6738 ])? {
6739 Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6740 Keyword::MERGE => CreateViewAlgorithm::Merge,
6741 Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6742 _ => {
6743 self.prev_token();
6744 let found = self.next_token();
6745 return self
6746 .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6747 }
6748 },
6749 )
6750 } else {
6751 None
6752 };
6753 let definer = if self.parse_keyword(Keyword::DEFINER) {
6754 self.expect_token(&Token::Eq)?;
6755 Some(self.parse_grantee_name()?)
6756 } else {
6757 None
6758 };
6759 let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6760 Some(
6761 match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6762 Keyword::DEFINER => CreateViewSecurity::Definer,
6763 Keyword::INVOKER => CreateViewSecurity::Invoker,
6764 _ => {
6765 self.prev_token();
6766 let found = self.next_token();
6767 return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6768 }
6769 },
6770 )
6771 } else {
6772 None
6773 };
6774 if algorithm.is_some() || definer.is_some() || security.is_some() {
6775 Ok(Some(CreateViewParams {
6776 algorithm,
6777 definer,
6778 security,
6779 }))
6780 } else {
6781 Ok(None)
6782 }
6783 }
6784
6785 pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6787 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6788 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6789
6790 let _ = self.parse_keyword(Keyword::WITH); let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6793 vec![Keyword::AUTHORIZATION]
6794 } else if dialect_of!(self is PostgreSqlDialect) {
6795 vec![
6796 Keyword::LOGIN,
6797 Keyword::NOLOGIN,
6798 Keyword::INHERIT,
6799 Keyword::NOINHERIT,
6800 Keyword::BYPASSRLS,
6801 Keyword::NOBYPASSRLS,
6802 Keyword::PASSWORD,
6803 Keyword::CREATEDB,
6804 Keyword::NOCREATEDB,
6805 Keyword::CREATEROLE,
6806 Keyword::NOCREATEROLE,
6807 Keyword::SUPERUSER,
6808 Keyword::NOSUPERUSER,
6809 Keyword::REPLICATION,
6810 Keyword::NOREPLICATION,
6811 Keyword::CONNECTION,
6812 Keyword::VALID,
6813 Keyword::IN,
6814 Keyword::ROLE,
6815 Keyword::ADMIN,
6816 Keyword::USER,
6817 ]
6818 } else {
6819 vec![]
6820 };
6821
6822 let mut authorization_owner = None;
6824 let mut login = None;
6826 let mut inherit = None;
6827 let mut bypassrls = None;
6828 let mut password = None;
6829 let mut create_db = None;
6830 let mut create_role = None;
6831 let mut superuser = None;
6832 let mut replication = None;
6833 let mut connection_limit = None;
6834 let mut valid_until = None;
6835 let mut in_role = vec![];
6836 let mut in_group = vec![];
6837 let mut role = vec![];
6838 let mut user = vec![];
6839 let mut admin = vec![];
6840
6841 while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6842 let loc = self
6843 .tokens
6844 .get(self.index - 1)
6845 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6846 match keyword {
6847 Keyword::AUTHORIZATION => {
6848 if authorization_owner.is_some() {
6849 parser_err!("Found multiple AUTHORIZATION", loc)
6850 } else {
6851 authorization_owner = Some(self.parse_object_name(false)?);
6852 Ok(())
6853 }
6854 }
6855 Keyword::LOGIN | Keyword::NOLOGIN => {
6856 if login.is_some() {
6857 parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6858 } else {
6859 login = Some(keyword == Keyword::LOGIN);
6860 Ok(())
6861 }
6862 }
6863 Keyword::INHERIT | Keyword::NOINHERIT => {
6864 if inherit.is_some() {
6865 parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6866 } else {
6867 inherit = Some(keyword == Keyword::INHERIT);
6868 Ok(())
6869 }
6870 }
6871 Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6872 if bypassrls.is_some() {
6873 parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6874 } else {
6875 bypassrls = Some(keyword == Keyword::BYPASSRLS);
6876 Ok(())
6877 }
6878 }
6879 Keyword::CREATEDB | Keyword::NOCREATEDB => {
6880 if create_db.is_some() {
6881 parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6882 } else {
6883 create_db = Some(keyword == Keyword::CREATEDB);
6884 Ok(())
6885 }
6886 }
6887 Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6888 if create_role.is_some() {
6889 parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6890 } else {
6891 create_role = Some(keyword == Keyword::CREATEROLE);
6892 Ok(())
6893 }
6894 }
6895 Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6896 if superuser.is_some() {
6897 parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6898 } else {
6899 superuser = Some(keyword == Keyword::SUPERUSER);
6900 Ok(())
6901 }
6902 }
6903 Keyword::REPLICATION | Keyword::NOREPLICATION => {
6904 if replication.is_some() {
6905 parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6906 } else {
6907 replication = Some(keyword == Keyword::REPLICATION);
6908 Ok(())
6909 }
6910 }
6911 Keyword::PASSWORD => {
6912 if password.is_some() {
6913 parser_err!("Found multiple PASSWORD", loc)
6914 } else {
6915 password = if self.parse_keyword(Keyword::NULL) {
6916 Some(Password::NullPassword)
6917 } else {
6918 Some(Password::Password(Expr::Value(self.parse_value()?)))
6919 };
6920 Ok(())
6921 }
6922 }
6923 Keyword::CONNECTION => {
6924 self.expect_keyword_is(Keyword::LIMIT)?;
6925 if connection_limit.is_some() {
6926 parser_err!("Found multiple CONNECTION LIMIT", loc)
6927 } else {
6928 connection_limit = Some(Expr::Value(self.parse_number_value()?));
6929 Ok(())
6930 }
6931 }
6932 Keyword::VALID => {
6933 self.expect_keyword_is(Keyword::UNTIL)?;
6934 if valid_until.is_some() {
6935 parser_err!("Found multiple VALID UNTIL", loc)
6936 } else {
6937 valid_until = Some(Expr::Value(self.parse_value()?));
6938 Ok(())
6939 }
6940 }
6941 Keyword::IN => {
6942 if self.parse_keyword(Keyword::ROLE) {
6943 if !in_role.is_empty() {
6944 parser_err!("Found multiple IN ROLE", loc)
6945 } else {
6946 in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
6947 Ok(())
6948 }
6949 } else if self.parse_keyword(Keyword::GROUP) {
6950 if !in_group.is_empty() {
6951 parser_err!("Found multiple IN GROUP", loc)
6952 } else {
6953 in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
6954 Ok(())
6955 }
6956 } else {
6957 self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
6958 }
6959 }
6960 Keyword::ROLE => {
6961 if !role.is_empty() {
6962 parser_err!("Found multiple ROLE", loc)
6963 } else {
6964 role = self.parse_comma_separated(|p| p.parse_identifier())?;
6965 Ok(())
6966 }
6967 }
6968 Keyword::USER => {
6969 if !user.is_empty() {
6970 parser_err!("Found multiple USER", loc)
6971 } else {
6972 user = self.parse_comma_separated(|p| p.parse_identifier())?;
6973 Ok(())
6974 }
6975 }
6976 Keyword::ADMIN => {
6977 if !admin.is_empty() {
6978 parser_err!("Found multiple ADMIN", loc)
6979 } else {
6980 admin = self.parse_comma_separated(|p| p.parse_identifier())?;
6981 Ok(())
6982 }
6983 }
6984 _ => break,
6985 }?
6986 }
6987
6988 Ok(CreateRole {
6989 names,
6990 if_not_exists,
6991 login,
6992 inherit,
6993 bypassrls,
6994 password,
6995 create_db,
6996 create_role,
6997 replication,
6998 superuser,
6999 connection_limit,
7000 valid_until,
7001 in_role,
7002 in_group,
7003 role,
7004 user,
7005 admin,
7006 authorization_owner,
7007 })
7008 }
7009
7010 pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
7012 let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
7013 Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
7014 Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
7015 Some(Keyword::SESSION_USER) => Owner::SessionUser,
7016 Some(unexpected_keyword) => return Err(ParserError::ParserError(
7017 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
7018 )),
7019 None => {
7020 match self.parse_identifier() {
7021 Ok(ident) => Owner::Ident(ident),
7022 Err(e) => {
7023 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
7024 }
7025 }
7026 }
7027 };
7028 Ok(owner)
7029 }
7030
7031 fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
7033 let name = self.parse_object_name(false)?;
7034 self.expect_keyword_is(Keyword::AS)?;
7035 let data_type = self.parse_data_type()?;
7036 let collation = if self.parse_keyword(Keyword::COLLATE) {
7037 Some(self.parse_identifier()?)
7038 } else {
7039 None
7040 };
7041 let default = if self.parse_keyword(Keyword::DEFAULT) {
7042 Some(self.parse_expr()?)
7043 } else {
7044 None
7045 };
7046 let mut constraints = Vec::new();
7047 while let Some(constraint) = self.parse_optional_table_constraint()? {
7048 constraints.push(constraint);
7049 }
7050
7051 Ok(CreateDomain {
7052 name,
7053 data_type,
7054 collation,
7055 default,
7056 constraints,
7057 })
7058 }
7059
7060 pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
7070 let name = self.parse_identifier()?;
7071 self.expect_keyword_is(Keyword::ON)?;
7072 let table_name = self.parse_object_name(false)?;
7073
7074 let policy_type = if self.parse_keyword(Keyword::AS) {
7075 let keyword =
7076 self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
7077 Some(match keyword {
7078 Keyword::PERMISSIVE => CreatePolicyType::Permissive,
7079 Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
7080 unexpected_keyword => return Err(ParserError::ParserError(
7081 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
7082 )),
7083 })
7084 } else {
7085 None
7086 };
7087
7088 let command = if self.parse_keyword(Keyword::FOR) {
7089 let keyword = self.expect_one_of_keywords(&[
7090 Keyword::ALL,
7091 Keyword::SELECT,
7092 Keyword::INSERT,
7093 Keyword::UPDATE,
7094 Keyword::DELETE,
7095 ])?;
7096 Some(match keyword {
7097 Keyword::ALL => CreatePolicyCommand::All,
7098 Keyword::SELECT => CreatePolicyCommand::Select,
7099 Keyword::INSERT => CreatePolicyCommand::Insert,
7100 Keyword::UPDATE => CreatePolicyCommand::Update,
7101 Keyword::DELETE => CreatePolicyCommand::Delete,
7102 unexpected_keyword => return Err(ParserError::ParserError(
7103 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7104 )),
7105 })
7106 } else {
7107 None
7108 };
7109
7110 let to = if self.parse_keyword(Keyword::TO) {
7111 Some(self.parse_comma_separated(|p| p.parse_owner())?)
7112 } else {
7113 None
7114 };
7115
7116 let using = if self.parse_keyword(Keyword::USING) {
7117 self.expect_token(&Token::LParen)?;
7118 let expr = self.parse_expr()?;
7119 self.expect_token(&Token::RParen)?;
7120 Some(expr)
7121 } else {
7122 None
7123 };
7124
7125 let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7126 self.expect_token(&Token::LParen)?;
7127 let expr = self.parse_expr()?;
7128 self.expect_token(&Token::RParen)?;
7129 Some(expr)
7130 } else {
7131 None
7132 };
7133
7134 Ok(CreatePolicy {
7135 name,
7136 table_name,
7137 policy_type,
7138 command,
7139 to,
7140 using,
7141 with_check,
7142 })
7143 }
7144
7145 pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7155 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7156 let name = self.parse_identifier()?;
7157
7158 let connector_type = if self.parse_keyword(Keyword::TYPE) {
7159 Some(self.parse_literal_string()?)
7160 } else {
7161 None
7162 };
7163
7164 let url = if self.parse_keyword(Keyword::URL) {
7165 Some(self.parse_literal_string()?)
7166 } else {
7167 None
7168 };
7169
7170 let comment = self.parse_optional_inline_comment()?;
7171
7172 let with_dcproperties =
7173 match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7174 properties if !properties.is_empty() => Some(properties),
7175 _ => None,
7176 };
7177
7178 Ok(CreateConnector {
7179 name,
7180 if_not_exists,
7181 connector_type,
7182 url,
7183 comment,
7184 with_dcproperties,
7185 })
7186 }
7187
7188 fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7194 let mut parts = vec![];
7195 loop {
7196 if matches!(self.peek_token_ref().token, Token::EOF) {
7200 return self.expected("operator name", self.peek_token());
7201 }
7202 parts.push(ObjectNamePart::Identifier(Ident::new(
7203 self.next_token().to_string(),
7204 )));
7205 if !self.consume_token(&Token::Period) {
7206 break;
7207 }
7208 }
7209 Ok(ObjectName(parts))
7210 }
7211
7212 pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7216 let name = self.parse_operator_name()?;
7217 self.expect_token(&Token::LParen)?;
7218
7219 let mut function: Option<ObjectName> = None;
7220 let mut is_procedure = false;
7221 let mut left_arg: Option<DataType> = None;
7222 let mut right_arg: Option<DataType> = None;
7223 let mut options: Vec<OperatorOption> = Vec::new();
7224
7225 loop {
7226 let keyword = self.expect_one_of_keywords(&[
7227 Keyword::FUNCTION,
7228 Keyword::PROCEDURE,
7229 Keyword::LEFTARG,
7230 Keyword::RIGHTARG,
7231 Keyword::COMMUTATOR,
7232 Keyword::NEGATOR,
7233 Keyword::RESTRICT,
7234 Keyword::JOIN,
7235 Keyword::HASHES,
7236 Keyword::MERGES,
7237 ])?;
7238
7239 match keyword {
7240 Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7241 options.push(OperatorOption::Hashes);
7242 }
7243 Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7244 options.push(OperatorOption::Merges);
7245 }
7246 Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7247 self.expect_token(&Token::Eq)?;
7248 function = Some(self.parse_object_name(false)?);
7249 is_procedure = keyword == Keyword::PROCEDURE;
7250 }
7251 Keyword::LEFTARG if left_arg.is_none() => {
7252 self.expect_token(&Token::Eq)?;
7253 left_arg = Some(self.parse_data_type()?);
7254 }
7255 Keyword::RIGHTARG if right_arg.is_none() => {
7256 self.expect_token(&Token::Eq)?;
7257 right_arg = Some(self.parse_data_type()?);
7258 }
7259 Keyword::COMMUTATOR
7260 if !options
7261 .iter()
7262 .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7263 {
7264 self.expect_token(&Token::Eq)?;
7265 if self.parse_keyword(Keyword::OPERATOR) {
7266 self.expect_token(&Token::LParen)?;
7267 let op = self.parse_operator_name()?;
7268 self.expect_token(&Token::RParen)?;
7269 options.push(OperatorOption::Commutator(op));
7270 } else {
7271 options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7272 }
7273 }
7274 Keyword::NEGATOR
7275 if !options
7276 .iter()
7277 .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7278 {
7279 self.expect_token(&Token::Eq)?;
7280 if self.parse_keyword(Keyword::OPERATOR) {
7281 self.expect_token(&Token::LParen)?;
7282 let op = self.parse_operator_name()?;
7283 self.expect_token(&Token::RParen)?;
7284 options.push(OperatorOption::Negator(op));
7285 } else {
7286 options.push(OperatorOption::Negator(self.parse_operator_name()?));
7287 }
7288 }
7289 Keyword::RESTRICT
7290 if !options
7291 .iter()
7292 .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7293 {
7294 self.expect_token(&Token::Eq)?;
7295 options.push(OperatorOption::Restrict(Some(
7296 self.parse_object_name(false)?,
7297 )));
7298 }
7299 Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7300 self.expect_token(&Token::Eq)?;
7301 options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7302 }
7303 _ => {
7304 return Err(ParserError::ParserError(format!(
7305 "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7306 keyword
7307 )))
7308 }
7309 }
7310
7311 if !self.consume_token(&Token::Comma) {
7312 break;
7313 }
7314 }
7315
7316 self.expect_token(&Token::RParen)?;
7318
7319 let function = function.ok_or_else(|| {
7321 ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7322 })?;
7323
7324 Ok(CreateOperator {
7325 name,
7326 function,
7327 is_procedure,
7328 left_arg,
7329 right_arg,
7330 options,
7331 })
7332 }
7333
7334 pub fn parse_create_aggregate(
7338 &mut self,
7339 or_replace: bool,
7340 ) -> Result<CreateAggregate, ParserError> {
7341 let name = self.parse_object_name(false)?;
7342
7343 self.expect_token(&Token::LParen)?;
7345 let args = if self.consume_token(&Token::Mul) {
7346 vec![]
7348 } else if self.consume_token(&Token::RParen) {
7349 self.prev_token();
7350 vec![]
7351 } else {
7352 self.parse_comma_separated(|p| p.parse_data_type())?
7353 };
7354 self.expect_token(&Token::RParen)?;
7355
7356 self.expect_token(&Token::LParen)?;
7358 let mut options: Vec<CreateAggregateOption> = Vec::new();
7359 loop {
7360 let token = self.next_token();
7361 match &token.token {
7362 Token::RParen => break,
7363 Token::Comma => continue,
7364 Token::Word(word) => {
7365 let option = self.parse_create_aggregate_option(&word.value.to_uppercase())?;
7366 options.push(option);
7367 }
7368 other => {
7369 return Err(ParserError::ParserError(format!(
7370 "Unexpected token in CREATE AGGREGATE options: {other:?}"
7371 )));
7372 }
7373 }
7374 }
7375
7376 Ok(CreateAggregate {
7377 or_replace,
7378 name,
7379 args,
7380 options,
7381 })
7382 }
7383
7384 fn parse_create_aggregate_option(
7385 &mut self,
7386 key: &str,
7387 ) -> Result<CreateAggregateOption, ParserError> {
7388 match key {
7389 "SFUNC" => {
7390 self.expect_token(&Token::Eq)?;
7391 Ok(CreateAggregateOption::Sfunc(self.parse_object_name(false)?))
7392 }
7393 "STYPE" => {
7394 self.expect_token(&Token::Eq)?;
7395 Ok(CreateAggregateOption::Stype(self.parse_data_type()?))
7396 }
7397 "SSPACE" => {
7398 self.expect_token(&Token::Eq)?;
7399 let size = self.parse_literal_uint()?;
7400 Ok(CreateAggregateOption::Sspace(size))
7401 }
7402 "FINALFUNC" => {
7403 self.expect_token(&Token::Eq)?;
7404 Ok(CreateAggregateOption::Finalfunc(
7405 self.parse_object_name(false)?,
7406 ))
7407 }
7408 "FINALFUNC_EXTRA" => Ok(CreateAggregateOption::FinalfuncExtra),
7409 "FINALFUNC_MODIFY" => {
7410 self.expect_token(&Token::Eq)?;
7411 Ok(CreateAggregateOption::FinalfuncModify(
7412 self.parse_aggregate_modify_kind()?,
7413 ))
7414 }
7415 "COMBINEFUNC" => {
7416 self.expect_token(&Token::Eq)?;
7417 Ok(CreateAggregateOption::Combinefunc(
7418 self.parse_object_name(false)?,
7419 ))
7420 }
7421 "SERIALFUNC" => {
7422 self.expect_token(&Token::Eq)?;
7423 Ok(CreateAggregateOption::Serialfunc(
7424 self.parse_object_name(false)?,
7425 ))
7426 }
7427 "DESERIALFUNC" => {
7428 self.expect_token(&Token::Eq)?;
7429 Ok(CreateAggregateOption::Deserialfunc(
7430 self.parse_object_name(false)?,
7431 ))
7432 }
7433 "INITCOND" => {
7434 self.expect_token(&Token::Eq)?;
7435 Ok(CreateAggregateOption::Initcond(self.parse_value()?.value))
7436 }
7437 "MSFUNC" => {
7438 self.expect_token(&Token::Eq)?;
7439 Ok(CreateAggregateOption::Msfunc(
7440 self.parse_object_name(false)?,
7441 ))
7442 }
7443 "MINVFUNC" => {
7444 self.expect_token(&Token::Eq)?;
7445 Ok(CreateAggregateOption::Minvfunc(
7446 self.parse_object_name(false)?,
7447 ))
7448 }
7449 "MSTYPE" => {
7450 self.expect_token(&Token::Eq)?;
7451 Ok(CreateAggregateOption::Mstype(self.parse_data_type()?))
7452 }
7453 "MSSPACE" => {
7454 self.expect_token(&Token::Eq)?;
7455 let size = self.parse_literal_uint()?;
7456 Ok(CreateAggregateOption::Msspace(size))
7457 }
7458 "MFINALFUNC" => {
7459 self.expect_token(&Token::Eq)?;
7460 Ok(CreateAggregateOption::Mfinalfunc(
7461 self.parse_object_name(false)?,
7462 ))
7463 }
7464 "MFINALFUNC_EXTRA" => Ok(CreateAggregateOption::MfinalfuncExtra),
7465 "MFINALFUNC_MODIFY" => {
7466 self.expect_token(&Token::Eq)?;
7467 Ok(CreateAggregateOption::MfinalfuncModify(
7468 self.parse_aggregate_modify_kind()?,
7469 ))
7470 }
7471 "MINITCOND" => {
7472 self.expect_token(&Token::Eq)?;
7473 Ok(CreateAggregateOption::Minitcond(self.parse_value()?.value))
7474 }
7475 "SORTOP" => {
7476 self.expect_token(&Token::Eq)?;
7477 Ok(CreateAggregateOption::Sortop(
7478 self.parse_object_name(false)?,
7479 ))
7480 }
7481 "PARALLEL" => {
7482 self.expect_token(&Token::Eq)?;
7483 let parallel = match self.expect_one_of_keywords(&[
7484 Keyword::SAFE,
7485 Keyword::RESTRICTED,
7486 Keyword::UNSAFE,
7487 ])? {
7488 Keyword::SAFE => FunctionParallel::Safe,
7489 Keyword::RESTRICTED => FunctionParallel::Restricted,
7490 Keyword::UNSAFE => FunctionParallel::Unsafe,
7491 other => {
7492 return Err(ParserError::ParserError(format!(
7493 "Internal parser error: unexpected keyword `{other}` for PARALLEL"
7494 )))
7495 }
7496 };
7497 Ok(CreateAggregateOption::Parallel(parallel))
7498 }
7499 "HYPOTHETICAL" => Ok(CreateAggregateOption::Hypothetical),
7500 other => Err(ParserError::ParserError(format!(
7501 "Unknown CREATE AGGREGATE option: {other}"
7502 ))),
7503 }
7504 }
7505
7506 fn parse_aggregate_modify_kind(&mut self) -> Result<AggregateModifyKind, ParserError> {
7507 let token = self.next_token();
7508 match &token.token {
7509 Token::Word(word) => match word.value.to_uppercase().as_str() {
7510 "READ_ONLY" => Ok(AggregateModifyKind::ReadOnly),
7511 "SHAREABLE" => Ok(AggregateModifyKind::Shareable),
7512 "READ_WRITE" => Ok(AggregateModifyKind::ReadWrite),
7513 other => Err(ParserError::ParserError(format!(
7514 "Expected READ_ONLY, SHAREABLE, or READ_WRITE, got: {other}"
7515 ))),
7516 },
7517 other => Err(ParserError::ParserError(format!(
7518 "Expected READ_ONLY, SHAREABLE, or READ_WRITE, got: {other:?}"
7519 ))),
7520 }
7521 }
7522
7523 pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7527 let name = self.parse_object_name(false)?;
7528 self.expect_keyword(Keyword::USING)?;
7529 let using = self.parse_identifier()?;
7530
7531 Ok(CreateOperatorFamily { name, using })
7532 }
7533
7534 pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7538 let name = self.parse_object_name(false)?;
7539 let default = self.parse_keyword(Keyword::DEFAULT);
7540 self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7541 let for_type = self.parse_data_type()?;
7542 self.expect_keyword(Keyword::USING)?;
7543 let using = self.parse_identifier()?;
7544
7545 let family = if self.parse_keyword(Keyword::FAMILY) {
7546 Some(self.parse_object_name(false)?)
7547 } else {
7548 None
7549 };
7550
7551 self.expect_keyword(Keyword::AS)?;
7552
7553 let mut items = vec![];
7554 loop {
7555 if self.parse_keyword(Keyword::OPERATOR) {
7556 let strategy_number = self.parse_literal_uint()?;
7557 let operator_name = self.parse_operator_name()?;
7558
7559 let op_types = if self.consume_token(&Token::LParen) {
7561 let left = self.parse_data_type()?;
7562 self.expect_token(&Token::Comma)?;
7563 let right = self.parse_data_type()?;
7564 self.expect_token(&Token::RParen)?;
7565 Some(OperatorArgTypes { left, right })
7566 } else {
7567 None
7568 };
7569
7570 let purpose = if self.parse_keyword(Keyword::FOR) {
7572 if self.parse_keyword(Keyword::SEARCH) {
7573 Some(OperatorPurpose::ForSearch)
7574 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7575 let sort_family = self.parse_object_name(false)?;
7576 Some(OperatorPurpose::ForOrderBy { sort_family })
7577 } else {
7578 return self
7579 .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7580 }
7581 } else {
7582 None
7583 };
7584
7585 items.push(OperatorClassItem::Operator {
7586 strategy_number,
7587 operator_name,
7588 op_types,
7589 purpose,
7590 });
7591 } else if self.parse_keyword(Keyword::FUNCTION) {
7592 let support_number = self.parse_literal_uint()?;
7593
7594 let op_types = if self.consume_token(&Token::LParen)
7596 && self.peek_token_ref().token != Token::RParen
7597 {
7598 let mut types = vec![];
7599 loop {
7600 types.push(self.parse_data_type()?);
7601 if !self.consume_token(&Token::Comma) {
7602 break;
7603 }
7604 }
7605 self.expect_token(&Token::RParen)?;
7606 Some(types)
7607 } else if self.consume_token(&Token::LParen) {
7608 self.expect_token(&Token::RParen)?;
7609 Some(vec![])
7610 } else {
7611 None
7612 };
7613
7614 let function_name = self.parse_object_name(false)?;
7615
7616 let argument_types = if self.consume_token(&Token::LParen) {
7618 let mut types = vec![];
7619 loop {
7620 if self.peek_token_ref().token == Token::RParen {
7621 break;
7622 }
7623 types.push(self.parse_data_type()?);
7624 if !self.consume_token(&Token::Comma) {
7625 break;
7626 }
7627 }
7628 self.expect_token(&Token::RParen)?;
7629 types
7630 } else {
7631 vec![]
7632 };
7633
7634 items.push(OperatorClassItem::Function {
7635 support_number,
7636 op_types,
7637 function_name,
7638 argument_types,
7639 });
7640 } else if self.parse_keyword(Keyword::STORAGE) {
7641 let storage_type = self.parse_data_type()?;
7642 items.push(OperatorClassItem::Storage { storage_type });
7643 } else {
7644 break;
7645 }
7646
7647 if !self.consume_token(&Token::Comma) {
7649 break;
7650 }
7651 }
7652
7653 Ok(CreateOperatorClass {
7654 name,
7655 default,
7656 for_type,
7657 using,
7658 family,
7659 items,
7660 })
7661 }
7662
7663 pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7665 let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7667 && self.parse_keyword(Keyword::TEMPORARY);
7668 let persistent = dialect_of!(self is DuckDbDialect)
7669 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7670
7671 let object_type = if self.parse_keyword(Keyword::TABLE) {
7672 ObjectType::Table
7673 } else if self.parse_keyword(Keyword::COLLATION) {
7674 ObjectType::Collation
7675 } else if self.parse_keyword(Keyword::VIEW) {
7676 ObjectType::View
7677 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7678 ObjectType::MaterializedView
7679 } else if self.parse_keyword(Keyword::INDEX) {
7680 ObjectType::Index
7681 } else if self.parse_keyword(Keyword::ROLE) {
7682 ObjectType::Role
7683 } else if self.parse_keyword(Keyword::SCHEMA) {
7684 ObjectType::Schema
7685 } else if self.parse_keyword(Keyword::DATABASE) {
7686 ObjectType::Database
7687 } else if self.parse_keyword(Keyword::SEQUENCE) {
7688 ObjectType::Sequence
7689 } else if self.parse_keyword(Keyword::STAGE) {
7690 ObjectType::Stage
7691 } else if self.parse_keyword(Keyword::TYPE) {
7692 ObjectType::Type
7693 } else if self.parse_keyword(Keyword::USER) {
7694 ObjectType::User
7695 } else if self.parse_keyword(Keyword::STREAM) {
7696 ObjectType::Stream
7697 } else if self.parse_keyword(Keyword::FUNCTION) {
7698 return self.parse_drop_function().map(Into::into);
7699 } else if self.parse_keyword(Keyword::POLICY) {
7700 return self.parse_drop_policy().map(Into::into);
7701 } else if self.parse_keyword(Keyword::CONNECTOR) {
7702 return self.parse_drop_connector();
7703 } else if self.parse_keyword(Keyword::DOMAIN) {
7704 return self.parse_drop_domain().map(Into::into);
7705 } else if self.parse_keyword(Keyword::PROCEDURE) {
7706 return self.parse_drop_procedure();
7707 } else if self.parse_keyword(Keyword::SECRET) {
7708 return self.parse_drop_secret(temporary, persistent);
7709 } else if self.parse_keyword(Keyword::TRIGGER) {
7710 return self.parse_drop_trigger().map(Into::into);
7711 } else if self.parse_keyword(Keyword::EXTENSION) {
7712 return self.parse_drop_extension();
7713 } else if self.parse_keyword(Keyword::OPERATOR) {
7714 return if self.parse_keyword(Keyword::FAMILY) {
7716 self.parse_drop_operator_family()
7717 } else if self.parse_keyword(Keyword::CLASS) {
7718 self.parse_drop_operator_class()
7719 } else {
7720 self.parse_drop_operator()
7721 };
7722 } else {
7723 return self.expected_ref(
7724 "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7725 self.peek_token_ref(),
7726 );
7727 };
7728 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7731 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7732
7733 let loc = self.peek_token_ref().span.start;
7734 let cascade = self.parse_keyword(Keyword::CASCADE);
7735 let restrict = self.parse_keyword(Keyword::RESTRICT);
7736 let purge = self.parse_keyword(Keyword::PURGE);
7737 if cascade && restrict {
7738 return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7739 }
7740 if object_type == ObjectType::Role && (cascade || restrict || purge) {
7741 return parser_err!(
7742 "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7743 loc
7744 );
7745 }
7746 let table = if self.parse_keyword(Keyword::ON) {
7747 Some(self.parse_object_name(false)?)
7748 } else {
7749 None
7750 };
7751 Ok(Statement::Drop {
7752 object_type,
7753 if_exists,
7754 names,
7755 cascade,
7756 restrict,
7757 purge,
7758 temporary,
7759 table,
7760 })
7761 }
7762
7763 fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7764 match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7765 Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7766 Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7767 _ => None,
7768 }
7769 }
7770
7771 fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7776 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7777 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7778 let drop_behavior = self.parse_optional_drop_behavior();
7779 Ok(DropFunction {
7780 if_exists,
7781 func_desc,
7782 drop_behavior,
7783 })
7784 }
7785
7786 fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7792 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7793 let name = self.parse_identifier()?;
7794 self.expect_keyword_is(Keyword::ON)?;
7795 let table_name = self.parse_object_name(false)?;
7796 let drop_behavior = self.parse_optional_drop_behavior();
7797 Ok(DropPolicy {
7798 if_exists,
7799 name,
7800 table_name,
7801 drop_behavior,
7802 })
7803 }
7804 fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7810 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7811 let name = self.parse_identifier()?;
7812 Ok(Statement::DropConnector { if_exists, name })
7813 }
7814
7815 fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7819 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7820 let name = self.parse_object_name(false)?;
7821 let drop_behavior = self.parse_optional_drop_behavior();
7822 Ok(DropDomain {
7823 if_exists,
7824 name,
7825 drop_behavior,
7826 })
7827 }
7828
7829 fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7834 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7835 let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7836 let drop_behavior = self.parse_optional_drop_behavior();
7837 Ok(Statement::DropProcedure {
7838 if_exists,
7839 proc_desc,
7840 drop_behavior,
7841 })
7842 }
7843
7844 fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7845 let name = self.parse_object_name(false)?;
7846
7847 let args = if self.consume_token(&Token::LParen) {
7848 if self.consume_token(&Token::RParen) {
7849 Some(vec![])
7850 } else {
7851 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7852 self.expect_token(&Token::RParen)?;
7853 Some(args)
7854 }
7855 } else {
7856 None
7857 };
7858
7859 Ok(FunctionDesc { name, args })
7860 }
7861
7862 fn parse_drop_secret(
7864 &mut self,
7865 temporary: bool,
7866 persistent: bool,
7867 ) -> Result<Statement, ParserError> {
7868 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7869 let name = self.parse_identifier()?;
7870 let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7871 self.parse_identifier().ok()
7872 } else {
7873 None
7874 };
7875 let temp = match (temporary, persistent) {
7876 (true, false) => Some(true),
7877 (false, true) => Some(false),
7878 (false, false) => None,
7879 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7880 };
7881
7882 Ok(Statement::DropSecret {
7883 if_exists,
7884 temporary: temp,
7885 name,
7886 storage_specifier,
7887 })
7888 }
7889
7890 pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7900 if dialect_of!(self is BigQueryDialect) {
7901 return self.parse_big_query_declare();
7902 }
7903 if dialect_of!(self is SnowflakeDialect) {
7904 return self.parse_snowflake_declare();
7905 }
7906 if dialect_of!(self is MsSqlDialect) {
7907 return self.parse_mssql_declare();
7908 }
7909
7910 let name = self.parse_identifier()?;
7911
7912 let binary = Some(self.parse_keyword(Keyword::BINARY));
7913 let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7914 Some(true)
7915 } else if self.parse_keyword(Keyword::ASENSITIVE) {
7916 Some(false)
7917 } else {
7918 None
7919 };
7920 let scroll = if self.parse_keyword(Keyword::SCROLL) {
7921 Some(true)
7922 } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7923 Some(false)
7924 } else {
7925 None
7926 };
7927
7928 self.expect_keyword_is(Keyword::CURSOR)?;
7929 let declare_type = Some(DeclareType::Cursor);
7930
7931 let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7932 Some(keyword) => {
7933 self.expect_keyword_is(Keyword::HOLD)?;
7934
7935 match keyword {
7936 Keyword::WITH => Some(true),
7937 Keyword::WITHOUT => Some(false),
7938 unexpected_keyword => return Err(ParserError::ParserError(
7939 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7940 )),
7941 }
7942 }
7943 None => None,
7944 };
7945
7946 self.expect_keyword_is(Keyword::FOR)?;
7947
7948 let query = Some(self.parse_query()?);
7949
7950 Ok(Statement::Declare {
7951 stmts: vec![Declare {
7952 names: vec![name],
7953 data_type: None,
7954 assignment: None,
7955 declare_type,
7956 binary,
7957 sensitive,
7958 scroll,
7959 hold,
7960 for_query: query,
7961 }],
7962 })
7963 }
7964
7965 pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7973 let names = self.parse_comma_separated(Parser::parse_identifier)?;
7974
7975 let data_type = match &self.peek_token_ref().token {
7976 Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7977 _ => Some(self.parse_data_type()?),
7978 };
7979
7980 let expr = if data_type.is_some() {
7981 if self.parse_keyword(Keyword::DEFAULT) {
7982 Some(self.parse_expr()?)
7983 } else {
7984 None
7985 }
7986 } else {
7987 self.expect_keyword_is(Keyword::DEFAULT)?;
7990 Some(self.parse_expr()?)
7991 };
7992
7993 Ok(Statement::Declare {
7994 stmts: vec![Declare {
7995 names,
7996 data_type,
7997 assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7998 declare_type: None,
7999 binary: None,
8000 sensitive: None,
8001 scroll: None,
8002 hold: None,
8003 for_query: None,
8004 }],
8005 })
8006 }
8007
8008 pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
8033 let mut stmts = vec![];
8034 loop {
8035 let name = self.parse_identifier()?;
8036 let (declare_type, for_query, assigned_expr, data_type) =
8037 if self.parse_keyword(Keyword::CURSOR) {
8038 self.expect_keyword_is(Keyword::FOR)?;
8039 match &self.peek_token_ref().token {
8040 Token::Word(w) if w.keyword == Keyword::SELECT => (
8041 Some(DeclareType::Cursor),
8042 Some(self.parse_query()?),
8043 None,
8044 None,
8045 ),
8046 _ => (
8047 Some(DeclareType::Cursor),
8048 None,
8049 Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
8050 None,
8051 ),
8052 }
8053 } else if self.parse_keyword(Keyword::RESULTSET) {
8054 let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
8055 self.parse_snowflake_variable_declaration_expression()?
8056 } else {
8057 None
8059 };
8060
8061 (Some(DeclareType::ResultSet), None, assigned_expr, None)
8062 } else if self.parse_keyword(Keyword::EXCEPTION) {
8063 let assigned_expr = if self.peek_token_ref().token == Token::LParen {
8064 Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
8065 } else {
8066 None
8068 };
8069
8070 (Some(DeclareType::Exception), None, assigned_expr, None)
8071 } else {
8072 let (assigned_expr, data_type) = if let Some(assigned_expr) =
8074 self.parse_snowflake_variable_declaration_expression()?
8075 {
8076 (Some(assigned_expr), None)
8077 } else if let Token::Word(_) = &self.peek_token_ref().token {
8078 let data_type = self.parse_data_type()?;
8079 (
8080 self.parse_snowflake_variable_declaration_expression()?,
8081 Some(data_type),
8082 )
8083 } else {
8084 (None, None)
8085 };
8086 (None, None, assigned_expr, data_type)
8087 };
8088 let stmt = Declare {
8089 names: vec![name],
8090 data_type,
8091 assignment: assigned_expr,
8092 declare_type,
8093 binary: None,
8094 sensitive: None,
8095 scroll: None,
8096 hold: None,
8097 for_query,
8098 };
8099
8100 stmts.push(stmt);
8101 if self.consume_token(&Token::SemiColon) {
8102 match &self.peek_token_ref().token {
8103 Token::Word(w)
8104 if ALL_KEYWORDS
8105 .binary_search(&w.value.to_uppercase().as_str())
8106 .is_err() =>
8107 {
8108 continue;
8110 }
8111 _ => {
8112 self.prev_token();
8114 }
8115 }
8116 }
8117
8118 break;
8119 }
8120
8121 Ok(Statement::Declare { stmts })
8122 }
8123
8124 pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
8136 let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
8137
8138 Ok(Statement::Declare { stmts })
8139 }
8140
8141 pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
8152 let name = {
8153 let ident = self.parse_identifier()?;
8154 if !ident.value.starts_with('@')
8155 && !matches!(
8156 &self.peek_token_ref().token,
8157 Token::Word(w) if w.keyword == Keyword::CURSOR
8158 )
8159 {
8160 Err(ParserError::TokenizerError(
8161 "Invalid MsSql variable declaration.".to_string(),
8162 ))
8163 } else {
8164 Ok(ident)
8165 }
8166 }?;
8167
8168 let (declare_type, data_type) = match &self.peek_token_ref().token {
8169 Token::Word(w) => match w.keyword {
8170 Keyword::CURSOR => {
8171 self.next_token();
8172 (Some(DeclareType::Cursor), None)
8173 }
8174 Keyword::AS => {
8175 self.next_token();
8176 (None, Some(self.parse_data_type()?))
8177 }
8178 _ => (None, Some(self.parse_data_type()?)),
8179 },
8180 _ => (None, Some(self.parse_data_type()?)),
8181 };
8182
8183 let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
8184 self.next_token();
8185 let query = Some(self.parse_query()?);
8186 (query, None)
8187 } else {
8188 let assignment = self.parse_mssql_variable_declaration_expression()?;
8189 (None, assignment)
8190 };
8191
8192 Ok(Declare {
8193 names: vec![name],
8194 data_type,
8195 assignment,
8196 declare_type,
8197 binary: None,
8198 sensitive: None,
8199 scroll: None,
8200 hold: None,
8201 for_query,
8202 })
8203 }
8204
8205 pub fn parse_snowflake_variable_declaration_expression(
8213 &mut self,
8214 ) -> Result<Option<DeclareAssignment>, ParserError> {
8215 Ok(match &self.peek_token_ref().token {
8216 Token::Word(w) if w.keyword == Keyword::DEFAULT => {
8217 self.next_token(); Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
8219 }
8220 Token::Assignment => {
8221 self.next_token(); Some(DeclareAssignment::DuckAssignment(Box::new(
8223 self.parse_expr()?,
8224 )))
8225 }
8226 _ => None,
8227 })
8228 }
8229
8230 pub fn parse_mssql_variable_declaration_expression(
8237 &mut self,
8238 ) -> Result<Option<DeclareAssignment>, ParserError> {
8239 Ok(match &self.peek_token_ref().token {
8240 Token::Eq => {
8241 self.next_token(); Some(DeclareAssignment::MsSqlAssignment(Box::new(
8243 self.parse_expr()?,
8244 )))
8245 }
8246 _ => None,
8247 })
8248 }
8249
8250 pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
8252 let direction = if self.parse_keyword(Keyword::NEXT) {
8253 FetchDirection::Next
8254 } else if self.parse_keyword(Keyword::PRIOR) {
8255 FetchDirection::Prior
8256 } else if self.parse_keyword(Keyword::FIRST) {
8257 FetchDirection::First
8258 } else if self.parse_keyword(Keyword::LAST) {
8259 FetchDirection::Last
8260 } else if self.parse_keyword(Keyword::ABSOLUTE) {
8261 FetchDirection::Absolute {
8262 limit: self.parse_number_value()?,
8263 }
8264 } else if self.parse_keyword(Keyword::RELATIVE) {
8265 FetchDirection::Relative {
8266 limit: self.parse_number_value()?,
8267 }
8268 } else if self.parse_keyword(Keyword::FORWARD) {
8269 if self.parse_keyword(Keyword::ALL) {
8270 FetchDirection::ForwardAll
8271 } else {
8272 FetchDirection::Forward {
8273 limit: Some(self.parse_number_value()?),
8275 }
8276 }
8277 } else if self.parse_keyword(Keyword::BACKWARD) {
8278 if self.parse_keyword(Keyword::ALL) {
8279 FetchDirection::BackwardAll
8280 } else {
8281 FetchDirection::Backward {
8282 limit: Some(self.parse_number_value()?),
8284 }
8285 }
8286 } else if self.parse_keyword(Keyword::ALL) {
8287 FetchDirection::All
8288 } else {
8289 FetchDirection::Count {
8290 limit: self.parse_number_value()?,
8291 }
8292 };
8293
8294 let position = if self.peek_keyword(Keyword::FROM) {
8295 self.expect_keyword(Keyword::FROM)?;
8296 FetchPosition::From
8297 } else if self.peek_keyword(Keyword::IN) {
8298 self.expect_keyword(Keyword::IN)?;
8299 FetchPosition::In
8300 } else {
8301 return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8302 };
8303
8304 let name = self.parse_identifier()?;
8305
8306 let into = if self.parse_keyword(Keyword::INTO) {
8307 Some(self.parse_object_name(false)?)
8308 } else {
8309 None
8310 };
8311
8312 Ok(Statement::Fetch {
8313 name,
8314 direction,
8315 position,
8316 into,
8317 })
8318 }
8319
8320 pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8322 let object_type = if self.parse_keyword(Keyword::ALL) {
8323 DiscardObject::ALL
8324 } else if self.parse_keyword(Keyword::PLANS) {
8325 DiscardObject::PLANS
8326 } else if self.parse_keyword(Keyword::SEQUENCES) {
8327 DiscardObject::SEQUENCES
8328 } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8329 DiscardObject::TEMP
8330 } else {
8331 return self.expected_ref(
8332 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8333 self.peek_token_ref(),
8334 );
8335 };
8336 Ok(Statement::Discard { object_type })
8337 }
8338
8339 pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8341 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8342 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8343
8344 let mut using = None;
8345
8346 let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8347 let index_name = self.parse_object_name(false)?;
8348 using = self.parse_optional_using_then_index_type()?;
8350 self.expect_keyword_is(Keyword::ON)?;
8351 Some(index_name)
8352 } else {
8353 None
8354 };
8355
8356 let table_name = self.parse_object_name(false)?;
8357
8358 using = self.parse_optional_using_then_index_type()?.or(using);
8361
8362 let columns = self.parse_parenthesized_index_column_list()?;
8363
8364 let include = if self.parse_keyword(Keyword::INCLUDE) {
8365 self.expect_token(&Token::LParen)?;
8366 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8367 self.expect_token(&Token::RParen)?;
8368 columns
8369 } else {
8370 vec![]
8371 };
8372
8373 let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8374 let not = self.parse_keyword(Keyword::NOT);
8375 self.expect_keyword_is(Keyword::DISTINCT)?;
8376 Some(!not)
8377 } else {
8378 None
8379 };
8380
8381 let with = if self.dialect.supports_create_index_with_clause()
8382 && self.parse_keyword(Keyword::WITH)
8383 {
8384 self.expect_token(&Token::LParen)?;
8385 let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8386 self.expect_token(&Token::RParen)?;
8387 with_params
8388 } else {
8389 Vec::new()
8390 };
8391
8392 let predicate = if self.parse_keyword(Keyword::WHERE) {
8393 Some(self.parse_expr()?)
8394 } else {
8395 None
8396 };
8397
8398 let index_options = self.parse_index_options()?;
8404
8405 let mut alter_options = Vec::new();
8407 while self
8408 .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8409 .is_some()
8410 {
8411 alter_options.push(self.parse_alter_table_operation()?)
8412 }
8413
8414 Ok(CreateIndex {
8415 name: index_name,
8416 table_name,
8417 using,
8418 columns,
8419 unique,
8420 concurrently,
8421 if_not_exists,
8422 include,
8423 nulls_distinct,
8424 with,
8425 predicate,
8426 index_options,
8427 alter_options,
8428 })
8429 }
8430
8431 pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8433 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8434 let name = self.parse_identifier()?;
8435
8436 let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8437 let schema = if self.parse_keyword(Keyword::SCHEMA) {
8438 Some(self.parse_identifier()?)
8439 } else {
8440 None
8441 };
8442
8443 let version = if self.parse_keyword(Keyword::VERSION) {
8444 Some(self.parse_identifier()?)
8445 } else {
8446 None
8447 };
8448
8449 let cascade = self.parse_keyword(Keyword::CASCADE);
8450
8451 (schema, version, cascade)
8452 } else {
8453 (None, None, false)
8454 };
8455
8456 Ok(CreateExtension {
8457 name,
8458 if_not_exists,
8459 schema,
8460 version,
8461 cascade,
8462 })
8463 }
8464
8465 pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8467 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8468 let name = self.parse_object_name(false)?;
8469
8470 let definition = if self.parse_keyword(Keyword::FROM) {
8471 CreateCollationDefinition::From(self.parse_object_name(false)?)
8472 } else if self.consume_token(&Token::LParen) {
8473 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8474 self.expect_token(&Token::RParen)?;
8475 CreateCollationDefinition::Options(options)
8476 } else {
8477 return self.expected_ref(
8478 "FROM or parenthesized option list after CREATE COLLATION name",
8479 self.peek_token_ref(),
8480 );
8481 };
8482
8483 Ok(CreateCollation {
8484 if_not_exists,
8485 name,
8486 definition,
8487 })
8488 }
8489
8490 pub fn parse_create_text_search(&mut self) -> Result<Statement, ParserError> {
8492 if self.parse_keyword(Keyword::CONFIGURATION) {
8493 let name = self.parse_object_name(false)?;
8494 self.expect_token(&Token::LParen)?;
8495 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8496 self.expect_token(&Token::RParen)?;
8497 Ok(Statement::CreateTextSearchConfiguration(
8498 CreateTextSearchConfiguration { name, options },
8499 ))
8500 } else if self.parse_keyword(Keyword::DICTIONARY) {
8501 let name = self.parse_object_name(false)?;
8502 self.expect_token(&Token::LParen)?;
8503 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8504 self.expect_token(&Token::RParen)?;
8505 Ok(Statement::CreateTextSearchDictionary(
8506 CreateTextSearchDictionary { name, options },
8507 ))
8508 } else if self.parse_keyword(Keyword::PARSER) {
8509 let name = self.parse_object_name(false)?;
8510 self.expect_token(&Token::LParen)?;
8511 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8512 self.expect_token(&Token::RParen)?;
8513 Ok(Statement::CreateTextSearchParser(CreateTextSearchParser {
8514 name,
8515 options,
8516 }))
8517 } else if self.parse_keyword(Keyword::TEMPLATE) {
8518 let name = self.parse_object_name(false)?;
8519 self.expect_token(&Token::LParen)?;
8520 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8521 self.expect_token(&Token::RParen)?;
8522 Ok(Statement::CreateTextSearchTemplate(
8523 CreateTextSearchTemplate { name, options },
8524 ))
8525 } else {
8526 self.expected_ref(
8527 "CONFIGURATION, DICTIONARY, PARSER, or TEMPLATE after CREATE TEXT SEARCH",
8528 self.peek_token_ref(),
8529 )
8530 }
8531 }
8532
8533 pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8535 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8536 let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8537 let cascade_or_restrict =
8538 self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8539 Ok(Statement::DropExtension(DropExtension {
8540 names,
8541 if_exists,
8542 cascade_or_restrict: cascade_or_restrict
8543 .map(|k| match k {
8544 Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8545 Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8546 _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8547 })
8548 .transpose()?,
8549 }))
8550 }
8551
8552 pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8555 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8556 let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8557 let drop_behavior = self.parse_optional_drop_behavior();
8558 Ok(Statement::DropOperator(DropOperator {
8559 if_exists,
8560 operators,
8561 drop_behavior,
8562 }))
8563 }
8564
8565 fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8568 let name = self.parse_operator_name()?;
8569 self.expect_token(&Token::LParen)?;
8570 let left_type = self.parse_operator_arg_type_or_none()?;
8571 self.expect_token(&Token::Comma)?;
8572 let right_type = self.parse_data_type()?;
8573 self.expect_token(&Token::RParen)?;
8574
8575 Ok(DropOperatorSignature {
8576 name,
8577 left_type,
8578 right_type,
8579 })
8580 }
8581
8582 fn parse_operator_arg_type_or_none(&mut self) -> Result<Option<DataType>, ParserError> {
8585 if self.parse_keyword(Keyword::NONE) {
8586 Ok(None)
8587 } else {
8588 Ok(Some(self.parse_data_type()?))
8589 }
8590 }
8591
8592 pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8596 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8597 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8598 self.expect_keyword(Keyword::USING)?;
8599 let using = self.parse_identifier()?;
8600 let drop_behavior = self.parse_optional_drop_behavior();
8601 Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8602 if_exists,
8603 names,
8604 using,
8605 drop_behavior,
8606 }))
8607 }
8608
8609 pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8613 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8614 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8615 self.expect_keyword(Keyword::USING)?;
8616 let using = self.parse_identifier()?;
8617 let drop_behavior = self.parse_optional_drop_behavior();
8618 Ok(Statement::DropOperatorClass(DropOperatorClass {
8619 if_exists,
8620 names,
8621 using,
8622 drop_behavior,
8623 }))
8624 }
8625
8626 pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8630 if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8631 self.expect_token(&Token::LParen)?;
8632 let columns =
8633 self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8634 self.expect_token(&Token::RParen)?;
8635 Ok(HiveDistributionStyle::PARTITIONED { columns })
8636 } else {
8637 Ok(HiveDistributionStyle::NONE)
8638 }
8639 }
8640
8641 fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8645 let token = self.next_token();
8646 match &token.token {
8647 Token::Word(w) => match w.keyword {
8648 Keyword::AUTO => Ok(DistStyle::Auto),
8649 Keyword::EVEN => Ok(DistStyle::Even),
8650 Keyword::KEY => Ok(DistStyle::Key),
8651 Keyword::ALL => Ok(DistStyle::All),
8652 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8653 },
8654 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8655 }
8656 }
8657
8658 pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8660 let mut hive_format: Option<HiveFormat> = None;
8661 loop {
8662 match self.parse_one_of_keywords(&[
8663 Keyword::ROW,
8664 Keyword::STORED,
8665 Keyword::LOCATION,
8666 Keyword::WITH,
8667 ]) {
8668 Some(Keyword::ROW) => {
8669 hive_format
8670 .get_or_insert_with(HiveFormat::default)
8671 .row_format = Some(self.parse_row_format()?);
8672 }
8673 Some(Keyword::STORED) => {
8674 self.expect_keyword_is(Keyword::AS)?;
8675 if self.parse_keyword(Keyword::INPUTFORMAT) {
8676 let input_format = self.parse_expr()?;
8677 self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8678 let output_format = self.parse_expr()?;
8679 hive_format.get_or_insert_with(HiveFormat::default).storage =
8680 Some(HiveIOFormat::IOF {
8681 input_format,
8682 output_format,
8683 });
8684 } else {
8685 let format = self.parse_file_format()?;
8686 hive_format.get_or_insert_with(HiveFormat::default).storage =
8687 Some(HiveIOFormat::FileFormat { format });
8688 }
8689 }
8690 Some(Keyword::LOCATION) => {
8691 hive_format.get_or_insert_with(HiveFormat::default).location =
8692 Some(self.parse_literal_string()?);
8693 }
8694 Some(Keyword::WITH) => {
8695 self.prev_token();
8696 let properties = self
8697 .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8698 if !properties.is_empty() {
8699 hive_format
8700 .get_or_insert_with(HiveFormat::default)
8701 .serde_properties = Some(properties);
8702 } else {
8703 break;
8704 }
8705 }
8706 None => break,
8707 _ => break,
8708 }
8709 }
8710
8711 Ok(hive_format)
8712 }
8713
8714 pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8716 self.expect_keyword_is(Keyword::FORMAT)?;
8717 match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8718 Some(Keyword::SERDE) => {
8719 let class = self.parse_literal_string()?;
8720 Ok(HiveRowFormat::SERDE { class })
8721 }
8722 _ => {
8723 let mut row_delimiters = vec![];
8724
8725 loop {
8726 match self.parse_one_of_keywords(&[
8727 Keyword::FIELDS,
8728 Keyword::COLLECTION,
8729 Keyword::MAP,
8730 Keyword::LINES,
8731 Keyword::NULL,
8732 ]) {
8733 Some(Keyword::FIELDS)
8734 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8735 {
8736 row_delimiters.push(HiveRowDelimiter {
8737 delimiter: HiveDelimiter::FieldsTerminatedBy,
8738 char: self.parse_identifier()?,
8739 });
8740
8741 if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8742 row_delimiters.push(HiveRowDelimiter {
8743 delimiter: HiveDelimiter::FieldsEscapedBy,
8744 char: self.parse_identifier()?,
8745 });
8746 }
8747 }
8748 Some(Keyword::COLLECTION)
8749 if self.parse_keywords(&[
8750 Keyword::ITEMS,
8751 Keyword::TERMINATED,
8752 Keyword::BY,
8753 ]) =>
8754 {
8755 row_delimiters.push(HiveRowDelimiter {
8756 delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8757 char: self.parse_identifier()?,
8758 });
8759 }
8760 Some(Keyword::MAP)
8761 if self.parse_keywords(&[
8762 Keyword::KEYS,
8763 Keyword::TERMINATED,
8764 Keyword::BY,
8765 ]) =>
8766 {
8767 row_delimiters.push(HiveRowDelimiter {
8768 delimiter: HiveDelimiter::MapKeysTerminatedBy,
8769 char: self.parse_identifier()?,
8770 });
8771 }
8772 Some(Keyword::LINES)
8773 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8774 {
8775 row_delimiters.push(HiveRowDelimiter {
8776 delimiter: HiveDelimiter::LinesTerminatedBy,
8777 char: self.parse_identifier()?,
8778 });
8779 }
8780 Some(Keyword::NULL)
8781 if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8782 {
8783 row_delimiters.push(HiveRowDelimiter {
8784 delimiter: HiveDelimiter::NullDefinedAs,
8785 char: self.parse_identifier()?,
8786 });
8787 }
8788 _ => {
8789 break;
8790 }
8791 }
8792 }
8793
8794 Ok(HiveRowFormat::DELIMITED {
8795 delimiters: row_delimiters,
8796 })
8797 }
8798 }
8799 }
8800
8801 fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8802 if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8803 Ok(Some(self.parse_identifier()?))
8804 } else {
8805 Ok(None)
8806 }
8807 }
8808
8809 pub fn parse_create_table(
8811 &mut self,
8812 or_replace: bool,
8813 temporary: bool,
8814 global: Option<bool>,
8815 transient: bool,
8816 ) -> Result<CreateTable, ParserError> {
8817 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8818 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8819 let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8820
8821 let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8831 Some(self.parse_object_name(allow_unquoted_hyphen)?)
8832 } else {
8833 None
8834 };
8835
8836 let on_cluster = self.parse_optional_on_cluster()?;
8838
8839 let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8840
8841 let clone = if self.parse_keyword(Keyword::CLONE) {
8842 self.parse_object_name(allow_unquoted_hyphen).ok()
8843 } else {
8844 None
8845 };
8846
8847 let (columns, constraints) = self.parse_columns()?;
8849 let comment_after_column_def =
8850 if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8851 let next_token = self.next_token();
8852 match next_token.token {
8853 Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8854 _ => self.expected("comment", next_token)?,
8855 }
8856 } else {
8857 None
8858 };
8859
8860 let for_values = if partition_of.is_some() {
8862 if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8863 Some(self.parse_partition_for_values()?)
8864 } else {
8865 return self.expected_ref(
8866 "FOR VALUES or DEFAULT after PARTITION OF",
8867 self.peek_token_ref(),
8868 );
8869 }
8870 } else {
8871 None
8872 };
8873
8874 let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8876
8877 let hive_distribution = self.parse_hive_distribution()?;
8878 let clustered_by = self.parse_optional_clustered_by()?;
8879 let hive_formats = self.parse_hive_formats()?;
8880
8881 let create_table_config = self.parse_optional_create_table_config()?;
8882
8883 let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8886 && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8887 {
8888 Some(Box::new(self.parse_expr()?))
8889 } else {
8890 None
8891 };
8892
8893 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8894 if self.consume_token(&Token::LParen) {
8895 let columns = if self.peek_token_ref().token != Token::RParen {
8896 self.parse_comma_separated(|p| p.parse_expr())?
8897 } else {
8898 vec![]
8899 };
8900 self.expect_token(&Token::RParen)?;
8901 Some(OneOrManyWithParens::Many(columns))
8902 } else {
8903 Some(OneOrManyWithParens::One(self.parse_expr()?))
8904 }
8905 } else {
8906 None
8907 };
8908
8909 let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8910 Some(self.parse_create_table_on_commit()?)
8911 } else {
8912 None
8913 };
8914
8915 let strict = self.parse_keyword(Keyword::STRICT);
8916
8917 let backup = if self.parse_keyword(Keyword::BACKUP) {
8919 let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8920 Some(keyword == Keyword::YES)
8921 } else {
8922 None
8923 };
8924
8925 let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8927 Some(self.parse_dist_style()?)
8928 } else {
8929 None
8930 };
8931 let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8932 self.expect_token(&Token::LParen)?;
8933 let expr = self.parse_expr()?;
8934 self.expect_token(&Token::RParen)?;
8935 Some(expr)
8936 } else {
8937 None
8938 };
8939 let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8940 self.expect_token(&Token::LParen)?;
8941 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8942 self.expect_token(&Token::RParen)?;
8943 Some(columns)
8944 } else {
8945 None
8946 };
8947
8948 let query = if self.parse_keyword(Keyword::AS) {
8950 Some(self.parse_query()?)
8951 } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8952 {
8953 self.prev_token();
8955 Some(self.parse_query()?)
8956 } else {
8957 None
8958 };
8959
8960 Ok(CreateTableBuilder::new(table_name)
8961 .temporary(temporary)
8962 .columns(columns)
8963 .constraints(constraints)
8964 .or_replace(or_replace)
8965 .if_not_exists(if_not_exists)
8966 .transient(transient)
8967 .hive_distribution(hive_distribution)
8968 .hive_formats(hive_formats)
8969 .global(global)
8970 .query(query)
8971 .without_rowid(without_rowid)
8972 .like(like)
8973 .clone_clause(clone)
8974 .comment_after_column_def(comment_after_column_def)
8975 .order_by(order_by)
8976 .on_commit(on_commit)
8977 .on_cluster(on_cluster)
8978 .clustered_by(clustered_by)
8979 .partition_by(create_table_config.partition_by)
8980 .cluster_by(create_table_config.cluster_by)
8981 .inherits(create_table_config.inherits)
8982 .partition_of(partition_of)
8983 .for_values(for_values)
8984 .table_options(create_table_config.table_options)
8985 .primary_key(primary_key)
8986 .strict(strict)
8987 .backup(backup)
8988 .diststyle(diststyle)
8989 .distkey(distkey)
8990 .sortkey(sortkey)
8991 .build())
8992 }
8993
8994 fn maybe_parse_create_table_like(
8995 &mut self,
8996 allow_unquoted_hyphen: bool,
8997 ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8998 let like = if self.dialect.supports_create_table_like_parenthesized()
8999 && self.consume_token(&Token::LParen)
9000 {
9001 if self.parse_keyword(Keyword::LIKE) {
9002 let name = self.parse_object_name(allow_unquoted_hyphen)?;
9003 let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
9004 Some(CreateTableLikeDefaults::Including)
9005 } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
9006 Some(CreateTableLikeDefaults::Excluding)
9007 } else {
9008 None
9009 };
9010 self.expect_token(&Token::RParen)?;
9011 Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
9012 name,
9013 defaults,
9014 }))
9015 } else {
9016 self.prev_token();
9018 None
9019 }
9020 } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
9021 let name = self.parse_object_name(allow_unquoted_hyphen)?;
9022 Some(CreateTableLikeKind::Plain(CreateTableLike {
9023 name,
9024 defaults: None,
9025 }))
9026 } else {
9027 None
9028 };
9029 Ok(like)
9030 }
9031
9032 pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
9033 if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
9034 Ok(OnCommit::DeleteRows)
9035 } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
9036 Ok(OnCommit::PreserveRows)
9037 } else if self.parse_keywords(&[Keyword::DROP]) {
9038 Ok(OnCommit::Drop)
9039 } else {
9040 parser_err!(
9041 "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
9042 self.peek_token_ref()
9043 )
9044 }
9045 }
9046
9047 fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
9053 if self.parse_keyword(Keyword::DEFAULT) {
9054 return Ok(ForValues::Default);
9055 }
9056
9057 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
9058
9059 if self.parse_keyword(Keyword::IN) {
9060 self.expect_token(&Token::LParen)?;
9062 if self.peek_token_ref().token == Token::RParen {
9063 return self.expected_ref("at least one value", self.peek_token_ref());
9064 }
9065 let values = self.parse_comma_separated(Parser::parse_expr)?;
9066 self.expect_token(&Token::RParen)?;
9067 Ok(ForValues::In(values))
9068 } else if self.parse_keyword(Keyword::FROM) {
9069 self.expect_token(&Token::LParen)?;
9071 if self.peek_token_ref().token == Token::RParen {
9072 return self.expected_ref("at least one value", self.peek_token_ref());
9073 }
9074 let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9075 self.expect_token(&Token::RParen)?;
9076 self.expect_keyword(Keyword::TO)?;
9077 self.expect_token(&Token::LParen)?;
9078 if self.peek_token_ref().token == Token::RParen {
9079 return self.expected_ref("at least one value", self.peek_token_ref());
9080 }
9081 let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9082 self.expect_token(&Token::RParen)?;
9083 Ok(ForValues::From { from, to })
9084 } else if self.parse_keyword(Keyword::WITH) {
9085 self.expect_token(&Token::LParen)?;
9087 self.expect_keyword(Keyword::MODULUS)?;
9088 let modulus = self.parse_literal_uint()?;
9089 self.expect_token(&Token::Comma)?;
9090 self.expect_keyword(Keyword::REMAINDER)?;
9091 let remainder = self.parse_literal_uint()?;
9092 self.expect_token(&Token::RParen)?;
9093 Ok(ForValues::With { modulus, remainder })
9094 } else {
9095 self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
9096 }
9097 }
9098
9099 fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
9101 if self.parse_keyword(Keyword::MINVALUE) {
9102 Ok(PartitionBoundValue::MinValue)
9103 } else if self.parse_keyword(Keyword::MAXVALUE) {
9104 Ok(PartitionBoundValue::MaxValue)
9105 } else {
9106 Ok(PartitionBoundValue::Expr(self.parse_expr()?))
9107 }
9108 }
9109
9110 fn parse_optional_create_table_config(
9116 &mut self,
9117 ) -> Result<CreateTableConfiguration, ParserError> {
9118 let mut table_options = CreateTableOptions::None;
9119
9120 let inherits = if self.parse_keyword(Keyword::INHERITS) {
9121 Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
9122 } else {
9123 None
9124 };
9125
9126 let with_options = self.parse_options(Keyword::WITH)?;
9128 if !with_options.is_empty() {
9129 table_options = CreateTableOptions::With(with_options)
9130 }
9131
9132 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
9133 if !table_properties.is_empty() {
9134 table_options = CreateTableOptions::TableProperties(table_properties);
9135 }
9136 let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
9137 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
9138 {
9139 Some(Box::new(self.parse_expr()?))
9140 } else {
9141 None
9142 };
9143
9144 let mut cluster_by = None;
9145 if dialect_of!(self is BigQueryDialect | GenericDialect) {
9146 if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
9147 cluster_by = Some(WrappedCollection::NoWrapping(
9148 self.parse_comma_separated(|p| p.parse_expr())?,
9149 ));
9150 };
9151
9152 if let Token::Word(word) = &self.peek_token_ref().token {
9153 if word.keyword == Keyword::OPTIONS {
9154 table_options =
9155 CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
9156 }
9157 };
9158 }
9159
9160 if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
9161 let plain_options = self.parse_plain_options()?;
9162 if !plain_options.is_empty() {
9163 table_options = CreateTableOptions::Plain(plain_options)
9164 }
9165 };
9166
9167 Ok(CreateTableConfiguration {
9168 partition_by,
9169 cluster_by,
9170 inherits,
9171 table_options,
9172 })
9173 }
9174
9175 fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
9176 if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
9179 return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
9180 }
9181
9182 if self.parse_keywords(&[Keyword::COMMENT]) {
9185 let has_eq = self.consume_token(&Token::Eq);
9186 let value = self.next_token();
9187
9188 let comment = match (has_eq, value.token) {
9189 (true, Token::SingleQuotedString(s)) => {
9190 Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
9191 }
9192 (false, Token::SingleQuotedString(s)) => {
9193 Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
9194 }
9195 (_, token) => {
9196 self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
9197 }
9198 };
9199 return comment;
9200 }
9201
9202 if self.parse_keywords(&[Keyword::ENGINE]) {
9205 let _ = self.consume_token(&Token::Eq);
9206 let value = self.next_token();
9207
9208 let engine = match value.token {
9209 Token::Word(w) => {
9210 let parameters = if self.peek_token_ref().token == Token::LParen {
9211 self.parse_parenthesized_identifiers()?
9212 } else {
9213 vec![]
9214 };
9215
9216 Ok(Some(SqlOption::NamedParenthesizedList(
9217 NamedParenthesizedList {
9218 key: Ident::new("ENGINE"),
9219 name: Some(Ident::new(w.value)),
9220 values: parameters,
9221 },
9222 )))
9223 }
9224 _ => {
9225 return self.expected("Token::Word", value)?;
9226 }
9227 };
9228
9229 return engine;
9230 }
9231
9232 if self.parse_keywords(&[Keyword::TABLESPACE]) {
9234 let _ = self.consume_token(&Token::Eq);
9235 let value = self.next_token();
9236
9237 let tablespace = match value.token {
9238 Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
9239 let storage = match self.parse_keyword(Keyword::STORAGE) {
9240 true => {
9241 let _ = self.consume_token(&Token::Eq);
9242 let storage_token = self.next_token();
9243 match &storage_token.token {
9244 Token::Word(w) => match w.value.to_uppercase().as_str() {
9245 "DISK" => Some(StorageType::Disk),
9246 "MEMORY" => Some(StorageType::Memory),
9247 _ => self
9248 .expected("Storage type (DISK or MEMORY)", storage_token)?,
9249 },
9250 _ => self.expected("Token::Word", storage_token)?,
9251 }
9252 }
9253 false => None,
9254 };
9255
9256 Ok(Some(SqlOption::TableSpace(TablespaceOption {
9257 name,
9258 storage,
9259 })))
9260 }
9261 _ => {
9262 return self.expected("Token::Word", value)?;
9263 }
9264 };
9265
9266 return tablespace;
9267 }
9268
9269 if self.parse_keyword(Keyword::UNION) {
9271 let _ = self.consume_token(&Token::Eq);
9272 let value = self.next_token();
9273
9274 match value.token {
9275 Token::LParen => {
9276 let tables: Vec<Ident> =
9277 self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9278 self.expect_token(&Token::RParen)?;
9279
9280 return Ok(Some(SqlOption::NamedParenthesizedList(
9281 NamedParenthesizedList {
9282 key: Ident::new("UNION"),
9283 name: None,
9284 values: tables,
9285 },
9286 )));
9287 }
9288 _ => {
9289 return self.expected("Token::LParen", value)?;
9290 }
9291 }
9292 }
9293
9294 let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9296 Ident::new("DEFAULT CHARSET")
9297 } else if self.parse_keyword(Keyword::CHARSET) {
9298 Ident::new("CHARSET")
9299 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9300 Ident::new("DEFAULT CHARACTER SET")
9301 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9302 Ident::new("CHARACTER SET")
9303 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9304 Ident::new("DEFAULT COLLATE")
9305 } else if self.parse_keyword(Keyword::COLLATE) {
9306 Ident::new("COLLATE")
9307 } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9308 Ident::new("DATA DIRECTORY")
9309 } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9310 Ident::new("INDEX DIRECTORY")
9311 } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9312 Ident::new("KEY_BLOCK_SIZE")
9313 } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9314 Ident::new("ROW_FORMAT")
9315 } else if self.parse_keyword(Keyword::PACK_KEYS) {
9316 Ident::new("PACK_KEYS")
9317 } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9318 Ident::new("STATS_AUTO_RECALC")
9319 } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9320 Ident::new("STATS_PERSISTENT")
9321 } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9322 Ident::new("STATS_SAMPLE_PAGES")
9323 } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9324 Ident::new("DELAY_KEY_WRITE")
9325 } else if self.parse_keyword(Keyword::COMPRESSION) {
9326 Ident::new("COMPRESSION")
9327 } else if self.parse_keyword(Keyword::ENCRYPTION) {
9328 Ident::new("ENCRYPTION")
9329 } else if self.parse_keyword(Keyword::MAX_ROWS) {
9330 Ident::new("MAX_ROWS")
9331 } else if self.parse_keyword(Keyword::MIN_ROWS) {
9332 Ident::new("MIN_ROWS")
9333 } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9334 Ident::new("AUTOEXTEND_SIZE")
9335 } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9336 Ident::new("AVG_ROW_LENGTH")
9337 } else if self.parse_keyword(Keyword::CHECKSUM) {
9338 Ident::new("CHECKSUM")
9339 } else if self.parse_keyword(Keyword::CONNECTION) {
9340 Ident::new("CONNECTION")
9341 } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9342 Ident::new("ENGINE_ATTRIBUTE")
9343 } else if self.parse_keyword(Keyword::PASSWORD) {
9344 Ident::new("PASSWORD")
9345 } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9346 Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9347 } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9348 Ident::new("INSERT_METHOD")
9349 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9350 Ident::new("AUTO_INCREMENT")
9351 } else {
9352 return Ok(None);
9353 };
9354
9355 let _ = self.consume_token(&Token::Eq);
9356
9357 let value = match self
9358 .maybe_parse(|parser| parser.parse_value())?
9359 .map(Expr::Value)
9360 {
9361 Some(expr) => expr,
9362 None => Expr::Identifier(self.parse_identifier()?),
9363 };
9364
9365 Ok(Some(SqlOption::KeyValue { key, value }))
9366 }
9367
9368 pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9370 let mut options = Vec::new();
9371
9372 while let Some(option) = self.parse_plain_option()? {
9373 options.push(option);
9374 let _ = self.consume_token(&Token::Comma);
9377 }
9378
9379 Ok(options)
9380 }
9381
9382 pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9384 let comment = if self.parse_keyword(Keyword::COMMENT) {
9385 let has_eq = self.consume_token(&Token::Eq);
9386 let comment = self.parse_comment_value()?;
9387 Some(if has_eq {
9388 CommentDef::WithEq(comment)
9389 } else {
9390 CommentDef::WithoutEq(comment)
9391 })
9392 } else {
9393 None
9394 };
9395 Ok(comment)
9396 }
9397
9398 pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9400 let next_token = self.next_token();
9401 let value = match next_token.token {
9402 Token::SingleQuotedString(str) => str,
9403 Token::DollarQuotedString(str) => str.value,
9404 _ => self.expected("string literal", next_token)?,
9405 };
9406 Ok(value)
9407 }
9408
9409 pub fn parse_optional_procedure_parameters(
9411 &mut self,
9412 ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9413 let mut params = vec![];
9414 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9415 return Ok(Some(params));
9416 }
9417 loop {
9418 if let Token::Word(_) = &self.peek_token_ref().token {
9419 params.push(self.parse_procedure_param()?)
9420 }
9421 let comma = self.consume_token(&Token::Comma);
9422 if self.consume_token(&Token::RParen) {
9423 break;
9425 } else if !comma {
9426 return self.expected_ref(
9427 "',' or ')' after parameter definition",
9428 self.peek_token_ref(),
9429 );
9430 }
9431 }
9432 Ok(Some(params))
9433 }
9434
9435 pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9437 let mut columns = vec![];
9438 let mut constraints = vec![];
9439 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9440 return Ok((columns, constraints));
9441 }
9442
9443 loop {
9444 if let Some(constraint) = self.parse_optional_table_constraint()? {
9445 constraints.push(constraint);
9446 } else if let Token::Word(_) = &self.peek_token_ref().token {
9447 columns.push(self.parse_column_def()?);
9448 } else {
9449 return self.expected_ref(
9450 "column name or constraint definition",
9451 self.peek_token_ref(),
9452 );
9453 }
9454
9455 let comma = self.consume_token(&Token::Comma);
9456 let rparen = self.peek_token_ref().token == Token::RParen;
9457
9458 if !comma && !rparen {
9459 return self
9460 .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9461 };
9462
9463 if rparen
9464 && (!comma
9465 || self.dialect.supports_column_definition_trailing_commas()
9466 || self.options.trailing_commas)
9467 {
9468 let _ = self.consume_token(&Token::RParen);
9469 break;
9470 }
9471 }
9472
9473 Ok((columns, constraints))
9474 }
9475
9476 pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9478 let mode = if self.parse_keyword(Keyword::IN) {
9479 Some(ArgMode::In)
9480 } else if self.parse_keyword(Keyword::OUT) {
9481 Some(ArgMode::Out)
9482 } else if self.parse_keyword(Keyword::INOUT) {
9483 Some(ArgMode::InOut)
9484 } else {
9485 None
9486 };
9487 let name = self.parse_identifier()?;
9488 let data_type = self.parse_data_type()?;
9489 let default = if self.consume_token(&Token::Eq) {
9490 Some(self.parse_expr()?)
9491 } else {
9492 None
9493 };
9494
9495 Ok(ProcedureParam {
9496 name,
9497 data_type,
9498 mode,
9499 default,
9500 })
9501 }
9502
9503 pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9505 self.parse_column_def_inner(false)
9506 }
9507
9508 fn parse_column_def_inner(
9509 &mut self,
9510 optional_data_type: bool,
9511 ) -> Result<ColumnDef, ParserError> {
9512 let col_name = self.parse_identifier()?;
9513 let data_type = if self.is_column_type_sqlite_unspecified() {
9514 DataType::Unspecified
9515 } else if optional_data_type {
9516 self.maybe_parse(|parser| parser.parse_data_type())?
9517 .unwrap_or(DataType::Unspecified)
9518 } else {
9519 self.parse_data_type()?
9520 };
9521 let mut options = vec![];
9522 loop {
9523 if self.parse_keyword(Keyword::CONSTRAINT) {
9524 let name = Some(self.parse_identifier()?);
9525 if let Some(option) = self.parse_optional_column_option()? {
9526 options.push(ColumnOptionDef { name, option });
9527 } else {
9528 return self.expected_ref(
9529 "constraint details after CONSTRAINT <name>",
9530 self.peek_token_ref(),
9531 );
9532 }
9533 } else if let Some(option) = self.parse_optional_column_option()? {
9534 options.push(ColumnOptionDef { name: None, option });
9535 } else {
9536 break;
9537 };
9538 }
9539 Ok(ColumnDef {
9540 name: col_name,
9541 data_type,
9542 options,
9543 })
9544 }
9545
9546 fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9547 if dialect_of!(self is SQLiteDialect) {
9548 match &self.peek_token_ref().token {
9549 Token::Word(word) => matches!(
9550 word.keyword,
9551 Keyword::CONSTRAINT
9552 | Keyword::PRIMARY
9553 | Keyword::NOT
9554 | Keyword::UNIQUE
9555 | Keyword::CHECK
9556 | Keyword::DEFAULT
9557 | Keyword::COLLATE
9558 | Keyword::REFERENCES
9559 | Keyword::GENERATED
9560 | Keyword::AS
9561 ),
9562 _ => true, }
9564 } else {
9565 false
9566 }
9567 }
9568
9569 pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9571 if let Some(option) = self.dialect.parse_column_option(self)? {
9572 return option;
9573 }
9574
9575 self.with_state(
9576 ColumnDefinition,
9577 |parser| -> Result<Option<ColumnOption>, ParserError> {
9578 parser.parse_optional_column_option_inner()
9579 },
9580 )
9581 }
9582
9583 fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9584 if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9585 Ok(Some(ColumnOption::CharacterSet(
9586 self.parse_object_name(false)?,
9587 )))
9588 } else if self.parse_keywords(&[Keyword::COLLATE]) {
9589 Ok(Some(ColumnOption::Collation(
9590 self.parse_object_name(false)?,
9591 )))
9592 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9593 Ok(Some(ColumnOption::NotNull))
9594 } else if self.parse_keywords(&[Keyword::COMMENT]) {
9595 Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9596 } else if self.parse_keyword(Keyword::NULL) {
9597 Ok(Some(ColumnOption::Null))
9598 } else if self.parse_keyword(Keyword::DEFAULT) {
9599 Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9600 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9601 && self.parse_keyword(Keyword::MATERIALIZED)
9602 {
9603 Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9604 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9605 && self.parse_keyword(Keyword::ALIAS)
9606 {
9607 Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9608 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9609 && self.parse_keyword(Keyword::EPHEMERAL)
9610 {
9611 if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9614 Ok(Some(ColumnOption::Ephemeral(None)))
9615 } else {
9616 Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9617 }
9618 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9619 let characteristics = self.parse_constraint_characteristics()?;
9620 Ok(Some(
9621 PrimaryKeyConstraint {
9622 name: None,
9623 index_name: None,
9624 index_type: None,
9625 columns: vec![],
9626 index_options: vec![],
9627 characteristics,
9628 }
9629 .into(),
9630 ))
9631 } else if self.parse_keyword(Keyword::UNIQUE) {
9632 let index_type_display =
9633 if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9634 KeyOrIndexDisplay::Key
9635 } else {
9636 KeyOrIndexDisplay::None
9637 };
9638 let characteristics = self.parse_constraint_characteristics()?;
9639 Ok(Some(
9640 UniqueConstraint {
9641 name: None,
9642 index_name: None,
9643 index_type_display,
9644 index_type: None,
9645 columns: vec![],
9646 index_options: vec![],
9647 characteristics,
9648 nulls_distinct: NullsDistinctOption::None,
9649 }
9650 .into(),
9651 ))
9652 } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9653 let characteristics = self.parse_constraint_characteristics()?;
9656 Ok(Some(
9657 PrimaryKeyConstraint {
9658 name: None,
9659 index_name: None,
9660 index_type: None,
9661 columns: vec![],
9662 index_options: vec![],
9663 characteristics,
9664 }
9665 .into(),
9666 ))
9667 } else if self.parse_keyword(Keyword::REFERENCES) {
9668 let foreign_table = self.parse_object_name(false)?;
9669 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9672 let mut match_kind = None;
9673 let mut on_delete = None;
9674 let mut on_update = None;
9675 loop {
9676 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9677 match_kind = Some(self.parse_match_kind()?);
9678 } else if on_delete.is_none()
9679 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9680 {
9681 on_delete = Some(self.parse_referential_action()?);
9682 } else if on_update.is_none()
9683 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9684 {
9685 on_update = Some(self.parse_referential_action()?);
9686 } else {
9687 break;
9688 }
9689 }
9690 let characteristics = self.parse_constraint_characteristics()?;
9691
9692 Ok(Some(
9693 ForeignKeyConstraint {
9694 name: None, index_name: None, columns: vec![], foreign_table,
9698 referred_columns,
9699 on_delete,
9700 on_update,
9701 match_kind,
9702 characteristics,
9703 }
9704 .into(),
9705 ))
9706 } else if self.parse_keyword(Keyword::CHECK) {
9707 self.expect_token(&Token::LParen)?;
9708 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9710 self.expect_token(&Token::RParen)?;
9711
9712 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9713 Some(true)
9714 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9715 Some(false)
9716 } else {
9717 None
9718 };
9719
9720 Ok(Some(
9721 CheckConstraint {
9722 name: None, expr: Box::new(expr),
9724 enforced,
9725 }
9726 .into(),
9727 ))
9728 } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9729 && dialect_of!(self is MySqlDialect | GenericDialect)
9730 {
9731 Ok(Some(ColumnOption::DialectSpecific(vec![
9733 Token::make_keyword("AUTO_INCREMENT"),
9734 ])))
9735 } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9736 && dialect_of!(self is SQLiteDialect | GenericDialect)
9737 {
9738 Ok(Some(ColumnOption::DialectSpecific(vec![
9740 Token::make_keyword("AUTOINCREMENT"),
9741 ])))
9742 } else if self.parse_keyword(Keyword::ASC)
9743 && self.dialect.supports_asc_desc_in_column_definition()
9744 {
9745 Ok(Some(ColumnOption::DialectSpecific(vec![
9747 Token::make_keyword("ASC"),
9748 ])))
9749 } else if self.parse_keyword(Keyword::DESC)
9750 && self.dialect.supports_asc_desc_in_column_definition()
9751 {
9752 Ok(Some(ColumnOption::DialectSpecific(vec![
9754 Token::make_keyword("DESC"),
9755 ])))
9756 } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9757 && dialect_of!(self is MySqlDialect | GenericDialect)
9758 {
9759 let expr = self.parse_expr()?;
9760 Ok(Some(ColumnOption::OnUpdate(expr)))
9761 } else if self.parse_keyword(Keyword::GENERATED) {
9762 self.parse_optional_column_option_generated()
9763 } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9764 && self.parse_keyword(Keyword::OPTIONS)
9765 {
9766 self.prev_token();
9767 Ok(Some(ColumnOption::Options(
9768 self.parse_options(Keyword::OPTIONS)?,
9769 )))
9770 } else if self.parse_keyword(Keyword::AS)
9771 && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9772 {
9773 self.parse_optional_column_option_as()
9774 } else if self.parse_keyword(Keyword::SRID)
9775 && dialect_of!(self is MySqlDialect | GenericDialect)
9776 {
9777 Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9778 } else if self.parse_keyword(Keyword::IDENTITY)
9779 && dialect_of!(self is MsSqlDialect | GenericDialect)
9780 {
9781 let parameters = if self.consume_token(&Token::LParen) {
9782 let seed = self.parse_number()?;
9783 self.expect_token(&Token::Comma)?;
9784 let increment = self.parse_number()?;
9785 self.expect_token(&Token::RParen)?;
9786
9787 Some(IdentityPropertyFormatKind::FunctionCall(
9788 IdentityParameters { seed, increment },
9789 ))
9790 } else {
9791 None
9792 };
9793 Ok(Some(ColumnOption::Identity(
9794 IdentityPropertyKind::Identity(IdentityProperty {
9795 parameters,
9796 order: None,
9797 }),
9798 )))
9799 } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9800 && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9801 {
9802 Ok(Some(ColumnOption::OnConflict(
9804 self.expect_one_of_keywords(&[
9805 Keyword::ROLLBACK,
9806 Keyword::ABORT,
9807 Keyword::FAIL,
9808 Keyword::IGNORE,
9809 Keyword::REPLACE,
9810 ])?,
9811 )))
9812 } else if self.parse_keyword(Keyword::INVISIBLE) {
9813 Ok(Some(ColumnOption::Invisible))
9814 } else {
9815 Ok(None)
9816 }
9817 }
9818
9819 pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9820 let name = self.parse_object_name(false)?;
9821 self.expect_token(&Token::Eq)?;
9822 let value = self.parse_literal_string()?;
9823
9824 Ok(Tag::new(name, value))
9825 }
9826
9827 fn parse_optional_column_option_generated(
9828 &mut self,
9829 ) -> Result<Option<ColumnOption>, ParserError> {
9830 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9831 let mut sequence_options = vec![];
9832 if self.expect_token(&Token::LParen).is_ok() {
9833 sequence_options = self.parse_create_sequence_options()?;
9834 self.expect_token(&Token::RParen)?;
9835 }
9836 Ok(Some(ColumnOption::Generated {
9837 generated_as: GeneratedAs::Always,
9838 sequence_options: Some(sequence_options),
9839 generation_expr: None,
9840 generation_expr_mode: None,
9841 generated_keyword: true,
9842 }))
9843 } else if self.parse_keywords(&[
9844 Keyword::BY,
9845 Keyword::DEFAULT,
9846 Keyword::AS,
9847 Keyword::IDENTITY,
9848 ]) {
9849 let mut sequence_options = vec![];
9850 if self.expect_token(&Token::LParen).is_ok() {
9851 sequence_options = self.parse_create_sequence_options()?;
9852 self.expect_token(&Token::RParen)?;
9853 }
9854 Ok(Some(ColumnOption::Generated {
9855 generated_as: GeneratedAs::ByDefault,
9856 sequence_options: Some(sequence_options),
9857 generation_expr: None,
9858 generation_expr_mode: None,
9859 generated_keyword: true,
9860 }))
9861 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9862 if self.expect_token(&Token::LParen).is_ok() {
9863 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9864 self.expect_token(&Token::RParen)?;
9865 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9866 Ok((
9867 GeneratedAs::ExpStored,
9868 Some(GeneratedExpressionMode::Stored),
9869 ))
9870 } else if dialect_of!(self is PostgreSqlDialect) {
9871 self.expected_ref("STORED", self.peek_token_ref())
9873 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9874 Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9875 } else {
9876 Ok((GeneratedAs::Always, None))
9877 }?;
9878
9879 Ok(Some(ColumnOption::Generated {
9880 generated_as: gen_as,
9881 sequence_options: None,
9882 generation_expr: Some(expr),
9883 generation_expr_mode: expr_mode,
9884 generated_keyword: true,
9885 }))
9886 } else {
9887 Ok(None)
9888 }
9889 } else {
9890 Ok(None)
9891 }
9892 }
9893
9894 fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9895 self.expect_token(&Token::LParen)?;
9897 let expr = self.parse_expr()?;
9898 self.expect_token(&Token::RParen)?;
9899
9900 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9901 (
9902 GeneratedAs::ExpStored,
9903 Some(GeneratedExpressionMode::Stored),
9904 )
9905 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9906 (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9907 } else {
9908 (GeneratedAs::Always, None)
9909 };
9910
9911 Ok(Some(ColumnOption::Generated {
9912 generated_as: gen_as,
9913 sequence_options: None,
9914 generation_expr: Some(expr),
9915 generation_expr_mode: expr_mode,
9916 generated_keyword: false,
9917 }))
9918 }
9919
9920 pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9922 let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9923 && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9924 {
9925 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9926
9927 let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9928 self.expect_token(&Token::LParen)?;
9929 let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9930 self.expect_token(&Token::RParen)?;
9931 Some(sorted_by_columns)
9932 } else {
9933 None
9934 };
9935
9936 self.expect_keyword_is(Keyword::INTO)?;
9937 let num_buckets = self.parse_number_value()?.value;
9938 self.expect_keyword_is(Keyword::BUCKETS)?;
9939 Some(ClusteredBy {
9940 columns,
9941 sorted_by,
9942 num_buckets,
9943 })
9944 } else {
9945 None
9946 };
9947 Ok(clustered_by)
9948 }
9949
9950 pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9954 if self.parse_keyword(Keyword::RESTRICT) {
9955 Ok(ReferentialAction::Restrict)
9956 } else if self.parse_keyword(Keyword::CASCADE) {
9957 Ok(ReferentialAction::Cascade)
9958 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9959 Ok(ReferentialAction::SetNull)
9960 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9961 Ok(ReferentialAction::NoAction)
9962 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9963 Ok(ReferentialAction::SetDefault)
9964 } else {
9965 self.expected_ref(
9966 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9967 self.peek_token_ref(),
9968 )
9969 }
9970 }
9971
9972 pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9974 if self.parse_keyword(Keyword::FULL) {
9975 Ok(ConstraintReferenceMatchKind::Full)
9976 } else if self.parse_keyword(Keyword::PARTIAL) {
9977 Ok(ConstraintReferenceMatchKind::Partial)
9978 } else if self.parse_keyword(Keyword::SIMPLE) {
9979 Ok(ConstraintReferenceMatchKind::Simple)
9980 } else {
9981 self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9982 }
9983 }
9984
9985 fn parse_constraint_using_index(
9988 &mut self,
9989 name: Option<Ident>,
9990 ) -> Result<ConstraintUsingIndex, ParserError> {
9991 let index_name = self.parse_identifier()?;
9992 let characteristics = self.parse_constraint_characteristics()?;
9993 Ok(ConstraintUsingIndex {
9994 name,
9995 index_name,
9996 characteristics,
9997 })
9998 }
9999
10000 pub fn parse_constraint_characteristics(
10002 &mut self,
10003 ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
10004 let mut cc = ConstraintCharacteristics::default();
10005
10006 loop {
10007 if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
10008 {
10009 cc.deferrable = Some(false);
10010 } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
10011 cc.deferrable = Some(true);
10012 } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
10013 if self.parse_keyword(Keyword::DEFERRED) {
10014 cc.initially = Some(DeferrableInitial::Deferred);
10015 } else if self.parse_keyword(Keyword::IMMEDIATE) {
10016 cc.initially = Some(DeferrableInitial::Immediate);
10017 } else {
10018 self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
10019 }
10020 } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
10021 cc.enforced = Some(true);
10022 } else if cc.enforced.is_none()
10023 && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
10024 {
10025 cc.enforced = Some(false);
10026 } else {
10027 break;
10028 }
10029 }
10030
10031 if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
10032 Ok(Some(cc))
10033 } else {
10034 Ok(None)
10035 }
10036 }
10037
10038 pub fn parse_optional_table_constraint(
10040 &mut self,
10041 ) -> Result<Option<TableConstraint>, ParserError> {
10042 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
10043 if self.dialect.supports_constraint_keyword_without_name()
10044 && self
10045 .peek_one_of_keywords(&[
10046 Keyword::CHECK,
10047 Keyword::PRIMARY,
10048 Keyword::UNIQUE,
10049 Keyword::FOREIGN,
10050 ])
10051 .is_some()
10052 {
10053 None
10054 } else {
10055 Some(self.parse_identifier()?)
10056 }
10057 } else {
10058 None
10059 };
10060
10061 if name.is_none()
10066 && self
10067 .peek_one_of_keywords(&[Keyword::FULLTEXT, Keyword::SPATIAL])
10068 .is_some()
10069 && !dialect_of!(self is GenericDialect | MySqlDialect)
10070 {
10071 return Ok(None);
10072 }
10073
10074 let next_token = self.next_token();
10075 match next_token.token {
10076 Token::Word(w) if w.keyword == Keyword::UNIQUE => {
10077 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) if w.keyword == Keyword::EXCLUDE => {
10274 let index_method = if self.parse_keyword(Keyword::USING) {
10275 Some(self.parse_identifier()?)
10276 } else {
10277 None
10278 };
10279
10280 self.expect_token(&Token::LParen)?;
10281 let elements = self.parse_comma_separated(|p| p.parse_exclusion_element())?;
10282 self.expect_token(&Token::RParen)?;
10283
10284 let include = if self.parse_keyword(Keyword::INCLUDE) {
10285 self.expect_token(&Token::LParen)?;
10286 let cols = self.parse_comma_separated(|p| p.parse_identifier())?;
10287 self.expect_token(&Token::RParen)?;
10288 cols
10289 } else {
10290 vec![]
10291 };
10292
10293 let where_clause = if self.parse_keyword(Keyword::WHERE) {
10294 self.expect_token(&Token::LParen)?;
10295 let predicate = self.parse_expr()?;
10296 self.expect_token(&Token::RParen)?;
10297 Some(Box::new(predicate))
10298 } else {
10299 None
10300 };
10301
10302 let characteristics = self.parse_constraint_characteristics()?;
10303
10304 Ok(Some(
10305 ExclusionConstraint {
10306 name,
10307 index_method,
10308 elements,
10309 include,
10310 where_clause,
10311 characteristics,
10312 }
10313 .into(),
10314 ))
10315 }
10316 _ => {
10317 if name.is_some() {
10318 self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
10319 } else {
10320 self.prev_token();
10321 Ok(None)
10322 }
10323 }
10324 }
10325 }
10326
10327 fn parse_exclusion_element(&mut self) -> Result<ExclusionElement, ParserError> {
10328 let expr = self.parse_expr()?;
10329 self.expect_keyword_is(Keyword::WITH)?;
10330 let operator_token = self.next_token();
10331 let operator = operator_token.token.to_string();
10332 Ok(ExclusionElement { expr, operator })
10333 }
10334
10335 fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10336 Ok(if self.parse_keyword(Keyword::NULLS) {
10337 let not = self.parse_keyword(Keyword::NOT);
10338 self.expect_keyword_is(Keyword::DISTINCT)?;
10339 if not {
10340 NullsDistinctOption::NotDistinct
10341 } else {
10342 NullsDistinctOption::Distinct
10343 }
10344 } else {
10345 NullsDistinctOption::None
10346 })
10347 }
10348
10349 pub fn maybe_parse_options(
10351 &mut self,
10352 keyword: Keyword,
10353 ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10354 if let Token::Word(word) = &self.peek_token_ref().token {
10355 if word.keyword == keyword {
10356 return Ok(Some(self.parse_options(keyword)?));
10357 }
10358 };
10359 Ok(None)
10360 }
10361
10362 pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10364 if self.parse_keyword(keyword) {
10365 self.expect_token(&Token::LParen)?;
10366 let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10367 self.expect_token(&Token::RParen)?;
10368 Ok(options)
10369 } else {
10370 Ok(vec![])
10371 }
10372 }
10373
10374 pub fn parse_options_with_keywords(
10376 &mut self,
10377 keywords: &[Keyword],
10378 ) -> Result<Vec<SqlOption>, ParserError> {
10379 if self.parse_keywords(keywords) {
10380 self.expect_token(&Token::LParen)?;
10381 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10382 self.expect_token(&Token::RParen)?;
10383 Ok(options)
10384 } else {
10385 Ok(vec![])
10386 }
10387 }
10388
10389 pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10391 Ok(if self.parse_keyword(Keyword::BTREE) {
10392 IndexType::BTree
10393 } else if self.parse_keyword(Keyword::HASH) {
10394 IndexType::Hash
10395 } else if self.parse_keyword(Keyword::GIN) {
10396 IndexType::GIN
10397 } else if self.parse_keyword(Keyword::GIST) {
10398 IndexType::GiST
10399 } else if self.parse_keyword(Keyword::SPGIST) {
10400 IndexType::SPGiST
10401 } else if self.parse_keyword(Keyword::BRIN) {
10402 IndexType::BRIN
10403 } else if self.parse_keyword(Keyword::BLOOM) {
10404 IndexType::Bloom
10405 } else {
10406 IndexType::Custom(self.parse_identifier()?)
10407 })
10408 }
10409
10410 pub fn parse_optional_using_then_index_type(
10417 &mut self,
10418 ) -> Result<Option<IndexType>, ParserError> {
10419 if self.parse_keyword(Keyword::USING) {
10420 Ok(Some(self.parse_index_type()?))
10421 } else {
10422 Ok(None)
10423 }
10424 }
10425
10426 pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10430 self.maybe_parse(|parser| parser.parse_identifier())
10431 }
10432
10433 #[must_use]
10434 pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10436 if self.parse_keyword(Keyword::KEY) {
10437 KeyOrIndexDisplay::Key
10438 } else if self.parse_keyword(Keyword::INDEX) {
10439 KeyOrIndexDisplay::Index
10440 } else {
10441 KeyOrIndexDisplay::None
10442 }
10443 }
10444
10445 pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10447 if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10448 Ok(Some(IndexOption::Using(index_type)))
10449 } else if self.parse_keyword(Keyword::COMMENT) {
10450 let s = self.parse_literal_string()?;
10451 Ok(Some(IndexOption::Comment(s)))
10452 } else {
10453 Ok(None)
10454 }
10455 }
10456
10457 pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10459 let mut options = Vec::new();
10460
10461 loop {
10462 match self.parse_optional_index_option()? {
10463 Some(index_option) => options.push(index_option),
10464 None => return Ok(options),
10465 }
10466 }
10467 }
10468
10469 pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10471 let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10472
10473 match &self.peek_token_ref().token {
10474 Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10475 Ok(SqlOption::Ident(self.parse_identifier()?))
10476 }
10477 Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10478 self.parse_option_partition()
10479 }
10480 Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10481 self.parse_option_clustered()
10482 }
10483 _ => {
10484 let name = self.parse_identifier()?;
10485 self.expect_token(&Token::Eq)?;
10486 let value = self.parse_expr()?;
10487
10488 Ok(SqlOption::KeyValue { key: name, value })
10489 }
10490 }
10491 }
10492
10493 pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10495 if self.parse_keywords(&[
10496 Keyword::CLUSTERED,
10497 Keyword::COLUMNSTORE,
10498 Keyword::INDEX,
10499 Keyword::ORDER,
10500 ]) {
10501 Ok(SqlOption::Clustered(
10502 TableOptionsClustered::ColumnstoreIndexOrder(
10503 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10504 ),
10505 ))
10506 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10507 Ok(SqlOption::Clustered(
10508 TableOptionsClustered::ColumnstoreIndex,
10509 ))
10510 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10511 self.expect_token(&Token::LParen)?;
10512
10513 let columns = self.parse_comma_separated(|p| {
10514 let name = p.parse_identifier()?;
10515 let asc = p.parse_asc_desc();
10516
10517 Ok(ClusteredIndex { name, asc })
10518 })?;
10519
10520 self.expect_token(&Token::RParen)?;
10521
10522 Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10523 } else {
10524 Err(ParserError::ParserError(
10525 "invalid CLUSTERED sequence".to_string(),
10526 ))
10527 }
10528 }
10529
10530 pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10532 self.expect_keyword_is(Keyword::PARTITION)?;
10533 self.expect_token(&Token::LParen)?;
10534 let column_name = self.parse_identifier()?;
10535
10536 self.expect_keyword_is(Keyword::RANGE)?;
10537 let range_direction = if self.parse_keyword(Keyword::LEFT) {
10538 Some(PartitionRangeDirection::Left)
10539 } else if self.parse_keyword(Keyword::RIGHT) {
10540 Some(PartitionRangeDirection::Right)
10541 } else {
10542 None
10543 };
10544
10545 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10546 self.expect_token(&Token::LParen)?;
10547
10548 let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10549
10550 self.expect_token(&Token::RParen)?;
10551 self.expect_token(&Token::RParen)?;
10552
10553 Ok(SqlOption::Partition {
10554 column_name,
10555 range_direction,
10556 for_values,
10557 })
10558 }
10559
10560 pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10562 self.expect_token(&Token::LParen)?;
10563 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10564 self.expect_token(&Token::RParen)?;
10565 Ok(Partition::Partitions(partitions))
10566 }
10567
10568 pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10570 self.expect_token(&Token::LParen)?;
10571 self.expect_keyword_is(Keyword::SELECT)?;
10572 let projection = self.parse_projection()?;
10573 let group_by = self.parse_optional_group_by()?;
10574 let order_by = self.parse_optional_order_by()?;
10575 self.expect_token(&Token::RParen)?;
10576 Ok(ProjectionSelect {
10577 projection,
10578 group_by,
10579 order_by,
10580 })
10581 }
10582 pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10584 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10585 let name = self.parse_identifier()?;
10586 let query = self.parse_projection_select()?;
10587 Ok(AlterTableOperation::AddProjection {
10588 if_not_exists,
10589 name,
10590 select: query,
10591 })
10592 }
10593
10594 fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10598 self.expect_keyword_is(Keyword::ALTER)?;
10599 self.expect_keyword_is(Keyword::SORTKEY)?;
10600 self.expect_token(&Token::LParen)?;
10601 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10602 self.expect_token(&Token::RParen)?;
10603 Ok(AlterTableOperation::AlterSortKey { columns })
10604 }
10605
10606 pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10608 let operation = if self.parse_keyword(Keyword::ADD) {
10609 if let Some(constraint) = self.parse_optional_table_constraint()? {
10610 let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10611 AlterTableOperation::AddConstraint {
10612 constraint,
10613 not_valid,
10614 }
10615 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10616 && self.parse_keyword(Keyword::PROJECTION)
10617 {
10618 return self.parse_alter_table_add_projection();
10619 } else {
10620 let if_not_exists =
10621 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10622 let mut new_partitions = vec![];
10623 loop {
10624 if self.parse_keyword(Keyword::PARTITION) {
10625 new_partitions.push(self.parse_partition()?);
10626 } else {
10627 break;
10628 }
10629 }
10630 if !new_partitions.is_empty() {
10631 AlterTableOperation::AddPartitions {
10632 if_not_exists,
10633 new_partitions,
10634 }
10635 } else {
10636 let column_keyword = self.parse_keyword(Keyword::COLUMN);
10637
10638 let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10639 {
10640 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10641 || if_not_exists
10642 } else {
10643 false
10644 };
10645
10646 let column_def = self.parse_column_def()?;
10647
10648 let column_position = self.parse_column_position()?;
10649
10650 AlterTableOperation::AddColumn {
10651 column_keyword,
10652 if_not_exists,
10653 column_def,
10654 column_position,
10655 }
10656 }
10657 }
10658 } else if self.parse_keyword(Keyword::RENAME) {
10659 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10660 let old_name = self.parse_identifier()?;
10661 self.expect_keyword_is(Keyword::TO)?;
10662 let new_name = self.parse_identifier()?;
10663 AlterTableOperation::RenameConstraint { old_name, new_name }
10664 } else if self.parse_keyword(Keyword::TO) {
10665 let table_name = self.parse_object_name(false)?;
10666 AlterTableOperation::RenameTable {
10667 table_name: RenameTableNameKind::To(table_name),
10668 }
10669 } else if self.parse_keyword(Keyword::AS) {
10670 let table_name = self.parse_object_name(false)?;
10671 AlterTableOperation::RenameTable {
10672 table_name: RenameTableNameKind::As(table_name),
10673 }
10674 } else {
10675 let _ = self.parse_keyword(Keyword::COLUMN); let old_column_name = self.parse_identifier()?;
10677 self.expect_keyword_is(Keyword::TO)?;
10678 let new_column_name = self.parse_identifier()?;
10679 AlterTableOperation::RenameColumn {
10680 old_column_name,
10681 new_column_name,
10682 }
10683 }
10684 } else if self.parse_keyword(Keyword::DISABLE) {
10685 if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10686 AlterTableOperation::DisableRowLevelSecurity {}
10687 } else if self.parse_keyword(Keyword::RULE) {
10688 let name = self.parse_identifier()?;
10689 AlterTableOperation::DisableRule { name }
10690 } else if self.parse_keyword(Keyword::TRIGGER) {
10691 let name = self.parse_identifier()?;
10692 AlterTableOperation::DisableTrigger { name }
10693 } else {
10694 return self.expected_ref(
10695 "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10696 self.peek_token_ref(),
10697 );
10698 }
10699 } else if self.parse_keyword(Keyword::ENABLE) {
10700 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10701 let name = self.parse_identifier()?;
10702 AlterTableOperation::EnableAlwaysRule { name }
10703 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10704 let name = self.parse_identifier()?;
10705 AlterTableOperation::EnableAlwaysTrigger { name }
10706 } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10707 AlterTableOperation::EnableRowLevelSecurity {}
10708 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10709 let name = self.parse_identifier()?;
10710 AlterTableOperation::EnableReplicaRule { name }
10711 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10712 let name = self.parse_identifier()?;
10713 AlterTableOperation::EnableReplicaTrigger { name }
10714 } else if self.parse_keyword(Keyword::RULE) {
10715 let name = self.parse_identifier()?;
10716 AlterTableOperation::EnableRule { name }
10717 } else if self.parse_keyword(Keyword::TRIGGER) {
10718 let name = self.parse_identifier()?;
10719 AlterTableOperation::EnableTrigger { name }
10720 } else {
10721 return self.expected_ref(
10722 "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10723 self.peek_token_ref(),
10724 );
10725 }
10726 } else if self.parse_keywords(&[
10727 Keyword::FORCE,
10728 Keyword::ROW,
10729 Keyword::LEVEL,
10730 Keyword::SECURITY,
10731 ]) {
10732 AlterTableOperation::ForceRowLevelSecurity
10733 } else if self.parse_keywords(&[
10734 Keyword::NO,
10735 Keyword::FORCE,
10736 Keyword::ROW,
10737 Keyword::LEVEL,
10738 Keyword::SECURITY,
10739 ]) {
10740 AlterTableOperation::NoForceRowLevelSecurity
10741 } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10742 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10743 {
10744 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10745 let name = self.parse_identifier()?;
10746 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10747 Some(self.parse_identifier()?)
10748 } else {
10749 None
10750 };
10751 AlterTableOperation::ClearProjection {
10752 if_exists,
10753 name,
10754 partition,
10755 }
10756 } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10757 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10758 {
10759 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10760 let name = self.parse_identifier()?;
10761 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10762 Some(self.parse_identifier()?)
10763 } else {
10764 None
10765 };
10766 AlterTableOperation::MaterializeProjection {
10767 if_exists,
10768 name,
10769 partition,
10770 }
10771 } else if self.parse_keyword(Keyword::DROP) {
10772 if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10773 self.expect_token(&Token::LParen)?;
10774 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10775 self.expect_token(&Token::RParen)?;
10776 AlterTableOperation::DropPartitions {
10777 partitions,
10778 if_exists: true,
10779 }
10780 } else if self.parse_keyword(Keyword::PARTITION) {
10781 self.expect_token(&Token::LParen)?;
10782 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10783 self.expect_token(&Token::RParen)?;
10784 AlterTableOperation::DropPartitions {
10785 partitions,
10786 if_exists: false,
10787 }
10788 } else if self.parse_keyword(Keyword::CONSTRAINT) {
10789 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10790 let name = self.parse_identifier()?;
10791 let drop_behavior = self.parse_optional_drop_behavior();
10792 AlterTableOperation::DropConstraint {
10793 if_exists,
10794 name,
10795 drop_behavior,
10796 }
10797 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10798 let drop_behavior = self.parse_optional_drop_behavior();
10799 AlterTableOperation::DropPrimaryKey { drop_behavior }
10800 } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10801 let name = self.parse_identifier()?;
10802 let drop_behavior = self.parse_optional_drop_behavior();
10803 AlterTableOperation::DropForeignKey {
10804 name,
10805 drop_behavior,
10806 }
10807 } else if self.parse_keyword(Keyword::INDEX) {
10808 let name = self.parse_identifier()?;
10809 AlterTableOperation::DropIndex { name }
10810 } else if self.parse_keyword(Keyword::PROJECTION)
10811 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10812 {
10813 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10814 let name = self.parse_identifier()?;
10815 AlterTableOperation::DropProjection { if_exists, name }
10816 } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10817 AlterTableOperation::DropClusteringKey
10818 } else {
10819 let has_column_keyword = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10821 let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10822 self.parse_comma_separated(Parser::parse_identifier)?
10823 } else {
10824 vec![self.parse_identifier()?]
10825 };
10826 let drop_behavior = self.parse_optional_drop_behavior();
10827 AlterTableOperation::DropColumn {
10828 has_column_keyword,
10829 column_names,
10830 if_exists,
10831 drop_behavior,
10832 }
10833 }
10834 } else if self.parse_keyword(Keyword::PARTITION) {
10835 self.expect_token(&Token::LParen)?;
10836 let before = self.parse_comma_separated(Parser::parse_expr)?;
10837 self.expect_token(&Token::RParen)?;
10838 self.expect_keyword_is(Keyword::RENAME)?;
10839 self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10840 self.expect_token(&Token::LParen)?;
10841 let renames = self.parse_comma_separated(Parser::parse_expr)?;
10842 self.expect_token(&Token::RParen)?;
10843 AlterTableOperation::RenamePartitions {
10844 old_partitions: before,
10845 new_partitions: renames,
10846 }
10847 } else if self.parse_keyword(Keyword::CHANGE) {
10848 let _ = self.parse_keyword(Keyword::COLUMN); let old_name = self.parse_identifier()?;
10850 let new_name = self.parse_identifier()?;
10851 let data_type = self.parse_data_type()?;
10852 let mut options = vec![];
10853 while let Some(option) = self.parse_optional_column_option()? {
10854 options.push(option);
10855 }
10856
10857 let column_position = self.parse_column_position()?;
10858
10859 AlterTableOperation::ChangeColumn {
10860 old_name,
10861 new_name,
10862 data_type,
10863 options,
10864 column_position,
10865 }
10866 } else if self.parse_keyword(Keyword::MODIFY) {
10867 let _ = self.parse_keyword(Keyword::COLUMN); let col_name = self.parse_identifier()?;
10869 let data_type = self.parse_data_type()?;
10870 let mut options = vec![];
10871 while let Some(option) = self.parse_optional_column_option()? {
10872 options.push(option);
10873 }
10874
10875 let column_position = self.parse_column_position()?;
10876
10877 AlterTableOperation::ModifyColumn {
10878 col_name,
10879 data_type,
10880 options,
10881 column_position,
10882 }
10883 } else if self.parse_keyword(Keyword::ALTER) {
10884 if self.peek_keyword(Keyword::SORTKEY) {
10885 self.prev_token();
10886 return self.parse_alter_sort_key();
10887 }
10888
10889 let _ = self.parse_keyword(Keyword::COLUMN); let column_name = self.parse_identifier()?;
10891 let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10892
10893 let op: AlterColumnOperation = if self.parse_keywords(&[
10894 Keyword::SET,
10895 Keyword::NOT,
10896 Keyword::NULL,
10897 ]) {
10898 AlterColumnOperation::SetNotNull {}
10899 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10900 AlterColumnOperation::DropNotNull {}
10901 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10902 AlterColumnOperation::SetDefault {
10903 value: self.parse_expr()?,
10904 }
10905 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10906 AlterColumnOperation::DropDefault {}
10907 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10908 self.parse_set_data_type(true)?
10909 } else if self.parse_keyword(Keyword::TYPE) {
10910 self.parse_set_data_type(false)?
10911 } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10912 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10913 Some(GeneratedAs::Always)
10914 } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10915 Some(GeneratedAs::ByDefault)
10916 } else {
10917 None
10918 };
10919
10920 self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10921
10922 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10923
10924 if self.peek_token_ref().token == Token::LParen {
10925 self.expect_token(&Token::LParen)?;
10926 sequence_options = Some(self.parse_create_sequence_options()?);
10927 self.expect_token(&Token::RParen)?;
10928 }
10929
10930 AlterColumnOperation::AddGenerated {
10931 generated_as,
10932 sequence_options,
10933 }
10934 } else {
10935 let message = if is_postgresql {
10936 "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10937 } else {
10938 "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10939 };
10940
10941 return self.expected_ref(message, self.peek_token_ref());
10942 };
10943 AlterTableOperation::AlterColumn { column_name, op }
10944 } else if self.parse_keyword(Keyword::SWAP) {
10945 self.expect_keyword_is(Keyword::WITH)?;
10946 let table_name = self.parse_object_name(false)?;
10947 AlterTableOperation::SwapWith { table_name }
10948 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10949 && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10950 {
10951 let new_owner = self.parse_owner()?;
10952 AlterTableOperation::OwnerTo { new_owner }
10953 } else if dialect_of!(self is PostgreSqlDialect)
10954 && self.parse_keywords(&[Keyword::ATTACH, Keyword::PARTITION])
10955 {
10956 let partition_name = self.parse_object_name(false)?;
10957 let partition_bound = self.parse_partition_for_values()?;
10958 AlterTableOperation::AttachPartitionOf {
10959 partition_name,
10960 partition_bound,
10961 }
10962 } else if dialect_of!(self is PostgreSqlDialect)
10963 && self.parse_keywords(&[Keyword::DETACH, Keyword::PARTITION])
10964 {
10965 let partition_name = self.parse_object_name(false)?;
10966 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
10967 let finalize = self.parse_keyword(Keyword::FINALIZE);
10968 AlterTableOperation::DetachPartitionOf {
10969 partition_name,
10970 concurrently,
10971 finalize,
10972 }
10973 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10974 && self.parse_keyword(Keyword::ATTACH)
10975 {
10976 AlterTableOperation::AttachPartition {
10977 partition: self.parse_part_or_partition()?,
10978 }
10979 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10980 && self.parse_keyword(Keyword::DETACH)
10981 {
10982 AlterTableOperation::DetachPartition {
10983 partition: self.parse_part_or_partition()?,
10984 }
10985 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10986 && self.parse_keyword(Keyword::FREEZE)
10987 {
10988 let partition = self.parse_part_or_partition()?;
10989 let with_name = if self.parse_keyword(Keyword::WITH) {
10990 self.expect_keyword_is(Keyword::NAME)?;
10991 Some(self.parse_identifier()?)
10992 } else {
10993 None
10994 };
10995 AlterTableOperation::FreezePartition {
10996 partition,
10997 with_name,
10998 }
10999 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11000 && self.parse_keyword(Keyword::UNFREEZE)
11001 {
11002 let partition = self.parse_part_or_partition()?;
11003 let with_name = if self.parse_keyword(Keyword::WITH) {
11004 self.expect_keyword_is(Keyword::NAME)?;
11005 Some(self.parse_identifier()?)
11006 } else {
11007 None
11008 };
11009 AlterTableOperation::UnfreezePartition {
11010 partition,
11011 with_name,
11012 }
11013 } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
11014 self.expect_token(&Token::LParen)?;
11015 let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
11016 self.expect_token(&Token::RParen)?;
11017 AlterTableOperation::ClusterBy { exprs }
11018 } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
11019 AlterTableOperation::SuspendRecluster
11020 } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
11021 AlterTableOperation::ResumeRecluster
11022 } else if self.parse_keyword(Keyword::LOCK) {
11023 let equals = self.consume_token(&Token::Eq);
11024 let lock = match self.parse_one_of_keywords(&[
11025 Keyword::DEFAULT,
11026 Keyword::EXCLUSIVE,
11027 Keyword::NONE,
11028 Keyword::SHARED,
11029 ]) {
11030 Some(Keyword::DEFAULT) => AlterTableLock::Default,
11031 Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
11032 Some(Keyword::NONE) => AlterTableLock::None,
11033 Some(Keyword::SHARED) => AlterTableLock::Shared,
11034 _ => self.expected_ref(
11035 "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
11036 self.peek_token_ref(),
11037 )?,
11038 };
11039 AlterTableOperation::Lock { equals, lock }
11040 } else if self.parse_keyword(Keyword::ALGORITHM) {
11041 let equals = self.consume_token(&Token::Eq);
11042 let algorithm = match self.parse_one_of_keywords(&[
11043 Keyword::DEFAULT,
11044 Keyword::INSTANT,
11045 Keyword::INPLACE,
11046 Keyword::COPY,
11047 ]) {
11048 Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
11049 Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
11050 Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
11051 Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
11052 _ => self.expected_ref(
11053 "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
11054 self.peek_token_ref(),
11055 )?,
11056 };
11057 AlterTableOperation::Algorithm { equals, algorithm }
11058 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
11059 let equals = self.consume_token(&Token::Eq);
11060 let value = self.parse_number_value()?;
11061 AlterTableOperation::AutoIncrement { equals, value }
11062 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
11063 let identity = if self.parse_keyword(Keyword::NOTHING) {
11064 ReplicaIdentity::Nothing
11065 } else if self.parse_keyword(Keyword::FULL) {
11066 ReplicaIdentity::Full
11067 } else if self.parse_keyword(Keyword::DEFAULT) {
11068 ReplicaIdentity::Default
11069 } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
11070 ReplicaIdentity::Index(self.parse_identifier()?)
11071 } else {
11072 return self.expected_ref(
11073 "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
11074 self.peek_token_ref(),
11075 );
11076 };
11077
11078 AlterTableOperation::ReplicaIdentity { identity }
11079 } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11080 let name = self.parse_identifier()?;
11081 AlterTableOperation::ValidateConstraint { name }
11082 } else if self.parse_keywords(&[Keyword::SET, Keyword::TABLESPACE]) {
11083 let tablespace_name = self.parse_identifier()?;
11084 AlterTableOperation::SetTablespace { tablespace_name }
11085 } else {
11086 let mut options =
11087 self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
11088 if !options.is_empty() {
11089 AlterTableOperation::SetTblProperties {
11090 table_properties: options,
11091 }
11092 } else {
11093 options = self.parse_options(Keyword::SET)?;
11094 if !options.is_empty() {
11095 AlterTableOperation::SetOptionsParens { options }
11096 } else {
11097 return self.expected_ref(
11098 "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
11099 self.peek_token_ref(),
11100 );
11101 }
11102 }
11103 };
11104 Ok(operation)
11105 }
11106
11107 fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
11108 let data_type = self.parse_data_type()?;
11109 let using = if self.dialect.supports_alter_column_type_using()
11110 && self.parse_keyword(Keyword::USING)
11111 {
11112 Some(self.parse_expr()?)
11113 } else {
11114 None
11115 };
11116 Ok(AlterColumnOperation::SetDataType {
11117 data_type,
11118 using,
11119 had_set,
11120 })
11121 }
11122
11123 fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
11124 let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
11125 match keyword {
11126 Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
11127 Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
11128 unexpected_keyword => Err(ParserError::ParserError(
11130 format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
11131 )),
11132 }
11133 }
11134
11135 pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
11137 let object_type = self.expect_one_of_keywords(&[
11138 Keyword::VIEW,
11139 Keyword::TYPE,
11140 Keyword::COLLATION,
11141 Keyword::TABLE,
11142 Keyword::INDEX,
11143 Keyword::FUNCTION,
11144 Keyword::AGGREGATE,
11145 Keyword::ROLE,
11146 Keyword::POLICY,
11147 Keyword::CONNECTOR,
11148 Keyword::ICEBERG,
11149 Keyword::SCHEMA,
11150 Keyword::USER,
11151 Keyword::OPERATOR,
11152 Keyword::DOMAIN,
11153 Keyword::TRIGGER,
11154 Keyword::EXTENSION,
11155 Keyword::PROCEDURE,
11156 Keyword::DEFAULT,
11157 ])?;
11158 match object_type {
11159 Keyword::SCHEMA => {
11160 self.prev_token();
11161 self.prev_token();
11162 self.parse_alter_schema()
11163 }
11164 Keyword::VIEW => self.parse_alter_view(),
11165 Keyword::TYPE => self.parse_alter_type(),
11166 Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
11167 Keyword::TABLE => self.parse_alter_table(false),
11168 Keyword::ICEBERG => {
11169 self.expect_keyword(Keyword::TABLE)?;
11170 self.parse_alter_table(true)
11171 }
11172 Keyword::DEFAULT => self.parse_alter_default_privileges().map(Into::into),
11173 Keyword::INDEX => {
11174 let index_name = self.parse_object_name(false)?;
11175 let operation = if self.parse_keyword(Keyword::RENAME) {
11176 if self.parse_keyword(Keyword::TO) {
11177 let index_name = self.parse_object_name(false)?;
11178 AlterIndexOperation::RenameIndex { index_name }
11179 } else {
11180 return self.expected_ref("TO after RENAME", self.peek_token_ref());
11181 }
11182 } else if self.parse_keywords(&[Keyword::SET, Keyword::TABLESPACE]) {
11183 let tablespace_name = self.parse_identifier()?;
11184 AlterIndexOperation::SetTablespace { tablespace_name }
11185 } else {
11186 return self.expected_ref(
11187 "RENAME or SET TABLESPACE after ALTER INDEX",
11188 self.peek_token_ref(),
11189 );
11190 };
11191
11192 Ok(Statement::AlterIndex {
11193 name: index_name,
11194 operation,
11195 })
11196 }
11197 Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
11198 Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
11199 Keyword::PROCEDURE => self.parse_alter_function(AlterFunctionKind::Procedure),
11200 Keyword::OPERATOR => {
11201 if self.parse_keyword(Keyword::FAMILY) {
11202 self.parse_alter_operator_family().map(Into::into)
11203 } else if self.parse_keyword(Keyword::CLASS) {
11204 self.parse_alter_operator_class().map(Into::into)
11205 } else {
11206 self.parse_alter_operator().map(Into::into)
11207 }
11208 }
11209 Keyword::ROLE => self.parse_alter_role(),
11210 Keyword::POLICY => self.parse_alter_policy().map(Into::into),
11211 Keyword::CONNECTOR => self.parse_alter_connector(),
11212 Keyword::USER => self.parse_alter_user().map(Into::into),
11213 Keyword::DOMAIN => self.parse_alter_domain(),
11214 Keyword::TRIGGER => self.parse_alter_trigger(),
11215 Keyword::EXTENSION => self.parse_alter_extension(),
11216 unexpected_keyword => Err(ParserError::ParserError(
11218 format!("Internal parser error: expected any of {{VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR, DOMAIN, TRIGGER, EXTENSION, PROCEDURE, DEFAULT}}, got {unexpected_keyword:?}"),
11219 )),
11220 }
11221 }
11222
11223 fn parse_alter_aggregate_signature(
11224 &mut self,
11225 ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
11226 let name = self.parse_object_name(false)?;
11227 self.expect_token(&Token::LParen)?;
11228
11229 if self.consume_token(&Token::Mul) {
11230 self.expect_token(&Token::RParen)?;
11231 return Ok((
11232 FunctionDesc {
11233 name,
11234 args: Some(vec![]),
11235 },
11236 true,
11237 None,
11238 ));
11239 }
11240
11241 let args =
11242 if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
11243 vec![]
11244 } else {
11245 self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
11246 };
11247
11248 let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11249 Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
11250 } else {
11251 None
11252 };
11253
11254 self.expect_token(&Token::RParen)?;
11255 Ok((
11256 FunctionDesc {
11257 name,
11258 args: Some(args),
11259 },
11260 false,
11261 aggregate_order_by,
11262 ))
11263 }
11264
11265 fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
11266 let action = if self.parse_keywords(&[
11267 Keyword::CALLED,
11268 Keyword::ON,
11269 Keyword::NULL,
11270 Keyword::INPUT,
11271 ]) {
11272 Some(AlterFunctionAction::CalledOnNull(
11273 FunctionCalledOnNull::CalledOnNullInput,
11274 ))
11275 } else if self.parse_keywords(&[
11276 Keyword::RETURNS,
11277 Keyword::NULL,
11278 Keyword::ON,
11279 Keyword::NULL,
11280 Keyword::INPUT,
11281 ]) {
11282 Some(AlterFunctionAction::CalledOnNull(
11283 FunctionCalledOnNull::ReturnsNullOnNullInput,
11284 ))
11285 } else if self.parse_keyword(Keyword::STRICT) {
11286 Some(AlterFunctionAction::CalledOnNull(
11287 FunctionCalledOnNull::Strict,
11288 ))
11289 } else if self.parse_keyword(Keyword::IMMUTABLE) {
11290 Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
11291 } else if self.parse_keyword(Keyword::STABLE) {
11292 Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
11293 } else if self.parse_keyword(Keyword::VOLATILE) {
11294 Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
11295 } else if self.parse_keyword(Keyword::NOT) {
11296 self.expect_keyword(Keyword::LEAKPROOF)?;
11297 Some(AlterFunctionAction::Leakproof(false))
11298 } else if self.parse_keyword(Keyword::LEAKPROOF) {
11299 Some(AlterFunctionAction::Leakproof(true))
11300 } else if self.parse_keyword(Keyword::EXTERNAL) {
11301 self.expect_keyword(Keyword::SECURITY)?;
11302 let security = if self.parse_keyword(Keyword::DEFINER) {
11303 FunctionSecurity::Definer
11304 } else if self.parse_keyword(Keyword::INVOKER) {
11305 FunctionSecurity::Invoker
11306 } else {
11307 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11308 };
11309 Some(AlterFunctionAction::Security {
11310 external: true,
11311 security,
11312 })
11313 } else if self.parse_keyword(Keyword::SECURITY) {
11314 let security = if self.parse_keyword(Keyword::DEFINER) {
11315 FunctionSecurity::Definer
11316 } else if self.parse_keyword(Keyword::INVOKER) {
11317 FunctionSecurity::Invoker
11318 } else {
11319 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11320 };
11321 Some(AlterFunctionAction::Security {
11322 external: false,
11323 security,
11324 })
11325 } else if self.parse_keyword(Keyword::PARALLEL) {
11326 let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11327 FunctionParallel::Unsafe
11328 } else if self.parse_keyword(Keyword::RESTRICTED) {
11329 FunctionParallel::Restricted
11330 } else if self.parse_keyword(Keyword::SAFE) {
11331 FunctionParallel::Safe
11332 } else {
11333 return self
11334 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11335 };
11336 Some(AlterFunctionAction::Parallel(parallel))
11337 } else if self.parse_keyword(Keyword::COST) {
11338 Some(AlterFunctionAction::Cost(self.parse_number()?))
11339 } else if self.parse_keyword(Keyword::ROWS) {
11340 Some(AlterFunctionAction::Rows(self.parse_number()?))
11341 } else if self.parse_keyword(Keyword::SUPPORT) {
11342 Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11343 } else if self.parse_keyword(Keyword::SET) {
11344 let name = self.parse_object_name(false)?;
11345 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11346 FunctionSetValue::FromCurrent
11347 } else {
11348 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11349 return self.expected_ref("= or TO", self.peek_token_ref());
11350 }
11351 if self.parse_keyword(Keyword::DEFAULT) {
11352 FunctionSetValue::Default
11353 } else {
11354 FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11355 }
11356 };
11357 Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11358 name,
11359 value,
11360 }))
11361 } else if self.parse_keyword(Keyword::RESET) {
11362 let reset_config = if self.parse_keyword(Keyword::ALL) {
11363 ResetConfig::ALL
11364 } else {
11365 ResetConfig::ConfigName(self.parse_object_name(false)?)
11366 };
11367 Some(AlterFunctionAction::Reset(reset_config))
11368 } else {
11369 None
11370 };
11371
11372 Ok(action)
11373 }
11374
11375 fn parse_alter_function_actions(
11376 &mut self,
11377 ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11378 let mut actions = vec![];
11379 while let Some(action) = self.parse_alter_function_action()? {
11380 actions.push(action);
11381 }
11382 if actions.is_empty() {
11383 return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11384 }
11385 let restrict = self.parse_keyword(Keyword::RESTRICT);
11386 Ok((actions, restrict))
11387 }
11388
11389 pub fn parse_alter_function(
11391 &mut self,
11392 kind: AlterFunctionKind,
11393 ) -> Result<Statement, ParserError> {
11394 let (function, aggregate_star, aggregate_order_by) = match kind {
11395 AlterFunctionKind::Function | AlterFunctionKind::Procedure => {
11396 (self.parse_function_desc()?, false, None)
11397 }
11398 AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11399 };
11400
11401 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11402 let new_name = self.parse_identifier()?;
11403 AlterFunctionOperation::RenameTo { new_name }
11404 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11405 AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11406 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11407 AlterFunctionOperation::SetSchema {
11408 schema_name: self.parse_object_name(false)?,
11409 }
11410 } else if matches!(
11411 kind,
11412 AlterFunctionKind::Function | AlterFunctionKind::Procedure
11413 ) && self.parse_keyword(Keyword::NO)
11414 {
11415 if !self.parse_keyword(Keyword::DEPENDS) {
11416 return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11417 }
11418 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11419 AlterFunctionOperation::DependsOnExtension {
11420 no: true,
11421 extension_name: self.parse_object_name(false)?,
11422 }
11423 } else if matches!(
11424 kind,
11425 AlterFunctionKind::Function | AlterFunctionKind::Procedure
11426 ) && self.parse_keyword(Keyword::DEPENDS)
11427 {
11428 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11429 AlterFunctionOperation::DependsOnExtension {
11430 no: false,
11431 extension_name: self.parse_object_name(false)?,
11432 }
11433 } else if matches!(
11434 kind,
11435 AlterFunctionKind::Function | AlterFunctionKind::Procedure
11436 ) {
11437 let (actions, restrict) = self.parse_alter_function_actions()?;
11438 AlterFunctionOperation::Actions { actions, restrict }
11439 } else {
11440 return self.expected_ref(
11441 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11442 self.peek_token_ref(),
11443 );
11444 };
11445
11446 Ok(Statement::AlterFunction(AlterFunction {
11447 kind,
11448 function,
11449 aggregate_order_by,
11450 aggregate_star,
11451 operation,
11452 }))
11453 }
11454
11455 pub fn parse_alter_domain(&mut self) -> Result<Statement, ParserError> {
11457 let name = self.parse_object_name(false)?;
11458
11459 let operation = if self.parse_keyword(Keyword::ADD) {
11460 if let Some(constraint) = self.parse_optional_table_constraint()? {
11461 let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
11462 AlterDomainOperation::AddConstraint {
11463 constraint,
11464 not_valid,
11465 }
11466 } else {
11467 return self.expected_ref("constraint after ADD", self.peek_token_ref());
11468 }
11469 } else if self.parse_keywords(&[Keyword::DROP, Keyword::CONSTRAINT]) {
11470 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11471 let name = self.parse_identifier()?;
11472 let drop_behavior = self.parse_optional_drop_behavior();
11473 AlterDomainOperation::DropConstraint {
11474 if_exists,
11475 name,
11476 drop_behavior,
11477 }
11478 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
11479 AlterDomainOperation::DropDefault
11480 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::CONSTRAINT]) {
11481 let old_name = self.parse_identifier()?;
11482 self.expect_keyword_is(Keyword::TO)?;
11483 let new_name = self.parse_identifier()?;
11484 AlterDomainOperation::RenameConstraint { old_name, new_name }
11485 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11486 let new_name = self.parse_identifier()?;
11487 AlterDomainOperation::RenameTo { new_name }
11488 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11489 AlterDomainOperation::OwnerTo(self.parse_owner()?)
11490 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11491 AlterDomainOperation::SetSchema {
11492 schema_name: self.parse_object_name(false)?,
11493 }
11494 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
11495 AlterDomainOperation::SetDefault {
11496 default: self.parse_expr()?,
11497 }
11498 } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11499 let name = self.parse_identifier()?;
11500 AlterDomainOperation::ValidateConstraint { name }
11501 } else {
11502 return self.expected_ref(
11503 "ADD, DROP, RENAME, OWNER TO, SET, VALIDATE after ALTER DOMAIN",
11504 self.peek_token_ref(),
11505 );
11506 };
11507
11508 Ok(AlterDomain { name, operation }.into())
11509 }
11510
11511 pub fn parse_alter_trigger(&mut self) -> Result<Statement, ParserError> {
11513 let name = self.parse_identifier()?;
11514 self.expect_keyword_is(Keyword::ON)?;
11515 let table_name = self.parse_object_name(false)?;
11516
11517 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11518 let new_name = self.parse_identifier()?;
11519 AlterTriggerOperation::RenameTo { new_name }
11520 } else {
11521 return self.expected_ref(
11522 "RENAME TO after ALTER TRIGGER ... ON ...",
11523 self.peek_token_ref(),
11524 );
11525 };
11526
11527 Ok(AlterTrigger {
11528 name,
11529 table_name,
11530 operation,
11531 }
11532 .into())
11533 }
11534
11535 pub fn parse_alter_extension(&mut self) -> Result<Statement, ParserError> {
11537 let name = self.parse_identifier()?;
11538
11539 let operation = if self.parse_keyword(Keyword::UPDATE) {
11540 let version = if self.parse_keyword(Keyword::TO) {
11541 Some(self.parse_identifier()?)
11542 } else {
11543 None
11544 };
11545 AlterExtensionOperation::UpdateTo { version }
11546 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11547 AlterExtensionOperation::SetSchema {
11548 schema_name: self.parse_object_name(false)?,
11549 }
11550 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11551 AlterExtensionOperation::OwnerTo(self.parse_owner()?)
11552 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11553 let new_name = self.parse_identifier()?;
11554 AlterExtensionOperation::RenameTo { new_name }
11555 } else {
11556 return self.expected_ref(
11557 "UPDATE, SET SCHEMA, OWNER TO, or RENAME TO after ALTER EXTENSION",
11558 self.peek_token_ref(),
11559 );
11560 };
11561
11562 Ok(AlterExtension { name, operation }.into())
11563 }
11564
11565 pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11567 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11568 let only = self.parse_keyword(Keyword::ONLY); let table_name = self.parse_object_name(false)?;
11570 let on_cluster = self.parse_optional_on_cluster()?;
11571 let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11572
11573 let mut location = None;
11574 if self.parse_keyword(Keyword::LOCATION) {
11575 location = Some(HiveSetLocation {
11576 has_set: false,
11577 location: self.parse_identifier()?,
11578 });
11579 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11580 location = Some(HiveSetLocation {
11581 has_set: true,
11582 location: self.parse_identifier()?,
11583 });
11584 }
11585
11586 let end_token = if self.peek_token_ref().token == Token::SemiColon {
11587 self.peek_token_ref().clone()
11588 } else {
11589 self.get_current_token().clone()
11590 };
11591
11592 Ok(AlterTable {
11593 name: table_name,
11594 if_exists,
11595 only,
11596 operations,
11597 location,
11598 on_cluster,
11599 table_type: if iceberg {
11600 Some(AlterTableType::Iceberg)
11601 } else {
11602 None
11603 },
11604 end_token: AttachedToken(end_token),
11605 }
11606 .into())
11607 }
11608
11609 pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11611 let name = self.parse_object_name(false)?;
11612 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11613
11614 let with_options = self.parse_options(Keyword::WITH)?;
11615
11616 self.expect_keyword_is(Keyword::AS)?;
11617 let query = self.parse_query()?;
11618
11619 Ok(Statement::AlterView {
11620 name,
11621 columns,
11622 query,
11623 with_options,
11624 })
11625 }
11626
11627 pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11629 let name = self.parse_object_name(false)?;
11630
11631 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11632 let new_name = self.parse_identifier()?;
11633 AlterTypeOperation::Rename(AlterTypeRename { new_name })
11634 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11635 let existing_enum_value = self.parse_identifier()?;
11636 self.expect_keyword(Keyword::TO)?;
11637 let new_enum_value = self.parse_identifier()?;
11638 AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11639 from: existing_enum_value,
11640 to: new_enum_value,
11641 })
11642 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::ATTRIBUTE]) {
11643 let old_name = self.parse_identifier()?;
11644 self.expect_keyword(Keyword::TO)?;
11645 let new_name = self.parse_identifier()?;
11646 let drop_behavior = self.parse_optional_drop_behavior();
11647 AlterTypeOperation::RenameAttribute {
11648 old_name,
11649 new_name,
11650 drop_behavior,
11651 }
11652 } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11653 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11654 let new_enum_value = self.parse_identifier()?;
11655 let position = if self.parse_keyword(Keyword::BEFORE) {
11656 Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11657 } else if self.parse_keyword(Keyword::AFTER) {
11658 Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11659 } else {
11660 None
11661 };
11662 AlterTypeOperation::AddValue(AlterTypeAddValue {
11663 if_not_exists,
11664 value: new_enum_value,
11665 position,
11666 })
11667 } else if self.parse_keywords(&[Keyword::ADD, Keyword::ATTRIBUTE]) {
11668 let attr_name = self.parse_identifier()?;
11669 let data_type = self.parse_data_type()?;
11670 let collation = if self.parse_keyword(Keyword::COLLATE) {
11671 Some(self.parse_object_name(false)?)
11672 } else {
11673 None
11674 };
11675 let drop_behavior = self.parse_optional_drop_behavior();
11676 AlterTypeOperation::AddAttribute {
11677 name: attr_name,
11678 data_type,
11679 collation,
11680 drop_behavior,
11681 }
11682 } else if self.parse_keywords(&[Keyword::DROP, Keyword::ATTRIBUTE]) {
11683 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11684 let attr_name = self.parse_identifier()?;
11685 let drop_behavior = self.parse_optional_drop_behavior();
11686 AlterTypeOperation::DropAttribute {
11687 if_exists,
11688 name: attr_name,
11689 drop_behavior,
11690 }
11691 } else if self.parse_keywords(&[Keyword::ALTER, Keyword::ATTRIBUTE]) {
11692 let attr_name = self.parse_identifier()?;
11693 let _ = self.parse_keywords(&[Keyword::SET, Keyword::DATA]);
11697 self.expect_keyword(Keyword::TYPE)?;
11698 let data_type = self.parse_data_type()?;
11699 let collation = if self.parse_keyword(Keyword::COLLATE) {
11700 Some(self.parse_object_name(false)?)
11701 } else {
11702 None
11703 };
11704 let drop_behavior = self.parse_optional_drop_behavior();
11705 AlterTypeOperation::AlterAttribute {
11706 name: attr_name,
11707 data_type,
11708 collation,
11709 drop_behavior,
11710 }
11711 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11712 let new_owner = self.parse_owner()?;
11713 AlterTypeOperation::OwnerTo { new_owner }
11714 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11715 let new_schema = self.parse_object_name(false)?;
11716 AlterTypeOperation::SetSchema { new_schema }
11717 } else {
11718 return self.expected_ref(
11719 "{RENAME TO | RENAME VALUE | RENAME ATTRIBUTE | ADD VALUE | \
11720 ADD ATTRIBUTE | DROP ATTRIBUTE | ALTER ATTRIBUTE | OWNER TO | SET SCHEMA}",
11721 self.peek_token_ref(),
11722 );
11723 };
11724
11725 Ok(Statement::AlterType(AlterType { name, operation }))
11726 }
11727
11728 pub fn parse_alter_default_privileges(
11735 &mut self,
11736 ) -> Result<AlterDefaultPrivileges, ParserError> {
11737 self.expect_keyword(Keyword::PRIVILEGES)?;
11738
11739 let for_roles = if self.parse_keyword(Keyword::FOR) {
11740 self.expect_one_of_keywords(&[Keyword::ROLE, Keyword::USER])?;
11742 self.parse_comma_separated(Parser::parse_identifier)?
11743 } else {
11744 Vec::new()
11745 };
11746
11747 let in_schemas = if self.parse_keywords(&[Keyword::IN, Keyword::SCHEMA]) {
11748 self.parse_comma_separated(Parser::parse_identifier)?
11749 } else {
11750 Vec::new()
11751 };
11752
11753 let action = self.parse_alter_default_privileges_action()?;
11754
11755 Ok(AlterDefaultPrivileges {
11756 for_roles,
11757 in_schemas,
11758 action,
11759 })
11760 }
11761
11762 fn parse_alter_default_privileges_action(
11763 &mut self,
11764 ) -> Result<AlterDefaultPrivilegesAction, ParserError> {
11765 let kw = self.expect_one_of_keywords(&[Keyword::GRANT, Keyword::REVOKE])?;
11766 match kw {
11767 Keyword::GRANT => {
11768 let privileges = self.parse_alter_default_privileges_privileges()?;
11769 self.expect_keyword(Keyword::ON)?;
11770 let object_type = self.parse_alter_default_privileges_object_type()?;
11771 self.expect_keyword(Keyword::TO)?;
11772 let grantees = self.parse_grantees()?;
11773 let with_grant_option =
11774 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
11775 Ok(AlterDefaultPrivilegesAction::Grant {
11776 privileges,
11777 object_type,
11778 grantees,
11779 with_grant_option,
11780 })
11781 }
11782 Keyword::REVOKE => {
11783 let grant_option_for =
11784 self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
11785 let privileges = self.parse_alter_default_privileges_privileges()?;
11786 self.expect_keyword(Keyword::ON)?;
11787 let object_type = self.parse_alter_default_privileges_object_type()?;
11788 self.expect_keyword(Keyword::FROM)?;
11789 let grantees = self.parse_grantees()?;
11790 let cascade = self.parse_cascade_option();
11791 Ok(AlterDefaultPrivilegesAction::Revoke {
11792 grant_option_for,
11793 privileges,
11794 object_type,
11795 grantees,
11796 cascade,
11797 })
11798 }
11799 unexpected_keyword => Err(ParserError::ParserError(format!(
11800 "Internal parser error: expected GRANT or REVOKE, got {unexpected_keyword:?}"
11801 ))),
11802 }
11803 }
11804
11805 fn parse_alter_default_privileges_privileges(&mut self) -> Result<Privileges, ParserError> {
11806 if self.parse_keyword(Keyword::ALL) {
11807 Ok(Privileges::All {
11808 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
11809 })
11810 } else {
11811 Ok(Privileges::Actions(self.parse_actions_list()?))
11812 }
11813 }
11814
11815 fn parse_alter_default_privileges_object_type(
11816 &mut self,
11817 ) -> Result<AlterDefaultPrivilegesObjectType, ParserError> {
11818 let kw = self.expect_one_of_keywords(&[
11819 Keyword::TABLES,
11820 Keyword::SEQUENCES,
11821 Keyword::FUNCTIONS,
11822 Keyword::ROUTINES,
11823 Keyword::TYPES,
11824 Keyword::SCHEMAS,
11825 ])?;
11826 match kw {
11827 Keyword::TABLES => Ok(AlterDefaultPrivilegesObjectType::Tables),
11828 Keyword::SEQUENCES => Ok(AlterDefaultPrivilegesObjectType::Sequences),
11829 Keyword::FUNCTIONS => Ok(AlterDefaultPrivilegesObjectType::Functions),
11830 Keyword::ROUTINES => Ok(AlterDefaultPrivilegesObjectType::Routines),
11831 Keyword::TYPES => Ok(AlterDefaultPrivilegesObjectType::Types),
11832 Keyword::SCHEMAS => Ok(AlterDefaultPrivilegesObjectType::Schemas),
11833 unexpected_keyword => Err(ParserError::ParserError(format!(
11834 "Internal parser error: expected one of {{TABLES, SEQUENCES, FUNCTIONS, ROUTINES, TYPES, SCHEMAS}}, got {unexpected_keyword:?}"
11835 ))),
11836 }
11837 }
11838
11839 pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11843 let name = self.parse_object_name(false)?;
11844 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11845 AlterCollationOperation::RenameTo {
11846 new_name: self.parse_identifier()?,
11847 }
11848 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11849 AlterCollationOperation::OwnerTo(self.parse_owner()?)
11850 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11851 AlterCollationOperation::SetSchema {
11852 schema_name: self.parse_object_name(false)?,
11853 }
11854 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11855 AlterCollationOperation::RefreshVersion
11856 } else {
11857 return self.expected_ref(
11858 "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11859 self.peek_token_ref(),
11860 );
11861 };
11862
11863 Ok(AlterCollation { name, operation })
11864 }
11865
11866 pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11870 let name = self.parse_operator_name()?;
11871
11872 self.expect_token(&Token::LParen)?;
11874
11875 let left_type = if self.parse_keyword(Keyword::NONE) {
11876 None
11877 } else {
11878 Some(self.parse_data_type()?)
11879 };
11880
11881 self.expect_token(&Token::Comma)?;
11882 let right_type = self.parse_data_type()?;
11883 self.expect_token(&Token::RParen)?;
11884
11885 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11887 let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11888 Owner::CurrentRole
11889 } else if self.parse_keyword(Keyword::CURRENT_USER) {
11890 Owner::CurrentUser
11891 } else if self.parse_keyword(Keyword::SESSION_USER) {
11892 Owner::SessionUser
11893 } else {
11894 Owner::Ident(self.parse_identifier()?)
11895 };
11896 AlterOperatorOperation::OwnerTo(owner)
11897 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11898 let schema_name = self.parse_object_name(false)?;
11899 AlterOperatorOperation::SetSchema { schema_name }
11900 } else if self.parse_keyword(Keyword::SET) {
11901 self.expect_token(&Token::LParen)?;
11902
11903 let mut options = Vec::new();
11904 loop {
11905 let keyword = self.expect_one_of_keywords(&[
11906 Keyword::RESTRICT,
11907 Keyword::JOIN,
11908 Keyword::COMMUTATOR,
11909 Keyword::NEGATOR,
11910 Keyword::HASHES,
11911 Keyword::MERGES,
11912 ])?;
11913
11914 match keyword {
11915 Keyword::RESTRICT => {
11916 self.expect_token(&Token::Eq)?;
11917 let proc_name = if self.parse_keyword(Keyword::NONE) {
11918 None
11919 } else {
11920 Some(self.parse_object_name(false)?)
11921 };
11922 options.push(OperatorOption::Restrict(proc_name));
11923 }
11924 Keyword::JOIN => {
11925 self.expect_token(&Token::Eq)?;
11926 let proc_name = if self.parse_keyword(Keyword::NONE) {
11927 None
11928 } else {
11929 Some(self.parse_object_name(false)?)
11930 };
11931 options.push(OperatorOption::Join(proc_name));
11932 }
11933 Keyword::COMMUTATOR => {
11934 self.expect_token(&Token::Eq)?;
11935 let op_name = self.parse_operator_name()?;
11936 options.push(OperatorOption::Commutator(op_name));
11937 }
11938 Keyword::NEGATOR => {
11939 self.expect_token(&Token::Eq)?;
11940 let op_name = self.parse_operator_name()?;
11941 options.push(OperatorOption::Negator(op_name));
11942 }
11943 Keyword::HASHES => {
11944 options.push(OperatorOption::Hashes);
11945 }
11946 Keyword::MERGES => {
11947 options.push(OperatorOption::Merges);
11948 }
11949 unexpected_keyword => return Err(ParserError::ParserError(
11950 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11951 )),
11952 }
11953
11954 if !self.consume_token(&Token::Comma) {
11955 break;
11956 }
11957 }
11958
11959 self.expect_token(&Token::RParen)?;
11960 AlterOperatorOperation::Set { options }
11961 } else {
11962 return self.expected_ref(
11963 "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11964 self.peek_token_ref(),
11965 );
11966 };
11967
11968 Ok(AlterOperator {
11969 name,
11970 left_type,
11971 right_type,
11972 operation,
11973 })
11974 }
11975
11976 fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11978 let strategy_number = self.parse_literal_uint()?;
11979 let operator_name = self.parse_operator_name()?;
11980
11981 self.expect_token(&Token::LParen)?;
11983 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11984 self.expect_token(&Token::RParen)?;
11985
11986 let purpose = if self.parse_keyword(Keyword::FOR) {
11988 if self.parse_keyword(Keyword::SEARCH) {
11989 Some(OperatorPurpose::ForSearch)
11990 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11991 let sort_family = self.parse_object_name(false)?;
11992 Some(OperatorPurpose::ForOrderBy { sort_family })
11993 } else {
11994 return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11995 }
11996 } else {
11997 None
11998 };
11999
12000 Ok(OperatorFamilyItem::Operator {
12001 strategy_number,
12002 operator_name,
12003 op_types,
12004 purpose,
12005 })
12006 }
12007
12008 fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
12010 let support_number = self.parse_literal_uint()?;
12011
12012 let op_types =
12014 if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
12015 let types = self.parse_comma_separated(Parser::parse_data_type)?;
12016 self.expect_token(&Token::RParen)?;
12017 Some(types)
12018 } else if self.consume_token(&Token::LParen) {
12019 self.expect_token(&Token::RParen)?;
12020 Some(vec![])
12021 } else {
12022 None
12023 };
12024
12025 let function_name = self.parse_object_name(false)?;
12026
12027 let argument_types = if self.consume_token(&Token::LParen) {
12029 if self.peek_token_ref().token == Token::RParen {
12030 self.expect_token(&Token::RParen)?;
12031 vec![]
12032 } else {
12033 let types = self.parse_comma_separated(Parser::parse_data_type)?;
12034 self.expect_token(&Token::RParen)?;
12035 types
12036 }
12037 } else {
12038 vec![]
12039 };
12040
12041 Ok(OperatorFamilyItem::Function {
12042 support_number,
12043 op_types,
12044 function_name,
12045 argument_types,
12046 })
12047 }
12048
12049 fn parse_operator_family_drop_operator(
12051 &mut self,
12052 ) -> Result<OperatorFamilyDropItem, ParserError> {
12053 let strategy_number = self.parse_literal_uint()?;
12054
12055 self.expect_token(&Token::LParen)?;
12057 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
12058 self.expect_token(&Token::RParen)?;
12059
12060 Ok(OperatorFamilyDropItem::Operator {
12061 strategy_number,
12062 op_types,
12063 })
12064 }
12065
12066 fn parse_operator_family_drop_function(
12068 &mut self,
12069 ) -> Result<OperatorFamilyDropItem, ParserError> {
12070 let support_number = self.parse_literal_uint()?;
12071
12072 self.expect_token(&Token::LParen)?;
12074 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
12075 self.expect_token(&Token::RParen)?;
12076
12077 Ok(OperatorFamilyDropItem::Function {
12078 support_number,
12079 op_types,
12080 })
12081 }
12082
12083 fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
12085 if self.parse_keyword(Keyword::OPERATOR) {
12086 self.parse_operator_family_add_operator()
12087 } else if self.parse_keyword(Keyword::FUNCTION) {
12088 self.parse_operator_family_add_function()
12089 } else {
12090 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
12091 }
12092 }
12093
12094 fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
12096 if self.parse_keyword(Keyword::OPERATOR) {
12097 self.parse_operator_family_drop_operator()
12098 } else if self.parse_keyword(Keyword::FUNCTION) {
12099 self.parse_operator_family_drop_function()
12100 } else {
12101 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
12102 }
12103 }
12104
12105 pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
12108 let name = self.parse_object_name(false)?;
12109 self.expect_keyword(Keyword::USING)?;
12110 let using = self.parse_identifier()?;
12111
12112 let operation = if self.parse_keyword(Keyword::ADD) {
12113 let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
12114 AlterOperatorFamilyOperation::Add { items }
12115 } else if self.parse_keyword(Keyword::DROP) {
12116 let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
12117 AlterOperatorFamilyOperation::Drop { items }
12118 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
12119 let new_name = self.parse_object_name(false)?;
12120 AlterOperatorFamilyOperation::RenameTo { new_name }
12121 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
12122 let owner = self.parse_owner()?;
12123 AlterOperatorFamilyOperation::OwnerTo(owner)
12124 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
12125 let schema_name = self.parse_object_name(false)?;
12126 AlterOperatorFamilyOperation::SetSchema { schema_name }
12127 } else {
12128 return self.expected_ref(
12129 "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
12130 self.peek_token_ref(),
12131 );
12132 };
12133
12134 Ok(AlterOperatorFamily {
12135 name,
12136 using,
12137 operation,
12138 })
12139 }
12140
12141 pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
12145 let name = self.parse_object_name(false)?;
12146 self.expect_keyword(Keyword::USING)?;
12147 let using = self.parse_identifier()?;
12148
12149 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
12150 let new_name = self.parse_object_name(false)?;
12151 AlterOperatorClassOperation::RenameTo { new_name }
12152 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
12153 let owner = self.parse_owner()?;
12154 AlterOperatorClassOperation::OwnerTo(owner)
12155 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
12156 let schema_name = self.parse_object_name(false)?;
12157 AlterOperatorClassOperation::SetSchema { schema_name }
12158 } else {
12159 return self.expected_ref(
12160 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
12161 self.peek_token_ref(),
12162 );
12163 };
12164
12165 Ok(AlterOperatorClass {
12166 name,
12167 using,
12168 operation,
12169 })
12170 }
12171
12172 pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
12176 self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
12177 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
12178 let name = self.parse_object_name(false)?;
12179 let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
12180 self.prev_token();
12181 let options = self.parse_options(Keyword::OPTIONS)?;
12182 AlterSchemaOperation::SetOptionsParens { options }
12183 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
12184 let collate = self.parse_expr()?;
12185 AlterSchemaOperation::SetDefaultCollate { collate }
12186 } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
12187 let replica = self.parse_identifier()?;
12188 let options = if self.peek_keyword(Keyword::OPTIONS) {
12189 Some(self.parse_options(Keyword::OPTIONS)?)
12190 } else {
12191 None
12192 };
12193 AlterSchemaOperation::AddReplica { replica, options }
12194 } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
12195 let replica = self.parse_identifier()?;
12196 AlterSchemaOperation::DropReplica { replica }
12197 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
12198 let new_name = self.parse_object_name(false)?;
12199 AlterSchemaOperation::Rename { name: new_name }
12200 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
12201 let owner = self.parse_owner()?;
12202 AlterSchemaOperation::OwnerTo { owner }
12203 } else {
12204 return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
12205 };
12206 Ok(Statement::AlterSchema(AlterSchema {
12207 name,
12208 if_exists,
12209 operations: vec![operation],
12210 }))
12211 }
12212
12213 pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
12216 let object_name = self.parse_object_name(false)?;
12217 if self.peek_token_ref().token == Token::LParen {
12218 match self.parse_function(object_name)? {
12219 Expr::Function(f) => Ok(Statement::Call(f)),
12220 other => parser_err!(
12221 format!("Expected a simple procedure call but found: {other}"),
12222 self.peek_token_ref().span.start
12223 ),
12224 }
12225 } else {
12226 Ok(Statement::Call(Function {
12227 name: object_name,
12228 uses_odbc_syntax: false,
12229 parameters: FunctionArguments::None,
12230 args: FunctionArguments::None,
12231 over: None,
12232 filter: None,
12233 null_treatment: None,
12234 within_group: vec![],
12235 }))
12236 }
12237 }
12238
12239 pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
12241 let source;
12242 if self.consume_token(&Token::LParen) {
12243 source = CopySource::Query(self.parse_query()?);
12244 self.expect_token(&Token::RParen)?;
12245 } else {
12246 let table_name = self.parse_object_name(false)?;
12247 let columns = self.parse_parenthesized_column_list(Optional, false)?;
12248 source = CopySource::Table {
12249 table_name,
12250 columns,
12251 };
12252 }
12253 let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
12254 Some(Keyword::FROM) => false,
12255 Some(Keyword::TO) => true,
12256 _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
12257 };
12258 if !to {
12259 if let CopySource::Query(_) = source {
12262 return Err(ParserError::ParserError(
12263 "COPY ... FROM does not support query as a source".to_string(),
12264 ));
12265 }
12266 }
12267 let target = if self.parse_keyword(Keyword::STDIN) {
12268 CopyTarget::Stdin
12269 } else if self.parse_keyword(Keyword::STDOUT) {
12270 CopyTarget::Stdout
12271 } else if self.parse_keyword(Keyword::PROGRAM) {
12272 CopyTarget::Program {
12273 command: self.parse_literal_string()?,
12274 }
12275 } else {
12276 CopyTarget::File {
12277 filename: self.parse_literal_string()?,
12278 }
12279 };
12280 let _ = self.parse_keyword(Keyword::WITH); let mut options = vec![];
12282 if self.consume_token(&Token::LParen) {
12283 options = self.parse_comma_separated(Parser::parse_copy_option)?;
12284 self.expect_token(&Token::RParen)?;
12285 }
12286 let mut legacy_options = vec![];
12287 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
12288 legacy_options.push(opt);
12289 }
12290 let values =
12291 if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
12292 self.expect_token(&Token::SemiColon)?;
12293 self.parse_tsv()
12294 } else {
12295 vec![]
12296 };
12297 Ok(Statement::Copy {
12298 source,
12299 to,
12300 target,
12301 options,
12302 legacy_options,
12303 values,
12304 })
12305 }
12306
12307 fn parse_open(&mut self) -> Result<Statement, ParserError> {
12309 self.expect_keyword(Keyword::OPEN)?;
12310 Ok(Statement::Open(OpenStatement {
12311 cursor_name: self.parse_identifier()?,
12312 }))
12313 }
12314
12315 pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
12317 let cursor = if self.parse_keyword(Keyword::ALL) {
12318 CloseCursor::All
12319 } else {
12320 let name = self.parse_identifier()?;
12321
12322 CloseCursor::Specific { name }
12323 };
12324
12325 Ok(Statement::Close { cursor })
12326 }
12327
12328 fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
12329 let ret = match self.parse_one_of_keywords(&[
12330 Keyword::FORMAT,
12331 Keyword::FREEZE,
12332 Keyword::DELIMITER,
12333 Keyword::NULL,
12334 Keyword::HEADER,
12335 Keyword::QUOTE,
12336 Keyword::ESCAPE,
12337 Keyword::FORCE_QUOTE,
12338 Keyword::FORCE_NOT_NULL,
12339 Keyword::FORCE_NULL,
12340 Keyword::ENCODING,
12341 ]) {
12342 Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
12343 Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
12344 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12345 Some(Keyword::FALSE)
12346 )),
12347 Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
12348 Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
12349 Some(Keyword::HEADER) => CopyOption::Header(!matches!(
12350 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12351 Some(Keyword::FALSE)
12352 )),
12353 Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
12354 Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
12355 Some(Keyword::FORCE_QUOTE) => {
12356 CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
12357 }
12358 Some(Keyword::FORCE_NOT_NULL) => {
12359 CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12360 }
12361 Some(Keyword::FORCE_NULL) => {
12362 CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12363 }
12364 Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
12365 _ => self.expected_ref("option", self.peek_token_ref())?,
12366 };
12367 Ok(ret)
12368 }
12369
12370 fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
12371 if self.parse_keyword(Keyword::FORMAT) {
12373 let _ = self.parse_keyword(Keyword::AS);
12374 }
12375
12376 let ret = match self.parse_one_of_keywords(&[
12377 Keyword::ACCEPTANYDATE,
12378 Keyword::ACCEPTINVCHARS,
12379 Keyword::ADDQUOTES,
12380 Keyword::ALLOWOVERWRITE,
12381 Keyword::BINARY,
12382 Keyword::BLANKSASNULL,
12383 Keyword::BZIP2,
12384 Keyword::CLEANPATH,
12385 Keyword::COMPUPDATE,
12386 Keyword::CREDENTIALS,
12387 Keyword::CSV,
12388 Keyword::DATEFORMAT,
12389 Keyword::DELIMITER,
12390 Keyword::EMPTYASNULL,
12391 Keyword::ENCRYPTED,
12392 Keyword::ESCAPE,
12393 Keyword::EXTENSION,
12394 Keyword::FIXEDWIDTH,
12395 Keyword::GZIP,
12396 Keyword::HEADER,
12397 Keyword::IAM_ROLE,
12398 Keyword::IGNOREHEADER,
12399 Keyword::JSON,
12400 Keyword::MANIFEST,
12401 Keyword::MAXFILESIZE,
12402 Keyword::NULL,
12403 Keyword::PARALLEL,
12404 Keyword::PARQUET,
12405 Keyword::PARTITION,
12406 Keyword::REGION,
12407 Keyword::REMOVEQUOTES,
12408 Keyword::ROWGROUPSIZE,
12409 Keyword::STATUPDATE,
12410 Keyword::TIMEFORMAT,
12411 Keyword::TRUNCATECOLUMNS,
12412 Keyword::ZSTD,
12413 ]) {
12414 Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
12415 Some(Keyword::ACCEPTINVCHARS) => {
12416 let _ = self.parse_keyword(Keyword::AS); let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12418 Some(self.parse_literal_string()?)
12419 } else {
12420 None
12421 };
12422 CopyLegacyOption::AcceptInvChars(ch)
12423 }
12424 Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
12425 Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
12426 Some(Keyword::BINARY) => CopyLegacyOption::Binary,
12427 Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
12428 Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
12429 Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
12430 Some(Keyword::COMPUPDATE) => {
12431 let preset = self.parse_keyword(Keyword::PRESET);
12432 let enabled = match self.parse_one_of_keywords(&[
12433 Keyword::TRUE,
12434 Keyword::FALSE,
12435 Keyword::ON,
12436 Keyword::OFF,
12437 ]) {
12438 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12439 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12440 _ => None,
12441 };
12442 CopyLegacyOption::CompUpdate { preset, enabled }
12443 }
12444 Some(Keyword::CREDENTIALS) => {
12445 CopyLegacyOption::Credentials(self.parse_literal_string()?)
12446 }
12447 Some(Keyword::CSV) => CopyLegacyOption::Csv({
12448 let mut opts = vec![];
12449 while let Some(opt) =
12450 self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
12451 {
12452 opts.push(opt);
12453 }
12454 opts
12455 }),
12456 Some(Keyword::DATEFORMAT) => {
12457 let _ = self.parse_keyword(Keyword::AS);
12458 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12459 Some(self.parse_literal_string()?)
12460 } else {
12461 None
12462 };
12463 CopyLegacyOption::DateFormat(fmt)
12464 }
12465 Some(Keyword::DELIMITER) => {
12466 let _ = self.parse_keyword(Keyword::AS);
12467 CopyLegacyOption::Delimiter(self.parse_literal_char()?)
12468 }
12469 Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
12470 Some(Keyword::ENCRYPTED) => {
12471 let auto = self.parse_keyword(Keyword::AUTO);
12472 CopyLegacyOption::Encrypted { auto }
12473 }
12474 Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
12475 Some(Keyword::EXTENSION) => {
12476 let ext = self.parse_literal_string()?;
12477 CopyLegacyOption::Extension(ext)
12478 }
12479 Some(Keyword::FIXEDWIDTH) => {
12480 let spec = self.parse_literal_string()?;
12481 CopyLegacyOption::FixedWidth(spec)
12482 }
12483 Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
12484 Some(Keyword::HEADER) => CopyLegacyOption::Header,
12485 Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
12486 Some(Keyword::IGNOREHEADER) => {
12487 let _ = self.parse_keyword(Keyword::AS);
12488 let num_rows = self.parse_literal_uint()?;
12489 CopyLegacyOption::IgnoreHeader(num_rows)
12490 }
12491 Some(Keyword::JSON) => {
12492 let _ = self.parse_keyword(Keyword::AS);
12493 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12494 Some(self.parse_literal_string()?)
12495 } else {
12496 None
12497 };
12498 CopyLegacyOption::Json(fmt)
12499 }
12500 Some(Keyword::MANIFEST) => {
12501 let verbose = self.parse_keyword(Keyword::VERBOSE);
12502 CopyLegacyOption::Manifest { verbose }
12503 }
12504 Some(Keyword::MAXFILESIZE) => {
12505 let _ = self.parse_keyword(Keyword::AS);
12506 let size = self.parse_number_value()?;
12507 let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12508 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12509 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12510 _ => None,
12511 };
12512 CopyLegacyOption::MaxFileSize(FileSize { size, unit })
12513 }
12514 Some(Keyword::NULL) => {
12515 let _ = self.parse_keyword(Keyword::AS);
12516 CopyLegacyOption::Null(self.parse_literal_string()?)
12517 }
12518 Some(Keyword::PARALLEL) => {
12519 let enabled = match self.parse_one_of_keywords(&[
12520 Keyword::TRUE,
12521 Keyword::FALSE,
12522 Keyword::ON,
12523 Keyword::OFF,
12524 ]) {
12525 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12526 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12527 _ => None,
12528 };
12529 CopyLegacyOption::Parallel(enabled)
12530 }
12531 Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
12532 Some(Keyword::PARTITION) => {
12533 self.expect_keyword(Keyword::BY)?;
12534 let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
12535 let include = self.parse_keyword(Keyword::INCLUDE);
12536 CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
12537 }
12538 Some(Keyword::REGION) => {
12539 let _ = self.parse_keyword(Keyword::AS);
12540 let region = self.parse_literal_string()?;
12541 CopyLegacyOption::Region(region)
12542 }
12543 Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
12544 Some(Keyword::ROWGROUPSIZE) => {
12545 let _ = self.parse_keyword(Keyword::AS);
12546 let file_size = self.parse_file_size()?;
12547 CopyLegacyOption::RowGroupSize(file_size)
12548 }
12549 Some(Keyword::STATUPDATE) => {
12550 let enabled = match self.parse_one_of_keywords(&[
12551 Keyword::TRUE,
12552 Keyword::FALSE,
12553 Keyword::ON,
12554 Keyword::OFF,
12555 ]) {
12556 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12557 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12558 _ => None,
12559 };
12560 CopyLegacyOption::StatUpdate(enabled)
12561 }
12562 Some(Keyword::TIMEFORMAT) => {
12563 let _ = self.parse_keyword(Keyword::AS);
12564 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12565 Some(self.parse_literal_string()?)
12566 } else {
12567 None
12568 };
12569 CopyLegacyOption::TimeFormat(fmt)
12570 }
12571 Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
12572 Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
12573 _ => self.expected_ref("option", self.peek_token_ref())?,
12574 };
12575 Ok(ret)
12576 }
12577
12578 fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
12579 let size = self.parse_number_value()?;
12580 let unit = self.maybe_parse_file_size_unit();
12581 Ok(FileSize { size, unit })
12582 }
12583
12584 fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
12585 match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12586 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12587 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12588 _ => None,
12589 }
12590 }
12591
12592 fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12593 if self.parse_keyword(Keyword::DEFAULT) {
12594 Ok(IamRoleKind::Default)
12595 } else {
12596 let arn = self.parse_literal_string()?;
12597 Ok(IamRoleKind::Arn(arn))
12598 }
12599 }
12600
12601 fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12602 let ret = match self.parse_one_of_keywords(&[
12603 Keyword::HEADER,
12604 Keyword::QUOTE,
12605 Keyword::ESCAPE,
12606 Keyword::FORCE,
12607 ]) {
12608 Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12609 Some(Keyword::QUOTE) => {
12610 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12612 }
12613 Some(Keyword::ESCAPE) => {
12614 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12616 }
12617 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12618 CopyLegacyCsvOption::ForceNotNull(
12619 self.parse_comma_separated(|p| p.parse_identifier())?,
12620 )
12621 }
12622 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12623 CopyLegacyCsvOption::ForceQuote(
12624 self.parse_comma_separated(|p| p.parse_identifier())?,
12625 )
12626 }
12627 _ => self.expected_ref("csv option", self.peek_token_ref())?,
12628 };
12629 Ok(ret)
12630 }
12631
12632 fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12633 let s = self.parse_literal_string()?;
12634 if s.len() != 1 {
12635 let loc = self
12636 .tokens
12637 .get(self.index - 1)
12638 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12639 return parser_err!(format!("Expect a char, found {s:?}"), loc);
12640 }
12641 Ok(s.chars().next().unwrap())
12642 }
12643
12644 pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12647 self.parse_tab_value()
12648 }
12649
12650 pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12652 let mut values = vec![];
12653 let mut content = String::new();
12654 while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12655 match t {
12656 Token::Whitespace(Whitespace::Tab) => {
12657 values.push(Some(core::mem::take(&mut content)));
12658 }
12659 Token::Whitespace(Whitespace::Newline) => {
12660 values.push(Some(core::mem::take(&mut content)));
12661 }
12662 Token::Backslash => {
12663 if self.consume_token(&Token::Period) {
12664 return values;
12665 }
12666 if let Token::Word(w) = self.next_token().token {
12667 if w.value == "N" {
12668 values.push(None);
12669 }
12670 }
12671 }
12672 _ => {
12673 content.push_str(&t.to_string());
12674 }
12675 }
12676 }
12677 values
12678 }
12679
12680 pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12682 let next_token = self.next_token();
12683 let span = next_token.span;
12684 let ok_value = |value: Value| Ok(value.with_span(span));
12685 match next_token.token {
12686 Token::Word(w) => match w.keyword {
12687 Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12688 ok_value(Value::Boolean(true))
12689 }
12690 Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12691 ok_value(Value::Boolean(false))
12692 }
12693 Keyword::NULL => ok_value(Value::Null),
12694 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12695 Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12696 Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12697 _ => self.expected(
12698 "A value?",
12699 TokenWithSpan {
12700 token: Token::Word(w),
12701 span,
12702 },
12703 )?,
12704 },
12705 _ => self.expected(
12706 "a concrete value",
12707 TokenWithSpan {
12708 token: Token::Word(w),
12709 span,
12710 },
12711 ),
12712 },
12713 Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12717 Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12718 self.maybe_concat_string_literal(s.to_string()),
12719 )),
12720 Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12721 self.maybe_concat_string_literal(s.to_string()),
12722 )),
12723 Token::TripleSingleQuotedString(ref s) => {
12724 ok_value(Value::TripleSingleQuotedString(s.to_string()))
12725 }
12726 Token::TripleDoubleQuotedString(ref s) => {
12727 ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12728 }
12729 Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12730 Token::SingleQuotedByteStringLiteral(ref s) => {
12731 ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12732 }
12733 Token::DoubleQuotedByteStringLiteral(ref s) => {
12734 ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12735 }
12736 Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12737 ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12738 }
12739 Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12740 ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12741 }
12742 Token::SingleQuotedRawStringLiteral(ref s) => {
12743 ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12744 }
12745 Token::DoubleQuotedRawStringLiteral(ref s) => {
12746 ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12747 }
12748 Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12749 ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12750 }
12751 Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12752 ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12753 }
12754 Token::NationalStringLiteral(ref s) => {
12755 ok_value(Value::NationalStringLiteral(s.to_string()))
12756 }
12757 Token::QuoteDelimitedStringLiteral(v) => {
12758 ok_value(Value::QuoteDelimitedStringLiteral(v))
12759 }
12760 Token::NationalQuoteDelimitedStringLiteral(v) => {
12761 ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12762 }
12763 Token::EscapedStringLiteral(ref s) => {
12764 ok_value(Value::EscapedStringLiteral(s.to_string()))
12765 }
12766 Token::UnicodeStringLiteral(ref s) => {
12767 ok_value(Value::UnicodeStringLiteral(s.to_string()))
12768 }
12769 Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12770 Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12771 tok @ Token::Colon | tok @ Token::AtSign => {
12772 let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12780 let ident = match next_token.token {
12781 Token::Word(w) => Ok(w.into_ident(next_token.span)),
12782 Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12783 _ => self.expected("placeholder", next_token),
12784 }?;
12785 Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12786 .with_span(Span::new(span.start, ident.span.end)))
12787 }
12788 unexpected => self.expected(
12789 "a value",
12790 TokenWithSpan {
12791 token: unexpected,
12792 span,
12793 },
12794 ),
12795 }
12796 }
12797
12798 fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12799 if self.dialect.supports_string_literal_concatenation() {
12800 while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12801 self.peek_token_ref().token
12802 {
12803 str.push_str(s);
12804 self.advance_token();
12805 }
12806 } else if self
12807 .dialect
12808 .supports_string_literal_concatenation_with_newline()
12809 {
12810 let mut after_newline = false;
12813 loop {
12814 match self.peek_token_no_skip().token {
12815 Token::Whitespace(Whitespace::Newline) => {
12816 after_newline = true;
12817 self.next_token_no_skip();
12818 }
12819 Token::Whitespace(_) => {
12820 self.next_token_no_skip();
12821 }
12822 Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12823 if after_newline =>
12824 {
12825 str.push_str(s.clone().as_str());
12826 self.next_token_no_skip();
12827 after_newline = false;
12828 }
12829 _ => break,
12830 }
12831 }
12832 }
12833
12834 str
12835 }
12836
12837 pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12839 let value_wrapper = self.parse_value()?;
12840 match &value_wrapper.value {
12841 Value::Number(_, _) => Ok(value_wrapper),
12842 Value::Placeholder(_) => Ok(value_wrapper),
12843 _ => {
12844 self.prev_token();
12845 self.expected_ref("literal number", self.peek_token_ref())
12846 }
12847 }
12848 }
12849
12850 pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12853 let next_token = self.next_token();
12854 match next_token.token {
12855 Token::Plus => Ok(Expr::UnaryOp {
12856 op: UnaryOperator::Plus,
12857 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12858 }),
12859 Token::Minus => Ok(Expr::UnaryOp {
12860 op: UnaryOperator::Minus,
12861 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12862 }),
12863 _ => {
12864 self.prev_token();
12865 Ok(Expr::Value(self.parse_number_value()?))
12866 }
12867 }
12868 }
12869
12870 fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12871 let next_token = self.next_token();
12872 let span = next_token.span;
12873 match next_token.token {
12874 Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12875 Value::SingleQuotedString(s.to_string()).with_span(span),
12876 )),
12877 Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12878 Value::DoubleQuotedString(s.to_string()).with_span(span),
12879 )),
12880 Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12881 Value::HexStringLiteral(s.to_string()).with_span(span),
12882 )),
12883 unexpected => self.expected(
12884 "a string value",
12885 TokenWithSpan {
12886 token: unexpected,
12887 span,
12888 },
12889 ),
12890 }
12891 }
12892
12893 pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12895 let next_token = self.next_token();
12896 match next_token.token {
12897 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12898 _ => self.expected("literal int", next_token),
12899 }
12900 }
12901
12902 fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12905 let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12906 let peek_token = parser.peek_token();
12907 let span = peek_token.span;
12908 match peek_token.token {
12909 Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12910 {
12911 parser.next_token();
12912 Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12913 }
12914 _ => Ok(Expr::Value(
12915 Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12916 )),
12917 }
12918 };
12919
12920 Ok(CreateFunctionBody::AsBeforeOptions {
12921 body: parse_string_expr(self)?,
12922 link_symbol: if self.consume_token(&Token::Comma) {
12923 Some(parse_string_expr(self)?)
12924 } else {
12925 None
12926 },
12927 })
12928 }
12929
12930 pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12932 let next_token = self.next_token();
12933 match next_token.token {
12934 Token::Word(Word {
12935 value,
12936 keyword: Keyword::NoKeyword,
12937 ..
12938 }) => Ok(value),
12939 Token::SingleQuotedString(s) => Ok(s),
12940 Token::DoubleQuotedString(s) => Ok(s),
12941 Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12942 Ok(s)
12943 }
12944 Token::UnicodeStringLiteral(s) => Ok(s),
12945 Token::DollarQuotedString(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12946 Ok(s.value)
12947 }
12948 _ => self.expected("literal string", next_token),
12949 }
12950 }
12951
12952 pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12954 match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12955 Some(Keyword::TRUE) => Ok(true),
12956 Some(Keyword::FALSE) => Ok(false),
12957 _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12958 }
12959 }
12960
12961 pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12963 let neg = self.parse_keyword(Keyword::NOT);
12964 let normalized_form = self.maybe_parse(|parser| {
12965 match parser.parse_one_of_keywords(&[
12966 Keyword::NFC,
12967 Keyword::NFD,
12968 Keyword::NFKC,
12969 Keyword::NFKD,
12970 ]) {
12971 Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12972 Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12973 Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12974 Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12975 _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12976 }
12977 })?;
12978 if self.parse_keyword(Keyword::NORMALIZED) {
12979 return Ok(Expr::IsNormalized {
12980 expr: Box::new(expr),
12981 form: normalized_form,
12982 negated: neg,
12983 });
12984 }
12985 self.expected_ref("unicode normalization form", self.peek_token_ref())
12986 }
12987
12988 pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12990 self.expect_token(&Token::LParen)?;
12991 let values = self.parse_comma_separated(|parser| {
12992 let name = parser.parse_literal_string()?;
12993 let e = if parser.consume_token(&Token::Eq) {
12994 let value = parser.parse_number()?;
12995 EnumMember::NamedValue(name, value)
12996 } else {
12997 EnumMember::Name(name)
12998 };
12999 Ok(e)
13000 })?;
13001 self.expect_token(&Token::RParen)?;
13002
13003 Ok(values)
13004 }
13005
13006 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
13008 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
13009 if trailing_bracket.0 {
13010 return parser_err!(
13011 format!("unmatched > after parsing data type {ty}"),
13012 self.peek_token_ref()
13013 );
13014 }
13015
13016 Ok(ty)
13017 }
13018
13019 fn parse_data_type_helper(
13020 &mut self,
13021 ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
13022 let dialect = self.dialect;
13023 self.advance_token();
13024 let next_token = self.get_current_token();
13025 let next_token_index = self.get_current_index();
13026
13027 let mut trailing_bracket: MatchedTrailingBracket = false.into();
13028 let mut data = match &next_token.token {
13029 Token::Word(w) => match w.keyword {
13030 Keyword::BOOLEAN => Ok(DataType::Boolean),
13031 Keyword::BOOL => Ok(DataType::Bool),
13032 Keyword::FLOAT => {
13033 let precision = self.parse_exact_number_optional_precision_scale()?;
13034
13035 if self.parse_keyword(Keyword::UNSIGNED) {
13036 Ok(DataType::FloatUnsigned(precision))
13037 } else {
13038 Ok(DataType::Float(precision))
13039 }
13040 }
13041 Keyword::REAL => {
13042 if self.parse_keyword(Keyword::UNSIGNED) {
13043 Ok(DataType::RealUnsigned)
13044 } else {
13045 Ok(DataType::Real)
13046 }
13047 }
13048 Keyword::FLOAT4 => Ok(DataType::Float4),
13049 Keyword::FLOAT32 => Ok(DataType::Float32),
13050 Keyword::FLOAT64 => Ok(DataType::Float64),
13051 Keyword::FLOAT8 => Ok(DataType::Float8),
13052 Keyword::DOUBLE => {
13053 if self.parse_keyword(Keyword::PRECISION) {
13054 if self.parse_keyword(Keyword::UNSIGNED) {
13055 Ok(DataType::DoublePrecisionUnsigned)
13056 } else {
13057 Ok(DataType::DoublePrecision)
13058 }
13059 } else {
13060 let precision = self.parse_exact_number_optional_precision_scale()?;
13061
13062 if self.parse_keyword(Keyword::UNSIGNED) {
13063 Ok(DataType::DoubleUnsigned(precision))
13064 } else {
13065 Ok(DataType::Double(precision))
13066 }
13067 }
13068 }
13069 Keyword::TINYINT => {
13070 let optional_precision = self.parse_optional_precision();
13071 if self.parse_keyword(Keyword::UNSIGNED) {
13072 Ok(DataType::TinyIntUnsigned(optional_precision?))
13073 } else {
13074 if dialect.supports_data_type_signed_suffix() {
13075 let _ = self.parse_keyword(Keyword::SIGNED);
13076 }
13077 Ok(DataType::TinyInt(optional_precision?))
13078 }
13079 }
13080 Keyword::INT2 => {
13081 let optional_precision = self.parse_optional_precision();
13082 if self.parse_keyword(Keyword::UNSIGNED) {
13083 Ok(DataType::Int2Unsigned(optional_precision?))
13084 } else {
13085 Ok(DataType::Int2(optional_precision?))
13086 }
13087 }
13088 Keyword::SMALLINT => {
13089 let optional_precision = self.parse_optional_precision();
13090 if self.parse_keyword(Keyword::UNSIGNED) {
13091 Ok(DataType::SmallIntUnsigned(optional_precision?))
13092 } else {
13093 if dialect.supports_data_type_signed_suffix() {
13094 let _ = self.parse_keyword(Keyword::SIGNED);
13095 }
13096 Ok(DataType::SmallInt(optional_precision?))
13097 }
13098 }
13099 Keyword::MEDIUMINT => {
13100 let optional_precision = self.parse_optional_precision();
13101 if self.parse_keyword(Keyword::UNSIGNED) {
13102 Ok(DataType::MediumIntUnsigned(optional_precision?))
13103 } else {
13104 if dialect.supports_data_type_signed_suffix() {
13105 let _ = self.parse_keyword(Keyword::SIGNED);
13106 }
13107 Ok(DataType::MediumInt(optional_precision?))
13108 }
13109 }
13110 Keyword::INT => {
13111 let optional_precision = self.parse_optional_precision();
13112 if self.parse_keyword(Keyword::UNSIGNED) {
13113 Ok(DataType::IntUnsigned(optional_precision?))
13114 } else {
13115 if dialect.supports_data_type_signed_suffix() {
13116 let _ = self.parse_keyword(Keyword::SIGNED);
13117 }
13118 Ok(DataType::Int(optional_precision?))
13119 }
13120 }
13121 Keyword::INT4 => {
13122 let optional_precision = self.parse_optional_precision();
13123 if self.parse_keyword(Keyword::UNSIGNED) {
13124 Ok(DataType::Int4Unsigned(optional_precision?))
13125 } else {
13126 Ok(DataType::Int4(optional_precision?))
13127 }
13128 }
13129 Keyword::INT8 => {
13130 let optional_precision = self.parse_optional_precision();
13131 if self.parse_keyword(Keyword::UNSIGNED) {
13132 Ok(DataType::Int8Unsigned(optional_precision?))
13133 } else {
13134 Ok(DataType::Int8(optional_precision?))
13135 }
13136 }
13137 Keyword::INT16 => Ok(DataType::Int16),
13138 Keyword::INT32 => Ok(DataType::Int32),
13139 Keyword::INT64 => Ok(DataType::Int64),
13140 Keyword::INT128 => Ok(DataType::Int128),
13141 Keyword::INT256 => Ok(DataType::Int256),
13142 Keyword::INTEGER => {
13143 let optional_precision = self.parse_optional_precision();
13144 if self.parse_keyword(Keyword::UNSIGNED) {
13145 Ok(DataType::IntegerUnsigned(optional_precision?))
13146 } else {
13147 if dialect.supports_data_type_signed_suffix() {
13148 let _ = self.parse_keyword(Keyword::SIGNED);
13149 }
13150 Ok(DataType::Integer(optional_precision?))
13151 }
13152 }
13153 Keyword::BIGINT => {
13154 let optional_precision = self.parse_optional_precision();
13155 if self.parse_keyword(Keyword::UNSIGNED) {
13156 Ok(DataType::BigIntUnsigned(optional_precision?))
13157 } else {
13158 if dialect.supports_data_type_signed_suffix() {
13159 let _ = self.parse_keyword(Keyword::SIGNED);
13160 }
13161 Ok(DataType::BigInt(optional_precision?))
13162 }
13163 }
13164 Keyword::HUGEINT => Ok(DataType::HugeInt),
13165 Keyword::UBIGINT => Ok(DataType::UBigInt),
13166 Keyword::UHUGEINT => Ok(DataType::UHugeInt),
13167 Keyword::USMALLINT => Ok(DataType::USmallInt),
13168 Keyword::UTINYINT => Ok(DataType::UTinyInt),
13169 Keyword::UINT8 => Ok(DataType::UInt8),
13170 Keyword::UINT16 => Ok(DataType::UInt16),
13171 Keyword::UINT32 => Ok(DataType::UInt32),
13172 Keyword::UINT64 => Ok(DataType::UInt64),
13173 Keyword::UINT128 => Ok(DataType::UInt128),
13174 Keyword::UINT256 => Ok(DataType::UInt256),
13175 Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
13176 Keyword::NVARCHAR => {
13177 Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
13178 }
13179 Keyword::CHARACTER => {
13180 if self.parse_keyword(Keyword::VARYING) {
13181 Ok(DataType::CharacterVarying(
13182 self.parse_optional_character_length()?,
13183 ))
13184 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
13185 Ok(DataType::CharacterLargeObject(
13186 self.parse_optional_precision()?,
13187 ))
13188 } else {
13189 Ok(DataType::Character(self.parse_optional_character_length()?))
13190 }
13191 }
13192 Keyword::CHAR => {
13193 if self.parse_keyword(Keyword::VARYING) {
13194 Ok(DataType::CharVarying(
13195 self.parse_optional_character_length()?,
13196 ))
13197 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
13198 Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
13199 } else {
13200 Ok(DataType::Char(self.parse_optional_character_length()?))
13201 }
13202 }
13203 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
13204 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
13205 Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
13206 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
13207 Keyword::TINYBLOB => Ok(DataType::TinyBlob),
13208 Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
13209 Keyword::LONGBLOB => Ok(DataType::LongBlob),
13210 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
13211 Keyword::BIT => {
13212 if self.parse_keyword(Keyword::VARYING) {
13213 Ok(DataType::BitVarying(self.parse_optional_precision()?))
13214 } else {
13215 Ok(DataType::Bit(self.parse_optional_precision()?))
13216 }
13217 }
13218 Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
13219 Keyword::UUID => Ok(DataType::Uuid),
13220 Keyword::DATE => Ok(DataType::Date),
13221 Keyword::DATE32 => Ok(DataType::Date32),
13222 Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
13223 Keyword::DATETIME64 => {
13224 self.prev_token();
13225 let (precision, time_zone) = self.parse_datetime_64()?;
13226 Ok(DataType::Datetime64(precision, time_zone))
13227 }
13228 Keyword::TIMESTAMP => {
13229 let precision = self.parse_optional_precision()?;
13230 let tz = if self.parse_keyword(Keyword::WITH) {
13231 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13232 TimezoneInfo::WithTimeZone
13233 } else if self.parse_keyword(Keyword::WITHOUT) {
13234 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13235 TimezoneInfo::WithoutTimeZone
13236 } else {
13237 TimezoneInfo::None
13238 };
13239 Ok(DataType::Timestamp(precision, tz))
13240 }
13241 Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
13242 self.parse_optional_precision()?,
13243 TimezoneInfo::Tz,
13244 )),
13245 Keyword::TIMESTAMP_NTZ => {
13246 Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
13247 }
13248 Keyword::TIME => {
13249 let precision = self.parse_optional_precision()?;
13250 let tz = if self.parse_keyword(Keyword::WITH) {
13251 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13252 TimezoneInfo::WithTimeZone
13253 } else if self.parse_keyword(Keyword::WITHOUT) {
13254 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13255 TimezoneInfo::WithoutTimeZone
13256 } else {
13257 TimezoneInfo::None
13258 };
13259 Ok(DataType::Time(precision, tz))
13260 }
13261 Keyword::TIMETZ => Ok(DataType::Time(
13262 self.parse_optional_precision()?,
13263 TimezoneInfo::Tz,
13264 )),
13265 Keyword::INTERVAL => {
13266 if self.dialect.supports_interval_options() {
13267 let fields = self.maybe_parse_optional_interval_fields()?;
13268 let precision = self.parse_optional_precision()?;
13269 Ok(DataType::Interval { fields, precision })
13270 } else {
13271 Ok(DataType::Interval {
13272 fields: None,
13273 precision: None,
13274 })
13275 }
13276 }
13277 Keyword::JSON => Ok(DataType::JSON),
13278 Keyword::JSONB => Ok(DataType::JSONB),
13279 Keyword::REGCLASS => Ok(DataType::Regclass),
13280 Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
13281 Keyword::FIXEDSTRING => {
13282 self.expect_token(&Token::LParen)?;
13283 let character_length = self.parse_literal_uint()?;
13284 self.expect_token(&Token::RParen)?;
13285 Ok(DataType::FixedString(character_length))
13286 }
13287 Keyword::TEXT => Ok(DataType::Text),
13288 Keyword::TINYTEXT => Ok(DataType::TinyText),
13289 Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
13290 Keyword::LONGTEXT => Ok(DataType::LongText),
13291 Keyword::BYTEA => Ok(DataType::Bytea),
13292 Keyword::NUMERIC => Ok(DataType::Numeric(
13293 self.parse_exact_number_optional_precision_scale()?,
13294 )),
13295 Keyword::DECIMAL => {
13296 let precision = self.parse_exact_number_optional_precision_scale()?;
13297
13298 if self.parse_keyword(Keyword::UNSIGNED) {
13299 Ok(DataType::DecimalUnsigned(precision))
13300 } else {
13301 Ok(DataType::Decimal(precision))
13302 }
13303 }
13304 Keyword::DEC => {
13305 let precision = self.parse_exact_number_optional_precision_scale()?;
13306
13307 if self.parse_keyword(Keyword::UNSIGNED) {
13308 Ok(DataType::DecUnsigned(precision))
13309 } else {
13310 Ok(DataType::Dec(precision))
13311 }
13312 }
13313 Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
13314 self.parse_exact_number_optional_precision_scale()?,
13315 )),
13316 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
13317 self.parse_exact_number_optional_precision_scale()?,
13318 )),
13319 Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
13320 Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
13321 Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
13322 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
13323 Keyword::ARRAY => {
13324 if self.dialect.supports_array_typedef_without_element_type() {
13325 Ok(DataType::Array(ArrayElemTypeDef::None))
13326 } else if dialect_of!(self is ClickHouseDialect) {
13327 Ok(self.parse_sub_type(|internal_type| {
13328 DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
13329 })?)
13330 } else {
13331 self.expect_token(&Token::Lt)?;
13332 let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
13333 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13334 Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
13335 inside_type,
13336 ))))
13337 }
13338 }
13339 Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
13340 self.prev_token();
13341 let field_defs = self.parse_duckdb_struct_type_def()?;
13342 Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
13343 }
13344 Keyword::STRUCT if dialect_is!(dialect is BigQueryDialect | DatabricksDialect | GenericDialect) =>
13345 {
13346 self.prev_token();
13347 let (field_defs, _trailing_bracket) =
13348 self.parse_struct_type_def(Self::parse_struct_field_def)?;
13349 trailing_bracket = _trailing_bracket;
13350 Ok(DataType::Struct(
13351 field_defs,
13352 StructBracketKind::AngleBrackets,
13353 ))
13354 }
13355 Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
13356 self.prev_token();
13357 let fields = self.parse_union_type_def()?;
13358 Ok(DataType::Union(fields))
13359 }
13360 Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13361 Ok(self.parse_sub_type(DataType::Nullable)?)
13362 }
13363 Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13364 Ok(self.parse_sub_type(DataType::LowCardinality)?)
13365 }
13366 Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13367 self.prev_token();
13368 let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
13369 Ok(DataType::Map(
13370 Box::new(key_data_type),
13371 Box::new(value_data_type),
13372 ))
13373 }
13374 Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13375 self.expect_token(&Token::LParen)?;
13376 let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
13377 self.expect_token(&Token::RParen)?;
13378 Ok(DataType::Nested(field_defs))
13379 }
13380 Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13381 self.prev_token();
13382 let field_defs = self.parse_click_house_tuple_def()?;
13383 Ok(DataType::Tuple(field_defs))
13384 }
13385 Keyword::TRIGGER => Ok(DataType::Trigger),
13386 Keyword::SETOF => {
13387 let inner = self.parse_data_type()?;
13388 Ok(DataType::SetOf(Box::new(inner)))
13389 }
13390 Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
13391 let _ = self.parse_keyword(Keyword::TYPE);
13392 Ok(DataType::AnyType)
13393 }
13394 Keyword::TABLE => {
13395 if self.peek_token_ref().token == Token::LParen {
13398 let columns = self.parse_returns_table_columns()?;
13399 Ok(DataType::Table(Some(columns)))
13400 } else {
13401 Ok(DataType::Table(None))
13402 }
13403 }
13404 Keyword::SIGNED => {
13405 if self.parse_keyword(Keyword::INTEGER) {
13406 Ok(DataType::SignedInteger)
13407 } else {
13408 Ok(DataType::Signed)
13409 }
13410 }
13411 Keyword::UNSIGNED => {
13412 if self.parse_keyword(Keyword::INTEGER) {
13413 Ok(DataType::UnsignedInteger)
13414 } else {
13415 Ok(DataType::Unsigned)
13416 }
13417 }
13418 Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13419 Ok(DataType::TsVector)
13420 }
13421 Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13422 Ok(DataType::TsQuery)
13423 }
13424 _ => {
13425 self.prev_token();
13426 let type_name = self.parse_object_name(false)?;
13427 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13428 Ok(DataType::Custom(type_name, modifiers))
13429 } else {
13430 Ok(DataType::Custom(type_name, vec![]))
13431 }
13432 }
13433 },
13434 _ => self.expected_at("a data type name", next_token_index),
13435 }?;
13436
13437 if self.dialect.supports_array_typedef_with_brackets() {
13438 while self.consume_token(&Token::LBracket) {
13439 let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13441 self.expect_token(&Token::RBracket)?;
13442 data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
13443 }
13444 }
13445 Ok((data, trailing_bracket))
13446 }
13447
13448 fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
13449 self.parse_column_def()
13450 }
13451
13452 fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
13453 self.expect_token(&Token::LParen)?;
13454 let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
13455 self.expect_token(&Token::RParen)?;
13456 Ok(columns)
13457 }
13458
13459 pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
13461 self.expect_token(&Token::LParen)?;
13462 let mut values = Vec::new();
13463 loop {
13464 let next_token = self.next_token();
13465 match next_token.token {
13466 Token::SingleQuotedString(value) => values.push(value),
13467 _ => self.expected("a string", next_token)?,
13468 }
13469 let next_token = self.next_token();
13470 match next_token.token {
13471 Token::Comma => (),
13472 Token::RParen => break,
13473 _ => self.expected(", or }", next_token)?,
13474 }
13475 }
13476 Ok(values)
13477 }
13478
13479 pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13481 let ident = self.parse_identifier()?;
13482 self.expect_keyword_is(Keyword::AS)?;
13483 let alias = self.parse_identifier()?;
13484 Ok(IdentWithAlias { ident, alias })
13485 }
13486
13487 fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13489 let ident = self.parse_identifier()?;
13490 let _after_as = self.parse_keyword(Keyword::AS);
13491 let alias = self.parse_identifier()?;
13492 Ok(IdentWithAlias { ident, alias })
13493 }
13494
13495 fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
13497 self.parse_comma_separated(|parser| {
13498 parser.expect_token(&Token::LParen)?;
13499 let query = parser.parse_query()?;
13500 parser.expect_token(&Token::RParen)?;
13501 Ok(*query)
13502 })
13503 }
13504
13505 fn parse_distinct_required_set_quantifier(
13507 &mut self,
13508 operator_name: &str,
13509 ) -> Result<SetQuantifier, ParserError> {
13510 let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
13511 match quantifier {
13512 SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
13513 _ => Err(ParserError::ParserError(format!(
13514 "{operator_name} pipe operator requires DISTINCT modifier",
13515 ))),
13516 }
13517 }
13518
13519 fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13521 if self.parse_keyword(Keyword::AS) {
13522 Ok(Some(self.parse_identifier()?))
13523 } else {
13524 self.maybe_parse(|parser| parser.parse_identifier())
13526 }
13527 }
13528
13529 fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13531 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13532 parser.dialect.is_select_item_alias(explicit, kw, parser)
13533 }
13534 self.parse_optional_alias_inner(None, validator)
13535 }
13536
13537 pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
13541 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13542 parser.dialect.is_table_factor_alias(explicit, kw, parser)
13543 }
13544 let explicit = self.peek_keyword(Keyword::AS);
13545 match self.parse_optional_alias_inner(None, validator)? {
13546 Some(name) => {
13547 let columns = self.parse_table_alias_column_defs()?;
13548 Ok(Some(TableAlias {
13549 explicit,
13550 name,
13551 columns,
13552 }))
13553 }
13554 None => Ok(None),
13555 }
13556 }
13557
13558 fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
13559 let mut hints = vec![];
13560 while let Some(hint_type) =
13561 self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
13562 {
13563 let hint_type = match hint_type {
13564 Keyword::USE => TableIndexHintType::Use,
13565 Keyword::IGNORE => TableIndexHintType::Ignore,
13566 Keyword::FORCE => TableIndexHintType::Force,
13567 _ => {
13568 return self.expected_ref(
13569 "expected to match USE/IGNORE/FORCE keyword",
13570 self.peek_token_ref(),
13571 )
13572 }
13573 };
13574 let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13575 Some(Keyword::INDEX) => TableIndexType::Index,
13576 Some(Keyword::KEY) => TableIndexType::Key,
13577 _ => {
13578 return self
13579 .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13580 }
13581 };
13582 let for_clause = if self.parse_keyword(Keyword::FOR) {
13583 let clause = if self.parse_keyword(Keyword::JOIN) {
13584 TableIndexHintForClause::Join
13585 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13586 TableIndexHintForClause::OrderBy
13587 } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13588 TableIndexHintForClause::GroupBy
13589 } else {
13590 return self.expected_ref(
13591 "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13592 self.peek_token_ref(),
13593 );
13594 };
13595 Some(clause)
13596 } else {
13597 None
13598 };
13599
13600 self.expect_token(&Token::LParen)?;
13601 let index_names = if self.peek_token_ref().token != Token::RParen {
13602 self.parse_comma_separated(Parser::parse_identifier)?
13603 } else {
13604 vec![]
13605 };
13606 self.expect_token(&Token::RParen)?;
13607 hints.push(TableIndexHints {
13608 hint_type,
13609 index_type,
13610 for_clause,
13611 index_names,
13612 });
13613 }
13614 Ok(hints)
13615 }
13616
13617 pub fn parse_optional_alias(
13621 &mut self,
13622 reserved_kwds: &[Keyword],
13623 ) -> Result<Option<Ident>, ParserError> {
13624 fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13625 false
13626 }
13627 self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13628 }
13629
13630 fn parse_optional_alias_inner<F>(
13637 &mut self,
13638 reserved_kwds: Option<&[Keyword]>,
13639 validator: F,
13640 ) -> Result<Option<Ident>, ParserError>
13641 where
13642 F: Fn(bool, &Keyword, &mut Parser) -> bool,
13643 {
13644 let after_as = self.parse_keyword(Keyword::AS);
13645
13646 let next_token = self.next_token();
13647 match next_token.token {
13648 Token::Word(w)
13651 if reserved_kwds.is_some()
13652 && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13653 {
13654 Ok(Some(w.into_ident(next_token.span)))
13655 }
13656 Token::Word(w) if validator(after_as, &w.keyword, self) => {
13660 Ok(Some(w.into_ident(next_token.span)))
13661 }
13662 Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13664 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13665 _ => {
13666 if after_as {
13667 return self.expected("an identifier after AS", next_token);
13668 }
13669 self.prev_token();
13670 Ok(None) }
13672 }
13673 }
13674
13675 pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13677 if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13678 let expressions = if self.parse_keyword(Keyword::ALL) {
13679 None
13680 } else {
13681 Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13682 };
13683
13684 let mut modifiers = vec![];
13685 if self.dialect.supports_group_by_with_modifier() {
13686 loop {
13687 if !self.parse_keyword(Keyword::WITH) {
13688 break;
13689 }
13690 let keyword = self.expect_one_of_keywords(&[
13691 Keyword::ROLLUP,
13692 Keyword::CUBE,
13693 Keyword::TOTALS,
13694 ])?;
13695 modifiers.push(match keyword {
13696 Keyword::ROLLUP => GroupByWithModifier::Rollup,
13697 Keyword::CUBE => GroupByWithModifier::Cube,
13698 Keyword::TOTALS => GroupByWithModifier::Totals,
13699 _ => {
13700 return parser_err!(
13701 "BUG: expected to match GroupBy modifier keyword",
13702 self.peek_token_ref().span.start
13703 )
13704 }
13705 });
13706 }
13707 }
13708 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13709 self.expect_token(&Token::LParen)?;
13710 let result = self.parse_comma_separated(|p| {
13711 if p.peek_token_ref().token == Token::LParen {
13712 p.parse_tuple(true, true)
13713 } else {
13714 Ok(vec![p.parse_expr()?])
13715 }
13716 })?;
13717 self.expect_token(&Token::RParen)?;
13718 modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13719 result,
13720 )));
13721 };
13722 let group_by = match expressions {
13723 None => GroupByExpr::All(modifiers),
13724 Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13725 };
13726 Ok(Some(group_by))
13727 } else {
13728 Ok(None)
13729 }
13730 }
13731
13732 pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13734 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13735 let order_by =
13736 if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13737 let order_by_options = self.parse_order_by_options()?;
13738 OrderBy {
13739 kind: OrderByKind::All(order_by_options),
13740 interpolate: None,
13741 }
13742 } else {
13743 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13744 let interpolate = if self.dialect.supports_interpolate() {
13745 self.parse_interpolations()?
13746 } else {
13747 None
13748 };
13749 OrderBy {
13750 kind: OrderByKind::Expressions(exprs),
13751 interpolate,
13752 }
13753 };
13754 Ok(Some(order_by))
13755 } else {
13756 Ok(None)
13757 }
13758 }
13759
13760 fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13761 let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13762 Some(self.parse_offset()?)
13763 } else {
13764 None
13765 };
13766
13767 let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13768 let expr = self.parse_limit()?;
13769
13770 if self.dialect.supports_limit_comma()
13771 && offset.is_none()
13772 && expr.is_some() && self.consume_token(&Token::Comma)
13774 {
13775 let offset = expr.ok_or_else(|| {
13776 ParserError::ParserError(
13777 "Missing offset for LIMIT <offset>, <limit>".to_string(),
13778 )
13779 })?;
13780 return Ok(Some(LimitClause::OffsetCommaLimit {
13781 offset,
13782 limit: self.parse_expr()?,
13783 }));
13784 }
13785
13786 let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13787 Some(self.parse_comma_separated(Parser::parse_expr)?)
13788 } else {
13789 None
13790 };
13791
13792 (Some(expr), limit_by)
13793 } else {
13794 (None, None)
13795 };
13796
13797 if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13798 offset = Some(self.parse_offset()?);
13799 }
13800
13801 if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13802 Ok(Some(LimitClause::LimitOffset {
13803 limit: limit.unwrap_or_default(),
13804 offset,
13805 limit_by: limit_by.unwrap_or_default(),
13806 }))
13807 } else {
13808 Ok(None)
13809 }
13810 }
13811
13812 pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13815 if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13816 let fn_name = self.parse_object_name(false)?;
13817 self.parse_function_call(fn_name)
13818 .map(TableObject::TableFunction)
13819 } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13820 self.parse_parenthesized(|p| p.parse_query())
13821 .map(TableObject::TableQuery)
13822 } else {
13823 self.parse_object_name(false).map(TableObject::TableName)
13824 }
13825 }
13826
13827 pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13834 self.parse_object_name_inner(in_table_clause, false)
13835 }
13836
13837 fn parse_object_name_inner(
13847 &mut self,
13848 in_table_clause: bool,
13849 allow_wildcards: bool,
13850 ) -> Result<ObjectName, ParserError> {
13851 let mut parts = vec![];
13852 if dialect_of!(self is BigQueryDialect) && in_table_clause {
13853 loop {
13854 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13855 parts.push(ObjectNamePart::Identifier(ident));
13856 if !self.consume_token(&Token::Period) && !end_with_period {
13857 break;
13858 }
13859 }
13860 } else {
13861 loop {
13862 if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13863 let span = self.next_token().span;
13864 parts.push(ObjectNamePart::Identifier(Ident {
13865 value: Token::Mul.to_string(),
13866 quote_style: None,
13867 span,
13868 }));
13869 } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13870 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13871 parts.push(ObjectNamePart::Identifier(ident));
13872 if !self.consume_token(&Token::Period) && !end_with_period {
13873 break;
13874 }
13875 } else if self.dialect.supports_object_name_double_dot_notation()
13876 && parts.len() == 1
13877 && matches!(self.peek_token_ref().token, Token::Period)
13878 {
13879 parts.push(ObjectNamePart::Identifier(Ident::new("")));
13881 } else {
13882 let ident = self.parse_identifier()?;
13883 let part = if self
13884 .dialect
13885 .is_identifier_generating_function_name(&ident, &parts)
13886 {
13887 self.expect_token(&Token::LParen)?;
13888 let args: Vec<FunctionArg> =
13889 self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13890 self.expect_token(&Token::RParen)?;
13891 ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13892 } else {
13893 ObjectNamePart::Identifier(ident)
13894 };
13895 parts.push(part);
13896 }
13897
13898 if !self.consume_token(&Token::Period) {
13899 break;
13900 }
13901 }
13902 }
13903
13904 if dialect_of!(self is BigQueryDialect)
13907 && parts.iter().any(|part| {
13908 part.as_ident()
13909 .is_some_and(|ident| ident.value.contains('.'))
13910 })
13911 {
13912 parts = parts
13913 .into_iter()
13914 .flat_map(|part| match part.as_ident() {
13915 Some(ident) => ident
13916 .value
13917 .split('.')
13918 .map(|value| {
13919 ObjectNamePart::Identifier(Ident {
13920 value: value.into(),
13921 quote_style: ident.quote_style,
13922 span: ident.span,
13923 })
13924 })
13925 .collect::<Vec<_>>(),
13926 None => vec![part],
13927 })
13928 .collect()
13929 }
13930
13931 Ok(ObjectName(parts))
13932 }
13933
13934 pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13936 let mut idents = vec![];
13937 loop {
13938 let token = self.peek_token_ref();
13939 match &token.token {
13940 Token::Word(w) => {
13941 idents.push(w.to_ident(token.span));
13942 }
13943 Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13944 break
13945 }
13946 _ => {}
13947 }
13948 self.advance_token();
13949 }
13950 Ok(idents)
13951 }
13952
13953 pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13993 let mut idents = vec![];
13994
13995 let next_token = self.next_token();
13997 match next_token.token {
13998 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13999 Token::EOF => {
14000 return Err(ParserError::ParserError(
14001 "Empty input when parsing identifier".to_string(),
14002 ))?
14003 }
14004 token => {
14005 return Err(ParserError::ParserError(format!(
14006 "Unexpected token in identifier: {token}"
14007 )))?
14008 }
14009 };
14010
14011 loop {
14013 match self.next_token().token {
14014 Token::Period => {
14016 let next_token = self.next_token();
14017 match next_token.token {
14018 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
14019 Token::EOF => {
14020 return Err(ParserError::ParserError(
14021 "Trailing period in identifier".to_string(),
14022 ))?
14023 }
14024 token => {
14025 return Err(ParserError::ParserError(format!(
14026 "Unexpected token following period in identifier: {token}"
14027 )))?
14028 }
14029 }
14030 }
14031 Token::EOF => break,
14032 token => {
14033 return Err(ParserError::ParserError(format!(
14034 "Unexpected token in identifier: {token}"
14035 )))?;
14036 }
14037 }
14038 }
14039
14040 Ok(idents)
14041 }
14042
14043 pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
14045 let next_token = self.next_token();
14046 match next_token.token {
14047 Token::Word(w) => Ok(w.into_ident(next_token.span)),
14048 Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
14049 Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
14050 _ => self.expected("identifier", next_token),
14051 }
14052 }
14053
14054 fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
14065 match self.peek_token().token {
14066 Token::Word(w) => {
14067 let quote_style_is_none = w.quote_style.is_none();
14068 let mut requires_whitespace = false;
14069 let mut ident = w.into_ident(self.next_token().span);
14070 if quote_style_is_none {
14071 while matches!(self.peek_token_no_skip().token, Token::Minus) {
14072 self.next_token();
14073 ident.value.push('-');
14074
14075 let token = self
14076 .next_token_no_skip()
14077 .cloned()
14078 .unwrap_or(TokenWithSpan::wrap(Token::EOF));
14079 requires_whitespace = match token.token {
14080 Token::Word(next_word) if next_word.quote_style.is_none() => {
14081 ident.value.push_str(&next_word.value);
14082 false
14083 }
14084 Token::Number(s, false) => {
14085 if s.ends_with('.') {
14092 let Some(s) = s.split('.').next().filter(|s| {
14093 !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
14094 }) else {
14095 return self.expected(
14096 "continuation of hyphenated identifier",
14097 TokenWithSpan::new(Token::Number(s, false), token.span),
14098 );
14099 };
14100 ident.value.push_str(s);
14101 return Ok((ident, true));
14102 } else {
14103 ident.value.push_str(&s);
14104 }
14105 !matches!(self.peek_token_ref().token, Token::Period)
14108 }
14109 _ => {
14110 return self
14111 .expected("continuation of hyphenated identifier", token);
14112 }
14113 }
14114 }
14115
14116 if requires_whitespace {
14119 let token = self.next_token();
14120 if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
14121 return self
14122 .expected("whitespace following hyphenated identifier", token);
14123 }
14124 }
14125 }
14126 Ok((ident, false))
14127 }
14128 _ => Ok((self.parse_identifier()?, false)),
14129 }
14130 }
14131
14132 fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
14134 if self.consume_token(&Token::LParen) {
14135 if self.peek_token_ref().token == Token::RParen {
14136 self.next_token();
14137 Ok(vec![])
14138 } else {
14139 let cols = self.parse_comma_separated_with_trailing_commas(
14140 Parser::parse_view_column,
14141 self.dialect.supports_column_definition_trailing_commas(),
14142 Self::is_reserved_for_column_alias,
14143 )?;
14144 self.expect_token(&Token::RParen)?;
14145 Ok(cols)
14146 }
14147 } else {
14148 Ok(vec![])
14149 }
14150 }
14151
14152 fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
14154 let name = self.parse_identifier()?;
14155 let options = self.parse_view_column_options()?;
14156 let data_type = if dialect_of!(self is ClickHouseDialect) {
14157 Some(self.parse_data_type()?)
14158 } else {
14159 None
14160 };
14161 Ok(ViewColumnDef {
14162 name,
14163 data_type,
14164 options,
14165 })
14166 }
14167
14168 fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
14169 let mut options = Vec::new();
14170 loop {
14171 let option = self.parse_optional_column_option()?;
14172 if let Some(option) = option {
14173 options.push(option);
14174 } else {
14175 break;
14176 }
14177 }
14178 if options.is_empty() {
14179 Ok(None)
14180 } else if self.dialect.supports_space_separated_column_options() {
14181 Ok(Some(ColumnOptions::SpaceSeparated(options)))
14182 } else {
14183 Ok(Some(ColumnOptions::CommaSeparated(options)))
14184 }
14185 }
14186
14187 pub fn parse_parenthesized_column_list(
14190 &mut self,
14191 optional: IsOptional,
14192 allow_empty: bool,
14193 ) -> Result<Vec<Ident>, ParserError> {
14194 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
14195 }
14196
14197 pub fn parse_parenthesized_compound_identifier_list(
14199 &mut self,
14200 optional: IsOptional,
14201 allow_empty: bool,
14202 ) -> Result<Vec<Expr>, ParserError> {
14203 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14204 Ok(Expr::CompoundIdentifier(
14205 p.parse_period_separated(|p| p.parse_identifier())?,
14206 ))
14207 })
14208 }
14209
14210 fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
14213 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
14214 p.parse_create_index_expr()
14215 })
14216 }
14217
14218 pub fn parse_parenthesized_qualified_column_list(
14221 &mut self,
14222 optional: IsOptional,
14223 allow_empty: bool,
14224 ) -> Result<Vec<ObjectName>, ParserError> {
14225 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14226 p.parse_object_name(true)
14227 })
14228 }
14229
14230 fn parse_parenthesized_column_list_inner<F, T>(
14233 &mut self,
14234 optional: IsOptional,
14235 allow_empty: bool,
14236 mut f: F,
14237 ) -> Result<Vec<T>, ParserError>
14238 where
14239 F: FnMut(&mut Parser) -> Result<T, ParserError>,
14240 {
14241 if self.consume_token(&Token::LParen) {
14242 if allow_empty && self.peek_token_ref().token == Token::RParen {
14243 self.next_token();
14244 Ok(vec![])
14245 } else {
14246 let cols = self.parse_comma_separated(|p| f(p))?;
14247 self.expect_token(&Token::RParen)?;
14248 Ok(cols)
14249 }
14250 } else if optional == Optional {
14251 Ok(vec![])
14252 } else {
14253 self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
14254 }
14255 }
14256
14257 fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
14259 if self.consume_token(&Token::LParen) {
14260 let cols = self.parse_comma_separated(|p| {
14261 let name = p.parse_identifier()?;
14262 let data_type = p.maybe_parse(|p| p.parse_data_type())?;
14263 Ok(TableAliasColumnDef { name, data_type })
14264 })?;
14265 self.expect_token(&Token::RParen)?;
14266 Ok(cols)
14267 } else {
14268 Ok(vec![])
14269 }
14270 }
14271
14272 pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
14274 self.expect_token(&Token::LParen)?;
14275 let n = self.parse_literal_uint()?;
14276 self.expect_token(&Token::RParen)?;
14277 Ok(n)
14278 }
14279
14280 pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
14282 if self.consume_token(&Token::LParen) {
14283 let n = self.parse_literal_uint()?;
14284 self.expect_token(&Token::RParen)?;
14285 Ok(Some(n))
14286 } else {
14287 Ok(None)
14288 }
14289 }
14290
14291 fn maybe_parse_optional_interval_fields(
14292 &mut self,
14293 ) -> Result<Option<IntervalFields>, ParserError> {
14294 match self.parse_one_of_keywords(&[
14295 Keyword::YEAR,
14297 Keyword::DAY,
14298 Keyword::HOUR,
14299 Keyword::MINUTE,
14300 Keyword::MONTH,
14302 Keyword::SECOND,
14303 ]) {
14304 Some(Keyword::YEAR) => {
14305 if self.peek_keyword(Keyword::TO) {
14306 self.expect_keyword(Keyword::TO)?;
14307 self.expect_keyword(Keyword::MONTH)?;
14308 Ok(Some(IntervalFields::YearToMonth))
14309 } else {
14310 Ok(Some(IntervalFields::Year))
14311 }
14312 }
14313 Some(Keyword::DAY) => {
14314 if self.peek_keyword(Keyword::TO) {
14315 self.expect_keyword(Keyword::TO)?;
14316 match self.expect_one_of_keywords(&[
14317 Keyword::HOUR,
14318 Keyword::MINUTE,
14319 Keyword::SECOND,
14320 ])? {
14321 Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
14322 Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
14323 Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
14324 _ => {
14325 self.prev_token();
14326 self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
14327 }
14328 }
14329 } else {
14330 Ok(Some(IntervalFields::Day))
14331 }
14332 }
14333 Some(Keyword::HOUR) => {
14334 if self.peek_keyword(Keyword::TO) {
14335 self.expect_keyword(Keyword::TO)?;
14336 match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
14337 Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
14338 Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
14339 _ => {
14340 self.prev_token();
14341 self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
14342 }
14343 }
14344 } else {
14345 Ok(Some(IntervalFields::Hour))
14346 }
14347 }
14348 Some(Keyword::MINUTE) => {
14349 if self.peek_keyword(Keyword::TO) {
14350 self.expect_keyword(Keyword::TO)?;
14351 self.expect_keyword(Keyword::SECOND)?;
14352 Ok(Some(IntervalFields::MinuteToSecond))
14353 } else {
14354 Ok(Some(IntervalFields::Minute))
14355 }
14356 }
14357 Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
14358 Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
14359 Some(_) => {
14360 self.prev_token();
14361 self.expected_ref(
14362 "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
14363 self.peek_token_ref(),
14364 )
14365 }
14366 None => Ok(None),
14367 }
14368 }
14369
14370 pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
14378 self.expect_keyword_is(Keyword::DATETIME64)?;
14379 self.expect_token(&Token::LParen)?;
14380 let precision = self.parse_literal_uint()?;
14381 let time_zone = if self.consume_token(&Token::Comma) {
14382 Some(self.parse_literal_string()?)
14383 } else {
14384 None
14385 };
14386 self.expect_token(&Token::RParen)?;
14387 Ok((precision, time_zone))
14388 }
14389
14390 pub fn parse_optional_character_length(
14392 &mut self,
14393 ) -> Result<Option<CharacterLength>, ParserError> {
14394 if self.consume_token(&Token::LParen) {
14395 let character_length = self.parse_character_length()?;
14396 self.expect_token(&Token::RParen)?;
14397 Ok(Some(character_length))
14398 } else {
14399 Ok(None)
14400 }
14401 }
14402
14403 pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
14405 if self.consume_token(&Token::LParen) {
14406 let binary_length = self.parse_binary_length()?;
14407 self.expect_token(&Token::RParen)?;
14408 Ok(Some(binary_length))
14409 } else {
14410 Ok(None)
14411 }
14412 }
14413
14414 pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
14416 if self.parse_keyword(Keyword::MAX) {
14417 return Ok(CharacterLength::Max);
14418 }
14419 let length = self.parse_literal_uint()?;
14420 let unit = if self.parse_keyword(Keyword::CHARACTERS) {
14421 Some(CharLengthUnits::Characters)
14422 } else if self.parse_keyword(Keyword::OCTETS) {
14423 Some(CharLengthUnits::Octets)
14424 } else {
14425 None
14426 };
14427 Ok(CharacterLength::IntegerLength { length, unit })
14428 }
14429
14430 pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
14432 if self.parse_keyword(Keyword::MAX) {
14433 return Ok(BinaryLength::Max);
14434 }
14435 let length = self.parse_literal_uint()?;
14436 Ok(BinaryLength::IntegerLength { length })
14437 }
14438
14439 pub fn parse_optional_precision_scale(
14441 &mut self,
14442 ) -> Result<(Option<u64>, Option<u64>), ParserError> {
14443 if self.consume_token(&Token::LParen) {
14444 let n = self.parse_literal_uint()?;
14445 let scale = if self.consume_token(&Token::Comma) {
14446 Some(self.parse_literal_uint()?)
14447 } else {
14448 None
14449 };
14450 self.expect_token(&Token::RParen)?;
14451 Ok((Some(n), scale))
14452 } else {
14453 Ok((None, None))
14454 }
14455 }
14456
14457 pub fn parse_exact_number_optional_precision_scale(
14459 &mut self,
14460 ) -> Result<ExactNumberInfo, ParserError> {
14461 if self.consume_token(&Token::LParen) {
14462 let precision = self.parse_literal_uint()?;
14463 let scale = if self.consume_token(&Token::Comma) {
14464 Some(self.parse_signed_integer()?)
14465 } else {
14466 None
14467 };
14468
14469 self.expect_token(&Token::RParen)?;
14470
14471 match scale {
14472 None => Ok(ExactNumberInfo::Precision(precision)),
14473 Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
14474 }
14475 } else {
14476 Ok(ExactNumberInfo::None)
14477 }
14478 }
14479
14480 fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
14482 let is_negative = self.consume_token(&Token::Minus);
14483
14484 if !is_negative {
14485 let _ = self.consume_token(&Token::Plus);
14486 }
14487
14488 let current_token = self.peek_token_ref();
14489 match ¤t_token.token {
14490 Token::Number(s, _) => {
14491 let s = s.clone();
14492 let span_start = current_token.span.start;
14493 self.advance_token();
14494 let value = Self::parse::<i64>(s, span_start)?;
14495 Ok(if is_negative { -value } else { value })
14496 }
14497 _ => self.expected_ref("number", current_token),
14498 }
14499 }
14500
14501 pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
14503 if self.consume_token(&Token::LParen) {
14504 let mut modifiers = Vec::new();
14505 loop {
14506 let next_token = self.next_token();
14507 match next_token.token {
14508 Token::Word(w) => modifiers.push(w.to_string()),
14509 Token::Number(n, _) => modifiers.push(n),
14510 Token::SingleQuotedString(s) => modifiers.push(s),
14511
14512 Token::Comma => {
14513 continue;
14514 }
14515 Token::RParen => {
14516 break;
14517 }
14518 _ => self.expected("type modifiers", next_token)?,
14519 }
14520 }
14521
14522 Ok(Some(modifiers))
14523 } else {
14524 Ok(None)
14525 }
14526 }
14527
14528 fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
14530 where
14531 F: FnOnce(Box<DataType>) -> DataType,
14532 {
14533 self.expect_token(&Token::LParen)?;
14534 let inside_type = self.parse_data_type()?;
14535 self.expect_token(&Token::RParen)?;
14536 Ok(parent_type(inside_type.into()))
14537 }
14538
14539 fn parse_delete_setexpr_boxed(
14543 &mut self,
14544 delete_token: TokenWithSpan,
14545 ) -> Result<Box<SetExpr>, ParserError> {
14546 Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
14547 }
14548
14549 pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
14551 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14552 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
14553 if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
14556 (vec![], false)
14557 } else {
14558 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
14559 self.expect_keyword_is(Keyword::FROM)?;
14560 (tables, true)
14561 }
14562 } else {
14563 (vec![], true)
14564 };
14565
14566 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14567
14568 let output = self.maybe_parse_output_clause()?;
14569
14570 let using = if self.parse_keyword(Keyword::USING) {
14571 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14572 } else {
14573 None
14574 };
14575 let selection = if self.parse_keyword(Keyword::WHERE) {
14576 Some(self.parse_expr()?)
14577 } else {
14578 None
14579 };
14580 let returning = if self.parse_keyword(Keyword::RETURNING) {
14581 Some(self.parse_comma_separated(Parser::parse_select_item)?)
14582 } else {
14583 None
14584 };
14585 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14586 self.parse_comma_separated(Parser::parse_order_by_expr)?
14587 } else {
14588 vec![]
14589 };
14590 let limit = if self.parse_keyword(Keyword::LIMIT) {
14591 self.parse_limit()?
14592 } else {
14593 None
14594 };
14595
14596 Ok(Statement::Delete(Delete {
14597 delete_token: delete_token.into(),
14598 optimizer_hints,
14599 tables,
14600 from: if with_from_keyword {
14601 FromTable::WithFromKeyword(from)
14602 } else {
14603 FromTable::WithoutKeyword(from)
14604 },
14605 using,
14606 selection,
14607 returning,
14608 output,
14609 order_by,
14610 limit,
14611 }))
14612 }
14613
14614 pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14617 let modifier_keyword =
14618 self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14619
14620 let id = self.parse_literal_uint()?;
14621
14622 let modifier = match modifier_keyword {
14623 Some(Keyword::CONNECTION) => Some(KillType::Connection),
14624 Some(Keyword::QUERY) => Some(KillType::Query),
14625 Some(Keyword::MUTATION) => {
14626 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14627 Some(KillType::Mutation)
14628 } else {
14629 self.expected_ref(
14630 "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14631 self.peek_token_ref(),
14632 )?
14633 }
14634 }
14635 _ => None,
14636 };
14637
14638 Ok(Statement::Kill { modifier, id })
14639 }
14640
14641 pub fn parse_explain(
14643 &mut self,
14644 describe_alias: DescribeAlias,
14645 ) -> Result<Statement, ParserError> {
14646 let mut analyze = false;
14647 let mut verbose = false;
14648 let mut query_plan = false;
14649 let mut estimate = false;
14650 let mut format = None;
14651 let mut options = None;
14652
14653 if describe_alias == DescribeAlias::Explain
14656 && self.dialect.supports_explain_with_utility_options()
14657 && self.peek_token_ref().token == Token::LParen
14658 {
14659 options = Some(self.parse_utility_options()?)
14660 } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14661 query_plan = true;
14662 } else if self.parse_keyword(Keyword::ESTIMATE) {
14663 estimate = true;
14664 } else {
14665 analyze = self.parse_keyword(Keyword::ANALYZE);
14666 verbose = self.parse_keyword(Keyword::VERBOSE);
14667 if self.parse_keyword(Keyword::FORMAT) {
14668 format = Some(self.parse_analyze_format_kind()?);
14669 }
14670 }
14671
14672 match self.maybe_parse(|parser| parser.parse_statement())? {
14673 Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14674 ParserError::ParserError("Explain must be root of the plan".to_string()),
14675 ),
14676 Some(statement) => Ok(Statement::Explain {
14677 describe_alias,
14678 analyze,
14679 verbose,
14680 query_plan,
14681 estimate,
14682 statement: Box::new(statement),
14683 format,
14684 options,
14685 }),
14686 _ => {
14687 let hive_format =
14688 match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14689 Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14690 Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14691 _ => None,
14692 };
14693
14694 let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14695 self.parse_keyword(Keyword::TABLE)
14697 } else {
14698 false
14699 };
14700
14701 let table_name = self.parse_object_name(false)?;
14702 Ok(Statement::ExplainTable {
14703 describe_alias,
14704 hive_format,
14705 has_table_keyword,
14706 table_name,
14707 })
14708 }
14709 }
14710 }
14711
14712 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14717 pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14718 let _guard = self.recursion_counter.try_decrease()?;
14719 let with = if self.parse_keyword(Keyword::WITH) {
14720 let with_token = self.get_current_token();
14721 Some(With {
14722 with_token: with_token.clone().into(),
14723 recursive: self.parse_keyword(Keyword::RECURSIVE),
14724 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14725 })
14726 } else {
14727 None
14728 };
14729 if self.parse_keyword(Keyword::INSERT) {
14730 Ok(Query {
14731 with,
14732 body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14733 order_by: None,
14734 limit_clause: None,
14735 fetch: None,
14736 locks: vec![],
14737 for_clause: None,
14738 settings: None,
14739 format_clause: None,
14740 pipe_operators: vec![],
14741 }
14742 .into())
14743 } else if self.parse_keyword(Keyword::UPDATE) {
14744 Ok(Query {
14745 with,
14746 body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14747 order_by: None,
14748 limit_clause: None,
14749 fetch: None,
14750 locks: vec![],
14751 for_clause: None,
14752 settings: None,
14753 format_clause: None,
14754 pipe_operators: vec![],
14755 }
14756 .into())
14757 } else if self.parse_keyword(Keyword::DELETE) {
14758 Ok(Query {
14759 with,
14760 body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14761 limit_clause: None,
14762 order_by: None,
14763 fetch: None,
14764 locks: vec![],
14765 for_clause: None,
14766 settings: None,
14767 format_clause: None,
14768 pipe_operators: vec![],
14769 }
14770 .into())
14771 } else if self.parse_keyword(Keyword::MERGE) {
14772 Ok(Query {
14773 with,
14774 body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14775 limit_clause: None,
14776 order_by: None,
14777 fetch: None,
14778 locks: vec![],
14779 for_clause: None,
14780 settings: None,
14781 format_clause: None,
14782 pipe_operators: vec![],
14783 }
14784 .into())
14785 } else {
14786 let body = self.parse_query_body(self.dialect.prec_unknown())?;
14787
14788 let order_by = self.parse_optional_order_by()?;
14789
14790 let limit_clause = self.parse_optional_limit_clause()?;
14791
14792 let settings = self.parse_settings()?;
14793
14794 let fetch = if self.parse_keyword(Keyword::FETCH) {
14795 Some(self.parse_fetch()?)
14796 } else {
14797 None
14798 };
14799
14800 let mut for_clause = None;
14801 let mut locks = Vec::new();
14802 while self.parse_keyword(Keyword::FOR) {
14803 if let Some(parsed_for_clause) = self.parse_for_clause()? {
14804 for_clause = Some(parsed_for_clause);
14805 break;
14806 } else {
14807 locks.push(self.parse_lock()?);
14808 }
14809 }
14810 let format_clause =
14811 if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14812 if self.parse_keyword(Keyword::NULL) {
14813 Some(FormatClause::Null)
14814 } else {
14815 let ident = self.parse_identifier()?;
14816 Some(FormatClause::Identifier(ident))
14817 }
14818 } else {
14819 None
14820 };
14821
14822 let pipe_operators = if self.dialect.supports_pipe_operator() {
14823 self.parse_pipe_operators()?
14824 } else {
14825 Vec::new()
14826 };
14827
14828 Ok(Query {
14829 with,
14830 body,
14831 order_by,
14832 limit_clause,
14833 fetch,
14834 locks,
14835 for_clause,
14836 settings,
14837 format_clause,
14838 pipe_operators,
14839 }
14840 .into())
14841 }
14842 }
14843
14844 fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14845 let mut pipe_operators = Vec::new();
14846
14847 while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14848 let kw = self.expect_one_of_keywords(&[
14849 Keyword::SELECT,
14850 Keyword::EXTEND,
14851 Keyword::SET,
14852 Keyword::DROP,
14853 Keyword::AS,
14854 Keyword::WHERE,
14855 Keyword::LIMIT,
14856 Keyword::AGGREGATE,
14857 Keyword::ORDER,
14858 Keyword::TABLESAMPLE,
14859 Keyword::RENAME,
14860 Keyword::UNION,
14861 Keyword::INTERSECT,
14862 Keyword::EXCEPT,
14863 Keyword::CALL,
14864 Keyword::PIVOT,
14865 Keyword::UNPIVOT,
14866 Keyword::JOIN,
14867 Keyword::INNER,
14868 Keyword::LEFT,
14869 Keyword::RIGHT,
14870 Keyword::FULL,
14871 Keyword::CROSS,
14872 ])?;
14873 match kw {
14874 Keyword::SELECT => {
14875 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14876 pipe_operators.push(PipeOperator::Select { exprs })
14877 }
14878 Keyword::EXTEND => {
14879 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14880 pipe_operators.push(PipeOperator::Extend { exprs })
14881 }
14882 Keyword::SET => {
14883 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14884 pipe_operators.push(PipeOperator::Set { assignments })
14885 }
14886 Keyword::DROP => {
14887 let columns = self.parse_identifiers()?;
14888 pipe_operators.push(PipeOperator::Drop { columns })
14889 }
14890 Keyword::AS => {
14891 let alias = self.parse_identifier()?;
14892 pipe_operators.push(PipeOperator::As { alias })
14893 }
14894 Keyword::WHERE => {
14895 let expr = self.parse_expr()?;
14896 pipe_operators.push(PipeOperator::Where { expr })
14897 }
14898 Keyword::LIMIT => {
14899 let expr = self.parse_expr()?;
14900 let offset = if self.parse_keyword(Keyword::OFFSET) {
14901 Some(self.parse_expr()?)
14902 } else {
14903 None
14904 };
14905 pipe_operators.push(PipeOperator::Limit { expr, offset })
14906 }
14907 Keyword::AGGREGATE => {
14908 let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14909 vec![]
14910 } else {
14911 self.parse_comma_separated(|parser| {
14912 parser.parse_expr_with_alias_and_order_by()
14913 })?
14914 };
14915
14916 let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14917 self.parse_comma_separated(|parser| {
14918 parser.parse_expr_with_alias_and_order_by()
14919 })?
14920 } else {
14921 vec![]
14922 };
14923
14924 pipe_operators.push(PipeOperator::Aggregate {
14925 full_table_exprs,
14926 group_by_expr,
14927 })
14928 }
14929 Keyword::ORDER => {
14930 self.expect_one_of_keywords(&[Keyword::BY])?;
14931 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14932 pipe_operators.push(PipeOperator::OrderBy { exprs })
14933 }
14934 Keyword::TABLESAMPLE => {
14935 let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14936 pipe_operators.push(PipeOperator::TableSample { sample });
14937 }
14938 Keyword::RENAME => {
14939 let mappings =
14940 self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14941 pipe_operators.push(PipeOperator::Rename { mappings });
14942 }
14943 Keyword::UNION => {
14944 let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14945 let queries = self.parse_pipe_operator_queries()?;
14946 pipe_operators.push(PipeOperator::Union {
14947 set_quantifier,
14948 queries,
14949 });
14950 }
14951 Keyword::INTERSECT => {
14952 let set_quantifier =
14953 self.parse_distinct_required_set_quantifier("INTERSECT")?;
14954 let queries = self.parse_pipe_operator_queries()?;
14955 pipe_operators.push(PipeOperator::Intersect {
14956 set_quantifier,
14957 queries,
14958 });
14959 }
14960 Keyword::EXCEPT => {
14961 let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14962 let queries = self.parse_pipe_operator_queries()?;
14963 pipe_operators.push(PipeOperator::Except {
14964 set_quantifier,
14965 queries,
14966 });
14967 }
14968 Keyword::CALL => {
14969 let function_name = self.parse_object_name(false)?;
14970 let function_expr = self.parse_function(function_name)?;
14971 if let Expr::Function(function) = function_expr {
14972 let alias = self.parse_identifier_optional_alias()?;
14973 pipe_operators.push(PipeOperator::Call { function, alias });
14974 } else {
14975 return Err(ParserError::ParserError(
14976 "Expected function call after CALL".to_string(),
14977 ));
14978 }
14979 }
14980 Keyword::PIVOT => {
14981 self.expect_token(&Token::LParen)?;
14982 let aggregate_functions =
14983 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14984 self.expect_keyword_is(Keyword::FOR)?;
14985 let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14986 self.expect_keyword_is(Keyword::IN)?;
14987
14988 self.expect_token(&Token::LParen)?;
14989 let value_source = if self.parse_keyword(Keyword::ANY) {
14990 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14991 self.parse_comma_separated(Parser::parse_order_by_expr)?
14992 } else {
14993 vec![]
14994 };
14995 PivotValueSource::Any(order_by)
14996 } else if self.peek_sub_query() {
14997 PivotValueSource::Subquery(self.parse_query()?)
14998 } else {
14999 PivotValueSource::List(
15000 self.parse_comma_separated(Self::parse_expr_with_alias)?,
15001 )
15002 };
15003 self.expect_token(&Token::RParen)?;
15004 self.expect_token(&Token::RParen)?;
15005
15006 let alias = self.parse_identifier_optional_alias()?;
15007
15008 pipe_operators.push(PipeOperator::Pivot {
15009 aggregate_functions,
15010 value_column,
15011 value_source,
15012 alias,
15013 });
15014 }
15015 Keyword::UNPIVOT => {
15016 self.expect_token(&Token::LParen)?;
15017 let value_column = self.parse_identifier()?;
15018 self.expect_keyword(Keyword::FOR)?;
15019 let name_column = self.parse_identifier()?;
15020 self.expect_keyword(Keyword::IN)?;
15021
15022 self.expect_token(&Token::LParen)?;
15023 let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
15024 self.expect_token(&Token::RParen)?;
15025
15026 self.expect_token(&Token::RParen)?;
15027
15028 let alias = self.parse_identifier_optional_alias()?;
15029
15030 pipe_operators.push(PipeOperator::Unpivot {
15031 value_column,
15032 name_column,
15033 unpivot_columns,
15034 alias,
15035 });
15036 }
15037 Keyword::JOIN
15038 | Keyword::INNER
15039 | Keyword::LEFT
15040 | Keyword::RIGHT
15041 | Keyword::FULL
15042 | Keyword::CROSS => {
15043 self.prev_token();
15044 let mut joins = self.parse_joins()?;
15045 if joins.len() != 1 {
15046 return Err(ParserError::ParserError(
15047 "Join pipe operator must have a single join".to_string(),
15048 ));
15049 }
15050 let join = joins.swap_remove(0);
15051 pipe_operators.push(PipeOperator::Join(join))
15052 }
15053 unhandled => {
15054 return Err(ParserError::ParserError(format!(
15055 "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
15056 )))
15057 }
15058 }
15059 }
15060 Ok(pipe_operators)
15061 }
15062
15063 fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
15064 let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
15065 {
15066 let key_values = self.parse_comma_separated(|p| {
15067 let key = p.parse_identifier()?;
15068 p.expect_token(&Token::Eq)?;
15069 let value = p.parse_expr()?;
15070 Ok(Setting { key, value })
15071 })?;
15072 Some(key_values)
15073 } else {
15074 None
15075 };
15076 Ok(settings)
15077 }
15078
15079 pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
15081 if self.parse_keyword(Keyword::XML) {
15082 Ok(Some(self.parse_for_xml()?))
15083 } else if self.parse_keyword(Keyword::JSON) {
15084 Ok(Some(self.parse_for_json()?))
15085 } else if self.parse_keyword(Keyword::BROWSE) {
15086 Ok(Some(ForClause::Browse))
15087 } else {
15088 Ok(None)
15089 }
15090 }
15091
15092 pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
15094 let for_xml = if self.parse_keyword(Keyword::RAW) {
15095 let mut element_name = None;
15096 if self.peek_token_ref().token == Token::LParen {
15097 self.expect_token(&Token::LParen)?;
15098 element_name = Some(self.parse_literal_string()?);
15099 self.expect_token(&Token::RParen)?;
15100 }
15101 ForXml::Raw(element_name)
15102 } else if self.parse_keyword(Keyword::AUTO) {
15103 ForXml::Auto
15104 } else if self.parse_keyword(Keyword::EXPLICIT) {
15105 ForXml::Explicit
15106 } else if self.parse_keyword(Keyword::PATH) {
15107 let mut element_name = None;
15108 if self.peek_token_ref().token == Token::LParen {
15109 self.expect_token(&Token::LParen)?;
15110 element_name = Some(self.parse_literal_string()?);
15111 self.expect_token(&Token::RParen)?;
15112 }
15113 ForXml::Path(element_name)
15114 } else {
15115 return Err(ParserError::ParserError(
15116 "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
15117 ));
15118 };
15119 let mut elements = false;
15120 let mut binary_base64 = false;
15121 let mut root = None;
15122 let mut r#type = false;
15123 while self.peek_token_ref().token == Token::Comma {
15124 self.next_token();
15125 if self.parse_keyword(Keyword::ELEMENTS) {
15126 elements = true;
15127 } else if self.parse_keyword(Keyword::BINARY) {
15128 self.expect_keyword_is(Keyword::BASE64)?;
15129 binary_base64 = true;
15130 } else if self.parse_keyword(Keyword::ROOT) {
15131 self.expect_token(&Token::LParen)?;
15132 root = Some(self.parse_literal_string()?);
15133 self.expect_token(&Token::RParen)?;
15134 } else if self.parse_keyword(Keyword::TYPE) {
15135 r#type = true;
15136 }
15137 }
15138 Ok(ForClause::Xml {
15139 for_xml,
15140 elements,
15141 binary_base64,
15142 root,
15143 r#type,
15144 })
15145 }
15146
15147 pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
15149 let for_json = if self.parse_keyword(Keyword::AUTO) {
15150 ForJson::Auto
15151 } else if self.parse_keyword(Keyword::PATH) {
15152 ForJson::Path
15153 } else {
15154 return Err(ParserError::ParserError(
15155 "Expected FOR JSON [AUTO | PATH ]".to_string(),
15156 ));
15157 };
15158 let mut root = None;
15159 let mut include_null_values = false;
15160 let mut without_array_wrapper = false;
15161 while self.peek_token_ref().token == Token::Comma {
15162 self.next_token();
15163 if self.parse_keyword(Keyword::ROOT) {
15164 self.expect_token(&Token::LParen)?;
15165 root = Some(self.parse_literal_string()?);
15166 self.expect_token(&Token::RParen)?;
15167 } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
15168 include_null_values = true;
15169 } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
15170 without_array_wrapper = true;
15171 }
15172 }
15173 Ok(ForClause::Json {
15174 for_json,
15175 root,
15176 include_null_values,
15177 without_array_wrapper,
15178 })
15179 }
15180
15181 pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
15183 let name = self.parse_identifier()?;
15184
15185 let as_optional = self.dialect.supports_cte_without_as();
15186
15187 if as_optional && !self.peek_keyword(Keyword::AS) {
15189 if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
15190 p.expect_token(&Token::LParen)?;
15191 let query = p.parse_query()?;
15192 let closing_paren_token = p.expect_token(&Token::RParen)?;
15193 Ok((query, closing_paren_token))
15194 })? {
15195 let mut cte = Cte {
15196 alias: TableAlias {
15197 explicit: false,
15198 name,
15199 columns: vec![],
15200 },
15201 query,
15202 from: None,
15203 materialized: None,
15204 closing_paren_token: closing_paren_token.into(),
15205 };
15206 if self.parse_keyword(Keyword::FROM) {
15207 cte.from = Some(self.parse_identifier()?);
15208 }
15209 return Ok(cte);
15210 }
15211 }
15212
15213 let columns = if self.parse_keyword(Keyword::AS) {
15215 vec![]
15216 } else {
15217 let columns = self.parse_table_alias_column_defs()?;
15218 if as_optional {
15219 let _ = self.parse_keyword(Keyword::AS);
15220 } else {
15221 self.expect_keyword_is(Keyword::AS)?;
15222 }
15223 columns
15224 };
15225
15226 let mut is_materialized = None;
15227 if dialect_of!(self is PostgreSqlDialect) {
15228 if self.parse_keyword(Keyword::MATERIALIZED) {
15229 is_materialized = Some(CteAsMaterialized::Materialized);
15230 } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
15231 is_materialized = Some(CteAsMaterialized::NotMaterialized);
15232 }
15233 }
15234
15235 self.expect_token(&Token::LParen)?;
15236 let query = self.parse_query()?;
15237 let closing_paren_token = self.expect_token(&Token::RParen)?;
15238
15239 let mut cte = Cte {
15240 alias: TableAlias {
15241 explicit: false,
15242 name,
15243 columns,
15244 },
15245 query,
15246 from: None,
15247 materialized: is_materialized,
15248 closing_paren_token: closing_paren_token.into(),
15249 };
15250 if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
15251 cte.from = Some(self.parse_identifier()?);
15252 }
15253 Ok(cte)
15254 }
15255
15256 pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
15265 let expr = if self.peek_keyword(Keyword::SELECT)
15268 || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
15269 {
15270 SetExpr::Select(self.parse_select().map(Box::new)?)
15271 } else if self.consume_token(&Token::LParen) {
15272 let subquery = self.parse_query()?;
15274 self.expect_token(&Token::RParen)?;
15275 SetExpr::Query(subquery)
15276 } else if self.parse_keyword(Keyword::VALUES) {
15277 let is_mysql = dialect_of!(self is MySqlDialect);
15278 SetExpr::Values(self.parse_values(is_mysql, false)?)
15279 } else if self.parse_keyword(Keyword::VALUE) {
15280 let is_mysql = dialect_of!(self is MySqlDialect);
15281 SetExpr::Values(self.parse_values(is_mysql, true)?)
15282 } else if self.parse_keyword(Keyword::TABLE) {
15283 SetExpr::Table(Box::new(self.parse_as_table()?))
15284 } else {
15285 return self.expected_ref(
15286 "SELECT, VALUES, or a subquery in the query body",
15287 self.peek_token_ref(),
15288 );
15289 };
15290
15291 self.parse_remaining_set_exprs(expr, precedence)
15292 }
15293
15294 fn parse_remaining_set_exprs(
15298 &mut self,
15299 mut expr: SetExpr,
15300 precedence: u8,
15301 ) -> Result<Box<SetExpr>, ParserError> {
15302 loop {
15303 let op = self.parse_set_operator(&self.peek_token().token);
15305 let next_precedence = match op {
15306 Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
15308 10
15309 }
15310 Some(SetOperator::Intersect) => 20,
15312 None => break,
15314 };
15315 if precedence >= next_precedence {
15316 break;
15317 }
15318 self.next_token(); let set_quantifier = self.parse_set_quantifier(&op);
15320 expr = SetExpr::SetOperation {
15321 left: Box::new(expr),
15322 op: op.unwrap(),
15323 set_quantifier,
15324 right: self.parse_query_body(next_precedence)?,
15325 };
15326 }
15327
15328 Ok(expr.into())
15329 }
15330
15331 pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
15333 match token {
15334 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
15335 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
15336 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
15337 Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
15338 _ => None,
15339 }
15340 }
15341
15342 pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
15344 match op {
15345 Some(
15346 SetOperator::Except
15347 | SetOperator::Intersect
15348 | SetOperator::Union
15349 | SetOperator::Minus,
15350 ) => {
15351 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
15352 SetQuantifier::DistinctByName
15353 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15354 SetQuantifier::ByName
15355 } else if self.parse_keyword(Keyword::ALL) {
15356 if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15357 SetQuantifier::AllByName
15358 } else {
15359 SetQuantifier::All
15360 }
15361 } else if self.parse_keyword(Keyword::DISTINCT) {
15362 SetQuantifier::Distinct
15363 } else {
15364 SetQuantifier::None
15365 }
15366 }
15367 _ => SetQuantifier::None,
15368 }
15369 }
15370
15371 pub fn parse_select(&mut self) -> Result<Select, ParserError> {
15373 let mut from_first = None;
15374
15375 if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
15376 let from_token = self.expect_keyword(Keyword::FROM)?;
15377 let from = self.parse_table_with_joins()?;
15378 if !self.peek_keyword(Keyword::SELECT) {
15379 return Ok(Select {
15380 select_token: AttachedToken(from_token),
15381 optimizer_hints: vec![],
15382 distinct: None,
15383 select_modifiers: None,
15384 top: None,
15385 top_before_distinct: false,
15386 projection: vec![],
15387 exclude: None,
15388 into: None,
15389 from,
15390 lateral_views: vec![],
15391 prewhere: None,
15392 selection: None,
15393 group_by: GroupByExpr::Expressions(vec![], vec![]),
15394 cluster_by: vec![],
15395 distribute_by: vec![],
15396 sort_by: vec![],
15397 having: None,
15398 named_window: vec![],
15399 window_before_qualify: false,
15400 qualify: None,
15401 value_table_mode: None,
15402 connect_by: vec![],
15403 flavor: SelectFlavor::FromFirstNoSelect,
15404 });
15405 }
15406 from_first = Some(from);
15407 }
15408
15409 let select_token = self.expect_keyword(Keyword::SELECT)?;
15410 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
15411 let value_table_mode = self.parse_value_table_mode()?;
15412
15413 let (select_modifiers, distinct_select_modifier) =
15414 if self.dialect.supports_select_modifiers() {
15415 self.parse_select_modifiers()?
15416 } else {
15417 (None, None)
15418 };
15419
15420 let mut top_before_distinct = false;
15421 let mut top = None;
15422 if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15423 top = Some(self.parse_top()?);
15424 top_before_distinct = true;
15425 }
15426
15427 let distinct = if distinct_select_modifier.is_some() {
15428 distinct_select_modifier
15429 } else {
15430 self.parse_all_or_distinct()?
15431 };
15432
15433 if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15434 top = Some(self.parse_top()?);
15435 }
15436
15437 let projection =
15438 if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
15439 vec![]
15440 } else {
15441 self.parse_projection()?
15442 };
15443
15444 let exclude = if self.dialect.supports_select_exclude() {
15445 self.parse_optional_select_item_exclude()?
15446 } else {
15447 None
15448 };
15449
15450 let into = if self.parse_keyword(Keyword::INTO) {
15451 Some(self.parse_select_into()?)
15452 } else {
15453 None
15454 };
15455
15456 let (from, from_first) = if let Some(from) = from_first.take() {
15462 (from, true)
15463 } else if self.parse_keyword(Keyword::FROM) {
15464 (self.parse_table_with_joins()?, false)
15465 } else {
15466 (vec![], false)
15467 };
15468
15469 let mut lateral_views = vec![];
15470 loop {
15471 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
15472 let outer = self.parse_keyword(Keyword::OUTER);
15473 let lateral_view = self.parse_expr()?;
15474 let lateral_view_name = self.parse_object_name(false)?;
15475 let lateral_col_alias = self
15476 .parse_comma_separated(|parser| {
15477 parser.parse_optional_alias(&[
15478 Keyword::WHERE,
15479 Keyword::GROUP,
15480 Keyword::CLUSTER,
15481 Keyword::HAVING,
15482 Keyword::LATERAL,
15483 ]) })?
15485 .into_iter()
15486 .flatten()
15487 .collect();
15488
15489 lateral_views.push(LateralView {
15490 lateral_view,
15491 lateral_view_name,
15492 lateral_col_alias,
15493 outer,
15494 });
15495 } else {
15496 break;
15497 }
15498 }
15499
15500 let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
15501 {
15502 Some(self.parse_expr()?)
15503 } else {
15504 None
15505 };
15506
15507 let selection = if self.parse_keyword(Keyword::WHERE) {
15508 Some(self.parse_expr()?)
15509 } else {
15510 None
15511 };
15512
15513 let connect_by = self.maybe_parse_connect_by()?;
15514
15515 let group_by = self
15516 .parse_optional_group_by()?
15517 .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
15518
15519 let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
15520 self.parse_comma_separated(Parser::parse_expr)?
15521 } else {
15522 vec![]
15523 };
15524
15525 let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
15526 self.parse_comma_separated(Parser::parse_expr)?
15527 } else {
15528 vec![]
15529 };
15530
15531 let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
15532 self.parse_comma_separated(Parser::parse_order_by_expr)?
15533 } else {
15534 vec![]
15535 };
15536
15537 let having = if self.parse_keyword(Keyword::HAVING) {
15538 Some(self.parse_expr()?)
15539 } else {
15540 None
15541 };
15542
15543 let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
15545 {
15546 let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
15547 if self.parse_keyword(Keyword::QUALIFY) {
15548 (named_windows, Some(self.parse_expr()?), true)
15549 } else {
15550 (named_windows, None, true)
15551 }
15552 } else if self.parse_keyword(Keyword::QUALIFY) {
15553 let qualify = Some(self.parse_expr()?);
15554 if self.parse_keyword(Keyword::WINDOW) {
15555 (
15556 self.parse_comma_separated(Parser::parse_named_window)?,
15557 qualify,
15558 false,
15559 )
15560 } else {
15561 (Default::default(), qualify, false)
15562 }
15563 } else {
15564 Default::default()
15565 };
15566
15567 Ok(Select {
15568 select_token: AttachedToken(select_token),
15569 optimizer_hints,
15570 distinct,
15571 select_modifiers,
15572 top,
15573 top_before_distinct,
15574 projection,
15575 exclude,
15576 into,
15577 from,
15578 lateral_views,
15579 prewhere,
15580 selection,
15581 group_by,
15582 cluster_by,
15583 distribute_by,
15584 sort_by,
15585 having,
15586 named_window: named_windows,
15587 window_before_qualify,
15588 qualify,
15589 value_table_mode,
15590 connect_by,
15591 flavor: if from_first {
15592 SelectFlavor::FromFirst
15593 } else {
15594 SelectFlavor::Standard
15595 },
15596 })
15597 }
15598
15599 fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15608 let supports_hints = self.dialect.supports_comment_optimizer_hint();
15609 if !supports_hints {
15610 return Ok(vec![]);
15611 }
15612 let mut hints = vec![];
15613 loop {
15614 let t = self.peek_nth_token_no_skip_ref(0);
15615 let Token::Whitespace(ws) = &t.token else {
15616 break;
15617 };
15618 match ws {
15619 Whitespace::SingleLineComment { comment, prefix } => {
15620 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15621 hints.push(OptimizerHint {
15622 prefix: hint_prefix,
15623 text,
15624 style: OptimizerHintStyle::SingleLine {
15625 prefix: prefix.clone(),
15626 },
15627 });
15628 }
15629 self.next_token_no_skip();
15630 }
15631 Whitespace::MultiLineComment(comment) => {
15632 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15633 hints.push(OptimizerHint {
15634 prefix: hint_prefix,
15635 text,
15636 style: OptimizerHintStyle::MultiLine,
15637 });
15638 }
15639 self.next_token_no_skip();
15640 }
15641 Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15642 self.next_token_no_skip();
15643 }
15644 }
15645 }
15646 Ok(hints)
15647 }
15648
15649 fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15652 let (before_plus, text) = comment.split_once('+')?;
15653 if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15654 Some((before_plus.to_string(), text.to_string()))
15655 } else {
15656 None
15657 }
15658 }
15659
15660 fn parse_select_modifiers(
15667 &mut self,
15668 ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15669 let mut modifiers = SelectModifiers::default();
15670 let mut distinct = None;
15671
15672 let keywords = &[
15673 Keyword::ALL,
15674 Keyword::DISTINCT,
15675 Keyword::DISTINCTROW,
15676 Keyword::HIGH_PRIORITY,
15677 Keyword::STRAIGHT_JOIN,
15678 Keyword::SQL_SMALL_RESULT,
15679 Keyword::SQL_BIG_RESULT,
15680 Keyword::SQL_BUFFER_RESULT,
15681 Keyword::SQL_NO_CACHE,
15682 Keyword::SQL_CALC_FOUND_ROWS,
15683 ];
15684
15685 while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15686 match keyword {
15687 Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15688 self.prev_token();
15689 distinct = self.parse_all_or_distinct()?;
15690 }
15691 Keyword::DISTINCTROW if distinct.is_none() => {
15693 distinct = Some(Distinct::Distinct);
15694 }
15695 Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15696 Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15697 Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15698 Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15699 Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15700 Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15701 Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15702 _ => {
15703 self.prev_token();
15704 return self.expected_ref(
15705 "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15706 self.peek_token_ref(),
15707 );
15708 }
15709 }
15710 }
15711
15712 let select_modifiers = if modifiers.is_any_set() {
15715 Some(modifiers)
15716 } else {
15717 None
15718 };
15719 Ok((select_modifiers, distinct))
15720 }
15721
15722 fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15723 if !dialect_of!(self is BigQueryDialect) {
15724 return Ok(None);
15725 }
15726
15727 let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15728 Some(ValueTableMode::DistinctAsValue)
15729 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15730 Some(ValueTableMode::DistinctAsStruct)
15731 } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15732 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15733 {
15734 Some(ValueTableMode::AsValue)
15735 } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15736 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15737 {
15738 Some(ValueTableMode::AsStruct)
15739 } else if self.parse_keyword(Keyword::AS) {
15740 self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15741 } else {
15742 None
15743 };
15744
15745 Ok(mode)
15746 }
15747
15748 fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15752 where
15753 F: FnMut(&mut Parser) -> Result<T, ParserError>,
15754 {
15755 let current_state = self.state;
15756 self.state = state;
15757 let res = f(self);
15758 self.state = current_state;
15759 res
15760 }
15761
15762 pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15764 let mut clauses = Vec::with_capacity(2);
15765 loop {
15766 if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15767 clauses.push(ConnectByKind::StartWith {
15768 start_token: self.token_at(idx).clone().into(),
15769 condition: self.parse_expr()?.into(),
15770 });
15771 } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15772 {
15773 clauses.push(ConnectByKind::ConnectBy {
15774 connect_token: self.token_at(idx).clone().into(),
15775 nocycle: self.parse_keyword(Keyword::NOCYCLE),
15776 relationships: self.with_state(ParserState::ConnectBy, |parser| {
15777 parser.parse_comma_separated(Parser::parse_expr)
15778 })?,
15779 });
15780 } else {
15781 break;
15782 }
15783 }
15784 Ok(clauses)
15785 }
15786
15787 pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15789 let token1 = self.next_token();
15790 let token2 = self.next_token();
15791 let token3 = self.next_token();
15792
15793 let table_name;
15794 let schema_name;
15795 if token2 == Token::Period {
15796 match token1.token {
15797 Token::Word(w) => {
15798 schema_name = w.value;
15799 }
15800 _ => {
15801 return self.expected("Schema name", token1);
15802 }
15803 }
15804 match token3.token {
15805 Token::Word(w) => {
15806 table_name = w.value;
15807 }
15808 _ => {
15809 return self.expected("Table name", token3);
15810 }
15811 }
15812 Ok(Table {
15813 table_name: Some(table_name),
15814 schema_name: Some(schema_name),
15815 })
15816 } else {
15817 match token1.token {
15818 Token::Word(w) => {
15819 table_name = w.value;
15820 }
15821 _ => {
15822 return self.expected("Table name", token1);
15823 }
15824 }
15825 Ok(Table {
15826 table_name: Some(table_name),
15827 schema_name: None,
15828 })
15829 }
15830 }
15831
15832 fn parse_set_role(
15834 &mut self,
15835 modifier: Option<ContextModifier>,
15836 ) -> Result<Statement, ParserError> {
15837 self.expect_keyword_is(Keyword::ROLE)?;
15838
15839 let role_name = if self.parse_keyword(Keyword::NONE) {
15840 None
15841 } else {
15842 Some(self.parse_identifier()?)
15843 };
15844 Ok(Statement::Set(Set::SetRole {
15845 context_modifier: modifier,
15846 role_name,
15847 }))
15848 }
15849
15850 fn parse_set_values(
15851 &mut self,
15852 parenthesized_assignment: bool,
15853 ) -> Result<Vec<Expr>, ParserError> {
15854 let mut values = vec![];
15855
15856 if parenthesized_assignment {
15857 self.expect_token(&Token::LParen)?;
15858 }
15859
15860 loop {
15861 let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15862 expr
15863 } else if let Ok(expr) = self.parse_expr() {
15864 expr
15865 } else {
15866 self.expected_ref("variable value", self.peek_token_ref())?
15867 };
15868
15869 values.push(value);
15870 if self.consume_token(&Token::Comma) {
15871 continue;
15872 }
15873
15874 if parenthesized_assignment {
15875 self.expect_token(&Token::RParen)?;
15876 }
15877 return Ok(values);
15878 }
15879 }
15880
15881 fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15882 let modifier =
15883 self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15884
15885 Self::keyword_to_modifier(modifier)
15886 }
15887
15888 fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15890 let scope = self.parse_context_modifier();
15891
15892 let name = if self.dialect.supports_parenthesized_set_variables()
15893 && self.consume_token(&Token::LParen)
15894 {
15895 self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15899 } else {
15900 self.parse_object_name(false)?
15901 };
15902
15903 if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15904 return self.expected_ref("assignment operator", self.peek_token_ref());
15905 }
15906
15907 let value = self.parse_expr()?;
15908
15909 Ok(SetAssignment { scope, name, value })
15910 }
15911
15912 fn parse_set(&mut self) -> Result<Statement, ParserError> {
15913 let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15914
15915 let scope = if !hivevar {
15917 self.parse_context_modifier()
15918 } else {
15919 None
15920 };
15921
15922 if hivevar {
15923 self.expect_token(&Token::Colon)?;
15924 }
15925
15926 if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15927 return Ok(set_role_stmt);
15928 }
15929
15930 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15932 || self.parse_keyword(Keyword::TIMEZONE)
15933 {
15934 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15935 return Ok(Set::SingleAssignment {
15936 scope,
15937 hivevar,
15938 variable: ObjectName::from(vec!["TIMEZONE".into()]),
15939 values: self.parse_set_values(false)?,
15940 }
15941 .into());
15942 } else {
15943 return Ok(Set::SetTimeZone {
15947 local: scope == Some(ContextModifier::Local),
15948 value: self.parse_expr()?,
15949 }
15950 .into());
15951 }
15952 } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15953 if self.parse_keyword(Keyword::DEFAULT) {
15954 return Ok(Set::SetNamesDefault {}.into());
15955 }
15956 let charset_name = self.parse_identifier()?;
15957 let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15958 Some(self.parse_literal_string()?)
15959 } else {
15960 None
15961 };
15962
15963 return Ok(Set::SetNames {
15964 charset_name,
15965 collation_name,
15966 }
15967 .into());
15968 } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15969 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15970 return Ok(Set::SetTransaction {
15971 modes: self.parse_transaction_modes()?,
15972 snapshot: None,
15973 session: true,
15974 }
15975 .into());
15976 } else if self.parse_keyword(Keyword::TRANSACTION) {
15977 if self.parse_keyword(Keyword::SNAPSHOT) {
15978 let snapshot_id = self.parse_value()?;
15979 return Ok(Set::SetTransaction {
15980 modes: vec![],
15981 snapshot: Some(snapshot_id),
15982 session: false,
15983 }
15984 .into());
15985 }
15986 return Ok(Set::SetTransaction {
15987 modes: self.parse_transaction_modes()?,
15988 snapshot: None,
15989 session: false,
15990 }
15991 .into());
15992 } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15993 let scope = match scope {
15994 Some(s) => s,
15995 None => {
15996 return self.expected_at(
15997 "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15998 self.get_current_index(),
15999 )
16000 }
16001 };
16002 let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
16003 SetSessionAuthorizationParamKind::Default
16004 } else {
16005 let value = self.parse_identifier()?;
16006 SetSessionAuthorizationParamKind::User(value)
16007 };
16008 return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
16009 scope,
16010 kind: auth_value,
16011 })
16012 .into());
16013 }
16014
16015 if self.dialect.supports_comma_separated_set_assignments() {
16016 if scope.is_some() {
16017 self.prev_token();
16018 }
16019
16020 if let Some(assignments) = self
16021 .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
16022 {
16023 return if assignments.len() > 1 {
16024 Ok(Set::MultipleAssignments { assignments }.into())
16025 } else {
16026 let SetAssignment { scope, name, value } =
16027 assignments.into_iter().next().ok_or_else(|| {
16028 ParserError::ParserError("Expected at least one assignment".to_string())
16029 })?;
16030
16031 Ok(Set::SingleAssignment {
16032 scope,
16033 hivevar,
16034 variable: name,
16035 values: vec![value],
16036 }
16037 .into())
16038 };
16039 }
16040 }
16041
16042 let variables = if self.dialect.supports_parenthesized_set_variables()
16043 && self.consume_token(&Token::LParen)
16044 {
16045 let vars = OneOrManyWithParens::Many(
16046 self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
16047 .into_iter()
16048 .map(|ident| ObjectName::from(vec![ident]))
16049 .collect(),
16050 );
16051 self.expect_token(&Token::RParen)?;
16052 vars
16053 } else {
16054 OneOrManyWithParens::One(self.parse_object_name(false)?)
16055 };
16056
16057 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
16058 let stmt = match variables {
16059 OneOrManyWithParens::One(var) => Set::SingleAssignment {
16060 scope,
16061 hivevar,
16062 variable: var,
16063 values: self.parse_set_values(false)?,
16064 },
16065 OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
16066 variables: vars,
16067 values: self.parse_set_values(true)?,
16068 },
16069 };
16070
16071 return Ok(stmt.into());
16072 }
16073
16074 if self.dialect.supports_set_stmt_without_operator() {
16075 self.prev_token();
16076 return self.parse_set_session_params();
16077 };
16078
16079 self.expected_ref("equals sign or TO", self.peek_token_ref())
16080 }
16081
16082 pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
16084 if self.parse_keyword(Keyword::STATISTICS) {
16085 let topic = match self.parse_one_of_keywords(&[
16086 Keyword::IO,
16087 Keyword::PROFILE,
16088 Keyword::TIME,
16089 Keyword::XML,
16090 ]) {
16091 Some(Keyword::IO) => SessionParamStatsTopic::IO,
16092 Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
16093 Some(Keyword::TIME) => SessionParamStatsTopic::Time,
16094 Some(Keyword::XML) => SessionParamStatsTopic::Xml,
16095 _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
16096 };
16097 let value = self.parse_session_param_value()?;
16098 Ok(
16099 Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
16100 topic,
16101 value,
16102 }))
16103 .into(),
16104 )
16105 } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
16106 let obj = self.parse_object_name(false)?;
16107 let value = self.parse_session_param_value()?;
16108 Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
16109 SetSessionParamIdentityInsert { obj, value },
16110 ))
16111 .into())
16112 } else if self.parse_keyword(Keyword::OFFSETS) {
16113 let keywords = self.parse_comma_separated(|parser| {
16114 let next_token = parser.next_token();
16115 match &next_token.token {
16116 Token::Word(w) => Ok(w.to_string()),
16117 _ => parser.expected("SQL keyword", next_token),
16118 }
16119 })?;
16120 let value = self.parse_session_param_value()?;
16121 Ok(
16122 Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
16123 keywords,
16124 value,
16125 }))
16126 .into(),
16127 )
16128 } else {
16129 let names = self.parse_comma_separated(|parser| {
16130 let next_token = parser.next_token();
16131 match next_token.token {
16132 Token::Word(w) => Ok(w.to_string()),
16133 _ => parser.expected("Session param name", next_token),
16134 }
16135 })?;
16136 let value = self.parse_expr()?.to_string();
16137 Ok(
16138 Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
16139 names,
16140 value,
16141 }))
16142 .into(),
16143 )
16144 }
16145 }
16146
16147 fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
16148 if self.parse_keyword(Keyword::ON) {
16149 Ok(SessionParamValue::On)
16150 } else if self.parse_keyword(Keyword::OFF) {
16151 Ok(SessionParamValue::Off)
16152 } else {
16153 self.expected_ref("ON or OFF", self.peek_token_ref())
16154 }
16155 }
16156
16157 pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
16159 let terse = self.parse_keyword(Keyword::TERSE);
16160 let extended = self.parse_keyword(Keyword::EXTENDED);
16161 let full = self.parse_keyword(Keyword::FULL);
16162 let session = self.parse_keyword(Keyword::SESSION);
16163 let global = self.parse_keyword(Keyword::GLOBAL);
16164 let external = self.parse_keyword(Keyword::EXTERNAL);
16165 if self
16166 .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
16167 .is_some()
16168 {
16169 Ok(self.parse_show_columns(extended, full)?)
16170 } else if self.parse_keyword(Keyword::TABLES) {
16171 Ok(self.parse_show_tables(terse, extended, full, external)?)
16172 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
16173 Ok(self.parse_show_views(terse, true)?)
16174 } else if self.parse_keyword(Keyword::VIEWS) {
16175 Ok(self.parse_show_views(terse, false)?)
16176 } else if self.parse_keyword(Keyword::FUNCTIONS) {
16177 Ok(self.parse_show_functions()?)
16178 } else if self.parse_keyword(Keyword::PROCESSLIST) {
16179 Ok(Statement::ShowProcessList { full })
16180 } else if extended || full {
16181 Err(ParserError::ParserError(
16182 "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
16183 ))
16184 } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
16185 Ok(self.parse_show_create()?)
16186 } else if self.parse_keyword(Keyword::COLLATION) {
16187 Ok(self.parse_show_collation()?)
16188 } else if self.parse_keyword(Keyword::VARIABLES)
16189 && dialect_of!(self is MySqlDialect | GenericDialect)
16190 {
16191 Ok(Statement::ShowVariables {
16192 filter: self.parse_show_statement_filter()?,
16193 session,
16194 global,
16195 })
16196 } else if self.parse_keyword(Keyword::STATUS)
16197 && dialect_of!(self is MySqlDialect | GenericDialect)
16198 {
16199 Ok(Statement::ShowStatus {
16200 filter: self.parse_show_statement_filter()?,
16201 session,
16202 global,
16203 })
16204 } else if self.parse_keyword(Keyword::CATALOGS) {
16205 self.parse_show_catalogs(terse)
16206 } else if self.parse_keyword(Keyword::DATABASES) {
16207 self.parse_show_databases(terse)
16208 } else if self.parse_keyword(Keyword::SCHEMAS) {
16209 self.parse_show_schemas(terse)
16210 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
16211 self.parse_show_charset(false)
16212 } else if self.parse_keyword(Keyword::CHARSET) {
16213 self.parse_show_charset(true)
16214 } else {
16215 Ok(Statement::ShowVariable {
16216 variable: self.parse_identifiers()?,
16217 })
16218 }
16219 }
16220
16221 fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
16222 Ok(Statement::ShowCharset(ShowCharset {
16224 is_shorthand,
16225 filter: self.parse_show_statement_filter()?,
16226 }))
16227 }
16228
16229 fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
16230 let history = self.parse_keyword(Keyword::HISTORY);
16231 let show_options = self.parse_show_stmt_options()?;
16232 Ok(Statement::ShowCatalogs {
16233 terse,
16234 history,
16235 show_options,
16236 })
16237 }
16238
16239 fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
16240 let history = self.parse_keyword(Keyword::HISTORY);
16241 let show_options = self.parse_show_stmt_options()?;
16242 Ok(Statement::ShowDatabases {
16243 terse,
16244 history,
16245 show_options,
16246 })
16247 }
16248
16249 fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
16250 let history = self.parse_keyword(Keyword::HISTORY);
16251 let show_options = self.parse_show_stmt_options()?;
16252 Ok(Statement::ShowSchemas {
16253 terse,
16254 history,
16255 show_options,
16256 })
16257 }
16258
16259 pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
16261 let obj_type = match self.expect_one_of_keywords(&[
16262 Keyword::TABLE,
16263 Keyword::TRIGGER,
16264 Keyword::FUNCTION,
16265 Keyword::PROCEDURE,
16266 Keyword::EVENT,
16267 Keyword::VIEW,
16268 ])? {
16269 Keyword::TABLE => Ok(ShowCreateObject::Table),
16270 Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
16271 Keyword::FUNCTION => Ok(ShowCreateObject::Function),
16272 Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
16273 Keyword::EVENT => Ok(ShowCreateObject::Event),
16274 Keyword::VIEW => Ok(ShowCreateObject::View),
16275 keyword => Err(ParserError::ParserError(format!(
16276 "Unable to map keyword to ShowCreateObject: {keyword:?}"
16277 ))),
16278 }?;
16279
16280 let obj_name = self.parse_object_name(false)?;
16281
16282 Ok(Statement::ShowCreate { obj_type, obj_name })
16283 }
16284
16285 pub fn parse_show_columns(
16287 &mut self,
16288 extended: bool,
16289 full: bool,
16290 ) -> Result<Statement, ParserError> {
16291 let show_options = self.parse_show_stmt_options()?;
16292 Ok(Statement::ShowColumns {
16293 extended,
16294 full,
16295 show_options,
16296 })
16297 }
16298
16299 fn parse_show_tables(
16300 &mut self,
16301 terse: bool,
16302 extended: bool,
16303 full: bool,
16304 external: bool,
16305 ) -> Result<Statement, ParserError> {
16306 let history = !external && self.parse_keyword(Keyword::HISTORY);
16307 let show_options = self.parse_show_stmt_options()?;
16308 Ok(Statement::ShowTables {
16309 terse,
16310 history,
16311 extended,
16312 full,
16313 external,
16314 show_options,
16315 })
16316 }
16317
16318 fn parse_show_views(
16319 &mut self,
16320 terse: bool,
16321 materialized: bool,
16322 ) -> Result<Statement, ParserError> {
16323 let show_options = self.parse_show_stmt_options()?;
16324 Ok(Statement::ShowViews {
16325 materialized,
16326 terse,
16327 show_options,
16328 })
16329 }
16330
16331 pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
16333 let filter = self.parse_show_statement_filter()?;
16334 Ok(Statement::ShowFunctions { filter })
16335 }
16336
16337 pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
16339 let filter = self.parse_show_statement_filter()?;
16340 Ok(Statement::ShowCollation { filter })
16341 }
16342
16343 pub fn parse_show_statement_filter(
16345 &mut self,
16346 ) -> Result<Option<ShowStatementFilter>, ParserError> {
16347 if self.parse_keyword(Keyword::LIKE) {
16348 Ok(Some(ShowStatementFilter::Like(
16349 self.parse_literal_string()?,
16350 )))
16351 } else if self.parse_keyword(Keyword::ILIKE) {
16352 Ok(Some(ShowStatementFilter::ILike(
16353 self.parse_literal_string()?,
16354 )))
16355 } else if self.parse_keyword(Keyword::WHERE) {
16356 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
16357 } else {
16358 self.maybe_parse(|parser| -> Result<String, ParserError> {
16359 parser.parse_literal_string()
16360 })?
16361 .map_or(Ok(None), |filter| {
16362 Ok(Some(ShowStatementFilter::NoKeyword(filter)))
16363 })
16364 }
16365 }
16366
16367 pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
16369 let parsed_keyword = if dialect_of!(self is HiveDialect) {
16371 if self.parse_keyword(Keyword::DEFAULT) {
16373 return Ok(Statement::Use(Use::Default));
16374 }
16375 None } else if dialect_of!(self is DatabricksDialect) {
16377 self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
16378 } else if dialect_of!(self is SnowflakeDialect) {
16379 self.parse_one_of_keywords(&[
16380 Keyword::DATABASE,
16381 Keyword::SCHEMA,
16382 Keyword::WAREHOUSE,
16383 Keyword::ROLE,
16384 Keyword::SECONDARY,
16385 ])
16386 } else {
16387 None };
16389
16390 let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
16391 self.parse_secondary_roles()?
16392 } else {
16393 let obj_name = self.parse_object_name(false)?;
16394 match parsed_keyword {
16395 Some(Keyword::CATALOG) => Use::Catalog(obj_name),
16396 Some(Keyword::DATABASE) => Use::Database(obj_name),
16397 Some(Keyword::SCHEMA) => Use::Schema(obj_name),
16398 Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
16399 Some(Keyword::ROLE) => Use::Role(obj_name),
16400 _ => Use::Object(obj_name),
16401 }
16402 };
16403
16404 Ok(Statement::Use(result))
16405 }
16406
16407 fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
16408 self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
16409 if self.parse_keyword(Keyword::NONE) {
16410 Ok(Use::SecondaryRoles(SecondaryRoles::None))
16411 } else if self.parse_keyword(Keyword::ALL) {
16412 Ok(Use::SecondaryRoles(SecondaryRoles::All))
16413 } else {
16414 let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
16415 Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
16416 }
16417 }
16418
16419 pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
16421 let relation = self.parse_table_factor()?;
16422 let joins = self.parse_joins()?;
16426 Ok(TableWithJoins { relation, joins })
16427 }
16428
16429 fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
16430 let mut joins = vec![];
16431 loop {
16432 let global = self.parse_keyword(Keyword::GLOBAL);
16433 let join = if self.parse_keyword(Keyword::CROSS) {
16434 let join_operator = if self.parse_keyword(Keyword::JOIN) {
16435 JoinOperator::CrossJoin(JoinConstraint::None)
16436 } else if self.parse_keyword(Keyword::APPLY) {
16437 JoinOperator::CrossApply
16439 } else {
16440 return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
16441 };
16442 let relation = self.parse_table_factor()?;
16443 let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
16444 && self.dialect.supports_cross_join_constraint()
16445 {
16446 let constraint = self.parse_join_constraint(false)?;
16447 JoinOperator::CrossJoin(constraint)
16448 } else {
16449 join_operator
16450 };
16451 Join {
16452 relation,
16453 global,
16454 join_operator,
16455 }
16456 } else if self.parse_keyword(Keyword::OUTER) {
16457 self.expect_keyword_is(Keyword::APPLY)?;
16459 Join {
16460 relation: self.parse_table_factor()?,
16461 global,
16462 join_operator: JoinOperator::OuterApply,
16463 }
16464 } else if self.parse_keyword(Keyword::ASOF) {
16465 self.expect_keyword_is(Keyword::JOIN)?;
16466 let relation = self.parse_table_factor()?;
16467 self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
16468 let match_condition = self.parse_parenthesized(Self::parse_expr)?;
16469 Join {
16470 relation,
16471 global,
16472 join_operator: JoinOperator::AsOf {
16473 match_condition,
16474 constraint: self.parse_join_constraint(false)?,
16475 },
16476 }
16477 } else {
16478 let natural = self.parse_keyword(Keyword::NATURAL);
16479 let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
16480 w.keyword
16481 } else {
16482 Keyword::NoKeyword
16483 };
16484
16485 let join_operator_type = match peek_keyword {
16486 Keyword::INNER | Keyword::JOIN => {
16487 let inner = self.parse_keyword(Keyword::INNER); self.expect_keyword_is(Keyword::JOIN)?;
16489 if inner {
16490 JoinOperator::Inner
16491 } else {
16492 JoinOperator::Join
16493 }
16494 }
16495 kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
16496 let _ = self.next_token(); let is_left = kw == Keyword::LEFT;
16498 let join_type = self.parse_one_of_keywords(&[
16499 Keyword::OUTER,
16500 Keyword::SEMI,
16501 Keyword::ANTI,
16502 Keyword::JOIN,
16503 ]);
16504 match join_type {
16505 Some(Keyword::OUTER) => {
16506 self.expect_keyword_is(Keyword::JOIN)?;
16507 if is_left {
16508 JoinOperator::LeftOuter
16509 } else {
16510 JoinOperator::RightOuter
16511 }
16512 }
16513 Some(Keyword::SEMI) => {
16514 self.expect_keyword_is(Keyword::JOIN)?;
16515 if is_left {
16516 JoinOperator::LeftSemi
16517 } else {
16518 JoinOperator::RightSemi
16519 }
16520 }
16521 Some(Keyword::ANTI) => {
16522 self.expect_keyword_is(Keyword::JOIN)?;
16523 if is_left {
16524 JoinOperator::LeftAnti
16525 } else {
16526 JoinOperator::RightAnti
16527 }
16528 }
16529 Some(Keyword::JOIN) => {
16530 if is_left {
16531 JoinOperator::Left
16532 } else {
16533 JoinOperator::Right
16534 }
16535 }
16536 _ => {
16537 return Err(ParserError::ParserError(format!(
16538 "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16539 )))
16540 }
16541 }
16542 }
16543 Keyword::ANTI => {
16544 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16546 JoinOperator::Anti
16547 }
16548 Keyword::SEMI => {
16549 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16551 JoinOperator::Semi
16552 }
16553 Keyword::FULL => {
16554 let _ = self.next_token(); let _ = self.parse_keyword(Keyword::OUTER); self.expect_keyword_is(Keyword::JOIN)?;
16557 JoinOperator::FullOuter
16558 }
16559 Keyword::OUTER => {
16560 return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16561 }
16562 Keyword::STRAIGHT_JOIN => {
16563 let _ = self.next_token(); JoinOperator::StraightJoin
16565 }
16566 _ if natural => {
16567 return self
16568 .expected_ref("a join type after NATURAL", self.peek_token_ref());
16569 }
16570 _ => break,
16571 };
16572 let mut relation = self.parse_table_factor()?;
16573
16574 if !self
16575 .dialect
16576 .supports_left_associative_joins_without_parens()
16577 && self.peek_parens_less_nested_join()
16578 {
16579 let joins = self.parse_joins()?;
16580 relation = TableFactor::NestedJoin {
16581 table_with_joins: Box::new(TableWithJoins { relation, joins }),
16582 alias: None,
16583 };
16584 }
16585
16586 let join_constraint = self.parse_join_constraint(natural)?;
16587 Join {
16588 relation,
16589 global,
16590 join_operator: join_operator_type(join_constraint),
16591 }
16592 };
16593 joins.push(join);
16594 }
16595 Ok(joins)
16596 }
16597
16598 fn peek_parens_less_nested_join(&self) -> bool {
16599 matches!(
16600 self.peek_token_ref().token,
16601 Token::Word(Word {
16602 keyword: Keyword::JOIN
16603 | Keyword::INNER
16604 | Keyword::LEFT
16605 | Keyword::RIGHT
16606 | Keyword::FULL,
16607 ..
16608 })
16609 )
16610 }
16611
16612 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16614 pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16615 let _guard = self.recursion_counter.try_decrease()?;
16616 if self.parse_keyword(Keyword::LATERAL) {
16617 if self.consume_token(&Token::LParen) {
16619 self.parse_derived_table_factor(Lateral)
16620 } else {
16621 let name = self.parse_object_name(false)?;
16622 self.expect_token(&Token::LParen)?;
16623 let args = self.parse_optional_args()?;
16624 let alias = self.maybe_parse_table_alias()?;
16625 Ok(TableFactor::Function {
16626 lateral: true,
16627 name,
16628 args,
16629 alias,
16630 })
16631 }
16632 } else if self.parse_keyword(Keyword::TABLE) {
16633 self.expect_token(&Token::LParen)?;
16635 let expr = self.parse_expr()?;
16636 self.expect_token(&Token::RParen)?;
16637 let alias = self.maybe_parse_table_alias()?;
16638 Ok(TableFactor::TableFunction { expr, alias })
16639 } else if self.consume_token(&Token::LParen) {
16640 if let Some(mut table) =
16662 self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))?
16663 {
16664 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16665 {
16666 table = match kw {
16667 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16668 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16669 unexpected_keyword => return Err(ParserError::ParserError(
16670 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16671 )),
16672 }
16673 }
16674 return Ok(table);
16675 }
16676
16677 let mut table_and_joins = self.parse_table_and_joins()?;
16684
16685 #[allow(clippy::if_same_then_else)]
16686 if !table_and_joins.joins.is_empty() {
16687 self.expect_token(&Token::RParen)?;
16688 let alias = self.maybe_parse_table_alias()?;
16689 Ok(TableFactor::NestedJoin {
16690 table_with_joins: Box::new(table_and_joins),
16691 alias,
16692 }) } else if let TableFactor::NestedJoin {
16694 table_with_joins: _,
16695 alias: _,
16696 } = &table_and_joins.relation
16697 {
16698 self.expect_token(&Token::RParen)?;
16701 let alias = self.maybe_parse_table_alias()?;
16702 Ok(TableFactor::NestedJoin {
16703 table_with_joins: Box::new(table_and_joins),
16704 alias,
16705 })
16706 } else if self.dialect.supports_parens_around_table_factor() {
16707 self.expect_token(&Token::RParen)?;
16714
16715 if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16716 match &mut table_and_joins.relation {
16719 TableFactor::Derived { alias, .. }
16720 | TableFactor::Table { alias, .. }
16721 | TableFactor::Function { alias, .. }
16722 | TableFactor::UNNEST { alias, .. }
16723 | TableFactor::JsonTable { alias, .. }
16724 | TableFactor::XmlTable { alias, .. }
16725 | TableFactor::OpenJsonTable { alias, .. }
16726 | TableFactor::TableFunction { alias, .. }
16727 | TableFactor::Pivot { alias, .. }
16728 | TableFactor::Unpivot { alias, .. }
16729 | TableFactor::MatchRecognize { alias, .. }
16730 | TableFactor::SemanticView { alias, .. }
16731 | TableFactor::NestedJoin { alias, .. } => {
16732 if let Some(inner_alias) = alias {
16734 return Err(ParserError::ParserError(format!(
16735 "duplicate alias {inner_alias}"
16736 )));
16737 }
16738 alias.replace(outer_alias);
16742 }
16743 };
16744 }
16745 Ok(table_and_joins.relation)
16747 } else {
16748 self.expected_ref("joined table", self.peek_token_ref())
16751 }
16752 } else if self.dialect.supports_values_as_table_factor()
16753 && matches!(
16754 self.peek_tokens(),
16755 [
16756 Token::Word(Word {
16757 keyword: Keyword::VALUES,
16758 ..
16759 }),
16760 Token::LParen
16761 ]
16762 )
16763 {
16764 self.expect_keyword_is(Keyword::VALUES)?;
16765
16766 let values = SetExpr::Values(self.parse_values(false, false)?);
16770 let alias = self.maybe_parse_table_alias()?;
16771 Ok(TableFactor::Derived {
16772 lateral: false,
16773 subquery: Box::new(Query {
16774 with: None,
16775 body: Box::new(values),
16776 order_by: None,
16777 limit_clause: None,
16778 fetch: None,
16779 locks: vec![],
16780 for_clause: None,
16781 settings: None,
16782 format_clause: None,
16783 pipe_operators: vec![],
16784 }),
16785 alias,
16786 sample: None,
16787 })
16788 } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16789 && self.parse_keyword(Keyword::UNNEST)
16790 {
16791 self.expect_token(&Token::LParen)?;
16792 let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16793 self.expect_token(&Token::RParen)?;
16794
16795 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16796 let alias = match self.maybe_parse_table_alias() {
16797 Ok(Some(alias)) => Some(alias),
16798 Ok(None) => None,
16799 Err(e) => return Err(e),
16800 };
16801
16802 let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16803 Ok(()) => true,
16804 Err(_) => false,
16805 };
16806
16807 let with_offset_alias = if with_offset {
16808 match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16809 Ok(Some(alias)) => Some(alias),
16810 Ok(None) => None,
16811 Err(e) => return Err(e),
16812 }
16813 } else {
16814 None
16815 };
16816
16817 Ok(TableFactor::UNNEST {
16818 alias,
16819 array_exprs,
16820 with_offset,
16821 with_offset_alias,
16822 with_ordinality,
16823 })
16824 } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16825 let json_expr = self.parse_expr()?;
16826 self.expect_token(&Token::Comma)?;
16827 let json_path = self.parse_value()?;
16828 self.expect_keyword_is(Keyword::COLUMNS)?;
16829 self.expect_token(&Token::LParen)?;
16830 let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16831 self.expect_token(&Token::RParen)?;
16832 self.expect_token(&Token::RParen)?;
16833 let alias = self.maybe_parse_table_alias()?;
16834 Ok(TableFactor::JsonTable {
16835 json_expr,
16836 json_path,
16837 columns,
16838 alias,
16839 })
16840 } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16841 self.prev_token();
16842 self.parse_open_json_table_factor()
16843 } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16844 self.prev_token();
16845 self.parse_xml_table_factor()
16846 } else if self.dialect.supports_semantic_view_table_factor()
16847 && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16848 {
16849 self.parse_semantic_view_table_factor()
16850 } else if self.peek_token_ref().token == Token::AtSign {
16851 self.parse_snowflake_stage_table_factor()
16853 } else {
16854 let name = self.parse_object_name(true)?;
16855
16856 let json_path = match &self.peek_token_ref().token {
16857 Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16858 _ => None,
16859 };
16860
16861 let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16862 && self.parse_keyword(Keyword::PARTITION)
16863 {
16864 self.parse_parenthesized_identifiers()?
16865 } else {
16866 vec![]
16867 };
16868
16869 let version = self.maybe_parse_table_version()?;
16871
16872 let args = if self.consume_token(&Token::LParen) {
16874 Some(self.parse_table_function_args()?)
16875 } else {
16876 None
16877 };
16878
16879 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16880
16881 let mut sample = None;
16882 if self.dialect.supports_table_sample_before_alias() {
16883 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16884 sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16885 }
16886 }
16887
16888 let alias = self.maybe_parse_table_alias()?;
16889
16890 let index_hints = if self.dialect.supports_table_hints() {
16892 self.maybe_parse(|p| p.parse_table_index_hints())?
16893 .unwrap_or(vec![])
16894 } else {
16895 vec![]
16896 };
16897
16898 let mut with_hints = vec![];
16900 if self.parse_keyword(Keyword::WITH) {
16901 if self.consume_token(&Token::LParen) {
16902 with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16903 self.expect_token(&Token::RParen)?;
16904 } else {
16905 self.prev_token();
16907 }
16908 };
16909
16910 if !self.dialect.supports_table_sample_before_alias() {
16911 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16912 sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16913 }
16914 }
16915
16916 let mut table = TableFactor::Table {
16917 name,
16918 alias,
16919 args,
16920 with_hints,
16921 version,
16922 partitions,
16923 with_ordinality,
16924 json_path,
16925 sample,
16926 index_hints,
16927 };
16928
16929 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16930 table = match kw {
16931 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16932 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16933 unexpected_keyword => return Err(ParserError::ParserError(
16934 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16935 )),
16936 }
16937 }
16938
16939 if self.dialect.supports_match_recognize()
16940 && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16941 {
16942 table = self.parse_match_recognize(table)?;
16943 }
16944
16945 Ok(table)
16946 }
16947 }
16948
16949 fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16954 let name = crate::dialect::parse_snowflake_stage_name(self)?;
16956
16957 let args = if self.consume_token(&Token::LParen) {
16959 Some(self.parse_table_function_args()?)
16960 } else {
16961 None
16962 };
16963
16964 let alias = self.maybe_parse_table_alias()?;
16965
16966 Ok(TableFactor::Table {
16967 name,
16968 alias,
16969 args,
16970 with_hints: vec![],
16971 version: None,
16972 partitions: vec![],
16973 with_ordinality: false,
16974 json_path: None,
16975 sample: None,
16976 index_hints: vec![],
16977 })
16978 }
16979
16980 fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16981 let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16982 TableSampleModifier::TableSample
16983 } else if self.parse_keyword(Keyword::SAMPLE) {
16984 TableSampleModifier::Sample
16985 } else {
16986 return Ok(None);
16987 };
16988 self.parse_table_sample(modifier).map(Some)
16989 }
16990
16991 fn parse_table_sample(
16992 &mut self,
16993 modifier: TableSampleModifier,
16994 ) -> Result<Box<TableSample>, ParserError> {
16995 let name = match self.parse_one_of_keywords(&[
16996 Keyword::BERNOULLI,
16997 Keyword::ROW,
16998 Keyword::SYSTEM,
16999 Keyword::BLOCK,
17000 ]) {
17001 Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
17002 Some(Keyword::ROW) => Some(TableSampleMethod::Row),
17003 Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
17004 Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
17005 _ => None,
17006 };
17007
17008 let parenthesized = self.consume_token(&Token::LParen);
17009
17010 let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
17011 let selected_bucket = self.parse_number_value()?;
17012 self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
17013 let total = self.parse_number_value()?;
17014 let on = if self.parse_keyword(Keyword::ON) {
17015 Some(self.parse_expr()?)
17016 } else {
17017 None
17018 };
17019 (
17020 None,
17021 Some(TableSampleBucket {
17022 bucket: selected_bucket,
17023 total,
17024 on,
17025 }),
17026 )
17027 } else {
17028 let value = match self.maybe_parse(|p| p.parse_expr())? {
17029 Some(num) => num,
17030 None => {
17031 let next_token = self.next_token();
17032 if let Token::Word(w) = next_token.token {
17033 Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
17034 } else {
17035 return parser_err!(
17036 "Expecting number or byte length e.g. 100M",
17037 self.peek_token_ref().span.start
17038 );
17039 }
17040 }
17041 };
17042 let unit = if self.parse_keyword(Keyword::ROWS) {
17043 Some(TableSampleUnit::Rows)
17044 } else if self.parse_keyword(Keyword::PERCENT) {
17045 Some(TableSampleUnit::Percent)
17046 } else {
17047 None
17048 };
17049 (
17050 Some(TableSampleQuantity {
17051 parenthesized,
17052 value,
17053 unit,
17054 }),
17055 None,
17056 )
17057 };
17058 if parenthesized {
17059 self.expect_token(&Token::RParen)?;
17060 }
17061
17062 let seed = if self.parse_keyword(Keyword::REPEATABLE) {
17063 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
17064 } else if self.parse_keyword(Keyword::SEED) {
17065 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
17066 } else {
17067 None
17068 };
17069
17070 let offset = if self.parse_keyword(Keyword::OFFSET) {
17071 Some(self.parse_expr()?)
17072 } else {
17073 None
17074 };
17075
17076 Ok(Box::new(TableSample {
17077 modifier,
17078 name,
17079 quantity,
17080 seed,
17081 bucket,
17082 offset,
17083 }))
17084 }
17085
17086 fn parse_table_sample_seed(
17087 &mut self,
17088 modifier: TableSampleSeedModifier,
17089 ) -> Result<TableSampleSeed, ParserError> {
17090 self.expect_token(&Token::LParen)?;
17091 let value = self.parse_number_value()?;
17092 self.expect_token(&Token::RParen)?;
17093 Ok(TableSampleSeed { modifier, value })
17094 }
17095
17096 fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17099 self.expect_token(&Token::LParen)?;
17100 let json_expr = self.parse_expr()?;
17101 let json_path = if self.consume_token(&Token::Comma) {
17102 Some(self.parse_value()?)
17103 } else {
17104 None
17105 };
17106 self.expect_token(&Token::RParen)?;
17107 let columns = if self.parse_keyword(Keyword::WITH) {
17108 self.expect_token(&Token::LParen)?;
17109 let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
17110 self.expect_token(&Token::RParen)?;
17111 columns
17112 } else {
17113 Vec::new()
17114 };
17115 let alias = self.maybe_parse_table_alias()?;
17116 Ok(TableFactor::OpenJsonTable {
17117 json_expr,
17118 json_path,
17119 columns,
17120 alias,
17121 })
17122 }
17123
17124 fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17125 self.expect_token(&Token::LParen)?;
17126 let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
17127 self.expect_token(&Token::LParen)?;
17128 let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
17129 self.expect_token(&Token::RParen)?;
17130 self.expect_token(&Token::Comma)?;
17131 namespaces
17132 } else {
17133 vec![]
17134 };
17135 let row_expression = self.parse_expr()?;
17136 let passing = self.parse_xml_passing_clause()?;
17137 self.expect_keyword_is(Keyword::COLUMNS)?;
17138 let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
17139 self.expect_token(&Token::RParen)?;
17140 let alias = self.maybe_parse_table_alias()?;
17141 Ok(TableFactor::XmlTable {
17142 namespaces,
17143 row_expression,
17144 passing,
17145 columns,
17146 alias,
17147 })
17148 }
17149
17150 fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
17151 let uri = self.parse_expr()?;
17152 self.expect_keyword_is(Keyword::AS)?;
17153 let name = self.parse_identifier()?;
17154 Ok(XmlNamespaceDefinition { uri, name })
17155 }
17156
17157 fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
17158 let name = self.parse_identifier()?;
17159
17160 let option = if self.parse_keyword(Keyword::FOR) {
17161 self.expect_keyword(Keyword::ORDINALITY)?;
17162 XmlTableColumnOption::ForOrdinality
17163 } else {
17164 let r#type = self.parse_data_type()?;
17165 let mut path = None;
17166 let mut default = None;
17167
17168 if self.parse_keyword(Keyword::PATH) {
17169 path = Some(self.parse_expr()?);
17170 }
17171
17172 if self.parse_keyword(Keyword::DEFAULT) {
17173 default = Some(self.parse_expr()?);
17174 }
17175
17176 let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
17177 if !not_null {
17178 let _ = self.parse_keyword(Keyword::NULL);
17180 }
17181
17182 XmlTableColumnOption::NamedInfo {
17183 r#type,
17184 path,
17185 default,
17186 nullable: !not_null,
17187 }
17188 };
17189 Ok(XmlTableColumn { name, option })
17190 }
17191
17192 fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
17193 let mut arguments = vec![];
17194 if self.parse_keyword(Keyword::PASSING) {
17195 loop {
17196 let by_value =
17197 self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
17198 let expr = self.parse_expr()?;
17199 let alias = if self.parse_keyword(Keyword::AS) {
17200 Some(self.parse_identifier()?)
17201 } else {
17202 None
17203 };
17204 arguments.push(XmlPassingArgument {
17205 expr,
17206 alias,
17207 by_value,
17208 });
17209 if !self.consume_token(&Token::Comma) {
17210 break;
17211 }
17212 }
17213 }
17214 Ok(XmlPassingClause { arguments })
17215 }
17216
17217 fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17219 self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
17220 self.expect_token(&Token::LParen)?;
17221
17222 let name = self.parse_object_name(true)?;
17223
17224 let mut dimensions = Vec::new();
17226 let mut metrics = Vec::new();
17227 let mut facts = Vec::new();
17228 let mut where_clause = None;
17229
17230 while self.peek_token_ref().token != Token::RParen {
17231 if self.parse_keyword(Keyword::DIMENSIONS) {
17232 if !dimensions.is_empty() {
17233 return Err(ParserError::ParserError(
17234 "DIMENSIONS clause can only be specified once".to_string(),
17235 ));
17236 }
17237 dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17238 } else if self.parse_keyword(Keyword::METRICS) {
17239 if !metrics.is_empty() {
17240 return Err(ParserError::ParserError(
17241 "METRICS clause can only be specified once".to_string(),
17242 ));
17243 }
17244 metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17245 } else if self.parse_keyword(Keyword::FACTS) {
17246 if !facts.is_empty() {
17247 return Err(ParserError::ParserError(
17248 "FACTS clause can only be specified once".to_string(),
17249 ));
17250 }
17251 facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17252 } else if self.parse_keyword(Keyword::WHERE) {
17253 if where_clause.is_some() {
17254 return Err(ParserError::ParserError(
17255 "WHERE clause can only be specified once".to_string(),
17256 ));
17257 }
17258 where_clause = Some(self.parse_expr()?);
17259 } else {
17260 let tok = self.peek_token_ref();
17261 return parser_err!(
17262 format!(
17263 "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
17264 tok.token
17265 ),
17266 tok.span.start
17267 )?;
17268 }
17269 }
17270
17271 self.expect_token(&Token::RParen)?;
17272
17273 let alias = self.maybe_parse_table_alias()?;
17274
17275 Ok(TableFactor::SemanticView {
17276 name,
17277 dimensions,
17278 metrics,
17279 facts,
17280 where_clause,
17281 alias,
17282 })
17283 }
17284
17285 fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
17286 self.expect_token(&Token::LParen)?;
17287
17288 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
17289 self.parse_comma_separated(Parser::parse_expr)?
17290 } else {
17291 vec![]
17292 };
17293
17294 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17295 self.parse_comma_separated(Parser::parse_order_by_expr)?
17296 } else {
17297 vec![]
17298 };
17299
17300 let measures = if self.parse_keyword(Keyword::MEASURES) {
17301 self.parse_comma_separated(|p| {
17302 let expr = p.parse_expr()?;
17303 let _ = p.parse_keyword(Keyword::AS);
17304 let alias = p.parse_identifier()?;
17305 Ok(Measure { expr, alias })
17306 })?
17307 } else {
17308 vec![]
17309 };
17310
17311 let rows_per_match =
17312 if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
17313 Some(RowsPerMatch::OneRow)
17314 } else if self.parse_keywords(&[
17315 Keyword::ALL,
17316 Keyword::ROWS,
17317 Keyword::PER,
17318 Keyword::MATCH,
17319 ]) {
17320 Some(RowsPerMatch::AllRows(
17321 if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
17322 Some(EmptyMatchesMode::Show)
17323 } else if self.parse_keywords(&[
17324 Keyword::OMIT,
17325 Keyword::EMPTY,
17326 Keyword::MATCHES,
17327 ]) {
17328 Some(EmptyMatchesMode::Omit)
17329 } else if self.parse_keywords(&[
17330 Keyword::WITH,
17331 Keyword::UNMATCHED,
17332 Keyword::ROWS,
17333 ]) {
17334 Some(EmptyMatchesMode::WithUnmatched)
17335 } else {
17336 None
17337 },
17338 ))
17339 } else {
17340 None
17341 };
17342
17343 let after_match_skip =
17344 if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
17345 if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
17346 Some(AfterMatchSkip::PastLastRow)
17347 } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
17348 Some(AfterMatchSkip::ToNextRow)
17349 } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
17350 Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
17351 } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
17352 Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
17353 } else {
17354 let found = self.next_token();
17355 return self.expected("after match skip option", found);
17356 }
17357 } else {
17358 None
17359 };
17360
17361 self.expect_keyword_is(Keyword::PATTERN)?;
17362 let pattern = self.parse_parenthesized(Self::parse_pattern)?;
17363
17364 self.expect_keyword_is(Keyword::DEFINE)?;
17365
17366 let symbols = self.parse_comma_separated(|p| {
17367 let symbol = p.parse_identifier()?;
17368 p.expect_keyword_is(Keyword::AS)?;
17369 let definition = p.parse_expr()?;
17370 Ok(SymbolDefinition { symbol, definition })
17371 })?;
17372
17373 self.expect_token(&Token::RParen)?;
17374
17375 let alias = self.maybe_parse_table_alias()?;
17376
17377 Ok(TableFactor::MatchRecognize {
17378 table: Box::new(table),
17379 partition_by,
17380 order_by,
17381 measures,
17382 rows_per_match,
17383 after_match_skip,
17384 pattern,
17385 symbols,
17386 alias,
17387 })
17388 }
17389
17390 fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17391 match self.next_token().token {
17392 Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
17393 Token::Placeholder(s) if s == "$" => {
17394 Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
17395 }
17396 Token::LBrace => {
17397 self.expect_token(&Token::Minus)?;
17398 let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
17399 self.expect_token(&Token::Minus)?;
17400 self.expect_token(&Token::RBrace)?;
17401 Ok(MatchRecognizePattern::Exclude(symbol))
17402 }
17403 Token::Word(Word {
17404 value,
17405 quote_style: None,
17406 ..
17407 }) if value == "PERMUTE" => {
17408 self.expect_token(&Token::LParen)?;
17409 let symbols = self.parse_comma_separated(|p| {
17410 p.parse_identifier().map(MatchRecognizeSymbol::Named)
17411 })?;
17412 self.expect_token(&Token::RParen)?;
17413 Ok(MatchRecognizePattern::Permute(symbols))
17414 }
17415 Token::LParen => {
17416 let pattern = self.parse_pattern()?;
17417 self.expect_token(&Token::RParen)?;
17418 Ok(MatchRecognizePattern::Group(Box::new(pattern)))
17419 }
17420 _ => {
17421 self.prev_token();
17422 self.parse_identifier()
17423 .map(MatchRecognizeSymbol::Named)
17424 .map(MatchRecognizePattern::Symbol)
17425 }
17426 }
17427 }
17428
17429 fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17430 let mut pattern = self.parse_base_pattern()?;
17431 loop {
17432 let token = self.next_token();
17433 let quantifier = match token.token {
17434 Token::Mul => RepetitionQuantifier::ZeroOrMore,
17435 Token::Plus => RepetitionQuantifier::OneOrMore,
17436 Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
17437 Token::LBrace => {
17438 let token = self.next_token();
17440 match token.token {
17441 Token::Comma => {
17442 let next_token = self.next_token();
17443 let Token::Number(n, _) = next_token.token else {
17444 return self.expected("literal number", next_token);
17445 };
17446 self.expect_token(&Token::RBrace)?;
17447 RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
17448 }
17449 Token::Number(n, _) if self.consume_token(&Token::Comma) => {
17450 let next_token = self.next_token();
17451 match next_token.token {
17452 Token::Number(m, _) => {
17453 self.expect_token(&Token::RBrace)?;
17454 RepetitionQuantifier::Range(
17455 Self::parse(n, token.span.start)?,
17456 Self::parse(m, token.span.start)?,
17457 )
17458 }
17459 Token::RBrace => {
17460 RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
17461 }
17462 _ => {
17463 return self.expected("} or upper bound", next_token);
17464 }
17465 }
17466 }
17467 Token::Number(n, _) => {
17468 self.expect_token(&Token::RBrace)?;
17469 RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
17470 }
17471 _ => return self.expected("quantifier range", token),
17472 }
17473 }
17474 _ => {
17475 self.prev_token();
17476 break;
17477 }
17478 };
17479 pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
17480 }
17481 Ok(pattern)
17482 }
17483
17484 fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17485 let mut patterns = vec![self.parse_repetition_pattern()?];
17486 while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
17487 patterns.push(self.parse_repetition_pattern()?);
17488 }
17489 match <[MatchRecognizePattern; 1]>::try_from(patterns) {
17490 Ok([pattern]) => Ok(pattern),
17491 Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
17492 }
17493 }
17494
17495 fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17496 let pattern = self.parse_concat_pattern()?;
17497 if self.consume_token(&Token::Pipe) {
17498 match self.parse_pattern()? {
17499 MatchRecognizePattern::Alternation(mut patterns) => {
17501 patterns.insert(0, pattern);
17502 Ok(MatchRecognizePattern::Alternation(patterns))
17503 }
17504 next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
17505 }
17506 } else {
17507 Ok(pattern)
17508 }
17509 }
17510
17511 pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
17513 if self.dialect.supports_table_versioning() {
17514 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
17515 {
17516 let expr = self.parse_expr()?;
17517 return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
17518 } else if self.peek_keyword(Keyword::CHANGES) {
17519 return self.parse_table_version_changes().map(Some);
17520 } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
17521 let func_name = self.parse_object_name(true)?;
17522 let func = self.parse_function(func_name)?;
17523 return Ok(Some(TableVersion::Function(func)));
17524 } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
17525 let expr = self.parse_expr()?;
17526 return Ok(Some(TableVersion::TimestampAsOf(expr)));
17527 } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
17528 let expr = Expr::Value(self.parse_number_value()?);
17529 return Ok(Some(TableVersion::VersionAsOf(expr)));
17530 }
17531 }
17532 Ok(None)
17533 }
17534
17535 fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17546 let changes_name = self.parse_object_name(true)?;
17547 let changes = self.parse_function(changes_name)?;
17548 let at_name = self.parse_object_name(true)?;
17549 let at = self.parse_function(at_name)?;
17550 let end = if self.peek_keyword(Keyword::END) {
17551 let end_name = self.parse_object_name(true)?;
17552 Some(self.parse_function(end_name)?)
17553 } else {
17554 None
17555 };
17556 Ok(TableVersion::Changes { changes, at, end })
17557 }
17558
17559 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17562 if self.parse_keyword(Keyword::NESTED) {
17563 let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17564 let path = self.parse_value()?;
17565 self.expect_keyword_is(Keyword::COLUMNS)?;
17566 let columns = self.parse_parenthesized(|p| {
17567 p.parse_comma_separated(Self::parse_json_table_column_def)
17568 })?;
17569 return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17570 path,
17571 columns,
17572 }));
17573 }
17574 let name = self.parse_identifier()?;
17575 if self.parse_keyword(Keyword::FOR) {
17576 self.expect_keyword_is(Keyword::ORDINALITY)?;
17577 return Ok(JsonTableColumn::ForOrdinality(name));
17578 }
17579 let r#type = self.parse_data_type()?;
17580 let exists = self.parse_keyword(Keyword::EXISTS);
17581 self.expect_keyword_is(Keyword::PATH)?;
17582 let path = self.parse_value()?;
17583 let mut on_empty = None;
17584 let mut on_error = None;
17585 while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17586 if self.parse_keyword(Keyword::EMPTY) {
17587 on_empty = Some(error_handling);
17588 } else {
17589 self.expect_keyword_is(Keyword::ERROR)?;
17590 on_error = Some(error_handling);
17591 }
17592 }
17593 Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17594 name,
17595 r#type,
17596 path,
17597 exists,
17598 on_empty,
17599 on_error,
17600 }))
17601 }
17602
17603 pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17611 let name = self.parse_identifier()?;
17612 let r#type = self.parse_data_type()?;
17613 let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17614 self.next_token();
17615 Some(path)
17616 } else {
17617 None
17618 };
17619 let as_json = self.parse_keyword(Keyword::AS);
17620 if as_json {
17621 self.expect_keyword_is(Keyword::JSON)?;
17622 }
17623 Ok(OpenJsonTableColumn {
17624 name,
17625 r#type,
17626 path,
17627 as_json,
17628 })
17629 }
17630
17631 fn parse_json_table_column_error_handling(
17632 &mut self,
17633 ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17634 let res = if self.parse_keyword(Keyword::NULL) {
17635 JsonTableColumnErrorHandling::Null
17636 } else if self.parse_keyword(Keyword::ERROR) {
17637 JsonTableColumnErrorHandling::Error
17638 } else if self.parse_keyword(Keyword::DEFAULT) {
17639 JsonTableColumnErrorHandling::Default(self.parse_value()?)
17640 } else {
17641 return Ok(None);
17642 };
17643 self.expect_keyword_is(Keyword::ON)?;
17644 Ok(Some(res))
17645 }
17646
17647 pub fn parse_derived_table_factor(
17649 &mut self,
17650 lateral: IsLateral,
17651 ) -> Result<TableFactor, ParserError> {
17652 let subquery = self.parse_query()?;
17653 self.expect_token(&Token::RParen)?;
17654 let alias = self.maybe_parse_table_alias()?;
17655
17656 let sample = self
17658 .maybe_parse_table_sample()?
17659 .map(TableSampleKind::AfterTableAlias);
17660
17661 Ok(TableFactor::Derived {
17662 lateral: match lateral {
17663 Lateral => true,
17664 NotLateral => false,
17665 },
17666 subquery,
17667 alias,
17668 sample,
17669 })
17670 }
17671
17672 pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17695 let expr = self.parse_expr()?;
17696 let alias = if self.parse_keyword(Keyword::AS) {
17697 Some(self.parse_identifier()?)
17698 } else {
17699 None
17700 };
17701
17702 Ok(ExprWithAlias { expr, alias })
17703 }
17704
17705 fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17709 let expr = self.parse_expr()?;
17710 let alias = self.parse_identifier_optional_alias()?;
17711 Ok(ExprWithAlias { expr, alias })
17712 }
17713
17714 fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17716 let function_name = match self.next_token().token {
17717 Token::Word(w) => Ok(w.value),
17718 _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17719 }?;
17720 let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17721 let alias = {
17722 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17723 kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17725 }
17726 self.parse_optional_alias_inner(None, validator)?
17727 };
17728 Ok(ExprWithAlias { expr, alias })
17729 }
17730
17731 pub fn parse_pivot_table_factor(
17733 &mut self,
17734 table: TableFactor,
17735 ) -> Result<TableFactor, ParserError> {
17736 self.expect_token(&Token::LParen)?;
17737 let aggregate_functions =
17738 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17739 self.expect_keyword_is(Keyword::FOR)?;
17740 let value_column = if self.peek_token_ref().token == Token::LParen {
17741 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17742 p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17743 })?
17744 } else {
17745 vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17746 };
17747 self.expect_keyword_is(Keyword::IN)?;
17748
17749 self.expect_token(&Token::LParen)?;
17750 let value_source = if self.parse_keyword(Keyword::ANY) {
17751 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17752 self.parse_comma_separated(Parser::parse_order_by_expr)?
17753 } else {
17754 vec![]
17755 };
17756 PivotValueSource::Any(order_by)
17757 } else if self.peek_sub_query() {
17758 PivotValueSource::Subquery(self.parse_query()?)
17759 } else {
17760 PivotValueSource::List(
17761 self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17762 )
17763 };
17764 self.expect_token(&Token::RParen)?;
17765
17766 let default_on_null =
17767 if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17768 self.expect_token(&Token::LParen)?;
17769 let expr = self.parse_expr()?;
17770 self.expect_token(&Token::RParen)?;
17771 Some(expr)
17772 } else {
17773 None
17774 };
17775
17776 self.expect_token(&Token::RParen)?;
17777 let alias = self.maybe_parse_table_alias()?;
17778 Ok(TableFactor::Pivot {
17779 table: Box::new(table),
17780 aggregate_functions,
17781 value_column,
17782 value_source,
17783 default_on_null,
17784 alias,
17785 })
17786 }
17787
17788 pub fn parse_unpivot_table_factor(
17790 &mut self,
17791 table: TableFactor,
17792 ) -> Result<TableFactor, ParserError> {
17793 let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17794 self.expect_keyword_is(Keyword::NULLS)?;
17795 Some(NullInclusion::IncludeNulls)
17796 } else if self.parse_keyword(Keyword::EXCLUDE) {
17797 self.expect_keyword_is(Keyword::NULLS)?;
17798 Some(NullInclusion::ExcludeNulls)
17799 } else {
17800 None
17801 };
17802 self.expect_token(&Token::LParen)?;
17803 let value = self.parse_expr()?;
17804 self.expect_keyword_is(Keyword::FOR)?;
17805 let name = self.parse_identifier()?;
17806 self.expect_keyword_is(Keyword::IN)?;
17807 let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17808 p.parse_expr_with_alias()
17809 })?;
17810 self.expect_token(&Token::RParen)?;
17811 let alias = self.maybe_parse_table_alias()?;
17812 Ok(TableFactor::Unpivot {
17813 table: Box::new(table),
17814 value,
17815 null_inclusion,
17816 name,
17817 columns,
17818 alias,
17819 })
17820 }
17821
17822 pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17824 if natural {
17825 Ok(JoinConstraint::Natural)
17826 } else if self.parse_keyword(Keyword::ON) {
17827 let constraint = self.parse_expr()?;
17828 Ok(JoinConstraint::On(constraint))
17829 } else if self.parse_keyword(Keyword::USING) {
17830 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17831 Ok(JoinConstraint::Using(columns))
17832 } else {
17833 Ok(JoinConstraint::None)
17834 }
17836 }
17837
17838 pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17840 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17841
17842 self.expect_keyword_is(Keyword::TO)?;
17843 let grantees = self.parse_grantees()?;
17844
17845 let with_grant_option =
17846 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17847
17848 let current_grants =
17849 if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17850 Some(CurrentGrantsKind::CopyCurrentGrants)
17851 } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17852 Some(CurrentGrantsKind::RevokeCurrentGrants)
17853 } else {
17854 None
17855 };
17856
17857 let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17858 Some(self.parse_identifier()?)
17859 } else {
17860 None
17861 };
17862
17863 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17864 Some(self.parse_identifier()?)
17865 } else {
17866 None
17867 };
17868
17869 Ok(Grant {
17870 privileges,
17871 objects,
17872 grantees,
17873 with_grant_option,
17874 as_grantor,
17875 granted_by,
17876 current_grants,
17877 })
17878 }
17879
17880 fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17881 let mut values = vec![];
17882 let mut grantee_type = GranteesType::None;
17883 loop {
17884 let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17885 GranteesType::Role
17886 } else if self.parse_keyword(Keyword::USER) {
17887 GranteesType::User
17888 } else if self.parse_keyword(Keyword::SHARE) {
17889 GranteesType::Share
17890 } else if self.parse_keyword(Keyword::GROUP) {
17891 GranteesType::Group
17892 } else if self.parse_keyword(Keyword::PUBLIC) {
17893 GranteesType::Public
17894 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17895 GranteesType::DatabaseRole
17896 } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17897 GranteesType::ApplicationRole
17898 } else if self.parse_keyword(Keyword::APPLICATION) {
17899 GranteesType::Application
17900 } else {
17901 grantee_type.clone() };
17903
17904 if self
17905 .dialect
17906 .get_reserved_grantees_types()
17907 .contains(&new_grantee_type)
17908 {
17909 self.prev_token();
17910 } else {
17911 grantee_type = new_grantee_type;
17912 }
17913
17914 let grantee = if grantee_type == GranteesType::Public {
17915 Grantee {
17916 grantee_type: grantee_type.clone(),
17917 name: None,
17918 }
17919 } else {
17920 let mut name = self.parse_grantee_name()?;
17921 if self.consume_token(&Token::Colon) {
17922 let ident = self.parse_identifier()?;
17926 if let GranteeName::ObjectName(namespace) = name {
17927 name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17928 format!("{namespace}:{ident}"),
17929 )]));
17930 };
17931 }
17932 Grantee {
17933 grantee_type: grantee_type.clone(),
17934 name: Some(name),
17935 }
17936 };
17937
17938 values.push(grantee);
17939
17940 if !self.consume_token(&Token::Comma) {
17941 break;
17942 }
17943 }
17944
17945 Ok(values)
17946 }
17947
17948 pub fn parse_grant_deny_revoke_privileges_objects(
17950 &mut self,
17951 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17952 let privileges = if self.parse_keyword(Keyword::ALL) {
17953 Privileges::All {
17954 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17955 }
17956 } else {
17957 let actions = self.parse_actions_list()?;
17958 Privileges::Actions(actions)
17959 };
17960
17961 let objects = if self.parse_keyword(Keyword::ON) {
17962 if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17963 Some(GrantObjects::AllTablesInSchema {
17964 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17965 })
17966 } else if self.parse_keywords(&[
17967 Keyword::ALL,
17968 Keyword::EXTERNAL,
17969 Keyword::TABLES,
17970 Keyword::IN,
17971 Keyword::SCHEMA,
17972 ]) {
17973 Some(GrantObjects::AllExternalTablesInSchema {
17974 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17975 })
17976 } else if self.parse_keywords(&[
17977 Keyword::ALL,
17978 Keyword::VIEWS,
17979 Keyword::IN,
17980 Keyword::SCHEMA,
17981 ]) {
17982 Some(GrantObjects::AllViewsInSchema {
17983 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17984 })
17985 } else if self.parse_keywords(&[
17986 Keyword::ALL,
17987 Keyword::MATERIALIZED,
17988 Keyword::VIEWS,
17989 Keyword::IN,
17990 Keyword::SCHEMA,
17991 ]) {
17992 Some(GrantObjects::AllMaterializedViewsInSchema {
17993 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17994 })
17995 } else if self.parse_keywords(&[
17996 Keyword::ALL,
17997 Keyword::FUNCTIONS,
17998 Keyword::IN,
17999 Keyword::SCHEMA,
18000 ]) {
18001 Some(GrantObjects::AllFunctionsInSchema {
18002 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18003 })
18004 } else if self.parse_keywords(&[
18005 Keyword::FUTURE,
18006 Keyword::SCHEMAS,
18007 Keyword::IN,
18008 Keyword::DATABASE,
18009 ]) {
18010 Some(GrantObjects::FutureSchemasInDatabase {
18011 databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18012 })
18013 } else if self.parse_keywords(&[
18014 Keyword::FUTURE,
18015 Keyword::TABLES,
18016 Keyword::IN,
18017 Keyword::SCHEMA,
18018 ]) {
18019 Some(GrantObjects::FutureTablesInSchema {
18020 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18021 })
18022 } else if self.parse_keywords(&[
18023 Keyword::FUTURE,
18024 Keyword::EXTERNAL,
18025 Keyword::TABLES,
18026 Keyword::IN,
18027 Keyword::SCHEMA,
18028 ]) {
18029 Some(GrantObjects::FutureExternalTablesInSchema {
18030 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18031 })
18032 } else if self.parse_keywords(&[
18033 Keyword::FUTURE,
18034 Keyword::VIEWS,
18035 Keyword::IN,
18036 Keyword::SCHEMA,
18037 ]) {
18038 Some(GrantObjects::FutureViewsInSchema {
18039 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18040 })
18041 } else if self.parse_keywords(&[
18042 Keyword::FUTURE,
18043 Keyword::MATERIALIZED,
18044 Keyword::VIEWS,
18045 Keyword::IN,
18046 Keyword::SCHEMA,
18047 ]) {
18048 Some(GrantObjects::FutureMaterializedViewsInSchema {
18049 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18050 })
18051 } else if self.parse_keywords(&[
18052 Keyword::ALL,
18053 Keyword::SEQUENCES,
18054 Keyword::IN,
18055 Keyword::SCHEMA,
18056 ]) {
18057 Some(GrantObjects::AllSequencesInSchema {
18058 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18059 })
18060 } else if self.parse_keywords(&[
18061 Keyword::FUTURE,
18062 Keyword::SEQUENCES,
18063 Keyword::IN,
18064 Keyword::SCHEMA,
18065 ]) {
18066 Some(GrantObjects::FutureSequencesInSchema {
18067 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
18068 })
18069 } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
18070 Some(GrantObjects::ResourceMonitors(
18071 self.parse_comma_separated(|p| p.parse_object_name(false))?,
18072 ))
18073 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18074 Some(GrantObjects::ComputePools(
18075 self.parse_comma_separated(|p| p.parse_object_name(false))?,
18076 ))
18077 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18078 Some(GrantObjects::FailoverGroup(
18079 self.parse_comma_separated(|p| p.parse_object_name(false))?,
18080 ))
18081 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18082 Some(GrantObjects::ReplicationGroup(
18083 self.parse_comma_separated(|p| p.parse_object_name(false))?,
18084 ))
18085 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18086 Some(GrantObjects::ExternalVolumes(
18087 self.parse_comma_separated(|p| p.parse_object_name(false))?,
18088 ))
18089 } else {
18090 let object_type = self.parse_one_of_keywords(&[
18091 Keyword::SEQUENCE,
18092 Keyword::DATABASE,
18093 Keyword::SCHEMA,
18094 Keyword::TABLE,
18095 Keyword::VIEW,
18096 Keyword::WAREHOUSE,
18097 Keyword::INTEGRATION,
18098 Keyword::VIEW,
18099 Keyword::WAREHOUSE,
18100 Keyword::INTEGRATION,
18101 Keyword::USER,
18102 Keyword::CONNECTION,
18103 Keyword::PROCEDURE,
18104 Keyword::FUNCTION,
18105 Keyword::TYPE,
18106 Keyword::DOMAIN,
18107 ]);
18108 let objects =
18109 self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
18110 match object_type {
18111 Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
18112 Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
18113 Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
18114 Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
18115 Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
18116 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
18117 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
18118 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
18119 Some(Keyword::TYPE) => Some(GrantObjects::Types(objects?)),
18120 Some(Keyword::DOMAIN) => Some(GrantObjects::Domains(objects?)),
18121 kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
18122 if let Some(name) = objects?.first() {
18123 self.parse_grant_procedure_or_function(name, &kw)?
18124 } else {
18125 self.expected_ref("procedure or function name", self.peek_token_ref())?
18126 }
18127 }
18128 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
18129 Some(unexpected_keyword) => return Err(ParserError::ParserError(
18130 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
18131 )),
18132 }
18133 }
18134 } else {
18135 None
18136 };
18137
18138 Ok((privileges, objects))
18139 }
18140
18141 fn parse_grant_procedure_or_function(
18142 &mut self,
18143 name: &ObjectName,
18144 kw: &Option<Keyword>,
18145 ) -> Result<Option<GrantObjects>, ParserError> {
18146 let arg_types = if self.consume_token(&Token::LParen) {
18147 let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
18148 self.expect_token(&Token::RParen)?;
18149 list
18150 } else {
18151 vec![]
18152 };
18153 match kw {
18154 Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
18155 name: name.clone(),
18156 arg_types,
18157 })),
18158 Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
18159 name: name.clone(),
18160 arg_types,
18161 })),
18162 _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
18163 }
18164 }
18165
18166 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
18168 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
18169 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
18170 if columns.is_empty() {
18171 Ok(None)
18172 } else {
18173 Ok(Some(columns))
18174 }
18175 }
18176
18177 if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
18179 Ok(Action::ImportedPrivileges)
18180 } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
18181 Ok(Action::AddSearchOptimization)
18182 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
18183 Ok(Action::AttachListing)
18184 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
18185 Ok(Action::AttachPolicy)
18186 } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
18187 Ok(Action::BindServiceEndpoint)
18188 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
18189 let role = self.parse_object_name(false)?;
18190 Ok(Action::DatabaseRole { role })
18191 } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
18192 Ok(Action::EvolveSchema)
18193 } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
18194 Ok(Action::ImportShare)
18195 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
18196 Ok(Action::ManageVersions)
18197 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
18198 Ok(Action::ManageReleases)
18199 } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
18200 Ok(Action::OverrideShareRestrictions)
18201 } else if self.parse_keywords(&[
18202 Keyword::PURCHASE,
18203 Keyword::DATA,
18204 Keyword::EXCHANGE,
18205 Keyword::LISTING,
18206 ]) {
18207 Ok(Action::PurchaseDataExchangeListing)
18208 } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
18209 Ok(Action::ResolveAll)
18210 } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
18211 Ok(Action::ReadSession)
18212
18213 } else if self.parse_keyword(Keyword::APPLY) {
18215 let apply_type = self.parse_action_apply_type()?;
18216 Ok(Action::Apply { apply_type })
18217 } else if self.parse_keyword(Keyword::APPLYBUDGET) {
18218 Ok(Action::ApplyBudget)
18219 } else if self.parse_keyword(Keyword::AUDIT) {
18220 Ok(Action::Audit)
18221 } else if self.parse_keyword(Keyword::CONNECT) {
18222 Ok(Action::Connect)
18223 } else if self.parse_keyword(Keyword::CREATE) {
18224 let obj_type = self.maybe_parse_action_create_object_type();
18225 Ok(Action::Create { obj_type })
18226 } else if self.parse_keyword(Keyword::DELETE) {
18227 Ok(Action::Delete)
18228 } else if self.parse_keyword(Keyword::EXEC) {
18229 let obj_type = self.maybe_parse_action_execute_obj_type();
18230 Ok(Action::Exec { obj_type })
18231 } else if self.parse_keyword(Keyword::EXECUTE) {
18232 let obj_type = self.maybe_parse_action_execute_obj_type();
18233 Ok(Action::Execute { obj_type })
18234 } else if self.parse_keyword(Keyword::FAILOVER) {
18235 Ok(Action::Failover)
18236 } else if self.parse_keyword(Keyword::INSERT) {
18237 Ok(Action::Insert {
18238 columns: parse_columns(self)?,
18239 })
18240 } else if self.parse_keyword(Keyword::MANAGE) {
18241 let manage_type = self.parse_action_manage_type()?;
18242 Ok(Action::Manage { manage_type })
18243 } else if self.parse_keyword(Keyword::MODIFY) {
18244 let modify_type = self.parse_action_modify_type();
18245 Ok(Action::Modify { modify_type })
18246 } else if self.parse_keyword(Keyword::MONITOR) {
18247 let monitor_type = self.parse_action_monitor_type();
18248 Ok(Action::Monitor { monitor_type })
18249 } else if self.parse_keyword(Keyword::OPERATE) {
18250 Ok(Action::Operate)
18251 } else if self.parse_keyword(Keyword::REFERENCES) {
18252 Ok(Action::References {
18253 columns: parse_columns(self)?,
18254 })
18255 } else if self.parse_keyword(Keyword::READ) {
18256 Ok(Action::Read)
18257 } else if self.parse_keyword(Keyword::REPLICATE) {
18258 Ok(Action::Replicate)
18259 } else if self.parse_keyword(Keyword::ROLE) {
18260 let role = self.parse_object_name(false)?;
18261 Ok(Action::Role { role })
18262 } else if self.parse_keyword(Keyword::SELECT) {
18263 Ok(Action::Select {
18264 columns: parse_columns(self)?,
18265 })
18266 } else if self.parse_keyword(Keyword::TEMPORARY) {
18267 Ok(Action::Temporary)
18268 } else if self.parse_keyword(Keyword::TRIGGER) {
18269 Ok(Action::Trigger)
18270 } else if self.parse_keyword(Keyword::TRUNCATE) {
18271 Ok(Action::Truncate)
18272 } else if self.parse_keyword(Keyword::UPDATE) {
18273 Ok(Action::Update {
18274 columns: parse_columns(self)?,
18275 })
18276 } else if self.parse_keyword(Keyword::USAGE) {
18277 Ok(Action::Usage)
18278 } else if self.parse_keyword(Keyword::OWNERSHIP) {
18279 Ok(Action::Ownership)
18280 } else if self.parse_keyword(Keyword::DROP) {
18281 Ok(Action::Drop)
18282 } else {
18283 self.expected_ref("a privilege keyword", self.peek_token_ref())?
18284 }
18285 }
18286
18287 fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
18288 if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
18290 Some(ActionCreateObjectType::ApplicationPackage)
18291 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18292 Some(ActionCreateObjectType::ComputePool)
18293 } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
18294 Some(ActionCreateObjectType::DataExchangeListing)
18295 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18296 Some(ActionCreateObjectType::ExternalVolume)
18297 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18298 Some(ActionCreateObjectType::FailoverGroup)
18299 } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
18300 Some(ActionCreateObjectType::NetworkPolicy)
18301 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
18302 Some(ActionCreateObjectType::OrganiationListing)
18303 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18304 Some(ActionCreateObjectType::ReplicationGroup)
18305 }
18306 else if self.parse_keyword(Keyword::ACCOUNT) {
18308 Some(ActionCreateObjectType::Account)
18309 } else if self.parse_keyword(Keyword::APPLICATION) {
18310 Some(ActionCreateObjectType::Application)
18311 } else if self.parse_keyword(Keyword::DATABASE) {
18312 Some(ActionCreateObjectType::Database)
18313 } else if self.parse_keyword(Keyword::INTEGRATION) {
18314 Some(ActionCreateObjectType::Integration)
18315 } else if self.parse_keyword(Keyword::ROLE) {
18316 Some(ActionCreateObjectType::Role)
18317 } else if self.parse_keyword(Keyword::SCHEMA) {
18318 Some(ActionCreateObjectType::Schema)
18319 } else if self.parse_keyword(Keyword::SHARE) {
18320 Some(ActionCreateObjectType::Share)
18321 } else if self.parse_keyword(Keyword::USER) {
18322 Some(ActionCreateObjectType::User)
18323 } else if self.parse_keyword(Keyword::WAREHOUSE) {
18324 Some(ActionCreateObjectType::Warehouse)
18325 } else {
18326 None
18327 }
18328 }
18329
18330 fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
18331 if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
18332 Ok(ActionApplyType::AggregationPolicy)
18333 } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
18334 Ok(ActionApplyType::AuthenticationPolicy)
18335 } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
18336 Ok(ActionApplyType::JoinPolicy)
18337 } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
18338 Ok(ActionApplyType::MaskingPolicy)
18339 } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
18340 Ok(ActionApplyType::PackagesPolicy)
18341 } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
18342 Ok(ActionApplyType::PasswordPolicy)
18343 } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
18344 Ok(ActionApplyType::ProjectionPolicy)
18345 } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
18346 Ok(ActionApplyType::RowAccessPolicy)
18347 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
18348 Ok(ActionApplyType::SessionPolicy)
18349 } else if self.parse_keyword(Keyword::TAG) {
18350 Ok(ActionApplyType::Tag)
18351 } else {
18352 self.expected_ref("GRANT APPLY type", self.peek_token_ref())
18353 }
18354 }
18355
18356 fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
18357 if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
18358 Some(ActionExecuteObjectType::DataMetricFunction)
18359 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
18360 Some(ActionExecuteObjectType::ManagedAlert)
18361 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
18362 Some(ActionExecuteObjectType::ManagedTask)
18363 } else if self.parse_keyword(Keyword::ALERT) {
18364 Some(ActionExecuteObjectType::Alert)
18365 } else if self.parse_keyword(Keyword::TASK) {
18366 Some(ActionExecuteObjectType::Task)
18367 } else {
18368 None
18369 }
18370 }
18371
18372 fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
18373 if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
18374 Ok(ActionManageType::AccountSupportCases)
18375 } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
18376 Ok(ActionManageType::EventSharing)
18377 } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
18378 Ok(ActionManageType::ListingAutoFulfillment)
18379 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
18380 Ok(ActionManageType::OrganizationSupportCases)
18381 } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
18382 Ok(ActionManageType::UserSupportCases)
18383 } else if self.parse_keyword(Keyword::GRANTS) {
18384 Ok(ActionManageType::Grants)
18385 } else if self.parse_keyword(Keyword::WAREHOUSES) {
18386 Ok(ActionManageType::Warehouses)
18387 } else {
18388 self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
18389 }
18390 }
18391
18392 fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
18393 if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
18394 Some(ActionModifyType::LogLevel)
18395 } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
18396 Some(ActionModifyType::TraceLevel)
18397 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
18398 Some(ActionModifyType::SessionLogLevel)
18399 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
18400 Some(ActionModifyType::SessionTraceLevel)
18401 } else {
18402 None
18403 }
18404 }
18405
18406 fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
18407 if self.parse_keyword(Keyword::EXECUTION) {
18408 Some(ActionMonitorType::Execution)
18409 } else if self.parse_keyword(Keyword::SECURITY) {
18410 Some(ActionMonitorType::Security)
18411 } else if self.parse_keyword(Keyword::USAGE) {
18412 Some(ActionMonitorType::Usage)
18413 } else {
18414 None
18415 }
18416 }
18417
18418 pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
18420 let mut name = self.parse_object_name(false)?;
18421 if self.dialect.supports_user_host_grantee()
18422 && name.0.len() == 1
18423 && name.0[0].as_ident().is_some()
18424 && self.consume_token(&Token::AtSign)
18425 {
18426 let user = name.0.pop().unwrap().as_ident().unwrap().clone();
18427 let host = self.parse_identifier()?;
18428 Ok(GranteeName::UserHost { user, host })
18429 } else {
18430 Ok(GranteeName::ObjectName(name))
18431 }
18432 }
18433
18434 pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
18436 self.expect_keyword(Keyword::DENY)?;
18437
18438 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18439 let objects = match objects {
18440 Some(o) => o,
18441 None => {
18442 return parser_err!(
18443 "DENY statements must specify an object",
18444 self.peek_token_ref().span.start
18445 )
18446 }
18447 };
18448
18449 self.expect_keyword_is(Keyword::TO)?;
18450 let grantees = self.parse_grantees()?;
18451 let cascade = self.parse_cascade_option();
18452 let granted_by = if self.parse_keywords(&[Keyword::AS]) {
18453 Some(self.parse_identifier()?)
18454 } else {
18455 None
18456 };
18457
18458 Ok(Statement::Deny(DenyStatement {
18459 privileges,
18460 objects,
18461 grantees,
18462 cascade,
18463 granted_by,
18464 }))
18465 }
18466
18467 pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
18469 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18470
18471 self.expect_keyword_is(Keyword::FROM)?;
18472 let grantees = self.parse_grantees()?;
18473
18474 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
18475 Some(self.parse_identifier()?)
18476 } else {
18477 None
18478 };
18479
18480 let cascade = self.parse_cascade_option();
18481
18482 Ok(Revoke {
18483 privileges,
18484 objects,
18485 grantees,
18486 granted_by,
18487 cascade,
18488 })
18489 }
18490
18491 pub fn parse_replace(
18493 &mut self,
18494 replace_token: TokenWithSpan,
18495 ) -> Result<Statement, ParserError> {
18496 if !dialect_of!(self is MySqlDialect | GenericDialect) {
18497 return parser_err!(
18498 "Unsupported statement REPLACE",
18499 self.peek_token_ref().span.start
18500 );
18501 }
18502
18503 let mut insert = self.parse_insert(replace_token)?;
18504 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
18505 *replace_into = true;
18506 }
18507
18508 Ok(insert)
18509 }
18510
18511 fn parse_insert_setexpr_boxed(
18515 &mut self,
18516 insert_token: TokenWithSpan,
18517 ) -> Result<Box<SetExpr>, ParserError> {
18518 Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
18519 }
18520
18521 pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
18523 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18524 let or = self.parse_conflict_clause();
18525 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
18526 None
18527 } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
18528 Some(MysqlInsertPriority::LowPriority)
18529 } else if self.parse_keyword(Keyword::DELAYED) {
18530 Some(MysqlInsertPriority::Delayed)
18531 } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
18532 Some(MysqlInsertPriority::HighPriority)
18533 } else {
18534 None
18535 };
18536
18537 let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
18538 && self.parse_keyword(Keyword::IGNORE);
18539
18540 let replace_into = false;
18541
18542 let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18543 let into = self.parse_keyword(Keyword::INTO);
18544
18545 let local = self.parse_keyword(Keyword::LOCAL);
18546
18547 if self.parse_keyword(Keyword::DIRECTORY) {
18548 let path = self.parse_literal_string()?;
18549 let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18550 Some(self.parse_file_format()?)
18551 } else {
18552 None
18553 };
18554 let source = self.parse_query()?;
18555 Ok(Statement::Directory {
18556 local,
18557 path,
18558 overwrite,
18559 file_format,
18560 source,
18561 })
18562 } else {
18563 let table = self.parse_keyword(Keyword::TABLE);
18565 let table_object = self.parse_table_object()?;
18566
18567 let table_alias = if self.dialect.supports_insert_table_alias()
18568 && !self.peek_sub_query()
18569 && self
18570 .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18571 .is_none()
18572 {
18573 if self.parse_keyword(Keyword::AS) {
18574 Some(TableAliasWithoutColumns {
18575 explicit: true,
18576 alias: self.parse_identifier()?,
18577 })
18578 } else {
18579 self.maybe_parse(|parser| parser.parse_identifier())?
18580 .map(|alias| TableAliasWithoutColumns {
18581 explicit: false,
18582 alias,
18583 })
18584 }
18585 } else {
18586 None
18587 };
18588
18589 let is_mysql = dialect_of!(self is MySqlDialect);
18590
18591 let (columns, partitioned, after_columns, output, source, assignments) = if self
18592 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18593 {
18594 (vec![], None, vec![], None, None, vec![])
18595 } else {
18596 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18597 let columns =
18598 self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18599
18600 let partitioned = self.parse_insert_partition()?;
18601 let after_columns = if dialect_of!(self is HiveDialect) {
18603 self.parse_parenthesized_column_list(Optional, false)?
18604 } else {
18605 vec![]
18606 };
18607 (columns, partitioned, after_columns)
18608 } else {
18609 Default::default()
18610 };
18611
18612 let output = self.maybe_parse_output_clause()?;
18613
18614 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18615 || self.peek_keyword(Keyword::SETTINGS)
18616 {
18617 (None, vec![])
18618 } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18619 (None, self.parse_comma_separated(Parser::parse_assignment)?)
18620 } else {
18621 (Some(self.parse_query()?), vec![])
18622 };
18623
18624 (
18625 columns,
18626 partitioned,
18627 after_columns,
18628 output,
18629 source,
18630 assignments,
18631 )
18632 };
18633
18634 let (format_clause, settings) = if self.dialect.supports_insert_format() {
18635 let settings = self.parse_settings()?;
18638
18639 let format = if self.parse_keyword(Keyword::FORMAT) {
18640 Some(self.parse_input_format_clause()?)
18641 } else {
18642 None
18643 };
18644
18645 (format, settings)
18646 } else {
18647 Default::default()
18648 };
18649
18650 let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18651 && self.parse_keyword(Keyword::AS)
18652 {
18653 let row_alias = self.parse_object_name(false)?;
18654 let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18655 Some(InsertAliases {
18656 row_alias,
18657 col_aliases,
18658 })
18659 } else {
18660 None
18661 };
18662
18663 let on = if self.parse_keyword(Keyword::ON) {
18664 if self.parse_keyword(Keyword::CONFLICT) {
18665 let conflict_target =
18666 if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18667 Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18668 } else if self.peek_token_ref().token == Token::LParen {
18669 Some(ConflictTarget::Columns(
18670 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18671 ))
18672 } else {
18673 None
18674 };
18675
18676 self.expect_keyword_is(Keyword::DO)?;
18677 let action = if self.parse_keyword(Keyword::NOTHING) {
18678 OnConflictAction::DoNothing
18679 } else {
18680 self.expect_keyword_is(Keyword::UPDATE)?;
18681 self.expect_keyword_is(Keyword::SET)?;
18682 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18683 let selection = if self.parse_keyword(Keyword::WHERE) {
18684 Some(self.parse_expr()?)
18685 } else {
18686 None
18687 };
18688 OnConflictAction::DoUpdate(DoUpdate {
18689 assignments,
18690 selection,
18691 })
18692 };
18693
18694 Some(OnInsert::OnConflict(OnConflict {
18695 conflict_target,
18696 action,
18697 }))
18698 } else {
18699 self.expect_keyword_is(Keyword::DUPLICATE)?;
18700 self.expect_keyword_is(Keyword::KEY)?;
18701 self.expect_keyword_is(Keyword::UPDATE)?;
18702 let l = self.parse_comma_separated(Parser::parse_assignment)?;
18703
18704 Some(OnInsert::DuplicateKeyUpdate(l))
18705 }
18706 } else {
18707 None
18708 };
18709
18710 let returning = if self.parse_keyword(Keyword::RETURNING) {
18711 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18712 } else {
18713 None
18714 };
18715
18716 Ok(Insert {
18717 insert_token: insert_token.into(),
18718 optimizer_hints,
18719 or,
18720 table: table_object,
18721 table_alias,
18722 ignore,
18723 into,
18724 overwrite,
18725 partitioned,
18726 columns,
18727 after_columns,
18728 source,
18729 assignments,
18730 has_table_keyword: table,
18731 on,
18732 returning,
18733 output,
18734 replace_into,
18735 priority,
18736 insert_alias,
18737 settings,
18738 format_clause,
18739 multi_table_insert_type: None,
18740 multi_table_into_clauses: vec![],
18741 multi_table_when_clauses: vec![],
18742 multi_table_else_clause: None,
18743 }
18744 .into())
18745 }
18746 }
18747
18748 pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18752 let ident = self.parse_identifier()?;
18753 let values = self
18754 .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18755 .unwrap_or_default();
18756
18757 Ok(InputFormatClause { ident, values })
18758 }
18759
18760 fn peek_subquery_start(&mut self) -> bool {
18763 matches!(
18764 self.peek_tokens_ref(),
18765 [
18766 TokenWithSpan {
18767 token: Token::LParen,
18768 ..
18769 },
18770 TokenWithSpan {
18771 token: Token::Word(Word {
18772 keyword: Keyword::SELECT,
18773 ..
18774 }),
18775 ..
18776 },
18777 ]
18778 )
18779 }
18780
18781 fn peek_subquery_or_cte_start(&mut self) -> bool {
18785 matches!(
18786 self.peek_tokens_ref(),
18787 [
18788 TokenWithSpan {
18789 token: Token::LParen,
18790 ..
18791 },
18792 TokenWithSpan {
18793 token: Token::Word(Word {
18794 keyword: Keyword::SELECT | Keyword::WITH,
18795 ..
18796 }),
18797 ..
18798 },
18799 ]
18800 )
18801 }
18802
18803 fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18804 if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18805 Some(SqliteOnConflict::Replace)
18806 } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18807 Some(SqliteOnConflict::Rollback)
18808 } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18809 Some(SqliteOnConflict::Abort)
18810 } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18811 Some(SqliteOnConflict::Fail)
18812 } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18813 Some(SqliteOnConflict::Ignore)
18814 } else if self.parse_keyword(Keyword::REPLACE) {
18815 Some(SqliteOnConflict::Replace)
18816 } else {
18817 None
18818 }
18819 }
18820
18821 pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18823 if self.parse_keyword(Keyword::PARTITION) {
18824 self.expect_token(&Token::LParen)?;
18825 let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18826 self.expect_token(&Token::RParen)?;
18827 Ok(partition_cols)
18828 } else {
18829 Ok(None)
18830 }
18831 }
18832
18833 pub fn parse_load_data_table_format(
18835 &mut self,
18836 ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18837 if self.parse_keyword(Keyword::INPUTFORMAT) {
18838 let input_format = self.parse_expr()?;
18839 self.expect_keyword_is(Keyword::SERDE)?;
18840 let serde = self.parse_expr()?;
18841 Ok(Some(HiveLoadDataFormat {
18842 input_format,
18843 serde,
18844 }))
18845 } else {
18846 Ok(None)
18847 }
18848 }
18849
18850 fn parse_update_setexpr_boxed(
18854 &mut self,
18855 update_token: TokenWithSpan,
18856 ) -> Result<Box<SetExpr>, ParserError> {
18857 Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18858 }
18859
18860 pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18862 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18863 let or = self.parse_conflict_clause();
18864 let table = self.parse_table_and_joins()?;
18865 let from_before_set = if self.parse_keyword(Keyword::FROM) {
18866 Some(UpdateTableFromKind::BeforeSet(
18867 self.parse_table_with_joins()?,
18868 ))
18869 } else {
18870 None
18871 };
18872 self.expect_keyword(Keyword::SET)?;
18873 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18874
18875 let output = self.maybe_parse_output_clause()?;
18876
18877 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18878 Some(UpdateTableFromKind::AfterSet(
18879 self.parse_table_with_joins()?,
18880 ))
18881 } else {
18882 from_before_set
18883 };
18884 let selection = if self.parse_keyword(Keyword::WHERE) {
18885 Some(self.parse_expr()?)
18886 } else {
18887 None
18888 };
18889 let returning = if self.parse_keyword(Keyword::RETURNING) {
18890 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18891 } else {
18892 None
18893 };
18894 let order_by = if self.dialect.supports_update_order_by()
18895 && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18896 {
18897 self.parse_comma_separated(Parser::parse_order_by_expr)?
18898 } else {
18899 vec![]
18900 };
18901 let limit = if self.parse_keyword(Keyword::LIMIT) {
18902 Some(self.parse_expr()?)
18903 } else {
18904 None
18905 };
18906 Ok(Update {
18907 update_token: update_token.into(),
18908 optimizer_hints,
18909 table,
18910 assignments,
18911 from,
18912 selection,
18913 returning,
18914 output,
18915 or,
18916 order_by,
18917 limit,
18918 }
18919 .into())
18920 }
18921
18922 pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18924 let target = self.parse_assignment_target()?;
18925 self.expect_token(&Token::Eq)?;
18926 let value = self.parse_expr()?;
18927 Ok(Assignment { target, value })
18928 }
18929
18930 pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18932 if self.consume_token(&Token::LParen) {
18933 let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18934 self.expect_token(&Token::RParen)?;
18935 Ok(AssignmentTarget::Tuple(columns))
18936 } else {
18937 let column = self.parse_object_name(false)?;
18938 Ok(AssignmentTarget::ColumnName(column))
18939 }
18940 }
18941
18942 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18944 let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18945 self.maybe_parse(|p| {
18946 let name = p.parse_expr()?;
18947 let operator = p.parse_function_named_arg_operator()?;
18948 let arg = p.parse_wildcard_expr()?.into();
18949 Ok(FunctionArg::ExprNamed {
18950 name,
18951 arg,
18952 operator,
18953 })
18954 })?
18955 } else {
18956 self.maybe_parse(|p| {
18957 let name = p.parse_identifier()?;
18958 let operator = p.parse_function_named_arg_operator()?;
18959 let arg = p.parse_wildcard_expr()?.into();
18960 Ok(FunctionArg::Named {
18961 name,
18962 arg,
18963 operator,
18964 })
18965 })?
18966 };
18967 if let Some(arg) = arg {
18968 return Ok(arg);
18969 }
18970 let wildcard_expr = self.parse_wildcard_expr()?;
18971 let arg_expr: FunctionArgExpr = match wildcard_expr {
18972 Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18973 let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18976 if opts.opt_exclude.is_some()
18977 || opts.opt_except.is_some()
18978 || opts.opt_replace.is_some()
18979 || opts.opt_rename.is_some()
18980 || opts.opt_ilike.is_some()
18981 {
18982 FunctionArgExpr::WildcardWithOptions(opts)
18983 } else {
18984 wildcard_expr.into()
18985 }
18986 }
18987 other => other.into(),
18988 };
18989 Ok(FunctionArg::Unnamed(arg_expr))
18990 }
18991
18992 fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18993 if self.parse_keyword(Keyword::VALUE) {
18994 return Ok(FunctionArgOperator::Value);
18995 }
18996 let tok = self.next_token();
18997 match tok.token {
18998 Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18999 Ok(FunctionArgOperator::RightArrow)
19000 }
19001 Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
19002 Ok(FunctionArgOperator::Equals)
19003 }
19004 Token::Assignment
19005 if self
19006 .dialect
19007 .supports_named_fn_args_with_assignment_operator() =>
19008 {
19009 Ok(FunctionArgOperator::Assignment)
19010 }
19011 Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
19012 Ok(FunctionArgOperator::Colon)
19013 }
19014 _ => {
19015 self.prev_token();
19016 self.expected("argument operator", tok)
19017 }
19018 }
19019 }
19020
19021 pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
19023 if self.consume_token(&Token::RParen) {
19024 Ok(vec![])
19025 } else {
19026 let args = self.parse_comma_separated(Parser::parse_function_args)?;
19027 self.expect_token(&Token::RParen)?;
19028 Ok(args)
19029 }
19030 }
19031
19032 fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
19033 if self.consume_token(&Token::RParen) {
19034 return Ok(TableFunctionArgs {
19035 args: vec![],
19036 settings: None,
19037 });
19038 }
19039 let mut args = vec![];
19040 let settings = loop {
19041 if let Some(settings) = self.parse_settings()? {
19042 break Some(settings);
19043 }
19044 args.push(self.parse_function_args()?);
19045 if self.is_parse_comma_separated_end() {
19046 break None;
19047 }
19048 };
19049 self.expect_token(&Token::RParen)?;
19050 Ok(TableFunctionArgs { args, settings })
19051 }
19052
19053 fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
19062 let mut clauses = vec![];
19063
19064 if let Some(null_clause) = self.parse_json_null_clause() {
19067 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19068 }
19069
19070 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19071 clauses.push(FunctionArgumentClause::JsonReturningClause(
19072 json_returning_clause,
19073 ));
19074 }
19075
19076 if self.consume_token(&Token::RParen) {
19077 return Ok(FunctionArgumentList {
19078 duplicate_treatment: None,
19079 args: vec![],
19080 clauses,
19081 });
19082 }
19083
19084 let duplicate_treatment = self.parse_duplicate_treatment()?;
19085 let args = self.parse_comma_separated(Parser::parse_function_args)?;
19086
19087 if self.dialect.supports_window_function_null_treatment_arg() {
19088 if let Some(null_treatment) = self.parse_null_treatment()? {
19089 clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
19090 }
19091 }
19092
19093 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
19094 clauses.push(FunctionArgumentClause::OrderBy(
19095 self.parse_comma_separated(Parser::parse_order_by_expr)?,
19096 ));
19097 }
19098
19099 if self.parse_keyword(Keyword::LIMIT) {
19100 clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
19101 }
19102
19103 if dialect_of!(self is GenericDialect | BigQueryDialect)
19104 && self.parse_keyword(Keyword::HAVING)
19105 {
19106 let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
19107 Keyword::MIN => HavingBoundKind::Min,
19108 Keyword::MAX => HavingBoundKind::Max,
19109 unexpected_keyword => return Err(ParserError::ParserError(
19110 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
19111 )),
19112 };
19113 clauses.push(FunctionArgumentClause::Having(HavingBound(
19114 kind,
19115 self.parse_expr()?,
19116 )))
19117 }
19118
19119 if dialect_of!(self is GenericDialect | MySqlDialect)
19120 && self.parse_keyword(Keyword::SEPARATOR)
19121 {
19122 clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
19123 }
19124
19125 if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
19126 clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
19127 }
19128
19129 if let Some(null_clause) = self.parse_json_null_clause() {
19130 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19131 }
19132
19133 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19134 clauses.push(FunctionArgumentClause::JsonReturningClause(
19135 json_returning_clause,
19136 ));
19137 }
19138
19139 self.expect_token(&Token::RParen)?;
19140 Ok(FunctionArgumentList {
19141 duplicate_treatment,
19142 args,
19143 clauses,
19144 })
19145 }
19146
19147 fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
19148 if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
19149 Some(JsonNullClause::AbsentOnNull)
19150 } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
19151 Some(JsonNullClause::NullOnNull)
19152 } else {
19153 None
19154 }
19155 }
19156
19157 fn maybe_parse_json_returning_clause(
19158 &mut self,
19159 ) -> Result<Option<JsonReturningClause>, ParserError> {
19160 if self.parse_keyword(Keyword::RETURNING) {
19161 let data_type = self.parse_data_type()?;
19162 Ok(Some(JsonReturningClause { data_type }))
19163 } else {
19164 Ok(None)
19165 }
19166 }
19167
19168 fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
19169 let loc = self.peek_token_ref().span.start;
19170 match (
19171 self.parse_keyword(Keyword::ALL),
19172 self.parse_keyword(Keyword::DISTINCT),
19173 ) {
19174 (true, false) => Ok(Some(DuplicateTreatment::All)),
19175 (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
19176 (false, false) => Ok(None),
19177 (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
19178 }
19179 }
19180
19181 pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
19183 let prefix = self
19184 .parse_one_of_keywords(
19185 self.dialect
19186 .get_reserved_keywords_for_select_item_operator(),
19187 )
19188 .map(|keyword| Ident::new(format!("{keyword:?}")));
19189
19190 match self.parse_wildcard_expr()? {
19191 Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
19192 SelectItemQualifiedWildcardKind::ObjectName(prefix),
19193 self.parse_wildcard_additional_options(token.0)?,
19194 )),
19195 Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
19196 self.parse_wildcard_additional_options(token.0)?,
19197 )),
19198 Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
19199 parser_err!(
19200 format!("Expected an expression, found: {}", v),
19201 self.peek_token_ref().span.start
19202 )
19203 }
19204 Expr::BinaryOp {
19205 left,
19206 op: BinaryOperator::Eq,
19207 right,
19208 } if self.dialect.supports_eq_alias_assignment()
19209 && matches!(left.as_ref(), Expr::Identifier(_)) =>
19210 {
19211 let Expr::Identifier(alias) = *left else {
19212 return parser_err!(
19213 "BUG: expected identifier expression as alias",
19214 self.peek_token_ref().span.start
19215 );
19216 };
19217 Ok(SelectItem::ExprWithAlias {
19218 expr: *right,
19219 alias,
19220 })
19221 }
19222 expr if self.dialect.supports_select_expr_star()
19223 && self.consume_tokens(&[Token::Period, Token::Mul]) =>
19224 {
19225 let wildcard_token = self.get_previous_token().clone();
19226 Ok(SelectItem::QualifiedWildcard(
19227 SelectItemQualifiedWildcardKind::Expr(expr),
19228 self.parse_wildcard_additional_options(wildcard_token)?,
19229 ))
19230 }
19231 expr if self.dialect.supports_select_item_multi_column_alias()
19232 && self.peek_keyword(Keyword::AS)
19233 && self.peek_nth_token(1).token == Token::LParen =>
19234 {
19235 self.expect_keyword(Keyword::AS)?;
19236 self.expect_token(&Token::LParen)?;
19237 let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
19238 self.expect_token(&Token::RParen)?;
19239 Ok(SelectItem::ExprWithAliases {
19240 expr: maybe_prefixed_expr(expr, prefix),
19241 aliases,
19242 })
19243 }
19244 expr => self
19245 .maybe_parse_select_item_alias()
19246 .map(|alias| match alias {
19247 Some(alias) => SelectItem::ExprWithAlias {
19248 expr: maybe_prefixed_expr(expr, prefix),
19249 alias,
19250 },
19251 None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
19252 }),
19253 }
19254 }
19255
19256 pub fn parse_wildcard_additional_options(
19260 &mut self,
19261 wildcard_token: TokenWithSpan,
19262 ) -> Result<WildcardAdditionalOptions, ParserError> {
19263 let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
19264 self.parse_optional_select_item_ilike()?
19265 } else {
19266 None
19267 };
19268 let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
19269 {
19270 self.parse_optional_select_item_exclude()?
19271 } else {
19272 None
19273 };
19274 let opt_except = if self.dialect.supports_select_wildcard_except() {
19275 self.parse_optional_select_item_except()?
19276 } else {
19277 None
19278 };
19279 let opt_replace = if self.dialect.supports_select_wildcard_replace() {
19280 self.parse_optional_select_item_replace()?
19281 } else {
19282 None
19283 };
19284 let opt_rename = if self.dialect.supports_select_wildcard_rename() {
19285 self.parse_optional_select_item_rename()?
19286 } else {
19287 None
19288 };
19289
19290 let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
19291 self.maybe_parse_select_item_alias()?
19292 } else {
19293 None
19294 };
19295
19296 Ok(WildcardAdditionalOptions {
19297 wildcard_token: wildcard_token.into(),
19298 opt_ilike,
19299 opt_exclude,
19300 opt_except,
19301 opt_rename,
19302 opt_replace,
19303 opt_alias,
19304 })
19305 }
19306
19307 pub fn parse_optional_select_item_ilike(
19311 &mut self,
19312 ) -> Result<Option<IlikeSelectItem>, ParserError> {
19313 let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
19314 let next_token = self.next_token();
19315 let pattern = match next_token.token {
19316 Token::SingleQuotedString(s) => s,
19317 _ => return self.expected("ilike pattern", next_token),
19318 };
19319 Some(IlikeSelectItem { pattern })
19320 } else {
19321 None
19322 };
19323 Ok(opt_ilike)
19324 }
19325
19326 pub fn parse_optional_select_item_exclude(
19330 &mut self,
19331 ) -> Result<Option<ExcludeSelectItem>, ParserError> {
19332 let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
19333 if self.consume_token(&Token::LParen) {
19334 let columns =
19335 self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
19336 self.expect_token(&Token::RParen)?;
19337 Some(ExcludeSelectItem::Multiple(columns))
19338 } else {
19339 let column = self.parse_object_name(false)?;
19340 Some(ExcludeSelectItem::Single(column))
19341 }
19342 } else {
19343 None
19344 };
19345
19346 Ok(opt_exclude)
19347 }
19348
19349 pub fn parse_optional_select_item_except(
19353 &mut self,
19354 ) -> Result<Option<ExceptSelectItem>, ParserError> {
19355 let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
19356 if self.peek_token_ref().token == Token::LParen {
19357 let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
19358 match &idents[..] {
19359 [] => {
19360 return self.expected_ref(
19361 "at least one column should be parsed by the expect clause",
19362 self.peek_token_ref(),
19363 )?;
19364 }
19365 [first, idents @ ..] => Some(ExceptSelectItem {
19366 first_element: first.clone(),
19367 additional_elements: idents.to_vec(),
19368 }),
19369 }
19370 } else {
19371 let ident = self.parse_identifier()?;
19373 Some(ExceptSelectItem {
19374 first_element: ident,
19375 additional_elements: vec![],
19376 })
19377 }
19378 } else {
19379 None
19380 };
19381
19382 Ok(opt_except)
19383 }
19384
19385 pub fn parse_optional_select_item_rename(
19387 &mut self,
19388 ) -> Result<Option<RenameSelectItem>, ParserError> {
19389 let opt_rename = if self.parse_keyword(Keyword::RENAME) {
19390 if self.consume_token(&Token::LParen) {
19391 let idents =
19392 self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
19393 self.expect_token(&Token::RParen)?;
19394 Some(RenameSelectItem::Multiple(idents))
19395 } else {
19396 let ident = self.parse_identifier_with_alias()?;
19397 Some(RenameSelectItem::Single(ident))
19398 }
19399 } else {
19400 None
19401 };
19402
19403 Ok(opt_rename)
19404 }
19405
19406 pub fn parse_optional_select_item_replace(
19408 &mut self,
19409 ) -> Result<Option<ReplaceSelectItem>, ParserError> {
19410 let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
19411 if self.consume_token(&Token::LParen) {
19412 let items = self.parse_comma_separated(|parser| {
19413 Ok(Box::new(parser.parse_replace_elements()?))
19414 })?;
19415 self.expect_token(&Token::RParen)?;
19416 Some(ReplaceSelectItem { items })
19417 } else {
19418 let tok = self.next_token();
19419 return self.expected("( after REPLACE but", tok);
19420 }
19421 } else {
19422 None
19423 };
19424
19425 Ok(opt_replace)
19426 }
19427 pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
19429 let expr = self.parse_expr()?;
19430 let as_keyword = self.parse_keyword(Keyword::AS);
19431 let ident = self.parse_identifier()?;
19432 Ok(ReplaceSelectElement {
19433 expr,
19434 column_name: ident,
19435 as_keyword,
19436 })
19437 }
19438
19439 pub fn parse_asc_desc(&mut self) -> Option<bool> {
19442 if self.parse_keyword(Keyword::ASC) {
19443 Some(true)
19444 } else if self.parse_keyword(Keyword::DESC) {
19445 Some(false)
19446 } else {
19447 None
19448 }
19449 }
19450
19451 pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
19453 self.parse_order_by_expr_inner(false)
19454 .map(|(order_by, _)| order_by)
19455 }
19456
19457 pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
19459 self.parse_order_by_expr_inner(true)
19460 .map(|(column, operator_class)| IndexColumn {
19461 column,
19462 operator_class,
19463 })
19464 }
19465
19466 fn parse_order_by_expr_inner(
19467 &mut self,
19468 with_operator_class: bool,
19469 ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
19470 let expr = self.parse_expr()?;
19471
19472 let operator_class: Option<ObjectName> = if with_operator_class {
19473 if self
19476 .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
19477 .is_some()
19478 {
19479 None
19480 } else {
19481 self.maybe_parse(|parser| parser.parse_object_name(false))?
19482 }
19483 } else {
19484 None
19485 };
19486
19487 let options = self.parse_order_by_options()?;
19488
19489 let with_fill = if self.dialect.supports_with_fill()
19490 && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
19491 {
19492 Some(self.parse_with_fill()?)
19493 } else {
19494 None
19495 };
19496
19497 Ok((
19498 OrderByExpr {
19499 expr,
19500 options,
19501 with_fill,
19502 },
19503 operator_class,
19504 ))
19505 }
19506
19507 fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19508 let asc = self.parse_asc_desc();
19509
19510 let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19511 Some(true)
19512 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19513 Some(false)
19514 } else {
19515 None
19516 };
19517
19518 Ok(OrderByOptions { asc, nulls_first })
19519 }
19520
19521 pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19525 let from = if self.parse_keyword(Keyword::FROM) {
19526 Some(self.parse_expr()?)
19527 } else {
19528 None
19529 };
19530
19531 let to = if self.parse_keyword(Keyword::TO) {
19532 Some(self.parse_expr()?)
19533 } else {
19534 None
19535 };
19536
19537 let step = if self.parse_keyword(Keyword::STEP) {
19538 Some(self.parse_expr()?)
19539 } else {
19540 None
19541 };
19542
19543 Ok(WithFill { from, to, step })
19544 }
19545
19546 pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19549 if !self.parse_keyword(Keyword::INTERPOLATE) {
19550 return Ok(None);
19551 }
19552
19553 if self.consume_token(&Token::LParen) {
19554 let interpolations =
19555 self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19556 self.expect_token(&Token::RParen)?;
19557 return Ok(Some(Interpolate {
19559 exprs: Some(interpolations),
19560 }));
19561 }
19562
19563 Ok(Some(Interpolate { exprs: None }))
19565 }
19566
19567 pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19569 let column = self.parse_identifier()?;
19570 let expr = if self.parse_keyword(Keyword::AS) {
19571 Some(self.parse_expr()?)
19572 } else {
19573 None
19574 };
19575 Ok(InterpolateExpr { column, expr })
19576 }
19577
19578 pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19581 let quantity = if self.consume_token(&Token::LParen) {
19582 let quantity = self.parse_expr()?;
19583 self.expect_token(&Token::RParen)?;
19584 Some(TopQuantity::Expr(quantity))
19585 } else {
19586 let next_token = self.next_token();
19587 let quantity = match next_token.token {
19588 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19589 _ => self.expected("literal int", next_token)?,
19590 };
19591 Some(TopQuantity::Constant(quantity))
19592 };
19593
19594 let percent = self.parse_keyword(Keyword::PERCENT);
19595
19596 let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19597
19598 Ok(Top {
19599 with_ties,
19600 percent,
19601 quantity,
19602 })
19603 }
19604
19605 pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19607 if self.parse_keyword(Keyword::ALL) {
19608 Ok(None)
19609 } else {
19610 Ok(Some(self.parse_expr()?))
19611 }
19612 }
19613
19614 pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19616 let value = self.parse_expr()?;
19617 let rows = if self.parse_keyword(Keyword::ROW) {
19618 OffsetRows::Row
19619 } else if self.parse_keyword(Keyword::ROWS) {
19620 OffsetRows::Rows
19621 } else {
19622 OffsetRows::None
19623 };
19624 Ok(Offset { value, rows })
19625 }
19626
19627 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19629 let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19630
19631 let (quantity, percent) = if self
19632 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19633 .is_some()
19634 {
19635 (None, false)
19636 } else {
19637 let quantity = Expr::Value(self.parse_value()?);
19638 let percent = self.parse_keyword(Keyword::PERCENT);
19639 let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19640 (Some(quantity), percent)
19641 };
19642
19643 let with_ties = if self.parse_keyword(Keyword::ONLY) {
19644 false
19645 } else {
19646 self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19647 };
19648
19649 Ok(Fetch {
19650 with_ties,
19651 percent,
19652 quantity,
19653 })
19654 }
19655
19656 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19658 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19659 Keyword::UPDATE => LockType::Update,
19660 Keyword::SHARE => LockType::Share,
19661 unexpected_keyword => return Err(ParserError::ParserError(
19662 format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19663 )),
19664 };
19665 let of = if self.parse_keyword(Keyword::OF) {
19666 Some(self.parse_object_name(false)?)
19667 } else {
19668 None
19669 };
19670 let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19671 Some(NonBlock::Nowait)
19672 } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19673 Some(NonBlock::SkipLocked)
19674 } else {
19675 None
19676 };
19677 Ok(LockClause {
19678 lock_type,
19679 of,
19680 nonblock,
19681 })
19682 }
19683
19684 pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19686 self.expect_keyword(Keyword::LOCK)?;
19687
19688 if self.peek_keyword(Keyword::TABLES) {
19689 return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19690 }
19691
19692 let _ = self.parse_keyword(Keyword::TABLE);
19693 let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19694 let lock_mode = if self.parse_keyword(Keyword::IN) {
19695 let lock_mode = self.parse_lock_table_mode()?;
19696 self.expect_keyword(Keyword::MODE)?;
19697 Some(lock_mode)
19698 } else {
19699 None
19700 };
19701 let nowait = self.parse_keyword(Keyword::NOWAIT);
19702
19703 Ok(Lock {
19704 tables,
19705 lock_mode,
19706 nowait,
19707 })
19708 }
19709
19710 fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19711 let only = self.parse_keyword(Keyword::ONLY);
19712 let name = self.parse_object_name(false)?;
19713 let has_asterisk = self.consume_token(&Token::Mul);
19714
19715 Ok(LockTableTarget {
19716 name,
19717 only,
19718 has_asterisk,
19719 })
19720 }
19721
19722 fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19723 if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19724 Ok(LockTableMode::AccessShare)
19725 } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19726 Ok(LockTableMode::AccessExclusive)
19727 } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19728 Ok(LockTableMode::RowShare)
19729 } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19730 Ok(LockTableMode::RowExclusive)
19731 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19732 Ok(LockTableMode::ShareUpdateExclusive)
19733 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19734 Ok(LockTableMode::ShareRowExclusive)
19735 } else if self.parse_keyword(Keyword::SHARE) {
19736 Ok(LockTableMode::Share)
19737 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19738 Ok(LockTableMode::Exclusive)
19739 } else {
19740 self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19741 }
19742 }
19743
19744 pub fn parse_values(
19746 &mut self,
19747 allow_empty: bool,
19748 value_keyword: bool,
19749 ) -> Result<Values, ParserError> {
19750 let mut explicit_row = false;
19751
19752 let rows = self.parse_comma_separated(|parser| {
19753 if parser.parse_keyword(Keyword::ROW) {
19754 explicit_row = true;
19755 }
19756
19757 parser.expect_token(&Token::LParen)?;
19758 if allow_empty && parser.peek_token().token == Token::RParen {
19759 parser.next_token();
19760 Ok(vec![])
19761 } else {
19762 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
19763 parser.expect_token(&Token::RParen)?;
19764 Ok(exprs)
19765 }
19766 })?;
19767 Ok(Values {
19768 explicit_row,
19769 rows,
19770 value_keyword,
19771 })
19772 }
19773
19774 pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19776 self.expect_keyword_is(Keyword::TRANSACTION)?;
19777 Ok(Statement::StartTransaction {
19778 modes: self.parse_transaction_modes()?,
19779 begin: false,
19780 transaction: Some(BeginTransactionKind::Transaction),
19781 modifier: None,
19782 statements: vec![],
19783 exception: None,
19784 has_end_keyword: false,
19785 })
19786 }
19787
19788 pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19790 if !self.dialect.supports_start_transaction_modifier() {
19791 None
19792 } else if self.parse_keyword(Keyword::DEFERRED) {
19793 Some(TransactionModifier::Deferred)
19794 } else if self.parse_keyword(Keyword::IMMEDIATE) {
19795 Some(TransactionModifier::Immediate)
19796 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19797 Some(TransactionModifier::Exclusive)
19798 } else if self.parse_keyword(Keyword::TRY) {
19799 Some(TransactionModifier::Try)
19800 } else if self.parse_keyword(Keyword::CATCH) {
19801 Some(TransactionModifier::Catch)
19802 } else {
19803 None
19804 }
19805 }
19806
19807 pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19809 let modifier = self.parse_transaction_modifier();
19810 let transaction =
19811 match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19812 {
19813 Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19814 Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19815 Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19816 _ => None,
19817 };
19818 Ok(Statement::StartTransaction {
19819 modes: self.parse_transaction_modes()?,
19820 begin: true,
19821 transaction,
19822 modifier,
19823 statements: vec![],
19824 exception: None,
19825 has_end_keyword: false,
19826 })
19827 }
19828
19829 pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19831 let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19832
19833 let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19834 let mut when = Vec::new();
19835
19836 while !self.peek_keyword(Keyword::END) {
19838 self.expect_keyword(Keyword::WHEN)?;
19839
19840 let mut idents = Vec::new();
19844
19845 while !self.parse_keyword(Keyword::THEN) {
19846 let ident = self.parse_identifier()?;
19847 idents.push(ident);
19848
19849 self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19850 }
19851
19852 let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19853
19854 when.push(ExceptionWhen { idents, statements });
19855 }
19856
19857 Some(when)
19858 } else {
19859 None
19860 };
19861
19862 self.expect_keyword(Keyword::END)?;
19863
19864 Ok(Statement::StartTransaction {
19865 begin: true,
19866 statements,
19867 exception,
19868 has_end_keyword: true,
19869 transaction: None,
19870 modifier: None,
19871 modes: Default::default(),
19872 })
19873 }
19874
19875 pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19877 let modifier = if !self.dialect.supports_end_transaction_modifier() {
19878 None
19879 } else if self.parse_keyword(Keyword::TRY) {
19880 Some(TransactionModifier::Try)
19881 } else if self.parse_keyword(Keyword::CATCH) {
19882 Some(TransactionModifier::Catch)
19883 } else {
19884 None
19885 };
19886 Ok(Statement::Commit {
19887 chain: self.parse_commit_rollback_chain()?,
19888 end: true,
19889 modifier,
19890 })
19891 }
19892
19893 pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19895 let mut modes = vec![];
19896 let mut required = false;
19897 loop {
19898 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19899 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19900 TransactionIsolationLevel::ReadUncommitted
19901 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19902 TransactionIsolationLevel::ReadCommitted
19903 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19904 TransactionIsolationLevel::RepeatableRead
19905 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19906 TransactionIsolationLevel::Serializable
19907 } else if self.parse_keyword(Keyword::SNAPSHOT) {
19908 TransactionIsolationLevel::Snapshot
19909 } else {
19910 self.expected_ref("isolation level", self.peek_token_ref())?
19911 };
19912 TransactionMode::IsolationLevel(iso_level)
19913 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19914 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19915 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19916 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19917 } else if required {
19918 self.expected_ref("transaction mode", self.peek_token_ref())?
19919 } else {
19920 break;
19921 };
19922 modes.push(mode);
19923 required = self.consume_token(&Token::Comma);
19928 }
19929 Ok(modes)
19930 }
19931
19932 pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19934 Ok(Statement::Commit {
19935 chain: self.parse_commit_rollback_chain()?,
19936 end: false,
19937 modifier: None,
19938 })
19939 }
19940
19941 pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19943 let chain = self.parse_commit_rollback_chain()?;
19944 let savepoint = self.parse_rollback_savepoint()?;
19945
19946 Ok(Statement::Rollback { chain, savepoint })
19947 }
19948
19949 pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19951 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19952 if self.parse_keyword(Keyword::AND) {
19953 let chain = !self.parse_keyword(Keyword::NO);
19954 self.expect_keyword_is(Keyword::CHAIN)?;
19955 Ok(chain)
19956 } else {
19957 Ok(false)
19958 }
19959 }
19960
19961 pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19963 if self.parse_keyword(Keyword::TO) {
19964 let _ = self.parse_keyword(Keyword::SAVEPOINT);
19965 let savepoint = self.parse_identifier()?;
19966
19967 Ok(Some(savepoint))
19968 } else {
19969 Ok(None)
19970 }
19971 }
19972
19973 pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19975 self.expect_token(&Token::LParen)?;
19976 let message = Box::new(self.parse_expr()?);
19977 self.expect_token(&Token::Comma)?;
19978 let severity = Box::new(self.parse_expr()?);
19979 self.expect_token(&Token::Comma)?;
19980 let state = Box::new(self.parse_expr()?);
19981 let arguments = if self.consume_token(&Token::Comma) {
19982 self.parse_comma_separated(Parser::parse_expr)?
19983 } else {
19984 vec![]
19985 };
19986 self.expect_token(&Token::RParen)?;
19987 let options = if self.parse_keyword(Keyword::WITH) {
19988 self.parse_comma_separated(Parser::parse_raiserror_option)?
19989 } else {
19990 vec![]
19991 };
19992 Ok(Statement::RaisError {
19993 message,
19994 severity,
19995 state,
19996 arguments,
19997 options,
19998 })
19999 }
20000
20001 pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
20003 match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
20004 Keyword::LOG => Ok(RaisErrorOption::Log),
20005 Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
20006 Keyword::SETERROR => Ok(RaisErrorOption::SetError),
20007 _ => self.expected_ref(
20008 "LOG, NOWAIT OR SETERROR raiserror option",
20009 self.peek_token_ref(),
20010 ),
20011 }
20012 }
20013
20014 pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
20018 self.expect_keyword_is(Keyword::THROW)?;
20019
20020 let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
20021 let (message, state) = if error_number.is_some() {
20022 self.expect_token(&Token::Comma)?;
20023 let message = Box::new(self.parse_expr()?);
20024 self.expect_token(&Token::Comma)?;
20025 let state = Box::new(self.parse_expr()?);
20026 (Some(message), Some(state))
20027 } else {
20028 (None, None)
20029 };
20030
20031 Ok(ThrowStatement {
20032 error_number,
20033 message,
20034 state,
20035 })
20036 }
20037
20038 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
20040 let prepare = self.parse_keyword(Keyword::PREPARE);
20041 let name = self.parse_identifier()?;
20042 Ok(Statement::Deallocate { name, prepare })
20043 }
20044
20045 pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
20047 let immediate =
20048 self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
20049
20050 let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
20056 None
20057 } else {
20058 Some(self.parse_object_name(false)?)
20059 };
20060
20061 let has_parentheses = self.consume_token(&Token::LParen);
20062
20063 let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
20064 let end_token = match (has_parentheses, self.peek_token().token) {
20065 (true, _) => Token::RParen,
20066 (false, Token::EOF) => Token::EOF,
20067 (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
20068 (false, _) => Token::SemiColon,
20069 };
20070
20071 let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
20072
20073 if has_parentheses {
20074 self.expect_token(&Token::RParen)?;
20075 }
20076
20077 let into = if self.parse_keyword(Keyword::INTO) {
20078 self.parse_comma_separated(Self::parse_identifier)?
20079 } else {
20080 vec![]
20081 };
20082
20083 let using = if self.parse_keyword(Keyword::USING) {
20084 self.parse_comma_separated(Self::parse_expr_with_alias)?
20085 } else {
20086 vec![]
20087 };
20088
20089 let output = self.parse_keyword(Keyword::OUTPUT);
20090
20091 let default = self.parse_keyword(Keyword::DEFAULT);
20092
20093 Ok(Statement::Execute {
20094 immediate,
20095 name,
20096 parameters,
20097 has_parentheses,
20098 into,
20099 using,
20100 output,
20101 default,
20102 })
20103 }
20104
20105 pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
20107 let name = self.parse_identifier()?;
20108
20109 let mut data_types = vec![];
20110 if self.consume_token(&Token::LParen) {
20111 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
20112 self.expect_token(&Token::RParen)?;
20113 }
20114
20115 self.expect_keyword_is(Keyword::AS)?;
20116 let statement = Box::new(self.parse_statement()?);
20117 Ok(Statement::Prepare {
20118 name,
20119 data_types,
20120 statement,
20121 })
20122 }
20123
20124 pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
20126 self.expect_keyword(Keyword::UNLOAD)?;
20127 self.expect_token(&Token::LParen)?;
20128 let (query, query_text) =
20129 if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
20130 (None, Some(self.parse_literal_string()?))
20131 } else {
20132 (Some(self.parse_query()?), None)
20133 };
20134 self.expect_token(&Token::RParen)?;
20135
20136 self.expect_keyword_is(Keyword::TO)?;
20137 let to = self.parse_identifier()?;
20138 let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
20139 Some(self.parse_iam_role_kind()?)
20140 } else {
20141 None
20142 };
20143 let with = self.parse_options(Keyword::WITH)?;
20144 let mut options = vec![];
20145 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
20146 options.push(opt);
20147 }
20148 Ok(Statement::Unload {
20149 query,
20150 query_text,
20151 to,
20152 auth,
20153 with,
20154 options,
20155 })
20156 }
20157
20158 fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
20159 let temporary = self
20160 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
20161 .is_some();
20162 let unlogged = self.parse_keyword(Keyword::UNLOGGED);
20163 let table = self.parse_keyword(Keyword::TABLE);
20164 let name = self.parse_object_name(false)?;
20165
20166 Ok(SelectInto {
20167 temporary,
20168 unlogged,
20169 table,
20170 name,
20171 })
20172 }
20173
20174 fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
20175 let v = self.parse_value()?;
20176 match &v.value {
20177 Value::SingleQuotedString(_) => Ok(v),
20178 Value::DoubleQuotedString(_) => Ok(v),
20179 Value::Number(_, _) => Ok(v),
20180 Value::Placeholder(_) => Ok(v),
20181 _ => {
20182 self.prev_token();
20183 self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
20184 }
20185 }
20186 }
20187
20188 pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
20190 let name = self.parse_object_name(false)?;
20191 if self.consume_token(&Token::LParen) {
20192 let value = self.parse_pragma_value()?;
20193 self.expect_token(&Token::RParen)?;
20194 Ok(Statement::Pragma {
20195 name,
20196 value: Some(value),
20197 is_eq: false,
20198 })
20199 } else if self.consume_token(&Token::Eq) {
20200 Ok(Statement::Pragma {
20201 name,
20202 value: Some(self.parse_pragma_value()?),
20203 is_eq: true,
20204 })
20205 } else {
20206 Ok(Statement::Pragma {
20207 name,
20208 value: None,
20209 is_eq: false,
20210 })
20211 }
20212 }
20213
20214 pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
20216 let extension_name = self.parse_identifier()?;
20217
20218 Ok(Statement::Install { extension_name })
20219 }
20220
20221 pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
20223 if self.dialect.supports_load_extension() {
20224 let extension_name = self.parse_identifier()?;
20225 Ok(Statement::Load { extension_name })
20226 } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
20227 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
20228 self.expect_keyword_is(Keyword::INPATH)?;
20229 let inpath = self.parse_literal_string()?;
20230 let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
20231 self.expect_keyword_is(Keyword::INTO)?;
20232 self.expect_keyword_is(Keyword::TABLE)?;
20233 let table_name = self.parse_object_name(false)?;
20234 let partitioned = self.parse_insert_partition()?;
20235 let table_format = self.parse_load_data_table_format()?;
20236 Ok(Statement::LoadData {
20237 local,
20238 inpath,
20239 overwrite,
20240 table_name,
20241 partitioned,
20242 table_format,
20243 })
20244 } else {
20245 self.expected_ref(
20246 "`DATA` or an extension name after `LOAD`",
20247 self.peek_token_ref(),
20248 )
20249 }
20250 }
20251
20252 pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
20264 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
20265
20266 let name = self.parse_object_name(false)?;
20267
20268 let on_cluster = self.parse_optional_on_cluster()?;
20270
20271 let partition = if self.parse_keyword(Keyword::PARTITION) {
20272 if self.parse_keyword(Keyword::ID) {
20273 Some(Partition::Identifier(self.parse_identifier()?))
20274 } else {
20275 Some(Partition::Expr(self.parse_expr()?))
20276 }
20277 } else {
20278 None
20279 };
20280
20281 let include_final = self.parse_keyword(Keyword::FINAL);
20282
20283 let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
20284 if self.parse_keyword(Keyword::BY) {
20285 Some(Deduplicate::ByExpression(self.parse_expr()?))
20286 } else {
20287 Some(Deduplicate::All)
20288 }
20289 } else {
20290 None
20291 };
20292
20293 let predicate = if self.parse_keyword(Keyword::WHERE) {
20295 Some(self.parse_expr()?)
20296 } else {
20297 None
20298 };
20299
20300 let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
20301 self.expect_token(&Token::LParen)?;
20302 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
20303 self.expect_token(&Token::RParen)?;
20304 Some(columns)
20305 } else {
20306 None
20307 };
20308
20309 Ok(Statement::OptimizeTable {
20310 name,
20311 has_table_keyword,
20312 on_cluster,
20313 partition,
20314 include_final,
20315 deduplicate,
20316 predicate,
20317 zorder,
20318 })
20319 }
20320
20321 pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
20327 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20329 let name = self.parse_object_name(false)?;
20331 let mut data_type: Option<DataType> = None;
20333 if self.parse_keywords(&[Keyword::AS]) {
20334 data_type = Some(self.parse_data_type()?)
20335 }
20336 let sequence_options = self.parse_create_sequence_options()?;
20337 let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
20339 if self.parse_keywords(&[Keyword::NONE]) {
20340 Some(ObjectName::from(vec![Ident::new("NONE")]))
20341 } else {
20342 Some(self.parse_object_name(false)?)
20343 }
20344 } else {
20345 None
20346 };
20347 Ok(Statement::CreateSequence {
20348 temporary,
20349 if_not_exists,
20350 name,
20351 data_type,
20352 sequence_options,
20353 owned_by,
20354 })
20355 }
20356
20357 fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
20358 let mut sequence_options = vec![];
20359 if self.parse_keywords(&[Keyword::INCREMENT]) {
20361 if self.parse_keywords(&[Keyword::BY]) {
20362 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
20363 } else {
20364 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
20365 }
20366 }
20367 if self.parse_keyword(Keyword::MINVALUE) {
20369 sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
20370 } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
20371 sequence_options.push(SequenceOptions::MinValue(None));
20372 }
20373 if self.parse_keywords(&[Keyword::MAXVALUE]) {
20375 sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
20376 } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
20377 sequence_options.push(SequenceOptions::MaxValue(None));
20378 }
20379
20380 if self.parse_keywords(&[Keyword::START]) {
20382 if self.parse_keywords(&[Keyword::WITH]) {
20383 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
20384 } else {
20385 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
20386 }
20387 }
20388 if self.parse_keywords(&[Keyword::CACHE]) {
20390 sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
20391 }
20392 if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
20394 sequence_options.push(SequenceOptions::Cycle(true));
20395 } else if self.parse_keywords(&[Keyword::CYCLE]) {
20396 sequence_options.push(SequenceOptions::Cycle(false));
20397 }
20398
20399 Ok(sequence_options)
20400 }
20401
20402 pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
20406 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20407 let name = self.parse_object_name(false)?;
20408
20409 let server_type = if self.parse_keyword(Keyword::TYPE) {
20410 Some(self.parse_identifier()?)
20411 } else {
20412 None
20413 };
20414
20415 let version = if self.parse_keyword(Keyword::VERSION) {
20416 Some(self.parse_identifier()?)
20417 } else {
20418 None
20419 };
20420
20421 self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
20422 let foreign_data_wrapper = self.parse_object_name(false)?;
20423
20424 let mut options = None;
20425 if self.parse_keyword(Keyword::OPTIONS) {
20426 self.expect_token(&Token::LParen)?;
20427 options = Some(self.parse_comma_separated(|p| {
20428 let key = p.parse_identifier()?;
20429 let value = p.parse_identifier()?;
20430 Ok(CreateServerOption { key, value })
20431 })?);
20432 self.expect_token(&Token::RParen)?;
20433 }
20434
20435 Ok(Statement::CreateServer(CreateServerStatement {
20436 name,
20437 if_not_exists: ine,
20438 server_type,
20439 version,
20440 foreign_data_wrapper,
20441 options,
20442 }))
20443 }
20444
20445 pub fn parse_create_foreign_data_wrapper(
20449 &mut self,
20450 ) -> Result<CreateForeignDataWrapper, ParserError> {
20451 let name = self.parse_identifier()?;
20452
20453 let handler = if self.parse_keyword(Keyword::HANDLER) {
20454 Some(FdwRoutineClause::Function(self.parse_object_name(false)?))
20455 } else if self.parse_keywords(&[Keyword::NO, Keyword::HANDLER]) {
20456 Some(FdwRoutineClause::NoFunction)
20457 } else {
20458 None
20459 };
20460
20461 let validator = if self.parse_keyword(Keyword::VALIDATOR) {
20462 Some(FdwRoutineClause::Function(self.parse_object_name(false)?))
20463 } else if self.parse_keywords(&[Keyword::NO, Keyword::VALIDATOR]) {
20464 Some(FdwRoutineClause::NoFunction)
20465 } else {
20466 None
20467 };
20468
20469 let options = if self.parse_keyword(Keyword::OPTIONS) {
20470 self.expect_token(&Token::LParen)?;
20471 let opts = self.parse_comma_separated(|p| {
20472 let key = p.parse_identifier()?;
20473 let value = p.parse_identifier()?;
20474 Ok(CreateServerOption { key, value })
20475 })?;
20476 self.expect_token(&Token::RParen)?;
20477 Some(opts)
20478 } else {
20479 None
20480 };
20481
20482 Ok(CreateForeignDataWrapper {
20483 name,
20484 handler,
20485 validator,
20486 options,
20487 })
20488 }
20489
20490 pub fn parse_create_foreign_table(&mut self) -> Result<CreateForeignTable, ParserError> {
20494 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20495 let name = self.parse_object_name(false)?;
20496 let (columns, _constraints) = self.parse_columns()?;
20497 self.expect_keyword_is(Keyword::SERVER)?;
20498 let server_name = self.parse_identifier()?;
20499
20500 let options = if self.parse_keyword(Keyword::OPTIONS) {
20501 self.expect_token(&Token::LParen)?;
20502 let opts = self.parse_comma_separated(|p| {
20503 let key = p.parse_identifier()?;
20504 let value = p.parse_identifier()?;
20505 Ok(CreateServerOption { key, value })
20506 })?;
20507 self.expect_token(&Token::RParen)?;
20508 Some(opts)
20509 } else {
20510 None
20511 };
20512
20513 Ok(CreateForeignTable {
20514 name,
20515 if_not_exists,
20516 columns,
20517 server_name,
20518 options,
20519 })
20520 }
20521
20522 pub fn parse_create_publication(&mut self) -> Result<CreatePublication, ParserError> {
20526 let name = self.parse_identifier()?;
20527
20528 let target = if self.parse_keyword(Keyword::FOR) {
20529 if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES]) {
20530 Some(PublicationTarget::AllTables)
20531 } else if self.parse_keyword(Keyword::TABLE) {
20532 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
20533 Some(PublicationTarget::Tables(tables))
20534 } else if self.parse_keywords(&[Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
20535 let schemas = self.parse_comma_separated(|p| p.parse_identifier())?;
20536 Some(PublicationTarget::TablesInSchema(schemas))
20537 } else {
20538 return self.expected_ref(
20539 "ALL TABLES, TABLE, or TABLES IN SCHEMA after FOR",
20540 self.peek_token_ref(),
20541 );
20542 }
20543 } else {
20544 None
20545 };
20546
20547 let with_options = self.parse_options(Keyword::WITH)?;
20548
20549 Ok(CreatePublication {
20550 name,
20551 target,
20552 with_options,
20553 })
20554 }
20555
20556 pub fn parse_create_subscription(&mut self) -> Result<CreateSubscription, ParserError> {
20560 let name = self.parse_identifier()?;
20561 self.expect_keyword_is(Keyword::CONNECTION)?;
20562 let connection = self.parse_value()?.value;
20563 self.expect_keyword_is(Keyword::PUBLICATION)?;
20564 let publications = self.parse_comma_separated(|p| p.parse_identifier())?;
20565 let with_options = self.parse_options(Keyword::WITH)?;
20566
20567 Ok(CreateSubscription {
20568 name,
20569 connection,
20570 publications,
20571 with_options,
20572 })
20573 }
20574
20575 pub fn parse_create_cast(&mut self) -> Result<CreateCast, ParserError> {
20579 self.expect_token(&Token::LParen)?;
20580 let source_type = self.parse_data_type()?;
20581 self.expect_keyword_is(Keyword::AS)?;
20582 let target_type = self.parse_data_type()?;
20583 self.expect_token(&Token::RParen)?;
20584
20585 let function_kind = if self.parse_keywords(&[Keyword::WITHOUT, Keyword::FUNCTION]) {
20586 CastFunctionKind::WithoutFunction
20587 } else if self.parse_keywords(&[Keyword::WITH, Keyword::INOUT]) {
20588 CastFunctionKind::WithInout
20589 } else if self.parse_keywords(&[Keyword::WITH, Keyword::FUNCTION]) {
20590 let function_name = self.parse_object_name(false)?;
20591 let argument_types = if self.peek_token_ref().token == Token::LParen {
20592 self.expect_token(&Token::LParen)?;
20593 let types = if self.peek_token_ref().token == Token::RParen {
20594 vec![]
20595 } else {
20596 self.parse_comma_separated(|p| p.parse_data_type())?
20597 };
20598 self.expect_token(&Token::RParen)?;
20599 types
20600 } else {
20601 vec![]
20602 };
20603 CastFunctionKind::WithFunction {
20604 function_name,
20605 argument_types,
20606 }
20607 } else {
20608 return self.expected_ref(
20609 "WITH FUNCTION, WITHOUT FUNCTION, or WITH INOUT",
20610 self.peek_token_ref(),
20611 );
20612 };
20613
20614 let cast_context = if self.parse_keyword(Keyword::AS) {
20615 if self.parse_keyword(Keyword::ASSIGNMENT) {
20616 CastContext::Assignment
20617 } else if self.parse_keyword(Keyword::IMPLICIT) {
20618 CastContext::Implicit
20619 } else {
20620 return self.expected_ref("ASSIGNMENT or IMPLICIT after AS", self.peek_token_ref());
20621 }
20622 } else {
20623 CastContext::Explicit
20624 };
20625
20626 Ok(CreateCast {
20627 source_type,
20628 target_type,
20629 function_kind,
20630 cast_context,
20631 })
20632 }
20633
20634 pub fn parse_create_conversion(
20638 &mut self,
20639 is_default: bool,
20640 ) -> Result<CreateConversion, ParserError> {
20641 let name = self.parse_object_name(false)?;
20642 self.expect_keyword_is(Keyword::FOR)?;
20643 let source_encoding = self.parse_literal_string()?;
20644 self.expect_keyword_is(Keyword::TO)?;
20645 let destination_encoding = self.parse_literal_string()?;
20646 self.expect_keyword_is(Keyword::FROM)?;
20647 let function_name = self.parse_object_name(false)?;
20648
20649 Ok(CreateConversion {
20650 name,
20651 is_default,
20652 source_encoding,
20653 destination_encoding,
20654 function_name,
20655 })
20656 }
20657
20658 pub fn parse_create_language(
20662 &mut self,
20663 or_replace: bool,
20664 trusted: bool,
20665 procedural: bool,
20666 ) -> Result<CreateLanguage, ParserError> {
20667 let name = self.parse_identifier()?;
20668
20669 let handler = if self.parse_keyword(Keyword::HANDLER) {
20670 Some(self.parse_object_name(false)?)
20671 } else {
20672 None
20673 };
20674
20675 let inline_handler = if self.parse_keyword(Keyword::INLINE) {
20676 Some(self.parse_object_name(false)?)
20677 } else {
20678 None
20679 };
20680
20681 let validator = if self.parse_keywords(&[Keyword::NO, Keyword::VALIDATOR]) {
20682 None
20683 } else if self.parse_keyword(Keyword::VALIDATOR) {
20684 Some(self.parse_object_name(false)?)
20685 } else {
20686 None
20687 };
20688
20689 Ok(CreateLanguage {
20690 name,
20691 or_replace,
20692 trusted,
20693 procedural,
20694 handler,
20695 inline_handler,
20696 validator,
20697 })
20698 }
20699
20700 pub fn parse_create_rule(&mut self) -> Result<CreateRule, ParserError> {
20704 let name = self.parse_identifier()?;
20705 self.expect_keyword_is(Keyword::AS)?;
20706 self.expect_keyword_is(Keyword::ON)?;
20707
20708 let event = if self.parse_keyword(Keyword::SELECT) {
20709 RuleEvent::Select
20710 } else if self.parse_keyword(Keyword::INSERT) {
20711 RuleEvent::Insert
20712 } else if self.parse_keyword(Keyword::UPDATE) {
20713 RuleEvent::Update
20714 } else if self.parse_keyword(Keyword::DELETE) {
20715 RuleEvent::Delete
20716 } else {
20717 return self.expected_ref(
20718 "SELECT, INSERT, UPDATE, or DELETE after ON",
20719 self.peek_token_ref(),
20720 );
20721 };
20722
20723 self.expect_keyword_is(Keyword::TO)?;
20724 let table = self.parse_object_name(false)?;
20725
20726 let condition = if self.parse_keyword(Keyword::WHERE) {
20727 Some(self.parse_expr()?)
20728 } else {
20729 None
20730 };
20731
20732 self.expect_keyword_is(Keyword::DO)?;
20733
20734 let instead = self.parse_keyword(Keyword::INSTEAD);
20735 if !instead {
20736 let _ = self.parse_keyword(Keyword::ALSO);
20738 }
20739
20740 let action = if self.parse_keyword(Keyword::NOTHING) {
20741 RuleAction::Nothing
20742 } else if self.peek_token_ref().token == Token::LParen {
20743 self.expect_token(&Token::LParen)?;
20744 let mut stmts = Vec::new();
20745 loop {
20746 stmts.push(self.parse_statement()?);
20747 if !self.consume_token(&Token::SemiColon) {
20748 break;
20749 }
20750 if self.peek_token_ref().token == Token::RParen {
20751 break;
20752 }
20753 }
20754 self.expect_token(&Token::RParen)?;
20755 RuleAction::Statements(stmts)
20756 } else {
20757 let stmt = self.parse_statement()?;
20758 RuleAction::Statements(vec![stmt])
20759 };
20760
20761 Ok(CreateRule {
20762 name,
20763 event,
20764 table,
20765 condition,
20766 instead,
20767 action,
20768 })
20769 }
20770
20771 pub fn parse_create_statistics(&mut self) -> Result<CreateStatistics, ParserError> {
20775 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20776 let name = self.parse_object_name(false)?;
20777
20778 let kinds = if self.consume_token(&Token::LParen) {
20779 let kinds = self.parse_comma_separated(|p| {
20780 let ident = p.parse_identifier()?;
20781 match ident.value.to_lowercase().as_str() {
20782 "ndistinct" => Ok(StatisticsKind::NDistinct),
20783 "dependencies" => Ok(StatisticsKind::Dependencies),
20784 "mcv" => Ok(StatisticsKind::Mcv),
20785 other => Err(ParserError::ParserError(format!(
20786 "Unknown statistics kind: {other}"
20787 ))),
20788 }
20789 })?;
20790 self.expect_token(&Token::RParen)?;
20791 kinds
20792 } else {
20793 vec![]
20794 };
20795
20796 self.expect_keyword_is(Keyword::ON)?;
20797 let on = self.parse_comma_separated(Parser::parse_expr)?;
20798 self.expect_keyword_is(Keyword::FROM)?;
20799 let from = self.parse_object_name(false)?;
20800
20801 Ok(CreateStatistics {
20802 if_not_exists,
20803 name,
20804 kinds,
20805 on,
20806 from,
20807 })
20808 }
20809
20810 pub fn parse_create_access_method(&mut self) -> Result<CreateAccessMethod, ParserError> {
20814 let name = self.parse_identifier()?;
20815 self.expect_keyword_is(Keyword::TYPE)?;
20816 let method_type = if self.parse_keyword(Keyword::INDEX) {
20817 AccessMethodType::Index
20818 } else if self.parse_keyword(Keyword::TABLE) {
20819 AccessMethodType::Table
20820 } else {
20821 return self.expected_ref("INDEX or TABLE after TYPE", self.peek_token_ref());
20822 };
20823 self.expect_keyword_is(Keyword::HANDLER)?;
20824 let handler = self.parse_object_name(false)?;
20825
20826 Ok(CreateAccessMethod {
20827 name,
20828 method_type,
20829 handler,
20830 })
20831 }
20832
20833 pub fn parse_create_event_trigger(&mut self) -> Result<CreateEventTrigger, ParserError> {
20837 let name = self.parse_identifier()?;
20838 self.expect_keyword_is(Keyword::ON)?;
20839 let event_ident = self.parse_identifier()?;
20840 let event = match event_ident.value.to_lowercase().as_str() {
20841 "ddl_command_start" => EventTriggerEvent::DdlCommandStart,
20842 "ddl_command_end" => EventTriggerEvent::DdlCommandEnd,
20843 "table_rewrite" => EventTriggerEvent::TableRewrite,
20844 "sql_drop" => EventTriggerEvent::SqlDrop,
20845 other => {
20846 return Err(ParserError::ParserError(format!(
20847 "Unknown event trigger event: {other}"
20848 )))
20849 }
20850 };
20851
20852 let when_tags = if self.parse_keyword(Keyword::WHEN) {
20853 self.expect_keyword_is(Keyword::TAG)?;
20854 self.expect_keyword_is(Keyword::IN)?;
20855 self.expect_token(&Token::LParen)?;
20856 let tags = self.parse_comma_separated(|p| p.parse_value().map(|v| v.value))?;
20857 self.expect_token(&Token::RParen)?;
20858 Some(tags)
20859 } else {
20860 None
20861 };
20862
20863 self.expect_keyword_is(Keyword::EXECUTE)?;
20864 let is_procedure = if self.parse_keyword(Keyword::FUNCTION) {
20865 false
20866 } else if self.parse_keyword(Keyword::PROCEDURE) {
20867 true
20868 } else {
20869 return self.expected_ref("FUNCTION or PROCEDURE after EXECUTE", self.peek_token_ref());
20870 };
20871 let execute = self.parse_object_name(false)?;
20872 self.expect_token(&Token::LParen)?;
20873 self.expect_token(&Token::RParen)?;
20874
20875 Ok(CreateEventTrigger {
20876 name,
20877 event,
20878 when_tags,
20879 execute,
20880 is_procedure,
20881 })
20882 }
20883
20884 pub fn parse_create_transform(
20888 &mut self,
20889 or_replace: bool,
20890 ) -> Result<CreateTransform, ParserError> {
20891 self.expect_keyword_is(Keyword::FOR)?;
20892 let type_name = self.parse_data_type()?;
20893 self.expect_keyword_is(Keyword::LANGUAGE)?;
20894 let language = self.parse_identifier()?;
20895 self.expect_token(&Token::LParen)?;
20896 let elements = self.parse_comma_separated(|p| {
20897 let is_from = if p.parse_keyword(Keyword::FROM) {
20898 true
20899 } else {
20900 p.expect_keyword_is(Keyword::TO)?;
20901 false
20902 };
20903 p.expect_keyword_is(Keyword::SQL)?;
20904 p.expect_keyword_is(Keyword::WITH)?;
20905 p.expect_keyword_is(Keyword::FUNCTION)?;
20906 let function = p.parse_object_name(false)?;
20907 p.expect_token(&Token::LParen)?;
20908 let arg_types = if p.peek_token().token == Token::RParen {
20909 vec![]
20910 } else {
20911 p.parse_comma_separated(|p| p.parse_data_type())?
20912 };
20913 p.expect_token(&Token::RParen)?;
20914 Ok(TransformElement {
20915 is_from,
20916 function,
20917 arg_types,
20918 })
20919 })?;
20920 self.expect_token(&Token::RParen)?;
20921
20922 Ok(CreateTransform {
20923 or_replace,
20924 type_name,
20925 language,
20926 elements,
20927 })
20928 }
20929
20930 pub fn parse_security_label(&mut self) -> Result<SecurityLabel, ParserError> {
20934 self.expect_keyword_is(Keyword::LABEL)?;
20935
20936 let provider = if self.parse_keyword(Keyword::FOR) {
20937 Some(self.parse_identifier()?)
20938 } else {
20939 None
20940 };
20941
20942 self.expect_keyword_is(Keyword::ON)?;
20943
20944 let object_kind = if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
20945 SecurityLabelObjectKind::MaterializedView
20946 } else if self.parse_keyword(Keyword::TABLE) {
20947 SecurityLabelObjectKind::Table
20948 } else if self.parse_keyword(Keyword::COLUMN) {
20949 SecurityLabelObjectKind::Column
20950 } else if self.parse_keyword(Keyword::DATABASE) {
20951 SecurityLabelObjectKind::Database
20952 } else if self.parse_keyword(Keyword::DOMAIN) {
20953 SecurityLabelObjectKind::Domain
20954 } else if self.parse_keyword(Keyword::FUNCTION) {
20955 SecurityLabelObjectKind::Function
20956 } else if self.parse_keyword(Keyword::ROLE) {
20957 SecurityLabelObjectKind::Role
20958 } else if self.parse_keyword(Keyword::SCHEMA) {
20959 SecurityLabelObjectKind::Schema
20960 } else if self.parse_keyword(Keyword::SEQUENCE) {
20961 SecurityLabelObjectKind::Sequence
20962 } else if self.parse_keyword(Keyword::TYPE) {
20963 SecurityLabelObjectKind::Type
20964 } else if self.parse_keyword(Keyword::VIEW) {
20965 SecurityLabelObjectKind::View
20966 } else {
20967 return self.expected_ref(
20968 "TABLE, COLUMN, DATABASE, DOMAIN, FUNCTION, MATERIALIZED VIEW, ROLE, SCHEMA, SEQUENCE, TYPE, or VIEW after ON",
20969 self.peek_token_ref(),
20970 );
20971 };
20972
20973 let object_name = self.parse_object_name(false)?;
20974
20975 self.expect_keyword_is(Keyword::IS)?;
20976
20977 let label = if self.parse_keyword(Keyword::NULL) {
20978 None
20979 } else {
20980 Some(self.parse_value()?.value)
20981 };
20982
20983 Ok(SecurityLabel {
20984 provider,
20985 object_kind,
20986 object_name,
20987 label,
20988 })
20989 }
20990
20991 pub fn parse_create_user_mapping(&mut self) -> Result<CreateUserMapping, ParserError> {
20995 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20996
20997 self.expect_keyword_is(Keyword::FOR)?;
20998
20999 let user = if self.parse_keyword(Keyword::CURRENT_ROLE) {
21000 UserMappingUser::CurrentRole
21001 } else if self.parse_keyword(Keyword::CURRENT_USER) {
21002 UserMappingUser::CurrentUser
21003 } else if self.parse_keyword(Keyword::PUBLIC) {
21004 UserMappingUser::Public
21005 } else if self.parse_keyword(Keyword::USER) {
21006 UserMappingUser::User
21007 } else {
21008 UserMappingUser::Ident(self.parse_identifier()?)
21009 };
21010
21011 self.expect_keyword_is(Keyword::SERVER)?;
21012 let server_name = self.parse_identifier()?;
21013
21014 let options = if self.parse_keyword(Keyword::OPTIONS) {
21015 self.expect_token(&Token::LParen)?;
21016 let opts = self.parse_comma_separated(|p| {
21017 let key = p.parse_identifier()?;
21018 let value = p.parse_identifier()?;
21019 Ok(CreateServerOption { key, value })
21020 })?;
21021 self.expect_token(&Token::RParen)?;
21022 Some(opts)
21023 } else {
21024 None
21025 };
21026
21027 Ok(CreateUserMapping {
21028 if_not_exists,
21029 user,
21030 server_name,
21031 options,
21032 })
21033 }
21034
21035 pub fn parse_create_tablespace(&mut self) -> Result<CreateTablespace, ParserError> {
21039 let name = self.parse_identifier()?;
21040
21041 let owner = if self.parse_keyword(Keyword::OWNER) {
21042 Some(self.parse_identifier()?)
21043 } else {
21044 None
21045 };
21046
21047 self.expect_keyword_is(Keyword::LOCATION)?;
21048 let location = self.parse_value()?.value;
21049
21050 let with_options = self.parse_options(Keyword::WITH)?;
21051
21052 Ok(CreateTablespace {
21053 name,
21054 owner,
21055 location,
21056 with_options,
21057 })
21058 }
21059
21060 pub fn index(&self) -> usize {
21062 self.index
21063 }
21064
21065 pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
21067 let ident = self.parse_identifier()?;
21068 self.expect_keyword_is(Keyword::AS)?;
21069
21070 let window_expr = if self.consume_token(&Token::LParen) {
21071 NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
21072 } else if self.dialect.supports_window_clause_named_window_reference() {
21073 NamedWindowExpr::NamedWindow(self.parse_identifier()?)
21074 } else {
21075 return self.expected_ref("(", self.peek_token_ref());
21076 };
21077
21078 Ok(NamedWindowDefinition(ident, window_expr))
21079 }
21080
21081 pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
21083 let name = self.parse_object_name(false)?;
21084 let params = self.parse_optional_procedure_parameters()?;
21085
21086 let language = if self.parse_keyword(Keyword::LANGUAGE) {
21087 Some(self.parse_identifier()?)
21088 } else {
21089 None
21090 };
21091
21092 self.expect_keyword_is(Keyword::AS)?;
21093
21094 let body = self.parse_conditional_statements(&[Keyword::END])?;
21095
21096 Ok(Statement::CreateProcedure {
21097 name,
21098 or_alter,
21099 params,
21100 language,
21101 body,
21102 })
21103 }
21104
21105 pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
21107 let window_name = match &self.peek_token_ref().token {
21108 Token::Word(word) if word.keyword == Keyword::NoKeyword => {
21109 self.parse_optional_ident()?
21110 }
21111 _ => None,
21112 };
21113
21114 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
21115 self.parse_comma_separated(Parser::parse_expr)?
21116 } else {
21117 vec![]
21118 };
21119 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
21120 self.parse_comma_separated(Parser::parse_order_by_expr)?
21121 } else {
21122 vec![]
21123 };
21124
21125 let window_frame = if !self.consume_token(&Token::RParen) {
21126 let window_frame = self.parse_window_frame()?;
21127 self.expect_token(&Token::RParen)?;
21128 Some(window_frame)
21129 } else {
21130 None
21131 };
21132 Ok(WindowSpec {
21133 window_name,
21134 partition_by,
21135 order_by,
21136 window_frame,
21137 })
21138 }
21139
21140 pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
21142 let name = self.parse_object_name(false)?;
21143
21144 let has_as = self.parse_keyword(Keyword::AS);
21146
21147 if !has_as {
21148 if self.consume_token(&Token::LParen) {
21150 let options = self.parse_create_type_sql_definition_options()?;
21152 self.expect_token(&Token::RParen)?;
21153 return Ok(Statement::CreateType {
21154 name,
21155 representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
21156 });
21157 }
21158
21159 return Ok(Statement::CreateType {
21161 name,
21162 representation: None,
21163 });
21164 }
21165
21166 if self.parse_keyword(Keyword::ENUM) {
21168 self.parse_create_type_enum(name)
21170 } else if self.parse_keyword(Keyword::RANGE) {
21171 self.parse_create_type_range(name)
21173 } else if self.consume_token(&Token::LParen) {
21174 self.parse_create_type_composite(name)
21176 } else {
21177 self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
21178 }
21179 }
21180
21181 fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
21185 if self.consume_token(&Token::RParen) {
21186 return Ok(Statement::CreateType {
21188 name,
21189 representation: Some(UserDefinedTypeRepresentation::Composite {
21190 attributes: vec![],
21191 }),
21192 });
21193 }
21194
21195 let mut attributes = vec![];
21196 loop {
21197 let attr_name = self.parse_identifier()?;
21198 let attr_data_type = self.parse_data_type()?;
21199 let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
21200 Some(self.parse_object_name(false)?)
21201 } else {
21202 None
21203 };
21204 attributes.push(UserDefinedTypeCompositeAttributeDef {
21205 name: attr_name,
21206 data_type: attr_data_type,
21207 collation: attr_collation,
21208 });
21209
21210 if !self.consume_token(&Token::Comma) {
21211 break;
21212 }
21213 }
21214 self.expect_token(&Token::RParen)?;
21215
21216 Ok(Statement::CreateType {
21217 name,
21218 representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
21219 })
21220 }
21221
21222 pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
21226 self.expect_token(&Token::LParen)?;
21227 let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
21228 self.expect_token(&Token::RParen)?;
21229
21230 Ok(Statement::CreateType {
21231 name,
21232 representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
21233 })
21234 }
21235
21236 fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
21240 self.expect_token(&Token::LParen)?;
21241 let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
21242 self.expect_token(&Token::RParen)?;
21243
21244 Ok(Statement::CreateType {
21245 name,
21246 representation: Some(UserDefinedTypeRepresentation::Range { options }),
21247 })
21248 }
21249
21250 fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
21252 let keyword = self.parse_one_of_keywords(&[
21253 Keyword::SUBTYPE,
21254 Keyword::SUBTYPE_OPCLASS,
21255 Keyword::COLLATION,
21256 Keyword::CANONICAL,
21257 Keyword::SUBTYPE_DIFF,
21258 Keyword::MULTIRANGE_TYPE_NAME,
21259 ]);
21260
21261 match keyword {
21262 Some(Keyword::SUBTYPE) => {
21263 self.expect_token(&Token::Eq)?;
21264 let data_type = self.parse_data_type()?;
21265 Ok(UserDefinedTypeRangeOption::Subtype(data_type))
21266 }
21267 Some(Keyword::SUBTYPE_OPCLASS) => {
21268 self.expect_token(&Token::Eq)?;
21269 let name = self.parse_object_name(false)?;
21270 Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
21271 }
21272 Some(Keyword::COLLATION) => {
21273 self.expect_token(&Token::Eq)?;
21274 let name = self.parse_object_name(false)?;
21275 Ok(UserDefinedTypeRangeOption::Collation(name))
21276 }
21277 Some(Keyword::CANONICAL) => {
21278 self.expect_token(&Token::Eq)?;
21279 let name = self.parse_object_name(false)?;
21280 Ok(UserDefinedTypeRangeOption::Canonical(name))
21281 }
21282 Some(Keyword::SUBTYPE_DIFF) => {
21283 self.expect_token(&Token::Eq)?;
21284 let name = self.parse_object_name(false)?;
21285 Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
21286 }
21287 Some(Keyword::MULTIRANGE_TYPE_NAME) => {
21288 self.expect_token(&Token::Eq)?;
21289 let name = self.parse_object_name(false)?;
21290 Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
21291 }
21292 _ => self.expected_ref("range option keyword", self.peek_token_ref()),
21293 }
21294 }
21295
21296 fn parse_create_type_sql_definition_options(
21298 &mut self,
21299 ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
21300 self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
21301 }
21302
21303 fn parse_sql_definition_option(
21305 &mut self,
21306 ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
21307 let keyword = self.parse_one_of_keywords(&[
21308 Keyword::INPUT,
21309 Keyword::OUTPUT,
21310 Keyword::RECEIVE,
21311 Keyword::SEND,
21312 Keyword::TYPMOD_IN,
21313 Keyword::TYPMOD_OUT,
21314 Keyword::ANALYZE,
21315 Keyword::SUBSCRIPT,
21316 Keyword::INTERNALLENGTH,
21317 Keyword::PASSEDBYVALUE,
21318 Keyword::ALIGNMENT,
21319 Keyword::STORAGE,
21320 Keyword::LIKE,
21321 Keyword::CATEGORY,
21322 Keyword::PREFERRED,
21323 Keyword::DEFAULT,
21324 Keyword::ELEMENT,
21325 Keyword::DELIMITER,
21326 Keyword::COLLATABLE,
21327 ]);
21328
21329 match keyword {
21330 Some(Keyword::INPUT) => {
21331 self.expect_token(&Token::Eq)?;
21332 let name = self.parse_object_name(false)?;
21333 Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
21334 }
21335 Some(Keyword::OUTPUT) => {
21336 self.expect_token(&Token::Eq)?;
21337 let name = self.parse_object_name(false)?;
21338 Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
21339 }
21340 Some(Keyword::RECEIVE) => {
21341 self.expect_token(&Token::Eq)?;
21342 let name = self.parse_object_name(false)?;
21343 Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
21344 }
21345 Some(Keyword::SEND) => {
21346 self.expect_token(&Token::Eq)?;
21347 let name = self.parse_object_name(false)?;
21348 Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
21349 }
21350 Some(Keyword::TYPMOD_IN) => {
21351 self.expect_token(&Token::Eq)?;
21352 let name = self.parse_object_name(false)?;
21353 Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
21354 }
21355 Some(Keyword::TYPMOD_OUT) => {
21356 self.expect_token(&Token::Eq)?;
21357 let name = self.parse_object_name(false)?;
21358 Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
21359 }
21360 Some(Keyword::ANALYZE) => {
21361 self.expect_token(&Token::Eq)?;
21362 let name = self.parse_object_name(false)?;
21363 Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
21364 }
21365 Some(Keyword::SUBSCRIPT) => {
21366 self.expect_token(&Token::Eq)?;
21367 let name = self.parse_object_name(false)?;
21368 Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
21369 }
21370 Some(Keyword::INTERNALLENGTH) => {
21371 self.expect_token(&Token::Eq)?;
21372 if self.parse_keyword(Keyword::VARIABLE) {
21373 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
21374 UserDefinedTypeInternalLength::Variable,
21375 ))
21376 } else {
21377 let value = self.parse_literal_uint()?;
21378 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
21379 UserDefinedTypeInternalLength::Fixed(value),
21380 ))
21381 }
21382 }
21383 Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
21384 Some(Keyword::ALIGNMENT) => {
21385 self.expect_token(&Token::Eq)?;
21386 let align_keyword = self.parse_one_of_keywords(&[
21387 Keyword::CHAR,
21388 Keyword::INT2,
21389 Keyword::INT4,
21390 Keyword::DOUBLE,
21391 ]);
21392 match align_keyword {
21393 Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21394 Alignment::Char,
21395 )),
21396 Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21397 Alignment::Int2,
21398 )),
21399 Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21400 Alignment::Int4,
21401 )),
21402 Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
21403 Alignment::Double,
21404 )),
21405 _ => self.expected_ref(
21406 "alignment value (char, int2, int4, or double)",
21407 self.peek_token_ref(),
21408 ),
21409 }
21410 }
21411 Some(Keyword::STORAGE) => {
21412 self.expect_token(&Token::Eq)?;
21413 let storage_keyword = self.parse_one_of_keywords(&[
21414 Keyword::PLAIN,
21415 Keyword::EXTERNAL,
21416 Keyword::EXTENDED,
21417 Keyword::MAIN,
21418 ]);
21419 match storage_keyword {
21420 Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21421 UserDefinedTypeStorage::Plain,
21422 )),
21423 Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21424 UserDefinedTypeStorage::External,
21425 )),
21426 Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21427 UserDefinedTypeStorage::Extended,
21428 )),
21429 Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
21430 UserDefinedTypeStorage::Main,
21431 )),
21432 _ => self.expected_ref(
21433 "storage value (plain, external, extended, or main)",
21434 self.peek_token_ref(),
21435 ),
21436 }
21437 }
21438 Some(Keyword::LIKE) => {
21439 self.expect_token(&Token::Eq)?;
21440 let name = self.parse_object_name(false)?;
21441 Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
21442 }
21443 Some(Keyword::CATEGORY) => {
21444 self.expect_token(&Token::Eq)?;
21445 let category_str = self.parse_literal_string()?;
21446 let category_char = category_str.chars().next().ok_or_else(|| {
21447 ParserError::ParserError(
21448 "CATEGORY value must be a single character".to_string(),
21449 )
21450 })?;
21451 Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
21452 }
21453 Some(Keyword::PREFERRED) => {
21454 self.expect_token(&Token::Eq)?;
21455 let value =
21456 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
21457 Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
21458 }
21459 Some(Keyword::DEFAULT) => {
21460 self.expect_token(&Token::Eq)?;
21461 let expr = self.parse_expr()?;
21462 Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
21463 }
21464 Some(Keyword::ELEMENT) => {
21465 self.expect_token(&Token::Eq)?;
21466 let data_type = self.parse_data_type()?;
21467 Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
21468 }
21469 Some(Keyword::DELIMITER) => {
21470 self.expect_token(&Token::Eq)?;
21471 let delimiter = self.parse_literal_string()?;
21472 Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
21473 }
21474 Some(Keyword::COLLATABLE) => {
21475 self.expect_token(&Token::Eq)?;
21476 let value =
21477 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
21478 Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
21479 }
21480 _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
21481 }
21482 }
21483
21484 fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
21485 self.expect_token(&Token::LParen)?;
21486 let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
21487 self.expect_token(&Token::RParen)?;
21488 Ok(idents)
21489 }
21490
21491 fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
21492 if dialect_of!(self is MySqlDialect | GenericDialect) {
21493 if self.parse_keyword(Keyword::FIRST) {
21494 Ok(Some(MySQLColumnPosition::First))
21495 } else if self.parse_keyword(Keyword::AFTER) {
21496 let ident = self.parse_identifier()?;
21497 Ok(Some(MySQLColumnPosition::After(ident)))
21498 } else {
21499 Ok(None)
21500 }
21501 } else {
21502 Ok(None)
21503 }
21504 }
21505
21506 fn parse_print(&mut self) -> Result<Statement, ParserError> {
21508 Ok(Statement::Print(PrintStatement {
21509 message: Box::new(self.parse_expr()?),
21510 }))
21511 }
21512
21513 fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
21517 let wait_type = if self.parse_keyword(Keyword::DELAY) {
21518 WaitForType::Delay
21519 } else if self.parse_keyword(Keyword::TIME) {
21520 WaitForType::Time
21521 } else {
21522 return self.expected_ref("DELAY or TIME", self.peek_token_ref());
21523 };
21524 let expr = self.parse_expr()?;
21525 Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
21526 }
21527
21528 fn parse_return(&mut self) -> Result<Statement, ParserError> {
21530 match self.maybe_parse(|p| p.parse_expr())? {
21531 Some(expr) => Ok(Statement::Return(ReturnStatement {
21532 value: Some(ReturnStatementValue::Expr(expr)),
21533 })),
21534 None => Ok(Statement::Return(ReturnStatement { value: None })),
21535 }
21536 }
21537
21538 fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
21542 self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
21543
21544 let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
21545 Some(self.parse_object_name(false)?)
21546 } else {
21547 None
21548 };
21549 self.expect_keyword(Keyword::OPTIONS)?;
21550 self.expect_token(&Token::LParen)?;
21551 let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
21552 self.expect_token(&Token::RParen)?;
21553 self.expect_keyword(Keyword::AS)?;
21554 let query = self.parse_query()?;
21555 Ok(Statement::ExportData(ExportData {
21556 options,
21557 query,
21558 connection,
21559 }))
21560 }
21561
21562 fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
21563 self.expect_keyword(Keyword::VACUUM)?;
21564 let full = self.parse_keyword(Keyword::FULL);
21565 let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
21566 let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
21567 let reindex = self.parse_keyword(Keyword::REINDEX);
21568 let recluster = self.parse_keyword(Keyword::RECLUSTER);
21569 let (table_name, threshold, boost) =
21570 match self.maybe_parse(|p| p.parse_object_name(false))? {
21571 Some(table_name) => {
21572 let threshold = if self.parse_keyword(Keyword::TO) {
21573 let value = self.parse_value()?;
21574 self.expect_keyword(Keyword::PERCENT)?;
21575 Some(value)
21576 } else {
21577 None
21578 };
21579 let boost = self.parse_keyword(Keyword::BOOST);
21580 (Some(table_name), threshold, boost)
21581 }
21582 _ => (None, None, false),
21583 };
21584 Ok(Statement::Vacuum(VacuumStatement {
21585 full,
21586 sort_only,
21587 delete_only,
21588 reindex,
21589 recluster,
21590 table_name,
21591 threshold,
21592 boost,
21593 }))
21594 }
21595
21596 pub fn into_tokens(self) -> Vec<TokenWithSpan> {
21598 self.tokens
21599 }
21600
21601 fn peek_sub_query(&mut self) -> bool {
21603 self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
21604 .is_some()
21605 }
21606
21607 pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
21608 let show_in;
21609 let mut filter_position = None;
21610 if self.dialect.supports_show_like_before_in() {
21611 if let Some(filter) = self.parse_show_statement_filter()? {
21612 filter_position = Some(ShowStatementFilterPosition::Infix(filter));
21613 }
21614 show_in = self.maybe_parse_show_stmt_in()?;
21615 } else {
21616 show_in = self.maybe_parse_show_stmt_in()?;
21617 if let Some(filter) = self.parse_show_statement_filter()? {
21618 filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
21619 }
21620 }
21621 let starts_with = self.maybe_parse_show_stmt_starts_with()?;
21622 let limit = self.maybe_parse_show_stmt_limit()?;
21623 let from = self.maybe_parse_show_stmt_from()?;
21624 Ok(ShowStatementOptions {
21625 filter_position,
21626 show_in,
21627 starts_with,
21628 limit,
21629 limit_from: from,
21630 })
21631 }
21632
21633 fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
21634 let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
21635 Some(Keyword::FROM) => ShowStatementInClause::FROM,
21636 Some(Keyword::IN) => ShowStatementInClause::IN,
21637 None => return Ok(None),
21638 _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
21639 };
21640
21641 let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
21642 Keyword::ACCOUNT,
21643 Keyword::DATABASE,
21644 Keyword::SCHEMA,
21645 Keyword::TABLE,
21646 Keyword::VIEW,
21647 ]) {
21648 Some(Keyword::DATABASE)
21650 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21651 | self.peek_keyword(Keyword::LIMIT) =>
21652 {
21653 (Some(ShowStatementInParentType::Database), None)
21654 }
21655 Some(Keyword::SCHEMA)
21656 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21657 | self.peek_keyword(Keyword::LIMIT) =>
21658 {
21659 (Some(ShowStatementInParentType::Schema), None)
21660 }
21661 Some(parent_kw) => {
21662 let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
21666 match parent_kw {
21667 Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
21668 Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
21669 Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
21670 Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
21671 Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
21672 _ => {
21673 return self.expected_ref(
21674 "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
21675 self.peek_token_ref(),
21676 )
21677 }
21678 }
21679 }
21680 None => {
21681 let mut parent_name = self.parse_object_name(false)?;
21684 if self
21685 .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
21686 .is_some()
21687 {
21688 parent_name
21689 .0
21690 .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
21691 }
21692 (None, Some(parent_name))
21693 }
21694 };
21695
21696 Ok(Some(ShowStatementIn {
21697 clause,
21698 parent_type,
21699 parent_name,
21700 }))
21701 }
21702
21703 fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21704 if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
21705 Ok(Some(self.parse_value()?))
21706 } else {
21707 Ok(None)
21708 }
21709 }
21710
21711 fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
21712 if self.parse_keyword(Keyword::LIMIT) {
21713 Ok(self.parse_limit()?)
21714 } else {
21715 Ok(None)
21716 }
21717 }
21718
21719 fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21720 if self.parse_keyword(Keyword::FROM) {
21721 Ok(Some(self.parse_value()?))
21722 } else {
21723 Ok(None)
21724 }
21725 }
21726
21727 pub(crate) fn in_column_definition_state(&self) -> bool {
21728 matches!(self.state, ColumnDefinition)
21729 }
21730
21731 pub(crate) fn parse_key_value_options(
21736 &mut self,
21737 parenthesized: bool,
21738 end_words: &[Keyword],
21739 ) -> Result<KeyValueOptions, ParserError> {
21740 let mut options: Vec<KeyValueOption> = Vec::new();
21741 let mut delimiter = KeyValueOptionsDelimiter::Space;
21742 if parenthesized {
21743 self.expect_token(&Token::LParen)?;
21744 }
21745 loop {
21746 match self.next_token().token {
21747 Token::RParen => {
21748 if parenthesized {
21749 break;
21750 } else {
21751 return self.expected_ref(" another option or EOF", self.peek_token_ref());
21752 }
21753 }
21754 Token::EOF | Token::SemiColon => break,
21755 Token::Comma => {
21756 delimiter = KeyValueOptionsDelimiter::Comma;
21757 continue;
21758 }
21759 Token::Word(w) if !end_words.contains(&w.keyword) => {
21760 options.push(self.parse_key_value_option(&w)?)
21761 }
21762 Token::Word(w) if end_words.contains(&w.keyword) => {
21763 self.prev_token();
21764 break;
21765 }
21766 _ => {
21767 return self.expected_ref(
21768 "another option, EOF, SemiColon, Comma or ')'",
21769 self.peek_token_ref(),
21770 )
21771 }
21772 };
21773 }
21774
21775 Ok(KeyValueOptions { delimiter, options })
21776 }
21777
21778 pub(crate) fn parse_key_value_option(
21780 &mut self,
21781 key: &Word,
21782 ) -> Result<KeyValueOption, ParserError> {
21783 self.expect_token(&Token::Eq)?;
21784 let peeked_token = self.peek_token();
21785 match peeked_token.token {
21786 Token::SingleQuotedString(_) => Ok(KeyValueOption {
21787 option_name: key.value.clone(),
21788 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21789 }),
21790 Token::Word(word)
21791 if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
21792 {
21793 Ok(KeyValueOption {
21794 option_name: key.value.clone(),
21795 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21796 })
21797 }
21798 Token::Number(..) => Ok(KeyValueOption {
21799 option_name: key.value.clone(),
21800 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21801 }),
21802 Token::Word(word) => {
21803 self.next_token();
21804 Ok(KeyValueOption {
21805 option_name: key.value.clone(),
21806 option_value: KeyValueOptionKind::Single(
21807 Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
21808 ),
21809 })
21810 }
21811 Token::LParen => {
21812 match self.maybe_parse(|parser| {
21816 parser.expect_token(&Token::LParen)?;
21817 let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
21818 parser.expect_token(&Token::RParen)?;
21819 values
21820 })? {
21821 Some(values) => Ok(KeyValueOption {
21822 option_name: key.value.clone(),
21823 option_value: KeyValueOptionKind::Multi(values),
21824 }),
21825 None => Ok(KeyValueOption {
21826 option_name: key.value.clone(),
21827 option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
21828 self.parse_key_value_options(true, &[])?,
21829 )),
21830 }),
21831 }
21832 }
21833 _ => self.expected_ref("expected option value", self.peek_token_ref()),
21834 }
21835 }
21836
21837 fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
21839 if self.parse_keyword(Keyword::ALL) {
21840 return Ok(ResetStatement { reset: Reset::ALL });
21841 }
21842
21843 let obj = self.parse_object_name(false)?;
21844 Ok(ResetStatement {
21845 reset: Reset::ConfigurationParameter(obj),
21846 })
21847 }
21848}
21849
21850fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
21851 if let Some(prefix) = prefix {
21852 Expr::Prefixed {
21853 prefix,
21854 value: Box::new(expr),
21855 }
21856 } else {
21857 expr
21858 }
21859}
21860
21861impl Word {
21862 pub fn to_ident(&self, span: Span) -> Ident {
21868 Ident {
21869 value: self.value.clone(),
21870 quote_style: self.quote_style,
21871 span,
21872 }
21873 }
21874
21875 pub fn into_ident(self, span: Span) -> Ident {
21880 Ident {
21881 value: self.value,
21882 quote_style: self.quote_style,
21883 span,
21884 }
21885 }
21886}
21887
21888#[cfg(test)]
21889mod tests {
21890 use crate::test_utils::{all_dialects, TestedDialects};
21891
21892 use super::*;
21893
21894 #[test]
21895 fn test_prev_index() {
21896 let sql = "SELECT version";
21897 all_dialects().run_parser_method(sql, |parser| {
21898 assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
21899 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21900 parser.prev_token();
21901 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21902 assert_eq!(parser.next_token(), Token::make_word("version", None));
21903 parser.prev_token();
21904 assert_eq!(parser.peek_token(), Token::make_word("version", None));
21905 assert_eq!(parser.next_token(), Token::make_word("version", None));
21906 assert_eq!(parser.peek_token(), Token::EOF);
21907 parser.prev_token();
21908 assert_eq!(parser.next_token(), Token::make_word("version", None));
21909 assert_eq!(parser.next_token(), Token::EOF);
21910 assert_eq!(parser.next_token(), Token::EOF);
21911 parser.prev_token();
21912 });
21913 }
21914
21915 #[test]
21916 fn test_peek_tokens() {
21917 all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
21918 assert!(matches!(
21919 parser.peek_tokens(),
21920 [Token::Word(Word {
21921 keyword: Keyword::SELECT,
21922 ..
21923 })]
21924 ));
21925
21926 assert!(matches!(
21927 parser.peek_tokens(),
21928 [
21929 Token::Word(Word {
21930 keyword: Keyword::SELECT,
21931 ..
21932 }),
21933 Token::Word(_),
21934 Token::Word(Word {
21935 keyword: Keyword::AS,
21936 ..
21937 }),
21938 ]
21939 ));
21940
21941 for _ in 0..4 {
21942 parser.next_token();
21943 }
21944
21945 assert!(matches!(
21946 parser.peek_tokens(),
21947 [
21948 Token::Word(Word {
21949 keyword: Keyword::FROM,
21950 ..
21951 }),
21952 Token::Word(_),
21953 Token::EOF,
21954 Token::EOF,
21955 ]
21956 ))
21957 })
21958 }
21959
21960 #[cfg(test)]
21961 mod test_parse_data_type {
21962 use crate::ast::{
21963 CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
21964 };
21965 use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
21966 use crate::test_utils::TestedDialects;
21967
21968 macro_rules! test_parse_data_type {
21969 ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
21970 $dialect.run_parser_method(&*$input, |parser| {
21971 let data_type = parser.parse_data_type().unwrap();
21972 assert_eq!($expected_type, data_type);
21973 assert_eq!($input.to_string(), data_type.to_string());
21974 });
21975 }};
21976 }
21977
21978 #[test]
21979 fn test_ansii_character_string_types() {
21980 let dialect =
21982 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21983
21984 test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
21985
21986 test_parse_data_type!(
21987 dialect,
21988 "CHARACTER(20)",
21989 DataType::Character(Some(CharacterLength::IntegerLength {
21990 length: 20,
21991 unit: None
21992 }))
21993 );
21994
21995 test_parse_data_type!(
21996 dialect,
21997 "CHARACTER(20 CHARACTERS)",
21998 DataType::Character(Some(CharacterLength::IntegerLength {
21999 length: 20,
22000 unit: Some(CharLengthUnits::Characters)
22001 }))
22002 );
22003
22004 test_parse_data_type!(
22005 dialect,
22006 "CHARACTER(20 OCTETS)",
22007 DataType::Character(Some(CharacterLength::IntegerLength {
22008 length: 20,
22009 unit: Some(CharLengthUnits::Octets)
22010 }))
22011 );
22012
22013 test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
22014
22015 test_parse_data_type!(
22016 dialect,
22017 "CHAR(20)",
22018 DataType::Char(Some(CharacterLength::IntegerLength {
22019 length: 20,
22020 unit: None
22021 }))
22022 );
22023
22024 test_parse_data_type!(
22025 dialect,
22026 "CHAR(20 CHARACTERS)",
22027 DataType::Char(Some(CharacterLength::IntegerLength {
22028 length: 20,
22029 unit: Some(CharLengthUnits::Characters)
22030 }))
22031 );
22032
22033 test_parse_data_type!(
22034 dialect,
22035 "CHAR(20 OCTETS)",
22036 DataType::Char(Some(CharacterLength::IntegerLength {
22037 length: 20,
22038 unit: Some(CharLengthUnits::Octets)
22039 }))
22040 );
22041
22042 test_parse_data_type!(
22043 dialect,
22044 "CHARACTER VARYING(20)",
22045 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
22046 length: 20,
22047 unit: None
22048 }))
22049 );
22050
22051 test_parse_data_type!(
22052 dialect,
22053 "CHARACTER VARYING(20 CHARACTERS)",
22054 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
22055 length: 20,
22056 unit: Some(CharLengthUnits::Characters)
22057 }))
22058 );
22059
22060 test_parse_data_type!(
22061 dialect,
22062 "CHARACTER VARYING(20 OCTETS)",
22063 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
22064 length: 20,
22065 unit: Some(CharLengthUnits::Octets)
22066 }))
22067 );
22068
22069 test_parse_data_type!(
22070 dialect,
22071 "CHAR VARYING(20)",
22072 DataType::CharVarying(Some(CharacterLength::IntegerLength {
22073 length: 20,
22074 unit: None
22075 }))
22076 );
22077
22078 test_parse_data_type!(
22079 dialect,
22080 "CHAR VARYING(20 CHARACTERS)",
22081 DataType::CharVarying(Some(CharacterLength::IntegerLength {
22082 length: 20,
22083 unit: Some(CharLengthUnits::Characters)
22084 }))
22085 );
22086
22087 test_parse_data_type!(
22088 dialect,
22089 "CHAR VARYING(20 OCTETS)",
22090 DataType::CharVarying(Some(CharacterLength::IntegerLength {
22091 length: 20,
22092 unit: Some(CharLengthUnits::Octets)
22093 }))
22094 );
22095
22096 test_parse_data_type!(
22097 dialect,
22098 "VARCHAR(20)",
22099 DataType::Varchar(Some(CharacterLength::IntegerLength {
22100 length: 20,
22101 unit: None
22102 }))
22103 );
22104 }
22105
22106 #[test]
22107 fn test_ansii_character_large_object_types() {
22108 let dialect =
22110 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
22111
22112 test_parse_data_type!(
22113 dialect,
22114 "CHARACTER LARGE OBJECT",
22115 DataType::CharacterLargeObject(None)
22116 );
22117 test_parse_data_type!(
22118 dialect,
22119 "CHARACTER LARGE OBJECT(20)",
22120 DataType::CharacterLargeObject(Some(20))
22121 );
22122
22123 test_parse_data_type!(
22124 dialect,
22125 "CHAR LARGE OBJECT",
22126 DataType::CharLargeObject(None)
22127 );
22128 test_parse_data_type!(
22129 dialect,
22130 "CHAR LARGE OBJECT(20)",
22131 DataType::CharLargeObject(Some(20))
22132 );
22133
22134 test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
22135 test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
22136 }
22137
22138 #[test]
22139 fn test_parse_custom_types() {
22140 let dialect =
22141 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
22142
22143 test_parse_data_type!(
22144 dialect,
22145 "GEOMETRY",
22146 DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
22147 );
22148
22149 test_parse_data_type!(
22150 dialect,
22151 "GEOMETRY(POINT)",
22152 DataType::Custom(
22153 ObjectName::from(vec!["GEOMETRY".into()]),
22154 vec!["POINT".to_string()]
22155 )
22156 );
22157
22158 test_parse_data_type!(
22159 dialect,
22160 "GEOMETRY(POINT, 4326)",
22161 DataType::Custom(
22162 ObjectName::from(vec!["GEOMETRY".into()]),
22163 vec!["POINT".to_string(), "4326".to_string()]
22164 )
22165 );
22166 }
22167
22168 #[test]
22169 fn test_ansii_exact_numeric_types() {
22170 let dialect = TestedDialects::new(vec![
22172 Box::new(GenericDialect {}),
22173 Box::new(AnsiDialect {}),
22174 Box::new(PostgreSqlDialect {}),
22175 ]);
22176
22177 test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
22178
22179 test_parse_data_type!(
22180 dialect,
22181 "NUMERIC(2)",
22182 DataType::Numeric(ExactNumberInfo::Precision(2))
22183 );
22184
22185 test_parse_data_type!(
22186 dialect,
22187 "NUMERIC(2,10)",
22188 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
22189 );
22190
22191 test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
22192
22193 test_parse_data_type!(
22194 dialect,
22195 "DECIMAL(2)",
22196 DataType::Decimal(ExactNumberInfo::Precision(2))
22197 );
22198
22199 test_parse_data_type!(
22200 dialect,
22201 "DECIMAL(2,10)",
22202 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
22203 );
22204
22205 test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
22206
22207 test_parse_data_type!(
22208 dialect,
22209 "DEC(2)",
22210 DataType::Dec(ExactNumberInfo::Precision(2))
22211 );
22212
22213 test_parse_data_type!(
22214 dialect,
22215 "DEC(2,10)",
22216 DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
22217 );
22218
22219 test_parse_data_type!(
22221 dialect,
22222 "NUMERIC(10,-2)",
22223 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
22224 );
22225
22226 test_parse_data_type!(
22227 dialect,
22228 "DECIMAL(1000,-10)",
22229 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
22230 );
22231
22232 test_parse_data_type!(
22233 dialect,
22234 "DEC(5,-1000)",
22235 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
22236 );
22237
22238 test_parse_data_type!(
22239 dialect,
22240 "NUMERIC(10,-5)",
22241 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
22242 );
22243
22244 test_parse_data_type!(
22245 dialect,
22246 "DECIMAL(20,-10)",
22247 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
22248 );
22249
22250 test_parse_data_type!(
22251 dialect,
22252 "DEC(5,-2)",
22253 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
22254 );
22255
22256 dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
22257 let data_type = parser.parse_data_type().unwrap();
22258 assert_eq!(
22259 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
22260 data_type
22261 );
22262 assert_eq!("NUMERIC(10,5)", data_type.to_string());
22264 });
22265 }
22266
22267 #[test]
22268 fn test_ansii_date_type() {
22269 let dialect =
22271 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
22272
22273 test_parse_data_type!(dialect, "DATE", DataType::Date);
22274
22275 test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
22276
22277 test_parse_data_type!(
22278 dialect,
22279 "TIME(6)",
22280 DataType::Time(Some(6), TimezoneInfo::None)
22281 );
22282
22283 test_parse_data_type!(
22284 dialect,
22285 "TIME WITH TIME ZONE",
22286 DataType::Time(None, TimezoneInfo::WithTimeZone)
22287 );
22288
22289 test_parse_data_type!(
22290 dialect,
22291 "TIME(6) WITH TIME ZONE",
22292 DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
22293 );
22294
22295 test_parse_data_type!(
22296 dialect,
22297 "TIME WITHOUT TIME ZONE",
22298 DataType::Time(None, TimezoneInfo::WithoutTimeZone)
22299 );
22300
22301 test_parse_data_type!(
22302 dialect,
22303 "TIME(6) WITHOUT TIME ZONE",
22304 DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
22305 );
22306
22307 test_parse_data_type!(
22308 dialect,
22309 "TIMESTAMP",
22310 DataType::Timestamp(None, TimezoneInfo::None)
22311 );
22312
22313 test_parse_data_type!(
22314 dialect,
22315 "TIMESTAMP(22)",
22316 DataType::Timestamp(Some(22), TimezoneInfo::None)
22317 );
22318
22319 test_parse_data_type!(
22320 dialect,
22321 "TIMESTAMP(22) WITH TIME ZONE",
22322 DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
22323 );
22324
22325 test_parse_data_type!(
22326 dialect,
22327 "TIMESTAMP(33) WITHOUT TIME ZONE",
22328 DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
22329 );
22330 }
22331 }
22332
22333 #[test]
22334 fn test_parse_schema_name() {
22335 macro_rules! test_parse_schema_name {
22337 ($input:expr, $expected_name:expr $(,)?) => {{
22338 all_dialects().run_parser_method(&*$input, |parser| {
22339 let schema_name = parser.parse_schema_name().unwrap();
22340 assert_eq!(schema_name, $expected_name);
22342 assert_eq!(schema_name.to_string(), $input.to_string());
22344 });
22345 }};
22346 }
22347
22348 let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
22349 let dummy_authorization = Ident::new("dummy_authorization");
22350
22351 test_parse_schema_name!(
22352 format!("{dummy_name}"),
22353 SchemaName::Simple(dummy_name.clone())
22354 );
22355
22356 test_parse_schema_name!(
22357 format!("AUTHORIZATION {dummy_authorization}"),
22358 SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
22359 );
22360 test_parse_schema_name!(
22361 format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
22362 SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
22363 );
22364 }
22365
22366 #[test]
22367 fn mysql_parse_index_table_constraint() {
22368 macro_rules! test_parse_table_constraint {
22369 ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
22370 $dialect.run_parser_method(&*$input, |parser| {
22371 let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
22372 assert_eq!(constraint, $expected);
22374 assert_eq!(constraint.to_string(), $input.to_string());
22376 });
22377 }};
22378 }
22379
22380 fn mk_expected_col(name: &str) -> IndexColumn {
22381 IndexColumn {
22382 column: OrderByExpr {
22383 expr: Expr::Identifier(name.into()),
22384 options: OrderByOptions {
22385 asc: None,
22386 nulls_first: None,
22387 },
22388 with_fill: None,
22389 },
22390 operator_class: None,
22391 }
22392 }
22393
22394 let dialect =
22395 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
22396
22397 test_parse_table_constraint!(
22398 dialect,
22399 "INDEX (c1)",
22400 IndexConstraint {
22401 display_as_key: false,
22402 name: None,
22403 index_type: None,
22404 columns: vec![mk_expected_col("c1")],
22405 index_options: vec![],
22406 }
22407 .into()
22408 );
22409
22410 test_parse_table_constraint!(
22411 dialect,
22412 "KEY (c1)",
22413 IndexConstraint {
22414 display_as_key: true,
22415 name: None,
22416 index_type: None,
22417 columns: vec![mk_expected_col("c1")],
22418 index_options: vec![],
22419 }
22420 .into()
22421 );
22422
22423 test_parse_table_constraint!(
22424 dialect,
22425 "INDEX 'index' (c1, c2)",
22426 TableConstraint::Index(IndexConstraint {
22427 display_as_key: false,
22428 name: Some(Ident::with_quote('\'', "index")),
22429 index_type: None,
22430 columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
22431 index_options: vec![],
22432 })
22433 );
22434
22435 test_parse_table_constraint!(
22436 dialect,
22437 "INDEX USING BTREE (c1)",
22438 IndexConstraint {
22439 display_as_key: false,
22440 name: None,
22441 index_type: Some(IndexType::BTree),
22442 columns: vec![mk_expected_col("c1")],
22443 index_options: vec![],
22444 }
22445 .into()
22446 );
22447
22448 test_parse_table_constraint!(
22449 dialect,
22450 "INDEX USING HASH (c1)",
22451 IndexConstraint {
22452 display_as_key: false,
22453 name: None,
22454 index_type: Some(IndexType::Hash),
22455 columns: vec![mk_expected_col("c1")],
22456 index_options: vec![],
22457 }
22458 .into()
22459 );
22460
22461 test_parse_table_constraint!(
22462 dialect,
22463 "INDEX idx_name USING BTREE (c1)",
22464 IndexConstraint {
22465 display_as_key: false,
22466 name: Some(Ident::new("idx_name")),
22467 index_type: Some(IndexType::BTree),
22468 columns: vec![mk_expected_col("c1")],
22469 index_options: vec![],
22470 }
22471 .into()
22472 );
22473
22474 test_parse_table_constraint!(
22475 dialect,
22476 "INDEX idx_name USING HASH (c1)",
22477 IndexConstraint {
22478 display_as_key: false,
22479 name: Some(Ident::new("idx_name")),
22480 index_type: Some(IndexType::Hash),
22481 columns: vec![mk_expected_col("c1")],
22482 index_options: vec![],
22483 }
22484 .into()
22485 );
22486 }
22487
22488 #[test]
22489 fn test_tokenizer_error_loc() {
22490 let sql = "foo '";
22491 let ast = Parser::parse_sql(&GenericDialect, sql);
22492 assert_eq!(
22493 ast,
22494 Err(ParserError::TokenizerError(
22495 "Unterminated string literal at Line: 1, Column: 5".to_string()
22496 ))
22497 );
22498 }
22499
22500 #[test]
22501 fn test_parser_error_loc() {
22502 let sql = "SELECT this is a syntax error";
22503 let ast = Parser::parse_sql(&GenericDialect, sql);
22504 assert_eq!(
22505 ast,
22506 Err(ParserError::ParserError(
22507 "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
22508 .to_string()
22509 ))
22510 );
22511 }
22512
22513 #[test]
22514 fn test_nested_explain_error() {
22515 let sql = "EXPLAIN EXPLAIN SELECT 1";
22516 let ast = Parser::parse_sql(&GenericDialect, sql);
22517 assert_eq!(
22518 ast,
22519 Err(ParserError::ParserError(
22520 "Explain must be root of the plan".to_string()
22521 ))
22522 );
22523 }
22524
22525 #[test]
22526 fn test_parse_multipart_identifier_positive() {
22527 let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
22528
22529 let expected = vec![
22531 Ident {
22532 value: "CATALOG".to_string(),
22533 quote_style: None,
22534 span: Span::empty(),
22535 },
22536 Ident {
22537 value: "F(o)o. \"bar".to_string(),
22538 quote_style: Some('"'),
22539 span: Span::empty(),
22540 },
22541 Ident {
22542 value: "table".to_string(),
22543 quote_style: None,
22544 span: Span::empty(),
22545 },
22546 ];
22547 dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
22548 let actual = parser.parse_multipart_identifier().unwrap();
22549 assert_eq!(expected, actual);
22550 });
22551
22552 let expected = vec![
22554 Ident {
22555 value: "CATALOG".to_string(),
22556 quote_style: None,
22557 span: Span::empty(),
22558 },
22559 Ident {
22560 value: "table".to_string(),
22561 quote_style: None,
22562 span: Span::empty(),
22563 },
22564 ];
22565 dialect.run_parser_method("CATALOG . table", |parser| {
22566 let actual = parser.parse_multipart_identifier().unwrap();
22567 assert_eq!(expected, actual);
22568 });
22569 }
22570
22571 #[test]
22572 fn test_parse_multipart_identifier_negative() {
22573 macro_rules! test_parse_multipart_identifier_error {
22574 ($input:expr, $expected_err:expr $(,)?) => {{
22575 all_dialects().run_parser_method(&*$input, |parser| {
22576 let actual_err = parser.parse_multipart_identifier().unwrap_err();
22577 assert_eq!(actual_err.to_string(), $expected_err);
22578 });
22579 }};
22580 }
22581
22582 test_parse_multipart_identifier_error!(
22583 "",
22584 "sql parser error: Empty input when parsing identifier",
22585 );
22586
22587 test_parse_multipart_identifier_error!(
22588 "*schema.table",
22589 "sql parser error: Unexpected token in identifier: *",
22590 );
22591
22592 test_parse_multipart_identifier_error!(
22593 "schema.table*",
22594 "sql parser error: Unexpected token in identifier: *",
22595 );
22596
22597 test_parse_multipart_identifier_error!(
22598 "schema.table.",
22599 "sql parser error: Trailing period in identifier",
22600 );
22601
22602 test_parse_multipart_identifier_error!(
22603 "schema.*",
22604 "sql parser error: Unexpected token following period in identifier: *",
22605 );
22606 }
22607
22608 #[test]
22609 fn test_mysql_partition_selection() {
22610 let sql = "SELECT * FROM employees PARTITION (p0, p2)";
22611 let expected = vec!["p0", "p2"];
22612
22613 let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
22614 assert_eq!(ast.len(), 1);
22615 if let Statement::Query(v) = &ast[0] {
22616 if let SetExpr::Select(select) = &*v.body {
22617 assert_eq!(select.from.len(), 1);
22618 let from: &TableWithJoins = &select.from[0];
22619 let table_factor = &from.relation;
22620 if let TableFactor::Table { partitions, .. } = table_factor {
22621 let actual: Vec<&str> = partitions
22622 .iter()
22623 .map(|ident| ident.value.as_str())
22624 .collect();
22625 assert_eq!(expected, actual);
22626 }
22627 }
22628 } else {
22629 panic!("fail to parse mysql partition selection");
22630 }
22631 }
22632
22633 #[test]
22634 fn test_replace_into_placeholders() {
22635 let sql = "REPLACE INTO t (a) VALUES (&a)";
22636
22637 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22638 }
22639
22640 #[test]
22641 fn test_replace_into_set_placeholder() {
22642 let sql = "REPLACE INTO t SET ?";
22643
22644 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22645 }
22646
22647 #[test]
22648 fn test_replace_incomplete() {
22649 let sql = r#"REPLACE"#;
22650
22651 assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
22652 }
22653
22654 #[test]
22655 fn test_placeholder_invalid_whitespace() {
22656 for w in [" ", "/*invalid*/"] {
22657 let sql = format!("\nSELECT\n :{w}fooBar");
22658 assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
22659 }
22660 }
22661}