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 _ => self.expected("an SQL statement", next_token),
723 },
724 Token::LParen => {
725 self.prev_token();
726 self.parse_query().map(Into::into)
727 }
728 _ => self.expected("an SQL statement", next_token),
729 }
730 }
731
732 pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
736 let case_token = self.expect_keyword(Keyword::CASE)?;
737
738 let match_expr = if self.peek_keyword(Keyword::WHEN) {
739 None
740 } else {
741 Some(self.parse_expr()?)
742 };
743
744 self.expect_keyword_is(Keyword::WHEN)?;
745 let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
746 parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
747 })?;
748
749 let else_block = if self.parse_keyword(Keyword::ELSE) {
750 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
751 } else {
752 None
753 };
754
755 let mut end_case_token = self.expect_keyword(Keyword::END)?;
756 if self.peek_keyword(Keyword::CASE) {
757 end_case_token = self.expect_keyword(Keyword::CASE)?;
758 }
759
760 Ok(CaseStatement {
761 case_token: AttachedToken(case_token),
762 match_expr,
763 when_blocks,
764 else_block,
765 end_case_token: AttachedToken(end_case_token),
766 })
767 }
768
769 pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
773 self.expect_keyword_is(Keyword::IF)?;
774 let if_block = self.parse_conditional_statement_block(&[
775 Keyword::ELSE,
776 Keyword::ELSEIF,
777 Keyword::END,
778 ])?;
779
780 let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
781 self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
782 parser.parse_conditional_statement_block(&[
783 Keyword::ELSEIF,
784 Keyword::ELSE,
785 Keyword::END,
786 ])
787 })?
788 } else {
789 vec![]
790 };
791
792 let else_block = if self.parse_keyword(Keyword::ELSE) {
793 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
794 } else {
795 None
796 };
797
798 self.expect_keyword_is(Keyword::END)?;
799 let end_token = self.expect_keyword(Keyword::IF)?;
800
801 Ok(IfStatement {
802 if_block,
803 elseif_blocks,
804 else_block,
805 end_token: Some(AttachedToken(end_token)),
806 })
807 }
808
809 fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
813 self.expect_keyword_is(Keyword::WHILE)?;
814 let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
815
816 Ok(WhileStatement { while_block })
817 }
818
819 fn parse_conditional_statement_block(
827 &mut self,
828 terminal_keywords: &[Keyword],
829 ) -> Result<ConditionalStatementBlock, ParserError> {
830 let start_token = self.get_current_token().clone(); let mut then_token = None;
832
833 let condition = match &start_token.token {
834 Token::Word(w) if w.keyword == Keyword::ELSE => None,
835 Token::Word(w) if w.keyword == Keyword::WHILE => {
836 let expr = self.parse_expr()?;
837 Some(expr)
838 }
839 _ => {
840 let expr = self.parse_expr()?;
841 then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
842 Some(expr)
843 }
844 };
845
846 let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
847
848 Ok(ConditionalStatementBlock {
849 start_token: AttachedToken(start_token),
850 condition,
851 then_token,
852 conditional_statements,
853 })
854 }
855
856 pub(crate) fn parse_conditional_statements(
859 &mut self,
860 terminal_keywords: &[Keyword],
861 ) -> Result<ConditionalStatements, ParserError> {
862 let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
863 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
864 let statements = self.parse_statement_list(terminal_keywords)?;
865 let end_token = self.expect_keyword(Keyword::END)?;
866
867 ConditionalStatements::BeginEnd(BeginEndStatements {
868 begin_token: AttachedToken(begin_token),
869 statements,
870 end_token: AttachedToken(end_token),
871 })
872 } else {
873 ConditionalStatements::Sequence {
874 statements: self.parse_statement_list(terminal_keywords)?,
875 }
876 };
877 Ok(conditional_statements)
878 }
879
880 pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
884 self.expect_keyword_is(Keyword::RAISE)?;
885
886 let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
887 self.expect_token(&Token::Eq)?;
888 Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
889 } else {
890 self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
891 };
892
893 Ok(RaiseStatement { value })
894 }
895 pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
899 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
900
901 self.expect_keyword_is(Keyword::ON)?;
902 let token = self.next_token();
903
904 let (object_type, object_name) = match token.token {
905 Token::Word(w) if w.keyword == Keyword::COLLATION => {
906 (CommentObject::Collation, self.parse_object_name(false)?)
907 }
908 Token::Word(w) if w.keyword == Keyword::COLUMN => {
909 (CommentObject::Column, self.parse_object_name(false)?)
910 }
911 Token::Word(w) if w.keyword == Keyword::DATABASE => {
912 (CommentObject::Database, self.parse_object_name(false)?)
913 }
914 Token::Word(w) if w.keyword == Keyword::DOMAIN => {
915 (CommentObject::Domain, self.parse_object_name(false)?)
916 }
917 Token::Word(w) if w.keyword == Keyword::EXTENSION => {
918 (CommentObject::Extension, self.parse_object_name(false)?)
919 }
920 Token::Word(w) if w.keyword == Keyword::FUNCTION => {
921 (CommentObject::Function, self.parse_object_name(false)?)
922 }
923 Token::Word(w) if w.keyword == Keyword::INDEX => {
924 (CommentObject::Index, self.parse_object_name(false)?)
925 }
926 Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
927 self.expect_keyword_is(Keyword::VIEW)?;
928 (
929 CommentObject::MaterializedView,
930 self.parse_object_name(false)?,
931 )
932 }
933 Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
934 (CommentObject::Procedure, self.parse_object_name(false)?)
935 }
936 Token::Word(w) if w.keyword == Keyword::ROLE => {
937 (CommentObject::Role, self.parse_object_name(false)?)
938 }
939 Token::Word(w) if w.keyword == Keyword::SCHEMA => {
940 (CommentObject::Schema, self.parse_object_name(false)?)
941 }
942 Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
943 (CommentObject::Sequence, self.parse_object_name(false)?)
944 }
945 Token::Word(w) if w.keyword == Keyword::TABLE => {
946 (CommentObject::Table, self.parse_object_name(false)?)
947 }
948 Token::Word(w) if w.keyword == Keyword::TYPE => {
949 (CommentObject::Type, self.parse_object_name(false)?)
950 }
951 Token::Word(w) if w.keyword == Keyword::USER => {
952 (CommentObject::User, self.parse_object_name(false)?)
953 }
954 Token::Word(w) if w.keyword == Keyword::VIEW => {
955 (CommentObject::View, self.parse_object_name(false)?)
956 }
957 _ => self.expected("comment object_type", token)?,
958 };
959
960 self.expect_keyword_is(Keyword::IS)?;
961 let comment = if self.parse_keyword(Keyword::NULL) {
962 None
963 } else {
964 Some(self.parse_literal_string()?)
965 };
966 Ok(Statement::Comment {
967 object_type,
968 object_name,
969 comment,
970 if_exists,
971 })
972 }
973
974 pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
976 let mut channel = None;
977 let mut tables: Vec<ObjectName> = vec![];
978 let mut read_lock = false;
979 let mut export = false;
980
981 if !dialect_of!(self is MySqlDialect | GenericDialect) {
982 return parser_err!(
983 "Unsupported statement FLUSH",
984 self.peek_token_ref().span.start
985 );
986 }
987
988 let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
989 Some(FlushLocation::NoWriteToBinlog)
990 } else if self.parse_keyword(Keyword::LOCAL) {
991 Some(FlushLocation::Local)
992 } else {
993 None
994 };
995
996 let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
997 FlushType::BinaryLogs
998 } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
999 FlushType::EngineLogs
1000 } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1001 FlushType::ErrorLogs
1002 } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1003 FlushType::GeneralLogs
1004 } else if self.parse_keywords(&[Keyword::HOSTS]) {
1005 FlushType::Hosts
1006 } else if self.parse_keyword(Keyword::PRIVILEGES) {
1007 FlushType::Privileges
1008 } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1009 FlushType::OptimizerCosts
1010 } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1011 if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1012 channel = Some(self.parse_object_name(false).unwrap().to_string());
1013 }
1014 FlushType::RelayLogs
1015 } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1016 FlushType::SlowLogs
1017 } else if self.parse_keyword(Keyword::STATUS) {
1018 FlushType::Status
1019 } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1020 FlushType::UserResources
1021 } else if self.parse_keywords(&[Keyword::LOGS]) {
1022 FlushType::Logs
1023 } else if self.parse_keywords(&[Keyword::TABLES]) {
1024 loop {
1025 let next_token = self.next_token();
1026 match &next_token.token {
1027 Token::Word(w) => match w.keyword {
1028 Keyword::WITH => {
1029 read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1030 }
1031 Keyword::FOR => {
1032 export = self.parse_keyword(Keyword::EXPORT);
1033 }
1034 Keyword::NoKeyword => {
1035 self.prev_token();
1036 tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1037 }
1038 _ => {}
1039 },
1040 _ => {
1041 break;
1042 }
1043 }
1044 }
1045
1046 FlushType::Tables
1047 } else {
1048 return self.expected_ref(
1049 "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1050 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1051 self.peek_token_ref(),
1052 );
1053 };
1054
1055 Ok(Statement::Flush {
1056 object_type,
1057 location,
1058 channel,
1059 read_lock,
1060 export,
1061 tables,
1062 })
1063 }
1064
1065 pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1067 let repair = self.parse_keyword(Keyword::REPAIR);
1068 self.expect_keyword_is(Keyword::TABLE)?;
1069 let table_name = self.parse_object_name(false)?;
1070 let partition_action = self
1071 .maybe_parse(|parser| {
1072 let pa = match parser.parse_one_of_keywords(&[
1073 Keyword::ADD,
1074 Keyword::DROP,
1075 Keyword::SYNC,
1076 ]) {
1077 Some(Keyword::ADD) => Some(AddDropSync::ADD),
1078 Some(Keyword::DROP) => Some(AddDropSync::DROP),
1079 Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1080 _ => None,
1081 };
1082 parser.expect_keyword_is(Keyword::PARTITIONS)?;
1083 Ok(pa)
1084 })?
1085 .unwrap_or_default();
1086 Ok(Msck {
1087 repair,
1088 table_name,
1089 partition_action,
1090 })
1091 }
1092
1093 pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1095 let table = self.parse_keyword(Keyword::TABLE);
1096 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1097
1098 let table_names = self.parse_comma_separated(|p| {
1099 let only = p.parse_keyword(Keyword::ONLY);
1100 let name = p.parse_object_name(false)?;
1101 let has_asterisk = p.consume_token(&Token::Mul);
1102 Ok(TruncateTableTarget {
1103 name,
1104 only,
1105 has_asterisk,
1106 })
1107 })?;
1108
1109 let mut partitions = None;
1110 if self.parse_keyword(Keyword::PARTITION) {
1111 self.expect_token(&Token::LParen)?;
1112 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1113 self.expect_token(&Token::RParen)?;
1114 }
1115
1116 let mut identity = None;
1117 let mut cascade = None;
1118
1119 if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1120 identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1121 Some(TruncateIdentityOption::Restart)
1122 } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1123 Some(TruncateIdentityOption::Continue)
1124 } else {
1125 None
1126 };
1127
1128 cascade = self.parse_cascade_option();
1129 };
1130
1131 let on_cluster = self.parse_optional_on_cluster()?;
1132
1133 Ok(Truncate {
1134 table_names,
1135 partitions,
1136 table,
1137 if_exists,
1138 identity,
1139 cascade,
1140 on_cluster,
1141 })
1142 }
1143
1144 fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1145 if self.parse_keyword(Keyword::CASCADE) {
1146 Some(CascadeOption::Cascade)
1147 } else if self.parse_keyword(Keyword::RESTRICT) {
1148 Some(CascadeOption::Restrict)
1149 } else {
1150 None
1151 }
1152 }
1153
1154 pub fn parse_attach_duckdb_database_options(
1156 &mut self,
1157 ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1158 if !self.consume_token(&Token::LParen) {
1159 return Ok(vec![]);
1160 }
1161
1162 let mut options = vec![];
1163 loop {
1164 if self.parse_keyword(Keyword::READ_ONLY) {
1165 let boolean = if self.parse_keyword(Keyword::TRUE) {
1166 Some(true)
1167 } else if self.parse_keyword(Keyword::FALSE) {
1168 Some(false)
1169 } else {
1170 None
1171 };
1172 options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1173 } else if self.parse_keyword(Keyword::TYPE) {
1174 let ident = self.parse_identifier()?;
1175 options.push(AttachDuckDBDatabaseOption::Type(ident));
1176 } else {
1177 return self
1178 .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1179 };
1180
1181 if self.consume_token(&Token::RParen) {
1182 return Ok(options);
1183 } else if self.consume_token(&Token::Comma) {
1184 continue;
1185 } else {
1186 return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1187 }
1188 }
1189 }
1190
1191 pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1193 let database = self.parse_keyword(Keyword::DATABASE);
1194 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1195 let database_path = self.parse_identifier()?;
1196 let database_alias = if self.parse_keyword(Keyword::AS) {
1197 Some(self.parse_identifier()?)
1198 } else {
1199 None
1200 };
1201
1202 let attach_options = self.parse_attach_duckdb_database_options()?;
1203 Ok(Statement::AttachDuckDBDatabase {
1204 if_not_exists,
1205 database,
1206 database_path,
1207 database_alias,
1208 attach_options,
1209 })
1210 }
1211
1212 pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1214 let database = self.parse_keyword(Keyword::DATABASE);
1215 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1216 let database_alias = self.parse_identifier()?;
1217 Ok(Statement::DetachDuckDBDatabase {
1218 if_exists,
1219 database,
1220 database_alias,
1221 })
1222 }
1223
1224 pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1226 let database = self.parse_keyword(Keyword::DATABASE);
1227 let database_file_name = self.parse_expr()?;
1228 self.expect_keyword_is(Keyword::AS)?;
1229 let schema_name = self.parse_identifier()?;
1230 Ok(Statement::AttachDatabase {
1231 database,
1232 schema_name,
1233 database_file_name,
1234 })
1235 }
1236
1237 pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1239 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1240 let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1241 let mut for_columns = false;
1242 let mut cache_metadata = false;
1243 let mut noscan = false;
1244 let mut partitions = None;
1245 let mut compute_statistics = false;
1246 let mut columns = vec![];
1247
1248 if table_name.is_some() && self.consume_token(&Token::LParen) {
1250 columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1251 self.expect_token(&Token::RParen)?;
1252 }
1253
1254 loop {
1255 match self.parse_one_of_keywords(&[
1256 Keyword::PARTITION,
1257 Keyword::FOR,
1258 Keyword::CACHE,
1259 Keyword::NOSCAN,
1260 Keyword::COMPUTE,
1261 ]) {
1262 Some(Keyword::PARTITION) => {
1263 self.expect_token(&Token::LParen)?;
1264 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1265 self.expect_token(&Token::RParen)?;
1266 }
1267 Some(Keyword::NOSCAN) => noscan = true,
1268 Some(Keyword::FOR) => {
1269 self.expect_keyword_is(Keyword::COLUMNS)?;
1270
1271 columns = self
1272 .maybe_parse(|parser| {
1273 parser.parse_comma_separated(|p| p.parse_identifier())
1274 })?
1275 .unwrap_or_default();
1276 for_columns = true
1277 }
1278 Some(Keyword::CACHE) => {
1279 self.expect_keyword_is(Keyword::METADATA)?;
1280 cache_metadata = true
1281 }
1282 Some(Keyword::COMPUTE) => {
1283 self.expect_keyword_is(Keyword::STATISTICS)?;
1284 compute_statistics = true
1285 }
1286 _ => break,
1287 }
1288 }
1289
1290 Ok(Analyze {
1291 has_table_keyword,
1292 table_name,
1293 for_columns,
1294 columns,
1295 partitions,
1296 cache_metadata,
1297 noscan,
1298 compute_statistics,
1299 })
1300 }
1301
1302 pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1304 let index = self.index;
1305
1306 let next_token = self.next_token();
1307 match next_token.token {
1308 t @ (Token::Word(_) | Token::SingleQuotedString(_))
1309 if self.peek_token_ref().token == Token::Period =>
1310 {
1311 let mut id_parts: Vec<Ident> = vec![match t {
1312 Token::Word(w) => w.into_ident(next_token.span),
1313 Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1314 _ => {
1315 return Err(ParserError::ParserError(
1316 "Internal parser error: unexpected token type".to_string(),
1317 ))
1318 }
1319 }];
1320
1321 while self.consume_token(&Token::Period) {
1322 let next_token = self.next_token();
1323 match next_token.token {
1324 Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1325 Token::SingleQuotedString(s) => {
1326 id_parts.push(Ident::with_quote('\'', s))
1328 }
1329 Token::Placeholder(s) => {
1330 id_parts.push(Ident::new(s))
1333 }
1334 Token::Mul => {
1335 return Ok(Expr::QualifiedWildcard(
1336 ObjectName::from(id_parts),
1337 AttachedToken(next_token),
1338 ));
1339 }
1340 _ => {
1341 return self.expected("an identifier or a '*' after '.'", next_token);
1342 }
1343 }
1344 }
1345 }
1346 Token::Mul => {
1347 return Ok(Expr::Wildcard(AttachedToken(next_token)));
1348 }
1349 Token::LParen => {
1351 let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1352 if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1353 let mul_token = self.next_token(); self.next_token(); return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1356 }
1357 }
1358 _ => (),
1359 };
1360
1361 self.index = index;
1362 self.parse_expr()
1363 }
1364
1365 pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1367 self.parse_subexpr(self.dialect.prec_unknown())
1368 }
1369
1370 pub fn parse_expr_with_alias_and_order_by(
1372 &mut self,
1373 ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1374 let expr = self.parse_expr()?;
1375
1376 fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1377 explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1378 }
1379 let alias = self.parse_optional_alias_inner(None, validator)?;
1380 let order_by = OrderByOptions {
1381 asc: self.parse_asc_desc(),
1382 nulls_first: None,
1383 };
1384 Ok(ExprWithAliasAndOrderBy {
1385 expr: ExprWithAlias { expr, alias },
1386 order_by,
1387 })
1388 }
1389
1390 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1392 pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1393 let _guard = self.recursion_counter.try_decrease()?;
1394 debug!("parsing expr");
1395 let mut expr = self.parse_prefix()?;
1396
1397 expr = self.parse_compound_expr(expr, vec![])?;
1398
1399 if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1403 expr = Expr::Collate {
1404 expr: Box::new(expr),
1405 collation: self.parse_object_name(false)?,
1406 };
1407 }
1408
1409 debug!("prefix: {expr:?}");
1410 loop {
1411 let next_precedence = self.get_next_precedence()?;
1412 debug!("next precedence: {next_precedence:?}");
1413
1414 if precedence >= next_precedence {
1415 break;
1416 }
1417
1418 if Token::Period == self.peek_token_ref().token {
1421 break;
1422 }
1423
1424 expr = self.parse_infix(expr, next_precedence)?;
1425 }
1426 Ok(expr)
1427 }
1428
1429 pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1431 let condition = self.parse_expr()?;
1432 let message = if self.parse_keyword(Keyword::AS) {
1433 Some(self.parse_expr()?)
1434 } else {
1435 None
1436 };
1437
1438 Ok(Statement::Assert { condition, message })
1439 }
1440
1441 pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1443 let name = self.parse_identifier()?;
1444 Ok(Statement::Savepoint { name })
1445 }
1446
1447 pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1449 let _ = self.parse_keyword(Keyword::SAVEPOINT);
1450 let name = self.parse_identifier()?;
1451
1452 Ok(Statement::ReleaseSavepoint { name })
1453 }
1454
1455 pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1457 let channel = self.parse_identifier()?;
1458 Ok(Statement::LISTEN { channel })
1459 }
1460
1461 pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1463 let channel = if self.consume_token(&Token::Mul) {
1464 Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1465 } else {
1466 match self.parse_identifier() {
1467 Ok(expr) => expr,
1468 _ => {
1469 self.prev_token();
1470 return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1471 }
1472 }
1473 };
1474 Ok(Statement::UNLISTEN { channel })
1475 }
1476
1477 pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1479 let channel = self.parse_identifier()?;
1480 let payload = if self.consume_token(&Token::Comma) {
1481 Some(self.parse_literal_string()?)
1482 } else {
1483 None
1484 };
1485 Ok(Statement::NOTIFY { channel, payload })
1486 }
1487
1488 pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1490 if self.peek_keyword(Keyword::TABLE) {
1491 self.expect_keyword(Keyword::TABLE)?;
1492 let rename_tables = self.parse_comma_separated(|parser| {
1493 let old_name = parser.parse_object_name(false)?;
1494 parser.expect_keyword(Keyword::TO)?;
1495 let new_name = parser.parse_object_name(false)?;
1496
1497 Ok(RenameTable { old_name, new_name })
1498 })?;
1499 Ok(rename_tables.into())
1500 } else {
1501 self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1502 }
1503 }
1504
1505 fn parse_expr_prefix_by_reserved_word(
1508 &mut self,
1509 w: &Word,
1510 w_span: Span,
1511 ) -> Result<Option<Expr>, ParserError> {
1512 match w.keyword {
1513 Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1514 self.prev_token();
1515 Ok(Some(Expr::Value(self.parse_value()?)))
1516 }
1517 Keyword::NULL => {
1518 self.prev_token();
1519 Ok(Some(Expr::Value(self.parse_value()?)))
1520 }
1521 Keyword::CURRENT_CATALOG
1522 | Keyword::CURRENT_USER
1523 | Keyword::SESSION_USER
1524 | Keyword::USER
1525 if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1526 {
1527 Ok(Some(Expr::Function(Function {
1528 name: ObjectName::from(vec![w.to_ident(w_span)]),
1529 uses_odbc_syntax: false,
1530 parameters: FunctionArguments::None,
1531 args: FunctionArguments::None,
1532 null_treatment: None,
1533 filter: None,
1534 over: None,
1535 within_group: vec![],
1536 })))
1537 }
1538 Keyword::CURRENT_TIMESTAMP
1539 | Keyword::CURRENT_TIME
1540 | Keyword::CURRENT_DATE
1541 | Keyword::LOCALTIME
1542 | Keyword::LOCALTIMESTAMP => {
1543 Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1544 }
1545 Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1546 Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1547 Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1548 Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1549 Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1550 Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1551 Keyword::EXISTS
1552 if !dialect_of!(self is DatabricksDialect)
1554 || matches!(
1555 self.peek_nth_token_ref(1).token,
1556 Token::Word(Word {
1557 keyword: Keyword::SELECT | Keyword::WITH,
1558 ..
1559 })
1560 ) =>
1561 {
1562 Ok(Some(self.parse_exists_expr(false)?))
1563 }
1564 Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1565 Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1566 Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1567 Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1568 Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1569 }
1570 Keyword::SUBSTR | Keyword::SUBSTRING => {
1571 self.prev_token();
1572 Ok(Some(self.parse_substring()?))
1573 }
1574 Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1575 Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1576 Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1577 Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1579 self.expect_token(&Token::LBracket)?;
1580 Ok(Some(self.parse_array_expr(true)?))
1581 }
1582 Keyword::ARRAY
1583 if self.peek_token_ref().token == Token::LParen
1584 && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1585 {
1586 self.expect_token(&Token::LParen)?;
1587 let query = self.parse_query()?;
1588 self.expect_token(&Token::RParen)?;
1589 Ok(Some(Expr::Function(Function {
1590 name: ObjectName::from(vec![w.to_ident(w_span)]),
1591 uses_odbc_syntax: false,
1592 parameters: FunctionArguments::None,
1593 args: FunctionArguments::Subquery(query),
1594 filter: None,
1595 null_treatment: None,
1596 over: None,
1597 within_group: vec![],
1598 })))
1599 }
1600 Keyword::NOT => Ok(Some(self.parse_not()?)),
1601 Keyword::MATCH if self.dialect.supports_match_against() => {
1602 Ok(Some(self.parse_match_against()?))
1603 }
1604 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1605 let struct_expr = self.parse_struct_literal()?;
1606 Ok(Some(struct_expr))
1607 }
1608 Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1609 let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1610 Ok(Some(Expr::Prior(Box::new(expr))))
1611 }
1612 Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1613 Ok(Some(self.parse_duckdb_map_literal()?))
1614 }
1615 Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1616 Ok(Some(self.parse_lambda_expr()?))
1617 }
1618 _ if self.dialect.supports_geometric_types() => match w.keyword {
1619 Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1620 Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1621 Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1622 Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1623 Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1624 Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1625 Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1626 _ => Ok(None),
1627 },
1628 _ => Ok(None),
1629 }
1630 }
1631
1632 fn parse_expr_prefix_by_unreserved_word(
1634 &mut self,
1635 w: &Word,
1636 w_span: Span,
1637 ) -> Result<Expr, ParserError> {
1638 let is_outer_join = self.peek_outer_join_operator();
1639 match &self.peek_token_ref().token {
1640 Token::LParen if !is_outer_join => {
1641 let id_parts = vec![w.to_ident(w_span)];
1642 self.parse_function(ObjectName::from(id_parts))
1643 }
1644 Token::SingleQuotedString(_)
1646 | Token::DoubleQuotedString(_)
1647 | Token::HexStringLiteral(_)
1648 if w.value.starts_with('_') =>
1649 {
1650 Ok(Expr::Prefixed {
1651 prefix: w.to_ident(w_span),
1652 value: self.parse_introduced_string_expr()?.into(),
1653 })
1654 }
1655 Token::SingleQuotedString(_)
1657 | Token::DoubleQuotedString(_)
1658 | Token::HexStringLiteral(_)
1659 if w.value.starts_with('_') =>
1660 {
1661 Ok(Expr::Prefixed {
1662 prefix: w.to_ident(w_span),
1663 value: self.parse_introduced_string_expr()?.into(),
1664 })
1665 }
1666 Token::Arrow if self.dialect.supports_lambda_functions() => {
1670 self.expect_token(&Token::Arrow)?;
1671 Ok(Expr::Lambda(LambdaFunction {
1672 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1673 name: w.to_ident(w_span),
1674 data_type: None,
1675 }),
1676 body: Box::new(self.parse_expr()?),
1677 syntax: LambdaSyntax::Arrow,
1678 }))
1679 }
1680 Token::Word(_)
1684 if self.dialect.supports_lambda_functions()
1685 && self.peek_nth_token_ref(1).token == Token::Arrow =>
1686 {
1687 let data_type = self.parse_data_type()?;
1688 self.expect_token(&Token::Arrow)?;
1689 Ok(Expr::Lambda(LambdaFunction {
1690 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1691 name: w.to_ident(w_span),
1692 data_type: Some(data_type),
1693 }),
1694 body: Box::new(self.parse_expr()?),
1695 syntax: LambdaSyntax::Arrow,
1696 }))
1697 }
1698 _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1699 }
1700 }
1701
1702 fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1705 if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1706 ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1707 } else {
1708 false
1709 }
1710 }
1711
1712 pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1714 if let Some(prefix) = self.dialect.parse_prefix(self) {
1716 return prefix;
1717 }
1718
1719 let loc = self.peek_token_ref().span.start;
1736 let opt_expr = self.maybe_parse(|parser| {
1737 match parser.parse_data_type()? {
1738 DataType::Interval { .. } => parser.parse_interval(),
1739 DataType::Custom(ref name, ref modifiers)
1750 if modifiers.is_empty()
1751 && Self::is_simple_unquoted_object_name(name, "xml")
1752 && parser.dialect.supports_xml_expressions() =>
1753 {
1754 Ok(Expr::TypedString(TypedString {
1755 data_type: DataType::Custom(name.clone(), modifiers.clone()),
1756 value: parser.parse_value()?,
1757 uses_odbc_syntax: false,
1758 }))
1759 }
1760 DataType::Custom(..) => parser_err!("dummy", loc),
1761 DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1763 Ok(Expr::Cast {
1764 kind: CastKind::Cast,
1765 expr: Box::new(parser.parse_expr()?),
1766 data_type: DataType::Binary(None),
1767 array: false,
1768 format: None,
1769 })
1770 }
1771 data_type => Ok(Expr::TypedString(TypedString {
1772 data_type,
1773 value: parser.parse_value()?,
1774 uses_odbc_syntax: false,
1775 })),
1776 }
1777 })?;
1778
1779 if let Some(expr) = opt_expr {
1780 return Ok(expr);
1781 }
1782
1783 let dialect = self.dialect;
1787
1788 self.advance_token();
1789 let next_token_index = self.get_current_index();
1790 let next_token = self.get_current_token();
1791 let span = next_token.span;
1792 let expr = match &next_token.token {
1793 Token::Word(w) => {
1794 let w = w.clone();
1803 match self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span)) {
1804 Ok(Some(expr)) => Ok(expr),
1806
1807 Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1809
1810 Err(e) => {
1817 if !self.dialect.is_reserved_for_identifier(w.keyword) {
1818 if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1819 parser.parse_expr_prefix_by_unreserved_word(&w, span)
1820 }) {
1821 return Ok(expr);
1822 }
1823 }
1824 return Err(e);
1825 }
1826 }
1827 } Token::LBracket => self.parse_array_expr(false),
1830 tok @ Token::Minus | tok @ Token::Plus => {
1831 let op = if *tok == Token::Plus {
1832 UnaryOperator::Plus
1833 } else {
1834 UnaryOperator::Minus
1835 };
1836 Ok(Expr::UnaryOp {
1837 op,
1838 expr: Box::new(
1839 self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1840 ),
1841 })
1842 }
1843 Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1844 op: UnaryOperator::BangNot,
1845 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1846 }),
1847 tok @ Token::DoubleExclamationMark
1848 | tok @ Token::PGSquareRoot
1849 | tok @ Token::PGCubeRoot
1850 | tok @ Token::AtSign
1851 if dialect_is!(dialect is PostgreSqlDialect) =>
1852 {
1853 let op = match tok {
1854 Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1855 Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1856 Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1857 Token::AtSign => UnaryOperator::PGAbs,
1858 _ => {
1859 return Err(ParserError::ParserError(
1860 "Internal parser error: unexpected unary operator token".to_string(),
1861 ))
1862 }
1863 };
1864 Ok(Expr::UnaryOp {
1865 op,
1866 expr: Box::new(
1867 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1868 ),
1869 })
1870 }
1871 Token::Tilde => Ok(Expr::UnaryOp {
1872 op: UnaryOperator::BitwiseNot,
1873 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1874 }),
1875 tok @ Token::Sharp
1876 | tok @ Token::AtDashAt
1877 | tok @ Token::AtAt
1878 | tok @ Token::QuestionMarkDash
1879 | tok @ Token::QuestionPipe
1880 if self.dialect.supports_geometric_types() =>
1881 {
1882 let op = match tok {
1883 Token::Sharp => UnaryOperator::Hash,
1884 Token::AtDashAt => UnaryOperator::AtDashAt,
1885 Token::AtAt => UnaryOperator::DoubleAt,
1886 Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1887 Token::QuestionPipe => UnaryOperator::QuestionPipe,
1888 _ => {
1889 return Err(ParserError::ParserError(format!(
1890 "Unexpected token in unary operator parsing: {tok:?}"
1891 )))
1892 }
1893 };
1894 Ok(Expr::UnaryOp {
1895 op,
1896 expr: Box::new(
1897 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1898 ),
1899 })
1900 }
1901 Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1902 {
1903 self.prev_token();
1904 Ok(Expr::Value(self.parse_value()?))
1905 }
1906 Token::UnicodeStringLiteral(_) => {
1907 self.prev_token();
1908 Ok(Expr::Value(self.parse_value()?))
1909 }
1910 Token::Number(_, _)
1911 | Token::SingleQuotedString(_)
1912 | Token::DoubleQuotedString(_)
1913 | Token::TripleSingleQuotedString(_)
1914 | Token::TripleDoubleQuotedString(_)
1915 | Token::DollarQuotedString(_)
1916 | Token::SingleQuotedByteStringLiteral(_)
1917 | Token::DoubleQuotedByteStringLiteral(_)
1918 | Token::TripleSingleQuotedByteStringLiteral(_)
1919 | Token::TripleDoubleQuotedByteStringLiteral(_)
1920 | Token::SingleQuotedRawStringLiteral(_)
1921 | Token::DoubleQuotedRawStringLiteral(_)
1922 | Token::TripleSingleQuotedRawStringLiteral(_)
1923 | Token::TripleDoubleQuotedRawStringLiteral(_)
1924 | Token::NationalStringLiteral(_)
1925 | Token::QuoteDelimitedStringLiteral(_)
1926 | Token::NationalQuoteDelimitedStringLiteral(_)
1927 | Token::HexStringLiteral(_) => {
1928 self.prev_token();
1929 Ok(Expr::Value(self.parse_value()?))
1930 }
1931 Token::LParen => {
1932 let expr =
1933 if let Some(expr) = self.try_parse_expr_sub_query()? {
1934 expr
1935 } else if let Some(lambda) = self.try_parse_lambda()? {
1936 return Ok(lambda);
1937 } else {
1938 let exprs = self.with_state(ParserState::Normal, |p| {
1949 p.parse_comma_separated(Parser::parse_expr)
1950 })?;
1951 match exprs.len() {
1952 0 => return Err(ParserError::ParserError(
1953 "Internal parser error: parse_comma_separated returned empty list"
1954 .to_string(),
1955 )),
1956 1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
1957 _ => Expr::Tuple(exprs),
1958 }
1959 };
1960 self.expect_token(&Token::RParen)?;
1961 Ok(expr)
1962 }
1963 Token::Placeholder(_) | Token::Colon | Token::AtSign => {
1964 self.prev_token();
1965 Ok(Expr::Value(self.parse_value()?))
1966 }
1967 Token::LBrace => {
1968 self.prev_token();
1969 self.parse_lbrace_expr()
1970 }
1971 _ => self.expected_at("an expression", next_token_index),
1972 }?;
1973
1974 Ok(expr)
1975 }
1976
1977 fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
1978 Ok(Expr::TypedString(TypedString {
1979 data_type: DataType::GeometricType(kind),
1980 value: self.parse_value()?,
1981 uses_odbc_syntax: false,
1982 }))
1983 }
1984
1985 pub fn parse_compound_expr(
1992 &mut self,
1993 root: Expr,
1994 mut chain: Vec<AccessExpr>,
1995 ) -> Result<Expr, ParserError> {
1996 let mut ending_wildcard: Option<TokenWithSpan> = None;
1997 loop {
1998 if self.consume_token(&Token::Period) {
1999 let next_token = self.peek_token_ref();
2000 match &next_token.token {
2001 Token::Mul => {
2002 if dialect_of!(self is PostgreSqlDialect) {
2005 ending_wildcard = Some(self.next_token());
2006 } else {
2007 self.prev_token(); }
2014
2015 break;
2016 }
2017 Token::SingleQuotedString(s) => {
2018 let expr =
2019 Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2020 chain.push(AccessExpr::Dot(expr));
2021 self.advance_token(); }
2023 Token::Placeholder(s) => {
2024 let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2027 chain.push(AccessExpr::Dot(expr));
2028 self.advance_token(); }
2030 _ => {
2035 let expr = self.maybe_parse(|parser| {
2036 let expr = parser
2037 .parse_subexpr(parser.dialect.prec_value(Precedence::Period))?;
2038 match &expr {
2039 Expr::CompoundFieldAccess { .. }
2040 | Expr::CompoundIdentifier(_)
2041 | Expr::Identifier(_)
2042 | Expr::Value(_)
2043 | Expr::Function(_) => Ok(expr),
2044 _ => parser.expected_ref(
2045 "an identifier or value",
2046 parser.peek_token_ref(),
2047 ),
2048 }
2049 })?;
2050
2051 match expr {
2052 Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2061 chain.push(AccessExpr::Dot(*root));
2062 chain.extend(access_chain);
2063 }
2064 Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2065 parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2066 ),
2067 Some(expr) => {
2068 chain.push(AccessExpr::Dot(expr));
2069 }
2070 None => {
2074 chain.push(AccessExpr::Dot(Expr::Identifier(
2075 self.parse_identifier()?,
2076 )));
2077 }
2078 }
2079 }
2080 }
2081 } else if !self.dialect.supports_partiql()
2082 && self.peek_token_ref().token == Token::LBracket
2083 {
2084 self.parse_multi_dim_subscript(&mut chain)?;
2085 } else {
2086 break;
2087 }
2088 }
2089
2090 let tok_index = self.get_current_index();
2091 if let Some(wildcard_token) = ending_wildcard {
2092 if !Self::is_all_ident(&root, &chain) {
2093 return self
2094 .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2095 };
2096 Ok(Expr::QualifiedWildcard(
2097 ObjectName::from(Self::exprs_to_idents(root, chain)?),
2098 AttachedToken(wildcard_token),
2099 ))
2100 } else if self.maybe_parse_outer_join_operator() {
2101 if !Self::is_all_ident(&root, &chain) {
2102 return self.expected_at("column identifier before (+)", tok_index);
2103 };
2104 let expr = if chain.is_empty() {
2105 root
2106 } else {
2107 Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2108 };
2109 Ok(Expr::OuterJoin(expr.into()))
2110 } else {
2111 Self::build_compound_expr(root, chain)
2112 }
2113 }
2114
2115 fn build_compound_expr(
2120 root: Expr,
2121 mut access_chain: Vec<AccessExpr>,
2122 ) -> Result<Expr, ParserError> {
2123 if access_chain.is_empty() {
2124 return Ok(root);
2125 }
2126
2127 if Self::is_all_ident(&root, &access_chain) {
2128 return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2129 root,
2130 access_chain,
2131 )?));
2132 }
2133
2134 if matches!(root, Expr::Identifier(_))
2139 && matches!(
2140 access_chain.last(),
2141 Some(AccessExpr::Dot(Expr::Function(_)))
2142 )
2143 && access_chain
2144 .iter()
2145 .rev()
2146 .skip(1) .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2148 {
2149 let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2150 return parser_err!("expected function expression", root.span().start);
2151 };
2152
2153 let compound_func_name = [root]
2154 .into_iter()
2155 .chain(access_chain.into_iter().flat_map(|access| match access {
2156 AccessExpr::Dot(expr) => Some(expr),
2157 _ => None,
2158 }))
2159 .flat_map(|expr| match expr {
2160 Expr::Identifier(ident) => Some(ident),
2161 _ => None,
2162 })
2163 .map(ObjectNamePart::Identifier)
2164 .chain(func.name.0)
2165 .collect::<Vec<_>>();
2166 func.name = ObjectName(compound_func_name);
2167
2168 return Ok(Expr::Function(func));
2169 }
2170
2171 if access_chain.len() == 1
2176 && matches!(
2177 access_chain.last(),
2178 Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2179 )
2180 {
2181 let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2182 return parser_err!("expected (+) expression", root.span().start);
2183 };
2184
2185 if !Self::is_all_ident(&root, &[]) {
2186 return parser_err!("column identifier before (+)", root.span().start);
2187 };
2188
2189 let token_start = root.span().start;
2190 let mut idents = Self::exprs_to_idents(root, vec![])?;
2191 match *inner_expr {
2192 Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2193 Expr::Identifier(suffix) => idents.push(suffix),
2194 _ => {
2195 return parser_err!("column identifier before (+)", token_start);
2196 }
2197 }
2198
2199 return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2200 }
2201
2202 Ok(Expr::CompoundFieldAccess {
2203 root: Box::new(root),
2204 access_chain,
2205 })
2206 }
2207
2208 fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2209 match k {
2210 Keyword::LOCAL => Some(ContextModifier::Local),
2211 Keyword::GLOBAL => Some(ContextModifier::Global),
2212 Keyword::SESSION => Some(ContextModifier::Session),
2213 _ => None,
2214 }
2215 }
2216
2217 fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2219 if !matches!(root, Expr::Identifier(_)) {
2220 return false;
2221 }
2222 fields
2223 .iter()
2224 .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2225 }
2226
2227 fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2229 let mut idents = vec![];
2230 if let Expr::Identifier(root) = root {
2231 idents.push(root);
2232 for x in fields {
2233 if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2234 idents.push(ident);
2235 } else {
2236 return parser_err!(
2237 format!("Expected identifier, found: {}", x),
2238 x.span().start
2239 );
2240 }
2241 }
2242 Ok(idents)
2243 } else {
2244 parser_err!(
2245 format!("Expected identifier, found: {}", root),
2246 root.span().start
2247 )
2248 }
2249 }
2250
2251 fn peek_outer_join_operator(&mut self) -> bool {
2253 if !self.dialect.supports_outer_join_operator() {
2254 return false;
2255 }
2256
2257 let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2258 Token::LParen == maybe_lparen.token
2259 && Token::Plus == maybe_plus.token
2260 && Token::RParen == maybe_rparen.token
2261 }
2262
2263 fn maybe_parse_outer_join_operator(&mut self) -> bool {
2266 self.dialect.supports_outer_join_operator()
2267 && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2268 }
2269
2270 pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2272 self.expect_token(&Token::LParen)?;
2273 let options = self.parse_comma_separated(Self::parse_utility_option)?;
2274 self.expect_token(&Token::RParen)?;
2275
2276 Ok(options)
2277 }
2278
2279 fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2280 let name = self.parse_identifier()?;
2281
2282 let next_token = self.peek_token_ref();
2283 if next_token == &Token::Comma || next_token == &Token::RParen {
2284 return Ok(UtilityOption { name, arg: None });
2285 }
2286 let arg = self.parse_expr()?;
2287
2288 Ok(UtilityOption {
2289 name,
2290 arg: Some(arg),
2291 })
2292 }
2293
2294 fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2295 if !self.peek_sub_query() {
2296 return Ok(None);
2297 }
2298
2299 Ok(Some(Expr::Subquery(self.parse_query()?)))
2300 }
2301
2302 fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2303 if !self.dialect.supports_lambda_functions() {
2304 return Ok(None);
2305 }
2306 self.maybe_parse(|p| {
2307 let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2308 p.expect_token(&Token::RParen)?;
2309 p.expect_token(&Token::Arrow)?;
2310 let expr = p.parse_expr()?;
2311 Ok(Expr::Lambda(LambdaFunction {
2312 params: OneOrManyWithParens::Many(params),
2313 body: Box::new(expr),
2314 syntax: LambdaSyntax::Arrow,
2315 }))
2316 })
2317 }
2318
2319 fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2329 let params = self.parse_lambda_function_parameters()?;
2331 self.expect_token(&Token::Colon)?;
2333 let body = self.parse_expr()?;
2335 Ok(Expr::Lambda(LambdaFunction {
2336 params,
2337 body: Box::new(body),
2338 syntax: LambdaSyntax::LambdaKeyword,
2339 }))
2340 }
2341
2342 fn parse_lambda_function_parameters(
2344 &mut self,
2345 ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2346 let params = if self.consume_token(&Token::LParen) {
2348 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2350 self.expect_token(&Token::RParen)?;
2351 OneOrManyWithParens::Many(params)
2352 } else {
2353 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2355 if params.len() == 1 {
2356 OneOrManyWithParens::One(params.into_iter().next().unwrap())
2357 } else {
2358 OneOrManyWithParens::Many(params)
2359 }
2360 };
2361 Ok(params)
2362 }
2363
2364 fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2366 let name = self.parse_identifier()?;
2367 let data_type = match &self.peek_token_ref().token {
2368 Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2369 _ => None,
2370 };
2371 Ok(LambdaFunctionParameter { name, data_type })
2372 }
2373
2374 fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2381 if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2383 return Ok(Some(expr));
2384 }
2385 self.maybe_parse_odbc_body_datetime()
2387 }
2388
2389 fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2400 self.maybe_parse(|p| {
2401 let token = p.next_token().clone();
2402 let word_string = token.token.to_string();
2403 let data_type = match word_string.as_str() {
2404 "t" => DataType::Time(None, TimezoneInfo::None),
2405 "d" => DataType::Date,
2406 "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2407 _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2408 };
2409 let value = p.parse_value()?;
2410 Ok(Expr::TypedString(TypedString {
2411 data_type,
2412 value,
2413 uses_odbc_syntax: true,
2414 }))
2415 })
2416 }
2417
2418 fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2427 self.maybe_parse(|p| {
2428 p.expect_keyword(Keyword::FN)?;
2429 let fn_name = p.parse_object_name(false)?;
2430 let mut fn_call = p.parse_function_call(fn_name)?;
2431 fn_call.uses_odbc_syntax = true;
2432 Ok(Expr::Function(fn_call))
2433 })
2434 }
2435
2436 pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2438 self.parse_function_call(name).map(Expr::Function)
2439 }
2440
2441 fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2442 self.expect_token(&Token::LParen)?;
2443
2444 if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2447 let subquery = self.parse_query()?;
2448 self.expect_token(&Token::RParen)?;
2449 return Ok(Function {
2450 name,
2451 uses_odbc_syntax: false,
2452 parameters: FunctionArguments::None,
2453 args: FunctionArguments::Subquery(subquery),
2454 filter: None,
2455 null_treatment: None,
2456 over: None,
2457 within_group: vec![],
2458 });
2459 }
2460
2461 let mut args = self.parse_function_argument_list()?;
2462 let mut parameters = FunctionArguments::None;
2463 if dialect_of!(self is ClickHouseDialect | GenericDialect)
2466 && self.consume_token(&Token::LParen)
2467 {
2468 parameters = FunctionArguments::List(args);
2469 args = self.parse_function_argument_list()?;
2470 }
2471
2472 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2473 self.expect_token(&Token::LParen)?;
2474 self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2475 let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2476 self.expect_token(&Token::RParen)?;
2477 order_by
2478 } else {
2479 vec![]
2480 };
2481
2482 let filter = if self.dialect.supports_filter_during_aggregation()
2483 && self.parse_keyword(Keyword::FILTER)
2484 && self.consume_token(&Token::LParen)
2485 && self.parse_keyword(Keyword::WHERE)
2486 {
2487 let filter = Some(Box::new(self.parse_expr()?));
2488 self.expect_token(&Token::RParen)?;
2489 filter
2490 } else {
2491 None
2492 };
2493
2494 let null_treatment = if args
2497 .clauses
2498 .iter()
2499 .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2500 {
2501 self.parse_null_treatment()?
2502 } else {
2503 None
2504 };
2505
2506 let over = if self.parse_keyword(Keyword::OVER) {
2507 if self.consume_token(&Token::LParen) {
2508 let window_spec = self.parse_window_spec()?;
2509 Some(WindowType::WindowSpec(window_spec))
2510 } else {
2511 Some(WindowType::NamedWindow(self.parse_identifier()?))
2512 }
2513 } else {
2514 None
2515 };
2516
2517 Ok(Function {
2518 name,
2519 uses_odbc_syntax: false,
2520 parameters,
2521 args: FunctionArguments::List(args),
2522 null_treatment,
2523 filter,
2524 over,
2525 within_group,
2526 })
2527 }
2528
2529 fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2531 match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2532 Some(keyword) => {
2533 self.expect_keyword_is(Keyword::NULLS)?;
2534
2535 Ok(match keyword {
2536 Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2537 Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2538 _ => None,
2539 })
2540 }
2541 None => Ok(None),
2542 }
2543 }
2544
2545 pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2547 let args = if self.consume_token(&Token::LParen) {
2548 FunctionArguments::List(self.parse_function_argument_list()?)
2549 } else {
2550 FunctionArguments::None
2551 };
2552 Ok(Expr::Function(Function {
2553 name,
2554 uses_odbc_syntax: false,
2555 parameters: FunctionArguments::None,
2556 args,
2557 filter: None,
2558 over: None,
2559 null_treatment: None,
2560 within_group: vec![],
2561 }))
2562 }
2563
2564 pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2566 let next_token = self.next_token();
2567 match &next_token.token {
2568 Token::Word(w) => match w.keyword {
2569 Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2570 Keyword::RANGE => Ok(WindowFrameUnits::Range),
2571 Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2572 _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2573 },
2574 _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2575 }
2576 }
2577
2578 pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2580 let units = self.parse_window_frame_units()?;
2581 let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2582 let start_bound = self.parse_window_frame_bound()?;
2583 self.expect_keyword_is(Keyword::AND)?;
2584 let end_bound = Some(self.parse_window_frame_bound()?);
2585 (start_bound, end_bound)
2586 } else {
2587 (self.parse_window_frame_bound()?, None)
2588 };
2589 Ok(WindowFrame {
2590 units,
2591 start_bound,
2592 end_bound,
2593 })
2594 }
2595
2596 pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2598 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2599 Ok(WindowFrameBound::CurrentRow)
2600 } else {
2601 let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2602 None
2603 } else {
2604 Some(Box::new(match &self.peek_token_ref().token {
2605 Token::SingleQuotedString(_) => self.parse_interval()?,
2606 _ => self.parse_expr()?,
2607 }))
2608 };
2609 if self.parse_keyword(Keyword::PRECEDING) {
2610 Ok(WindowFrameBound::Preceding(rows))
2611 } else if self.parse_keyword(Keyword::FOLLOWING) {
2612 Ok(WindowFrameBound::Following(rows))
2613 } else {
2614 self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2615 }
2616 }
2617 }
2618
2619 fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2621 if self.dialect.supports_group_by_expr() {
2622 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2623 self.expect_token(&Token::LParen)?;
2624 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2625 self.expect_token(&Token::RParen)?;
2626 Ok(Expr::GroupingSets(result))
2627 } else if self.parse_keyword(Keyword::CUBE) {
2628 self.expect_token(&Token::LParen)?;
2629 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2630 self.expect_token(&Token::RParen)?;
2631 Ok(Expr::Cube(result))
2632 } else if self.parse_keyword(Keyword::ROLLUP) {
2633 self.expect_token(&Token::LParen)?;
2634 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2635 self.expect_token(&Token::RParen)?;
2636 Ok(Expr::Rollup(result))
2637 } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2638 Ok(Expr::Tuple(vec![]))
2642 } else {
2643 self.parse_expr()
2644 }
2645 } else {
2646 self.parse_expr()
2648 }
2649 }
2650
2651 fn parse_tuple(
2655 &mut self,
2656 lift_singleton: bool,
2657 allow_empty: bool,
2658 ) -> Result<Vec<Expr>, ParserError> {
2659 if lift_singleton {
2660 if self.consume_token(&Token::LParen) {
2661 let result = if allow_empty && self.consume_token(&Token::RParen) {
2662 vec![]
2663 } else {
2664 let result = self.parse_comma_separated(Parser::parse_expr)?;
2665 self.expect_token(&Token::RParen)?;
2666 result
2667 };
2668 Ok(result)
2669 } else {
2670 Ok(vec![self.parse_expr()?])
2671 }
2672 } else {
2673 self.expect_token(&Token::LParen)?;
2674 let result = if allow_empty && self.consume_token(&Token::RParen) {
2675 vec![]
2676 } else {
2677 let result = self.parse_comma_separated(Parser::parse_expr)?;
2678 self.expect_token(&Token::RParen)?;
2679 result
2680 };
2681 Ok(result)
2682 }
2683 }
2684
2685 pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2687 let case_token = AttachedToken(self.get_current_token().clone());
2688 let mut operand = None;
2689 if !self.parse_keyword(Keyword::WHEN) {
2690 operand = Some(Box::new(self.parse_expr()?));
2691 self.expect_keyword_is(Keyword::WHEN)?;
2692 }
2693 let mut conditions = vec![];
2694 loop {
2695 let condition = self.parse_expr()?;
2696 self.expect_keyword_is(Keyword::THEN)?;
2697 let result = self.parse_expr()?;
2698 conditions.push(CaseWhen { condition, result });
2699 if !self.parse_keyword(Keyword::WHEN) {
2700 break;
2701 }
2702 }
2703 let else_result = if self.parse_keyword(Keyword::ELSE) {
2704 Some(Box::new(self.parse_expr()?))
2705 } else {
2706 None
2707 };
2708 let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2709 Ok(Expr::Case {
2710 case_token,
2711 end_token,
2712 operand,
2713 conditions,
2714 else_result,
2715 })
2716 }
2717
2718 pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2720 if self.parse_keyword(Keyword::FORMAT) {
2721 let value = self.parse_value()?;
2722 match self.parse_optional_time_zone()? {
2723 Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2724 None => Ok(Some(CastFormat::Value(value))),
2725 }
2726 } else {
2727 Ok(None)
2728 }
2729 }
2730
2731 pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2733 if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2734 self.parse_value().map(Some)
2735 } else {
2736 Ok(None)
2737 }
2738 }
2739
2740 fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2742 self.expect_token(&Token::LParen)?;
2743 let data_type = self.parse_data_type()?;
2744 self.expect_token(&Token::Comma)?;
2745 let expr = self.parse_expr()?;
2746 let styles = if self.consume_token(&Token::Comma) {
2747 self.parse_comma_separated(Parser::parse_expr)?
2748 } else {
2749 Default::default()
2750 };
2751 self.expect_token(&Token::RParen)?;
2752 Ok(Expr::Convert {
2753 is_try,
2754 expr: Box::new(expr),
2755 data_type: Some(data_type),
2756 charset: None,
2757 target_before_value: true,
2758 styles,
2759 })
2760 }
2761
2762 pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2767 if self.dialect.convert_type_before_value() {
2768 return self.parse_mssql_convert(is_try);
2769 }
2770 self.expect_token(&Token::LParen)?;
2771 let expr = self.parse_expr()?;
2772 if self.parse_keyword(Keyword::USING) {
2773 let charset = self.parse_object_name(false)?;
2774 self.expect_token(&Token::RParen)?;
2775 return Ok(Expr::Convert {
2776 is_try,
2777 expr: Box::new(expr),
2778 data_type: None,
2779 charset: Some(charset),
2780 target_before_value: false,
2781 styles: vec![],
2782 });
2783 }
2784 self.expect_token(&Token::Comma)?;
2785 let data_type = self.parse_data_type()?;
2786 let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2787 Some(self.parse_object_name(false)?)
2788 } else {
2789 None
2790 };
2791 self.expect_token(&Token::RParen)?;
2792 Ok(Expr::Convert {
2793 is_try,
2794 expr: Box::new(expr),
2795 data_type: Some(data_type),
2796 charset,
2797 target_before_value: false,
2798 styles: vec![],
2799 })
2800 }
2801
2802 pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2804 self.expect_token(&Token::LParen)?;
2805 let expr = self.parse_expr()?;
2806 self.expect_keyword_is(Keyword::AS)?;
2807 let data_type = self.parse_data_type()?;
2808 let array = self.parse_keyword(Keyword::ARRAY);
2809 let format = self.parse_optional_cast_format()?;
2810 self.expect_token(&Token::RParen)?;
2811 Ok(Expr::Cast {
2812 kind,
2813 expr: Box::new(expr),
2814 data_type,
2815 array,
2816 format,
2817 })
2818 }
2819
2820 pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2822 self.expect_token(&Token::LParen)?;
2823 let exists_node = Expr::Exists {
2824 negated,
2825 subquery: self.parse_query()?,
2826 };
2827 self.expect_token(&Token::RParen)?;
2828 Ok(exists_node)
2829 }
2830
2831 pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2833 self.expect_token(&Token::LParen)?;
2834 let field = self.parse_date_time_field()?;
2835
2836 let syntax = if self.parse_keyword(Keyword::FROM) {
2837 ExtractSyntax::From
2838 } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2839 {
2840 ExtractSyntax::Comma
2841 } else {
2842 return Err(ParserError::ParserError(
2843 "Expected 'FROM' or ','".to_string(),
2844 ));
2845 };
2846
2847 let expr = self.parse_expr()?;
2848 self.expect_token(&Token::RParen)?;
2849 Ok(Expr::Extract {
2850 field,
2851 expr: Box::new(expr),
2852 syntax,
2853 })
2854 }
2855
2856 pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2858 self.expect_token(&Token::LParen)?;
2859 let expr = self.parse_expr()?;
2860 let field = if self.parse_keyword(Keyword::TO) {
2862 CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2864 } else if self.consume_token(&Token::Comma) {
2865 let v = self.parse_value()?;
2867 if matches!(v.value, Value::Number(_, _)) {
2868 CeilFloorKind::Scale(v)
2869 } else {
2870 return Err(ParserError::ParserError(
2871 "Scale field can only be of number type".to_string(),
2872 ));
2873 }
2874 } else {
2875 CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2876 };
2877 self.expect_token(&Token::RParen)?;
2878 if is_ceil {
2879 Ok(Expr::Ceil {
2880 expr: Box::new(expr),
2881 field,
2882 })
2883 } else {
2884 Ok(Expr::Floor {
2885 expr: Box::new(expr),
2886 field,
2887 })
2888 }
2889 }
2890
2891 pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2893 let between_prec = self.dialect.prec_value(Precedence::Between);
2894 let position_expr = self.maybe_parse(|p| {
2895 p.expect_token(&Token::LParen)?;
2897
2898 let expr = p.parse_subexpr(between_prec)?;
2900 p.expect_keyword_is(Keyword::IN)?;
2901 let from = p.parse_expr()?;
2902 p.expect_token(&Token::RParen)?;
2903 Ok(Expr::Position {
2904 expr: Box::new(expr),
2905 r#in: Box::new(from),
2906 })
2907 })?;
2908 match position_expr {
2909 Some(expr) => Ok(expr),
2910 None => self.parse_function(ObjectName::from(vec![ident])),
2913 }
2914 }
2915
2916 pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
2918 let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
2919 Keyword::SUBSTR => true,
2920 Keyword::SUBSTRING => false,
2921 _ => {
2922 self.prev_token();
2923 return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
2924 }
2925 };
2926 self.expect_token(&Token::LParen)?;
2927 let expr = self.parse_expr()?;
2928 let mut from_expr = None;
2929 let special = self.consume_token(&Token::Comma);
2930 if special || self.parse_keyword(Keyword::FROM) {
2931 from_expr = Some(self.parse_expr()?);
2932 }
2933
2934 let mut to_expr = None;
2935 if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
2936 to_expr = Some(self.parse_expr()?);
2937 }
2938 self.expect_token(&Token::RParen)?;
2939
2940 Ok(Expr::Substring {
2941 expr: Box::new(expr),
2942 substring_from: from_expr.map(Box::new),
2943 substring_for: to_expr.map(Box::new),
2944 special,
2945 shorthand,
2946 })
2947 }
2948
2949 pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
2953 self.expect_token(&Token::LParen)?;
2955 let expr = self.parse_expr()?;
2956 self.expect_keyword_is(Keyword::PLACING)?;
2957 let what_expr = self.parse_expr()?;
2958 self.expect_keyword_is(Keyword::FROM)?;
2959 let from_expr = self.parse_expr()?;
2960 let mut for_expr = None;
2961 if self.parse_keyword(Keyword::FOR) {
2962 for_expr = Some(self.parse_expr()?);
2963 }
2964 self.expect_token(&Token::RParen)?;
2965
2966 Ok(Expr::Overlay {
2967 expr: Box::new(expr),
2968 overlay_what: Box::new(what_expr),
2969 overlay_from: Box::new(from_expr),
2970 overlay_for: for_expr.map(Box::new),
2971 })
2972 }
2973
2974 pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
2980 self.expect_token(&Token::LParen)?;
2981 let mut trim_where = None;
2982 if let Token::Word(word) = &self.peek_token_ref().token {
2983 if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
2984 trim_where = Some(self.parse_trim_where()?);
2985 }
2986 }
2987 let expr = self.parse_expr()?;
2988 if self.parse_keyword(Keyword::FROM) {
2989 let trim_what = Box::new(expr);
2990 let expr = self.parse_expr()?;
2991 self.expect_token(&Token::RParen)?;
2992 Ok(Expr::Trim {
2993 expr: Box::new(expr),
2994 trim_where,
2995 trim_what: Some(trim_what),
2996 trim_characters: None,
2997 })
2998 } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
2999 {
3000 let characters = self.parse_comma_separated(Parser::parse_expr)?;
3001 self.expect_token(&Token::RParen)?;
3002 Ok(Expr::Trim {
3003 expr: Box::new(expr),
3004 trim_where: None,
3005 trim_what: None,
3006 trim_characters: Some(characters),
3007 })
3008 } else {
3009 self.expect_token(&Token::RParen)?;
3010 Ok(Expr::Trim {
3011 expr: Box::new(expr),
3012 trim_where,
3013 trim_what: None,
3014 trim_characters: None,
3015 })
3016 }
3017 }
3018
3019 pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3023 let next_token = self.next_token();
3024 match &next_token.token {
3025 Token::Word(w) => match w.keyword {
3026 Keyword::BOTH => Ok(TrimWhereField::Both),
3027 Keyword::LEADING => Ok(TrimWhereField::Leading),
3028 Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3029 _ => self.expected("trim_where field", next_token)?,
3030 },
3031 _ => self.expected("trim_where field", next_token),
3032 }
3033 }
3034
3035 pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3038 let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3039 self.expect_token(&Token::RBracket)?;
3040 Ok(Expr::Array(Array { elem: exprs, named }))
3041 }
3042
3043 pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3047 if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3048 if self.parse_keyword(Keyword::ERROR) {
3049 Ok(Some(ListAggOnOverflow::Error))
3050 } else {
3051 self.expect_keyword_is(Keyword::TRUNCATE)?;
3052 let filler = match &self.peek_token_ref().token {
3053 Token::Word(w)
3054 if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3055 {
3056 None
3057 }
3058 Token::SingleQuotedString(_)
3059 | Token::EscapedStringLiteral(_)
3060 | Token::UnicodeStringLiteral(_)
3061 | Token::NationalStringLiteral(_)
3062 | Token::QuoteDelimitedStringLiteral(_)
3063 | Token::NationalQuoteDelimitedStringLiteral(_)
3064 | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3065 _ => self.expected_ref(
3066 "either filler, WITH, or WITHOUT in LISTAGG",
3067 self.peek_token_ref(),
3068 )?,
3069 };
3070 let with_count = self.parse_keyword(Keyword::WITH);
3071 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3072 self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3073 }
3074 self.expect_keyword_is(Keyword::COUNT)?;
3075 Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3076 }
3077 } else {
3078 Ok(None)
3079 }
3080 }
3081
3082 pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3089 let next_token = self.next_token();
3090 match &next_token.token {
3091 Token::Word(w) => match w.keyword {
3092 Keyword::YEAR => Ok(DateTimeField::Year),
3093 Keyword::YEARS => Ok(DateTimeField::Years),
3094 Keyword::MONTH => Ok(DateTimeField::Month),
3095 Keyword::MONTHS => Ok(DateTimeField::Months),
3096 Keyword::WEEK => {
3097 let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3098 && self.consume_token(&Token::LParen)
3099 {
3100 let week_day = self.parse_identifier()?;
3101 self.expect_token(&Token::RParen)?;
3102 Some(week_day)
3103 } else {
3104 None
3105 };
3106 Ok(DateTimeField::Week(week_day))
3107 }
3108 Keyword::WEEKS => Ok(DateTimeField::Weeks),
3109 Keyword::DAY => Ok(DateTimeField::Day),
3110 Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3111 Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3112 Keyword::DAYS => Ok(DateTimeField::Days),
3113 Keyword::DATE => Ok(DateTimeField::Date),
3114 Keyword::DATETIME => Ok(DateTimeField::Datetime),
3115 Keyword::HOUR => Ok(DateTimeField::Hour),
3116 Keyword::HOURS => Ok(DateTimeField::Hours),
3117 Keyword::MINUTE => Ok(DateTimeField::Minute),
3118 Keyword::MINUTES => Ok(DateTimeField::Minutes),
3119 Keyword::SECOND => Ok(DateTimeField::Second),
3120 Keyword::SECONDS => Ok(DateTimeField::Seconds),
3121 Keyword::CENTURY => Ok(DateTimeField::Century),
3122 Keyword::DECADE => Ok(DateTimeField::Decade),
3123 Keyword::DOY => Ok(DateTimeField::Doy),
3124 Keyword::DOW => Ok(DateTimeField::Dow),
3125 Keyword::EPOCH => Ok(DateTimeField::Epoch),
3126 Keyword::ISODOW => Ok(DateTimeField::Isodow),
3127 Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3128 Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3129 Keyword::JULIAN => Ok(DateTimeField::Julian),
3130 Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3131 Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3132 Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3133 Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3134 Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3135 Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3136 Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3137 Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3138 Keyword::QUARTER => Ok(DateTimeField::Quarter),
3139 Keyword::TIME => Ok(DateTimeField::Time),
3140 Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3141 Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3142 Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3143 Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3144 Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3145 _ if self.dialect.allow_extract_custom() => {
3146 self.prev_token();
3147 let custom = self.parse_identifier()?;
3148 Ok(DateTimeField::Custom(custom))
3149 }
3150 _ => self.expected("date/time field", next_token),
3151 },
3152 Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3153 self.prev_token();
3154 let custom = self.parse_identifier()?;
3155 Ok(DateTimeField::Custom(custom))
3156 }
3157 _ => self.expected("date/time field", next_token),
3158 }
3159 }
3160
3161 pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3165 match &self.peek_token_ref().token {
3166 Token::Word(w) => match w.keyword {
3167 Keyword::EXISTS => {
3168 let negated = true;
3169 let _ = self.parse_keyword(Keyword::EXISTS);
3170 self.parse_exists_expr(negated)
3171 }
3172 _ => Ok(Expr::UnaryOp {
3173 op: UnaryOperator::Not,
3174 expr: Box::new(
3175 self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3176 ),
3177 }),
3178 },
3179 _ => Ok(Expr::UnaryOp {
3180 op: UnaryOperator::Not,
3181 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3182 }),
3183 }
3184 }
3185
3186 fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3196 let token = self.expect_token(&Token::LBrace)?;
3197
3198 if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3199 self.expect_token(&Token::RBrace)?;
3200 return Ok(fn_expr);
3201 }
3202
3203 if self.dialect.supports_dictionary_syntax() {
3204 self.prev_token(); return self.parse_dictionary();
3206 }
3207
3208 self.expected("an expression", token)
3209 }
3210
3211 pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3217 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3218
3219 self.expect_keyword_is(Keyword::AGAINST)?;
3220
3221 self.expect_token(&Token::LParen)?;
3222
3223 let match_value = self.parse_value()?;
3225
3226 let in_natural_language_mode_keywords = &[
3227 Keyword::IN,
3228 Keyword::NATURAL,
3229 Keyword::LANGUAGE,
3230 Keyword::MODE,
3231 ];
3232
3233 let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3234
3235 let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3236
3237 let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3238 if self.parse_keywords(with_query_expansion_keywords) {
3239 Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3240 } else {
3241 Some(SearchModifier::InNaturalLanguageMode)
3242 }
3243 } else if self.parse_keywords(in_boolean_mode_keywords) {
3244 Some(SearchModifier::InBooleanMode)
3245 } else if self.parse_keywords(with_query_expansion_keywords) {
3246 Some(SearchModifier::WithQueryExpansion)
3247 } else {
3248 None
3249 };
3250
3251 self.expect_token(&Token::RParen)?;
3252
3253 Ok(Expr::MatchAgainst {
3254 columns,
3255 match_value,
3256 opt_search_modifier,
3257 })
3258 }
3259
3260 pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3276 let value = if self.dialect.require_interval_qualifier() {
3285 self.parse_expr()?
3287 } else {
3288 self.parse_prefix()?
3291 };
3292
3293 let leading_field = if self.next_token_is_temporal_unit() {
3299 Some(self.parse_date_time_field()?)
3300 } else if self.dialect.require_interval_qualifier() {
3301 return parser_err!(
3302 "INTERVAL requires a unit after the literal value",
3303 self.peek_token_ref().span.start
3304 );
3305 } else {
3306 None
3307 };
3308
3309 let (leading_precision, last_field, fsec_precision) =
3310 if leading_field == Some(DateTimeField::Second) {
3311 let last_field = None;
3317 let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3318 (leading_precision, last_field, fsec_precision)
3319 } else {
3320 let leading_precision = self.parse_optional_precision()?;
3321 if self.parse_keyword(Keyword::TO) {
3322 let last_field = Some(self.parse_date_time_field()?);
3323 let fsec_precision = if last_field == Some(DateTimeField::Second) {
3324 self.parse_optional_precision()?
3325 } else {
3326 None
3327 };
3328 (leading_precision, last_field, fsec_precision)
3329 } else {
3330 (leading_precision, None, None)
3331 }
3332 };
3333
3334 Ok(Expr::Interval(Interval {
3335 value: Box::new(value),
3336 leading_field,
3337 leading_precision,
3338 last_field,
3339 fractional_seconds_precision: fsec_precision,
3340 }))
3341 }
3342
3343 pub fn next_token_is_temporal_unit(&mut self) -> bool {
3346 if let Token::Word(word) = &self.peek_token_ref().token {
3347 matches!(
3348 word.keyword,
3349 Keyword::YEAR
3350 | Keyword::YEARS
3351 | Keyword::MONTH
3352 | Keyword::MONTHS
3353 | Keyword::WEEK
3354 | Keyword::WEEKS
3355 | Keyword::DAY
3356 | Keyword::DAYS
3357 | Keyword::HOUR
3358 | Keyword::HOURS
3359 | Keyword::MINUTE
3360 | Keyword::MINUTES
3361 | Keyword::SECOND
3362 | Keyword::SECONDS
3363 | Keyword::CENTURY
3364 | Keyword::DECADE
3365 | Keyword::DOW
3366 | Keyword::DOY
3367 | Keyword::EPOCH
3368 | Keyword::ISODOW
3369 | Keyword::ISOYEAR
3370 | Keyword::JULIAN
3371 | Keyword::MICROSECOND
3372 | Keyword::MICROSECONDS
3373 | Keyword::MILLENIUM
3374 | Keyword::MILLENNIUM
3375 | Keyword::MILLISECOND
3376 | Keyword::MILLISECONDS
3377 | Keyword::NANOSECOND
3378 | Keyword::NANOSECONDS
3379 | Keyword::QUARTER
3380 | Keyword::TIMEZONE
3381 | Keyword::TIMEZONE_HOUR
3382 | Keyword::TIMEZONE_MINUTE
3383 )
3384 } else {
3385 false
3386 }
3387 }
3388
3389 fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3397 self.prev_token();
3399 let (fields, trailing_bracket) =
3400 self.parse_struct_type_def(Self::parse_struct_field_def)?;
3401 if trailing_bracket.0 {
3402 return parser_err!(
3403 "unmatched > in STRUCT literal",
3404 self.peek_token_ref().span.start
3405 );
3406 }
3407
3408 self.expect_token(&Token::LParen)?;
3410 let values = self
3411 .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3412 self.expect_token(&Token::RParen)?;
3413
3414 Ok(Expr::Struct { values, fields })
3415 }
3416
3417 fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3431 let expr = self.parse_expr()?;
3432 if self.parse_keyword(Keyword::AS) {
3433 if typed_syntax {
3434 return parser_err!("Typed syntax does not allow AS", {
3435 self.prev_token();
3436 self.peek_token_ref().span.start
3437 });
3438 }
3439 let field_name = self.parse_identifier()?;
3440 Ok(Expr::Named {
3441 expr: expr.into(),
3442 name: field_name,
3443 })
3444 } else {
3445 Ok(expr)
3446 }
3447 }
3448
3449 fn parse_struct_type_def<F>(
3462 &mut self,
3463 mut elem_parser: F,
3464 ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3465 where
3466 F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3467 {
3468 self.expect_keyword_is(Keyword::STRUCT)?;
3469
3470 if self.peek_token_ref().token != Token::Lt {
3472 return Ok((Default::default(), false.into()));
3473 }
3474 self.next_token();
3475
3476 let mut field_defs = vec![];
3477 let trailing_bracket = loop {
3478 let (def, trailing_bracket) = elem_parser(self)?;
3479 field_defs.push(def);
3480 if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3482 break trailing_bracket;
3483 }
3484 };
3485
3486 Ok((
3487 field_defs,
3488 self.expect_closing_angle_bracket(trailing_bracket)?,
3489 ))
3490 }
3491
3492 fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3494 self.expect_keyword_is(Keyword::STRUCT)?;
3495 self.expect_token(&Token::LParen)?;
3496 let struct_body = self.parse_comma_separated(|parser| {
3497 let field_name = parser.parse_identifier()?;
3498 let field_type = parser.parse_data_type()?;
3499
3500 Ok(StructField {
3501 field_name: Some(field_name),
3502 field_type,
3503 options: None,
3504 })
3505 });
3506 self.expect_token(&Token::RParen)?;
3507 struct_body
3508 }
3509
3510 fn parse_struct_field_def(
3522 &mut self,
3523 ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3524 let is_named_field = matches!(
3527 (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3528 (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3529 );
3530
3531 let field_name = if is_named_field {
3532 let name = self.parse_identifier()?;
3533 let _ = self.consume_token(&Token::Colon);
3534 Some(name)
3535 } else {
3536 None
3537 };
3538
3539 let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3540
3541 let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3542 Ok((
3543 StructField {
3544 field_name,
3545 field_type,
3546 options,
3547 },
3548 trailing_bracket,
3549 ))
3550 }
3551
3552 fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3562 self.expect_keyword_is(Keyword::UNION)?;
3563
3564 self.expect_token(&Token::LParen)?;
3565
3566 let fields = self.parse_comma_separated(|p| {
3567 Ok(UnionField {
3568 field_name: p.parse_identifier()?,
3569 field_type: p.parse_data_type()?,
3570 })
3571 })?;
3572
3573 self.expect_token(&Token::RParen)?;
3574
3575 Ok(fields)
3576 }
3577
3578 fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3589 self.expect_token(&Token::LBrace)?;
3590
3591 let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3592
3593 self.expect_token(&Token::RBrace)?;
3594
3595 Ok(Expr::Dictionary(fields))
3596 }
3597
3598 fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3609 let key = self.parse_identifier()?;
3610
3611 self.expect_token(&Token::Colon)?;
3612
3613 let expr = self.parse_expr()?;
3614
3615 Ok(DictionaryField {
3616 key,
3617 value: Box::new(expr),
3618 })
3619 }
3620
3621 fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3631 self.expect_token(&Token::LBrace)?;
3632 let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3633 self.expect_token(&Token::RBrace)?;
3634 Ok(Expr::Map(Map { entries: fields }))
3635 }
3636
3637 fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3647 let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3649
3650 self.expect_token(&Token::Colon)?;
3651
3652 let value = self.parse_expr()?;
3653
3654 Ok(MapEntry {
3655 key: Box::new(key),
3656 value: Box::new(value),
3657 })
3658 }
3659
3660 fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3670 self.expect_keyword_is(Keyword::MAP)?;
3671 self.expect_token(&Token::LParen)?;
3672 let key_data_type = self.parse_data_type()?;
3673 self.expect_token(&Token::Comma)?;
3674 let value_data_type = self.parse_data_type()?;
3675 self.expect_token(&Token::RParen)?;
3676
3677 Ok((key_data_type, value_data_type))
3678 }
3679
3680 fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3690 self.expect_keyword_is(Keyword::TUPLE)?;
3691 self.expect_token(&Token::LParen)?;
3692 let mut field_defs = vec![];
3693 loop {
3694 let (def, _) = self.parse_struct_field_def()?;
3695 field_defs.push(def);
3696 if !self.consume_token(&Token::Comma) {
3697 break;
3698 }
3699 }
3700 self.expect_token(&Token::RParen)?;
3701
3702 Ok(field_defs)
3703 }
3704
3705 fn expect_closing_angle_bracket(
3710 &mut self,
3711 trailing_bracket: MatchedTrailingBracket,
3712 ) -> Result<MatchedTrailingBracket, ParserError> {
3713 let trailing_bracket = if !trailing_bracket.0 {
3714 match &self.peek_token_ref().token {
3715 Token::Gt => {
3716 self.next_token();
3717 false.into()
3718 }
3719 Token::ShiftRight => {
3720 self.next_token();
3721 true.into()
3722 }
3723 _ => return self.expected_ref(">", self.peek_token_ref()),
3724 }
3725 } else {
3726 false.into()
3727 };
3728
3729 Ok(trailing_bracket)
3730 }
3731
3732 pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3734 if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3736 return infix;
3737 }
3738
3739 let dialect = self.dialect;
3740
3741 self.advance_token();
3742 let tok = self.get_current_token();
3743 debug!("infix: {tok:?}");
3744 let tok_index = self.get_current_index();
3745 let span = tok.span;
3746 let regular_binary_operator = match &tok.token {
3747 Token::Spaceship => Some(BinaryOperator::Spaceship),
3748 Token::DoubleEq => Some(BinaryOperator::Eq),
3749 Token::Assignment => Some(BinaryOperator::Assignment),
3750 Token::Eq => Some(BinaryOperator::Eq),
3751 Token::Neq => Some(BinaryOperator::NotEq),
3752 Token::Gt => Some(BinaryOperator::Gt),
3753 Token::GtEq => Some(BinaryOperator::GtEq),
3754 Token::Lt => Some(BinaryOperator::Lt),
3755 Token::LtEq => Some(BinaryOperator::LtEq),
3756 Token::Plus => Some(BinaryOperator::Plus),
3757 Token::Minus => Some(BinaryOperator::Minus),
3758 Token::Mul => Some(BinaryOperator::Multiply),
3759 Token::Mod => Some(BinaryOperator::Modulo),
3760 Token::StringConcat => Some(BinaryOperator::StringConcat),
3761 Token::Pipe => Some(BinaryOperator::BitwiseOr),
3762 Token::Caret => {
3763 if dialect_is!(dialect is PostgreSqlDialect) {
3766 Some(BinaryOperator::PGExp)
3767 } else {
3768 Some(BinaryOperator::BitwiseXor)
3769 }
3770 }
3771 Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3772 Token::Div => Some(BinaryOperator::Divide),
3773 Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3774 Some(BinaryOperator::DuckIntegerDivide)
3775 }
3776 Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3777 Some(BinaryOperator::PGBitwiseShiftLeft)
3778 }
3779 Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3780 Some(BinaryOperator::PGBitwiseShiftRight)
3781 }
3782 Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3783 Some(BinaryOperator::PGBitwiseXor)
3784 }
3785 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3786 Some(BinaryOperator::PGOverlap)
3787 }
3788 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3789 Some(BinaryOperator::PGOverlap)
3790 }
3791 Token::Overlap if dialect.supports_double_ampersand_operator() => {
3792 Some(BinaryOperator::And)
3793 }
3794 Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3795 Some(BinaryOperator::PGStartsWith)
3796 }
3797 Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3798 Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3799 Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3800 Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3801 Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3802 Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3803 Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3804 Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3805 Token::Arrow => Some(BinaryOperator::Arrow),
3806 Token::LongArrow => Some(BinaryOperator::LongArrow),
3807 Token::HashArrow => Some(BinaryOperator::HashArrow),
3808 Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3809 Token::AtArrow => Some(BinaryOperator::AtArrow),
3810 Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3811 Token::HashMinus => Some(BinaryOperator::HashMinus),
3812 Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3813 Token::AtAt => Some(BinaryOperator::AtAt),
3814 Token::Question => Some(BinaryOperator::Question),
3815 Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3816 Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3817 Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3818 Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3819 Some(BinaryOperator::DoubleHash)
3820 }
3821
3822 Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3823 Some(BinaryOperator::AndLt)
3824 }
3825 Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3826 Some(BinaryOperator::AndGt)
3827 }
3828 Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3829 Some(BinaryOperator::QuestionDash)
3830 }
3831 Token::AmpersandLeftAngleBracketVerticalBar
3832 if self.dialect.supports_geometric_types() =>
3833 {
3834 Some(BinaryOperator::AndLtPipe)
3835 }
3836 Token::VerticalBarAmpersandRightAngleBracket
3837 if self.dialect.supports_geometric_types() =>
3838 {
3839 Some(BinaryOperator::PipeAndGt)
3840 }
3841 Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3842 Some(BinaryOperator::LtDashGt)
3843 }
3844 Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3845 Some(BinaryOperator::LtCaret)
3846 }
3847 Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3848 Some(BinaryOperator::GtCaret)
3849 }
3850 Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3851 Some(BinaryOperator::QuestionHash)
3852 }
3853 Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3854 Some(BinaryOperator::QuestionDoublePipe)
3855 }
3856 Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3857 Some(BinaryOperator::QuestionDashPipe)
3858 }
3859 Token::TildeEqual if self.dialect.supports_geometric_types() => {
3860 Some(BinaryOperator::TildeEq)
3861 }
3862 Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3863 Some(BinaryOperator::LtLtPipe)
3864 }
3865 Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3866 Some(BinaryOperator::PipeGtGt)
3867 }
3868 Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3869
3870 Token::Word(w) => match w.keyword {
3871 Keyword::AND => Some(BinaryOperator::And),
3872 Keyword::OR => Some(BinaryOperator::Or),
3873 Keyword::XOR => Some(BinaryOperator::Xor),
3874 Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3875 Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3876 self.expect_token(&Token::LParen)?;
3877 let mut idents = vec![];
3882 loop {
3883 self.advance_token();
3884 idents.push(self.get_current_token().to_string());
3885 if !self.consume_token(&Token::Period) {
3886 break;
3887 }
3888 }
3889 self.expect_token(&Token::RParen)?;
3890 Some(BinaryOperator::PGCustomBinaryOperator(idents))
3891 }
3892 _ => None,
3893 },
3894 _ => None,
3895 };
3896
3897 let tok = self.token_at(tok_index);
3898 if let Some(op) = regular_binary_operator {
3899 if let Some(keyword) =
3900 self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
3901 {
3902 self.expect_token(&Token::LParen)?;
3903 let right = if self.peek_sub_query() {
3904 self.prev_token(); self.parse_subexpr(precedence)?
3908 } else {
3909 let right = self.parse_subexpr(precedence)?;
3911 self.expect_token(&Token::RParen)?;
3912 right
3913 };
3914
3915 if !matches!(
3916 op,
3917 BinaryOperator::Gt
3918 | BinaryOperator::Lt
3919 | BinaryOperator::GtEq
3920 | BinaryOperator::LtEq
3921 | BinaryOperator::Eq
3922 | BinaryOperator::NotEq
3923 | BinaryOperator::PGRegexMatch
3924 | BinaryOperator::PGRegexIMatch
3925 | BinaryOperator::PGRegexNotMatch
3926 | BinaryOperator::PGRegexNotIMatch
3927 | BinaryOperator::PGLikeMatch
3928 | BinaryOperator::PGILikeMatch
3929 | BinaryOperator::PGNotLikeMatch
3930 | BinaryOperator::PGNotILikeMatch
3931 ) {
3932 return parser_err!(
3933 format!(
3934 "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
3935 ),
3936 span.start
3937 );
3938 };
3939
3940 Ok(match keyword {
3941 Keyword::ALL => Expr::AllOp {
3942 left: Box::new(expr),
3943 compare_op: op,
3944 right: Box::new(right),
3945 },
3946 Keyword::ANY | Keyword::SOME => Expr::AnyOp {
3947 left: Box::new(expr),
3948 compare_op: op,
3949 right: Box::new(right),
3950 is_some: keyword == Keyword::SOME,
3951 },
3952 unexpected_keyword => return Err(ParserError::ParserError(
3953 format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
3954 )),
3955 })
3956 } else {
3957 Ok(Expr::BinaryOp {
3958 left: Box::new(expr),
3959 op,
3960 right: Box::new(self.parse_subexpr(precedence)?),
3961 })
3962 }
3963 } else if let Token::Word(w) = &tok.token {
3964 match w.keyword {
3965 Keyword::IS => {
3966 if self.parse_keyword(Keyword::NULL) {
3967 Ok(Expr::IsNull(Box::new(expr)))
3968 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
3969 Ok(Expr::IsNotNull(Box::new(expr)))
3970 } else if self.parse_keywords(&[Keyword::TRUE]) {
3971 Ok(Expr::IsTrue(Box::new(expr)))
3972 } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
3973 Ok(Expr::IsNotTrue(Box::new(expr)))
3974 } else if self.parse_keywords(&[Keyword::FALSE]) {
3975 Ok(Expr::IsFalse(Box::new(expr)))
3976 } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
3977 Ok(Expr::IsNotFalse(Box::new(expr)))
3978 } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
3979 Ok(Expr::IsUnknown(Box::new(expr)))
3980 } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
3981 Ok(Expr::IsNotUnknown(Box::new(expr)))
3982 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
3983 let expr2 = self.parse_expr()?;
3984 Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
3985 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
3986 {
3987 let expr2 = self.parse_expr()?;
3988 Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
3989 } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
3990 Ok(is_normalized)
3991 } else {
3992 self.expected_ref(
3993 "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS",
3994 self.peek_token_ref(),
3995 )
3996 }
3997 }
3998 Keyword::AT => {
3999 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4000 Ok(Expr::AtTimeZone {
4001 timestamp: Box::new(expr),
4002 time_zone: Box::new(self.parse_subexpr(precedence)?),
4003 })
4004 }
4005 Keyword::NOT
4006 | Keyword::IN
4007 | Keyword::BETWEEN
4008 | Keyword::LIKE
4009 | Keyword::ILIKE
4010 | Keyword::SIMILAR
4011 | Keyword::REGEXP
4012 | Keyword::RLIKE => {
4013 self.prev_token();
4014 let negated = self.parse_keyword(Keyword::NOT);
4015 let regexp = self.parse_keyword(Keyword::REGEXP);
4016 let rlike = self.parse_keyword(Keyword::RLIKE);
4017 let null = if !self.in_column_definition_state() {
4018 self.parse_keyword(Keyword::NULL)
4019 } else {
4020 false
4021 };
4022 if regexp || rlike {
4023 Ok(Expr::RLike {
4024 negated,
4025 expr: Box::new(expr),
4026 pattern: Box::new(
4027 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4028 ),
4029 regexp,
4030 })
4031 } else if negated && null {
4032 Ok(Expr::IsNotNull(Box::new(expr)))
4033 } else if self.parse_keyword(Keyword::IN) {
4034 self.parse_in(expr, negated)
4035 } else if self.parse_keyword(Keyword::BETWEEN) {
4036 self.parse_between(expr, negated)
4037 } else if self.parse_keyword(Keyword::LIKE) {
4038 Ok(Expr::Like {
4039 negated,
4040 any: self.parse_keyword(Keyword::ANY),
4041 expr: Box::new(expr),
4042 pattern: Box::new(
4043 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4044 ),
4045 escape_char: self.parse_escape_char()?,
4046 })
4047 } else if self.parse_keyword(Keyword::ILIKE) {
4048 Ok(Expr::ILike {
4049 negated,
4050 any: self.parse_keyword(Keyword::ANY),
4051 expr: Box::new(expr),
4052 pattern: Box::new(
4053 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4054 ),
4055 escape_char: self.parse_escape_char()?,
4056 })
4057 } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4058 Ok(Expr::SimilarTo {
4059 negated,
4060 expr: Box::new(expr),
4061 pattern: Box::new(
4062 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4063 ),
4064 escape_char: self.parse_escape_char()?,
4065 })
4066 } else {
4067 self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4068 }
4069 }
4070 Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4071 Ok(Expr::IsNotNull(Box::new(expr)))
4072 }
4073 Keyword::MEMBER => {
4074 if self.parse_keyword(Keyword::OF) {
4075 self.expect_token(&Token::LParen)?;
4076 let array = self.parse_expr()?;
4077 self.expect_token(&Token::RParen)?;
4078 Ok(Expr::MemberOf(MemberOf {
4079 value: Box::new(expr),
4080 array: Box::new(array),
4081 }))
4082 } else {
4083 self.expected_ref("OF after MEMBER", self.peek_token_ref())
4084 }
4085 }
4086 _ => parser_err!(
4088 format!("No infix parser for token {:?}", tok.token),
4089 tok.span.start
4090 ),
4091 }
4092 } else if Token::DoubleColon == *tok {
4093 Ok(Expr::Cast {
4094 kind: CastKind::DoubleColon,
4095 expr: Box::new(expr),
4096 data_type: self.parse_data_type()?,
4097 array: false,
4098 format: None,
4099 })
4100 } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4101 Ok(Expr::UnaryOp {
4102 op: UnaryOperator::PGPostfixFactorial,
4103 expr: Box::new(expr),
4104 })
4105 } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4106 || (Token::Colon == *tok)
4107 {
4108 self.prev_token();
4109 self.parse_json_access(expr)
4110 } else {
4111 parser_err!(
4113 format!("No infix parser for token {:?}", tok.token),
4114 tok.span.start
4115 )
4116 }
4117 }
4118
4119 pub fn parse_escape_char(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
4121 if self.parse_keyword(Keyword::ESCAPE) {
4122 Ok(Some(self.parse_value()?))
4123 } else {
4124 Ok(None)
4125 }
4126 }
4127
4128 fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4138 let lower_bound = if self.consume_token(&Token::Colon) {
4140 None
4141 } else {
4142 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4144 };
4145
4146 if self.consume_token(&Token::RBracket) {
4148 if let Some(lower_bound) = lower_bound {
4149 return Ok(Subscript::Index { index: lower_bound });
4150 };
4151 return Ok(Subscript::Slice {
4152 lower_bound,
4153 upper_bound: None,
4154 stride: None,
4155 });
4156 }
4157
4158 if lower_bound.is_some() {
4160 self.expect_token(&Token::Colon)?;
4161 }
4162
4163 let upper_bound = if self.consume_token(&Token::RBracket) {
4165 return Ok(Subscript::Slice {
4166 lower_bound,
4167 upper_bound: None,
4168 stride: None,
4169 });
4170 } else {
4171 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4173 };
4174
4175 if self.consume_token(&Token::RBracket) {
4177 return Ok(Subscript::Slice {
4178 lower_bound,
4179 upper_bound,
4180 stride: None,
4181 });
4182 }
4183
4184 self.expect_token(&Token::Colon)?;
4186 let stride = if self.consume_token(&Token::RBracket) {
4187 None
4188 } else {
4189 Some(self.parse_expr()?)
4190 };
4191
4192 if stride.is_some() {
4193 self.expect_token(&Token::RBracket)?;
4194 }
4195
4196 Ok(Subscript::Slice {
4197 lower_bound,
4198 upper_bound,
4199 stride,
4200 })
4201 }
4202
4203 pub fn parse_multi_dim_subscript(
4205 &mut self,
4206 chain: &mut Vec<AccessExpr>,
4207 ) -> Result<(), ParserError> {
4208 while self.consume_token(&Token::LBracket) {
4209 self.parse_subscript(chain)?;
4210 }
4211 Ok(())
4212 }
4213
4214 fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4218 let subscript = self.parse_subscript_inner()?;
4219 chain.push(AccessExpr::Subscript(subscript));
4220 Ok(())
4221 }
4222
4223 fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4224 let token = self.next_token();
4225 match token.token {
4226 Token::Word(Word {
4227 value,
4228 quote_style: quote_style @ (Some('"') | Some('`') | None),
4231 keyword: _,
4234 }) => Ok(JsonPathElem::Dot {
4235 key: value,
4236 quoted: quote_style.is_some(),
4237 }),
4238
4239 Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4243
4244 _ => self.expected("variant object key name", token),
4245 }
4246 }
4247
4248 fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4249 let path = self.parse_json_path()?;
4250 Ok(Expr::JsonAccess {
4251 value: Box::new(expr),
4252 path,
4253 })
4254 }
4255
4256 fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4257 let mut path = Vec::new();
4258 loop {
4259 match self.next_token().token {
4260 Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4261 self.next_token();
4262 let key = self.parse_wildcard_expr()?;
4263 self.expect_token(&Token::RBracket)?;
4264 path.push(JsonPathElem::ColonBracket { key });
4265 }
4266 Token::Colon if path.is_empty() => {
4267 path.push(self.parse_json_path_object_key()?);
4268 }
4269 Token::Period if !path.is_empty() => {
4270 path.push(self.parse_json_path_object_key()?);
4271 }
4272 Token::LBracket => {
4273 let key = self.parse_wildcard_expr()?;
4274 self.expect_token(&Token::RBracket)?;
4275
4276 path.push(JsonPathElem::Bracket { key });
4277 }
4278 _ => {
4279 self.prev_token();
4280 break;
4281 }
4282 };
4283 }
4284
4285 debug_assert!(!path.is_empty());
4286 Ok(JsonPath { path })
4287 }
4288
4289 pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4291 if self.parse_keyword(Keyword::UNNEST) {
4294 self.expect_token(&Token::LParen)?;
4295 let array_expr = self.parse_expr()?;
4296 self.expect_token(&Token::RParen)?;
4297 return Ok(Expr::InUnnest {
4298 expr: Box::new(expr),
4299 array_expr: Box::new(array_expr),
4300 negated,
4301 });
4302 }
4303 self.expect_token(&Token::LParen)?;
4304 let in_op = match self.maybe_parse(|p| p.parse_query())? {
4305 Some(subquery) => Expr::InSubquery {
4306 expr: Box::new(expr),
4307 subquery,
4308 negated,
4309 },
4310 None => Expr::InList {
4311 expr: Box::new(expr),
4312 list: if self.dialect.supports_in_empty_list() {
4313 self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4314 } else {
4315 self.parse_comma_separated(Parser::parse_expr)?
4316 },
4317 negated,
4318 },
4319 };
4320 self.expect_token(&Token::RParen)?;
4321 Ok(in_op)
4322 }
4323
4324 pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4326 let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4329 self.expect_keyword_is(Keyword::AND)?;
4330 let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4331 Ok(Expr::Between {
4332 expr: Box::new(expr),
4333 negated,
4334 low: Box::new(low),
4335 high: Box::new(high),
4336 })
4337 }
4338
4339 pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4341 Ok(Expr::Cast {
4342 kind: CastKind::DoubleColon,
4343 expr: Box::new(expr),
4344 data_type: self.parse_data_type()?,
4345 array: false,
4346 format: None,
4347 })
4348 }
4349
4350 pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4352 self.dialect.get_next_precedence_default(self)
4353 }
4354
4355 pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4358 self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4359 }
4360
4361 pub fn peek_token(&self) -> TokenWithSpan {
4366 self.peek_nth_token(0)
4367 }
4368
4369 pub fn peek_token_ref(&self) -> &TokenWithSpan {
4372 self.peek_nth_token_ref(0)
4373 }
4374
4375 pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4398 self.peek_tokens_with_location()
4399 .map(|with_loc| with_loc.token)
4400 }
4401
4402 pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4407 let mut index = self.index;
4408 core::array::from_fn(|_| loop {
4409 let token = self.tokens.get(index);
4410 index += 1;
4411 if let Some(TokenWithSpan {
4412 token: Token::Whitespace(_),
4413 span: _,
4414 }) = token
4415 {
4416 continue;
4417 }
4418 break token.cloned().unwrap_or(TokenWithSpan {
4419 token: Token::EOF,
4420 span: Span::empty(),
4421 });
4422 })
4423 }
4424
4425 pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4430 let mut index = self.index;
4431 core::array::from_fn(|_| loop {
4432 let token = self.tokens.get(index);
4433 index += 1;
4434 if let Some(TokenWithSpan {
4435 token: Token::Whitespace(_),
4436 span: _,
4437 }) = token
4438 {
4439 continue;
4440 }
4441 break token.unwrap_or(&EOF_TOKEN);
4442 })
4443 }
4444
4445 pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4447 self.peek_nth_token_ref(n).clone()
4448 }
4449
4450 pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4452 let mut index = self.index;
4453 loop {
4454 index += 1;
4455 match self.tokens.get(index - 1) {
4456 Some(TokenWithSpan {
4457 token: Token::Whitespace(_),
4458 span: _,
4459 }) => continue,
4460 non_whitespace => {
4461 if n == 0 {
4462 return non_whitespace.unwrap_or(&EOF_TOKEN);
4463 }
4464 n -= 1;
4465 }
4466 }
4467 }
4468 }
4469
4470 pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4473 self.peek_nth_token_no_skip(0)
4474 }
4475
4476 pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4478 self.tokens
4479 .get(self.index + n)
4480 .cloned()
4481 .unwrap_or(TokenWithSpan {
4482 token: Token::EOF,
4483 span: Span::empty(),
4484 })
4485 }
4486
4487 fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4489 self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4490 }
4491
4492 fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4496 let index = self.index;
4497 let matched = self.parse_keywords(expected);
4498 self.index = index;
4499 matched
4500 }
4501
4502 pub fn next_token(&mut self) -> TokenWithSpan {
4507 self.advance_token();
4508 self.get_current_token().clone()
4509 }
4510
4511 pub fn get_current_index(&self) -> usize {
4516 self.index.saturating_sub(1)
4517 }
4518
4519 pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4521 self.index += 1;
4522 self.tokens.get(self.index - 1)
4523 }
4524
4525 pub fn advance_token(&mut self) {
4529 loop {
4530 self.index += 1;
4531 match self.tokens.get(self.index - 1) {
4532 Some(TokenWithSpan {
4533 token: Token::Whitespace(_),
4534 span: _,
4535 }) => continue,
4536 _ => break,
4537 }
4538 }
4539 }
4540
4541 pub fn get_current_token(&self) -> &TokenWithSpan {
4545 self.token_at(self.index.saturating_sub(1))
4546 }
4547
4548 pub fn get_previous_token(&self) -> &TokenWithSpan {
4552 self.token_at(self.index.saturating_sub(2))
4553 }
4554
4555 pub fn get_next_token(&self) -> &TokenWithSpan {
4559 self.token_at(self.index)
4560 }
4561
4562 pub fn prev_token(&mut self) {
4569 loop {
4570 assert!(self.index > 0);
4571 self.index -= 1;
4572 if let Some(TokenWithSpan {
4573 token: Token::Whitespace(_),
4574 span: _,
4575 }) = self.tokens.get(self.index)
4576 {
4577 continue;
4578 }
4579 return;
4580 }
4581 }
4582
4583 pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4585 parser_err!(
4586 format!("Expected: {expected}, found: {found}"),
4587 found.span.start
4588 )
4589 }
4590
4591 pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4593 parser_err!(
4594 format!("Expected: {expected}, found: {found}"),
4595 found.span.start
4596 )
4597 }
4598
4599 pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4601 let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4602 parser_err!(
4603 format!("Expected: {expected}, found: {found}"),
4604 found.span.start
4605 )
4606 }
4607
4608 #[must_use]
4611 pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4612 if self.peek_keyword(expected) {
4613 self.advance_token();
4614 true
4615 } else {
4616 false
4617 }
4618 }
4619
4620 #[must_use]
4621 pub fn peek_keyword(&self, expected: Keyword) -> bool {
4625 matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4626 }
4627
4628 pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4636 self.keyword_with_tokens(expected, tokens, true)
4637 }
4638
4639 pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4644 self.keyword_with_tokens(expected, tokens, false)
4645 }
4646
4647 fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4648 match &self.peek_token_ref().token {
4649 Token::Word(w) if expected == w.keyword => {
4650 for (idx, token) in tokens.iter().enumerate() {
4651 if self.peek_nth_token_ref(idx + 1).token != *token {
4652 return false;
4653 }
4654 }
4655
4656 if consume {
4657 for _ in 0..(tokens.len() + 1) {
4658 self.advance_token();
4659 }
4660 }
4661
4662 true
4663 }
4664 _ => false,
4665 }
4666 }
4667
4668 #[must_use]
4672 pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4673 self.parse_keywords_indexed(keywords).is_some()
4674 }
4675
4676 #[must_use]
4679 fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4680 let start_index = self.index;
4681 let mut first_keyword_index = None;
4682 for &keyword in keywords {
4683 if !self.parse_keyword(keyword) {
4684 self.index = start_index;
4685 return None;
4686 }
4687 if first_keyword_index.is_none() {
4688 first_keyword_index = Some(self.index.saturating_sub(1));
4689 }
4690 }
4691 first_keyword_index
4692 }
4693
4694 #[must_use]
4697 pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4698 for keyword in keywords {
4699 if self.peek_keyword(*keyword) {
4700 return Some(*keyword);
4701 }
4702 }
4703 None
4704 }
4705
4706 #[must_use]
4710 pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4711 match &self.peek_token_ref().token {
4712 Token::Word(w) => {
4713 keywords
4714 .iter()
4715 .find(|keyword| **keyword == w.keyword)
4716 .map(|keyword| {
4717 self.advance_token();
4718 *keyword
4719 })
4720 }
4721 _ => None,
4722 }
4723 }
4724
4725 pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4728 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4729 Ok(keyword)
4730 } else {
4731 let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4732 self.expected_ref(
4733 &format!("one of {}", keywords.join(" or ")),
4734 self.peek_token_ref(),
4735 )
4736 }
4737 }
4738
4739 pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4744 if self.parse_keyword(expected) {
4745 Ok(self.get_current_token().clone())
4746 } else {
4747 self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4748 }
4749 }
4750
4751 pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4757 if self.parse_keyword(expected) {
4758 Ok(())
4759 } else {
4760 self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
4761 }
4762 }
4763
4764 pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4767 for &kw in expected {
4768 self.expect_keyword_is(kw)?;
4769 }
4770 Ok(())
4771 }
4772
4773 #[must_use]
4777 pub fn consume_token(&mut self, expected: &Token) -> bool {
4778 if self.peek_token_ref() == expected {
4779 self.advance_token();
4780 true
4781 } else {
4782 false
4783 }
4784 }
4785
4786 #[must_use]
4790 pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4791 let index = self.index;
4792 for token in tokens {
4793 if !self.consume_token(token) {
4794 self.index = index;
4795 return false;
4796 }
4797 }
4798 true
4799 }
4800
4801 pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4803 if self.peek_token_ref() == expected {
4804 Ok(self.next_token())
4805 } else {
4806 self.expected_ref(&expected.to_string(), self.peek_token_ref())
4807 }
4808 }
4809
4810 fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4811 where
4812 <T as FromStr>::Err: Display,
4813 {
4814 s.parse::<T>().map_err(|e| {
4815 ParserError::ParserError(format!(
4816 "Could not parse '{s}' as {}: {e}{loc}",
4817 core::any::type_name::<T>()
4818 ))
4819 })
4820 }
4821
4822 pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4824 let trailing_commas =
4830 self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4831
4832 self.parse_comma_separated_with_trailing_commas(
4833 |p| p.parse_select_item(),
4834 trailing_commas,
4835 Self::is_reserved_for_column_alias,
4836 )
4837 }
4838
4839 pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4841 let mut values = vec![];
4842 loop {
4843 values.push(self.parse_grant_permission()?);
4844 if !self.consume_token(&Token::Comma) {
4845 break;
4846 } else if self.options.trailing_commas {
4847 match &self.peek_token_ref().token {
4848 Token::Word(kw) if kw.keyword == Keyword::ON => {
4849 break;
4850 }
4851 Token::RParen
4852 | Token::SemiColon
4853 | Token::EOF
4854 | Token::RBracket
4855 | Token::RBrace => break,
4856 _ => continue,
4857 }
4858 }
4859 }
4860 Ok(values)
4861 }
4862
4863 fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4865 let trailing_commas = self.dialect.supports_from_trailing_commas();
4866
4867 self.parse_comma_separated_with_trailing_commas(
4868 Parser::parse_table_and_joins,
4869 trailing_commas,
4870 |kw, parser| !self.dialect.is_table_factor(kw, parser),
4871 )
4872 }
4873
4874 fn is_parse_comma_separated_end_with_trailing_commas<R>(
4881 &mut self,
4882 trailing_commas: bool,
4883 is_reserved_keyword: &R,
4884 ) -> bool
4885 where
4886 R: Fn(&Keyword, &mut Parser) -> bool,
4887 {
4888 if !self.consume_token(&Token::Comma) {
4889 true
4890 } else if trailing_commas {
4891 let token = self.next_token().token;
4892 let is_end = match token {
4893 Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
4894 Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
4895 true
4896 }
4897 _ => false,
4898 };
4899 self.prev_token();
4900
4901 is_end
4902 } else {
4903 false
4904 }
4905 }
4906
4907 fn is_parse_comma_separated_end(&mut self) -> bool {
4910 self.is_parse_comma_separated_end_with_trailing_commas(
4911 self.options.trailing_commas,
4912 &Self::is_reserved_for_column_alias,
4913 )
4914 }
4915
4916 pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
4918 where
4919 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4920 {
4921 self.parse_comma_separated_with_trailing_commas(
4922 f,
4923 self.options.trailing_commas,
4924 Self::is_reserved_for_column_alias,
4925 )
4926 }
4927
4928 fn parse_comma_separated_with_trailing_commas<T, F, R>(
4933 &mut self,
4934 mut f: F,
4935 trailing_commas: bool,
4936 is_reserved_keyword: R,
4937 ) -> Result<Vec<T>, ParserError>
4938 where
4939 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4940 R: Fn(&Keyword, &mut Parser) -> bool,
4941 {
4942 let mut values = vec![];
4943 loop {
4944 values.push(f(self)?);
4945 if self.is_parse_comma_separated_end_with_trailing_commas(
4946 trailing_commas,
4947 &is_reserved_keyword,
4948 ) {
4949 break;
4950 }
4951 }
4952 Ok(values)
4953 }
4954
4955 fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
4957 where
4958 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4959 {
4960 let mut values = vec![];
4961 loop {
4962 values.push(f(self)?);
4963 if !self.consume_token(&Token::Period) {
4964 break;
4965 }
4966 }
4967 Ok(values)
4968 }
4969
4970 pub fn parse_keyword_separated<T, F>(
4972 &mut self,
4973 keyword: Keyword,
4974 mut f: F,
4975 ) -> Result<Vec<T>, ParserError>
4976 where
4977 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4978 {
4979 let mut values = vec![];
4980 loop {
4981 values.push(f(self)?);
4982 if !self.parse_keyword(keyword) {
4983 break;
4984 }
4985 }
4986 Ok(values)
4987 }
4988
4989 pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
4991 where
4992 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4993 {
4994 self.expect_token(&Token::LParen)?;
4995 let res = f(self)?;
4996 self.expect_token(&Token::RParen)?;
4997 Ok(res)
4998 }
4999
5000 pub fn parse_comma_separated0<T, F>(
5003 &mut self,
5004 f: F,
5005 end_token: Token,
5006 ) -> Result<Vec<T>, ParserError>
5007 where
5008 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5009 {
5010 if self.peek_token_ref().token == end_token {
5011 return Ok(vec![]);
5012 }
5013
5014 if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5015 let _ = self.consume_token(&Token::Comma);
5016 return Ok(vec![]);
5017 }
5018
5019 self.parse_comma_separated(f)
5020 }
5021
5022 pub(crate) fn parse_statement_list(
5026 &mut self,
5027 terminal_keywords: &[Keyword],
5028 ) -> Result<Vec<Statement>, ParserError> {
5029 let mut values = vec![];
5030 loop {
5031 match &self.peek_nth_token_ref(0).token {
5032 Token::EOF => break,
5033 Token::Word(w)
5034 if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5035 {
5036 break;
5037 }
5038 _ => {}
5039 }
5040
5041 values.push(self.parse_statement()?);
5042 self.expect_token(&Token::SemiColon)?;
5043 }
5044 Ok(values)
5045 }
5046
5047 fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5051 !parser.dialect.is_column_alias(kw, parser)
5052 }
5053
5054 pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5058 where
5059 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5060 {
5061 match self.try_parse(f) {
5062 Ok(t) => Ok(Some(t)),
5063 Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5064 _ => Ok(None),
5065 }
5066 }
5067
5068 pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5070 where
5071 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5072 {
5073 let index = self.index;
5074 match f(self) {
5075 Ok(t) => Ok(t),
5076 Err(e) => {
5077 self.index = index;
5079 Err(e)
5080 }
5081 }
5082 }
5083
5084 pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5087 let loc = self.peek_token_ref().span.start;
5088 let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5089 Some(Keyword::ALL) => {
5090 if self.peek_keyword(Keyword::DISTINCT) {
5091 return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5092 }
5093 Some(Distinct::All)
5094 }
5095 Some(Keyword::DISTINCT) => {
5096 if self.peek_keyword(Keyword::ALL) {
5097 return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5098 }
5099 Some(Distinct::Distinct)
5100 }
5101 None => return Ok(None),
5102 _ => return parser_err!("ALL or DISTINCT", loc),
5103 };
5104
5105 let Some(Distinct::Distinct) = distinct else {
5106 return Ok(distinct);
5107 };
5108 if !self.parse_keyword(Keyword::ON) {
5109 return Ok(Some(Distinct::Distinct));
5110 }
5111
5112 self.expect_token(&Token::LParen)?;
5113 let col_names = if self.consume_token(&Token::RParen) {
5114 self.prev_token();
5115 Vec::new()
5116 } else {
5117 self.parse_comma_separated(Parser::parse_expr)?
5118 };
5119 self.expect_token(&Token::RParen)?;
5120 Ok(Some(Distinct::On(col_names)))
5121 }
5122
5123 pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5125 let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5126 let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5127 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5128 let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5129 let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5130 let global: Option<bool> = if global {
5131 Some(true)
5132 } else if local {
5133 Some(false)
5134 } else {
5135 None
5136 };
5137 let temporary = self
5138 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5139 .is_some();
5140 let persistent = dialect_of!(self is DuckDbDialect)
5141 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5142 let create_view_params = self.parse_create_view_params()?;
5143 if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5144 self.parse_create_snapshot_table().map(Into::into)
5145 } else if self.parse_keyword(Keyword::TABLE) {
5146 self.parse_create_table(or_replace, temporary, global, transient)
5147 .map(Into::into)
5148 } else if self.peek_keyword(Keyword::MATERIALIZED)
5149 || self.peek_keyword(Keyword::VIEW)
5150 || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5151 || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5152 {
5153 self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5154 .map(Into::into)
5155 } else if self.parse_keyword(Keyword::POLICY) {
5156 self.parse_create_policy().map(Into::into)
5157 } else if self.parse_keyword(Keyword::EXTERNAL) {
5158 self.parse_create_external_table(or_replace).map(Into::into)
5159 } else if self.parse_keyword(Keyword::FUNCTION) {
5160 self.parse_create_function(or_alter, or_replace, temporary)
5161 } else if self.parse_keyword(Keyword::DOMAIN) {
5162 self.parse_create_domain().map(Into::into)
5163 } else if self.parse_keyword(Keyword::TRIGGER) {
5164 self.parse_create_trigger(temporary, or_alter, or_replace, false)
5165 .map(Into::into)
5166 } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5167 self.parse_create_trigger(temporary, or_alter, or_replace, true)
5168 .map(Into::into)
5169 } else if self.parse_keyword(Keyword::MACRO) {
5170 self.parse_create_macro(or_replace, temporary)
5171 } else if self.parse_keyword(Keyword::SECRET) {
5172 self.parse_create_secret(or_replace, temporary, persistent)
5173 } else if self.parse_keyword(Keyword::USER) {
5174 self.parse_create_user(or_replace).map(Into::into)
5175 } else if or_replace {
5176 self.expected_ref(
5177 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5178 self.peek_token_ref(),
5179 )
5180 } else if self.parse_keyword(Keyword::EXTENSION) {
5181 self.parse_create_extension().map(Into::into)
5182 } else if self.parse_keyword(Keyword::INDEX) {
5183 self.parse_create_index(false).map(Into::into)
5184 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5185 self.parse_create_index(true).map(Into::into)
5186 } else if self.parse_keyword(Keyword::VIRTUAL) {
5187 self.parse_create_virtual_table()
5188 } else if self.parse_keyword(Keyword::SCHEMA) {
5189 self.parse_create_schema()
5190 } else if self.parse_keyword(Keyword::DATABASE) {
5191 self.parse_create_database()
5192 } else if self.parse_keyword(Keyword::ROLE) {
5193 self.parse_create_role().map(Into::into)
5194 } else if self.parse_keyword(Keyword::SEQUENCE) {
5195 self.parse_create_sequence(temporary)
5196 } else if self.parse_keyword(Keyword::COLLATION) {
5197 self.parse_create_collation().map(Into::into)
5198 } else if self.parse_keyword(Keyword::TYPE) {
5199 self.parse_create_type()
5200 } else if self.parse_keyword(Keyword::PROCEDURE) {
5201 self.parse_create_procedure(or_alter)
5202 } else if self.parse_keyword(Keyword::CONNECTOR) {
5203 self.parse_create_connector().map(Into::into)
5204 } else if self.parse_keyword(Keyword::OPERATOR) {
5205 if self.parse_keyword(Keyword::FAMILY) {
5207 self.parse_create_operator_family().map(Into::into)
5208 } else if self.parse_keyword(Keyword::CLASS) {
5209 self.parse_create_operator_class().map(Into::into)
5210 } else {
5211 self.parse_create_operator().map(Into::into)
5212 }
5213 } else if self.parse_keyword(Keyword::SERVER) {
5214 self.parse_pg_create_server()
5215 } else {
5216 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5217 }
5218 }
5219
5220 fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5221 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5222 let name = self.parse_identifier()?;
5223 let options = self
5224 .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5225 .options;
5226 let with_tags = self.parse_keyword(Keyword::WITH);
5227 let tags = if self.parse_keyword(Keyword::TAG) {
5228 self.parse_key_value_options(true, &[])?.options
5229 } else {
5230 vec![]
5231 };
5232 Ok(CreateUser {
5233 or_replace,
5234 if_not_exists,
5235 name,
5236 options: KeyValueOptions {
5237 options,
5238 delimiter: KeyValueOptionsDelimiter::Space,
5239 },
5240 with_tags,
5241 tags: KeyValueOptions {
5242 options: tags,
5243 delimiter: KeyValueOptionsDelimiter::Comma,
5244 },
5245 })
5246 }
5247
5248 pub fn parse_create_secret(
5250 &mut self,
5251 or_replace: bool,
5252 temporary: bool,
5253 persistent: bool,
5254 ) -> Result<Statement, ParserError> {
5255 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5256
5257 let mut storage_specifier = None;
5258 let mut name = None;
5259 if self.peek_token_ref().token != Token::LParen {
5260 if self.parse_keyword(Keyword::IN) {
5261 storage_specifier = self.parse_identifier().ok()
5262 } else {
5263 name = self.parse_identifier().ok();
5264 }
5265
5266 if storage_specifier.is_none()
5268 && self.peek_token_ref().token != Token::LParen
5269 && self.parse_keyword(Keyword::IN)
5270 {
5271 storage_specifier = self.parse_identifier().ok();
5272 }
5273 }
5274
5275 self.expect_token(&Token::LParen)?;
5276 self.expect_keyword_is(Keyword::TYPE)?;
5277 let secret_type = self.parse_identifier()?;
5278
5279 let mut options = Vec::new();
5280 if self.consume_token(&Token::Comma) {
5281 options.append(&mut self.parse_comma_separated(|p| {
5282 let key = p.parse_identifier()?;
5283 let value = p.parse_identifier()?;
5284 Ok(SecretOption { key, value })
5285 })?);
5286 }
5287 self.expect_token(&Token::RParen)?;
5288
5289 let temp = match (temporary, persistent) {
5290 (true, false) => Some(true),
5291 (false, true) => Some(false),
5292 (false, false) => None,
5293 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5294 };
5295
5296 Ok(Statement::CreateSecret {
5297 or_replace,
5298 temporary: temp,
5299 if_not_exists,
5300 name,
5301 storage_specifier,
5302 secret_type,
5303 options,
5304 })
5305 }
5306
5307 pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5309 let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5310 if self.parse_keyword(Keyword::TABLE) {
5311 let table_name = self.parse_object_name(false)?;
5312 if self.peek_token_ref().token != Token::EOF {
5313 if let Token::Word(word) = &self.peek_token_ref().token {
5314 if word.keyword == Keyword::OPTIONS {
5315 options = self.parse_options(Keyword::OPTIONS)?
5316 }
5317 };
5318
5319 if self.peek_token_ref().token != Token::EOF {
5320 let (a, q) = self.parse_as_query()?;
5321 has_as = a;
5322 query = Some(q);
5323 }
5324
5325 Ok(Statement::Cache {
5326 table_flag,
5327 table_name,
5328 has_as,
5329 options,
5330 query,
5331 })
5332 } else {
5333 Ok(Statement::Cache {
5334 table_flag,
5335 table_name,
5336 has_as,
5337 options,
5338 query,
5339 })
5340 }
5341 } else {
5342 table_flag = Some(self.parse_object_name(false)?);
5343 if self.parse_keyword(Keyword::TABLE) {
5344 let table_name = self.parse_object_name(false)?;
5345 if self.peek_token_ref().token != Token::EOF {
5346 if let Token::Word(word) = &self.peek_token_ref().token {
5347 if word.keyword == Keyword::OPTIONS {
5348 options = self.parse_options(Keyword::OPTIONS)?
5349 }
5350 };
5351
5352 if self.peek_token_ref().token != Token::EOF {
5353 let (a, q) = self.parse_as_query()?;
5354 has_as = a;
5355 query = Some(q);
5356 }
5357
5358 Ok(Statement::Cache {
5359 table_flag,
5360 table_name,
5361 has_as,
5362 options,
5363 query,
5364 })
5365 } else {
5366 Ok(Statement::Cache {
5367 table_flag,
5368 table_name,
5369 has_as,
5370 options,
5371 query,
5372 })
5373 }
5374 } else {
5375 if self.peek_token_ref().token == Token::EOF {
5376 self.prev_token();
5377 }
5378 self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5379 }
5380 }
5381 }
5382
5383 pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5385 match &self.peek_token_ref().token {
5386 Token::Word(word) => match word.keyword {
5387 Keyword::AS => {
5388 self.next_token();
5389 Ok((true, self.parse_query()?))
5390 }
5391 _ => Ok((false, self.parse_query()?)),
5392 },
5393 _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5394 }
5395 }
5396
5397 pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5399 self.expect_keyword_is(Keyword::TABLE)?;
5400 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5401 let table_name = self.parse_object_name(false)?;
5402 Ok(Statement::UNCache {
5403 table_name,
5404 if_exists,
5405 })
5406 }
5407
5408 pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5410 self.expect_keyword_is(Keyword::TABLE)?;
5411 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5412 let table_name = self.parse_object_name(false)?;
5413 self.expect_keyword_is(Keyword::USING)?;
5414 let module_name = self.parse_identifier()?;
5415 let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5420 Ok(Statement::CreateVirtualTable {
5421 name: table_name,
5422 if_not_exists,
5423 module_name,
5424 module_args,
5425 })
5426 }
5427
5428 pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5430 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5431
5432 let schema_name = self.parse_schema_name()?;
5433
5434 let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5435 Some(self.parse_expr()?)
5436 } else {
5437 None
5438 };
5439
5440 let with = if self.peek_keyword(Keyword::WITH) {
5441 Some(self.parse_options(Keyword::WITH)?)
5442 } else {
5443 None
5444 };
5445
5446 let options = if self.peek_keyword(Keyword::OPTIONS) {
5447 Some(self.parse_options(Keyword::OPTIONS)?)
5448 } else {
5449 None
5450 };
5451
5452 let clone = if self.parse_keyword(Keyword::CLONE) {
5453 Some(self.parse_object_name(false)?)
5454 } else {
5455 None
5456 };
5457
5458 Ok(Statement::CreateSchema {
5459 schema_name,
5460 if_not_exists,
5461 with,
5462 options,
5463 default_collate_spec,
5464 clone,
5465 })
5466 }
5467
5468 fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5469 if self.parse_keyword(Keyword::AUTHORIZATION) {
5470 Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5471 } else {
5472 let name = self.parse_object_name(false)?;
5473
5474 if self.parse_keyword(Keyword::AUTHORIZATION) {
5475 Ok(SchemaName::NamedAuthorization(
5476 name,
5477 self.parse_identifier()?,
5478 ))
5479 } else {
5480 Ok(SchemaName::Simple(name))
5481 }
5482 }
5483 }
5484
5485 pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5487 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5488 let db_name = self.parse_object_name(false)?;
5489 let mut location = None;
5490 let mut managed_location = None;
5491 loop {
5492 match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5493 Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5494 Some(Keyword::MANAGEDLOCATION) => {
5495 managed_location = Some(self.parse_literal_string()?)
5496 }
5497 _ => break,
5498 }
5499 }
5500 let clone = if self.parse_keyword(Keyword::CLONE) {
5501 Some(self.parse_object_name(false)?)
5502 } else {
5503 None
5504 };
5505
5506 let mut default_charset = None;
5514 let mut default_collation = None;
5515 loop {
5516 let has_default = self.parse_keyword(Keyword::DEFAULT);
5517 if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5518 || self.parse_keyword(Keyword::CHARSET)
5519 {
5520 let _ = self.consume_token(&Token::Eq);
5521 default_charset = Some(self.parse_identifier()?.value);
5522 } else if self.parse_keyword(Keyword::COLLATE) {
5523 let _ = self.consume_token(&Token::Eq);
5524 default_collation = Some(self.parse_identifier()?.value);
5525 } else if has_default {
5526 self.prev_token();
5528 break;
5529 } else {
5530 break;
5531 }
5532 }
5533
5534 Ok(Statement::CreateDatabase {
5535 db_name,
5536 if_not_exists: ine,
5537 location,
5538 managed_location,
5539 or_replace: false,
5540 transient: false,
5541 clone,
5542 data_retention_time_in_days: None,
5543 max_data_extension_time_in_days: None,
5544 external_volume: None,
5545 catalog: None,
5546 replace_invalid_characters: None,
5547 default_ddl_collation: None,
5548 storage_serialization_policy: None,
5549 comment: None,
5550 default_charset,
5551 default_collation,
5552 catalog_sync: None,
5553 catalog_sync_namespace_mode: None,
5554 catalog_sync_namespace_flatten_delimiter: None,
5555 with_tags: None,
5556 with_contacts: None,
5557 })
5558 }
5559
5560 pub fn parse_optional_create_function_using(
5562 &mut self,
5563 ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5564 if !self.parse_keyword(Keyword::USING) {
5565 return Ok(None);
5566 };
5567 let keyword =
5568 self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5569
5570 let uri = self.parse_literal_string()?;
5571
5572 match keyword {
5573 Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5574 Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5575 Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5576 _ => self.expected(
5577 "JAR, FILE or ARCHIVE, got {:?}",
5578 TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5579 ),
5580 }
5581 }
5582
5583 pub fn parse_create_function(
5585 &mut self,
5586 or_alter: bool,
5587 or_replace: bool,
5588 temporary: bool,
5589 ) -> Result<Statement, ParserError> {
5590 if dialect_of!(self is HiveDialect) {
5591 self.parse_hive_create_function(or_replace, temporary)
5592 .map(Into::into)
5593 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5594 self.parse_postgres_create_function(or_replace, temporary)
5595 .map(Into::into)
5596 } else if dialect_of!(self is DuckDbDialect) {
5597 self.parse_create_macro(or_replace, temporary)
5598 } else if dialect_of!(self is BigQueryDialect) {
5599 self.parse_bigquery_create_function(or_replace, temporary)
5600 .map(Into::into)
5601 } else if dialect_of!(self is MsSqlDialect) {
5602 self.parse_mssql_create_function(or_alter, or_replace, temporary)
5603 .map(Into::into)
5604 } else {
5605 self.prev_token();
5606 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5607 }
5608 }
5609
5610 fn parse_postgres_create_function(
5614 &mut self,
5615 or_replace: bool,
5616 temporary: bool,
5617 ) -> Result<CreateFunction, ParserError> {
5618 let name = self.parse_object_name(false)?;
5619
5620 self.expect_token(&Token::LParen)?;
5621 let args = if Token::RParen != self.peek_token_ref().token {
5622 self.parse_comma_separated(Parser::parse_function_arg)?
5623 } else {
5624 vec![]
5625 };
5626 self.expect_token(&Token::RParen)?;
5627
5628 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5629 Some(self.parse_function_return_type()?)
5630 } else {
5631 None
5632 };
5633
5634 #[derive(Default)]
5635 struct Body {
5636 language: Option<Ident>,
5637 behavior: Option<FunctionBehavior>,
5638 function_body: Option<CreateFunctionBody>,
5639 called_on_null: Option<FunctionCalledOnNull>,
5640 parallel: Option<FunctionParallel>,
5641 security: Option<FunctionSecurity>,
5642 }
5643 let mut body = Body::default();
5644 let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5645 loop {
5646 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5647 if field.is_some() {
5648 return Err(ParserError::ParserError(format!(
5649 "{name} specified more than once",
5650 )));
5651 }
5652 Ok(())
5653 }
5654 if self.parse_keyword(Keyword::AS) {
5655 ensure_not_set(&body.function_body, "AS")?;
5656 body.function_body = Some(self.parse_create_function_body_string()?);
5657 } else if self.parse_keyword(Keyword::LANGUAGE) {
5658 ensure_not_set(&body.language, "LANGUAGE")?;
5659 body.language = Some(self.parse_identifier()?);
5660 } else if self.parse_keyword(Keyword::IMMUTABLE) {
5661 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5662 body.behavior = Some(FunctionBehavior::Immutable);
5663 } else if self.parse_keyword(Keyword::STABLE) {
5664 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5665 body.behavior = Some(FunctionBehavior::Stable);
5666 } else if self.parse_keyword(Keyword::VOLATILE) {
5667 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5668 body.behavior = Some(FunctionBehavior::Volatile);
5669 } else if self.parse_keywords(&[
5670 Keyword::CALLED,
5671 Keyword::ON,
5672 Keyword::NULL,
5673 Keyword::INPUT,
5674 ]) {
5675 ensure_not_set(
5676 &body.called_on_null,
5677 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5678 )?;
5679 body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5680 } else if self.parse_keywords(&[
5681 Keyword::RETURNS,
5682 Keyword::NULL,
5683 Keyword::ON,
5684 Keyword::NULL,
5685 Keyword::INPUT,
5686 ]) {
5687 ensure_not_set(
5688 &body.called_on_null,
5689 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5690 )?;
5691 body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5692 } else if self.parse_keyword(Keyword::STRICT) {
5693 ensure_not_set(
5694 &body.called_on_null,
5695 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5696 )?;
5697 body.called_on_null = Some(FunctionCalledOnNull::Strict);
5698 } else if self.parse_keyword(Keyword::PARALLEL) {
5699 ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5700 if self.parse_keyword(Keyword::UNSAFE) {
5701 body.parallel = Some(FunctionParallel::Unsafe);
5702 } else if self.parse_keyword(Keyword::RESTRICTED) {
5703 body.parallel = Some(FunctionParallel::Restricted);
5704 } else if self.parse_keyword(Keyword::SAFE) {
5705 body.parallel = Some(FunctionParallel::Safe);
5706 } else {
5707 return self
5708 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5709 }
5710 } else if self.parse_keyword(Keyword::SECURITY) {
5711 ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5712 if self.parse_keyword(Keyword::DEFINER) {
5713 body.security = Some(FunctionSecurity::Definer);
5714 } else if self.parse_keyword(Keyword::INVOKER) {
5715 body.security = Some(FunctionSecurity::Invoker);
5716 } else {
5717 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5718 }
5719 } else if self.parse_keyword(Keyword::SET) {
5720 let name = self.parse_object_name(false)?;
5721 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5722 FunctionSetValue::FromCurrent
5723 } else {
5724 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5725 return self.expected_ref("= or TO", self.peek_token_ref());
5726 }
5727 if self.parse_keyword(Keyword::DEFAULT) {
5728 FunctionSetValue::Default
5729 } else {
5730 let values = self.parse_comma_separated(Parser::parse_expr)?;
5731 FunctionSetValue::Values(values)
5732 }
5733 };
5734 set_params.push(FunctionDefinitionSetParam { name, value });
5735 } else if self.parse_keyword(Keyword::RETURN) {
5736 ensure_not_set(&body.function_body, "RETURN")?;
5737 body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5738 } else {
5739 break;
5740 }
5741 }
5742
5743 Ok(CreateFunction {
5744 or_alter: false,
5745 or_replace,
5746 temporary,
5747 name,
5748 args: Some(args),
5749 return_type,
5750 behavior: body.behavior,
5751 called_on_null: body.called_on_null,
5752 parallel: body.parallel,
5753 security: body.security,
5754 set_params,
5755 language: body.language,
5756 function_body: body.function_body,
5757 if_not_exists: false,
5758 using: None,
5759 determinism_specifier: None,
5760 options: None,
5761 remote_connection: None,
5762 })
5763 }
5764
5765 fn parse_hive_create_function(
5769 &mut self,
5770 or_replace: bool,
5771 temporary: bool,
5772 ) -> Result<CreateFunction, ParserError> {
5773 let name = self.parse_object_name(false)?;
5774 self.expect_keyword_is(Keyword::AS)?;
5775
5776 let body = self.parse_create_function_body_string()?;
5777 let using = self.parse_optional_create_function_using()?;
5778
5779 Ok(CreateFunction {
5780 or_alter: false,
5781 or_replace,
5782 temporary,
5783 name,
5784 function_body: Some(body),
5785 using,
5786 if_not_exists: false,
5787 args: None,
5788 return_type: None,
5789 behavior: None,
5790 called_on_null: None,
5791 parallel: None,
5792 security: None,
5793 set_params: vec![],
5794 language: None,
5795 determinism_specifier: None,
5796 options: None,
5797 remote_connection: None,
5798 })
5799 }
5800
5801 fn parse_bigquery_create_function(
5805 &mut self,
5806 or_replace: bool,
5807 temporary: bool,
5808 ) -> Result<CreateFunction, ParserError> {
5809 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5810 let (name, args) = self.parse_create_function_name_and_params()?;
5811
5812 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5813 Some(self.parse_function_return_type()?)
5814 } else {
5815 None
5816 };
5817
5818 let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
5819 Some(FunctionDeterminismSpecifier::Deterministic)
5820 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
5821 Some(FunctionDeterminismSpecifier::NotDeterministic)
5822 } else {
5823 None
5824 };
5825
5826 let language = if self.parse_keyword(Keyword::LANGUAGE) {
5827 Some(self.parse_identifier()?)
5828 } else {
5829 None
5830 };
5831
5832 let remote_connection =
5833 if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
5834 Some(self.parse_object_name(false)?)
5835 } else {
5836 None
5837 };
5838
5839 let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
5842
5843 let function_body = if remote_connection.is_none() {
5844 self.expect_keyword_is(Keyword::AS)?;
5845 let expr = self.parse_expr()?;
5846 if options.is_none() {
5847 options = self.maybe_parse_options(Keyword::OPTIONS)?;
5848 Some(CreateFunctionBody::AsBeforeOptions {
5849 body: expr,
5850 link_symbol: None,
5851 })
5852 } else {
5853 Some(CreateFunctionBody::AsAfterOptions(expr))
5854 }
5855 } else {
5856 None
5857 };
5858
5859 Ok(CreateFunction {
5860 or_alter: false,
5861 or_replace,
5862 temporary,
5863 if_not_exists,
5864 name,
5865 args: Some(args),
5866 return_type,
5867 function_body,
5868 language,
5869 determinism_specifier,
5870 options,
5871 remote_connection,
5872 using: None,
5873 behavior: None,
5874 called_on_null: None,
5875 parallel: None,
5876 security: None,
5877 set_params: vec![],
5878 })
5879 }
5880
5881 fn parse_mssql_create_function(
5885 &mut self,
5886 or_alter: bool,
5887 or_replace: bool,
5888 temporary: bool,
5889 ) -> Result<CreateFunction, ParserError> {
5890 let (name, args) = self.parse_create_function_name_and_params()?;
5891
5892 self.expect_keyword(Keyword::RETURNS)?;
5893
5894 let return_table = self.maybe_parse(|p| {
5895 let return_table_name = p.parse_identifier()?;
5896
5897 p.expect_keyword_is(Keyword::TABLE)?;
5898 p.prev_token();
5899
5900 let table_column_defs = match p.parse_data_type()? {
5901 DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5902 table_column_defs
5903 }
5904 _ => parser_err!(
5905 "Expected table column definitions after TABLE keyword",
5906 p.peek_token_ref().span.start
5907 )?,
5908 };
5909
5910 Ok(DataType::NamedTable {
5911 name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5912 columns: table_column_defs,
5913 })
5914 })?;
5915
5916 let data_type = match return_table {
5917 Some(table_type) => table_type,
5918 None => self.parse_data_type()?,
5919 };
5920 let return_type = Some(FunctionReturnType::DataType(data_type));
5921
5922 let _ = self.parse_keyword(Keyword::AS);
5923
5924 let function_body = if self.peek_keyword(Keyword::BEGIN) {
5925 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5926 let statements = self.parse_statement_list(&[Keyword::END])?;
5927 let end_token = self.expect_keyword(Keyword::END)?;
5928
5929 Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
5930 begin_token: AttachedToken(begin_token),
5931 statements,
5932 end_token: AttachedToken(end_token),
5933 }))
5934 } else if self.parse_keyword(Keyword::RETURN) {
5935 if self.peek_token_ref().token == Token::LParen {
5936 Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
5937 } else if self.peek_keyword(Keyword::SELECT) {
5938 let select = self.parse_select()?;
5939 Some(CreateFunctionBody::AsReturnSelect(select))
5940 } else {
5941 parser_err!(
5942 "Expected a subquery (or bare SELECT statement) after RETURN",
5943 self.peek_token_ref().span.start
5944 )?
5945 }
5946 } else {
5947 parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
5948 };
5949
5950 Ok(CreateFunction {
5951 or_alter,
5952 or_replace,
5953 temporary,
5954 if_not_exists: false,
5955 name,
5956 args: Some(args),
5957 return_type,
5958 function_body,
5959 language: None,
5960 determinism_specifier: None,
5961 options: None,
5962 remote_connection: None,
5963 using: None,
5964 behavior: None,
5965 called_on_null: None,
5966 parallel: None,
5967 security: None,
5968 set_params: vec![],
5969 })
5970 }
5971
5972 fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
5973 if self.parse_keyword(Keyword::SETOF) {
5974 Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
5975 } else {
5976 Ok(FunctionReturnType::DataType(self.parse_data_type()?))
5977 }
5978 }
5979
5980 fn parse_create_function_name_and_params(
5981 &mut self,
5982 ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
5983 let name = self.parse_object_name(false)?;
5984 let parse_function_param =
5985 |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
5986 let name = parser.parse_identifier()?;
5987 let data_type = parser.parse_data_type()?;
5988 let default_expr = if parser.consume_token(&Token::Eq) {
5989 Some(parser.parse_expr()?)
5990 } else {
5991 None
5992 };
5993
5994 Ok(OperateFunctionArg {
5995 mode: None,
5996 name: Some(name),
5997 data_type,
5998 default_expr,
5999 })
6000 };
6001 self.expect_token(&Token::LParen)?;
6002 let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6003 self.expect_token(&Token::RParen)?;
6004 Ok((name, args))
6005 }
6006
6007 fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6008 let mode = if self.parse_keyword(Keyword::IN) {
6009 Some(ArgMode::In)
6010 } else if self.parse_keyword(Keyword::OUT) {
6011 Some(ArgMode::Out)
6012 } else if self.parse_keyword(Keyword::INOUT) {
6013 Some(ArgMode::InOut)
6014 } else if self.parse_keyword(Keyword::VARIADIC) {
6015 Some(ArgMode::Variadic)
6016 } else {
6017 None
6018 };
6019
6020 let mut name = None;
6022 let mut data_type = self.parse_data_type()?;
6023
6024 let data_type_idx = self.get_current_index();
6028
6029 fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6031 if parser.peek_keyword(Keyword::DEFAULT) {
6032 parser_err!(
6034 "The DEFAULT keyword is not a type",
6035 parser.peek_token_ref().span.start
6036 )
6037 } else {
6038 parser.parse_data_type()
6039 }
6040 }
6041
6042 if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6043 let token = self.token_at(data_type_idx);
6044
6045 if !matches!(token.token, Token::Word(_)) {
6047 return self.expected("a name or type", token.clone());
6048 }
6049
6050 name = Some(Ident::new(token.to_string()));
6051 data_type = next_data_type;
6052 }
6053
6054 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6055 {
6056 Some(self.parse_expr()?)
6057 } else {
6058 None
6059 };
6060 Ok(OperateFunctionArg {
6061 mode,
6062 name,
6063 data_type,
6064 default_expr,
6065 })
6066 }
6067
6068 fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6069 let mode = if self.parse_keyword(Keyword::IN) {
6070 Some(ArgMode::In)
6071 } else {
6072 if self
6073 .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6074 .is_some()
6075 {
6076 return self.expected_ref(
6077 "IN or argument type in aggregate signature",
6078 self.peek_token_ref(),
6079 );
6080 }
6081 None
6082 };
6083
6084 let mut name = None;
6087 let mut data_type = self.parse_data_type()?;
6088 let data_type_idx = self.get_current_index();
6089
6090 fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6091 if parser.peek_keyword(Keyword::DEFAULT)
6092 || parser.peek_keyword(Keyword::ORDER)
6093 || parser.peek_token_ref().token == Token::Comma
6094 || parser.peek_token_ref().token == Token::RParen
6095 {
6096 parser_err!(
6098 "The current token cannot start an aggregate argument type",
6099 parser.peek_token_ref().span.start
6100 )
6101 } else {
6102 parser.parse_data_type()
6103 }
6104 }
6105
6106 if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6107 let token = self.token_at(data_type_idx);
6108 if !matches!(token.token, Token::Word(_)) {
6109 return self.expected("a name or type", token.clone());
6110 }
6111
6112 name = Some(Ident::new(token.to_string()));
6113 data_type = next_data_type;
6114 }
6115
6116 if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6117 return self.expected_ref(
6118 "',' or ')' or ORDER BY after aggregate argument type",
6119 self.peek_token_ref(),
6120 );
6121 }
6122
6123 Ok(OperateFunctionArg {
6124 mode,
6125 name,
6126 data_type,
6127 default_expr: None,
6128 })
6129 }
6130
6131 pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6137 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6138 {
6139 self.prev_token();
6140 return self.expected_ref("an object type after DROP", self.peek_token_ref());
6141 }
6142 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6143 let trigger_name = self.parse_object_name(false)?;
6144 let table_name = if self.parse_keyword(Keyword::ON) {
6145 Some(self.parse_object_name(false)?)
6146 } else {
6147 None
6148 };
6149 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6150 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6151 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6152 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6153 format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6154 )),
6155 None => None,
6156 };
6157 Ok(DropTrigger {
6158 if_exists,
6159 trigger_name,
6160 table_name,
6161 option,
6162 })
6163 }
6164
6165 pub fn parse_create_trigger(
6167 &mut self,
6168 temporary: bool,
6169 or_alter: bool,
6170 or_replace: bool,
6171 is_constraint: bool,
6172 ) -> Result<CreateTrigger, ParserError> {
6173 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6174 {
6175 self.prev_token();
6176 return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6177 }
6178
6179 let name = self.parse_object_name(false)?;
6180 let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6181
6182 let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6183 self.expect_keyword_is(Keyword::ON)?;
6184 let table_name = self.parse_object_name(false)?;
6185
6186 let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6187 self.parse_object_name(true).ok()
6188 } else {
6189 None
6190 };
6191
6192 let characteristics = self.parse_constraint_characteristics()?;
6193
6194 let mut referencing = vec![];
6195 if self.parse_keyword(Keyword::REFERENCING) {
6196 while let Some(refer) = self.parse_trigger_referencing()? {
6197 referencing.push(refer);
6198 }
6199 }
6200
6201 let trigger_object = if self.parse_keyword(Keyword::FOR) {
6202 let include_each = self.parse_keyword(Keyword::EACH);
6203 let trigger_object =
6204 match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6205 Keyword::ROW => TriggerObject::Row,
6206 Keyword::STATEMENT => TriggerObject::Statement,
6207 unexpected_keyword => return Err(ParserError::ParserError(
6208 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6209 )),
6210 };
6211
6212 Some(if include_each {
6213 TriggerObjectKind::ForEach(trigger_object)
6214 } else {
6215 TriggerObjectKind::For(trigger_object)
6216 })
6217 } else {
6218 let _ = self.parse_keyword(Keyword::FOR);
6219
6220 None
6221 };
6222
6223 let condition = self
6224 .parse_keyword(Keyword::WHEN)
6225 .then(|| self.parse_expr())
6226 .transpose()?;
6227
6228 let mut exec_body = None;
6229 let mut statements = None;
6230 if self.parse_keyword(Keyword::EXECUTE) {
6231 exec_body = Some(self.parse_trigger_exec_body()?);
6232 } else {
6233 statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6234 }
6235
6236 Ok(CreateTrigger {
6237 or_alter,
6238 temporary,
6239 or_replace,
6240 is_constraint,
6241 name,
6242 period,
6243 period_before_table: true,
6244 events,
6245 table_name,
6246 referenced_table_name,
6247 referencing,
6248 trigger_object,
6249 condition,
6250 exec_body,
6251 statements_as: false,
6252 statements,
6253 characteristics,
6254 })
6255 }
6256
6257 pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6259 Ok(
6260 match self.expect_one_of_keywords(&[
6261 Keyword::FOR,
6262 Keyword::BEFORE,
6263 Keyword::AFTER,
6264 Keyword::INSTEAD,
6265 ])? {
6266 Keyword::FOR => TriggerPeriod::For,
6267 Keyword::BEFORE => TriggerPeriod::Before,
6268 Keyword::AFTER => TriggerPeriod::After,
6269 Keyword::INSTEAD => self
6270 .expect_keyword_is(Keyword::OF)
6271 .map(|_| TriggerPeriod::InsteadOf)?,
6272 unexpected_keyword => return Err(ParserError::ParserError(
6273 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6274 )),
6275 },
6276 )
6277 }
6278
6279 pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6281 Ok(
6282 match self.expect_one_of_keywords(&[
6283 Keyword::INSERT,
6284 Keyword::UPDATE,
6285 Keyword::DELETE,
6286 Keyword::TRUNCATE,
6287 ])? {
6288 Keyword::INSERT => TriggerEvent::Insert,
6289 Keyword::UPDATE => {
6290 if self.parse_keyword(Keyword::OF) {
6291 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6292 TriggerEvent::Update(cols)
6293 } else {
6294 TriggerEvent::Update(vec![])
6295 }
6296 }
6297 Keyword::DELETE => TriggerEvent::Delete,
6298 Keyword::TRUNCATE => TriggerEvent::Truncate,
6299 unexpected_keyword => return Err(ParserError::ParserError(
6300 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6301 )),
6302 },
6303 )
6304 }
6305
6306 pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6308 let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6309 Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6310 TriggerReferencingType::OldTable
6311 }
6312 Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6313 TriggerReferencingType::NewTable
6314 }
6315 _ => {
6316 return Ok(None);
6317 }
6318 };
6319
6320 let is_as = self.parse_keyword(Keyword::AS);
6321 let transition_relation_name = self.parse_object_name(false)?;
6322 Ok(Some(TriggerReferencing {
6323 refer_type,
6324 is_as,
6325 transition_relation_name,
6326 }))
6327 }
6328
6329 pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6331 Ok(TriggerExecBody {
6332 exec_type: match self
6333 .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6334 {
6335 Keyword::FUNCTION => TriggerExecBodyType::Function,
6336 Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6337 unexpected_keyword => return Err(ParserError::ParserError(
6338 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6339 )),
6340 },
6341 func_desc: self.parse_function_desc()?,
6342 })
6343 }
6344
6345 pub fn parse_create_macro(
6347 &mut self,
6348 or_replace: bool,
6349 temporary: bool,
6350 ) -> Result<Statement, ParserError> {
6351 if dialect_of!(self is DuckDbDialect | GenericDialect) {
6352 let name = self.parse_object_name(false)?;
6353 self.expect_token(&Token::LParen)?;
6354 let args = if self.consume_token(&Token::RParen) {
6355 self.prev_token();
6356 None
6357 } else {
6358 Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6359 };
6360
6361 self.expect_token(&Token::RParen)?;
6362 self.expect_keyword_is(Keyword::AS)?;
6363
6364 Ok(Statement::CreateMacro {
6365 or_replace,
6366 temporary,
6367 name,
6368 args,
6369 definition: if self.parse_keyword(Keyword::TABLE) {
6370 MacroDefinition::Table(self.parse_query()?)
6371 } else {
6372 MacroDefinition::Expr(self.parse_expr()?)
6373 },
6374 })
6375 } else {
6376 self.prev_token();
6377 self.expected_ref("an object type after CREATE", self.peek_token_ref())
6378 }
6379 }
6380
6381 fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6382 let name = self.parse_identifier()?;
6383
6384 let default_expr =
6385 if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6386 Some(self.parse_expr()?)
6387 } else {
6388 None
6389 };
6390 Ok(MacroArg { name, default_expr })
6391 }
6392
6393 pub fn parse_create_external_table(
6395 &mut self,
6396 or_replace: bool,
6397 ) -> Result<CreateTable, ParserError> {
6398 self.expect_keyword_is(Keyword::TABLE)?;
6399 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6400 let table_name = self.parse_object_name(false)?;
6401 let (columns, constraints) = self.parse_columns()?;
6402
6403 let hive_distribution = self.parse_hive_distribution()?;
6404 let hive_formats = self.parse_hive_formats()?;
6405
6406 let file_format = if let Some(ref hf) = hive_formats {
6407 if let Some(ref ff) = hf.storage {
6408 match ff {
6409 HiveIOFormat::FileFormat { format } => Some(*format),
6410 _ => None,
6411 }
6412 } else {
6413 None
6414 }
6415 } else {
6416 None
6417 };
6418 let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6419 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6420 let table_options = if !table_properties.is_empty() {
6421 CreateTableOptions::TableProperties(table_properties)
6422 } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6423 CreateTableOptions::Options(options)
6424 } else {
6425 CreateTableOptions::None
6426 };
6427 Ok(CreateTableBuilder::new(table_name)
6428 .columns(columns)
6429 .constraints(constraints)
6430 .hive_distribution(hive_distribution)
6431 .hive_formats(hive_formats)
6432 .table_options(table_options)
6433 .or_replace(or_replace)
6434 .if_not_exists(if_not_exists)
6435 .external(true)
6436 .file_format(file_format)
6437 .location(location)
6438 .build())
6439 }
6440
6441 pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6445 self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6446 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6447 let table_name = self.parse_object_name(true)?;
6448
6449 self.expect_keyword_is(Keyword::CLONE)?;
6450 let clone = Some(self.parse_object_name(true)?);
6451
6452 let version =
6453 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6454 {
6455 Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6456 } else {
6457 None
6458 };
6459
6460 let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6461 CreateTableOptions::Options(options)
6462 } else {
6463 CreateTableOptions::None
6464 };
6465
6466 Ok(CreateTableBuilder::new(table_name)
6467 .snapshot(true)
6468 .if_not_exists(if_not_exists)
6469 .clone_clause(clone)
6470 .version(version)
6471 .table_options(table_options)
6472 .build())
6473 }
6474
6475 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6477 let next_token = self.next_token();
6478 match &next_token.token {
6479 Token::Word(w) => match w.keyword {
6480 Keyword::AVRO => Ok(FileFormat::AVRO),
6481 Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6482 Keyword::ORC => Ok(FileFormat::ORC),
6483 Keyword::PARQUET => Ok(FileFormat::PARQUET),
6484 Keyword::RCFILE => Ok(FileFormat::RCFILE),
6485 Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6486 Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6487 _ => self.expected("fileformat", next_token),
6488 },
6489 _ => self.expected("fileformat", next_token),
6490 }
6491 }
6492
6493 fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6494 if self.consume_token(&Token::Eq) {
6495 Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6496 } else {
6497 Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6498 }
6499 }
6500
6501 pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6503 let next_token = self.next_token();
6504 match &next_token.token {
6505 Token::Word(w) => match w.keyword {
6506 Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6507 Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6508 Keyword::JSON => Ok(AnalyzeFormat::JSON),
6509 Keyword::TREE => Ok(AnalyzeFormat::TREE),
6510 _ => self.expected("fileformat", next_token),
6511 },
6512 _ => self.expected("fileformat", next_token),
6513 }
6514 }
6515
6516 pub fn parse_create_view(
6518 &mut self,
6519 or_alter: bool,
6520 or_replace: bool,
6521 temporary: bool,
6522 create_view_params: Option<CreateViewParams>,
6523 ) -> Result<CreateView, ParserError> {
6524 let secure = self.parse_keyword(Keyword::SECURE);
6525 let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6526 self.expect_keyword_is(Keyword::VIEW)?;
6527 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6528 let if_not_exists_first =
6531 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6532 let name = self.parse_object_name(allow_unquoted_hyphen)?;
6533 let name_before_not_exists = !if_not_exists_first
6534 && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6535 let if_not_exists = if_not_exists_first || name_before_not_exists;
6536 let copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6537 let columns = self.parse_view_columns()?;
6540 let mut options = CreateTableOptions::None;
6541 let with_options = self.parse_options(Keyword::WITH)?;
6542 if !with_options.is_empty() {
6543 options = CreateTableOptions::With(with_options);
6544 }
6545
6546 let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6547 self.expect_keyword_is(Keyword::BY)?;
6548 self.parse_parenthesized_column_list(Optional, false)?
6549 } else {
6550 vec![]
6551 };
6552
6553 if dialect_of!(self is BigQueryDialect | GenericDialect) {
6554 if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6555 if !opts.is_empty() {
6556 options = CreateTableOptions::Options(opts);
6557 }
6558 };
6559 }
6560
6561 let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6562 && self.parse_keyword(Keyword::TO)
6563 {
6564 Some(self.parse_object_name(false)?)
6565 } else {
6566 None
6567 };
6568
6569 let comment = if self.dialect.supports_create_view_comment_syntax()
6570 && self.parse_keyword(Keyword::COMMENT)
6571 {
6572 self.expect_token(&Token::Eq)?;
6573 Some(self.parse_comment_value()?)
6574 } else {
6575 None
6576 };
6577
6578 self.expect_keyword_is(Keyword::AS)?;
6579 let query = self.parse_query()?;
6580 let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6583 && self.parse_keywords(&[
6584 Keyword::WITH,
6585 Keyword::NO,
6586 Keyword::SCHEMA,
6587 Keyword::BINDING,
6588 ]);
6589
6590 Ok(CreateView {
6591 or_alter,
6592 name,
6593 columns,
6594 query,
6595 materialized,
6596 secure,
6597 or_replace,
6598 options,
6599 cluster_by,
6600 comment,
6601 with_no_schema_binding,
6602 if_not_exists,
6603 temporary,
6604 copy_grants,
6605 to,
6606 params: create_view_params,
6607 name_before_not_exists,
6608 })
6609 }
6610
6611 fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6615 let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6616 self.expect_token(&Token::Eq)?;
6617 Some(
6618 match self.expect_one_of_keywords(&[
6619 Keyword::UNDEFINED,
6620 Keyword::MERGE,
6621 Keyword::TEMPTABLE,
6622 ])? {
6623 Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6624 Keyword::MERGE => CreateViewAlgorithm::Merge,
6625 Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6626 _ => {
6627 self.prev_token();
6628 let found = self.next_token();
6629 return self
6630 .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6631 }
6632 },
6633 )
6634 } else {
6635 None
6636 };
6637 let definer = if self.parse_keyword(Keyword::DEFINER) {
6638 self.expect_token(&Token::Eq)?;
6639 Some(self.parse_grantee_name()?)
6640 } else {
6641 None
6642 };
6643 let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6644 Some(
6645 match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6646 Keyword::DEFINER => CreateViewSecurity::Definer,
6647 Keyword::INVOKER => CreateViewSecurity::Invoker,
6648 _ => {
6649 self.prev_token();
6650 let found = self.next_token();
6651 return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6652 }
6653 },
6654 )
6655 } else {
6656 None
6657 };
6658 if algorithm.is_some() || definer.is_some() || security.is_some() {
6659 Ok(Some(CreateViewParams {
6660 algorithm,
6661 definer,
6662 security,
6663 }))
6664 } else {
6665 Ok(None)
6666 }
6667 }
6668
6669 pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6671 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6672 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6673
6674 let _ = self.parse_keyword(Keyword::WITH); let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6677 vec![Keyword::AUTHORIZATION]
6678 } else if dialect_of!(self is PostgreSqlDialect) {
6679 vec![
6680 Keyword::LOGIN,
6681 Keyword::NOLOGIN,
6682 Keyword::INHERIT,
6683 Keyword::NOINHERIT,
6684 Keyword::BYPASSRLS,
6685 Keyword::NOBYPASSRLS,
6686 Keyword::PASSWORD,
6687 Keyword::CREATEDB,
6688 Keyword::NOCREATEDB,
6689 Keyword::CREATEROLE,
6690 Keyword::NOCREATEROLE,
6691 Keyword::SUPERUSER,
6692 Keyword::NOSUPERUSER,
6693 Keyword::REPLICATION,
6694 Keyword::NOREPLICATION,
6695 Keyword::CONNECTION,
6696 Keyword::VALID,
6697 Keyword::IN,
6698 Keyword::ROLE,
6699 Keyword::ADMIN,
6700 Keyword::USER,
6701 ]
6702 } else {
6703 vec![]
6704 };
6705
6706 let mut authorization_owner = None;
6708 let mut login = None;
6710 let mut inherit = None;
6711 let mut bypassrls = None;
6712 let mut password = None;
6713 let mut create_db = None;
6714 let mut create_role = None;
6715 let mut superuser = None;
6716 let mut replication = None;
6717 let mut connection_limit = None;
6718 let mut valid_until = None;
6719 let mut in_role = vec![];
6720 let mut in_group = vec![];
6721 let mut role = vec![];
6722 let mut user = vec![];
6723 let mut admin = vec![];
6724
6725 while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6726 let loc = self
6727 .tokens
6728 .get(self.index - 1)
6729 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6730 match keyword {
6731 Keyword::AUTHORIZATION => {
6732 if authorization_owner.is_some() {
6733 parser_err!("Found multiple AUTHORIZATION", loc)
6734 } else {
6735 authorization_owner = Some(self.parse_object_name(false)?);
6736 Ok(())
6737 }
6738 }
6739 Keyword::LOGIN | Keyword::NOLOGIN => {
6740 if login.is_some() {
6741 parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6742 } else {
6743 login = Some(keyword == Keyword::LOGIN);
6744 Ok(())
6745 }
6746 }
6747 Keyword::INHERIT | Keyword::NOINHERIT => {
6748 if inherit.is_some() {
6749 parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6750 } else {
6751 inherit = Some(keyword == Keyword::INHERIT);
6752 Ok(())
6753 }
6754 }
6755 Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6756 if bypassrls.is_some() {
6757 parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6758 } else {
6759 bypassrls = Some(keyword == Keyword::BYPASSRLS);
6760 Ok(())
6761 }
6762 }
6763 Keyword::CREATEDB | Keyword::NOCREATEDB => {
6764 if create_db.is_some() {
6765 parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6766 } else {
6767 create_db = Some(keyword == Keyword::CREATEDB);
6768 Ok(())
6769 }
6770 }
6771 Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6772 if create_role.is_some() {
6773 parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6774 } else {
6775 create_role = Some(keyword == Keyword::CREATEROLE);
6776 Ok(())
6777 }
6778 }
6779 Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6780 if superuser.is_some() {
6781 parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6782 } else {
6783 superuser = Some(keyword == Keyword::SUPERUSER);
6784 Ok(())
6785 }
6786 }
6787 Keyword::REPLICATION | Keyword::NOREPLICATION => {
6788 if replication.is_some() {
6789 parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6790 } else {
6791 replication = Some(keyword == Keyword::REPLICATION);
6792 Ok(())
6793 }
6794 }
6795 Keyword::PASSWORD => {
6796 if password.is_some() {
6797 parser_err!("Found multiple PASSWORD", loc)
6798 } else {
6799 password = if self.parse_keyword(Keyword::NULL) {
6800 Some(Password::NullPassword)
6801 } else {
6802 Some(Password::Password(Expr::Value(self.parse_value()?)))
6803 };
6804 Ok(())
6805 }
6806 }
6807 Keyword::CONNECTION => {
6808 self.expect_keyword_is(Keyword::LIMIT)?;
6809 if connection_limit.is_some() {
6810 parser_err!("Found multiple CONNECTION LIMIT", loc)
6811 } else {
6812 connection_limit = Some(Expr::Value(self.parse_number_value()?));
6813 Ok(())
6814 }
6815 }
6816 Keyword::VALID => {
6817 self.expect_keyword_is(Keyword::UNTIL)?;
6818 if valid_until.is_some() {
6819 parser_err!("Found multiple VALID UNTIL", loc)
6820 } else {
6821 valid_until = Some(Expr::Value(self.parse_value()?));
6822 Ok(())
6823 }
6824 }
6825 Keyword::IN => {
6826 if self.parse_keyword(Keyword::ROLE) {
6827 if !in_role.is_empty() {
6828 parser_err!("Found multiple IN ROLE", loc)
6829 } else {
6830 in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
6831 Ok(())
6832 }
6833 } else if self.parse_keyword(Keyword::GROUP) {
6834 if !in_group.is_empty() {
6835 parser_err!("Found multiple IN GROUP", loc)
6836 } else {
6837 in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
6838 Ok(())
6839 }
6840 } else {
6841 self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
6842 }
6843 }
6844 Keyword::ROLE => {
6845 if !role.is_empty() {
6846 parser_err!("Found multiple ROLE", loc)
6847 } else {
6848 role = self.parse_comma_separated(|p| p.parse_identifier())?;
6849 Ok(())
6850 }
6851 }
6852 Keyword::USER => {
6853 if !user.is_empty() {
6854 parser_err!("Found multiple USER", loc)
6855 } else {
6856 user = self.parse_comma_separated(|p| p.parse_identifier())?;
6857 Ok(())
6858 }
6859 }
6860 Keyword::ADMIN => {
6861 if !admin.is_empty() {
6862 parser_err!("Found multiple ADMIN", loc)
6863 } else {
6864 admin = self.parse_comma_separated(|p| p.parse_identifier())?;
6865 Ok(())
6866 }
6867 }
6868 _ => break,
6869 }?
6870 }
6871
6872 Ok(CreateRole {
6873 names,
6874 if_not_exists,
6875 login,
6876 inherit,
6877 bypassrls,
6878 password,
6879 create_db,
6880 create_role,
6881 replication,
6882 superuser,
6883 connection_limit,
6884 valid_until,
6885 in_role,
6886 in_group,
6887 role,
6888 user,
6889 admin,
6890 authorization_owner,
6891 })
6892 }
6893
6894 pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
6896 let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
6897 Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
6898 Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
6899 Some(Keyword::SESSION_USER) => Owner::SessionUser,
6900 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6901 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
6902 )),
6903 None => {
6904 match self.parse_identifier() {
6905 Ok(ident) => Owner::Ident(ident),
6906 Err(e) => {
6907 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
6908 }
6909 }
6910 }
6911 };
6912 Ok(owner)
6913 }
6914
6915 fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
6917 let name = self.parse_object_name(false)?;
6918 self.expect_keyword_is(Keyword::AS)?;
6919 let data_type = self.parse_data_type()?;
6920 let collation = if self.parse_keyword(Keyword::COLLATE) {
6921 Some(self.parse_identifier()?)
6922 } else {
6923 None
6924 };
6925 let default = if self.parse_keyword(Keyword::DEFAULT) {
6926 Some(self.parse_expr()?)
6927 } else {
6928 None
6929 };
6930 let mut constraints = Vec::new();
6931 while let Some(constraint) = self.parse_optional_table_constraint()? {
6932 constraints.push(constraint);
6933 }
6934
6935 Ok(CreateDomain {
6936 name,
6937 data_type,
6938 collation,
6939 default,
6940 constraints,
6941 })
6942 }
6943
6944 pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
6954 let name = self.parse_identifier()?;
6955 self.expect_keyword_is(Keyword::ON)?;
6956 let table_name = self.parse_object_name(false)?;
6957
6958 let policy_type = if self.parse_keyword(Keyword::AS) {
6959 let keyword =
6960 self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
6961 Some(match keyword {
6962 Keyword::PERMISSIVE => CreatePolicyType::Permissive,
6963 Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
6964 unexpected_keyword => return Err(ParserError::ParserError(
6965 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
6966 )),
6967 })
6968 } else {
6969 None
6970 };
6971
6972 let command = if self.parse_keyword(Keyword::FOR) {
6973 let keyword = self.expect_one_of_keywords(&[
6974 Keyword::ALL,
6975 Keyword::SELECT,
6976 Keyword::INSERT,
6977 Keyword::UPDATE,
6978 Keyword::DELETE,
6979 ])?;
6980 Some(match keyword {
6981 Keyword::ALL => CreatePolicyCommand::All,
6982 Keyword::SELECT => CreatePolicyCommand::Select,
6983 Keyword::INSERT => CreatePolicyCommand::Insert,
6984 Keyword::UPDATE => CreatePolicyCommand::Update,
6985 Keyword::DELETE => CreatePolicyCommand::Delete,
6986 unexpected_keyword => return Err(ParserError::ParserError(
6987 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
6988 )),
6989 })
6990 } else {
6991 None
6992 };
6993
6994 let to = if self.parse_keyword(Keyword::TO) {
6995 Some(self.parse_comma_separated(|p| p.parse_owner())?)
6996 } else {
6997 None
6998 };
6999
7000 let using = if self.parse_keyword(Keyword::USING) {
7001 self.expect_token(&Token::LParen)?;
7002 let expr = self.parse_expr()?;
7003 self.expect_token(&Token::RParen)?;
7004 Some(expr)
7005 } else {
7006 None
7007 };
7008
7009 let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7010 self.expect_token(&Token::LParen)?;
7011 let expr = self.parse_expr()?;
7012 self.expect_token(&Token::RParen)?;
7013 Some(expr)
7014 } else {
7015 None
7016 };
7017
7018 Ok(CreatePolicy {
7019 name,
7020 table_name,
7021 policy_type,
7022 command,
7023 to,
7024 using,
7025 with_check,
7026 })
7027 }
7028
7029 pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7039 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7040 let name = self.parse_identifier()?;
7041
7042 let connector_type = if self.parse_keyword(Keyword::TYPE) {
7043 Some(self.parse_literal_string()?)
7044 } else {
7045 None
7046 };
7047
7048 let url = if self.parse_keyword(Keyword::URL) {
7049 Some(self.parse_literal_string()?)
7050 } else {
7051 None
7052 };
7053
7054 let comment = self.parse_optional_inline_comment()?;
7055
7056 let with_dcproperties =
7057 match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7058 properties if !properties.is_empty() => Some(properties),
7059 _ => None,
7060 };
7061
7062 Ok(CreateConnector {
7063 name,
7064 if_not_exists,
7065 connector_type,
7066 url,
7067 comment,
7068 with_dcproperties,
7069 })
7070 }
7071
7072 fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7078 let mut parts = vec![];
7079 loop {
7080 parts.push(ObjectNamePart::Identifier(Ident::new(
7081 self.next_token().to_string(),
7082 )));
7083 if !self.consume_token(&Token::Period) {
7084 break;
7085 }
7086 }
7087 Ok(ObjectName(parts))
7088 }
7089
7090 pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7094 let name = self.parse_operator_name()?;
7095 self.expect_token(&Token::LParen)?;
7096
7097 let mut function: Option<ObjectName> = None;
7098 let mut is_procedure = false;
7099 let mut left_arg: Option<DataType> = None;
7100 let mut right_arg: Option<DataType> = None;
7101 let mut options: Vec<OperatorOption> = Vec::new();
7102
7103 loop {
7104 let keyword = self.expect_one_of_keywords(&[
7105 Keyword::FUNCTION,
7106 Keyword::PROCEDURE,
7107 Keyword::LEFTARG,
7108 Keyword::RIGHTARG,
7109 Keyword::COMMUTATOR,
7110 Keyword::NEGATOR,
7111 Keyword::RESTRICT,
7112 Keyword::JOIN,
7113 Keyword::HASHES,
7114 Keyword::MERGES,
7115 ])?;
7116
7117 match keyword {
7118 Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7119 options.push(OperatorOption::Hashes);
7120 }
7121 Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7122 options.push(OperatorOption::Merges);
7123 }
7124 Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7125 self.expect_token(&Token::Eq)?;
7126 function = Some(self.parse_object_name(false)?);
7127 is_procedure = keyword == Keyword::PROCEDURE;
7128 }
7129 Keyword::LEFTARG if left_arg.is_none() => {
7130 self.expect_token(&Token::Eq)?;
7131 left_arg = Some(self.parse_data_type()?);
7132 }
7133 Keyword::RIGHTARG if right_arg.is_none() => {
7134 self.expect_token(&Token::Eq)?;
7135 right_arg = Some(self.parse_data_type()?);
7136 }
7137 Keyword::COMMUTATOR
7138 if !options
7139 .iter()
7140 .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7141 {
7142 self.expect_token(&Token::Eq)?;
7143 if self.parse_keyword(Keyword::OPERATOR) {
7144 self.expect_token(&Token::LParen)?;
7145 let op = self.parse_operator_name()?;
7146 self.expect_token(&Token::RParen)?;
7147 options.push(OperatorOption::Commutator(op));
7148 } else {
7149 options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7150 }
7151 }
7152 Keyword::NEGATOR
7153 if !options
7154 .iter()
7155 .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7156 {
7157 self.expect_token(&Token::Eq)?;
7158 if self.parse_keyword(Keyword::OPERATOR) {
7159 self.expect_token(&Token::LParen)?;
7160 let op = self.parse_operator_name()?;
7161 self.expect_token(&Token::RParen)?;
7162 options.push(OperatorOption::Negator(op));
7163 } else {
7164 options.push(OperatorOption::Negator(self.parse_operator_name()?));
7165 }
7166 }
7167 Keyword::RESTRICT
7168 if !options
7169 .iter()
7170 .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7171 {
7172 self.expect_token(&Token::Eq)?;
7173 options.push(OperatorOption::Restrict(Some(
7174 self.parse_object_name(false)?,
7175 )));
7176 }
7177 Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7178 self.expect_token(&Token::Eq)?;
7179 options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7180 }
7181 _ => {
7182 return Err(ParserError::ParserError(format!(
7183 "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7184 keyword
7185 )))
7186 }
7187 }
7188
7189 if !self.consume_token(&Token::Comma) {
7190 break;
7191 }
7192 }
7193
7194 self.expect_token(&Token::RParen)?;
7196
7197 let function = function.ok_or_else(|| {
7199 ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7200 })?;
7201
7202 Ok(CreateOperator {
7203 name,
7204 function,
7205 is_procedure,
7206 left_arg,
7207 right_arg,
7208 options,
7209 })
7210 }
7211
7212 pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7216 let name = self.parse_object_name(false)?;
7217 self.expect_keyword(Keyword::USING)?;
7218 let using = self.parse_identifier()?;
7219
7220 Ok(CreateOperatorFamily { name, using })
7221 }
7222
7223 pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7227 let name = self.parse_object_name(false)?;
7228 let default = self.parse_keyword(Keyword::DEFAULT);
7229 self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7230 let for_type = self.parse_data_type()?;
7231 self.expect_keyword(Keyword::USING)?;
7232 let using = self.parse_identifier()?;
7233
7234 let family = if self.parse_keyword(Keyword::FAMILY) {
7235 Some(self.parse_object_name(false)?)
7236 } else {
7237 None
7238 };
7239
7240 self.expect_keyword(Keyword::AS)?;
7241
7242 let mut items = vec![];
7243 loop {
7244 if self.parse_keyword(Keyword::OPERATOR) {
7245 let strategy_number = self.parse_literal_uint()?;
7246 let operator_name = self.parse_operator_name()?;
7247
7248 let op_types = if self.consume_token(&Token::LParen) {
7250 let left = self.parse_data_type()?;
7251 self.expect_token(&Token::Comma)?;
7252 let right = self.parse_data_type()?;
7253 self.expect_token(&Token::RParen)?;
7254 Some(OperatorArgTypes { left, right })
7255 } else {
7256 None
7257 };
7258
7259 let purpose = if self.parse_keyword(Keyword::FOR) {
7261 if self.parse_keyword(Keyword::SEARCH) {
7262 Some(OperatorPurpose::ForSearch)
7263 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7264 let sort_family = self.parse_object_name(false)?;
7265 Some(OperatorPurpose::ForOrderBy { sort_family })
7266 } else {
7267 return self
7268 .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7269 }
7270 } else {
7271 None
7272 };
7273
7274 items.push(OperatorClassItem::Operator {
7275 strategy_number,
7276 operator_name,
7277 op_types,
7278 purpose,
7279 });
7280 } else if self.parse_keyword(Keyword::FUNCTION) {
7281 let support_number = self.parse_literal_uint()?;
7282
7283 let op_types = if self.consume_token(&Token::LParen)
7285 && self.peek_token_ref().token != Token::RParen
7286 {
7287 let mut types = vec![];
7288 loop {
7289 types.push(self.parse_data_type()?);
7290 if !self.consume_token(&Token::Comma) {
7291 break;
7292 }
7293 }
7294 self.expect_token(&Token::RParen)?;
7295 Some(types)
7296 } else if self.consume_token(&Token::LParen) {
7297 self.expect_token(&Token::RParen)?;
7298 Some(vec![])
7299 } else {
7300 None
7301 };
7302
7303 let function_name = self.parse_object_name(false)?;
7304
7305 let argument_types = if self.consume_token(&Token::LParen) {
7307 let mut types = vec![];
7308 loop {
7309 if self.peek_token_ref().token == Token::RParen {
7310 break;
7311 }
7312 types.push(self.parse_data_type()?);
7313 if !self.consume_token(&Token::Comma) {
7314 break;
7315 }
7316 }
7317 self.expect_token(&Token::RParen)?;
7318 types
7319 } else {
7320 vec![]
7321 };
7322
7323 items.push(OperatorClassItem::Function {
7324 support_number,
7325 op_types,
7326 function_name,
7327 argument_types,
7328 });
7329 } else if self.parse_keyword(Keyword::STORAGE) {
7330 let storage_type = self.parse_data_type()?;
7331 items.push(OperatorClassItem::Storage { storage_type });
7332 } else {
7333 break;
7334 }
7335
7336 if !self.consume_token(&Token::Comma) {
7338 break;
7339 }
7340 }
7341
7342 Ok(CreateOperatorClass {
7343 name,
7344 default,
7345 for_type,
7346 using,
7347 family,
7348 items,
7349 })
7350 }
7351
7352 pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7354 let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7356 && self.parse_keyword(Keyword::TEMPORARY);
7357 let persistent = dialect_of!(self is DuckDbDialect)
7358 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7359
7360 let object_type = if self.parse_keyword(Keyword::TABLE) {
7361 ObjectType::Table
7362 } else if self.parse_keyword(Keyword::COLLATION) {
7363 ObjectType::Collation
7364 } else if self.parse_keyword(Keyword::VIEW) {
7365 ObjectType::View
7366 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7367 ObjectType::MaterializedView
7368 } else if self.parse_keyword(Keyword::INDEX) {
7369 ObjectType::Index
7370 } else if self.parse_keyword(Keyword::ROLE) {
7371 ObjectType::Role
7372 } else if self.parse_keyword(Keyword::SCHEMA) {
7373 ObjectType::Schema
7374 } else if self.parse_keyword(Keyword::DATABASE) {
7375 ObjectType::Database
7376 } else if self.parse_keyword(Keyword::SEQUENCE) {
7377 ObjectType::Sequence
7378 } else if self.parse_keyword(Keyword::STAGE) {
7379 ObjectType::Stage
7380 } else if self.parse_keyword(Keyword::TYPE) {
7381 ObjectType::Type
7382 } else if self.parse_keyword(Keyword::USER) {
7383 ObjectType::User
7384 } else if self.parse_keyword(Keyword::STREAM) {
7385 ObjectType::Stream
7386 } else if self.parse_keyword(Keyword::FUNCTION) {
7387 return self.parse_drop_function().map(Into::into);
7388 } else if self.parse_keyword(Keyword::POLICY) {
7389 return self.parse_drop_policy().map(Into::into);
7390 } else if self.parse_keyword(Keyword::CONNECTOR) {
7391 return self.parse_drop_connector();
7392 } else if self.parse_keyword(Keyword::DOMAIN) {
7393 return self.parse_drop_domain().map(Into::into);
7394 } else if self.parse_keyword(Keyword::PROCEDURE) {
7395 return self.parse_drop_procedure();
7396 } else if self.parse_keyword(Keyword::SECRET) {
7397 return self.parse_drop_secret(temporary, persistent);
7398 } else if self.parse_keyword(Keyword::TRIGGER) {
7399 return self.parse_drop_trigger().map(Into::into);
7400 } else if self.parse_keyword(Keyword::EXTENSION) {
7401 return self.parse_drop_extension();
7402 } else if self.parse_keyword(Keyword::OPERATOR) {
7403 return if self.parse_keyword(Keyword::FAMILY) {
7405 self.parse_drop_operator_family()
7406 } else if self.parse_keyword(Keyword::CLASS) {
7407 self.parse_drop_operator_class()
7408 } else {
7409 self.parse_drop_operator()
7410 };
7411 } else {
7412 return self.expected_ref(
7413 "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7414 self.peek_token_ref(),
7415 );
7416 };
7417 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7420 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7421
7422 let loc = self.peek_token_ref().span.start;
7423 let cascade = self.parse_keyword(Keyword::CASCADE);
7424 let restrict = self.parse_keyword(Keyword::RESTRICT);
7425 let purge = self.parse_keyword(Keyword::PURGE);
7426 if cascade && restrict {
7427 return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7428 }
7429 if object_type == ObjectType::Role && (cascade || restrict || purge) {
7430 return parser_err!(
7431 "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7432 loc
7433 );
7434 }
7435 let table = if self.parse_keyword(Keyword::ON) {
7436 Some(self.parse_object_name(false)?)
7437 } else {
7438 None
7439 };
7440 Ok(Statement::Drop {
7441 object_type,
7442 if_exists,
7443 names,
7444 cascade,
7445 restrict,
7446 purge,
7447 temporary,
7448 table,
7449 })
7450 }
7451
7452 fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7453 match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7454 Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7455 Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7456 _ => None,
7457 }
7458 }
7459
7460 fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7465 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7466 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7467 let drop_behavior = self.parse_optional_drop_behavior();
7468 Ok(DropFunction {
7469 if_exists,
7470 func_desc,
7471 drop_behavior,
7472 })
7473 }
7474
7475 fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7481 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7482 let name = self.parse_identifier()?;
7483 self.expect_keyword_is(Keyword::ON)?;
7484 let table_name = self.parse_object_name(false)?;
7485 let drop_behavior = self.parse_optional_drop_behavior();
7486 Ok(DropPolicy {
7487 if_exists,
7488 name,
7489 table_name,
7490 drop_behavior,
7491 })
7492 }
7493 fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7499 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7500 let name = self.parse_identifier()?;
7501 Ok(Statement::DropConnector { if_exists, name })
7502 }
7503
7504 fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7508 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7509 let name = self.parse_object_name(false)?;
7510 let drop_behavior = self.parse_optional_drop_behavior();
7511 Ok(DropDomain {
7512 if_exists,
7513 name,
7514 drop_behavior,
7515 })
7516 }
7517
7518 fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7523 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7524 let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7525 let drop_behavior = self.parse_optional_drop_behavior();
7526 Ok(Statement::DropProcedure {
7527 if_exists,
7528 proc_desc,
7529 drop_behavior,
7530 })
7531 }
7532
7533 fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7534 let name = self.parse_object_name(false)?;
7535
7536 let args = if self.consume_token(&Token::LParen) {
7537 if self.consume_token(&Token::RParen) {
7538 Some(vec![])
7539 } else {
7540 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7541 self.expect_token(&Token::RParen)?;
7542 Some(args)
7543 }
7544 } else {
7545 None
7546 };
7547
7548 Ok(FunctionDesc { name, args })
7549 }
7550
7551 fn parse_drop_secret(
7553 &mut self,
7554 temporary: bool,
7555 persistent: bool,
7556 ) -> Result<Statement, ParserError> {
7557 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7558 let name = self.parse_identifier()?;
7559 let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7560 self.parse_identifier().ok()
7561 } else {
7562 None
7563 };
7564 let temp = match (temporary, persistent) {
7565 (true, false) => Some(true),
7566 (false, true) => Some(false),
7567 (false, false) => None,
7568 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7569 };
7570
7571 Ok(Statement::DropSecret {
7572 if_exists,
7573 temporary: temp,
7574 name,
7575 storage_specifier,
7576 })
7577 }
7578
7579 pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7589 if dialect_of!(self is BigQueryDialect) {
7590 return self.parse_big_query_declare();
7591 }
7592 if dialect_of!(self is SnowflakeDialect) {
7593 return self.parse_snowflake_declare();
7594 }
7595 if dialect_of!(self is MsSqlDialect) {
7596 return self.parse_mssql_declare();
7597 }
7598
7599 let name = self.parse_identifier()?;
7600
7601 let binary = Some(self.parse_keyword(Keyword::BINARY));
7602 let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7603 Some(true)
7604 } else if self.parse_keyword(Keyword::ASENSITIVE) {
7605 Some(false)
7606 } else {
7607 None
7608 };
7609 let scroll = if self.parse_keyword(Keyword::SCROLL) {
7610 Some(true)
7611 } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7612 Some(false)
7613 } else {
7614 None
7615 };
7616
7617 self.expect_keyword_is(Keyword::CURSOR)?;
7618 let declare_type = Some(DeclareType::Cursor);
7619
7620 let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7621 Some(keyword) => {
7622 self.expect_keyword_is(Keyword::HOLD)?;
7623
7624 match keyword {
7625 Keyword::WITH => Some(true),
7626 Keyword::WITHOUT => Some(false),
7627 unexpected_keyword => return Err(ParserError::ParserError(
7628 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7629 )),
7630 }
7631 }
7632 None => None,
7633 };
7634
7635 self.expect_keyword_is(Keyword::FOR)?;
7636
7637 let query = Some(self.parse_query()?);
7638
7639 Ok(Statement::Declare {
7640 stmts: vec![Declare {
7641 names: vec![name],
7642 data_type: None,
7643 assignment: None,
7644 declare_type,
7645 binary,
7646 sensitive,
7647 scroll,
7648 hold,
7649 for_query: query,
7650 }],
7651 })
7652 }
7653
7654 pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7662 let names = self.parse_comma_separated(Parser::parse_identifier)?;
7663
7664 let data_type = match &self.peek_token_ref().token {
7665 Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7666 _ => Some(self.parse_data_type()?),
7667 };
7668
7669 let expr = if data_type.is_some() {
7670 if self.parse_keyword(Keyword::DEFAULT) {
7671 Some(self.parse_expr()?)
7672 } else {
7673 None
7674 }
7675 } else {
7676 self.expect_keyword_is(Keyword::DEFAULT)?;
7679 Some(self.parse_expr()?)
7680 };
7681
7682 Ok(Statement::Declare {
7683 stmts: vec![Declare {
7684 names,
7685 data_type,
7686 assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7687 declare_type: None,
7688 binary: None,
7689 sensitive: None,
7690 scroll: None,
7691 hold: None,
7692 for_query: None,
7693 }],
7694 })
7695 }
7696
7697 pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7722 let mut stmts = vec![];
7723 loop {
7724 let name = self.parse_identifier()?;
7725 let (declare_type, for_query, assigned_expr, data_type) =
7726 if self.parse_keyword(Keyword::CURSOR) {
7727 self.expect_keyword_is(Keyword::FOR)?;
7728 match &self.peek_token_ref().token {
7729 Token::Word(w) if w.keyword == Keyword::SELECT => (
7730 Some(DeclareType::Cursor),
7731 Some(self.parse_query()?),
7732 None,
7733 None,
7734 ),
7735 _ => (
7736 Some(DeclareType::Cursor),
7737 None,
7738 Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7739 None,
7740 ),
7741 }
7742 } else if self.parse_keyword(Keyword::RESULTSET) {
7743 let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7744 self.parse_snowflake_variable_declaration_expression()?
7745 } else {
7746 None
7748 };
7749
7750 (Some(DeclareType::ResultSet), None, assigned_expr, None)
7751 } else if self.parse_keyword(Keyword::EXCEPTION) {
7752 let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7753 Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7754 } else {
7755 None
7757 };
7758
7759 (Some(DeclareType::Exception), None, assigned_expr, None)
7760 } else {
7761 let (assigned_expr, data_type) = if let Some(assigned_expr) =
7763 self.parse_snowflake_variable_declaration_expression()?
7764 {
7765 (Some(assigned_expr), None)
7766 } else if let Token::Word(_) = &self.peek_token_ref().token {
7767 let data_type = self.parse_data_type()?;
7768 (
7769 self.parse_snowflake_variable_declaration_expression()?,
7770 Some(data_type),
7771 )
7772 } else {
7773 (None, None)
7774 };
7775 (None, None, assigned_expr, data_type)
7776 };
7777 let stmt = Declare {
7778 names: vec![name],
7779 data_type,
7780 assignment: assigned_expr,
7781 declare_type,
7782 binary: None,
7783 sensitive: None,
7784 scroll: None,
7785 hold: None,
7786 for_query,
7787 };
7788
7789 stmts.push(stmt);
7790 if self.consume_token(&Token::SemiColon) {
7791 match &self.peek_token_ref().token {
7792 Token::Word(w)
7793 if ALL_KEYWORDS
7794 .binary_search(&w.value.to_uppercase().as_str())
7795 .is_err() =>
7796 {
7797 continue;
7799 }
7800 _ => {
7801 self.prev_token();
7803 }
7804 }
7805 }
7806
7807 break;
7808 }
7809
7810 Ok(Statement::Declare { stmts })
7811 }
7812
7813 pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
7825 let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
7826
7827 Ok(Statement::Declare { stmts })
7828 }
7829
7830 pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
7841 let name = {
7842 let ident = self.parse_identifier()?;
7843 if !ident.value.starts_with('@')
7844 && !matches!(
7845 &self.peek_token_ref().token,
7846 Token::Word(w) if w.keyword == Keyword::CURSOR
7847 )
7848 {
7849 Err(ParserError::TokenizerError(
7850 "Invalid MsSql variable declaration.".to_string(),
7851 ))
7852 } else {
7853 Ok(ident)
7854 }
7855 }?;
7856
7857 let (declare_type, data_type) = match &self.peek_token_ref().token {
7858 Token::Word(w) => match w.keyword {
7859 Keyword::CURSOR => {
7860 self.next_token();
7861 (Some(DeclareType::Cursor), None)
7862 }
7863 Keyword::AS => {
7864 self.next_token();
7865 (None, Some(self.parse_data_type()?))
7866 }
7867 _ => (None, Some(self.parse_data_type()?)),
7868 },
7869 _ => (None, Some(self.parse_data_type()?)),
7870 };
7871
7872 let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
7873 self.next_token();
7874 let query = Some(self.parse_query()?);
7875 (query, None)
7876 } else {
7877 let assignment = self.parse_mssql_variable_declaration_expression()?;
7878 (None, assignment)
7879 };
7880
7881 Ok(Declare {
7882 names: vec![name],
7883 data_type,
7884 assignment,
7885 declare_type,
7886 binary: None,
7887 sensitive: None,
7888 scroll: None,
7889 hold: None,
7890 for_query,
7891 })
7892 }
7893
7894 pub fn parse_snowflake_variable_declaration_expression(
7902 &mut self,
7903 ) -> Result<Option<DeclareAssignment>, ParserError> {
7904 Ok(match &self.peek_token_ref().token {
7905 Token::Word(w) if w.keyword == Keyword::DEFAULT => {
7906 self.next_token(); Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
7908 }
7909 Token::Assignment => {
7910 self.next_token(); Some(DeclareAssignment::DuckAssignment(Box::new(
7912 self.parse_expr()?,
7913 )))
7914 }
7915 _ => None,
7916 })
7917 }
7918
7919 pub fn parse_mssql_variable_declaration_expression(
7926 &mut self,
7927 ) -> Result<Option<DeclareAssignment>, ParserError> {
7928 Ok(match &self.peek_token_ref().token {
7929 Token::Eq => {
7930 self.next_token(); Some(DeclareAssignment::MsSqlAssignment(Box::new(
7932 self.parse_expr()?,
7933 )))
7934 }
7935 _ => None,
7936 })
7937 }
7938
7939 pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
7941 let direction = if self.parse_keyword(Keyword::NEXT) {
7942 FetchDirection::Next
7943 } else if self.parse_keyword(Keyword::PRIOR) {
7944 FetchDirection::Prior
7945 } else if self.parse_keyword(Keyword::FIRST) {
7946 FetchDirection::First
7947 } else if self.parse_keyword(Keyword::LAST) {
7948 FetchDirection::Last
7949 } else if self.parse_keyword(Keyword::ABSOLUTE) {
7950 FetchDirection::Absolute {
7951 limit: self.parse_number_value()?,
7952 }
7953 } else if self.parse_keyword(Keyword::RELATIVE) {
7954 FetchDirection::Relative {
7955 limit: self.parse_number_value()?,
7956 }
7957 } else if self.parse_keyword(Keyword::FORWARD) {
7958 if self.parse_keyword(Keyword::ALL) {
7959 FetchDirection::ForwardAll
7960 } else {
7961 FetchDirection::Forward {
7962 limit: Some(self.parse_number_value()?),
7964 }
7965 }
7966 } else if self.parse_keyword(Keyword::BACKWARD) {
7967 if self.parse_keyword(Keyword::ALL) {
7968 FetchDirection::BackwardAll
7969 } else {
7970 FetchDirection::Backward {
7971 limit: Some(self.parse_number_value()?),
7973 }
7974 }
7975 } else if self.parse_keyword(Keyword::ALL) {
7976 FetchDirection::All
7977 } else {
7978 FetchDirection::Count {
7979 limit: self.parse_number_value()?,
7980 }
7981 };
7982
7983 let position = if self.peek_keyword(Keyword::FROM) {
7984 self.expect_keyword(Keyword::FROM)?;
7985 FetchPosition::From
7986 } else if self.peek_keyword(Keyword::IN) {
7987 self.expect_keyword(Keyword::IN)?;
7988 FetchPosition::In
7989 } else {
7990 return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
7991 };
7992
7993 let name = self.parse_identifier()?;
7994
7995 let into = if self.parse_keyword(Keyword::INTO) {
7996 Some(self.parse_object_name(false)?)
7997 } else {
7998 None
7999 };
8000
8001 Ok(Statement::Fetch {
8002 name,
8003 direction,
8004 position,
8005 into,
8006 })
8007 }
8008
8009 pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8011 let object_type = if self.parse_keyword(Keyword::ALL) {
8012 DiscardObject::ALL
8013 } else if self.parse_keyword(Keyword::PLANS) {
8014 DiscardObject::PLANS
8015 } else if self.parse_keyword(Keyword::SEQUENCES) {
8016 DiscardObject::SEQUENCES
8017 } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8018 DiscardObject::TEMP
8019 } else {
8020 return self.expected_ref(
8021 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8022 self.peek_token_ref(),
8023 );
8024 };
8025 Ok(Statement::Discard { object_type })
8026 }
8027
8028 pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8030 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8031 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8032
8033 let mut using = None;
8034
8035 let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8036 let index_name = self.parse_object_name(false)?;
8037 using = self.parse_optional_using_then_index_type()?;
8039 self.expect_keyword_is(Keyword::ON)?;
8040 Some(index_name)
8041 } else {
8042 None
8043 };
8044
8045 let table_name = self.parse_object_name(false)?;
8046
8047 using = self.parse_optional_using_then_index_type()?.or(using);
8050
8051 let columns = self.parse_parenthesized_index_column_list()?;
8052
8053 let include = if self.parse_keyword(Keyword::INCLUDE) {
8054 self.expect_token(&Token::LParen)?;
8055 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8056 self.expect_token(&Token::RParen)?;
8057 columns
8058 } else {
8059 vec![]
8060 };
8061
8062 let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8063 let not = self.parse_keyword(Keyword::NOT);
8064 self.expect_keyword_is(Keyword::DISTINCT)?;
8065 Some(!not)
8066 } else {
8067 None
8068 };
8069
8070 let with = if self.dialect.supports_create_index_with_clause()
8071 && self.parse_keyword(Keyword::WITH)
8072 {
8073 self.expect_token(&Token::LParen)?;
8074 let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8075 self.expect_token(&Token::RParen)?;
8076 with_params
8077 } else {
8078 Vec::new()
8079 };
8080
8081 let predicate = if self.parse_keyword(Keyword::WHERE) {
8082 Some(self.parse_expr()?)
8083 } else {
8084 None
8085 };
8086
8087 let index_options = self.parse_index_options()?;
8093
8094 let mut alter_options = Vec::new();
8096 while self
8097 .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8098 .is_some()
8099 {
8100 alter_options.push(self.parse_alter_table_operation()?)
8101 }
8102
8103 Ok(CreateIndex {
8104 name: index_name,
8105 table_name,
8106 using,
8107 columns,
8108 unique,
8109 concurrently,
8110 if_not_exists,
8111 include,
8112 nulls_distinct,
8113 with,
8114 predicate,
8115 index_options,
8116 alter_options,
8117 })
8118 }
8119
8120 pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8122 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8123 let name = self.parse_identifier()?;
8124
8125 let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8126 let schema = if self.parse_keyword(Keyword::SCHEMA) {
8127 Some(self.parse_identifier()?)
8128 } else {
8129 None
8130 };
8131
8132 let version = if self.parse_keyword(Keyword::VERSION) {
8133 Some(self.parse_identifier()?)
8134 } else {
8135 None
8136 };
8137
8138 let cascade = self.parse_keyword(Keyword::CASCADE);
8139
8140 (schema, version, cascade)
8141 } else {
8142 (None, None, false)
8143 };
8144
8145 Ok(CreateExtension {
8146 name,
8147 if_not_exists,
8148 schema,
8149 version,
8150 cascade,
8151 })
8152 }
8153
8154 pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8156 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8157 let name = self.parse_object_name(false)?;
8158
8159 let definition = if self.parse_keyword(Keyword::FROM) {
8160 CreateCollationDefinition::From(self.parse_object_name(false)?)
8161 } else if self.consume_token(&Token::LParen) {
8162 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8163 self.expect_token(&Token::RParen)?;
8164 CreateCollationDefinition::Options(options)
8165 } else {
8166 return self.expected_ref(
8167 "FROM or parenthesized option list after CREATE COLLATION name",
8168 self.peek_token_ref(),
8169 );
8170 };
8171
8172 Ok(CreateCollation {
8173 if_not_exists,
8174 name,
8175 definition,
8176 })
8177 }
8178
8179 pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8181 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8182 let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8183 let cascade_or_restrict =
8184 self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8185 Ok(Statement::DropExtension(DropExtension {
8186 names,
8187 if_exists,
8188 cascade_or_restrict: cascade_or_restrict
8189 .map(|k| match k {
8190 Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8191 Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8192 _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8193 })
8194 .transpose()?,
8195 }))
8196 }
8197
8198 pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8201 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8202 let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8203 let drop_behavior = self.parse_optional_drop_behavior();
8204 Ok(Statement::DropOperator(DropOperator {
8205 if_exists,
8206 operators,
8207 drop_behavior,
8208 }))
8209 }
8210
8211 fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8214 let name = self.parse_operator_name()?;
8215 self.expect_token(&Token::LParen)?;
8216
8217 let left_type = if self.parse_keyword(Keyword::NONE) {
8219 None
8220 } else {
8221 Some(self.parse_data_type()?)
8222 };
8223
8224 self.expect_token(&Token::Comma)?;
8225
8226 let right_type = self.parse_data_type()?;
8228
8229 self.expect_token(&Token::RParen)?;
8230
8231 Ok(DropOperatorSignature {
8232 name,
8233 left_type,
8234 right_type,
8235 })
8236 }
8237
8238 pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8242 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8243 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8244 self.expect_keyword(Keyword::USING)?;
8245 let using = self.parse_identifier()?;
8246 let drop_behavior = self.parse_optional_drop_behavior();
8247 Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8248 if_exists,
8249 names,
8250 using,
8251 drop_behavior,
8252 }))
8253 }
8254
8255 pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8259 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8260 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8261 self.expect_keyword(Keyword::USING)?;
8262 let using = self.parse_identifier()?;
8263 let drop_behavior = self.parse_optional_drop_behavior();
8264 Ok(Statement::DropOperatorClass(DropOperatorClass {
8265 if_exists,
8266 names,
8267 using,
8268 drop_behavior,
8269 }))
8270 }
8271
8272 pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8276 if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8277 self.expect_token(&Token::LParen)?;
8278 let columns =
8279 self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8280 self.expect_token(&Token::RParen)?;
8281 Ok(HiveDistributionStyle::PARTITIONED { columns })
8282 } else {
8283 Ok(HiveDistributionStyle::NONE)
8284 }
8285 }
8286
8287 fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8291 let token = self.next_token();
8292 match &token.token {
8293 Token::Word(w) => match w.keyword {
8294 Keyword::AUTO => Ok(DistStyle::Auto),
8295 Keyword::EVEN => Ok(DistStyle::Even),
8296 Keyword::KEY => Ok(DistStyle::Key),
8297 Keyword::ALL => Ok(DistStyle::All),
8298 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8299 },
8300 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8301 }
8302 }
8303
8304 pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8306 let mut hive_format: Option<HiveFormat> = None;
8307 loop {
8308 match self.parse_one_of_keywords(&[
8309 Keyword::ROW,
8310 Keyword::STORED,
8311 Keyword::LOCATION,
8312 Keyword::WITH,
8313 Keyword::USING,
8314 ]) {
8315 Some(Keyword::ROW) => {
8316 hive_format
8317 .get_or_insert_with(HiveFormat::default)
8318 .row_format = Some(self.parse_row_format()?);
8319 }
8320 Some(Keyword::STORED) => {
8321 self.expect_keyword_is(Keyword::AS)?;
8322 if self.parse_keyword(Keyword::INPUTFORMAT) {
8323 let input_format = self.parse_expr()?;
8324 self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8325 let output_format = self.parse_expr()?;
8326 hive_format.get_or_insert_with(HiveFormat::default).storage =
8327 Some(HiveIOFormat::IOF {
8328 input_format,
8329 output_format,
8330 });
8331 } else {
8332 let format = self.parse_file_format()?;
8333 hive_format.get_or_insert_with(HiveFormat::default).storage =
8334 Some(HiveIOFormat::FileFormat { format });
8335 }
8336 }
8337 Some(Keyword::LOCATION) => {
8338 hive_format.get_or_insert_with(HiveFormat::default).location =
8339 Some(self.parse_literal_string()?);
8340 }
8341 Some(Keyword::WITH) => {
8342 self.prev_token();
8343 let properties = self
8344 .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8345 if !properties.is_empty() {
8346 hive_format
8347 .get_or_insert_with(HiveFormat::default)
8348 .serde_properties = Some(properties);
8349 } else {
8350 break;
8351 }
8352 }
8353 Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8354 let format = self.parse_identifier()?;
8355 hive_format.get_or_insert_with(HiveFormat::default).storage =
8356 Some(HiveIOFormat::Using { format });
8357 }
8358 Some(Keyword::USING) => {
8359 self.prev_token();
8361 break;
8362 }
8363 None => break,
8364 _ => break,
8365 }
8366 }
8367
8368 Ok(hive_format)
8369 }
8370
8371 pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8373 self.expect_keyword_is(Keyword::FORMAT)?;
8374 match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8375 Some(Keyword::SERDE) => {
8376 let class = self.parse_literal_string()?;
8377 Ok(HiveRowFormat::SERDE { class })
8378 }
8379 _ => {
8380 let mut row_delimiters = vec![];
8381
8382 loop {
8383 match self.parse_one_of_keywords(&[
8384 Keyword::FIELDS,
8385 Keyword::COLLECTION,
8386 Keyword::MAP,
8387 Keyword::LINES,
8388 Keyword::NULL,
8389 ]) {
8390 Some(Keyword::FIELDS)
8391 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8392 {
8393 row_delimiters.push(HiveRowDelimiter {
8394 delimiter: HiveDelimiter::FieldsTerminatedBy,
8395 char: self.parse_identifier()?,
8396 });
8397
8398 if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8399 row_delimiters.push(HiveRowDelimiter {
8400 delimiter: HiveDelimiter::FieldsEscapedBy,
8401 char: self.parse_identifier()?,
8402 });
8403 }
8404 }
8405 Some(Keyword::COLLECTION)
8406 if self.parse_keywords(&[
8407 Keyword::ITEMS,
8408 Keyword::TERMINATED,
8409 Keyword::BY,
8410 ]) =>
8411 {
8412 row_delimiters.push(HiveRowDelimiter {
8413 delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8414 char: self.parse_identifier()?,
8415 });
8416 }
8417 Some(Keyword::MAP)
8418 if self.parse_keywords(&[
8419 Keyword::KEYS,
8420 Keyword::TERMINATED,
8421 Keyword::BY,
8422 ]) =>
8423 {
8424 row_delimiters.push(HiveRowDelimiter {
8425 delimiter: HiveDelimiter::MapKeysTerminatedBy,
8426 char: self.parse_identifier()?,
8427 });
8428 }
8429 Some(Keyword::LINES)
8430 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8431 {
8432 row_delimiters.push(HiveRowDelimiter {
8433 delimiter: HiveDelimiter::LinesTerminatedBy,
8434 char: self.parse_identifier()?,
8435 });
8436 }
8437 Some(Keyword::NULL)
8438 if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8439 {
8440 row_delimiters.push(HiveRowDelimiter {
8441 delimiter: HiveDelimiter::NullDefinedAs,
8442 char: self.parse_identifier()?,
8443 });
8444 }
8445 _ => {
8446 break;
8447 }
8448 }
8449 }
8450
8451 Ok(HiveRowFormat::DELIMITED {
8452 delimiters: row_delimiters,
8453 })
8454 }
8455 }
8456 }
8457
8458 fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8459 if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8460 Ok(Some(self.parse_identifier()?))
8461 } else {
8462 Ok(None)
8463 }
8464 }
8465
8466 pub fn parse_create_table(
8468 &mut self,
8469 or_replace: bool,
8470 temporary: bool,
8471 global: Option<bool>,
8472 transient: bool,
8473 ) -> Result<CreateTable, ParserError> {
8474 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8475 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8476 let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8477
8478 let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8489 Some(self.parse_object_name(allow_unquoted_hyphen)?)
8490 } else {
8491 None
8492 };
8493
8494 let on_cluster = self.parse_optional_on_cluster()?;
8496
8497 let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8498
8499 let clone = if self.parse_keyword(Keyword::CLONE) {
8500 self.parse_object_name(allow_unquoted_hyphen).ok()
8501 } else {
8502 None
8503 };
8504
8505 let (columns, constraints) = self.parse_columns()?;
8507 let comment_after_column_def =
8508 if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8509 let next_token = self.next_token();
8510 match next_token.token {
8511 Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8512 _ => self.expected("comment", next_token)?,
8513 }
8514 } else {
8515 None
8516 };
8517
8518 let for_values = if partition_of.is_some() {
8520 if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8521 Some(self.parse_partition_for_values()?)
8522 } else {
8523 return self.expected_ref(
8524 "FOR VALUES or DEFAULT after PARTITION OF",
8525 self.peek_token_ref(),
8526 );
8527 }
8528 } else {
8529 None
8530 };
8531
8532 let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8534
8535 let hive_distribution = self.parse_hive_distribution()?;
8536 let clustered_by = self.parse_optional_clustered_by()?;
8537 let hive_formats = self.parse_hive_formats()?;
8538
8539 let create_table_config = self.parse_optional_create_table_config()?;
8540
8541 let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8544 && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8545 {
8546 Some(Box::new(self.parse_expr()?))
8547 } else {
8548 None
8549 };
8550
8551 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8552 if self.consume_token(&Token::LParen) {
8553 let columns = if self.peek_token_ref().token != Token::RParen {
8554 self.parse_comma_separated(|p| p.parse_expr())?
8555 } else {
8556 vec![]
8557 };
8558 self.expect_token(&Token::RParen)?;
8559 Some(OneOrManyWithParens::Many(columns))
8560 } else {
8561 Some(OneOrManyWithParens::One(self.parse_expr()?))
8562 }
8563 } else {
8564 None
8565 };
8566
8567 let partition_by = if create_table_config.partition_by.is_none()
8570 && self.dialect.supports_partition_by_after_order_by()
8571 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8572 {
8573 Some(Box::new(self.parse_expr()?))
8574 } else {
8575 create_table_config.partition_by
8576 };
8577
8578 let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8579 Some(self.parse_create_table_on_commit()?)
8580 } else {
8581 None
8582 };
8583
8584 let strict = self.parse_keyword(Keyword::STRICT);
8585
8586 let backup = if self.parse_keyword(Keyword::BACKUP) {
8588 let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8589 Some(keyword == Keyword::YES)
8590 } else {
8591 None
8592 };
8593
8594 let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8596 Some(self.parse_dist_style()?)
8597 } else {
8598 None
8599 };
8600 let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8601 self.expect_token(&Token::LParen)?;
8602 let expr = self.parse_expr()?;
8603 self.expect_token(&Token::RParen)?;
8604 Some(expr)
8605 } else {
8606 None
8607 };
8608 let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8609 self.expect_token(&Token::LParen)?;
8610 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8611 self.expect_token(&Token::RParen)?;
8612 Some(columns)
8613 } else {
8614 None
8615 };
8616
8617 let query = if self.parse_keyword(Keyword::AS) {
8619 Some(self.parse_query()?)
8620 } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8621 {
8622 self.prev_token();
8624 Some(self.parse_query()?)
8625 } else {
8626 None
8627 };
8628
8629 Ok(CreateTableBuilder::new(table_name)
8630 .temporary(temporary)
8631 .columns(columns)
8632 .constraints(constraints)
8633 .or_replace(or_replace)
8634 .if_not_exists(if_not_exists)
8635 .transient(transient)
8636 .hive_distribution(hive_distribution)
8637 .hive_formats(hive_formats)
8638 .global(global)
8639 .query(query)
8640 .without_rowid(without_rowid)
8641 .like(like)
8642 .clone_clause(clone)
8643 .comment_after_column_def(comment_after_column_def)
8644 .order_by(order_by)
8645 .on_commit(on_commit)
8646 .on_cluster(on_cluster)
8647 .clustered_by(clustered_by)
8648 .partition_by(partition_by)
8649 .cluster_by(create_table_config.cluster_by)
8650 .inherits(create_table_config.inherits)
8651 .partition_of(partition_of)
8652 .for_values(for_values)
8653 .table_options(create_table_config.table_options)
8654 .primary_key(primary_key)
8655 .strict(strict)
8656 .backup(backup)
8657 .diststyle(diststyle)
8658 .distkey(distkey)
8659 .sortkey(sortkey)
8660 .build())
8661 }
8662
8663 fn maybe_parse_create_table_like(
8664 &mut self,
8665 allow_unquoted_hyphen: bool,
8666 ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8667 let like = if self.dialect.supports_create_table_like_parenthesized()
8668 && self.consume_token(&Token::LParen)
8669 {
8670 if self.parse_keyword(Keyword::LIKE) {
8671 let name = self.parse_object_name(allow_unquoted_hyphen)?;
8672 let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
8673 Some(CreateTableLikeDefaults::Including)
8674 } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
8675 Some(CreateTableLikeDefaults::Excluding)
8676 } else {
8677 None
8678 };
8679 self.expect_token(&Token::RParen)?;
8680 Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
8681 name,
8682 defaults,
8683 }))
8684 } else {
8685 self.prev_token();
8687 None
8688 }
8689 } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
8690 let name = self.parse_object_name(allow_unquoted_hyphen)?;
8691 Some(CreateTableLikeKind::Plain(CreateTableLike {
8692 name,
8693 defaults: None,
8694 }))
8695 } else {
8696 None
8697 };
8698 Ok(like)
8699 }
8700
8701 pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
8702 if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
8703 Ok(OnCommit::DeleteRows)
8704 } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
8705 Ok(OnCommit::PreserveRows)
8706 } else if self.parse_keywords(&[Keyword::DROP]) {
8707 Ok(OnCommit::Drop)
8708 } else {
8709 parser_err!(
8710 "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
8711 self.peek_token_ref()
8712 )
8713 }
8714 }
8715
8716 fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
8722 if self.parse_keyword(Keyword::DEFAULT) {
8723 return Ok(ForValues::Default);
8724 }
8725
8726 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
8727
8728 if self.parse_keyword(Keyword::IN) {
8729 self.expect_token(&Token::LParen)?;
8731 if self.peek_token_ref().token == Token::RParen {
8732 return self.expected_ref("at least one value", self.peek_token_ref());
8733 }
8734 let values = self.parse_comma_separated(Parser::parse_expr)?;
8735 self.expect_token(&Token::RParen)?;
8736 Ok(ForValues::In(values))
8737 } else if self.parse_keyword(Keyword::FROM) {
8738 self.expect_token(&Token::LParen)?;
8740 if self.peek_token_ref().token == Token::RParen {
8741 return self.expected_ref("at least one value", self.peek_token_ref());
8742 }
8743 let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8744 self.expect_token(&Token::RParen)?;
8745 self.expect_keyword(Keyword::TO)?;
8746 self.expect_token(&Token::LParen)?;
8747 if self.peek_token_ref().token == Token::RParen {
8748 return self.expected_ref("at least one value", self.peek_token_ref());
8749 }
8750 let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8751 self.expect_token(&Token::RParen)?;
8752 Ok(ForValues::From { from, to })
8753 } else if self.parse_keyword(Keyword::WITH) {
8754 self.expect_token(&Token::LParen)?;
8756 self.expect_keyword(Keyword::MODULUS)?;
8757 let modulus = self.parse_literal_uint()?;
8758 self.expect_token(&Token::Comma)?;
8759 self.expect_keyword(Keyword::REMAINDER)?;
8760 let remainder = self.parse_literal_uint()?;
8761 self.expect_token(&Token::RParen)?;
8762 Ok(ForValues::With { modulus, remainder })
8763 } else {
8764 self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
8765 }
8766 }
8767
8768 fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
8770 if self.parse_keyword(Keyword::MINVALUE) {
8771 Ok(PartitionBoundValue::MinValue)
8772 } else if self.parse_keyword(Keyword::MAXVALUE) {
8773 Ok(PartitionBoundValue::MaxValue)
8774 } else {
8775 Ok(PartitionBoundValue::Expr(self.parse_expr()?))
8776 }
8777 }
8778
8779 fn parse_optional_create_table_config(
8785 &mut self,
8786 ) -> Result<CreateTableConfiguration, ParserError> {
8787 let mut table_options = CreateTableOptions::None;
8788
8789 let inherits = if self.parse_keyword(Keyword::INHERITS) {
8790 Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
8791 } else {
8792 None
8793 };
8794
8795 let with_options = self.parse_options(Keyword::WITH)?;
8797 if !with_options.is_empty() {
8798 table_options = CreateTableOptions::With(with_options)
8799 }
8800
8801 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
8802 if !table_properties.is_empty() {
8803 table_options = CreateTableOptions::TableProperties(table_properties);
8804 }
8805 let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
8806 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8807 {
8808 Some(Box::new(self.parse_expr()?))
8809 } else {
8810 None
8811 };
8812
8813 let mut cluster_by = None;
8814 if dialect_of!(self is BigQueryDialect | GenericDialect) {
8815 if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
8816 cluster_by = Some(WrappedCollection::NoWrapping(
8817 self.parse_comma_separated(|p| p.parse_expr())?,
8818 ));
8819 };
8820
8821 if let Token::Word(word) = &self.peek_token_ref().token {
8822 if word.keyword == Keyword::OPTIONS {
8823 table_options =
8824 CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
8825 }
8826 };
8827 }
8828
8829 if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
8830 let plain_options = self.parse_plain_options()?;
8831 if !plain_options.is_empty() {
8832 table_options = CreateTableOptions::Plain(plain_options)
8833 }
8834 };
8835
8836 Ok(CreateTableConfiguration {
8837 partition_by,
8838 cluster_by,
8839 inherits,
8840 table_options,
8841 })
8842 }
8843
8844 fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
8845 if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
8848 return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
8849 }
8850
8851 if self.parse_keywords(&[Keyword::COMMENT]) {
8854 let has_eq = self.consume_token(&Token::Eq);
8855 let value = self.next_token();
8856
8857 let comment = match (has_eq, value.token) {
8858 (true, Token::SingleQuotedString(s)) => {
8859 Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
8860 }
8861 (false, Token::SingleQuotedString(s)) => {
8862 Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
8863 }
8864 (_, token) => {
8865 self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
8866 }
8867 };
8868 return comment;
8869 }
8870
8871 if self.parse_keywords(&[Keyword::ENGINE]) {
8874 let _ = self.consume_token(&Token::Eq);
8875 let value = self.next_token();
8876
8877 let engine = match value.token {
8878 Token::Word(w) => {
8879 let parameters = if self.peek_token_ref().token == Token::LParen {
8880 self.parse_parenthesized_identifiers()?
8881 } else {
8882 vec![]
8883 };
8884
8885 Ok(Some(SqlOption::NamedParenthesizedList(
8886 NamedParenthesizedList {
8887 key: Ident::new("ENGINE"),
8888 name: Some(Ident::new(w.value)),
8889 values: parameters,
8890 },
8891 )))
8892 }
8893 _ => {
8894 return self.expected("Token::Word", value)?;
8895 }
8896 };
8897
8898 return engine;
8899 }
8900
8901 if self.parse_keywords(&[Keyword::TABLESPACE]) {
8903 let _ = self.consume_token(&Token::Eq);
8904 let value = self.next_token();
8905
8906 let tablespace = match value.token {
8907 Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
8908 let storage = match self.parse_keyword(Keyword::STORAGE) {
8909 true => {
8910 let _ = self.consume_token(&Token::Eq);
8911 let storage_token = self.next_token();
8912 match &storage_token.token {
8913 Token::Word(w) => match w.value.to_uppercase().as_str() {
8914 "DISK" => Some(StorageType::Disk),
8915 "MEMORY" => Some(StorageType::Memory),
8916 _ => self
8917 .expected("Storage type (DISK or MEMORY)", storage_token)?,
8918 },
8919 _ => self.expected("Token::Word", storage_token)?,
8920 }
8921 }
8922 false => None,
8923 };
8924
8925 Ok(Some(SqlOption::TableSpace(TablespaceOption {
8926 name,
8927 storage,
8928 })))
8929 }
8930 _ => {
8931 return self.expected("Token::Word", value)?;
8932 }
8933 };
8934
8935 return tablespace;
8936 }
8937
8938 if self.parse_keyword(Keyword::UNION) {
8940 let _ = self.consume_token(&Token::Eq);
8941 let value = self.next_token();
8942
8943 match value.token {
8944 Token::LParen => {
8945 let tables: Vec<Ident> =
8946 self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
8947 self.expect_token(&Token::RParen)?;
8948
8949 return Ok(Some(SqlOption::NamedParenthesizedList(
8950 NamedParenthesizedList {
8951 key: Ident::new("UNION"),
8952 name: None,
8953 values: tables,
8954 },
8955 )));
8956 }
8957 _ => {
8958 return self.expected("Token::LParen", value)?;
8959 }
8960 }
8961 }
8962
8963 let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
8965 Ident::new("DEFAULT CHARSET")
8966 } else if self.parse_keyword(Keyword::CHARSET) {
8967 Ident::new("CHARSET")
8968 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
8969 Ident::new("DEFAULT CHARACTER SET")
8970 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
8971 Ident::new("CHARACTER SET")
8972 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
8973 Ident::new("DEFAULT COLLATE")
8974 } else if self.parse_keyword(Keyword::COLLATE) {
8975 Ident::new("COLLATE")
8976 } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
8977 Ident::new("DATA DIRECTORY")
8978 } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
8979 Ident::new("INDEX DIRECTORY")
8980 } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
8981 Ident::new("KEY_BLOCK_SIZE")
8982 } else if self.parse_keyword(Keyword::ROW_FORMAT) {
8983 Ident::new("ROW_FORMAT")
8984 } else if self.parse_keyword(Keyword::PACK_KEYS) {
8985 Ident::new("PACK_KEYS")
8986 } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
8987 Ident::new("STATS_AUTO_RECALC")
8988 } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
8989 Ident::new("STATS_PERSISTENT")
8990 } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
8991 Ident::new("STATS_SAMPLE_PAGES")
8992 } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
8993 Ident::new("DELAY_KEY_WRITE")
8994 } else if self.parse_keyword(Keyword::COMPRESSION) {
8995 Ident::new("COMPRESSION")
8996 } else if self.parse_keyword(Keyword::ENCRYPTION) {
8997 Ident::new("ENCRYPTION")
8998 } else if self.parse_keyword(Keyword::MAX_ROWS) {
8999 Ident::new("MAX_ROWS")
9000 } else if self.parse_keyword(Keyword::MIN_ROWS) {
9001 Ident::new("MIN_ROWS")
9002 } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9003 Ident::new("AUTOEXTEND_SIZE")
9004 } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9005 Ident::new("AVG_ROW_LENGTH")
9006 } else if self.parse_keyword(Keyword::CHECKSUM) {
9007 Ident::new("CHECKSUM")
9008 } else if self.parse_keyword(Keyword::CONNECTION) {
9009 Ident::new("CONNECTION")
9010 } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9011 Ident::new("ENGINE_ATTRIBUTE")
9012 } else if self.parse_keyword(Keyword::PASSWORD) {
9013 Ident::new("PASSWORD")
9014 } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9015 Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9016 } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9017 Ident::new("INSERT_METHOD")
9018 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9019 Ident::new("AUTO_INCREMENT")
9020 } else {
9021 return Ok(None);
9022 };
9023
9024 let _ = self.consume_token(&Token::Eq);
9025
9026 let value = match self
9027 .maybe_parse(|parser| parser.parse_value())?
9028 .map(Expr::Value)
9029 {
9030 Some(expr) => expr,
9031 None => Expr::Identifier(self.parse_identifier()?),
9032 };
9033
9034 Ok(Some(SqlOption::KeyValue { key, value }))
9035 }
9036
9037 pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9039 let mut options = Vec::new();
9040
9041 while let Some(option) = self.parse_plain_option()? {
9042 options.push(option);
9043 let _ = self.consume_token(&Token::Comma);
9046 }
9047
9048 Ok(options)
9049 }
9050
9051 pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9053 let comment = if self.parse_keyword(Keyword::COMMENT) {
9054 let has_eq = self.consume_token(&Token::Eq);
9055 let comment = self.parse_comment_value()?;
9056 Some(if has_eq {
9057 CommentDef::WithEq(comment)
9058 } else {
9059 CommentDef::WithoutEq(comment)
9060 })
9061 } else {
9062 None
9063 };
9064 Ok(comment)
9065 }
9066
9067 pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9069 let next_token = self.next_token();
9070 let value = match next_token.token {
9071 Token::SingleQuotedString(str) => str,
9072 Token::DollarQuotedString(str) => str.value,
9073 _ => self.expected("string literal", next_token)?,
9074 };
9075 Ok(value)
9076 }
9077
9078 pub fn parse_optional_procedure_parameters(
9080 &mut self,
9081 ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9082 let mut params = vec![];
9083 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9084 return Ok(Some(params));
9085 }
9086 loop {
9087 if let Token::Word(_) = &self.peek_token_ref().token {
9088 params.push(self.parse_procedure_param()?)
9089 }
9090 let comma = self.consume_token(&Token::Comma);
9091 if self.consume_token(&Token::RParen) {
9092 break;
9094 } else if !comma {
9095 return self.expected_ref(
9096 "',' or ')' after parameter definition",
9097 self.peek_token_ref(),
9098 );
9099 }
9100 }
9101 Ok(Some(params))
9102 }
9103
9104 pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9106 let mut columns = vec![];
9107 let mut constraints = vec![];
9108 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9109 return Ok((columns, constraints));
9110 }
9111
9112 loop {
9113 if let Some(constraint) = self.parse_optional_table_constraint()? {
9114 constraints.push(constraint);
9115 } else if let Token::Word(_) = &self.peek_token_ref().token {
9116 columns.push(self.parse_column_def()?);
9117 } else {
9118 return self.expected_ref(
9119 "column name or constraint definition",
9120 self.peek_token_ref(),
9121 );
9122 }
9123
9124 let comma = self.consume_token(&Token::Comma);
9125 let rparen = self.peek_token_ref().token == Token::RParen;
9126
9127 if !comma && !rparen {
9128 return self
9129 .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9130 };
9131
9132 if rparen
9133 && (!comma
9134 || self.dialect.supports_column_definition_trailing_commas()
9135 || self.options.trailing_commas)
9136 {
9137 let _ = self.consume_token(&Token::RParen);
9138 break;
9139 }
9140 }
9141
9142 Ok((columns, constraints))
9143 }
9144
9145 pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9147 let mode = if self.parse_keyword(Keyword::IN) {
9148 Some(ArgMode::In)
9149 } else if self.parse_keyword(Keyword::OUT) {
9150 Some(ArgMode::Out)
9151 } else if self.parse_keyword(Keyword::INOUT) {
9152 Some(ArgMode::InOut)
9153 } else {
9154 None
9155 };
9156 let name = self.parse_identifier()?;
9157 let data_type = self.parse_data_type()?;
9158 let default = if self.consume_token(&Token::Eq) {
9159 Some(self.parse_expr()?)
9160 } else {
9161 None
9162 };
9163
9164 Ok(ProcedureParam {
9165 name,
9166 data_type,
9167 mode,
9168 default,
9169 })
9170 }
9171
9172 pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9174 self.parse_column_def_inner(false)
9175 }
9176
9177 fn parse_column_def_inner(
9178 &mut self,
9179 optional_data_type: bool,
9180 ) -> Result<ColumnDef, ParserError> {
9181 let col_name = self.parse_identifier()?;
9182 let data_type = if self.is_column_type_sqlite_unspecified() {
9183 DataType::Unspecified
9184 } else if optional_data_type {
9185 self.maybe_parse(|parser| parser.parse_data_type())?
9186 .unwrap_or(DataType::Unspecified)
9187 } else {
9188 self.parse_data_type()?
9189 };
9190 let mut options = vec![];
9191 loop {
9192 if self.parse_keyword(Keyword::CONSTRAINT) {
9193 let name = Some(self.parse_identifier()?);
9194 if let Some(option) = self.parse_optional_column_option()? {
9195 options.push(ColumnOptionDef { name, option });
9196 } else {
9197 return self.expected_ref(
9198 "constraint details after CONSTRAINT <name>",
9199 self.peek_token_ref(),
9200 );
9201 }
9202 } else if let Some(option) = self.parse_optional_column_option()? {
9203 options.push(ColumnOptionDef { name: None, option });
9204 } else {
9205 break;
9206 };
9207 }
9208 Ok(ColumnDef {
9209 name: col_name,
9210 data_type,
9211 options,
9212 })
9213 }
9214
9215 fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9216 if dialect_of!(self is SQLiteDialect) {
9217 match &self.peek_token_ref().token {
9218 Token::Word(word) => matches!(
9219 word.keyword,
9220 Keyword::CONSTRAINT
9221 | Keyword::PRIMARY
9222 | Keyword::NOT
9223 | Keyword::UNIQUE
9224 | Keyword::CHECK
9225 | Keyword::DEFAULT
9226 | Keyword::COLLATE
9227 | Keyword::REFERENCES
9228 | Keyword::GENERATED
9229 | Keyword::AS
9230 ),
9231 _ => true, }
9233 } else {
9234 false
9235 }
9236 }
9237
9238 pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9240 if let Some(option) = self.dialect.parse_column_option(self)? {
9241 return option;
9242 }
9243
9244 self.with_state(
9245 ColumnDefinition,
9246 |parser| -> Result<Option<ColumnOption>, ParserError> {
9247 parser.parse_optional_column_option_inner()
9248 },
9249 )
9250 }
9251
9252 fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9253 if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9254 Ok(Some(ColumnOption::CharacterSet(
9255 self.parse_object_name(false)?,
9256 )))
9257 } else if self.parse_keywords(&[Keyword::COLLATE]) {
9258 Ok(Some(ColumnOption::Collation(
9259 self.parse_object_name(false)?,
9260 )))
9261 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9262 Ok(Some(ColumnOption::NotNull))
9263 } else if self.parse_keywords(&[Keyword::COMMENT]) {
9264 Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9265 } else if self.parse_keyword(Keyword::NULL) {
9266 Ok(Some(ColumnOption::Null))
9267 } else if self.parse_keyword(Keyword::DEFAULT) {
9268 Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9269 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9270 && self.parse_keyword(Keyword::MATERIALIZED)
9271 {
9272 Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9273 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9274 && self.parse_keyword(Keyword::ALIAS)
9275 {
9276 Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9277 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9278 && self.parse_keyword(Keyword::EPHEMERAL)
9279 {
9280 if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9283 Ok(Some(ColumnOption::Ephemeral(None)))
9284 } else {
9285 Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9286 }
9287 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9288 let characteristics = self.parse_constraint_characteristics()?;
9289 Ok(Some(
9290 PrimaryKeyConstraint {
9291 name: None,
9292 index_name: None,
9293 index_type: None,
9294 columns: vec![],
9295 index_options: vec![],
9296 characteristics,
9297 }
9298 .into(),
9299 ))
9300 } else if self.parse_keyword(Keyword::UNIQUE) {
9301 let index_type_display =
9302 if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9303 KeyOrIndexDisplay::Key
9304 } else {
9305 KeyOrIndexDisplay::None
9306 };
9307 let characteristics = self.parse_constraint_characteristics()?;
9308 Ok(Some(
9309 UniqueConstraint {
9310 name: None,
9311 index_name: None,
9312 index_type_display,
9313 index_type: None,
9314 columns: vec![],
9315 index_options: vec![],
9316 characteristics,
9317 nulls_distinct: NullsDistinctOption::None,
9318 }
9319 .into(),
9320 ))
9321 } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9322 let characteristics = self.parse_constraint_characteristics()?;
9325 Ok(Some(
9326 PrimaryKeyConstraint {
9327 name: None,
9328 index_name: None,
9329 index_type: None,
9330 columns: vec![],
9331 index_options: vec![],
9332 characteristics,
9333 }
9334 .into(),
9335 ))
9336 } else if self.parse_keyword(Keyword::REFERENCES) {
9337 let foreign_table = self.parse_object_name(false)?;
9338 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9341 let mut match_kind = None;
9342 let mut on_delete = None;
9343 let mut on_update = None;
9344 loop {
9345 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9346 match_kind = Some(self.parse_match_kind()?);
9347 } else if on_delete.is_none()
9348 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9349 {
9350 on_delete = Some(self.parse_referential_action()?);
9351 } else if on_update.is_none()
9352 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9353 {
9354 on_update = Some(self.parse_referential_action()?);
9355 } else {
9356 break;
9357 }
9358 }
9359 let characteristics = self.parse_constraint_characteristics()?;
9360
9361 Ok(Some(
9362 ForeignKeyConstraint {
9363 name: None, index_name: None, columns: vec![], foreign_table,
9367 referred_columns,
9368 on_delete,
9369 on_update,
9370 match_kind,
9371 characteristics,
9372 }
9373 .into(),
9374 ))
9375 } else if self.parse_keyword(Keyword::CHECK) {
9376 self.expect_token(&Token::LParen)?;
9377 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9379 self.expect_token(&Token::RParen)?;
9380
9381 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9382 Some(true)
9383 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9384 Some(false)
9385 } else {
9386 None
9387 };
9388
9389 Ok(Some(
9390 CheckConstraint {
9391 name: None, expr: Box::new(expr),
9393 enforced,
9394 }
9395 .into(),
9396 ))
9397 } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9398 && dialect_of!(self is MySqlDialect | GenericDialect)
9399 {
9400 Ok(Some(ColumnOption::DialectSpecific(vec![
9402 Token::make_keyword("AUTO_INCREMENT"),
9403 ])))
9404 } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9405 && dialect_of!(self is SQLiteDialect | GenericDialect)
9406 {
9407 Ok(Some(ColumnOption::DialectSpecific(vec![
9409 Token::make_keyword("AUTOINCREMENT"),
9410 ])))
9411 } else if self.parse_keyword(Keyword::ASC)
9412 && self.dialect.supports_asc_desc_in_column_definition()
9413 {
9414 Ok(Some(ColumnOption::DialectSpecific(vec![
9416 Token::make_keyword("ASC"),
9417 ])))
9418 } else if self.parse_keyword(Keyword::DESC)
9419 && self.dialect.supports_asc_desc_in_column_definition()
9420 {
9421 Ok(Some(ColumnOption::DialectSpecific(vec![
9423 Token::make_keyword("DESC"),
9424 ])))
9425 } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9426 && dialect_of!(self is MySqlDialect | GenericDialect)
9427 {
9428 let expr = self.parse_expr()?;
9429 Ok(Some(ColumnOption::OnUpdate(expr)))
9430 } else if self.parse_keyword(Keyword::GENERATED) {
9431 self.parse_optional_column_option_generated()
9432 } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9433 && self.parse_keyword(Keyword::OPTIONS)
9434 {
9435 self.prev_token();
9436 Ok(Some(ColumnOption::Options(
9437 self.parse_options(Keyword::OPTIONS)?,
9438 )))
9439 } else if self.parse_keyword(Keyword::AS)
9440 && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9441 {
9442 self.parse_optional_column_option_as()
9443 } else if self.parse_keyword(Keyword::SRID)
9444 && dialect_of!(self is MySqlDialect | GenericDialect)
9445 {
9446 Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9447 } else if self.parse_keyword(Keyword::IDENTITY)
9448 && dialect_of!(self is MsSqlDialect | GenericDialect)
9449 {
9450 let parameters = if self.consume_token(&Token::LParen) {
9451 let seed = self.parse_number()?;
9452 self.expect_token(&Token::Comma)?;
9453 let increment = self.parse_number()?;
9454 self.expect_token(&Token::RParen)?;
9455
9456 Some(IdentityPropertyFormatKind::FunctionCall(
9457 IdentityParameters { seed, increment },
9458 ))
9459 } else {
9460 None
9461 };
9462 Ok(Some(ColumnOption::Identity(
9463 IdentityPropertyKind::Identity(IdentityProperty {
9464 parameters,
9465 order: None,
9466 }),
9467 )))
9468 } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9469 && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9470 {
9471 Ok(Some(ColumnOption::OnConflict(
9473 self.expect_one_of_keywords(&[
9474 Keyword::ROLLBACK,
9475 Keyword::ABORT,
9476 Keyword::FAIL,
9477 Keyword::IGNORE,
9478 Keyword::REPLACE,
9479 ])?,
9480 )))
9481 } else if self.parse_keyword(Keyword::INVISIBLE) {
9482 Ok(Some(ColumnOption::Invisible))
9483 } else {
9484 Ok(None)
9485 }
9486 }
9487
9488 pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9489 let name = self.parse_object_name(false)?;
9490 self.expect_token(&Token::Eq)?;
9491 let value = self.parse_literal_string()?;
9492
9493 Ok(Tag::new(name, value))
9494 }
9495
9496 fn parse_optional_column_option_generated(
9497 &mut self,
9498 ) -> Result<Option<ColumnOption>, ParserError> {
9499 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9500 let mut sequence_options = vec![];
9501 if self.expect_token(&Token::LParen).is_ok() {
9502 sequence_options = self.parse_create_sequence_options()?;
9503 self.expect_token(&Token::RParen)?;
9504 }
9505 Ok(Some(ColumnOption::Generated {
9506 generated_as: GeneratedAs::Always,
9507 sequence_options: Some(sequence_options),
9508 generation_expr: None,
9509 generation_expr_mode: None,
9510 generated_keyword: true,
9511 }))
9512 } else if self.parse_keywords(&[
9513 Keyword::BY,
9514 Keyword::DEFAULT,
9515 Keyword::AS,
9516 Keyword::IDENTITY,
9517 ]) {
9518 let mut sequence_options = vec![];
9519 if self.expect_token(&Token::LParen).is_ok() {
9520 sequence_options = self.parse_create_sequence_options()?;
9521 self.expect_token(&Token::RParen)?;
9522 }
9523 Ok(Some(ColumnOption::Generated {
9524 generated_as: GeneratedAs::ByDefault,
9525 sequence_options: Some(sequence_options),
9526 generation_expr: None,
9527 generation_expr_mode: None,
9528 generated_keyword: true,
9529 }))
9530 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9531 if self.expect_token(&Token::LParen).is_ok() {
9532 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9533 self.expect_token(&Token::RParen)?;
9534 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9535 Ok((
9536 GeneratedAs::ExpStored,
9537 Some(GeneratedExpressionMode::Stored),
9538 ))
9539 } else if dialect_of!(self is PostgreSqlDialect) {
9540 self.expected_ref("STORED", self.peek_token_ref())
9542 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9543 Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9544 } else {
9545 Ok((GeneratedAs::Always, None))
9546 }?;
9547
9548 Ok(Some(ColumnOption::Generated {
9549 generated_as: gen_as,
9550 sequence_options: None,
9551 generation_expr: Some(expr),
9552 generation_expr_mode: expr_mode,
9553 generated_keyword: true,
9554 }))
9555 } else {
9556 Ok(None)
9557 }
9558 } else {
9559 Ok(None)
9560 }
9561 }
9562
9563 fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9564 self.expect_token(&Token::LParen)?;
9566 let expr = self.parse_expr()?;
9567 self.expect_token(&Token::RParen)?;
9568
9569 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9570 (
9571 GeneratedAs::ExpStored,
9572 Some(GeneratedExpressionMode::Stored),
9573 )
9574 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9575 (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9576 } else {
9577 (GeneratedAs::Always, None)
9578 };
9579
9580 Ok(Some(ColumnOption::Generated {
9581 generated_as: gen_as,
9582 sequence_options: None,
9583 generation_expr: Some(expr),
9584 generation_expr_mode: expr_mode,
9585 generated_keyword: false,
9586 }))
9587 }
9588
9589 pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9591 let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9592 && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9593 {
9594 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9595
9596 let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9597 self.expect_token(&Token::LParen)?;
9598 let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9599 self.expect_token(&Token::RParen)?;
9600 Some(sorted_by_columns)
9601 } else {
9602 None
9603 };
9604
9605 self.expect_keyword_is(Keyword::INTO)?;
9606 let num_buckets = self.parse_number_value()?.value;
9607 self.expect_keyword_is(Keyword::BUCKETS)?;
9608 Some(ClusteredBy {
9609 columns,
9610 sorted_by,
9611 num_buckets,
9612 })
9613 } else {
9614 None
9615 };
9616 Ok(clustered_by)
9617 }
9618
9619 pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9623 if self.parse_keyword(Keyword::RESTRICT) {
9624 Ok(ReferentialAction::Restrict)
9625 } else if self.parse_keyword(Keyword::CASCADE) {
9626 Ok(ReferentialAction::Cascade)
9627 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9628 Ok(ReferentialAction::SetNull)
9629 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9630 Ok(ReferentialAction::NoAction)
9631 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9632 Ok(ReferentialAction::SetDefault)
9633 } else {
9634 self.expected_ref(
9635 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9636 self.peek_token_ref(),
9637 )
9638 }
9639 }
9640
9641 pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9643 if self.parse_keyword(Keyword::FULL) {
9644 Ok(ConstraintReferenceMatchKind::Full)
9645 } else if self.parse_keyword(Keyword::PARTIAL) {
9646 Ok(ConstraintReferenceMatchKind::Partial)
9647 } else if self.parse_keyword(Keyword::SIMPLE) {
9648 Ok(ConstraintReferenceMatchKind::Simple)
9649 } else {
9650 self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9651 }
9652 }
9653
9654 fn parse_constraint_using_index(
9657 &mut self,
9658 name: Option<Ident>,
9659 ) -> Result<ConstraintUsingIndex, ParserError> {
9660 let index_name = self.parse_identifier()?;
9661 let characteristics = self.parse_constraint_characteristics()?;
9662 Ok(ConstraintUsingIndex {
9663 name,
9664 index_name,
9665 characteristics,
9666 })
9667 }
9668
9669 pub fn parse_constraint_characteristics(
9671 &mut self,
9672 ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
9673 let mut cc = ConstraintCharacteristics::default();
9674
9675 loop {
9676 if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
9677 {
9678 cc.deferrable = Some(false);
9679 } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
9680 cc.deferrable = Some(true);
9681 } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
9682 if self.parse_keyword(Keyword::DEFERRED) {
9683 cc.initially = Some(DeferrableInitial::Deferred);
9684 } else if self.parse_keyword(Keyword::IMMEDIATE) {
9685 cc.initially = Some(DeferrableInitial::Immediate);
9686 } else {
9687 self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
9688 }
9689 } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
9690 cc.enforced = Some(true);
9691 } else if cc.enforced.is_none()
9692 && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
9693 {
9694 cc.enforced = Some(false);
9695 } else {
9696 break;
9697 }
9698 }
9699
9700 if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
9701 Ok(Some(cc))
9702 } else {
9703 Ok(None)
9704 }
9705 }
9706
9707 pub fn parse_optional_table_constraint(
9709 &mut self,
9710 ) -> Result<Option<TableConstraint>, ParserError> {
9711 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
9712 if self.dialect.supports_constraint_keyword_without_name()
9713 && self
9714 .peek_one_of_keywords(&[
9715 Keyword::CHECK,
9716 Keyword::PRIMARY,
9717 Keyword::UNIQUE,
9718 Keyword::FOREIGN,
9719 ])
9720 .is_some()
9721 {
9722 None
9723 } else {
9724 Some(self.parse_identifier()?)
9725 }
9726 } else {
9727 None
9728 };
9729
9730 let next_token = self.next_token();
9731 match next_token.token {
9732 Token::Word(w) if w.keyword == Keyword::UNIQUE => {
9733 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9736 return Ok(Some(TableConstraint::UniqueUsingIndex(
9737 self.parse_constraint_using_index(name)?,
9738 )));
9739 }
9740
9741 let index_type_display = self.parse_index_type_display();
9742 if !dialect_of!(self is GenericDialect | MySqlDialect)
9743 && !index_type_display.is_none()
9744 {
9745 return self.expected_ref(
9746 "`index_name` or `(column_name [, ...])`",
9747 self.peek_token_ref(),
9748 );
9749 }
9750
9751 let nulls_distinct = self.parse_optional_nulls_distinct()?;
9752
9753 let index_name = self.parse_optional_ident()?;
9755 let index_type = self.parse_optional_using_then_index_type()?;
9756
9757 let columns = self.parse_parenthesized_index_column_list()?;
9758 let index_options = self.parse_index_options()?;
9759 let characteristics = self.parse_constraint_characteristics()?;
9760 Ok(Some(
9761 UniqueConstraint {
9762 name,
9763 index_name,
9764 index_type_display,
9765 index_type,
9766 columns,
9767 index_options,
9768 characteristics,
9769 nulls_distinct,
9770 }
9771 .into(),
9772 ))
9773 }
9774 Token::Word(w) if w.keyword == Keyword::PRIMARY => {
9775 self.expect_keyword_is(Keyword::KEY)?;
9777
9778 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9781 return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
9782 self.parse_constraint_using_index(name)?,
9783 )));
9784 }
9785
9786 let index_name = self.parse_optional_ident()?;
9788 let index_type = self.parse_optional_using_then_index_type()?;
9789
9790 let columns = self.parse_parenthesized_index_column_list()?;
9791 let index_options = self.parse_index_options()?;
9792 let characteristics = self.parse_constraint_characteristics()?;
9793 Ok(Some(
9794 PrimaryKeyConstraint {
9795 name,
9796 index_name,
9797 index_type,
9798 columns,
9799 index_options,
9800 characteristics,
9801 }
9802 .into(),
9803 ))
9804 }
9805 Token::Word(w) if w.keyword == Keyword::FOREIGN => {
9806 self.expect_keyword_is(Keyword::KEY)?;
9807 let index_name = self.parse_optional_ident()?;
9808 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9809 self.expect_keyword_is(Keyword::REFERENCES)?;
9810 let foreign_table = self.parse_object_name(false)?;
9811 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9812 let mut match_kind = None;
9813 let mut on_delete = None;
9814 let mut on_update = None;
9815 loop {
9816 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9817 match_kind = Some(self.parse_match_kind()?);
9818 } else if on_delete.is_none()
9819 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9820 {
9821 on_delete = Some(self.parse_referential_action()?);
9822 } else if on_update.is_none()
9823 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9824 {
9825 on_update = Some(self.parse_referential_action()?);
9826 } else {
9827 break;
9828 }
9829 }
9830
9831 let characteristics = self.parse_constraint_characteristics()?;
9832
9833 Ok(Some(
9834 ForeignKeyConstraint {
9835 name,
9836 index_name,
9837 columns,
9838 foreign_table,
9839 referred_columns,
9840 on_delete,
9841 on_update,
9842 match_kind,
9843 characteristics,
9844 }
9845 .into(),
9846 ))
9847 }
9848 Token::Word(w) if w.keyword == Keyword::CHECK => {
9849 self.expect_token(&Token::LParen)?;
9850 let expr = Box::new(self.parse_expr()?);
9851 self.expect_token(&Token::RParen)?;
9852
9853 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9854 Some(true)
9855 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9856 Some(false)
9857 } else {
9858 None
9859 };
9860
9861 Ok(Some(
9862 CheckConstraint {
9863 name,
9864 expr,
9865 enforced,
9866 }
9867 .into(),
9868 ))
9869 }
9870 Token::Word(w)
9871 if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
9872 && dialect_of!(self is GenericDialect | MySqlDialect)
9873 && name.is_none() =>
9874 {
9875 let display_as_key = w.keyword == Keyword::KEY;
9876
9877 let name = match &self.peek_token_ref().token {
9878 Token::Word(word) if word.keyword == Keyword::USING => None,
9879 _ => self.parse_optional_ident()?,
9880 };
9881
9882 let index_type = self.parse_optional_using_then_index_type()?;
9883 let columns = self.parse_parenthesized_index_column_list()?;
9884 let index_options = self.parse_index_options()?;
9885
9886 Ok(Some(
9887 IndexConstraint {
9888 display_as_key,
9889 name,
9890 index_type,
9891 columns,
9892 index_options,
9893 }
9894 .into(),
9895 ))
9896 }
9897 Token::Word(w)
9898 if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
9899 && dialect_of!(self is GenericDialect | MySqlDialect) =>
9900 {
9901 if let Some(name) = name {
9902 return self.expected(
9903 "FULLTEXT or SPATIAL option without constraint name",
9904 TokenWithSpan {
9905 token: Token::make_keyword(&name.to_string()),
9906 span: next_token.span,
9907 },
9908 );
9909 }
9910
9911 let fulltext = w.keyword == Keyword::FULLTEXT;
9912
9913 let index_type_display = self.parse_index_type_display();
9914
9915 let opt_index_name = self.parse_optional_ident()?;
9916
9917 let columns = self.parse_parenthesized_index_column_list()?;
9918
9919 Ok(Some(
9920 FullTextOrSpatialConstraint {
9921 fulltext,
9922 index_type_display,
9923 opt_index_name,
9924 columns,
9925 }
9926 .into(),
9927 ))
9928 }
9929 _ => {
9930 if name.is_some() {
9931 self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
9932 } else {
9933 self.prev_token();
9934 Ok(None)
9935 }
9936 }
9937 }
9938 }
9939
9940 fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
9941 Ok(if self.parse_keyword(Keyword::NULLS) {
9942 let not = self.parse_keyword(Keyword::NOT);
9943 self.expect_keyword_is(Keyword::DISTINCT)?;
9944 if not {
9945 NullsDistinctOption::NotDistinct
9946 } else {
9947 NullsDistinctOption::Distinct
9948 }
9949 } else {
9950 NullsDistinctOption::None
9951 })
9952 }
9953
9954 pub fn maybe_parse_options(
9956 &mut self,
9957 keyword: Keyword,
9958 ) -> Result<Option<Vec<SqlOption>>, ParserError> {
9959 if let Token::Word(word) = &self.peek_token_ref().token {
9960 if word.keyword == keyword {
9961 return Ok(Some(self.parse_options(keyword)?));
9962 }
9963 };
9964 Ok(None)
9965 }
9966
9967 pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
9969 if self.parse_keyword(keyword) {
9970 self.expect_token(&Token::LParen)?;
9971 let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
9972 self.expect_token(&Token::RParen)?;
9973 Ok(options)
9974 } else {
9975 Ok(vec![])
9976 }
9977 }
9978
9979 pub fn parse_options_with_keywords(
9981 &mut self,
9982 keywords: &[Keyword],
9983 ) -> Result<Vec<SqlOption>, ParserError> {
9984 if self.parse_keywords(keywords) {
9985 self.expect_token(&Token::LParen)?;
9986 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
9987 self.expect_token(&Token::RParen)?;
9988 Ok(options)
9989 } else {
9990 Ok(vec![])
9991 }
9992 }
9993
9994 pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
9996 Ok(if self.parse_keyword(Keyword::BTREE) {
9997 IndexType::BTree
9998 } else if self.parse_keyword(Keyword::HASH) {
9999 IndexType::Hash
10000 } else if self.parse_keyword(Keyword::GIN) {
10001 IndexType::GIN
10002 } else if self.parse_keyword(Keyword::GIST) {
10003 IndexType::GiST
10004 } else if self.parse_keyword(Keyword::SPGIST) {
10005 IndexType::SPGiST
10006 } else if self.parse_keyword(Keyword::BRIN) {
10007 IndexType::BRIN
10008 } else if self.parse_keyword(Keyword::BLOOM) {
10009 IndexType::Bloom
10010 } else {
10011 IndexType::Custom(self.parse_identifier()?)
10012 })
10013 }
10014
10015 pub fn parse_optional_using_then_index_type(
10022 &mut self,
10023 ) -> Result<Option<IndexType>, ParserError> {
10024 if self.parse_keyword(Keyword::USING) {
10025 Ok(Some(self.parse_index_type()?))
10026 } else {
10027 Ok(None)
10028 }
10029 }
10030
10031 pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10035 self.maybe_parse(|parser| parser.parse_identifier())
10036 }
10037
10038 #[must_use]
10039 pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10041 if self.parse_keyword(Keyword::KEY) {
10042 KeyOrIndexDisplay::Key
10043 } else if self.parse_keyword(Keyword::INDEX) {
10044 KeyOrIndexDisplay::Index
10045 } else {
10046 KeyOrIndexDisplay::None
10047 }
10048 }
10049
10050 pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10052 if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10053 Ok(Some(IndexOption::Using(index_type)))
10054 } else if self.parse_keyword(Keyword::COMMENT) {
10055 let s = self.parse_literal_string()?;
10056 Ok(Some(IndexOption::Comment(s)))
10057 } else {
10058 Ok(None)
10059 }
10060 }
10061
10062 pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10064 let mut options = Vec::new();
10065
10066 loop {
10067 match self.parse_optional_index_option()? {
10068 Some(index_option) => options.push(index_option),
10069 None => return Ok(options),
10070 }
10071 }
10072 }
10073
10074 pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10076 let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10077
10078 match &self.peek_token_ref().token {
10079 Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10080 Ok(SqlOption::Ident(self.parse_identifier()?))
10081 }
10082 Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10083 self.parse_option_partition()
10084 }
10085 Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10086 self.parse_option_clustered()
10087 }
10088 _ => {
10089 let name = self.parse_identifier()?;
10090 self.expect_token(&Token::Eq)?;
10091 let value = self.parse_expr()?;
10092
10093 Ok(SqlOption::KeyValue { key: name, value })
10094 }
10095 }
10096 }
10097
10098 pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10100 if self.parse_keywords(&[
10101 Keyword::CLUSTERED,
10102 Keyword::COLUMNSTORE,
10103 Keyword::INDEX,
10104 Keyword::ORDER,
10105 ]) {
10106 Ok(SqlOption::Clustered(
10107 TableOptionsClustered::ColumnstoreIndexOrder(
10108 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10109 ),
10110 ))
10111 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10112 Ok(SqlOption::Clustered(
10113 TableOptionsClustered::ColumnstoreIndex,
10114 ))
10115 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10116 self.expect_token(&Token::LParen)?;
10117
10118 let columns = self.parse_comma_separated(|p| {
10119 let name = p.parse_identifier()?;
10120 let asc = p.parse_asc_desc();
10121
10122 Ok(ClusteredIndex { name, asc })
10123 })?;
10124
10125 self.expect_token(&Token::RParen)?;
10126
10127 Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10128 } else {
10129 Err(ParserError::ParserError(
10130 "invalid CLUSTERED sequence".to_string(),
10131 ))
10132 }
10133 }
10134
10135 pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10137 self.expect_keyword_is(Keyword::PARTITION)?;
10138 self.expect_token(&Token::LParen)?;
10139 let column_name = self.parse_identifier()?;
10140
10141 self.expect_keyword_is(Keyword::RANGE)?;
10142 let range_direction = if self.parse_keyword(Keyword::LEFT) {
10143 Some(PartitionRangeDirection::Left)
10144 } else if self.parse_keyword(Keyword::RIGHT) {
10145 Some(PartitionRangeDirection::Right)
10146 } else {
10147 None
10148 };
10149
10150 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10151 self.expect_token(&Token::LParen)?;
10152
10153 let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10154
10155 self.expect_token(&Token::RParen)?;
10156 self.expect_token(&Token::RParen)?;
10157
10158 Ok(SqlOption::Partition {
10159 column_name,
10160 range_direction,
10161 for_values,
10162 })
10163 }
10164
10165 pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10167 self.expect_token(&Token::LParen)?;
10168 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10169 self.expect_token(&Token::RParen)?;
10170 Ok(Partition::Partitions(partitions))
10171 }
10172
10173 pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10175 self.expect_token(&Token::LParen)?;
10176 self.expect_keyword_is(Keyword::SELECT)?;
10177 let projection = self.parse_projection()?;
10178 let group_by = self.parse_optional_group_by()?;
10179 let order_by = self.parse_optional_order_by()?;
10180 self.expect_token(&Token::RParen)?;
10181 Ok(ProjectionSelect {
10182 projection,
10183 group_by,
10184 order_by,
10185 })
10186 }
10187 pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10189 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10190 let name = self.parse_identifier()?;
10191 let query = self.parse_projection_select()?;
10192 Ok(AlterTableOperation::AddProjection {
10193 if_not_exists,
10194 name,
10195 select: query,
10196 })
10197 }
10198
10199 fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10203 self.expect_keyword_is(Keyword::ALTER)?;
10204 self.expect_keyword_is(Keyword::SORTKEY)?;
10205 self.expect_token(&Token::LParen)?;
10206 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10207 self.expect_token(&Token::RParen)?;
10208 Ok(AlterTableOperation::AlterSortKey { columns })
10209 }
10210
10211 pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10213 let operation = if self.parse_keyword(Keyword::ADD) {
10214 if let Some(constraint) = self.parse_optional_table_constraint()? {
10215 let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10216 AlterTableOperation::AddConstraint {
10217 constraint,
10218 not_valid,
10219 }
10220 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10221 && self.parse_keyword(Keyword::PROJECTION)
10222 {
10223 return self.parse_alter_table_add_projection();
10224 } else {
10225 let if_not_exists =
10226 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10227 let mut new_partitions = vec![];
10228 loop {
10229 if self.parse_keyword(Keyword::PARTITION) {
10230 new_partitions.push(self.parse_partition()?);
10231 } else {
10232 break;
10233 }
10234 }
10235 if !new_partitions.is_empty() {
10236 AlterTableOperation::AddPartitions {
10237 if_not_exists,
10238 new_partitions,
10239 }
10240 } else {
10241 let column_keyword = self.parse_keyword(Keyword::COLUMN);
10242
10243 let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10244 {
10245 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10246 || if_not_exists
10247 } else {
10248 false
10249 };
10250
10251 let column_def = self.parse_column_def()?;
10252
10253 let column_position = self.parse_column_position()?;
10254
10255 AlterTableOperation::AddColumn {
10256 column_keyword,
10257 if_not_exists,
10258 column_def,
10259 column_position,
10260 }
10261 }
10262 }
10263 } else if self.parse_keyword(Keyword::RENAME) {
10264 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10265 let old_name = self.parse_identifier()?;
10266 self.expect_keyword_is(Keyword::TO)?;
10267 let new_name = self.parse_identifier()?;
10268 AlterTableOperation::RenameConstraint { old_name, new_name }
10269 } else if self.parse_keyword(Keyword::TO) {
10270 let table_name = self.parse_object_name(false)?;
10271 AlterTableOperation::RenameTable {
10272 table_name: RenameTableNameKind::To(table_name),
10273 }
10274 } else if self.parse_keyword(Keyword::AS) {
10275 let table_name = self.parse_object_name(false)?;
10276 AlterTableOperation::RenameTable {
10277 table_name: RenameTableNameKind::As(table_name),
10278 }
10279 } else {
10280 let _ = self.parse_keyword(Keyword::COLUMN); let old_column_name = self.parse_identifier()?;
10282 self.expect_keyword_is(Keyword::TO)?;
10283 let new_column_name = self.parse_identifier()?;
10284 AlterTableOperation::RenameColumn {
10285 old_column_name,
10286 new_column_name,
10287 }
10288 }
10289 } else if self.parse_keyword(Keyword::DISABLE) {
10290 if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10291 AlterTableOperation::DisableRowLevelSecurity {}
10292 } else if self.parse_keyword(Keyword::RULE) {
10293 let name = self.parse_identifier()?;
10294 AlterTableOperation::DisableRule { name }
10295 } else if self.parse_keyword(Keyword::TRIGGER) {
10296 let name = self.parse_identifier()?;
10297 AlterTableOperation::DisableTrigger { name }
10298 } else {
10299 return self.expected_ref(
10300 "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10301 self.peek_token_ref(),
10302 );
10303 }
10304 } else if self.parse_keyword(Keyword::ENABLE) {
10305 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10306 let name = self.parse_identifier()?;
10307 AlterTableOperation::EnableAlwaysRule { name }
10308 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10309 let name = self.parse_identifier()?;
10310 AlterTableOperation::EnableAlwaysTrigger { name }
10311 } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10312 AlterTableOperation::EnableRowLevelSecurity {}
10313 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10314 let name = self.parse_identifier()?;
10315 AlterTableOperation::EnableReplicaRule { name }
10316 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10317 let name = self.parse_identifier()?;
10318 AlterTableOperation::EnableReplicaTrigger { name }
10319 } else if self.parse_keyword(Keyword::RULE) {
10320 let name = self.parse_identifier()?;
10321 AlterTableOperation::EnableRule { name }
10322 } else if self.parse_keyword(Keyword::TRIGGER) {
10323 let name = self.parse_identifier()?;
10324 AlterTableOperation::EnableTrigger { name }
10325 } else {
10326 return self.expected_ref(
10327 "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10328 self.peek_token_ref(),
10329 );
10330 }
10331 } else if self.parse_keywords(&[
10332 Keyword::FORCE,
10333 Keyword::ROW,
10334 Keyword::LEVEL,
10335 Keyword::SECURITY,
10336 ]) {
10337 AlterTableOperation::ForceRowLevelSecurity
10338 } else if self.parse_keywords(&[
10339 Keyword::NO,
10340 Keyword::FORCE,
10341 Keyword::ROW,
10342 Keyword::LEVEL,
10343 Keyword::SECURITY,
10344 ]) {
10345 AlterTableOperation::NoForceRowLevelSecurity
10346 } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10347 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10348 {
10349 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10350 let name = self.parse_identifier()?;
10351 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10352 Some(self.parse_identifier()?)
10353 } else {
10354 None
10355 };
10356 AlterTableOperation::ClearProjection {
10357 if_exists,
10358 name,
10359 partition,
10360 }
10361 } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10362 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10363 {
10364 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10365 let name = self.parse_identifier()?;
10366 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10367 Some(self.parse_identifier()?)
10368 } else {
10369 None
10370 };
10371 AlterTableOperation::MaterializeProjection {
10372 if_exists,
10373 name,
10374 partition,
10375 }
10376 } else if self.parse_keyword(Keyword::DROP) {
10377 if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10378 self.expect_token(&Token::LParen)?;
10379 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10380 self.expect_token(&Token::RParen)?;
10381 AlterTableOperation::DropPartitions {
10382 partitions,
10383 if_exists: true,
10384 }
10385 } else if self.parse_keyword(Keyword::PARTITION) {
10386 self.expect_token(&Token::LParen)?;
10387 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10388 self.expect_token(&Token::RParen)?;
10389 AlterTableOperation::DropPartitions {
10390 partitions,
10391 if_exists: false,
10392 }
10393 } else if self.parse_keyword(Keyword::CONSTRAINT) {
10394 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10395 let name = self.parse_identifier()?;
10396 let drop_behavior = self.parse_optional_drop_behavior();
10397 AlterTableOperation::DropConstraint {
10398 if_exists,
10399 name,
10400 drop_behavior,
10401 }
10402 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10403 let drop_behavior = self.parse_optional_drop_behavior();
10404 AlterTableOperation::DropPrimaryKey { drop_behavior }
10405 } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10406 let name = self.parse_identifier()?;
10407 let drop_behavior = self.parse_optional_drop_behavior();
10408 AlterTableOperation::DropForeignKey {
10409 name,
10410 drop_behavior,
10411 }
10412 } else if self.parse_keyword(Keyword::INDEX) {
10413 let name = self.parse_identifier()?;
10414 AlterTableOperation::DropIndex { name }
10415 } else if self.parse_keyword(Keyword::PROJECTION)
10416 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10417 {
10418 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10419 let name = self.parse_identifier()?;
10420 AlterTableOperation::DropProjection { if_exists, name }
10421 } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10422 AlterTableOperation::DropClusteringKey
10423 } else {
10424 let has_column_keyword = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10426 let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10427 self.parse_comma_separated(Parser::parse_identifier)?
10428 } else {
10429 vec![self.parse_identifier()?]
10430 };
10431 let drop_behavior = self.parse_optional_drop_behavior();
10432 AlterTableOperation::DropColumn {
10433 has_column_keyword,
10434 column_names,
10435 if_exists,
10436 drop_behavior,
10437 }
10438 }
10439 } else if self.parse_keyword(Keyword::PARTITION) {
10440 self.expect_token(&Token::LParen)?;
10441 let before = self.parse_comma_separated(Parser::parse_expr)?;
10442 self.expect_token(&Token::RParen)?;
10443 self.expect_keyword_is(Keyword::RENAME)?;
10444 self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10445 self.expect_token(&Token::LParen)?;
10446 let renames = self.parse_comma_separated(Parser::parse_expr)?;
10447 self.expect_token(&Token::RParen)?;
10448 AlterTableOperation::RenamePartitions {
10449 old_partitions: before,
10450 new_partitions: renames,
10451 }
10452 } else if self.parse_keyword(Keyword::CHANGE) {
10453 let _ = self.parse_keyword(Keyword::COLUMN); let old_name = self.parse_identifier()?;
10455 let new_name = self.parse_identifier()?;
10456 let data_type = self.parse_data_type()?;
10457 let mut options = vec![];
10458 while let Some(option) = self.parse_optional_column_option()? {
10459 options.push(option);
10460 }
10461
10462 let column_position = self.parse_column_position()?;
10463
10464 AlterTableOperation::ChangeColumn {
10465 old_name,
10466 new_name,
10467 data_type,
10468 options,
10469 column_position,
10470 }
10471 } else if self.parse_keyword(Keyword::MODIFY) {
10472 let _ = self.parse_keyword(Keyword::COLUMN); let col_name = self.parse_identifier()?;
10474 let data_type = self.parse_data_type()?;
10475 let mut options = vec![];
10476 while let Some(option) = self.parse_optional_column_option()? {
10477 options.push(option);
10478 }
10479
10480 let column_position = self.parse_column_position()?;
10481
10482 AlterTableOperation::ModifyColumn {
10483 col_name,
10484 data_type,
10485 options,
10486 column_position,
10487 }
10488 } else if self.parse_keyword(Keyword::ALTER) {
10489 if self.peek_keyword(Keyword::SORTKEY) {
10490 self.prev_token();
10491 return self.parse_alter_sort_key();
10492 }
10493
10494 let _ = self.parse_keyword(Keyword::COLUMN); let column_name = self.parse_identifier()?;
10496 let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10497
10498 let op: AlterColumnOperation = if self.parse_keywords(&[
10499 Keyword::SET,
10500 Keyword::NOT,
10501 Keyword::NULL,
10502 ]) {
10503 AlterColumnOperation::SetNotNull {}
10504 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10505 AlterColumnOperation::DropNotNull {}
10506 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10507 AlterColumnOperation::SetDefault {
10508 value: self.parse_expr()?,
10509 }
10510 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10511 AlterColumnOperation::DropDefault {}
10512 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10513 self.parse_set_data_type(true)?
10514 } else if self.parse_keyword(Keyword::TYPE) {
10515 self.parse_set_data_type(false)?
10516 } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10517 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10518 Some(GeneratedAs::Always)
10519 } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10520 Some(GeneratedAs::ByDefault)
10521 } else {
10522 None
10523 };
10524
10525 self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10526
10527 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10528
10529 if self.peek_token_ref().token == Token::LParen {
10530 self.expect_token(&Token::LParen)?;
10531 sequence_options = Some(self.parse_create_sequence_options()?);
10532 self.expect_token(&Token::RParen)?;
10533 }
10534
10535 AlterColumnOperation::AddGenerated {
10536 generated_as,
10537 sequence_options,
10538 }
10539 } else {
10540 let message = if is_postgresql {
10541 "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10542 } else {
10543 "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10544 };
10545
10546 return self.expected_ref(message, self.peek_token_ref());
10547 };
10548 AlterTableOperation::AlterColumn { column_name, op }
10549 } else if self.parse_keyword(Keyword::SWAP) {
10550 self.expect_keyword_is(Keyword::WITH)?;
10551 let table_name = self.parse_object_name(false)?;
10552 AlterTableOperation::SwapWith { table_name }
10553 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10554 && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10555 {
10556 let new_owner = self.parse_owner()?;
10557 AlterTableOperation::OwnerTo { new_owner }
10558 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10559 && self.parse_keyword(Keyword::ATTACH)
10560 {
10561 AlterTableOperation::AttachPartition {
10562 partition: self.parse_part_or_partition()?,
10563 }
10564 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10565 && self.parse_keyword(Keyword::DETACH)
10566 {
10567 AlterTableOperation::DetachPartition {
10568 partition: self.parse_part_or_partition()?,
10569 }
10570 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10571 && self.parse_keyword(Keyword::FREEZE)
10572 {
10573 let partition = self.parse_part_or_partition()?;
10574 let with_name = if self.parse_keyword(Keyword::WITH) {
10575 self.expect_keyword_is(Keyword::NAME)?;
10576 Some(self.parse_identifier()?)
10577 } else {
10578 None
10579 };
10580 AlterTableOperation::FreezePartition {
10581 partition,
10582 with_name,
10583 }
10584 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10585 && self.parse_keyword(Keyword::UNFREEZE)
10586 {
10587 let partition = self.parse_part_or_partition()?;
10588 let with_name = if self.parse_keyword(Keyword::WITH) {
10589 self.expect_keyword_is(Keyword::NAME)?;
10590 Some(self.parse_identifier()?)
10591 } else {
10592 None
10593 };
10594 AlterTableOperation::UnfreezePartition {
10595 partition,
10596 with_name,
10597 }
10598 } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
10599 self.expect_token(&Token::LParen)?;
10600 let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
10601 self.expect_token(&Token::RParen)?;
10602 AlterTableOperation::ClusterBy { exprs }
10603 } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
10604 AlterTableOperation::SuspendRecluster
10605 } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
10606 AlterTableOperation::ResumeRecluster
10607 } else if self.parse_keyword(Keyword::LOCK) {
10608 let equals = self.consume_token(&Token::Eq);
10609 let lock = match self.parse_one_of_keywords(&[
10610 Keyword::DEFAULT,
10611 Keyword::EXCLUSIVE,
10612 Keyword::NONE,
10613 Keyword::SHARED,
10614 ]) {
10615 Some(Keyword::DEFAULT) => AlterTableLock::Default,
10616 Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
10617 Some(Keyword::NONE) => AlterTableLock::None,
10618 Some(Keyword::SHARED) => AlterTableLock::Shared,
10619 _ => self.expected_ref(
10620 "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
10621 self.peek_token_ref(),
10622 )?,
10623 };
10624 AlterTableOperation::Lock { equals, lock }
10625 } else if self.parse_keyword(Keyword::ALGORITHM) {
10626 let equals = self.consume_token(&Token::Eq);
10627 let algorithm = match self.parse_one_of_keywords(&[
10628 Keyword::DEFAULT,
10629 Keyword::INSTANT,
10630 Keyword::INPLACE,
10631 Keyword::COPY,
10632 ]) {
10633 Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
10634 Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
10635 Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
10636 Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
10637 _ => self.expected_ref(
10638 "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
10639 self.peek_token_ref(),
10640 )?,
10641 };
10642 AlterTableOperation::Algorithm { equals, algorithm }
10643 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
10644 let equals = self.consume_token(&Token::Eq);
10645 let value = self.parse_number_value()?;
10646 AlterTableOperation::AutoIncrement { equals, value }
10647 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
10648 let identity = if self.parse_keyword(Keyword::NOTHING) {
10649 ReplicaIdentity::Nothing
10650 } else if self.parse_keyword(Keyword::FULL) {
10651 ReplicaIdentity::Full
10652 } else if self.parse_keyword(Keyword::DEFAULT) {
10653 ReplicaIdentity::Default
10654 } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10655 ReplicaIdentity::Index(self.parse_identifier()?)
10656 } else {
10657 return self.expected_ref(
10658 "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
10659 self.peek_token_ref(),
10660 );
10661 };
10662
10663 AlterTableOperation::ReplicaIdentity { identity }
10664 } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
10665 let name = self.parse_identifier()?;
10666 AlterTableOperation::ValidateConstraint { name }
10667 } else {
10668 let mut options =
10669 self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
10670 if !options.is_empty() {
10671 AlterTableOperation::SetTblProperties {
10672 table_properties: options,
10673 }
10674 } else {
10675 options = self.parse_options(Keyword::SET)?;
10676 if !options.is_empty() {
10677 AlterTableOperation::SetOptionsParens { options }
10678 } else {
10679 return self.expected_ref(
10680 "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
10681 self.peek_token_ref(),
10682 );
10683 }
10684 }
10685 };
10686 Ok(operation)
10687 }
10688
10689 fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
10690 let data_type = self.parse_data_type()?;
10691 let using = if self.dialect.supports_alter_column_type_using()
10692 && self.parse_keyword(Keyword::USING)
10693 {
10694 Some(self.parse_expr()?)
10695 } else {
10696 None
10697 };
10698 Ok(AlterColumnOperation::SetDataType {
10699 data_type,
10700 using,
10701 had_set,
10702 })
10703 }
10704
10705 fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
10706 let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
10707 match keyword {
10708 Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
10709 Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
10710 unexpected_keyword => Err(ParserError::ParserError(
10712 format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
10713 )),
10714 }
10715 }
10716
10717 pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10719 let object_type = self.expect_one_of_keywords(&[
10720 Keyword::VIEW,
10721 Keyword::TYPE,
10722 Keyword::COLLATION,
10723 Keyword::TABLE,
10724 Keyword::INDEX,
10725 Keyword::FUNCTION,
10726 Keyword::AGGREGATE,
10727 Keyword::ROLE,
10728 Keyword::POLICY,
10729 Keyword::CONNECTOR,
10730 Keyword::ICEBERG,
10731 Keyword::SCHEMA,
10732 Keyword::USER,
10733 Keyword::OPERATOR,
10734 ])?;
10735 match object_type {
10736 Keyword::SCHEMA => {
10737 self.prev_token();
10738 self.prev_token();
10739 self.parse_alter_schema()
10740 }
10741 Keyword::VIEW => self.parse_alter_view(),
10742 Keyword::TYPE => self.parse_alter_type(),
10743 Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
10744 Keyword::TABLE => self.parse_alter_table(false),
10745 Keyword::ICEBERG => {
10746 self.expect_keyword(Keyword::TABLE)?;
10747 self.parse_alter_table(true)
10748 }
10749 Keyword::INDEX => {
10750 let index_name = self.parse_object_name(false)?;
10751 let operation = if self.parse_keyword(Keyword::RENAME) {
10752 if self.parse_keyword(Keyword::TO) {
10753 let index_name = self.parse_object_name(false)?;
10754 AlterIndexOperation::RenameIndex { index_name }
10755 } else {
10756 return self.expected_ref("TO after RENAME", self.peek_token_ref());
10757 }
10758 } else {
10759 return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
10760 };
10761
10762 Ok(Statement::AlterIndex {
10763 name: index_name,
10764 operation,
10765 })
10766 }
10767 Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
10768 Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
10769 Keyword::OPERATOR => {
10770 if self.parse_keyword(Keyword::FAMILY) {
10771 self.parse_alter_operator_family().map(Into::into)
10772 } else if self.parse_keyword(Keyword::CLASS) {
10773 self.parse_alter_operator_class().map(Into::into)
10774 } else {
10775 self.parse_alter_operator().map(Into::into)
10776 }
10777 }
10778 Keyword::ROLE => self.parse_alter_role(),
10779 Keyword::POLICY => self.parse_alter_policy().map(Into::into),
10780 Keyword::CONNECTOR => self.parse_alter_connector(),
10781 Keyword::USER => self.parse_alter_user().map(Into::into),
10782 unexpected_keyword => Err(ParserError::ParserError(
10784 format!("Internal parser error: expected any of {{VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
10785 )),
10786 }
10787 }
10788
10789 fn parse_alter_aggregate_signature(
10790 &mut self,
10791 ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
10792 let name = self.parse_object_name(false)?;
10793 self.expect_token(&Token::LParen)?;
10794
10795 if self.consume_token(&Token::Mul) {
10796 self.expect_token(&Token::RParen)?;
10797 return Ok((
10798 FunctionDesc {
10799 name,
10800 args: Some(vec![]),
10801 },
10802 true,
10803 None,
10804 ));
10805 }
10806
10807 let args =
10808 if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
10809 vec![]
10810 } else {
10811 self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
10812 };
10813
10814 let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
10815 Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
10816 } else {
10817 None
10818 };
10819
10820 self.expect_token(&Token::RParen)?;
10821 Ok((
10822 FunctionDesc {
10823 name,
10824 args: Some(args),
10825 },
10826 false,
10827 aggregate_order_by,
10828 ))
10829 }
10830
10831 fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
10832 let action = if self.parse_keywords(&[
10833 Keyword::CALLED,
10834 Keyword::ON,
10835 Keyword::NULL,
10836 Keyword::INPUT,
10837 ]) {
10838 Some(AlterFunctionAction::CalledOnNull(
10839 FunctionCalledOnNull::CalledOnNullInput,
10840 ))
10841 } else if self.parse_keywords(&[
10842 Keyword::RETURNS,
10843 Keyword::NULL,
10844 Keyword::ON,
10845 Keyword::NULL,
10846 Keyword::INPUT,
10847 ]) {
10848 Some(AlterFunctionAction::CalledOnNull(
10849 FunctionCalledOnNull::ReturnsNullOnNullInput,
10850 ))
10851 } else if self.parse_keyword(Keyword::STRICT) {
10852 Some(AlterFunctionAction::CalledOnNull(
10853 FunctionCalledOnNull::Strict,
10854 ))
10855 } else if self.parse_keyword(Keyword::IMMUTABLE) {
10856 Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
10857 } else if self.parse_keyword(Keyword::STABLE) {
10858 Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
10859 } else if self.parse_keyword(Keyword::VOLATILE) {
10860 Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
10861 } else if self.parse_keyword(Keyword::NOT) {
10862 self.expect_keyword(Keyword::LEAKPROOF)?;
10863 Some(AlterFunctionAction::Leakproof(false))
10864 } else if self.parse_keyword(Keyword::LEAKPROOF) {
10865 Some(AlterFunctionAction::Leakproof(true))
10866 } else if self.parse_keyword(Keyword::EXTERNAL) {
10867 self.expect_keyword(Keyword::SECURITY)?;
10868 let security = if self.parse_keyword(Keyword::DEFINER) {
10869 FunctionSecurity::Definer
10870 } else if self.parse_keyword(Keyword::INVOKER) {
10871 FunctionSecurity::Invoker
10872 } else {
10873 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
10874 };
10875 Some(AlterFunctionAction::Security {
10876 external: true,
10877 security,
10878 })
10879 } else if self.parse_keyword(Keyword::SECURITY) {
10880 let security = if self.parse_keyword(Keyword::DEFINER) {
10881 FunctionSecurity::Definer
10882 } else if self.parse_keyword(Keyword::INVOKER) {
10883 FunctionSecurity::Invoker
10884 } else {
10885 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
10886 };
10887 Some(AlterFunctionAction::Security {
10888 external: false,
10889 security,
10890 })
10891 } else if self.parse_keyword(Keyword::PARALLEL) {
10892 let parallel = if self.parse_keyword(Keyword::UNSAFE) {
10893 FunctionParallel::Unsafe
10894 } else if self.parse_keyword(Keyword::RESTRICTED) {
10895 FunctionParallel::Restricted
10896 } else if self.parse_keyword(Keyword::SAFE) {
10897 FunctionParallel::Safe
10898 } else {
10899 return self
10900 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
10901 };
10902 Some(AlterFunctionAction::Parallel(parallel))
10903 } else if self.parse_keyword(Keyword::COST) {
10904 Some(AlterFunctionAction::Cost(self.parse_number()?))
10905 } else if self.parse_keyword(Keyword::ROWS) {
10906 Some(AlterFunctionAction::Rows(self.parse_number()?))
10907 } else if self.parse_keyword(Keyword::SUPPORT) {
10908 Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
10909 } else if self.parse_keyword(Keyword::SET) {
10910 let name = self.parse_object_name(false)?;
10911 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
10912 FunctionSetValue::FromCurrent
10913 } else {
10914 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
10915 return self.expected_ref("= or TO", self.peek_token_ref());
10916 }
10917 if self.parse_keyword(Keyword::DEFAULT) {
10918 FunctionSetValue::Default
10919 } else {
10920 FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
10921 }
10922 };
10923 Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
10924 name,
10925 value,
10926 }))
10927 } else if self.parse_keyword(Keyword::RESET) {
10928 let reset_config = if self.parse_keyword(Keyword::ALL) {
10929 ResetConfig::ALL
10930 } else {
10931 ResetConfig::ConfigName(self.parse_object_name(false)?)
10932 };
10933 Some(AlterFunctionAction::Reset(reset_config))
10934 } else {
10935 None
10936 };
10937
10938 Ok(action)
10939 }
10940
10941 fn parse_alter_function_actions(
10942 &mut self,
10943 ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
10944 let mut actions = vec![];
10945 while let Some(action) = self.parse_alter_function_action()? {
10946 actions.push(action);
10947 }
10948 if actions.is_empty() {
10949 return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
10950 }
10951 let restrict = self.parse_keyword(Keyword::RESTRICT);
10952 Ok((actions, restrict))
10953 }
10954
10955 pub fn parse_alter_function(
10957 &mut self,
10958 kind: AlterFunctionKind,
10959 ) -> Result<Statement, ParserError> {
10960 let (function, aggregate_star, aggregate_order_by) = match kind {
10961 AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
10962 AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
10963 };
10964
10965 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
10966 let new_name = self.parse_identifier()?;
10967 AlterFunctionOperation::RenameTo { new_name }
10968 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
10969 AlterFunctionOperation::OwnerTo(self.parse_owner()?)
10970 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
10971 AlterFunctionOperation::SetSchema {
10972 schema_name: self.parse_object_name(false)?,
10973 }
10974 } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
10975 if !self.parse_keyword(Keyword::DEPENDS) {
10976 return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
10977 }
10978 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
10979 AlterFunctionOperation::DependsOnExtension {
10980 no: true,
10981 extension_name: self.parse_object_name(false)?,
10982 }
10983 } else if matches!(kind, AlterFunctionKind::Function)
10984 && self.parse_keyword(Keyword::DEPENDS)
10985 {
10986 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
10987 AlterFunctionOperation::DependsOnExtension {
10988 no: false,
10989 extension_name: self.parse_object_name(false)?,
10990 }
10991 } else if matches!(kind, AlterFunctionKind::Function) {
10992 let (actions, restrict) = self.parse_alter_function_actions()?;
10993 AlterFunctionOperation::Actions { actions, restrict }
10994 } else {
10995 return self.expected_ref(
10996 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
10997 self.peek_token_ref(),
10998 );
10999 };
11000
11001 Ok(Statement::AlterFunction(AlterFunction {
11002 kind,
11003 function,
11004 aggregate_order_by,
11005 aggregate_star,
11006 operation,
11007 }))
11008 }
11009
11010 pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11012 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11013 let only = self.parse_keyword(Keyword::ONLY); let table_name = self.parse_object_name(false)?;
11015 let on_cluster = self.parse_optional_on_cluster()?;
11016 let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11017
11018 let mut location = None;
11019 if self.parse_keyword(Keyword::LOCATION) {
11020 location = Some(HiveSetLocation {
11021 has_set: false,
11022 location: self.parse_identifier()?,
11023 });
11024 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11025 location = Some(HiveSetLocation {
11026 has_set: true,
11027 location: self.parse_identifier()?,
11028 });
11029 }
11030
11031 let end_token = if self.peek_token_ref().token == Token::SemiColon {
11032 self.peek_token_ref().clone()
11033 } else {
11034 self.get_current_token().clone()
11035 };
11036
11037 Ok(AlterTable {
11038 name: table_name,
11039 if_exists,
11040 only,
11041 operations,
11042 location,
11043 on_cluster,
11044 table_type: if iceberg {
11045 Some(AlterTableType::Iceberg)
11046 } else {
11047 None
11048 },
11049 end_token: AttachedToken(end_token),
11050 }
11051 .into())
11052 }
11053
11054 pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11056 let name = self.parse_object_name(false)?;
11057 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11058
11059 let with_options = self.parse_options(Keyword::WITH)?;
11060
11061 self.expect_keyword_is(Keyword::AS)?;
11062 let query = self.parse_query()?;
11063
11064 Ok(Statement::AlterView {
11065 name,
11066 columns,
11067 query,
11068 with_options,
11069 })
11070 }
11071
11072 pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11074 let name = self.parse_object_name(false)?;
11075
11076 if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11077 let new_name = self.parse_identifier()?;
11078 Ok(Statement::AlterType(AlterType {
11079 name,
11080 operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11081 }))
11082 } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11083 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11084 let new_enum_value = self.parse_identifier()?;
11085 let position = if self.parse_keyword(Keyword::BEFORE) {
11086 Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11087 } else if self.parse_keyword(Keyword::AFTER) {
11088 Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11089 } else {
11090 None
11091 };
11092
11093 Ok(Statement::AlterType(AlterType {
11094 name,
11095 operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11096 if_not_exists,
11097 value: new_enum_value,
11098 position,
11099 }),
11100 }))
11101 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11102 let existing_enum_value = self.parse_identifier()?;
11103 self.expect_keyword(Keyword::TO)?;
11104 let new_enum_value = self.parse_identifier()?;
11105
11106 Ok(Statement::AlterType(AlterType {
11107 name,
11108 operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11109 from: existing_enum_value,
11110 to: new_enum_value,
11111 }),
11112 }))
11113 } else {
11114 self.expected_ref(
11115 "{RENAME TO | { RENAME | ADD } VALUE}",
11116 self.peek_token_ref(),
11117 )
11118 }
11119 }
11120
11121 pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11125 let name = self.parse_object_name(false)?;
11126 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11127 AlterCollationOperation::RenameTo {
11128 new_name: self.parse_identifier()?,
11129 }
11130 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11131 AlterCollationOperation::OwnerTo(self.parse_owner()?)
11132 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11133 AlterCollationOperation::SetSchema {
11134 schema_name: self.parse_object_name(false)?,
11135 }
11136 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11137 AlterCollationOperation::RefreshVersion
11138 } else {
11139 return self.expected_ref(
11140 "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11141 self.peek_token_ref(),
11142 );
11143 };
11144
11145 Ok(AlterCollation { name, operation })
11146 }
11147
11148 pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11152 let name = self.parse_operator_name()?;
11153
11154 self.expect_token(&Token::LParen)?;
11156
11157 let left_type = if self.parse_keyword(Keyword::NONE) {
11158 None
11159 } else {
11160 Some(self.parse_data_type()?)
11161 };
11162
11163 self.expect_token(&Token::Comma)?;
11164 let right_type = self.parse_data_type()?;
11165 self.expect_token(&Token::RParen)?;
11166
11167 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11169 let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11170 Owner::CurrentRole
11171 } else if self.parse_keyword(Keyword::CURRENT_USER) {
11172 Owner::CurrentUser
11173 } else if self.parse_keyword(Keyword::SESSION_USER) {
11174 Owner::SessionUser
11175 } else {
11176 Owner::Ident(self.parse_identifier()?)
11177 };
11178 AlterOperatorOperation::OwnerTo(owner)
11179 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11180 let schema_name = self.parse_object_name(false)?;
11181 AlterOperatorOperation::SetSchema { schema_name }
11182 } else if self.parse_keyword(Keyword::SET) {
11183 self.expect_token(&Token::LParen)?;
11184
11185 let mut options = Vec::new();
11186 loop {
11187 let keyword = self.expect_one_of_keywords(&[
11188 Keyword::RESTRICT,
11189 Keyword::JOIN,
11190 Keyword::COMMUTATOR,
11191 Keyword::NEGATOR,
11192 Keyword::HASHES,
11193 Keyword::MERGES,
11194 ])?;
11195
11196 match keyword {
11197 Keyword::RESTRICT => {
11198 self.expect_token(&Token::Eq)?;
11199 let proc_name = if self.parse_keyword(Keyword::NONE) {
11200 None
11201 } else {
11202 Some(self.parse_object_name(false)?)
11203 };
11204 options.push(OperatorOption::Restrict(proc_name));
11205 }
11206 Keyword::JOIN => {
11207 self.expect_token(&Token::Eq)?;
11208 let proc_name = if self.parse_keyword(Keyword::NONE) {
11209 None
11210 } else {
11211 Some(self.parse_object_name(false)?)
11212 };
11213 options.push(OperatorOption::Join(proc_name));
11214 }
11215 Keyword::COMMUTATOR => {
11216 self.expect_token(&Token::Eq)?;
11217 let op_name = self.parse_operator_name()?;
11218 options.push(OperatorOption::Commutator(op_name));
11219 }
11220 Keyword::NEGATOR => {
11221 self.expect_token(&Token::Eq)?;
11222 let op_name = self.parse_operator_name()?;
11223 options.push(OperatorOption::Negator(op_name));
11224 }
11225 Keyword::HASHES => {
11226 options.push(OperatorOption::Hashes);
11227 }
11228 Keyword::MERGES => {
11229 options.push(OperatorOption::Merges);
11230 }
11231 unexpected_keyword => return Err(ParserError::ParserError(
11232 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11233 )),
11234 }
11235
11236 if !self.consume_token(&Token::Comma) {
11237 break;
11238 }
11239 }
11240
11241 self.expect_token(&Token::RParen)?;
11242 AlterOperatorOperation::Set { options }
11243 } else {
11244 return self.expected_ref(
11245 "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11246 self.peek_token_ref(),
11247 );
11248 };
11249
11250 Ok(AlterOperator {
11251 name,
11252 left_type,
11253 right_type,
11254 operation,
11255 })
11256 }
11257
11258 fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11260 let strategy_number = self.parse_literal_uint()?;
11261 let operator_name = self.parse_operator_name()?;
11262
11263 self.expect_token(&Token::LParen)?;
11265 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11266 self.expect_token(&Token::RParen)?;
11267
11268 let purpose = if self.parse_keyword(Keyword::FOR) {
11270 if self.parse_keyword(Keyword::SEARCH) {
11271 Some(OperatorPurpose::ForSearch)
11272 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11273 let sort_family = self.parse_object_name(false)?;
11274 Some(OperatorPurpose::ForOrderBy { sort_family })
11275 } else {
11276 return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11277 }
11278 } else {
11279 None
11280 };
11281
11282 Ok(OperatorFamilyItem::Operator {
11283 strategy_number,
11284 operator_name,
11285 op_types,
11286 purpose,
11287 })
11288 }
11289
11290 fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11292 let support_number = self.parse_literal_uint()?;
11293
11294 let op_types =
11296 if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11297 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11298 self.expect_token(&Token::RParen)?;
11299 Some(types)
11300 } else if self.consume_token(&Token::LParen) {
11301 self.expect_token(&Token::RParen)?;
11302 Some(vec![])
11303 } else {
11304 None
11305 };
11306
11307 let function_name = self.parse_object_name(false)?;
11308
11309 let argument_types = if self.consume_token(&Token::LParen) {
11311 if self.peek_token_ref().token == Token::RParen {
11312 self.expect_token(&Token::RParen)?;
11313 vec![]
11314 } else {
11315 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11316 self.expect_token(&Token::RParen)?;
11317 types
11318 }
11319 } else {
11320 vec![]
11321 };
11322
11323 Ok(OperatorFamilyItem::Function {
11324 support_number,
11325 op_types,
11326 function_name,
11327 argument_types,
11328 })
11329 }
11330
11331 fn parse_operator_family_drop_operator(
11333 &mut self,
11334 ) -> Result<OperatorFamilyDropItem, ParserError> {
11335 let strategy_number = self.parse_literal_uint()?;
11336
11337 self.expect_token(&Token::LParen)?;
11339 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11340 self.expect_token(&Token::RParen)?;
11341
11342 Ok(OperatorFamilyDropItem::Operator {
11343 strategy_number,
11344 op_types,
11345 })
11346 }
11347
11348 fn parse_operator_family_drop_function(
11350 &mut self,
11351 ) -> Result<OperatorFamilyDropItem, ParserError> {
11352 let support_number = self.parse_literal_uint()?;
11353
11354 self.expect_token(&Token::LParen)?;
11356 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11357 self.expect_token(&Token::RParen)?;
11358
11359 Ok(OperatorFamilyDropItem::Function {
11360 support_number,
11361 op_types,
11362 })
11363 }
11364
11365 fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11367 if self.parse_keyword(Keyword::OPERATOR) {
11368 self.parse_operator_family_add_operator()
11369 } else if self.parse_keyword(Keyword::FUNCTION) {
11370 self.parse_operator_family_add_function()
11371 } else {
11372 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11373 }
11374 }
11375
11376 fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11378 if self.parse_keyword(Keyword::OPERATOR) {
11379 self.parse_operator_family_drop_operator()
11380 } else if self.parse_keyword(Keyword::FUNCTION) {
11381 self.parse_operator_family_drop_function()
11382 } else {
11383 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11384 }
11385 }
11386
11387 pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11390 let name = self.parse_object_name(false)?;
11391 self.expect_keyword(Keyword::USING)?;
11392 let using = self.parse_identifier()?;
11393
11394 let operation = if self.parse_keyword(Keyword::ADD) {
11395 let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11396 AlterOperatorFamilyOperation::Add { items }
11397 } else if self.parse_keyword(Keyword::DROP) {
11398 let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11399 AlterOperatorFamilyOperation::Drop { items }
11400 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11401 let new_name = self.parse_object_name(false)?;
11402 AlterOperatorFamilyOperation::RenameTo { new_name }
11403 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11404 let owner = self.parse_owner()?;
11405 AlterOperatorFamilyOperation::OwnerTo(owner)
11406 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11407 let schema_name = self.parse_object_name(false)?;
11408 AlterOperatorFamilyOperation::SetSchema { schema_name }
11409 } else {
11410 return self.expected_ref(
11411 "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11412 self.peek_token_ref(),
11413 );
11414 };
11415
11416 Ok(AlterOperatorFamily {
11417 name,
11418 using,
11419 operation,
11420 })
11421 }
11422
11423 pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11427 let name = self.parse_object_name(false)?;
11428 self.expect_keyword(Keyword::USING)?;
11429 let using = self.parse_identifier()?;
11430
11431 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11432 let new_name = self.parse_object_name(false)?;
11433 AlterOperatorClassOperation::RenameTo { new_name }
11434 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11435 let owner = self.parse_owner()?;
11436 AlterOperatorClassOperation::OwnerTo(owner)
11437 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11438 let schema_name = self.parse_object_name(false)?;
11439 AlterOperatorClassOperation::SetSchema { schema_name }
11440 } else {
11441 return self.expected_ref(
11442 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11443 self.peek_token_ref(),
11444 );
11445 };
11446
11447 Ok(AlterOperatorClass {
11448 name,
11449 using,
11450 operation,
11451 })
11452 }
11453
11454 pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11458 self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11459 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11460 let name = self.parse_object_name(false)?;
11461 let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11462 self.prev_token();
11463 let options = self.parse_options(Keyword::OPTIONS)?;
11464 AlterSchemaOperation::SetOptionsParens { options }
11465 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11466 let collate = self.parse_expr()?;
11467 AlterSchemaOperation::SetDefaultCollate { collate }
11468 } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11469 let replica = self.parse_identifier()?;
11470 let options = if self.peek_keyword(Keyword::OPTIONS) {
11471 Some(self.parse_options(Keyword::OPTIONS)?)
11472 } else {
11473 None
11474 };
11475 AlterSchemaOperation::AddReplica { replica, options }
11476 } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11477 let replica = self.parse_identifier()?;
11478 AlterSchemaOperation::DropReplica { replica }
11479 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11480 let new_name = self.parse_object_name(false)?;
11481 AlterSchemaOperation::Rename { name: new_name }
11482 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11483 let owner = self.parse_owner()?;
11484 AlterSchemaOperation::OwnerTo { owner }
11485 } else {
11486 return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11487 };
11488 Ok(Statement::AlterSchema(AlterSchema {
11489 name,
11490 if_exists,
11491 operations: vec![operation],
11492 }))
11493 }
11494
11495 pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11498 let object_name = self.parse_object_name(false)?;
11499 if self.peek_token_ref().token == Token::LParen {
11500 match self.parse_function(object_name)? {
11501 Expr::Function(f) => Ok(Statement::Call(f)),
11502 other => parser_err!(
11503 format!("Expected a simple procedure call but found: {other}"),
11504 self.peek_token_ref().span.start
11505 ),
11506 }
11507 } else {
11508 Ok(Statement::Call(Function {
11509 name: object_name,
11510 uses_odbc_syntax: false,
11511 parameters: FunctionArguments::None,
11512 args: FunctionArguments::None,
11513 over: None,
11514 filter: None,
11515 null_treatment: None,
11516 within_group: vec![],
11517 }))
11518 }
11519 }
11520
11521 pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11523 let source;
11524 if self.consume_token(&Token::LParen) {
11525 source = CopySource::Query(self.parse_query()?);
11526 self.expect_token(&Token::RParen)?;
11527 } else {
11528 let table_name = self.parse_object_name(false)?;
11529 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11530 source = CopySource::Table {
11531 table_name,
11532 columns,
11533 };
11534 }
11535 let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
11536 Some(Keyword::FROM) => false,
11537 Some(Keyword::TO) => true,
11538 _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
11539 };
11540 if !to {
11541 if let CopySource::Query(_) = source {
11544 return Err(ParserError::ParserError(
11545 "COPY ... FROM does not support query as a source".to_string(),
11546 ));
11547 }
11548 }
11549 let target = if self.parse_keyword(Keyword::STDIN) {
11550 CopyTarget::Stdin
11551 } else if self.parse_keyword(Keyword::STDOUT) {
11552 CopyTarget::Stdout
11553 } else if self.parse_keyword(Keyword::PROGRAM) {
11554 CopyTarget::Program {
11555 command: self.parse_literal_string()?,
11556 }
11557 } else {
11558 CopyTarget::File {
11559 filename: self.parse_literal_string()?,
11560 }
11561 };
11562 let _ = self.parse_keyword(Keyword::WITH); let mut options = vec![];
11564 if self.consume_token(&Token::LParen) {
11565 options = self.parse_comma_separated(Parser::parse_copy_option)?;
11566 self.expect_token(&Token::RParen)?;
11567 }
11568 let mut legacy_options = vec![];
11569 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
11570 legacy_options.push(opt);
11571 }
11572 let values =
11573 if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
11574 self.expect_token(&Token::SemiColon)?;
11575 self.parse_tsv()
11576 } else {
11577 vec![]
11578 };
11579 Ok(Statement::Copy {
11580 source,
11581 to,
11582 target,
11583 options,
11584 legacy_options,
11585 values,
11586 })
11587 }
11588
11589 fn parse_open(&mut self) -> Result<Statement, ParserError> {
11591 self.expect_keyword(Keyword::OPEN)?;
11592 Ok(Statement::Open(OpenStatement {
11593 cursor_name: self.parse_identifier()?,
11594 }))
11595 }
11596
11597 pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
11599 let cursor = if self.parse_keyword(Keyword::ALL) {
11600 CloseCursor::All
11601 } else {
11602 let name = self.parse_identifier()?;
11603
11604 CloseCursor::Specific { name }
11605 };
11606
11607 Ok(Statement::Close { cursor })
11608 }
11609
11610 fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
11611 let ret = match self.parse_one_of_keywords(&[
11612 Keyword::FORMAT,
11613 Keyword::FREEZE,
11614 Keyword::DELIMITER,
11615 Keyword::NULL,
11616 Keyword::HEADER,
11617 Keyword::QUOTE,
11618 Keyword::ESCAPE,
11619 Keyword::FORCE_QUOTE,
11620 Keyword::FORCE_NOT_NULL,
11621 Keyword::FORCE_NULL,
11622 Keyword::ENCODING,
11623 ]) {
11624 Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
11625 Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
11626 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11627 Some(Keyword::FALSE)
11628 )),
11629 Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
11630 Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
11631 Some(Keyword::HEADER) => CopyOption::Header(!matches!(
11632 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11633 Some(Keyword::FALSE)
11634 )),
11635 Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
11636 Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
11637 Some(Keyword::FORCE_QUOTE) => {
11638 CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
11639 }
11640 Some(Keyword::FORCE_NOT_NULL) => {
11641 CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11642 }
11643 Some(Keyword::FORCE_NULL) => {
11644 CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11645 }
11646 Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
11647 _ => self.expected_ref("option", self.peek_token_ref())?,
11648 };
11649 Ok(ret)
11650 }
11651
11652 fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
11653 if self.parse_keyword(Keyword::FORMAT) {
11655 let _ = self.parse_keyword(Keyword::AS);
11656 }
11657
11658 let ret = match self.parse_one_of_keywords(&[
11659 Keyword::ACCEPTANYDATE,
11660 Keyword::ACCEPTINVCHARS,
11661 Keyword::ADDQUOTES,
11662 Keyword::ALLOWOVERWRITE,
11663 Keyword::BINARY,
11664 Keyword::BLANKSASNULL,
11665 Keyword::BZIP2,
11666 Keyword::CLEANPATH,
11667 Keyword::COMPUPDATE,
11668 Keyword::CREDENTIALS,
11669 Keyword::CSV,
11670 Keyword::DATEFORMAT,
11671 Keyword::DELIMITER,
11672 Keyword::EMPTYASNULL,
11673 Keyword::ENCRYPTED,
11674 Keyword::ESCAPE,
11675 Keyword::EXTENSION,
11676 Keyword::FIXEDWIDTH,
11677 Keyword::GZIP,
11678 Keyword::HEADER,
11679 Keyword::IAM_ROLE,
11680 Keyword::IGNOREHEADER,
11681 Keyword::JSON,
11682 Keyword::MANIFEST,
11683 Keyword::MAXFILESIZE,
11684 Keyword::NULL,
11685 Keyword::PARALLEL,
11686 Keyword::PARQUET,
11687 Keyword::PARTITION,
11688 Keyword::REGION,
11689 Keyword::REMOVEQUOTES,
11690 Keyword::ROWGROUPSIZE,
11691 Keyword::STATUPDATE,
11692 Keyword::TIMEFORMAT,
11693 Keyword::TRUNCATECOLUMNS,
11694 Keyword::ZSTD,
11695 ]) {
11696 Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
11697 Some(Keyword::ACCEPTINVCHARS) => {
11698 let _ = self.parse_keyword(Keyword::AS); let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11700 Some(self.parse_literal_string()?)
11701 } else {
11702 None
11703 };
11704 CopyLegacyOption::AcceptInvChars(ch)
11705 }
11706 Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
11707 Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
11708 Some(Keyword::BINARY) => CopyLegacyOption::Binary,
11709 Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
11710 Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
11711 Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
11712 Some(Keyword::COMPUPDATE) => {
11713 let preset = self.parse_keyword(Keyword::PRESET);
11714 let enabled = match self.parse_one_of_keywords(&[
11715 Keyword::TRUE,
11716 Keyword::FALSE,
11717 Keyword::ON,
11718 Keyword::OFF,
11719 ]) {
11720 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11721 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11722 _ => None,
11723 };
11724 CopyLegacyOption::CompUpdate { preset, enabled }
11725 }
11726 Some(Keyword::CREDENTIALS) => {
11727 CopyLegacyOption::Credentials(self.parse_literal_string()?)
11728 }
11729 Some(Keyword::CSV) => CopyLegacyOption::Csv({
11730 let mut opts = vec![];
11731 while let Some(opt) =
11732 self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
11733 {
11734 opts.push(opt);
11735 }
11736 opts
11737 }),
11738 Some(Keyword::DATEFORMAT) => {
11739 let _ = self.parse_keyword(Keyword::AS);
11740 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11741 Some(self.parse_literal_string()?)
11742 } else {
11743 None
11744 };
11745 CopyLegacyOption::DateFormat(fmt)
11746 }
11747 Some(Keyword::DELIMITER) => {
11748 let _ = self.parse_keyword(Keyword::AS);
11749 CopyLegacyOption::Delimiter(self.parse_literal_char()?)
11750 }
11751 Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
11752 Some(Keyword::ENCRYPTED) => {
11753 let auto = self.parse_keyword(Keyword::AUTO);
11754 CopyLegacyOption::Encrypted { auto }
11755 }
11756 Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
11757 Some(Keyword::EXTENSION) => {
11758 let ext = self.parse_literal_string()?;
11759 CopyLegacyOption::Extension(ext)
11760 }
11761 Some(Keyword::FIXEDWIDTH) => {
11762 let spec = self.parse_literal_string()?;
11763 CopyLegacyOption::FixedWidth(spec)
11764 }
11765 Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
11766 Some(Keyword::HEADER) => CopyLegacyOption::Header,
11767 Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
11768 Some(Keyword::IGNOREHEADER) => {
11769 let _ = self.parse_keyword(Keyword::AS);
11770 let num_rows = self.parse_literal_uint()?;
11771 CopyLegacyOption::IgnoreHeader(num_rows)
11772 }
11773 Some(Keyword::JSON) => {
11774 let _ = self.parse_keyword(Keyword::AS);
11775 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11776 Some(self.parse_literal_string()?)
11777 } else {
11778 None
11779 };
11780 CopyLegacyOption::Json(fmt)
11781 }
11782 Some(Keyword::MANIFEST) => {
11783 let verbose = self.parse_keyword(Keyword::VERBOSE);
11784 CopyLegacyOption::Manifest { verbose }
11785 }
11786 Some(Keyword::MAXFILESIZE) => {
11787 let _ = self.parse_keyword(Keyword::AS);
11788 let size = self.parse_number_value()?;
11789 let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11790 Some(Keyword::MB) => Some(FileSizeUnit::MB),
11791 Some(Keyword::GB) => Some(FileSizeUnit::GB),
11792 _ => None,
11793 };
11794 CopyLegacyOption::MaxFileSize(FileSize { size, unit })
11795 }
11796 Some(Keyword::NULL) => {
11797 let _ = self.parse_keyword(Keyword::AS);
11798 CopyLegacyOption::Null(self.parse_literal_string()?)
11799 }
11800 Some(Keyword::PARALLEL) => {
11801 let enabled = match self.parse_one_of_keywords(&[
11802 Keyword::TRUE,
11803 Keyword::FALSE,
11804 Keyword::ON,
11805 Keyword::OFF,
11806 ]) {
11807 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11808 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11809 _ => None,
11810 };
11811 CopyLegacyOption::Parallel(enabled)
11812 }
11813 Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
11814 Some(Keyword::PARTITION) => {
11815 self.expect_keyword(Keyword::BY)?;
11816 let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
11817 let include = self.parse_keyword(Keyword::INCLUDE);
11818 CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
11819 }
11820 Some(Keyword::REGION) => {
11821 let _ = self.parse_keyword(Keyword::AS);
11822 let region = self.parse_literal_string()?;
11823 CopyLegacyOption::Region(region)
11824 }
11825 Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
11826 Some(Keyword::ROWGROUPSIZE) => {
11827 let _ = self.parse_keyword(Keyword::AS);
11828 let file_size = self.parse_file_size()?;
11829 CopyLegacyOption::RowGroupSize(file_size)
11830 }
11831 Some(Keyword::STATUPDATE) => {
11832 let enabled = match self.parse_one_of_keywords(&[
11833 Keyword::TRUE,
11834 Keyword::FALSE,
11835 Keyword::ON,
11836 Keyword::OFF,
11837 ]) {
11838 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11839 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11840 _ => None,
11841 };
11842 CopyLegacyOption::StatUpdate(enabled)
11843 }
11844 Some(Keyword::TIMEFORMAT) => {
11845 let _ = self.parse_keyword(Keyword::AS);
11846 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11847 Some(self.parse_literal_string()?)
11848 } else {
11849 None
11850 };
11851 CopyLegacyOption::TimeFormat(fmt)
11852 }
11853 Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
11854 Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
11855 _ => self.expected_ref("option", self.peek_token_ref())?,
11856 };
11857 Ok(ret)
11858 }
11859
11860 fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
11861 let size = self.parse_number_value()?;
11862 let unit = self.maybe_parse_file_size_unit();
11863 Ok(FileSize { size, unit })
11864 }
11865
11866 fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
11867 match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11868 Some(Keyword::MB) => Some(FileSizeUnit::MB),
11869 Some(Keyword::GB) => Some(FileSizeUnit::GB),
11870 _ => None,
11871 }
11872 }
11873
11874 fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
11875 if self.parse_keyword(Keyword::DEFAULT) {
11876 Ok(IamRoleKind::Default)
11877 } else {
11878 let arn = self.parse_literal_string()?;
11879 Ok(IamRoleKind::Arn(arn))
11880 }
11881 }
11882
11883 fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
11884 let ret = match self.parse_one_of_keywords(&[
11885 Keyword::HEADER,
11886 Keyword::QUOTE,
11887 Keyword::ESCAPE,
11888 Keyword::FORCE,
11889 ]) {
11890 Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
11891 Some(Keyword::QUOTE) => {
11892 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
11894 }
11895 Some(Keyword::ESCAPE) => {
11896 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
11898 }
11899 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
11900 CopyLegacyCsvOption::ForceNotNull(
11901 self.parse_comma_separated(|p| p.parse_identifier())?,
11902 )
11903 }
11904 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
11905 CopyLegacyCsvOption::ForceQuote(
11906 self.parse_comma_separated(|p| p.parse_identifier())?,
11907 )
11908 }
11909 _ => self.expected_ref("csv option", self.peek_token_ref())?,
11910 };
11911 Ok(ret)
11912 }
11913
11914 fn parse_literal_char(&mut self) -> Result<char, ParserError> {
11915 let s = self.parse_literal_string()?;
11916 if s.len() != 1 {
11917 let loc = self
11918 .tokens
11919 .get(self.index - 1)
11920 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
11921 return parser_err!(format!("Expect a char, found {s:?}"), loc);
11922 }
11923 Ok(s.chars().next().unwrap())
11924 }
11925
11926 pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
11929 self.parse_tab_value()
11930 }
11931
11932 pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
11934 let mut values = vec![];
11935 let mut content = String::new();
11936 while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
11937 match t {
11938 Token::Whitespace(Whitespace::Tab) => {
11939 values.push(Some(core::mem::take(&mut content)));
11940 }
11941 Token::Whitespace(Whitespace::Newline) => {
11942 values.push(Some(core::mem::take(&mut content)));
11943 }
11944 Token::Backslash => {
11945 if self.consume_token(&Token::Period) {
11946 return values;
11947 }
11948 if let Token::Word(w) = self.next_token().token {
11949 if w.value == "N" {
11950 values.push(None);
11951 }
11952 }
11953 }
11954 _ => {
11955 content.push_str(&t.to_string());
11956 }
11957 }
11958 }
11959 values
11960 }
11961
11962 pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
11964 let next_token = self.next_token();
11965 let span = next_token.span;
11966 let ok_value = |value: Value| Ok(value.with_span(span));
11967 match next_token.token {
11968 Token::Word(w) => match w.keyword {
11969 Keyword::TRUE if self.dialect.supports_boolean_literals() => {
11970 ok_value(Value::Boolean(true))
11971 }
11972 Keyword::FALSE if self.dialect.supports_boolean_literals() => {
11973 ok_value(Value::Boolean(false))
11974 }
11975 Keyword::NULL => ok_value(Value::Null),
11976 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
11977 Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
11978 Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
11979 _ => self.expected(
11980 "A value?",
11981 TokenWithSpan {
11982 token: Token::Word(w),
11983 span,
11984 },
11985 )?,
11986 },
11987 _ => self.expected(
11988 "a concrete value",
11989 TokenWithSpan {
11990 token: Token::Word(w),
11991 span,
11992 },
11993 ),
11994 },
11995 Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
11999 Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12000 self.maybe_concat_string_literal(s.to_string()),
12001 )),
12002 Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12003 self.maybe_concat_string_literal(s.to_string()),
12004 )),
12005 Token::TripleSingleQuotedString(ref s) => {
12006 ok_value(Value::TripleSingleQuotedString(s.to_string()))
12007 }
12008 Token::TripleDoubleQuotedString(ref s) => {
12009 ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12010 }
12011 Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12012 Token::SingleQuotedByteStringLiteral(ref s) => {
12013 ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12014 }
12015 Token::DoubleQuotedByteStringLiteral(ref s) => {
12016 ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12017 }
12018 Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12019 ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12020 }
12021 Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12022 ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12023 }
12024 Token::SingleQuotedRawStringLiteral(ref s) => {
12025 ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12026 }
12027 Token::DoubleQuotedRawStringLiteral(ref s) => {
12028 ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12029 }
12030 Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12031 ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12032 }
12033 Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12034 ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12035 }
12036 Token::NationalStringLiteral(ref s) => {
12037 ok_value(Value::NationalStringLiteral(s.to_string()))
12038 }
12039 Token::QuoteDelimitedStringLiteral(v) => {
12040 ok_value(Value::QuoteDelimitedStringLiteral(v))
12041 }
12042 Token::NationalQuoteDelimitedStringLiteral(v) => {
12043 ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12044 }
12045 Token::EscapedStringLiteral(ref s) => {
12046 ok_value(Value::EscapedStringLiteral(s.to_string()))
12047 }
12048 Token::UnicodeStringLiteral(ref s) => {
12049 ok_value(Value::UnicodeStringLiteral(s.to_string()))
12050 }
12051 Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12052 Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12053 tok @ Token::Colon | tok @ Token::AtSign => {
12054 let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12062 let ident = match next_token.token {
12063 Token::Word(w) => Ok(w.into_ident(next_token.span)),
12064 Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12065 _ => self.expected("placeholder", next_token),
12066 }?;
12067 Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12068 .with_span(Span::new(span.start, ident.span.end)))
12069 }
12070 unexpected => self.expected(
12071 "a value",
12072 TokenWithSpan {
12073 token: unexpected,
12074 span,
12075 },
12076 ),
12077 }
12078 }
12079
12080 fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12081 if self.dialect.supports_string_literal_concatenation() {
12082 while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12083 self.peek_token_ref().token
12084 {
12085 str.push_str(s);
12086 self.advance_token();
12087 }
12088 } else if self
12089 .dialect
12090 .supports_string_literal_concatenation_with_newline()
12091 {
12092 let mut after_newline = false;
12095 loop {
12096 match self.peek_token_no_skip().token {
12097 Token::Whitespace(Whitespace::Newline) => {
12098 after_newline = true;
12099 self.next_token_no_skip();
12100 }
12101 Token::Whitespace(_) => {
12102 self.next_token_no_skip();
12103 }
12104 Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12105 if after_newline =>
12106 {
12107 str.push_str(s.clone().as_str());
12108 self.next_token_no_skip();
12109 after_newline = false;
12110 }
12111 _ => break,
12112 }
12113 }
12114 }
12115
12116 str
12117 }
12118
12119 pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12121 let value_wrapper = self.parse_value()?;
12122 match &value_wrapper.value {
12123 Value::Number(_, _) => Ok(value_wrapper),
12124 Value::Placeholder(_) => Ok(value_wrapper),
12125 _ => {
12126 self.prev_token();
12127 self.expected_ref("literal number", self.peek_token_ref())
12128 }
12129 }
12130 }
12131
12132 pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12135 let next_token = self.next_token();
12136 match next_token.token {
12137 Token::Plus => Ok(Expr::UnaryOp {
12138 op: UnaryOperator::Plus,
12139 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12140 }),
12141 Token::Minus => Ok(Expr::UnaryOp {
12142 op: UnaryOperator::Minus,
12143 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12144 }),
12145 _ => {
12146 self.prev_token();
12147 Ok(Expr::Value(self.parse_number_value()?))
12148 }
12149 }
12150 }
12151
12152 fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12153 let next_token = self.next_token();
12154 let span = next_token.span;
12155 match next_token.token {
12156 Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12157 Value::SingleQuotedString(s.to_string()).with_span(span),
12158 )),
12159 Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12160 Value::DoubleQuotedString(s.to_string()).with_span(span),
12161 )),
12162 Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12163 Value::HexStringLiteral(s.to_string()).with_span(span),
12164 )),
12165 unexpected => self.expected(
12166 "a string value",
12167 TokenWithSpan {
12168 token: unexpected,
12169 span,
12170 },
12171 ),
12172 }
12173 }
12174
12175 pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12177 let next_token = self.next_token();
12178 match next_token.token {
12179 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12180 _ => self.expected("literal int", next_token),
12181 }
12182 }
12183
12184 fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12187 let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12188 let peek_token = parser.peek_token();
12189 let span = peek_token.span;
12190 match peek_token.token {
12191 Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12192 {
12193 parser.next_token();
12194 Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12195 }
12196 _ => Ok(Expr::Value(
12197 Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12198 )),
12199 }
12200 };
12201
12202 Ok(CreateFunctionBody::AsBeforeOptions {
12203 body: parse_string_expr(self)?,
12204 link_symbol: if self.consume_token(&Token::Comma) {
12205 Some(parse_string_expr(self)?)
12206 } else {
12207 None
12208 },
12209 })
12210 }
12211
12212 pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12214 let next_token = self.next_token();
12215 match next_token.token {
12216 Token::Word(Word {
12217 value,
12218 keyword: Keyword::NoKeyword,
12219 ..
12220 }) => Ok(value),
12221 Token::SingleQuotedString(s) => Ok(s),
12222 Token::DoubleQuotedString(s) => Ok(s),
12223 Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12224 Ok(s)
12225 }
12226 Token::UnicodeStringLiteral(s) => Ok(s),
12227 _ => self.expected("literal string", next_token),
12228 }
12229 }
12230
12231 pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12233 match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12234 Some(Keyword::TRUE) => Ok(true),
12235 Some(Keyword::FALSE) => Ok(false),
12236 _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12237 }
12238 }
12239
12240 pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12242 let neg = self.parse_keyword(Keyword::NOT);
12243 let normalized_form = self.maybe_parse(|parser| {
12244 match parser.parse_one_of_keywords(&[
12245 Keyword::NFC,
12246 Keyword::NFD,
12247 Keyword::NFKC,
12248 Keyword::NFKD,
12249 ]) {
12250 Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12251 Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12252 Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12253 Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12254 _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12255 }
12256 })?;
12257 if self.parse_keyword(Keyword::NORMALIZED) {
12258 return Ok(Expr::IsNormalized {
12259 expr: Box::new(expr),
12260 form: normalized_form,
12261 negated: neg,
12262 });
12263 }
12264 self.expected_ref("unicode normalization form", self.peek_token_ref())
12265 }
12266
12267 pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12269 self.expect_token(&Token::LParen)?;
12270 let values = self.parse_comma_separated(|parser| {
12271 let name = parser.parse_literal_string()?;
12272 let e = if parser.consume_token(&Token::Eq) {
12273 let value = parser.parse_number()?;
12274 EnumMember::NamedValue(name, value)
12275 } else {
12276 EnumMember::Name(name)
12277 };
12278 Ok(e)
12279 })?;
12280 self.expect_token(&Token::RParen)?;
12281
12282 Ok(values)
12283 }
12284
12285 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12287 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12288 if trailing_bracket.0 {
12289 return parser_err!(
12290 format!("unmatched > after parsing data type {ty}"),
12291 self.peek_token_ref()
12292 );
12293 }
12294
12295 Ok(ty)
12296 }
12297
12298 fn parse_data_type_helper(
12299 &mut self,
12300 ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12301 let dialect = self.dialect;
12302 self.advance_token();
12303 let next_token = self.get_current_token();
12304 let next_token_index = self.get_current_index();
12305
12306 let mut trailing_bracket: MatchedTrailingBracket = false.into();
12307 let mut data = match &next_token.token {
12308 Token::Word(w) => match w.keyword {
12309 Keyword::BOOLEAN => Ok(DataType::Boolean),
12310 Keyword::BOOL => Ok(DataType::Bool),
12311 Keyword::FLOAT => {
12312 let precision = self.parse_exact_number_optional_precision_scale()?;
12313
12314 if self.parse_keyword(Keyword::UNSIGNED) {
12315 Ok(DataType::FloatUnsigned(precision))
12316 } else {
12317 Ok(DataType::Float(precision))
12318 }
12319 }
12320 Keyword::REAL => {
12321 if self.parse_keyword(Keyword::UNSIGNED) {
12322 Ok(DataType::RealUnsigned)
12323 } else {
12324 Ok(DataType::Real)
12325 }
12326 }
12327 Keyword::FLOAT4 => Ok(DataType::Float4),
12328 Keyword::FLOAT32 => Ok(DataType::Float32),
12329 Keyword::FLOAT64 => Ok(DataType::Float64),
12330 Keyword::FLOAT8 => Ok(DataType::Float8),
12331 Keyword::DOUBLE => {
12332 if self.parse_keyword(Keyword::PRECISION) {
12333 if self.parse_keyword(Keyword::UNSIGNED) {
12334 Ok(DataType::DoublePrecisionUnsigned)
12335 } else {
12336 Ok(DataType::DoublePrecision)
12337 }
12338 } else {
12339 let precision = self.parse_exact_number_optional_precision_scale()?;
12340
12341 if self.parse_keyword(Keyword::UNSIGNED) {
12342 Ok(DataType::DoubleUnsigned(precision))
12343 } else {
12344 Ok(DataType::Double(precision))
12345 }
12346 }
12347 }
12348 Keyword::TINYINT => {
12349 let optional_precision = self.parse_optional_precision();
12350 if self.parse_keyword(Keyword::UNSIGNED) {
12351 Ok(DataType::TinyIntUnsigned(optional_precision?))
12352 } else {
12353 if dialect.supports_data_type_signed_suffix() {
12354 let _ = self.parse_keyword(Keyword::SIGNED);
12355 }
12356 Ok(DataType::TinyInt(optional_precision?))
12357 }
12358 }
12359 Keyword::INT2 => {
12360 let optional_precision = self.parse_optional_precision();
12361 if self.parse_keyword(Keyword::UNSIGNED) {
12362 Ok(DataType::Int2Unsigned(optional_precision?))
12363 } else {
12364 Ok(DataType::Int2(optional_precision?))
12365 }
12366 }
12367 Keyword::SMALLINT => {
12368 let optional_precision = self.parse_optional_precision();
12369 if self.parse_keyword(Keyword::UNSIGNED) {
12370 Ok(DataType::SmallIntUnsigned(optional_precision?))
12371 } else {
12372 if dialect.supports_data_type_signed_suffix() {
12373 let _ = self.parse_keyword(Keyword::SIGNED);
12374 }
12375 Ok(DataType::SmallInt(optional_precision?))
12376 }
12377 }
12378 Keyword::MEDIUMINT => {
12379 let optional_precision = self.parse_optional_precision();
12380 if self.parse_keyword(Keyword::UNSIGNED) {
12381 Ok(DataType::MediumIntUnsigned(optional_precision?))
12382 } else {
12383 if dialect.supports_data_type_signed_suffix() {
12384 let _ = self.parse_keyword(Keyword::SIGNED);
12385 }
12386 Ok(DataType::MediumInt(optional_precision?))
12387 }
12388 }
12389 Keyword::INT => {
12390 let optional_precision = self.parse_optional_precision();
12391 if self.parse_keyword(Keyword::UNSIGNED) {
12392 Ok(DataType::IntUnsigned(optional_precision?))
12393 } else {
12394 if dialect.supports_data_type_signed_suffix() {
12395 let _ = self.parse_keyword(Keyword::SIGNED);
12396 }
12397 Ok(DataType::Int(optional_precision?))
12398 }
12399 }
12400 Keyword::INT4 => {
12401 let optional_precision = self.parse_optional_precision();
12402 if self.parse_keyword(Keyword::UNSIGNED) {
12403 Ok(DataType::Int4Unsigned(optional_precision?))
12404 } else {
12405 Ok(DataType::Int4(optional_precision?))
12406 }
12407 }
12408 Keyword::INT8 => {
12409 let optional_precision = self.parse_optional_precision();
12410 if self.parse_keyword(Keyword::UNSIGNED) {
12411 Ok(DataType::Int8Unsigned(optional_precision?))
12412 } else {
12413 Ok(DataType::Int8(optional_precision?))
12414 }
12415 }
12416 Keyword::INT16 => Ok(DataType::Int16),
12417 Keyword::INT32 => Ok(DataType::Int32),
12418 Keyword::INT64 => Ok(DataType::Int64),
12419 Keyword::INT128 => Ok(DataType::Int128),
12420 Keyword::INT256 => Ok(DataType::Int256),
12421 Keyword::INTEGER => {
12422 let optional_precision = self.parse_optional_precision();
12423 if self.parse_keyword(Keyword::UNSIGNED) {
12424 Ok(DataType::IntegerUnsigned(optional_precision?))
12425 } else {
12426 if dialect.supports_data_type_signed_suffix() {
12427 let _ = self.parse_keyword(Keyword::SIGNED);
12428 }
12429 Ok(DataType::Integer(optional_precision?))
12430 }
12431 }
12432 Keyword::BIGINT => {
12433 let optional_precision = self.parse_optional_precision();
12434 if self.parse_keyword(Keyword::UNSIGNED) {
12435 Ok(DataType::BigIntUnsigned(optional_precision?))
12436 } else {
12437 if dialect.supports_data_type_signed_suffix() {
12438 let _ = self.parse_keyword(Keyword::SIGNED);
12439 }
12440 Ok(DataType::BigInt(optional_precision?))
12441 }
12442 }
12443 Keyword::HUGEINT => Ok(DataType::HugeInt),
12444 Keyword::UBIGINT => Ok(DataType::UBigInt),
12445 Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12446 Keyword::USMALLINT => Ok(DataType::USmallInt),
12447 Keyword::UTINYINT => Ok(DataType::UTinyInt),
12448 Keyword::UINT8 => Ok(DataType::UInt8),
12449 Keyword::UINT16 => Ok(DataType::UInt16),
12450 Keyword::UINT32 => Ok(DataType::UInt32),
12451 Keyword::UINT64 => Ok(DataType::UInt64),
12452 Keyword::UINT128 => Ok(DataType::UInt128),
12453 Keyword::UINT256 => Ok(DataType::UInt256),
12454 Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12455 Keyword::NVARCHAR => {
12456 Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12457 }
12458 Keyword::CHARACTER => {
12459 if self.parse_keyword(Keyword::VARYING) {
12460 Ok(DataType::CharacterVarying(
12461 self.parse_optional_character_length()?,
12462 ))
12463 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12464 Ok(DataType::CharacterLargeObject(
12465 self.parse_optional_precision()?,
12466 ))
12467 } else {
12468 Ok(DataType::Character(self.parse_optional_character_length()?))
12469 }
12470 }
12471 Keyword::CHAR => {
12472 if self.parse_keyword(Keyword::VARYING) {
12473 Ok(DataType::CharVarying(
12474 self.parse_optional_character_length()?,
12475 ))
12476 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12477 Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12478 } else {
12479 Ok(DataType::Char(self.parse_optional_character_length()?))
12480 }
12481 }
12482 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12483 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12484 Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12485 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12486 Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12487 Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12488 Keyword::LONGBLOB => Ok(DataType::LongBlob),
12489 Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12490 Ok(DataType::BigInt(None))
12491 }
12492 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12493 Keyword::BIT => {
12494 if self.parse_keyword(Keyword::VARYING) {
12495 Ok(DataType::BitVarying(self.parse_optional_precision()?))
12496 } else {
12497 Ok(DataType::Bit(self.parse_optional_precision()?))
12498 }
12499 }
12500 Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12501 Keyword::UUID => Ok(DataType::Uuid),
12502 Keyword::DATE => Ok(DataType::Date),
12503 Keyword::DATE32 => Ok(DataType::Date32),
12504 Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12505 Keyword::DATETIME64 => {
12506 self.prev_token();
12507 let (precision, time_zone) = self.parse_datetime_64()?;
12508 Ok(DataType::Datetime64(precision, time_zone))
12509 }
12510 Keyword::TIMESTAMP => {
12511 let precision = self.parse_optional_precision()?;
12512 let tz = if self.parse_keyword(Keyword::WITH) {
12513 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12514 TimezoneInfo::WithTimeZone
12515 } else if self.parse_keyword(Keyword::WITHOUT) {
12516 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12517 TimezoneInfo::WithoutTimeZone
12518 } else {
12519 TimezoneInfo::None
12520 };
12521 Ok(DataType::Timestamp(precision, tz))
12522 }
12523 Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
12524 self.parse_optional_precision()?,
12525 TimezoneInfo::Tz,
12526 )),
12527 Keyword::TIMESTAMP_NTZ => {
12528 Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
12529 }
12530 Keyword::TIME => {
12531 let precision = self.parse_optional_precision()?;
12532 let tz = if self.parse_keyword(Keyword::WITH) {
12533 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12534 TimezoneInfo::WithTimeZone
12535 } else if self.parse_keyword(Keyword::WITHOUT) {
12536 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12537 TimezoneInfo::WithoutTimeZone
12538 } else {
12539 TimezoneInfo::None
12540 };
12541 Ok(DataType::Time(precision, tz))
12542 }
12543 Keyword::TIMETZ => Ok(DataType::Time(
12544 self.parse_optional_precision()?,
12545 TimezoneInfo::Tz,
12546 )),
12547 Keyword::INTERVAL => {
12548 if self.dialect.supports_interval_options() {
12549 let fields = self.maybe_parse_optional_interval_fields()?;
12550 let precision = self.parse_optional_precision()?;
12551 Ok(DataType::Interval { fields, precision })
12552 } else {
12553 Ok(DataType::Interval {
12554 fields: None,
12555 precision: None,
12556 })
12557 }
12558 }
12559 Keyword::JSON => Ok(DataType::JSON),
12560 Keyword::JSONB => Ok(DataType::JSONB),
12561 Keyword::REGCLASS => Ok(DataType::Regclass),
12562 Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
12563 Keyword::FIXEDSTRING => {
12564 self.expect_token(&Token::LParen)?;
12565 let character_length = self.parse_literal_uint()?;
12566 self.expect_token(&Token::RParen)?;
12567 Ok(DataType::FixedString(character_length))
12568 }
12569 Keyword::TEXT => {
12570 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12571 Ok(DataType::Custom(
12572 ObjectName::from(vec![Ident::new("TEXT")]),
12573 modifiers,
12574 ))
12575 } else {
12576 Ok(DataType::Text)
12577 }
12578 }
12579 Keyword::TINYTEXT => Ok(DataType::TinyText),
12580 Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
12581 Keyword::LONGTEXT => Ok(DataType::LongText),
12582 Keyword::BYTEA => Ok(DataType::Bytea),
12583 Keyword::NUMERIC => Ok(DataType::Numeric(
12584 self.parse_exact_number_optional_precision_scale()?,
12585 )),
12586 Keyword::DECIMAL => {
12587 let precision = self.parse_exact_number_optional_precision_scale()?;
12588
12589 if self.parse_keyword(Keyword::UNSIGNED) {
12590 Ok(DataType::DecimalUnsigned(precision))
12591 } else {
12592 Ok(DataType::Decimal(precision))
12593 }
12594 }
12595 Keyword::DEC => {
12596 let precision = self.parse_exact_number_optional_precision_scale()?;
12597
12598 if self.parse_keyword(Keyword::UNSIGNED) {
12599 Ok(DataType::DecUnsigned(precision))
12600 } else {
12601 Ok(DataType::Dec(precision))
12602 }
12603 }
12604 Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
12605 self.parse_exact_number_optional_precision_scale()?,
12606 )),
12607 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
12608 self.parse_exact_number_optional_precision_scale()?,
12609 )),
12610 Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
12611 Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
12612 Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
12613 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
12614 Keyword::ARRAY => {
12615 if self.dialect.supports_array_typedef_without_element_type() {
12616 Ok(DataType::Array(ArrayElemTypeDef::None))
12617 } else if dialect_of!(self is ClickHouseDialect) {
12618 Ok(self.parse_sub_type(|internal_type| {
12619 DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
12620 })?)
12621 } else {
12622 self.expect_token(&Token::Lt)?;
12623 let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
12624 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12625 Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
12626 inside_type,
12627 ))))
12628 }
12629 }
12630 Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
12631 self.prev_token();
12632 let field_defs = self.parse_duckdb_struct_type_def()?;
12633 Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
12634 }
12635 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
12636 self.prev_token();
12637 let (field_defs, _trailing_bracket) =
12638 self.parse_struct_type_def(Self::parse_struct_field_def)?;
12639 trailing_bracket = _trailing_bracket;
12640 Ok(DataType::Struct(
12641 field_defs,
12642 StructBracketKind::AngleBrackets,
12643 ))
12644 }
12645 Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
12646 self.prev_token();
12647 let fields = self.parse_union_type_def()?;
12648 Ok(DataType::Union(fields))
12649 }
12650 Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12651 Ok(self.parse_sub_type(DataType::Nullable)?)
12652 }
12653 Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12654 Ok(self.parse_sub_type(DataType::LowCardinality)?)
12655 }
12656 Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
12657 self.expect_token(&Token::Lt)?;
12658 let key_data_type = self.parse_data_type()?;
12659 self.expect_token(&Token::Comma)?;
12660 let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
12661 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12662 Ok(DataType::Map(
12663 Box::new(key_data_type),
12664 Box::new(value_data_type),
12665 ))
12666 }
12667 Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12668 self.prev_token();
12669 let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
12670 Ok(DataType::Map(
12671 Box::new(key_data_type),
12672 Box::new(value_data_type),
12673 ))
12674 }
12675 Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12676 self.expect_token(&Token::LParen)?;
12677 let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
12678 self.expect_token(&Token::RParen)?;
12679 Ok(DataType::Nested(field_defs))
12680 }
12681 Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12682 self.prev_token();
12683 let field_defs = self.parse_click_house_tuple_def()?;
12684 Ok(DataType::Tuple(field_defs))
12685 }
12686 Keyword::TRIGGER => Ok(DataType::Trigger),
12687 Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
12688 let _ = self.parse_keyword(Keyword::TYPE);
12689 Ok(DataType::AnyType)
12690 }
12691 Keyword::TABLE => {
12692 if self.peek_token_ref().token == Token::LParen {
12695 let columns = self.parse_returns_table_columns()?;
12696 Ok(DataType::Table(Some(columns)))
12697 } else {
12698 Ok(DataType::Table(None))
12699 }
12700 }
12701 Keyword::SIGNED => {
12702 if self.parse_keyword(Keyword::INTEGER) {
12703 Ok(DataType::SignedInteger)
12704 } else {
12705 Ok(DataType::Signed)
12706 }
12707 }
12708 Keyword::UNSIGNED => {
12709 if self.parse_keyword(Keyword::INTEGER) {
12710 Ok(DataType::UnsignedInteger)
12711 } else {
12712 Ok(DataType::Unsigned)
12713 }
12714 }
12715 Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12716 Ok(DataType::TsVector)
12717 }
12718 Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12719 Ok(DataType::TsQuery)
12720 }
12721 _ => {
12722 self.prev_token();
12723 let type_name = self.parse_object_name(false)?;
12724 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12725 Ok(DataType::Custom(type_name, modifiers))
12726 } else {
12727 Ok(DataType::Custom(type_name, vec![]))
12728 }
12729 }
12730 },
12731 _ => self.expected_at("a data type name", next_token_index),
12732 }?;
12733
12734 if self.dialect.supports_array_typedef_with_brackets() {
12735 while self.consume_token(&Token::LBracket) {
12736 let size = self.maybe_parse(|p| p.parse_literal_uint())?;
12738 self.expect_token(&Token::RBracket)?;
12739 data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
12740 }
12741 }
12742 Ok((data, trailing_bracket))
12743 }
12744
12745 fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
12746 self.parse_column_def()
12747 }
12748
12749 fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
12750 self.expect_token(&Token::LParen)?;
12751 let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
12752 self.expect_token(&Token::RParen)?;
12753 Ok(columns)
12754 }
12755
12756 pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
12758 self.expect_token(&Token::LParen)?;
12759 let mut values = Vec::new();
12760 loop {
12761 let next_token = self.next_token();
12762 match next_token.token {
12763 Token::SingleQuotedString(value) => values.push(value),
12764 _ => self.expected("a string", next_token)?,
12765 }
12766 let next_token = self.next_token();
12767 match next_token.token {
12768 Token::Comma => (),
12769 Token::RParen => break,
12770 _ => self.expected(", or }", next_token)?,
12771 }
12772 }
12773 Ok(values)
12774 }
12775
12776 pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12778 let ident = self.parse_identifier()?;
12779 self.expect_keyword_is(Keyword::AS)?;
12780 let alias = self.parse_identifier()?;
12781 Ok(IdentWithAlias { ident, alias })
12782 }
12783
12784 fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12786 let ident = self.parse_identifier()?;
12787 let _after_as = self.parse_keyword(Keyword::AS);
12788 let alias = self.parse_identifier()?;
12789 Ok(IdentWithAlias { ident, alias })
12790 }
12791
12792 fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
12794 self.parse_comma_separated(|parser| {
12795 parser.expect_token(&Token::LParen)?;
12796 let query = parser.parse_query()?;
12797 parser.expect_token(&Token::RParen)?;
12798 Ok(*query)
12799 })
12800 }
12801
12802 fn parse_distinct_required_set_quantifier(
12804 &mut self,
12805 operator_name: &str,
12806 ) -> Result<SetQuantifier, ParserError> {
12807 let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
12808 match quantifier {
12809 SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
12810 _ => Err(ParserError::ParserError(format!(
12811 "{operator_name} pipe operator requires DISTINCT modifier",
12812 ))),
12813 }
12814 }
12815
12816 fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12818 if self.parse_keyword(Keyword::AS) {
12819 Ok(Some(self.parse_identifier()?))
12820 } else {
12821 self.maybe_parse(|parser| parser.parse_identifier())
12823 }
12824 }
12825
12826 fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12828 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12829 parser.dialect.is_select_item_alias(explicit, kw, parser)
12830 }
12831 self.parse_optional_alias_inner(None, validator)
12832 }
12833
12834 pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
12838 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12839 parser.dialect.is_table_factor_alias(explicit, kw, parser)
12840 }
12841 let explicit = self.peek_keyword(Keyword::AS);
12842 match self.parse_optional_alias_inner(None, validator)? {
12843 Some(name) => {
12844 let columns = self.parse_table_alias_column_defs()?;
12845 let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
12846 Some(self.parse_identifier()?)
12847 } else {
12848 None
12849 };
12850 Ok(Some(TableAlias {
12851 explicit,
12852 name,
12853 columns,
12854 at,
12855 }))
12856 }
12857 None => Ok(None),
12858 }
12859 }
12860
12861 fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
12862 let mut hints = vec![];
12863 while let Some(hint_type) =
12864 self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
12865 {
12866 let hint_type = match hint_type {
12867 Keyword::USE => TableIndexHintType::Use,
12868 Keyword::IGNORE => TableIndexHintType::Ignore,
12869 Keyword::FORCE => TableIndexHintType::Force,
12870 _ => {
12871 return self.expected_ref(
12872 "expected to match USE/IGNORE/FORCE keyword",
12873 self.peek_token_ref(),
12874 )
12875 }
12876 };
12877 let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
12878 Some(Keyword::INDEX) => TableIndexType::Index,
12879 Some(Keyword::KEY) => TableIndexType::Key,
12880 _ => {
12881 return self
12882 .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
12883 }
12884 };
12885 let for_clause = if self.parse_keyword(Keyword::FOR) {
12886 let clause = if self.parse_keyword(Keyword::JOIN) {
12887 TableIndexHintForClause::Join
12888 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
12889 TableIndexHintForClause::OrderBy
12890 } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
12891 TableIndexHintForClause::GroupBy
12892 } else {
12893 return self.expected_ref(
12894 "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
12895 self.peek_token_ref(),
12896 );
12897 };
12898 Some(clause)
12899 } else {
12900 None
12901 };
12902
12903 self.expect_token(&Token::LParen)?;
12904 let index_names = if self.peek_token_ref().token != Token::RParen {
12905 self.parse_comma_separated(Parser::parse_identifier)?
12906 } else {
12907 vec![]
12908 };
12909 self.expect_token(&Token::RParen)?;
12910 hints.push(TableIndexHints {
12911 hint_type,
12912 index_type,
12913 for_clause,
12914 index_names,
12915 });
12916 }
12917 Ok(hints)
12918 }
12919
12920 pub fn parse_optional_alias(
12924 &mut self,
12925 reserved_kwds: &[Keyword],
12926 ) -> Result<Option<Ident>, ParserError> {
12927 fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
12928 false
12929 }
12930 self.parse_optional_alias_inner(Some(reserved_kwds), validator)
12931 }
12932
12933 fn parse_optional_alias_inner<F>(
12940 &mut self,
12941 reserved_kwds: Option<&[Keyword]>,
12942 validator: F,
12943 ) -> Result<Option<Ident>, ParserError>
12944 where
12945 F: Fn(bool, &Keyword, &mut Parser) -> bool,
12946 {
12947 let after_as = self.parse_keyword(Keyword::AS);
12948
12949 let next_token = self.next_token();
12950 match next_token.token {
12951 Token::Word(w)
12954 if reserved_kwds.is_some()
12955 && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
12956 {
12957 Ok(Some(w.into_ident(next_token.span)))
12958 }
12959 Token::Word(w) if validator(after_as, &w.keyword, self) => {
12963 Ok(Some(w.into_ident(next_token.span)))
12964 }
12965 Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
12967 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
12968 _ => {
12969 if after_as {
12970 return self.expected("an identifier after AS", next_token);
12971 }
12972 self.prev_token();
12973 Ok(None) }
12975 }
12976 }
12977
12978 pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
12980 if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
12981 let expressions = if self.parse_keyword(Keyword::ALL) {
12982 None
12983 } else {
12984 Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
12985 };
12986
12987 let mut modifiers = vec![];
12988 if self.dialect.supports_group_by_with_modifier() {
12989 loop {
12990 if !self.parse_keyword(Keyword::WITH) {
12991 break;
12992 }
12993 let keyword = self.expect_one_of_keywords(&[
12994 Keyword::ROLLUP,
12995 Keyword::CUBE,
12996 Keyword::TOTALS,
12997 ])?;
12998 modifiers.push(match keyword {
12999 Keyword::ROLLUP => GroupByWithModifier::Rollup,
13000 Keyword::CUBE => GroupByWithModifier::Cube,
13001 Keyword::TOTALS => GroupByWithModifier::Totals,
13002 _ => {
13003 return parser_err!(
13004 "BUG: expected to match GroupBy modifier keyword",
13005 self.peek_token_ref().span.start
13006 )
13007 }
13008 });
13009 }
13010 }
13011 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13012 self.expect_token(&Token::LParen)?;
13013 let result = self.parse_comma_separated(|p| {
13014 if p.peek_token_ref().token == Token::LParen {
13015 p.parse_tuple(true, true)
13016 } else {
13017 Ok(vec![p.parse_expr()?])
13018 }
13019 })?;
13020 self.expect_token(&Token::RParen)?;
13021 modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13022 result,
13023 )));
13024 };
13025 let group_by = match expressions {
13026 None => GroupByExpr::All(modifiers),
13027 Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13028 };
13029 Ok(Some(group_by))
13030 } else {
13031 Ok(None)
13032 }
13033 }
13034
13035 pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13037 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13038 let order_by =
13039 if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13040 let order_by_options = self.parse_order_by_options()?;
13041 OrderBy {
13042 kind: OrderByKind::All(order_by_options),
13043 interpolate: None,
13044 }
13045 } else {
13046 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13047 let interpolate = if self.dialect.supports_interpolate() {
13048 self.parse_interpolations()?
13049 } else {
13050 None
13051 };
13052 OrderBy {
13053 kind: OrderByKind::Expressions(exprs),
13054 interpolate,
13055 }
13056 };
13057 Ok(Some(order_by))
13058 } else {
13059 Ok(None)
13060 }
13061 }
13062
13063 fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13064 let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13065 Some(self.parse_offset()?)
13066 } else {
13067 None
13068 };
13069
13070 let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13071 let expr = self.parse_limit()?;
13072
13073 if self.dialect.supports_limit_comma()
13074 && offset.is_none()
13075 && expr.is_some() && self.consume_token(&Token::Comma)
13077 {
13078 let offset = expr.ok_or_else(|| {
13079 ParserError::ParserError(
13080 "Missing offset for LIMIT <offset>, <limit>".to_string(),
13081 )
13082 })?;
13083 return Ok(Some(LimitClause::OffsetCommaLimit {
13084 offset,
13085 limit: self.parse_expr()?,
13086 }));
13087 }
13088
13089 let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13090 Some(self.parse_comma_separated(Parser::parse_expr)?)
13091 } else {
13092 None
13093 };
13094
13095 (Some(expr), limit_by)
13096 } else {
13097 (None, None)
13098 };
13099
13100 if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13101 offset = Some(self.parse_offset()?);
13102 }
13103
13104 if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13105 Ok(Some(LimitClause::LimitOffset {
13106 limit: limit.unwrap_or_default(),
13107 offset,
13108 limit_by: limit_by.unwrap_or_default(),
13109 }))
13110 } else {
13111 Ok(None)
13112 }
13113 }
13114
13115 pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13118 if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13119 let fn_name = self.parse_object_name(false)?;
13120 self.parse_function_call(fn_name)
13121 .map(TableObject::TableFunction)
13122 } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13123 self.parse_parenthesized(|p| p.parse_query())
13124 .map(TableObject::TableQuery)
13125 } else {
13126 self.parse_object_name(false).map(TableObject::TableName)
13127 }
13128 }
13129
13130 pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13137 self.parse_object_name_inner(in_table_clause, false)
13138 }
13139
13140 fn parse_object_name_inner(
13150 &mut self,
13151 in_table_clause: bool,
13152 allow_wildcards: bool,
13153 ) -> Result<ObjectName, ParserError> {
13154 let mut parts = vec![];
13155 if dialect_of!(self is BigQueryDialect) && in_table_clause {
13156 loop {
13157 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13158 parts.push(ObjectNamePart::Identifier(ident));
13159 if !self.consume_token(&Token::Period) && !end_with_period {
13160 break;
13161 }
13162 }
13163 } else {
13164 loop {
13165 if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13166 let span = self.next_token().span;
13167 parts.push(ObjectNamePart::Identifier(Ident {
13168 value: Token::Mul.to_string(),
13169 quote_style: None,
13170 span,
13171 }));
13172 } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13173 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13174 parts.push(ObjectNamePart::Identifier(ident));
13175 if !self.consume_token(&Token::Period) && !end_with_period {
13176 break;
13177 }
13178 } else if self.dialect.supports_object_name_double_dot_notation()
13179 && parts.len() == 1
13180 && matches!(self.peek_token_ref().token, Token::Period)
13181 {
13182 parts.push(ObjectNamePart::Identifier(Ident::new("")));
13184 } else {
13185 let ident = self.parse_identifier()?;
13186 let part = if self
13187 .dialect
13188 .is_identifier_generating_function_name(&ident, &parts)
13189 {
13190 self.expect_token(&Token::LParen)?;
13191 let args: Vec<FunctionArg> =
13192 self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13193 self.expect_token(&Token::RParen)?;
13194 ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13195 } else {
13196 ObjectNamePart::Identifier(ident)
13197 };
13198 parts.push(part);
13199 }
13200
13201 if !self.consume_token(&Token::Period) {
13202 break;
13203 }
13204 }
13205 }
13206
13207 if dialect_of!(self is BigQueryDialect)
13210 && parts.iter().any(|part| {
13211 part.as_ident()
13212 .is_some_and(|ident| ident.value.contains('.'))
13213 })
13214 {
13215 parts = parts
13216 .into_iter()
13217 .flat_map(|part| match part.as_ident() {
13218 Some(ident) => ident
13219 .value
13220 .split('.')
13221 .map(|value| {
13222 ObjectNamePart::Identifier(Ident {
13223 value: value.into(),
13224 quote_style: ident.quote_style,
13225 span: ident.span,
13226 })
13227 })
13228 .collect::<Vec<_>>(),
13229 None => vec![part],
13230 })
13231 .collect()
13232 }
13233
13234 Ok(ObjectName(parts))
13235 }
13236
13237 pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13239 let mut idents = vec![];
13240 loop {
13241 let token = self.peek_token_ref();
13242 match &token.token {
13243 Token::Word(w) => {
13244 idents.push(w.to_ident(token.span));
13245 }
13246 Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13247 break
13248 }
13249 _ => {}
13250 }
13251 self.advance_token();
13252 }
13253 Ok(idents)
13254 }
13255
13256 pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13296 let mut idents = vec![];
13297
13298 let next_token = self.next_token();
13300 match next_token.token {
13301 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13302 Token::EOF => {
13303 return Err(ParserError::ParserError(
13304 "Empty input when parsing identifier".to_string(),
13305 ))?
13306 }
13307 token => {
13308 return Err(ParserError::ParserError(format!(
13309 "Unexpected token in identifier: {token}"
13310 )))?
13311 }
13312 };
13313
13314 loop {
13316 match self.next_token().token {
13317 Token::Period => {
13319 let next_token = self.next_token();
13320 match next_token.token {
13321 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13322 Token::EOF => {
13323 return Err(ParserError::ParserError(
13324 "Trailing period in identifier".to_string(),
13325 ))?
13326 }
13327 token => {
13328 return Err(ParserError::ParserError(format!(
13329 "Unexpected token following period in identifier: {token}"
13330 )))?
13331 }
13332 }
13333 }
13334 Token::EOF => break,
13335 token => {
13336 return Err(ParserError::ParserError(format!(
13337 "Unexpected token in identifier: {token}"
13338 )))?;
13339 }
13340 }
13341 }
13342
13343 Ok(idents)
13344 }
13345
13346 pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13348 let next_token = self.next_token();
13349 match next_token.token {
13350 Token::Word(w) => Ok(w.into_ident(next_token.span)),
13351 Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13352 Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13353 _ => self.expected("identifier", next_token),
13354 }
13355 }
13356
13357 fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13368 match self.peek_token().token {
13369 Token::Word(w) => {
13370 let quote_style_is_none = w.quote_style.is_none();
13371 let mut requires_whitespace = false;
13372 let mut ident = w.into_ident(self.next_token().span);
13373 if quote_style_is_none {
13374 while matches!(self.peek_token_no_skip().token, Token::Minus) {
13375 self.next_token();
13376 ident.value.push('-');
13377
13378 let token = self
13379 .next_token_no_skip()
13380 .cloned()
13381 .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13382 requires_whitespace = match token.token {
13383 Token::Word(next_word) if next_word.quote_style.is_none() => {
13384 ident.value.push_str(&next_word.value);
13385 false
13386 }
13387 Token::Number(s, false) => {
13388 if s.ends_with('.') {
13395 let Some(s) = s.split('.').next().filter(|s| {
13396 !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13397 }) else {
13398 return self.expected(
13399 "continuation of hyphenated identifier",
13400 TokenWithSpan::new(Token::Number(s, false), token.span),
13401 );
13402 };
13403 ident.value.push_str(s);
13404 return Ok((ident, true));
13405 } else {
13406 ident.value.push_str(&s);
13407 }
13408 !matches!(self.peek_token_ref().token, Token::Period)
13411 }
13412 _ => {
13413 return self
13414 .expected("continuation of hyphenated identifier", token);
13415 }
13416 }
13417 }
13418
13419 if requires_whitespace {
13422 let token = self.next_token();
13423 if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13424 return self
13425 .expected("whitespace following hyphenated identifier", token);
13426 }
13427 }
13428 }
13429 Ok((ident, false))
13430 }
13431 _ => Ok((self.parse_identifier()?, false)),
13432 }
13433 }
13434
13435 fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13437 if self.consume_token(&Token::LParen) {
13438 if self.peek_token_ref().token == Token::RParen {
13439 self.next_token();
13440 Ok(vec![])
13441 } else {
13442 let cols = self.parse_comma_separated_with_trailing_commas(
13443 Parser::parse_view_column,
13444 self.dialect.supports_column_definition_trailing_commas(),
13445 Self::is_reserved_for_column_alias,
13446 )?;
13447 self.expect_token(&Token::RParen)?;
13448 Ok(cols)
13449 }
13450 } else {
13451 Ok(vec![])
13452 }
13453 }
13454
13455 fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13457 let name = self.parse_identifier()?;
13458 let options = self.parse_view_column_options()?;
13459 let data_type = if dialect_of!(self is ClickHouseDialect) {
13460 Some(self.parse_data_type()?)
13461 } else {
13462 None
13463 };
13464 Ok(ViewColumnDef {
13465 name,
13466 data_type,
13467 options,
13468 })
13469 }
13470
13471 fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13472 let mut options = Vec::new();
13473 loop {
13474 let option = self.parse_optional_column_option()?;
13475 if let Some(option) = option {
13476 options.push(option);
13477 } else {
13478 break;
13479 }
13480 }
13481 if options.is_empty() {
13482 Ok(None)
13483 } else if self.dialect.supports_space_separated_column_options() {
13484 Ok(Some(ColumnOptions::SpaceSeparated(options)))
13485 } else {
13486 Ok(Some(ColumnOptions::CommaSeparated(options)))
13487 }
13488 }
13489
13490 pub fn parse_parenthesized_column_list(
13493 &mut self,
13494 optional: IsOptional,
13495 allow_empty: bool,
13496 ) -> Result<Vec<Ident>, ParserError> {
13497 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
13498 }
13499
13500 pub fn parse_parenthesized_compound_identifier_list(
13502 &mut self,
13503 optional: IsOptional,
13504 allow_empty: bool,
13505 ) -> Result<Vec<Expr>, ParserError> {
13506 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13507 Ok(Expr::CompoundIdentifier(
13508 p.parse_period_separated(|p| p.parse_identifier())?,
13509 ))
13510 })
13511 }
13512
13513 fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
13516 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
13517 p.parse_create_index_expr()
13518 })
13519 }
13520
13521 pub fn parse_parenthesized_qualified_column_list(
13524 &mut self,
13525 optional: IsOptional,
13526 allow_empty: bool,
13527 ) -> Result<Vec<ObjectName>, ParserError> {
13528 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13529 p.parse_object_name(true)
13530 })
13531 }
13532
13533 fn parse_parenthesized_column_list_inner<F, T>(
13536 &mut self,
13537 optional: IsOptional,
13538 allow_empty: bool,
13539 mut f: F,
13540 ) -> Result<Vec<T>, ParserError>
13541 where
13542 F: FnMut(&mut Parser) -> Result<T, ParserError>,
13543 {
13544 if self.consume_token(&Token::LParen) {
13545 if allow_empty && self.peek_token_ref().token == Token::RParen {
13546 self.next_token();
13547 Ok(vec![])
13548 } else {
13549 let cols = self.parse_comma_separated(|p| f(p))?;
13550 self.expect_token(&Token::RParen)?;
13551 Ok(cols)
13552 }
13553 } else if optional == Optional {
13554 Ok(vec![])
13555 } else {
13556 self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
13557 }
13558 }
13559
13560 fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
13562 if self.consume_token(&Token::LParen) {
13563 let cols = self.parse_comma_separated(|p| {
13564 let name = p.parse_identifier()?;
13565 let data_type = p.maybe_parse(|p| p.parse_data_type())?;
13566 Ok(TableAliasColumnDef { name, data_type })
13567 })?;
13568 self.expect_token(&Token::RParen)?;
13569 Ok(cols)
13570 } else {
13571 Ok(vec![])
13572 }
13573 }
13574
13575 pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
13577 self.expect_token(&Token::LParen)?;
13578 let n = self.parse_literal_uint()?;
13579 self.expect_token(&Token::RParen)?;
13580 Ok(n)
13581 }
13582
13583 pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
13585 if self.consume_token(&Token::LParen) {
13586 let n = self.parse_literal_uint()?;
13587 self.expect_token(&Token::RParen)?;
13588 Ok(Some(n))
13589 } else {
13590 Ok(None)
13591 }
13592 }
13593
13594 fn maybe_parse_optional_interval_fields(
13595 &mut self,
13596 ) -> Result<Option<IntervalFields>, ParserError> {
13597 match self.parse_one_of_keywords(&[
13598 Keyword::YEAR,
13600 Keyword::DAY,
13601 Keyword::HOUR,
13602 Keyword::MINUTE,
13603 Keyword::MONTH,
13605 Keyword::SECOND,
13606 ]) {
13607 Some(Keyword::YEAR) => {
13608 if self.peek_keyword(Keyword::TO) {
13609 self.expect_keyword(Keyword::TO)?;
13610 self.expect_keyword(Keyword::MONTH)?;
13611 Ok(Some(IntervalFields::YearToMonth))
13612 } else {
13613 Ok(Some(IntervalFields::Year))
13614 }
13615 }
13616 Some(Keyword::DAY) => {
13617 if self.peek_keyword(Keyword::TO) {
13618 self.expect_keyword(Keyword::TO)?;
13619 match self.expect_one_of_keywords(&[
13620 Keyword::HOUR,
13621 Keyword::MINUTE,
13622 Keyword::SECOND,
13623 ])? {
13624 Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
13625 Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
13626 Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
13627 _ => {
13628 self.prev_token();
13629 self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
13630 }
13631 }
13632 } else {
13633 Ok(Some(IntervalFields::Day))
13634 }
13635 }
13636 Some(Keyword::HOUR) => {
13637 if self.peek_keyword(Keyword::TO) {
13638 self.expect_keyword(Keyword::TO)?;
13639 match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
13640 Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
13641 Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
13642 _ => {
13643 self.prev_token();
13644 self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
13645 }
13646 }
13647 } else {
13648 Ok(Some(IntervalFields::Hour))
13649 }
13650 }
13651 Some(Keyword::MINUTE) => {
13652 if self.peek_keyword(Keyword::TO) {
13653 self.expect_keyword(Keyword::TO)?;
13654 self.expect_keyword(Keyword::SECOND)?;
13655 Ok(Some(IntervalFields::MinuteToSecond))
13656 } else {
13657 Ok(Some(IntervalFields::Minute))
13658 }
13659 }
13660 Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
13661 Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
13662 Some(_) => {
13663 self.prev_token();
13664 self.expected_ref(
13665 "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
13666 self.peek_token_ref(),
13667 )
13668 }
13669 None => Ok(None),
13670 }
13671 }
13672
13673 pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
13681 self.expect_keyword_is(Keyword::DATETIME64)?;
13682 self.expect_token(&Token::LParen)?;
13683 let precision = self.parse_literal_uint()?;
13684 let time_zone = if self.consume_token(&Token::Comma) {
13685 Some(self.parse_literal_string()?)
13686 } else {
13687 None
13688 };
13689 self.expect_token(&Token::RParen)?;
13690 Ok((precision, time_zone))
13691 }
13692
13693 pub fn parse_optional_character_length(
13695 &mut self,
13696 ) -> Result<Option<CharacterLength>, ParserError> {
13697 if self.consume_token(&Token::LParen) {
13698 let character_length = self.parse_character_length()?;
13699 self.expect_token(&Token::RParen)?;
13700 Ok(Some(character_length))
13701 } else {
13702 Ok(None)
13703 }
13704 }
13705
13706 pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
13708 if self.consume_token(&Token::LParen) {
13709 let binary_length = self.parse_binary_length()?;
13710 self.expect_token(&Token::RParen)?;
13711 Ok(Some(binary_length))
13712 } else {
13713 Ok(None)
13714 }
13715 }
13716
13717 pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
13719 if self.parse_keyword(Keyword::MAX) {
13720 return Ok(CharacterLength::Max);
13721 }
13722 let length = self.parse_literal_uint()?;
13723 let unit = if self.parse_keyword(Keyword::CHARACTERS) {
13724 Some(CharLengthUnits::Characters)
13725 } else if self.parse_keyword(Keyword::OCTETS) {
13726 Some(CharLengthUnits::Octets)
13727 } else {
13728 None
13729 };
13730 Ok(CharacterLength::IntegerLength { length, unit })
13731 }
13732
13733 pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
13735 if self.parse_keyword(Keyword::MAX) {
13736 return Ok(BinaryLength::Max);
13737 }
13738 let length = self.parse_literal_uint()?;
13739 Ok(BinaryLength::IntegerLength { length })
13740 }
13741
13742 pub fn parse_optional_precision_scale(
13744 &mut self,
13745 ) -> Result<(Option<u64>, Option<u64>), ParserError> {
13746 if self.consume_token(&Token::LParen) {
13747 let n = self.parse_literal_uint()?;
13748 let scale = if self.consume_token(&Token::Comma) {
13749 Some(self.parse_literal_uint()?)
13750 } else {
13751 None
13752 };
13753 self.expect_token(&Token::RParen)?;
13754 Ok((Some(n), scale))
13755 } else {
13756 Ok((None, None))
13757 }
13758 }
13759
13760 pub fn parse_exact_number_optional_precision_scale(
13762 &mut self,
13763 ) -> Result<ExactNumberInfo, ParserError> {
13764 if self.consume_token(&Token::LParen) {
13765 let precision = self.parse_literal_uint()?;
13766 let scale = if self.consume_token(&Token::Comma) {
13767 Some(self.parse_signed_integer()?)
13768 } else {
13769 None
13770 };
13771
13772 self.expect_token(&Token::RParen)?;
13773
13774 match scale {
13775 None => Ok(ExactNumberInfo::Precision(precision)),
13776 Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
13777 }
13778 } else {
13779 Ok(ExactNumberInfo::None)
13780 }
13781 }
13782
13783 fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
13785 let is_negative = self.consume_token(&Token::Minus);
13786
13787 if !is_negative {
13788 let _ = self.consume_token(&Token::Plus);
13789 }
13790
13791 let current_token = self.peek_token_ref();
13792 match ¤t_token.token {
13793 Token::Number(s, _) => {
13794 let s = s.clone();
13795 let span_start = current_token.span.start;
13796 self.advance_token();
13797 let value = Self::parse::<i64>(s, span_start)?;
13798 Ok(if is_negative { -value } else { value })
13799 }
13800 _ => self.expected_ref("number", current_token),
13801 }
13802 }
13803
13804 pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
13806 if self.consume_token(&Token::LParen) {
13807 let mut modifiers = Vec::new();
13808 loop {
13809 let next_token = self.next_token();
13810 match next_token.token {
13811 Token::Word(w) => modifiers.push(w.to_string()),
13812 Token::Number(n, _) => modifiers.push(n),
13813 Token::SingleQuotedString(s) => modifiers.push(s),
13814
13815 Token::Comma => {
13816 continue;
13817 }
13818 Token::RParen => {
13819 break;
13820 }
13821 _ => self.expected("type modifiers", next_token)?,
13822 }
13823 }
13824
13825 Ok(Some(modifiers))
13826 } else {
13827 Ok(None)
13828 }
13829 }
13830
13831 fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
13833 where
13834 F: FnOnce(Box<DataType>) -> DataType,
13835 {
13836 self.expect_token(&Token::LParen)?;
13837 let inside_type = self.parse_data_type()?;
13838 self.expect_token(&Token::RParen)?;
13839 Ok(parent_type(inside_type.into()))
13840 }
13841
13842 fn parse_delete_setexpr_boxed(
13846 &mut self,
13847 delete_token: TokenWithSpan,
13848 ) -> Result<Box<SetExpr>, ParserError> {
13849 Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
13850 }
13851
13852 pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
13854 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
13855 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
13856 if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
13859 (vec![], false)
13860 } else {
13861 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
13862 self.expect_keyword_is(Keyword::FROM)?;
13863 (tables, true)
13864 }
13865 } else {
13866 (vec![], true)
13867 };
13868
13869 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
13870
13871 let output = self.maybe_parse_output_clause()?;
13872
13873 let using = if self.parse_keyword(Keyword::USING) {
13874 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
13875 } else {
13876 None
13877 };
13878 let selection = if self.parse_keyword(Keyword::WHERE) {
13879 Some(self.parse_expr()?)
13880 } else {
13881 None
13882 };
13883 let returning = if self.parse_keyword(Keyword::RETURNING) {
13884 Some(self.parse_comma_separated(Parser::parse_select_item)?)
13885 } else {
13886 None
13887 };
13888 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13889 self.parse_comma_separated(Parser::parse_order_by_expr)?
13890 } else {
13891 vec![]
13892 };
13893 let limit = if self.parse_keyword(Keyword::LIMIT) {
13894 self.parse_limit()?
13895 } else {
13896 None
13897 };
13898
13899 Ok(Statement::Delete(Delete {
13900 delete_token: delete_token.into(),
13901 optimizer_hints,
13902 tables,
13903 from: if with_from_keyword {
13904 FromTable::WithFromKeyword(from)
13905 } else {
13906 FromTable::WithoutKeyword(from)
13907 },
13908 using,
13909 selection,
13910 returning,
13911 output,
13912 order_by,
13913 limit,
13914 }))
13915 }
13916
13917 pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
13920 let modifier_keyword =
13921 self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
13922
13923 let id = self.parse_literal_uint()?;
13924
13925 let modifier = match modifier_keyword {
13926 Some(Keyword::CONNECTION) => Some(KillType::Connection),
13927 Some(Keyword::QUERY) => Some(KillType::Query),
13928 Some(Keyword::MUTATION) => {
13929 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
13930 Some(KillType::Mutation)
13931 } else {
13932 self.expected_ref(
13933 "Unsupported type for KILL, allowed: CONNECTION | QUERY",
13934 self.peek_token_ref(),
13935 )?
13936 }
13937 }
13938 _ => None,
13939 };
13940
13941 Ok(Statement::Kill { modifier, id })
13942 }
13943
13944 pub fn parse_explain(
13946 &mut self,
13947 describe_alias: DescribeAlias,
13948 ) -> Result<Statement, ParserError> {
13949 let mut analyze = false;
13950 let mut verbose = false;
13951 let mut query_plan = false;
13952 let mut estimate = false;
13953 let mut format = None;
13954 let mut options = None;
13955
13956 if describe_alias == DescribeAlias::Explain
13959 && self.dialect.supports_explain_with_utility_options()
13960 && self.peek_token_ref().token == Token::LParen
13961 {
13962 options = Some(self.parse_utility_options()?)
13963 } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
13964 query_plan = true;
13965 } else if self.parse_keyword(Keyword::ESTIMATE) {
13966 estimate = true;
13967 } else {
13968 analyze = self.parse_keyword(Keyword::ANALYZE);
13969 verbose = self.parse_keyword(Keyword::VERBOSE);
13970 if self.parse_keyword(Keyword::FORMAT) {
13971 format = Some(self.parse_analyze_format_kind()?);
13972 }
13973 }
13974
13975 match self.maybe_parse(|parser| parser.parse_statement())? {
13976 Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
13977 ParserError::ParserError("Explain must be root of the plan".to_string()),
13978 ),
13979 Some(statement) => Ok(Statement::Explain {
13980 describe_alias,
13981 analyze,
13982 verbose,
13983 query_plan,
13984 estimate,
13985 statement: Box::new(statement),
13986 format,
13987 options,
13988 }),
13989 _ => {
13990 let hive_format =
13991 match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
13992 Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
13993 Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
13994 _ => None,
13995 };
13996
13997 let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
13998 self.parse_keyword(Keyword::TABLE)
14000 } else {
14001 false
14002 };
14003
14004 let table_name = self.parse_object_name(false)?;
14005 Ok(Statement::ExplainTable {
14006 describe_alias,
14007 hive_format,
14008 has_table_keyword,
14009 table_name,
14010 })
14011 }
14012 }
14013 }
14014
14015 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14020 pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14021 let _guard = self.recursion_counter.try_decrease()?;
14022 let with = if self.parse_keyword(Keyword::WITH) {
14023 let with_token = self.get_current_token();
14024 Some(With {
14025 with_token: with_token.clone().into(),
14026 recursive: self.parse_keyword(Keyword::RECURSIVE),
14027 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14028 })
14029 } else {
14030 None
14031 };
14032 if self.parse_keyword(Keyword::INSERT) {
14033 Ok(Query {
14034 with,
14035 body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14036 order_by: None,
14037 limit_clause: None,
14038 fetch: None,
14039 locks: vec![],
14040 for_clause: None,
14041 settings: None,
14042 format_clause: None,
14043 pipe_operators: vec![],
14044 }
14045 .into())
14046 } else if self.parse_keyword(Keyword::UPDATE) {
14047 Ok(Query {
14048 with,
14049 body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14050 order_by: None,
14051 limit_clause: None,
14052 fetch: None,
14053 locks: vec![],
14054 for_clause: None,
14055 settings: None,
14056 format_clause: None,
14057 pipe_operators: vec![],
14058 }
14059 .into())
14060 } else if self.parse_keyword(Keyword::DELETE) {
14061 Ok(Query {
14062 with,
14063 body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14064 limit_clause: None,
14065 order_by: None,
14066 fetch: None,
14067 locks: vec![],
14068 for_clause: None,
14069 settings: None,
14070 format_clause: None,
14071 pipe_operators: vec![],
14072 }
14073 .into())
14074 } else if self.parse_keyword(Keyword::MERGE) {
14075 Ok(Query {
14076 with,
14077 body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14078 limit_clause: None,
14079 order_by: None,
14080 fetch: None,
14081 locks: vec![],
14082 for_clause: None,
14083 settings: None,
14084 format_clause: None,
14085 pipe_operators: vec![],
14086 }
14087 .into())
14088 } else {
14089 let body = self.parse_query_body(self.dialect.prec_unknown())?;
14090
14091 let order_by = self.parse_optional_order_by()?;
14092
14093 let limit_clause = self.parse_optional_limit_clause()?;
14094
14095 let settings = self.parse_settings()?;
14096
14097 let fetch = if self.parse_keyword(Keyword::FETCH) {
14098 Some(self.parse_fetch()?)
14099 } else {
14100 None
14101 };
14102
14103 let mut for_clause = None;
14104 let mut locks = Vec::new();
14105 while self.parse_keyword(Keyword::FOR) {
14106 if let Some(parsed_for_clause) = self.parse_for_clause()? {
14107 for_clause = Some(parsed_for_clause);
14108 break;
14109 } else {
14110 locks.push(self.parse_lock()?);
14111 }
14112 }
14113 let format_clause =
14114 if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14115 if self.parse_keyword(Keyword::NULL) {
14116 Some(FormatClause::Null)
14117 } else {
14118 let ident = self.parse_identifier()?;
14119 Some(FormatClause::Identifier(ident))
14120 }
14121 } else {
14122 None
14123 };
14124
14125 let pipe_operators = if self.dialect.supports_pipe_operator() {
14126 self.parse_pipe_operators()?
14127 } else {
14128 Vec::new()
14129 };
14130
14131 Ok(Query {
14132 with,
14133 body,
14134 order_by,
14135 limit_clause,
14136 fetch,
14137 locks,
14138 for_clause,
14139 settings,
14140 format_clause,
14141 pipe_operators,
14142 }
14143 .into())
14144 }
14145 }
14146
14147 fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14148 let mut pipe_operators = Vec::new();
14149
14150 while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14151 let kw = self.expect_one_of_keywords(&[
14152 Keyword::SELECT,
14153 Keyword::EXTEND,
14154 Keyword::SET,
14155 Keyword::DROP,
14156 Keyword::AS,
14157 Keyword::WHERE,
14158 Keyword::LIMIT,
14159 Keyword::AGGREGATE,
14160 Keyword::ORDER,
14161 Keyword::TABLESAMPLE,
14162 Keyword::RENAME,
14163 Keyword::UNION,
14164 Keyword::INTERSECT,
14165 Keyword::EXCEPT,
14166 Keyword::CALL,
14167 Keyword::PIVOT,
14168 Keyword::UNPIVOT,
14169 Keyword::JOIN,
14170 Keyword::INNER,
14171 Keyword::LEFT,
14172 Keyword::RIGHT,
14173 Keyword::FULL,
14174 Keyword::CROSS,
14175 ])?;
14176 match kw {
14177 Keyword::SELECT => {
14178 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14179 pipe_operators.push(PipeOperator::Select { exprs })
14180 }
14181 Keyword::EXTEND => {
14182 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14183 pipe_operators.push(PipeOperator::Extend { exprs })
14184 }
14185 Keyword::SET => {
14186 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14187 pipe_operators.push(PipeOperator::Set { assignments })
14188 }
14189 Keyword::DROP => {
14190 let columns = self.parse_identifiers()?;
14191 pipe_operators.push(PipeOperator::Drop { columns })
14192 }
14193 Keyword::AS => {
14194 let alias = self.parse_identifier()?;
14195 pipe_operators.push(PipeOperator::As { alias })
14196 }
14197 Keyword::WHERE => {
14198 let expr = self.parse_expr()?;
14199 pipe_operators.push(PipeOperator::Where { expr })
14200 }
14201 Keyword::LIMIT => {
14202 let expr = self.parse_expr()?;
14203 let offset = if self.parse_keyword(Keyword::OFFSET) {
14204 Some(self.parse_expr()?)
14205 } else {
14206 None
14207 };
14208 pipe_operators.push(PipeOperator::Limit { expr, offset })
14209 }
14210 Keyword::AGGREGATE => {
14211 let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14212 vec![]
14213 } else {
14214 self.parse_comma_separated(|parser| {
14215 parser.parse_expr_with_alias_and_order_by()
14216 })?
14217 };
14218
14219 let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14220 self.parse_comma_separated(|parser| {
14221 parser.parse_expr_with_alias_and_order_by()
14222 })?
14223 } else {
14224 vec![]
14225 };
14226
14227 pipe_operators.push(PipeOperator::Aggregate {
14228 full_table_exprs,
14229 group_by_expr,
14230 })
14231 }
14232 Keyword::ORDER => {
14233 self.expect_one_of_keywords(&[Keyword::BY])?;
14234 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14235 pipe_operators.push(PipeOperator::OrderBy { exprs })
14236 }
14237 Keyword::TABLESAMPLE => {
14238 let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14239 pipe_operators.push(PipeOperator::TableSample { sample });
14240 }
14241 Keyword::RENAME => {
14242 let mappings =
14243 self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14244 pipe_operators.push(PipeOperator::Rename { mappings });
14245 }
14246 Keyword::UNION => {
14247 let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14248 let queries = self.parse_pipe_operator_queries()?;
14249 pipe_operators.push(PipeOperator::Union {
14250 set_quantifier,
14251 queries,
14252 });
14253 }
14254 Keyword::INTERSECT => {
14255 let set_quantifier =
14256 self.parse_distinct_required_set_quantifier("INTERSECT")?;
14257 let queries = self.parse_pipe_operator_queries()?;
14258 pipe_operators.push(PipeOperator::Intersect {
14259 set_quantifier,
14260 queries,
14261 });
14262 }
14263 Keyword::EXCEPT => {
14264 let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14265 let queries = self.parse_pipe_operator_queries()?;
14266 pipe_operators.push(PipeOperator::Except {
14267 set_quantifier,
14268 queries,
14269 });
14270 }
14271 Keyword::CALL => {
14272 let function_name = self.parse_object_name(false)?;
14273 let function_expr = self.parse_function(function_name)?;
14274 if let Expr::Function(function) = function_expr {
14275 let alias = self.parse_identifier_optional_alias()?;
14276 pipe_operators.push(PipeOperator::Call { function, alias });
14277 } else {
14278 return Err(ParserError::ParserError(
14279 "Expected function call after CALL".to_string(),
14280 ));
14281 }
14282 }
14283 Keyword::PIVOT => {
14284 self.expect_token(&Token::LParen)?;
14285 let aggregate_functions =
14286 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14287 self.expect_keyword_is(Keyword::FOR)?;
14288 let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14289 self.expect_keyword_is(Keyword::IN)?;
14290
14291 self.expect_token(&Token::LParen)?;
14292 let value_source = if self.parse_keyword(Keyword::ANY) {
14293 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14294 self.parse_comma_separated(Parser::parse_order_by_expr)?
14295 } else {
14296 vec![]
14297 };
14298 PivotValueSource::Any(order_by)
14299 } else if self.peek_sub_query() {
14300 PivotValueSource::Subquery(self.parse_query()?)
14301 } else {
14302 PivotValueSource::List(
14303 self.parse_comma_separated(Self::parse_expr_with_alias)?,
14304 )
14305 };
14306 self.expect_token(&Token::RParen)?;
14307 self.expect_token(&Token::RParen)?;
14308
14309 let alias = self.parse_identifier_optional_alias()?;
14310
14311 pipe_operators.push(PipeOperator::Pivot {
14312 aggregate_functions,
14313 value_column,
14314 value_source,
14315 alias,
14316 });
14317 }
14318 Keyword::UNPIVOT => {
14319 self.expect_token(&Token::LParen)?;
14320 let value_column = self.parse_identifier()?;
14321 self.expect_keyword(Keyword::FOR)?;
14322 let name_column = self.parse_identifier()?;
14323 self.expect_keyword(Keyword::IN)?;
14324
14325 self.expect_token(&Token::LParen)?;
14326 let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14327 self.expect_token(&Token::RParen)?;
14328
14329 self.expect_token(&Token::RParen)?;
14330
14331 let alias = self.parse_identifier_optional_alias()?;
14332
14333 pipe_operators.push(PipeOperator::Unpivot {
14334 value_column,
14335 name_column,
14336 unpivot_columns,
14337 alias,
14338 });
14339 }
14340 Keyword::JOIN
14341 | Keyword::INNER
14342 | Keyword::LEFT
14343 | Keyword::RIGHT
14344 | Keyword::FULL
14345 | Keyword::CROSS => {
14346 self.prev_token();
14347 let mut joins = self.parse_joins()?;
14348 if joins.len() != 1 {
14349 return Err(ParserError::ParserError(
14350 "Join pipe operator must have a single join".to_string(),
14351 ));
14352 }
14353 let join = joins.swap_remove(0);
14354 pipe_operators.push(PipeOperator::Join(join))
14355 }
14356 unhandled => {
14357 return Err(ParserError::ParserError(format!(
14358 "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14359 )))
14360 }
14361 }
14362 }
14363 Ok(pipe_operators)
14364 }
14365
14366 fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14367 let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14368 {
14369 let key_values = self.parse_comma_separated(|p| {
14370 let key = p.parse_identifier()?;
14371 p.expect_token(&Token::Eq)?;
14372 let value = p.parse_expr()?;
14373 Ok(Setting { key, value })
14374 })?;
14375 Some(key_values)
14376 } else {
14377 None
14378 };
14379 Ok(settings)
14380 }
14381
14382 pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14384 if self.parse_keyword(Keyword::XML) {
14385 Ok(Some(self.parse_for_xml()?))
14386 } else if self.parse_keyword(Keyword::JSON) {
14387 Ok(Some(self.parse_for_json()?))
14388 } else if self.parse_keyword(Keyword::BROWSE) {
14389 Ok(Some(ForClause::Browse))
14390 } else {
14391 Ok(None)
14392 }
14393 }
14394
14395 pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14397 let for_xml = if self.parse_keyword(Keyword::RAW) {
14398 let mut element_name = None;
14399 if self.peek_token_ref().token == Token::LParen {
14400 self.expect_token(&Token::LParen)?;
14401 element_name = Some(self.parse_literal_string()?);
14402 self.expect_token(&Token::RParen)?;
14403 }
14404 ForXml::Raw(element_name)
14405 } else if self.parse_keyword(Keyword::AUTO) {
14406 ForXml::Auto
14407 } else if self.parse_keyword(Keyword::EXPLICIT) {
14408 ForXml::Explicit
14409 } else if self.parse_keyword(Keyword::PATH) {
14410 let mut element_name = None;
14411 if self.peek_token_ref().token == Token::LParen {
14412 self.expect_token(&Token::LParen)?;
14413 element_name = Some(self.parse_literal_string()?);
14414 self.expect_token(&Token::RParen)?;
14415 }
14416 ForXml::Path(element_name)
14417 } else {
14418 return Err(ParserError::ParserError(
14419 "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14420 ));
14421 };
14422 let mut elements = false;
14423 let mut binary_base64 = false;
14424 let mut root = None;
14425 let mut r#type = false;
14426 while self.peek_token_ref().token == Token::Comma {
14427 self.next_token();
14428 if self.parse_keyword(Keyword::ELEMENTS) {
14429 elements = true;
14430 } else if self.parse_keyword(Keyword::BINARY) {
14431 self.expect_keyword_is(Keyword::BASE64)?;
14432 binary_base64 = true;
14433 } else if self.parse_keyword(Keyword::ROOT) {
14434 self.expect_token(&Token::LParen)?;
14435 root = Some(self.parse_literal_string()?);
14436 self.expect_token(&Token::RParen)?;
14437 } else if self.parse_keyword(Keyword::TYPE) {
14438 r#type = true;
14439 }
14440 }
14441 Ok(ForClause::Xml {
14442 for_xml,
14443 elements,
14444 binary_base64,
14445 root,
14446 r#type,
14447 })
14448 }
14449
14450 pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14452 let for_json = if self.parse_keyword(Keyword::AUTO) {
14453 ForJson::Auto
14454 } else if self.parse_keyword(Keyword::PATH) {
14455 ForJson::Path
14456 } else {
14457 return Err(ParserError::ParserError(
14458 "Expected FOR JSON [AUTO | PATH ]".to_string(),
14459 ));
14460 };
14461 let mut root = None;
14462 let mut include_null_values = false;
14463 let mut without_array_wrapper = false;
14464 while self.peek_token_ref().token == Token::Comma {
14465 self.next_token();
14466 if self.parse_keyword(Keyword::ROOT) {
14467 self.expect_token(&Token::LParen)?;
14468 root = Some(self.parse_literal_string()?);
14469 self.expect_token(&Token::RParen)?;
14470 } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14471 include_null_values = true;
14472 } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14473 without_array_wrapper = true;
14474 }
14475 }
14476 Ok(ForClause::Json {
14477 for_json,
14478 root,
14479 include_null_values,
14480 without_array_wrapper,
14481 })
14482 }
14483
14484 pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
14486 let name = self.parse_identifier()?;
14487
14488 let as_optional = self.dialect.supports_cte_without_as();
14489
14490 if as_optional && !self.peek_keyword(Keyword::AS) {
14492 if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
14493 p.expect_token(&Token::LParen)?;
14494 let query = p.parse_query()?;
14495 let closing_paren_token = p.expect_token(&Token::RParen)?;
14496 Ok((query, closing_paren_token))
14497 })? {
14498 let mut cte = Cte {
14499 alias: TableAlias {
14500 explicit: false,
14501 name,
14502 columns: vec![],
14503 at: None,
14504 },
14505 query,
14506 from: None,
14507 materialized: None,
14508 closing_paren_token: closing_paren_token.into(),
14509 };
14510 if self.parse_keyword(Keyword::FROM) {
14511 cte.from = Some(self.parse_identifier()?);
14512 }
14513 return Ok(cte);
14514 }
14515 }
14516
14517 let columns = if self.parse_keyword(Keyword::AS) {
14519 vec![]
14520 } else {
14521 let columns = self.parse_table_alias_column_defs()?;
14522 if as_optional {
14523 let _ = self.parse_keyword(Keyword::AS);
14524 } else {
14525 self.expect_keyword_is(Keyword::AS)?;
14526 }
14527 columns
14528 };
14529
14530 let mut is_materialized = None;
14531 if dialect_of!(self is PostgreSqlDialect) {
14532 if self.parse_keyword(Keyword::MATERIALIZED) {
14533 is_materialized = Some(CteAsMaterialized::Materialized);
14534 } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
14535 is_materialized = Some(CteAsMaterialized::NotMaterialized);
14536 }
14537 }
14538
14539 self.expect_token(&Token::LParen)?;
14540 let query = self.parse_query()?;
14541 let closing_paren_token = self.expect_token(&Token::RParen)?;
14542
14543 let mut cte = Cte {
14544 alias: TableAlias {
14545 explicit: false,
14546 name,
14547 columns,
14548 at: None,
14549 },
14550 query,
14551 from: None,
14552 materialized: is_materialized,
14553 closing_paren_token: closing_paren_token.into(),
14554 };
14555 if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
14556 cte.from = Some(self.parse_identifier()?);
14557 }
14558 Ok(cte)
14559 }
14560
14561 pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
14570 let expr = if self.peek_keyword(Keyword::SELECT)
14573 || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
14574 {
14575 SetExpr::Select(self.parse_select().map(Box::new)?)
14576 } else if self.consume_token(&Token::LParen) {
14577 let subquery = self.parse_query()?;
14579 self.expect_token(&Token::RParen)?;
14580 SetExpr::Query(subquery)
14581 } else if self.parse_keyword(Keyword::VALUES) {
14582 let is_mysql = dialect_of!(self is MySqlDialect);
14583 SetExpr::Values(self.parse_values(is_mysql, false)?)
14584 } else if self.parse_keyword(Keyword::VALUE) {
14585 let is_mysql = dialect_of!(self is MySqlDialect);
14586 SetExpr::Values(self.parse_values(is_mysql, true)?)
14587 } else if self.parse_keyword(Keyword::TABLE) {
14588 SetExpr::Table(Box::new(self.parse_as_table()?))
14589 } else {
14590 return self.expected_ref(
14591 "SELECT, VALUES, or a subquery in the query body",
14592 self.peek_token_ref(),
14593 );
14594 };
14595
14596 self.parse_remaining_set_exprs(expr, precedence)
14597 }
14598
14599 fn parse_remaining_set_exprs(
14603 &mut self,
14604 mut expr: SetExpr,
14605 precedence: u8,
14606 ) -> Result<Box<SetExpr>, ParserError> {
14607 loop {
14608 let op = self.parse_set_operator(&self.peek_token().token);
14610 let next_precedence = match op {
14611 Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
14613 10
14614 }
14615 Some(SetOperator::Intersect) => 20,
14617 None => break,
14619 };
14620 if precedence >= next_precedence {
14621 break;
14622 }
14623 self.next_token(); let set_quantifier = self.parse_set_quantifier(&op);
14625 expr = SetExpr::SetOperation {
14626 left: Box::new(expr),
14627 op: op.unwrap(),
14628 set_quantifier,
14629 right: self.parse_query_body(next_precedence)?,
14630 };
14631 }
14632
14633 Ok(expr.into())
14634 }
14635
14636 pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
14638 match token {
14639 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
14640 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
14641 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
14642 Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
14643 _ => None,
14644 }
14645 }
14646
14647 pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
14649 match op {
14650 Some(
14651 SetOperator::Except
14652 | SetOperator::Intersect
14653 | SetOperator::Union
14654 | SetOperator::Minus,
14655 ) => {
14656 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
14657 SetQuantifier::DistinctByName
14658 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14659 SetQuantifier::ByName
14660 } else if self.parse_keyword(Keyword::ALL) {
14661 if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14662 SetQuantifier::AllByName
14663 } else {
14664 SetQuantifier::All
14665 }
14666 } else if self.parse_keyword(Keyword::DISTINCT) {
14667 SetQuantifier::Distinct
14668 } else {
14669 SetQuantifier::None
14670 }
14671 }
14672 _ => SetQuantifier::None,
14673 }
14674 }
14675
14676 pub fn parse_select(&mut self) -> Result<Select, ParserError> {
14678 let mut from_first = None;
14679
14680 if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
14681 let from_token = self.expect_keyword(Keyword::FROM)?;
14682 let from = self.parse_table_with_joins()?;
14683 if !self.peek_keyword(Keyword::SELECT) {
14684 return Ok(Select {
14685 select_token: AttachedToken(from_token),
14686 optimizer_hints: vec![],
14687 distinct: None,
14688 select_modifiers: None,
14689 top: None,
14690 top_before_distinct: false,
14691 projection: vec![],
14692 exclude: None,
14693 into: None,
14694 from,
14695 lateral_views: vec![],
14696 prewhere: None,
14697 selection: None,
14698 group_by: GroupByExpr::Expressions(vec![], vec![]),
14699 cluster_by: vec![],
14700 distribute_by: vec![],
14701 sort_by: vec![],
14702 having: None,
14703 named_window: vec![],
14704 window_before_qualify: false,
14705 qualify: None,
14706 value_table_mode: None,
14707 connect_by: vec![],
14708 flavor: SelectFlavor::FromFirstNoSelect,
14709 });
14710 }
14711 from_first = Some(from);
14712 }
14713
14714 let select_token = self.expect_keyword(Keyword::SELECT)?;
14715 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14716 let value_table_mode = self.parse_value_table_mode()?;
14717
14718 let (select_modifiers, distinct_select_modifier) =
14719 if self.dialect.supports_select_modifiers() {
14720 self.parse_select_modifiers()?
14721 } else {
14722 (None, None)
14723 };
14724
14725 let mut top_before_distinct = false;
14726 let mut top = None;
14727 if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14728 top = Some(self.parse_top()?);
14729 top_before_distinct = true;
14730 }
14731
14732 let distinct = if distinct_select_modifier.is_some() {
14733 distinct_select_modifier
14734 } else {
14735 self.parse_all_or_distinct()?
14736 };
14737
14738 if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14739 top = Some(self.parse_top()?);
14740 }
14741
14742 let projection =
14743 if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
14744 vec![]
14745 } else {
14746 self.parse_projection()?
14747 };
14748
14749 let exclude = if self.dialect.supports_select_exclude() {
14750 self.parse_optional_select_item_exclude()?
14751 } else {
14752 None
14753 };
14754
14755 let into = if self.parse_keyword(Keyword::INTO) {
14756 Some(self.parse_select_into()?)
14757 } else {
14758 None
14759 };
14760
14761 let (from, from_first) = if let Some(from) = from_first.take() {
14767 (from, true)
14768 } else if self.parse_keyword(Keyword::FROM) {
14769 (self.parse_table_with_joins()?, false)
14770 } else {
14771 (vec![], false)
14772 };
14773
14774 let mut lateral_views = vec![];
14775 loop {
14776 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
14777 let outer = self.parse_keyword(Keyword::OUTER);
14778 let lateral_view = self.parse_expr()?;
14779 let lateral_view_name = self.parse_object_name(false)?;
14780 let lateral_col_alias = self
14781 .parse_comma_separated(|parser| {
14782 parser.parse_optional_alias(&[
14783 Keyword::WHERE,
14784 Keyword::GROUP,
14785 Keyword::CLUSTER,
14786 Keyword::HAVING,
14787 Keyword::LATERAL,
14788 ]) })?
14790 .into_iter()
14791 .flatten()
14792 .collect();
14793
14794 lateral_views.push(LateralView {
14795 lateral_view,
14796 lateral_view_name,
14797 lateral_col_alias,
14798 outer,
14799 });
14800 } else {
14801 break;
14802 }
14803 }
14804
14805 let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
14806 {
14807 Some(self.parse_expr()?)
14808 } else {
14809 None
14810 };
14811
14812 let selection = if self.parse_keyword(Keyword::WHERE) {
14813 Some(self.parse_expr()?)
14814 } else {
14815 None
14816 };
14817
14818 let connect_by = self.maybe_parse_connect_by()?;
14819
14820 let group_by = self
14821 .parse_optional_group_by()?
14822 .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
14823
14824 let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
14825 self.parse_comma_separated(Parser::parse_expr)?
14826 } else {
14827 vec![]
14828 };
14829
14830 let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
14831 self.parse_comma_separated(Parser::parse_expr)?
14832 } else {
14833 vec![]
14834 };
14835
14836 let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
14837 self.parse_comma_separated(Parser::parse_order_by_expr)?
14838 } else {
14839 vec![]
14840 };
14841
14842 let having = if self.parse_keyword(Keyword::HAVING) {
14843 Some(self.parse_expr()?)
14844 } else {
14845 None
14846 };
14847
14848 let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
14850 {
14851 let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
14852 if self.parse_keyword(Keyword::QUALIFY) {
14853 (named_windows, Some(self.parse_expr()?), true)
14854 } else {
14855 (named_windows, None, true)
14856 }
14857 } else if self.parse_keyword(Keyword::QUALIFY) {
14858 let qualify = Some(self.parse_expr()?);
14859 if self.parse_keyword(Keyword::WINDOW) {
14860 (
14861 self.parse_comma_separated(Parser::parse_named_window)?,
14862 qualify,
14863 false,
14864 )
14865 } else {
14866 (Default::default(), qualify, false)
14867 }
14868 } else {
14869 Default::default()
14870 };
14871
14872 Ok(Select {
14873 select_token: AttachedToken(select_token),
14874 optimizer_hints,
14875 distinct,
14876 select_modifiers,
14877 top,
14878 top_before_distinct,
14879 projection,
14880 exclude,
14881 into,
14882 from,
14883 lateral_views,
14884 prewhere,
14885 selection,
14886 group_by,
14887 cluster_by,
14888 distribute_by,
14889 sort_by,
14890 having,
14891 named_window: named_windows,
14892 window_before_qualify,
14893 qualify,
14894 value_table_mode,
14895 connect_by,
14896 flavor: if from_first {
14897 SelectFlavor::FromFirst
14898 } else {
14899 SelectFlavor::Standard
14900 },
14901 })
14902 }
14903
14904 fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
14913 let supports_hints = self.dialect.supports_comment_optimizer_hint();
14914 if !supports_hints {
14915 return Ok(vec![]);
14916 }
14917 let mut hints = vec![];
14918 loop {
14919 let t = self.peek_nth_token_no_skip_ref(0);
14920 let Token::Whitespace(ws) = &t.token else {
14921 break;
14922 };
14923 match ws {
14924 Whitespace::SingleLineComment { comment, prefix } => {
14925 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
14926 hints.push(OptimizerHint {
14927 prefix: hint_prefix,
14928 text,
14929 style: OptimizerHintStyle::SingleLine {
14930 prefix: prefix.clone(),
14931 },
14932 });
14933 }
14934 self.next_token_no_skip();
14935 }
14936 Whitespace::MultiLineComment(comment) => {
14937 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
14938 hints.push(OptimizerHint {
14939 prefix: hint_prefix,
14940 text,
14941 style: OptimizerHintStyle::MultiLine,
14942 });
14943 }
14944 self.next_token_no_skip();
14945 }
14946 Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
14947 self.next_token_no_skip();
14948 }
14949 }
14950 }
14951 Ok(hints)
14952 }
14953
14954 fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
14957 let (before_plus, text) = comment.split_once('+')?;
14958 if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
14959 Some((before_plus.to_string(), text.to_string()))
14960 } else {
14961 None
14962 }
14963 }
14964
14965 fn parse_select_modifiers(
14972 &mut self,
14973 ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
14974 let mut modifiers = SelectModifiers::default();
14975 let mut distinct = None;
14976
14977 let keywords = &[
14978 Keyword::ALL,
14979 Keyword::DISTINCT,
14980 Keyword::DISTINCTROW,
14981 Keyword::HIGH_PRIORITY,
14982 Keyword::STRAIGHT_JOIN,
14983 Keyword::SQL_SMALL_RESULT,
14984 Keyword::SQL_BIG_RESULT,
14985 Keyword::SQL_BUFFER_RESULT,
14986 Keyword::SQL_NO_CACHE,
14987 Keyword::SQL_CALC_FOUND_ROWS,
14988 ];
14989
14990 while let Some(keyword) = self.parse_one_of_keywords(keywords) {
14991 match keyword {
14992 Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
14993 self.prev_token();
14994 distinct = self.parse_all_or_distinct()?;
14995 }
14996 Keyword::DISTINCTROW if distinct.is_none() => {
14998 distinct = Some(Distinct::Distinct);
14999 }
15000 Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15001 Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15002 Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15003 Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15004 Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15005 Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15006 Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15007 _ => {
15008 self.prev_token();
15009 return self.expected_ref(
15010 "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15011 self.peek_token_ref(),
15012 );
15013 }
15014 }
15015 }
15016
15017 let select_modifiers = if modifiers.is_any_set() {
15020 Some(modifiers)
15021 } else {
15022 None
15023 };
15024 Ok((select_modifiers, distinct))
15025 }
15026
15027 fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15028 if !dialect_of!(self is BigQueryDialect) {
15029 return Ok(None);
15030 }
15031
15032 let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15033 Some(ValueTableMode::DistinctAsValue)
15034 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15035 Some(ValueTableMode::DistinctAsStruct)
15036 } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15037 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15038 {
15039 Some(ValueTableMode::AsValue)
15040 } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15041 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15042 {
15043 Some(ValueTableMode::AsStruct)
15044 } else if self.parse_keyword(Keyword::AS) {
15045 self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15046 } else {
15047 None
15048 };
15049
15050 Ok(mode)
15051 }
15052
15053 fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15057 where
15058 F: FnMut(&mut Parser) -> Result<T, ParserError>,
15059 {
15060 let current_state = self.state;
15061 self.state = state;
15062 let res = f(self);
15063 self.state = current_state;
15064 res
15065 }
15066
15067 pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15069 let mut clauses = Vec::with_capacity(2);
15070 loop {
15071 if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15072 clauses.push(ConnectByKind::StartWith {
15073 start_token: self.token_at(idx).clone().into(),
15074 condition: self.parse_expr()?.into(),
15075 });
15076 } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15077 {
15078 clauses.push(ConnectByKind::ConnectBy {
15079 connect_token: self.token_at(idx).clone().into(),
15080 nocycle: self.parse_keyword(Keyword::NOCYCLE),
15081 relationships: self.with_state(ParserState::ConnectBy, |parser| {
15082 parser.parse_comma_separated(Parser::parse_expr)
15083 })?,
15084 });
15085 } else {
15086 break;
15087 }
15088 }
15089 Ok(clauses)
15090 }
15091
15092 pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15094 let token1 = self.next_token();
15095 let token2 = self.next_token();
15096 let token3 = self.next_token();
15097
15098 let table_name;
15099 let schema_name;
15100 if token2 == Token::Period {
15101 match token1.token {
15102 Token::Word(w) => {
15103 schema_name = w.value;
15104 }
15105 _ => {
15106 return self.expected("Schema name", token1);
15107 }
15108 }
15109 match token3.token {
15110 Token::Word(w) => {
15111 table_name = w.value;
15112 }
15113 _ => {
15114 return self.expected("Table name", token3);
15115 }
15116 }
15117 Ok(Table {
15118 table_name: Some(table_name),
15119 schema_name: Some(schema_name),
15120 })
15121 } else {
15122 match token1.token {
15123 Token::Word(w) => {
15124 table_name = w.value;
15125 }
15126 _ => {
15127 return self.expected("Table name", token1);
15128 }
15129 }
15130 Ok(Table {
15131 table_name: Some(table_name),
15132 schema_name: None,
15133 })
15134 }
15135 }
15136
15137 fn parse_set_role(
15139 &mut self,
15140 modifier: Option<ContextModifier>,
15141 ) -> Result<Statement, ParserError> {
15142 self.expect_keyword_is(Keyword::ROLE)?;
15143
15144 let role_name = if self.parse_keyword(Keyword::NONE) {
15145 None
15146 } else {
15147 Some(self.parse_identifier()?)
15148 };
15149 Ok(Statement::Set(Set::SetRole {
15150 context_modifier: modifier,
15151 role_name,
15152 }))
15153 }
15154
15155 fn parse_set_values(
15156 &mut self,
15157 parenthesized_assignment: bool,
15158 ) -> Result<Vec<Expr>, ParserError> {
15159 let mut values = vec![];
15160
15161 if parenthesized_assignment {
15162 self.expect_token(&Token::LParen)?;
15163 }
15164
15165 loop {
15166 let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15167 expr
15168 } else if let Ok(expr) = self.parse_expr() {
15169 expr
15170 } else {
15171 self.expected_ref("variable value", self.peek_token_ref())?
15172 };
15173
15174 values.push(value);
15175 if self.consume_token(&Token::Comma) {
15176 continue;
15177 }
15178
15179 if parenthesized_assignment {
15180 self.expect_token(&Token::RParen)?;
15181 }
15182 return Ok(values);
15183 }
15184 }
15185
15186 fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15187 let modifier =
15188 self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15189
15190 Self::keyword_to_modifier(modifier)
15191 }
15192
15193 fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15195 let scope = self.parse_context_modifier();
15196
15197 let name = if self.dialect.supports_parenthesized_set_variables()
15198 && self.consume_token(&Token::LParen)
15199 {
15200 self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15204 } else {
15205 self.parse_object_name(false)?
15206 };
15207
15208 if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15209 return self.expected_ref("assignment operator", self.peek_token_ref());
15210 }
15211
15212 let value = self.parse_expr()?;
15213
15214 Ok(SetAssignment { scope, name, value })
15215 }
15216
15217 fn parse_set(&mut self) -> Result<Statement, ParserError> {
15218 let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15219
15220 let scope = if !hivevar {
15222 self.parse_context_modifier()
15223 } else {
15224 None
15225 };
15226
15227 if hivevar {
15228 self.expect_token(&Token::Colon)?;
15229 }
15230
15231 if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15232 return Ok(set_role_stmt);
15233 }
15234
15235 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15237 || self.parse_keyword(Keyword::TIMEZONE)
15238 {
15239 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15240 return Ok(Set::SingleAssignment {
15241 scope,
15242 hivevar,
15243 variable: ObjectName::from(vec!["TIMEZONE".into()]),
15244 values: self.parse_set_values(false)?,
15245 }
15246 .into());
15247 } else {
15248 return Ok(Set::SetTimeZone {
15252 local: scope == Some(ContextModifier::Local),
15253 value: self.parse_expr()?,
15254 }
15255 .into());
15256 }
15257 } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15258 if self.parse_keyword(Keyword::DEFAULT) {
15259 return Ok(Set::SetNamesDefault {}.into());
15260 }
15261 let charset_name = self.parse_identifier()?;
15262 let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15263 Some(self.parse_literal_string()?)
15264 } else {
15265 None
15266 };
15267
15268 return Ok(Set::SetNames {
15269 charset_name,
15270 collation_name,
15271 }
15272 .into());
15273 } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15274 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15275 return Ok(Set::SetTransaction {
15276 modes: self.parse_transaction_modes()?,
15277 snapshot: None,
15278 session: true,
15279 }
15280 .into());
15281 } else if self.parse_keyword(Keyword::TRANSACTION) {
15282 if self.parse_keyword(Keyword::SNAPSHOT) {
15283 let snapshot_id = self.parse_value()?;
15284 return Ok(Set::SetTransaction {
15285 modes: vec![],
15286 snapshot: Some(snapshot_id),
15287 session: false,
15288 }
15289 .into());
15290 }
15291 return Ok(Set::SetTransaction {
15292 modes: self.parse_transaction_modes()?,
15293 snapshot: None,
15294 session: false,
15295 }
15296 .into());
15297 } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15298 let scope = match scope {
15299 Some(s) => s,
15300 None => {
15301 return self.expected_at(
15302 "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15303 self.get_current_index(),
15304 )
15305 }
15306 };
15307 let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15308 SetSessionAuthorizationParamKind::Default
15309 } else {
15310 let value = self.parse_identifier()?;
15311 SetSessionAuthorizationParamKind::User(value)
15312 };
15313 return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15314 scope,
15315 kind: auth_value,
15316 })
15317 .into());
15318 }
15319
15320 if self.dialect.supports_comma_separated_set_assignments() {
15321 if scope.is_some() {
15322 self.prev_token();
15323 }
15324
15325 if let Some(assignments) = self
15326 .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15327 {
15328 return if assignments.len() > 1 {
15329 Ok(Set::MultipleAssignments { assignments }.into())
15330 } else {
15331 let SetAssignment { scope, name, value } =
15332 assignments.into_iter().next().ok_or_else(|| {
15333 ParserError::ParserError("Expected at least one assignment".to_string())
15334 })?;
15335
15336 Ok(Set::SingleAssignment {
15337 scope,
15338 hivevar,
15339 variable: name,
15340 values: vec![value],
15341 }
15342 .into())
15343 };
15344 }
15345 }
15346
15347 let variables = if self.dialect.supports_parenthesized_set_variables()
15348 && self.consume_token(&Token::LParen)
15349 {
15350 let vars = OneOrManyWithParens::Many(
15351 self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15352 .into_iter()
15353 .map(|ident| ObjectName::from(vec![ident]))
15354 .collect(),
15355 );
15356 self.expect_token(&Token::RParen)?;
15357 vars
15358 } else {
15359 OneOrManyWithParens::One(self.parse_object_name(false)?)
15360 };
15361
15362 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15363 let stmt = match variables {
15364 OneOrManyWithParens::One(var) => Set::SingleAssignment {
15365 scope,
15366 hivevar,
15367 variable: var,
15368 values: self.parse_set_values(false)?,
15369 },
15370 OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15371 variables: vars,
15372 values: self.parse_set_values(true)?,
15373 },
15374 };
15375
15376 return Ok(stmt.into());
15377 }
15378
15379 if self.dialect.supports_set_stmt_without_operator() {
15380 self.prev_token();
15381 return self.parse_set_session_params();
15382 };
15383
15384 self.expected_ref("equals sign or TO", self.peek_token_ref())
15385 }
15386
15387 pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15389 if self.parse_keyword(Keyword::STATISTICS) {
15390 let topic = match self.parse_one_of_keywords(&[
15391 Keyword::IO,
15392 Keyword::PROFILE,
15393 Keyword::TIME,
15394 Keyword::XML,
15395 ]) {
15396 Some(Keyword::IO) => SessionParamStatsTopic::IO,
15397 Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15398 Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15399 Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15400 _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15401 };
15402 let value = self.parse_session_param_value()?;
15403 Ok(
15404 Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15405 topic,
15406 value,
15407 }))
15408 .into(),
15409 )
15410 } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15411 let obj = self.parse_object_name(false)?;
15412 let value = self.parse_session_param_value()?;
15413 Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15414 SetSessionParamIdentityInsert { obj, value },
15415 ))
15416 .into())
15417 } else if self.parse_keyword(Keyword::OFFSETS) {
15418 let keywords = self.parse_comma_separated(|parser| {
15419 let next_token = parser.next_token();
15420 match &next_token.token {
15421 Token::Word(w) => Ok(w.to_string()),
15422 _ => parser.expected("SQL keyword", next_token),
15423 }
15424 })?;
15425 let value = self.parse_session_param_value()?;
15426 Ok(
15427 Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15428 keywords,
15429 value,
15430 }))
15431 .into(),
15432 )
15433 } else {
15434 let names = self.parse_comma_separated(|parser| {
15435 let next_token = parser.next_token();
15436 match next_token.token {
15437 Token::Word(w) => Ok(w.to_string()),
15438 _ => parser.expected("Session param name", next_token),
15439 }
15440 })?;
15441 let value = self.parse_expr()?.to_string();
15442 Ok(
15443 Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15444 names,
15445 value,
15446 }))
15447 .into(),
15448 )
15449 }
15450 }
15451
15452 fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15453 if self.parse_keyword(Keyword::ON) {
15454 Ok(SessionParamValue::On)
15455 } else if self.parse_keyword(Keyword::OFF) {
15456 Ok(SessionParamValue::Off)
15457 } else {
15458 self.expected_ref("ON or OFF", self.peek_token_ref())
15459 }
15460 }
15461
15462 pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15464 let terse = self.parse_keyword(Keyword::TERSE);
15465 let extended = self.parse_keyword(Keyword::EXTENDED);
15466 let full = self.parse_keyword(Keyword::FULL);
15467 let session = self.parse_keyword(Keyword::SESSION);
15468 let global = self.parse_keyword(Keyword::GLOBAL);
15469 let external = self.parse_keyword(Keyword::EXTERNAL);
15470 if self
15471 .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15472 .is_some()
15473 {
15474 Ok(self.parse_show_columns(extended, full)?)
15475 } else if self.parse_keyword(Keyword::TABLES) {
15476 Ok(self.parse_show_tables(terse, extended, full, external)?)
15477 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15478 Ok(self.parse_show_views(terse, true)?)
15479 } else if self.parse_keyword(Keyword::VIEWS) {
15480 Ok(self.parse_show_views(terse, false)?)
15481 } else if self.parse_keyword(Keyword::FUNCTIONS) {
15482 Ok(self.parse_show_functions()?)
15483 } else if self.parse_keyword(Keyword::PROCESSLIST) {
15484 Ok(Statement::ShowProcessList { full })
15485 } else if extended || full {
15486 Err(ParserError::ParserError(
15487 "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
15488 ))
15489 } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
15490 Ok(self.parse_show_create()?)
15491 } else if self.parse_keyword(Keyword::COLLATION) {
15492 Ok(self.parse_show_collation()?)
15493 } else if self.parse_keyword(Keyword::VARIABLES)
15494 && dialect_of!(self is MySqlDialect | GenericDialect)
15495 {
15496 Ok(Statement::ShowVariables {
15497 filter: self.parse_show_statement_filter()?,
15498 session,
15499 global,
15500 })
15501 } else if self.parse_keyword(Keyword::STATUS)
15502 && dialect_of!(self is MySqlDialect | GenericDialect)
15503 {
15504 Ok(Statement::ShowStatus {
15505 filter: self.parse_show_statement_filter()?,
15506 session,
15507 global,
15508 })
15509 } else if self.parse_keyword(Keyword::CATALOGS) {
15510 self.parse_show_catalogs(terse)
15511 } else if self.parse_keyword(Keyword::DATABASES) {
15512 self.parse_show_databases(terse)
15513 } else if self.parse_keyword(Keyword::SCHEMAS) {
15514 self.parse_show_schemas(terse)
15515 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
15516 self.parse_show_charset(false)
15517 } else if self.parse_keyword(Keyword::CHARSET) {
15518 self.parse_show_charset(true)
15519 } else {
15520 Ok(Statement::ShowVariable {
15521 variable: self.parse_identifiers()?,
15522 })
15523 }
15524 }
15525
15526 fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
15527 Ok(Statement::ShowCharset(ShowCharset {
15529 is_shorthand,
15530 filter: self.parse_show_statement_filter()?,
15531 }))
15532 }
15533
15534 fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
15535 let history = self.parse_keyword(Keyword::HISTORY);
15536 let show_options = self.parse_show_stmt_options()?;
15537 Ok(Statement::ShowCatalogs {
15538 terse,
15539 history,
15540 show_options,
15541 })
15542 }
15543
15544 fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
15545 let history = self.parse_keyword(Keyword::HISTORY);
15546 let show_options = self.parse_show_stmt_options()?;
15547 Ok(Statement::ShowDatabases {
15548 terse,
15549 history,
15550 show_options,
15551 })
15552 }
15553
15554 fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
15555 let history = self.parse_keyword(Keyword::HISTORY);
15556 let show_options = self.parse_show_stmt_options()?;
15557 Ok(Statement::ShowSchemas {
15558 terse,
15559 history,
15560 show_options,
15561 })
15562 }
15563
15564 pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
15566 let obj_type = match self.expect_one_of_keywords(&[
15567 Keyword::TABLE,
15568 Keyword::TRIGGER,
15569 Keyword::FUNCTION,
15570 Keyword::PROCEDURE,
15571 Keyword::EVENT,
15572 Keyword::VIEW,
15573 ])? {
15574 Keyword::TABLE => Ok(ShowCreateObject::Table),
15575 Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
15576 Keyword::FUNCTION => Ok(ShowCreateObject::Function),
15577 Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
15578 Keyword::EVENT => Ok(ShowCreateObject::Event),
15579 Keyword::VIEW => Ok(ShowCreateObject::View),
15580 keyword => Err(ParserError::ParserError(format!(
15581 "Unable to map keyword to ShowCreateObject: {keyword:?}"
15582 ))),
15583 }?;
15584
15585 let obj_name = self.parse_object_name(false)?;
15586
15587 Ok(Statement::ShowCreate { obj_type, obj_name })
15588 }
15589
15590 pub fn parse_show_columns(
15592 &mut self,
15593 extended: bool,
15594 full: bool,
15595 ) -> Result<Statement, ParserError> {
15596 let show_options = self.parse_show_stmt_options()?;
15597 Ok(Statement::ShowColumns {
15598 extended,
15599 full,
15600 show_options,
15601 })
15602 }
15603
15604 fn parse_show_tables(
15605 &mut self,
15606 terse: bool,
15607 extended: bool,
15608 full: bool,
15609 external: bool,
15610 ) -> Result<Statement, ParserError> {
15611 let history = !external && self.parse_keyword(Keyword::HISTORY);
15612 let show_options = self.parse_show_stmt_options()?;
15613 Ok(Statement::ShowTables {
15614 terse,
15615 history,
15616 extended,
15617 full,
15618 external,
15619 show_options,
15620 })
15621 }
15622
15623 fn parse_show_views(
15624 &mut self,
15625 terse: bool,
15626 materialized: bool,
15627 ) -> Result<Statement, ParserError> {
15628 let show_options = self.parse_show_stmt_options()?;
15629 Ok(Statement::ShowViews {
15630 materialized,
15631 terse,
15632 show_options,
15633 })
15634 }
15635
15636 pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
15638 let filter = self.parse_show_statement_filter()?;
15639 Ok(Statement::ShowFunctions { filter })
15640 }
15641
15642 pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
15644 let filter = self.parse_show_statement_filter()?;
15645 Ok(Statement::ShowCollation { filter })
15646 }
15647
15648 pub fn parse_show_statement_filter(
15650 &mut self,
15651 ) -> Result<Option<ShowStatementFilter>, ParserError> {
15652 if self.parse_keyword(Keyword::LIKE) {
15653 Ok(Some(ShowStatementFilter::Like(
15654 self.parse_literal_string()?,
15655 )))
15656 } else if self.parse_keyword(Keyword::ILIKE) {
15657 Ok(Some(ShowStatementFilter::ILike(
15658 self.parse_literal_string()?,
15659 )))
15660 } else if self.parse_keyword(Keyword::WHERE) {
15661 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
15662 } else {
15663 self.maybe_parse(|parser| -> Result<String, ParserError> {
15664 parser.parse_literal_string()
15665 })?
15666 .map_or(Ok(None), |filter| {
15667 Ok(Some(ShowStatementFilter::NoKeyword(filter)))
15668 })
15669 }
15670 }
15671
15672 pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
15674 let parsed_keyword = if dialect_of!(self is HiveDialect) {
15676 if self.parse_keyword(Keyword::DEFAULT) {
15678 return Ok(Statement::Use(Use::Default));
15679 }
15680 None } else if dialect_of!(self is DatabricksDialect) {
15682 self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
15683 } else if dialect_of!(self is SnowflakeDialect) {
15684 self.parse_one_of_keywords(&[
15685 Keyword::DATABASE,
15686 Keyword::SCHEMA,
15687 Keyword::WAREHOUSE,
15688 Keyword::ROLE,
15689 Keyword::SECONDARY,
15690 ])
15691 } else {
15692 None };
15694
15695 let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
15696 self.parse_secondary_roles()?
15697 } else {
15698 let obj_name = self.parse_object_name(false)?;
15699 match parsed_keyword {
15700 Some(Keyword::CATALOG) => Use::Catalog(obj_name),
15701 Some(Keyword::DATABASE) => Use::Database(obj_name),
15702 Some(Keyword::SCHEMA) => Use::Schema(obj_name),
15703 Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
15704 Some(Keyword::ROLE) => Use::Role(obj_name),
15705 _ => Use::Object(obj_name),
15706 }
15707 };
15708
15709 Ok(Statement::Use(result))
15710 }
15711
15712 fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
15713 self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
15714 if self.parse_keyword(Keyword::NONE) {
15715 Ok(Use::SecondaryRoles(SecondaryRoles::None))
15716 } else if self.parse_keyword(Keyword::ALL) {
15717 Ok(Use::SecondaryRoles(SecondaryRoles::All))
15718 } else {
15719 let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
15720 Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
15721 }
15722 }
15723
15724 pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
15726 let relation = self.parse_table_factor()?;
15727 let joins = self.parse_joins()?;
15731 Ok(TableWithJoins { relation, joins })
15732 }
15733
15734 fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
15735 let mut joins = vec![];
15736 loop {
15737 let global = self.parse_keyword(Keyword::GLOBAL);
15738 let join = if self.parse_keyword(Keyword::CROSS) {
15739 let join_operator = if self.parse_keyword(Keyword::JOIN) {
15740 JoinOperator::CrossJoin(JoinConstraint::None)
15741 } else if self.parse_keyword(Keyword::APPLY) {
15742 JoinOperator::CrossApply
15744 } else {
15745 return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
15746 };
15747 let relation = self.parse_table_factor()?;
15748 let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
15749 && self.dialect.supports_cross_join_constraint()
15750 {
15751 let constraint = self.parse_join_constraint(false)?;
15752 JoinOperator::CrossJoin(constraint)
15753 } else {
15754 join_operator
15755 };
15756 Join {
15757 relation,
15758 global,
15759 join_operator,
15760 }
15761 } else if self.parse_keyword(Keyword::OUTER) {
15762 self.expect_keyword_is(Keyword::APPLY)?;
15764 Join {
15765 relation: self.parse_table_factor()?,
15766 global,
15767 join_operator: JoinOperator::OuterApply,
15768 }
15769 } else if self.parse_keyword(Keyword::ASOF) {
15770 self.expect_keyword_is(Keyword::JOIN)?;
15771 let relation = self.parse_table_factor()?;
15772 self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
15773 let match_condition = self.parse_parenthesized(Self::parse_expr)?;
15774 Join {
15775 relation,
15776 global,
15777 join_operator: JoinOperator::AsOf {
15778 match_condition,
15779 constraint: self.parse_join_constraint(false)?,
15780 },
15781 }
15782 } else if self.dialect.supports_array_join_syntax()
15783 && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
15784 {
15785 Join {
15787 relation: self.parse_table_factor()?,
15788 global,
15789 join_operator: JoinOperator::InnerArrayJoin,
15790 }
15791 } else if self.dialect.supports_array_join_syntax()
15792 && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
15793 {
15794 Join {
15796 relation: self.parse_table_factor()?,
15797 global,
15798 join_operator: JoinOperator::LeftArrayJoin,
15799 }
15800 } else if self.dialect.supports_array_join_syntax()
15801 && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
15802 {
15803 Join {
15805 relation: self.parse_table_factor()?,
15806 global,
15807 join_operator: JoinOperator::ArrayJoin,
15808 }
15809 } else {
15810 let natural = self.parse_keyword(Keyword::NATURAL);
15811 let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
15812 w.keyword
15813 } else {
15814 Keyword::NoKeyword
15815 };
15816
15817 let join_operator_type = match peek_keyword {
15818 Keyword::INNER | Keyword::JOIN => {
15819 let inner = self.parse_keyword(Keyword::INNER); self.expect_keyword_is(Keyword::JOIN)?;
15821 if inner {
15822 JoinOperator::Inner
15823 } else {
15824 JoinOperator::Join
15825 }
15826 }
15827 kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
15828 let _ = self.next_token(); let is_left = kw == Keyword::LEFT;
15830 let join_type = self.parse_one_of_keywords(&[
15831 Keyword::OUTER,
15832 Keyword::SEMI,
15833 Keyword::ANTI,
15834 Keyword::JOIN,
15835 ]);
15836 match join_type {
15837 Some(Keyword::OUTER) => {
15838 self.expect_keyword_is(Keyword::JOIN)?;
15839 if is_left {
15840 JoinOperator::LeftOuter
15841 } else {
15842 JoinOperator::RightOuter
15843 }
15844 }
15845 Some(Keyword::SEMI) => {
15846 self.expect_keyword_is(Keyword::JOIN)?;
15847 if is_left {
15848 JoinOperator::LeftSemi
15849 } else {
15850 JoinOperator::RightSemi
15851 }
15852 }
15853 Some(Keyword::ANTI) => {
15854 self.expect_keyword_is(Keyword::JOIN)?;
15855 if is_left {
15856 JoinOperator::LeftAnti
15857 } else {
15858 JoinOperator::RightAnti
15859 }
15860 }
15861 Some(Keyword::JOIN) => {
15862 if is_left {
15863 JoinOperator::Left
15864 } else {
15865 JoinOperator::Right
15866 }
15867 }
15868 _ => {
15869 return Err(ParserError::ParserError(format!(
15870 "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
15871 )))
15872 }
15873 }
15874 }
15875 Keyword::ANTI => {
15876 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
15878 JoinOperator::Anti
15879 }
15880 Keyword::SEMI => {
15881 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
15883 JoinOperator::Semi
15884 }
15885 Keyword::FULL => {
15886 let _ = self.next_token(); let _ = self.parse_keyword(Keyword::OUTER); self.expect_keyword_is(Keyword::JOIN)?;
15889 JoinOperator::FullOuter
15890 }
15891 Keyword::OUTER => {
15892 return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
15893 }
15894 Keyword::STRAIGHT_JOIN => {
15895 let _ = self.next_token(); JoinOperator::StraightJoin
15897 }
15898 _ if natural => {
15899 return self
15900 .expected_ref("a join type after NATURAL", self.peek_token_ref());
15901 }
15902 _ => break,
15903 };
15904 let mut relation = self.parse_table_factor()?;
15905
15906 if !self
15907 .dialect
15908 .supports_left_associative_joins_without_parens()
15909 && self.peek_parens_less_nested_join()
15910 {
15911 let joins = self.parse_joins()?;
15912 relation = TableFactor::NestedJoin {
15913 table_with_joins: Box::new(TableWithJoins { relation, joins }),
15914 alias: None,
15915 };
15916 }
15917
15918 let join_constraint = self.parse_join_constraint(natural)?;
15919 Join {
15920 relation,
15921 global,
15922 join_operator: join_operator_type(join_constraint),
15923 }
15924 };
15925 joins.push(join);
15926 }
15927 Ok(joins)
15928 }
15929
15930 fn peek_parens_less_nested_join(&self) -> bool {
15931 matches!(
15932 self.peek_token_ref().token,
15933 Token::Word(Word {
15934 keyword: Keyword::JOIN
15935 | Keyword::INNER
15936 | Keyword::LEFT
15937 | Keyword::RIGHT
15938 | Keyword::FULL,
15939 ..
15940 })
15941 )
15942 }
15943
15944 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
15946 pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
15947 let _guard = self.recursion_counter.try_decrease()?;
15948 if self.parse_keyword(Keyword::LATERAL) {
15949 if self.consume_token(&Token::LParen) {
15951 self.parse_derived_table_factor(Lateral)
15952 } else {
15953 let name = self.parse_object_name(false)?;
15954 self.expect_token(&Token::LParen)?;
15955 let args = self.parse_optional_args()?;
15956 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
15957 let alias = self.maybe_parse_table_alias()?;
15958 Ok(TableFactor::Function {
15959 lateral: true,
15960 name,
15961 args,
15962 with_ordinality,
15963 alias,
15964 })
15965 }
15966 } else if self.parse_keyword(Keyword::TABLE) {
15967 self.expect_token(&Token::LParen)?;
15969 let expr = self.parse_expr()?;
15970 self.expect_token(&Token::RParen)?;
15971 let alias = self.maybe_parse_table_alias()?;
15972 Ok(TableFactor::TableFunction { expr, alias })
15973 } else if self.consume_token(&Token::LParen) {
15974 if let Some(mut table) =
15996 self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))?
15997 {
15998 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
15999 {
16000 table = match kw {
16001 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16002 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16003 unexpected_keyword => return Err(ParserError::ParserError(
16004 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16005 )),
16006 }
16007 }
16008 return Ok(table);
16009 }
16010
16011 let mut table_and_joins = self.parse_table_and_joins()?;
16018
16019 #[allow(clippy::if_same_then_else)]
16020 if !table_and_joins.joins.is_empty() {
16021 self.expect_token(&Token::RParen)?;
16022 let alias = self.maybe_parse_table_alias()?;
16023 Ok(TableFactor::NestedJoin {
16024 table_with_joins: Box::new(table_and_joins),
16025 alias,
16026 }) } else if let TableFactor::NestedJoin {
16028 table_with_joins: _,
16029 alias: _,
16030 } = &table_and_joins.relation
16031 {
16032 self.expect_token(&Token::RParen)?;
16035 let alias = self.maybe_parse_table_alias()?;
16036 Ok(TableFactor::NestedJoin {
16037 table_with_joins: Box::new(table_and_joins),
16038 alias,
16039 })
16040 } else if self.dialect.supports_parens_around_table_factor() {
16041 self.expect_token(&Token::RParen)?;
16048
16049 if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16050 match &mut table_and_joins.relation {
16053 TableFactor::Derived { alias, .. }
16054 | TableFactor::Table { alias, .. }
16055 | TableFactor::Function { alias, .. }
16056 | TableFactor::UNNEST { alias, .. }
16057 | TableFactor::JsonTable { alias, .. }
16058 | TableFactor::XmlTable { alias, .. }
16059 | TableFactor::OpenJsonTable { alias, .. }
16060 | TableFactor::TableFunction { alias, .. }
16061 | TableFactor::Pivot { alias, .. }
16062 | TableFactor::Unpivot { alias, .. }
16063 | TableFactor::MatchRecognize { alias, .. }
16064 | TableFactor::SemanticView { alias, .. }
16065 | TableFactor::NestedJoin { alias, .. } => {
16066 if let Some(inner_alias) = alias {
16068 return Err(ParserError::ParserError(format!(
16069 "duplicate alias {inner_alias}"
16070 )));
16071 }
16072 alias.replace(outer_alias);
16076 }
16077 };
16078 }
16079 Ok(table_and_joins.relation)
16081 } else {
16082 self.expected_ref("joined table", self.peek_token_ref())
16085 }
16086 } else if self.dialect.supports_values_as_table_factor()
16087 && matches!(
16088 self.peek_tokens(),
16089 [
16090 Token::Word(Word {
16091 keyword: Keyword::VALUES,
16092 ..
16093 }),
16094 Token::LParen
16095 ]
16096 )
16097 {
16098 self.expect_keyword_is(Keyword::VALUES)?;
16099
16100 let values = SetExpr::Values(self.parse_values(false, false)?);
16104 let alias = self.maybe_parse_table_alias()?;
16105 Ok(TableFactor::Derived {
16106 lateral: false,
16107 subquery: Box::new(Query {
16108 with: None,
16109 body: Box::new(values),
16110 order_by: None,
16111 limit_clause: None,
16112 fetch: None,
16113 locks: vec![],
16114 for_clause: None,
16115 settings: None,
16116 format_clause: None,
16117 pipe_operators: vec![],
16118 }),
16119 alias,
16120 sample: None,
16121 })
16122 } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16123 && self.parse_keyword(Keyword::UNNEST)
16124 {
16125 self.expect_token(&Token::LParen)?;
16126 let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16127 self.expect_token(&Token::RParen)?;
16128
16129 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16130 let alias = match self.maybe_parse_table_alias() {
16131 Ok(Some(alias)) => Some(alias),
16132 Ok(None) => None,
16133 Err(e) => return Err(e),
16134 };
16135
16136 let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16137 Ok(()) => true,
16138 Err(_) => false,
16139 };
16140
16141 let with_offset_alias = if with_offset {
16142 match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16143 Ok(Some(alias)) => Some(alias),
16144 Ok(None) => None,
16145 Err(e) => return Err(e),
16146 }
16147 } else {
16148 None
16149 };
16150
16151 Ok(TableFactor::UNNEST {
16152 alias,
16153 array_exprs,
16154 with_offset,
16155 with_offset_alias,
16156 with_ordinality,
16157 })
16158 } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16159 let json_expr = self.parse_expr()?;
16160 self.expect_token(&Token::Comma)?;
16161 let json_path = self.parse_value()?;
16162 self.expect_keyword_is(Keyword::COLUMNS)?;
16163 self.expect_token(&Token::LParen)?;
16164 let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16165 self.expect_token(&Token::RParen)?;
16166 self.expect_token(&Token::RParen)?;
16167 let alias = self.maybe_parse_table_alias()?;
16168 Ok(TableFactor::JsonTable {
16169 json_expr,
16170 json_path,
16171 columns,
16172 alias,
16173 })
16174 } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16175 self.prev_token();
16176 self.parse_open_json_table_factor()
16177 } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16178 self.prev_token();
16179 self.parse_xml_table_factor()
16180 } else if self.dialect.supports_semantic_view_table_factor()
16181 && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16182 {
16183 self.parse_semantic_view_table_factor()
16184 } else if self.peek_token_ref().token == Token::AtSign {
16185 self.parse_snowflake_stage_table_factor()
16187 } else {
16188 let name = self.parse_object_name(true)?;
16189
16190 let json_path = match &self.peek_token_ref().token {
16191 Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16192 _ => None,
16193 };
16194
16195 let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16196 && self.parse_keyword(Keyword::PARTITION)
16197 {
16198 self.parse_parenthesized_identifiers()?
16199 } else {
16200 vec![]
16201 };
16202
16203 let version = self.maybe_parse_table_version()?;
16205
16206 let args = if self.consume_token(&Token::LParen) {
16208 Some(self.parse_table_function_args()?)
16209 } else {
16210 None
16211 };
16212
16213 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16214
16215 let mut sample = None;
16216 if self.dialect.supports_table_sample_before_alias() {
16217 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16218 sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16219 }
16220 }
16221
16222 let alias = self.maybe_parse_table_alias()?;
16223
16224 let index_hints = if self.dialect.supports_table_hints() {
16226 self.maybe_parse(|p| p.parse_table_index_hints())?
16227 .unwrap_or(vec![])
16228 } else {
16229 vec![]
16230 };
16231
16232 let mut with_hints = vec![];
16234 if self.parse_keyword(Keyword::WITH) {
16235 if self.consume_token(&Token::LParen) {
16236 with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16237 self.expect_token(&Token::RParen)?;
16238 } else {
16239 self.prev_token();
16241 }
16242 };
16243
16244 if !self.dialect.supports_table_sample_before_alias() {
16245 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16246 sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16247 }
16248 }
16249
16250 let mut table = TableFactor::Table {
16251 name,
16252 alias,
16253 args,
16254 with_hints,
16255 version,
16256 partitions,
16257 with_ordinality,
16258 json_path,
16259 sample,
16260 index_hints,
16261 };
16262
16263 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16264 table = match kw {
16265 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16266 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16267 unexpected_keyword => return Err(ParserError::ParserError(
16268 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16269 )),
16270 }
16271 }
16272
16273 if self.dialect.supports_match_recognize()
16274 && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16275 {
16276 table = self.parse_match_recognize(table)?;
16277 }
16278
16279 Ok(table)
16280 }
16281 }
16282
16283 fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16288 let name = crate::dialect::parse_snowflake_stage_name(self)?;
16290
16291 let args = if self.consume_token(&Token::LParen) {
16293 Some(self.parse_table_function_args()?)
16294 } else {
16295 None
16296 };
16297
16298 let alias = self.maybe_parse_table_alias()?;
16299
16300 Ok(TableFactor::Table {
16301 name,
16302 alias,
16303 args,
16304 with_hints: vec![],
16305 version: None,
16306 partitions: vec![],
16307 with_ordinality: false,
16308 json_path: None,
16309 sample: None,
16310 index_hints: vec![],
16311 })
16312 }
16313
16314 fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16315 let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16316 TableSampleModifier::TableSample
16317 } else if self.parse_keyword(Keyword::SAMPLE) {
16318 TableSampleModifier::Sample
16319 } else {
16320 return Ok(None);
16321 };
16322 self.parse_table_sample(modifier).map(Some)
16323 }
16324
16325 fn parse_table_sample(
16326 &mut self,
16327 modifier: TableSampleModifier,
16328 ) -> Result<Box<TableSample>, ParserError> {
16329 let name = match self.parse_one_of_keywords(&[
16330 Keyword::BERNOULLI,
16331 Keyword::ROW,
16332 Keyword::SYSTEM,
16333 Keyword::BLOCK,
16334 ]) {
16335 Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16336 Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16337 Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16338 Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16339 _ => None,
16340 };
16341
16342 let parenthesized = self.consume_token(&Token::LParen);
16343
16344 let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16345 let selected_bucket = self.parse_number_value()?;
16346 self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16347 let total = self.parse_number_value()?;
16348 let on = if self.parse_keyword(Keyword::ON) {
16349 Some(self.parse_expr()?)
16350 } else {
16351 None
16352 };
16353 (
16354 None,
16355 Some(TableSampleBucket {
16356 bucket: selected_bucket,
16357 total,
16358 on,
16359 }),
16360 )
16361 } else {
16362 let value = match self.maybe_parse(|p| p.parse_expr())? {
16363 Some(num) => num,
16364 None => {
16365 let next_token = self.next_token();
16366 if let Token::Word(w) = next_token.token {
16367 Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16368 } else {
16369 return parser_err!(
16370 "Expecting number or byte length e.g. 100M",
16371 self.peek_token_ref().span.start
16372 );
16373 }
16374 }
16375 };
16376 let unit = if self.parse_keyword(Keyword::ROWS) {
16377 Some(TableSampleUnit::Rows)
16378 } else if self.parse_keyword(Keyword::PERCENT) {
16379 Some(TableSampleUnit::Percent)
16380 } else {
16381 None
16382 };
16383 (
16384 Some(TableSampleQuantity {
16385 parenthesized,
16386 value,
16387 unit,
16388 }),
16389 None,
16390 )
16391 };
16392 if parenthesized {
16393 self.expect_token(&Token::RParen)?;
16394 }
16395
16396 let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16397 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16398 } else if self.parse_keyword(Keyword::SEED) {
16399 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16400 } else {
16401 None
16402 };
16403
16404 let offset = if self.parse_keyword(Keyword::OFFSET) {
16405 Some(self.parse_expr()?)
16406 } else {
16407 None
16408 };
16409
16410 Ok(Box::new(TableSample {
16411 modifier,
16412 name,
16413 quantity,
16414 seed,
16415 bucket,
16416 offset,
16417 }))
16418 }
16419
16420 fn parse_table_sample_seed(
16421 &mut self,
16422 modifier: TableSampleSeedModifier,
16423 ) -> Result<TableSampleSeed, ParserError> {
16424 self.expect_token(&Token::LParen)?;
16425 let value = self.parse_number_value()?;
16426 self.expect_token(&Token::RParen)?;
16427 Ok(TableSampleSeed { modifier, value })
16428 }
16429
16430 fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16433 self.expect_token(&Token::LParen)?;
16434 let json_expr = self.parse_expr()?;
16435 let json_path = if self.consume_token(&Token::Comma) {
16436 Some(self.parse_value()?)
16437 } else {
16438 None
16439 };
16440 self.expect_token(&Token::RParen)?;
16441 let columns = if self.parse_keyword(Keyword::WITH) {
16442 self.expect_token(&Token::LParen)?;
16443 let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16444 self.expect_token(&Token::RParen)?;
16445 columns
16446 } else {
16447 Vec::new()
16448 };
16449 let alias = self.maybe_parse_table_alias()?;
16450 Ok(TableFactor::OpenJsonTable {
16451 json_expr,
16452 json_path,
16453 columns,
16454 alias,
16455 })
16456 }
16457
16458 fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16459 self.expect_token(&Token::LParen)?;
16460 let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
16461 self.expect_token(&Token::LParen)?;
16462 let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
16463 self.expect_token(&Token::RParen)?;
16464 self.expect_token(&Token::Comma)?;
16465 namespaces
16466 } else {
16467 vec![]
16468 };
16469 let row_expression = self.parse_expr()?;
16470 let passing = self.parse_xml_passing_clause()?;
16471 self.expect_keyword_is(Keyword::COLUMNS)?;
16472 let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
16473 self.expect_token(&Token::RParen)?;
16474 let alias = self.maybe_parse_table_alias()?;
16475 Ok(TableFactor::XmlTable {
16476 namespaces,
16477 row_expression,
16478 passing,
16479 columns,
16480 alias,
16481 })
16482 }
16483
16484 fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
16485 let uri = self.parse_expr()?;
16486 self.expect_keyword_is(Keyword::AS)?;
16487 let name = self.parse_identifier()?;
16488 Ok(XmlNamespaceDefinition { uri, name })
16489 }
16490
16491 fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
16492 let name = self.parse_identifier()?;
16493
16494 let option = if self.parse_keyword(Keyword::FOR) {
16495 self.expect_keyword(Keyword::ORDINALITY)?;
16496 XmlTableColumnOption::ForOrdinality
16497 } else {
16498 let r#type = self.parse_data_type()?;
16499 let mut path = None;
16500 let mut default = None;
16501
16502 if self.parse_keyword(Keyword::PATH) {
16503 path = Some(self.parse_expr()?);
16504 }
16505
16506 if self.parse_keyword(Keyword::DEFAULT) {
16507 default = Some(self.parse_expr()?);
16508 }
16509
16510 let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
16511 if !not_null {
16512 let _ = self.parse_keyword(Keyword::NULL);
16514 }
16515
16516 XmlTableColumnOption::NamedInfo {
16517 r#type,
16518 path,
16519 default,
16520 nullable: !not_null,
16521 }
16522 };
16523 Ok(XmlTableColumn { name, option })
16524 }
16525
16526 fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
16527 let mut arguments = vec![];
16528 if self.parse_keyword(Keyword::PASSING) {
16529 loop {
16530 let by_value =
16531 self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
16532 let expr = self.parse_expr()?;
16533 let alias = if self.parse_keyword(Keyword::AS) {
16534 Some(self.parse_identifier()?)
16535 } else {
16536 None
16537 };
16538 arguments.push(XmlPassingArgument {
16539 expr,
16540 alias,
16541 by_value,
16542 });
16543 if !self.consume_token(&Token::Comma) {
16544 break;
16545 }
16546 }
16547 }
16548 Ok(XmlPassingClause { arguments })
16549 }
16550
16551 fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16553 self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
16554 self.expect_token(&Token::LParen)?;
16555
16556 let name = self.parse_object_name(true)?;
16557
16558 let mut dimensions = Vec::new();
16560 let mut metrics = Vec::new();
16561 let mut facts = Vec::new();
16562 let mut where_clause = None;
16563
16564 while self.peek_token_ref().token != Token::RParen {
16565 if self.parse_keyword(Keyword::DIMENSIONS) {
16566 if !dimensions.is_empty() {
16567 return Err(ParserError::ParserError(
16568 "DIMENSIONS clause can only be specified once".to_string(),
16569 ));
16570 }
16571 dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16572 } else if self.parse_keyword(Keyword::METRICS) {
16573 if !metrics.is_empty() {
16574 return Err(ParserError::ParserError(
16575 "METRICS clause can only be specified once".to_string(),
16576 ));
16577 }
16578 metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16579 } else if self.parse_keyword(Keyword::FACTS) {
16580 if !facts.is_empty() {
16581 return Err(ParserError::ParserError(
16582 "FACTS clause can only be specified once".to_string(),
16583 ));
16584 }
16585 facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16586 } else if self.parse_keyword(Keyword::WHERE) {
16587 if where_clause.is_some() {
16588 return Err(ParserError::ParserError(
16589 "WHERE clause can only be specified once".to_string(),
16590 ));
16591 }
16592 where_clause = Some(self.parse_expr()?);
16593 } else {
16594 let tok = self.peek_token_ref();
16595 return parser_err!(
16596 format!(
16597 "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
16598 tok.token
16599 ),
16600 tok.span.start
16601 )?;
16602 }
16603 }
16604
16605 self.expect_token(&Token::RParen)?;
16606
16607 let alias = self.maybe_parse_table_alias()?;
16608
16609 Ok(TableFactor::SemanticView {
16610 name,
16611 dimensions,
16612 metrics,
16613 facts,
16614 where_clause,
16615 alias,
16616 })
16617 }
16618
16619 fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
16620 self.expect_token(&Token::LParen)?;
16621
16622 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
16623 self.parse_comma_separated(Parser::parse_expr)?
16624 } else {
16625 vec![]
16626 };
16627
16628 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
16629 self.parse_comma_separated(Parser::parse_order_by_expr)?
16630 } else {
16631 vec![]
16632 };
16633
16634 let measures = if self.parse_keyword(Keyword::MEASURES) {
16635 self.parse_comma_separated(|p| {
16636 let expr = p.parse_expr()?;
16637 let _ = p.parse_keyword(Keyword::AS);
16638 let alias = p.parse_identifier()?;
16639 Ok(Measure { expr, alias })
16640 })?
16641 } else {
16642 vec![]
16643 };
16644
16645 let rows_per_match =
16646 if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
16647 Some(RowsPerMatch::OneRow)
16648 } else if self.parse_keywords(&[
16649 Keyword::ALL,
16650 Keyword::ROWS,
16651 Keyword::PER,
16652 Keyword::MATCH,
16653 ]) {
16654 Some(RowsPerMatch::AllRows(
16655 if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
16656 Some(EmptyMatchesMode::Show)
16657 } else if self.parse_keywords(&[
16658 Keyword::OMIT,
16659 Keyword::EMPTY,
16660 Keyword::MATCHES,
16661 ]) {
16662 Some(EmptyMatchesMode::Omit)
16663 } else if self.parse_keywords(&[
16664 Keyword::WITH,
16665 Keyword::UNMATCHED,
16666 Keyword::ROWS,
16667 ]) {
16668 Some(EmptyMatchesMode::WithUnmatched)
16669 } else {
16670 None
16671 },
16672 ))
16673 } else {
16674 None
16675 };
16676
16677 let after_match_skip =
16678 if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
16679 if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
16680 Some(AfterMatchSkip::PastLastRow)
16681 } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
16682 Some(AfterMatchSkip::ToNextRow)
16683 } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
16684 Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
16685 } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
16686 Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
16687 } else {
16688 let found = self.next_token();
16689 return self.expected("after match skip option", found);
16690 }
16691 } else {
16692 None
16693 };
16694
16695 self.expect_keyword_is(Keyword::PATTERN)?;
16696 let pattern = self.parse_parenthesized(Self::parse_pattern)?;
16697
16698 self.expect_keyword_is(Keyword::DEFINE)?;
16699
16700 let symbols = self.parse_comma_separated(|p| {
16701 let symbol = p.parse_identifier()?;
16702 p.expect_keyword_is(Keyword::AS)?;
16703 let definition = p.parse_expr()?;
16704 Ok(SymbolDefinition { symbol, definition })
16705 })?;
16706
16707 self.expect_token(&Token::RParen)?;
16708
16709 let alias = self.maybe_parse_table_alias()?;
16710
16711 Ok(TableFactor::MatchRecognize {
16712 table: Box::new(table),
16713 partition_by,
16714 order_by,
16715 measures,
16716 rows_per_match,
16717 after_match_skip,
16718 pattern,
16719 symbols,
16720 alias,
16721 })
16722 }
16723
16724 fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16725 match self.next_token().token {
16726 Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
16727 Token::Placeholder(s) if s == "$" => {
16728 Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
16729 }
16730 Token::LBrace => {
16731 self.expect_token(&Token::Minus)?;
16732 let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
16733 self.expect_token(&Token::Minus)?;
16734 self.expect_token(&Token::RBrace)?;
16735 Ok(MatchRecognizePattern::Exclude(symbol))
16736 }
16737 Token::Word(Word {
16738 value,
16739 quote_style: None,
16740 ..
16741 }) if value == "PERMUTE" => {
16742 self.expect_token(&Token::LParen)?;
16743 let symbols = self.parse_comma_separated(|p| {
16744 p.parse_identifier().map(MatchRecognizeSymbol::Named)
16745 })?;
16746 self.expect_token(&Token::RParen)?;
16747 Ok(MatchRecognizePattern::Permute(symbols))
16748 }
16749 Token::LParen => {
16750 let pattern = self.parse_pattern()?;
16751 self.expect_token(&Token::RParen)?;
16752 Ok(MatchRecognizePattern::Group(Box::new(pattern)))
16753 }
16754 _ => {
16755 self.prev_token();
16756 self.parse_identifier()
16757 .map(MatchRecognizeSymbol::Named)
16758 .map(MatchRecognizePattern::Symbol)
16759 }
16760 }
16761 }
16762
16763 fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16764 let mut pattern = self.parse_base_pattern()?;
16765 loop {
16766 let token = self.next_token();
16767 let quantifier = match token.token {
16768 Token::Mul => RepetitionQuantifier::ZeroOrMore,
16769 Token::Plus => RepetitionQuantifier::OneOrMore,
16770 Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
16771 Token::LBrace => {
16772 let token = self.next_token();
16774 match token.token {
16775 Token::Comma => {
16776 let next_token = self.next_token();
16777 let Token::Number(n, _) = next_token.token else {
16778 return self.expected("literal number", next_token);
16779 };
16780 self.expect_token(&Token::RBrace)?;
16781 RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
16782 }
16783 Token::Number(n, _) if self.consume_token(&Token::Comma) => {
16784 let next_token = self.next_token();
16785 match next_token.token {
16786 Token::Number(m, _) => {
16787 self.expect_token(&Token::RBrace)?;
16788 RepetitionQuantifier::Range(
16789 Self::parse(n, token.span.start)?,
16790 Self::parse(m, token.span.start)?,
16791 )
16792 }
16793 Token::RBrace => {
16794 RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
16795 }
16796 _ => {
16797 return self.expected("} or upper bound", next_token);
16798 }
16799 }
16800 }
16801 Token::Number(n, _) => {
16802 self.expect_token(&Token::RBrace)?;
16803 RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
16804 }
16805 _ => return self.expected("quantifier range", token),
16806 }
16807 }
16808 _ => {
16809 self.prev_token();
16810 break;
16811 }
16812 };
16813 pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
16814 }
16815 Ok(pattern)
16816 }
16817
16818 fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16819 let mut patterns = vec![self.parse_repetition_pattern()?];
16820 while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
16821 patterns.push(self.parse_repetition_pattern()?);
16822 }
16823 match <[MatchRecognizePattern; 1]>::try_from(patterns) {
16824 Ok([pattern]) => Ok(pattern),
16825 Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
16826 }
16827 }
16828
16829 fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16830 let pattern = self.parse_concat_pattern()?;
16831 if self.consume_token(&Token::Pipe) {
16832 match self.parse_pattern()? {
16833 MatchRecognizePattern::Alternation(mut patterns) => {
16835 patterns.insert(0, pattern);
16836 Ok(MatchRecognizePattern::Alternation(patterns))
16837 }
16838 next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
16839 }
16840 } else {
16841 Ok(pattern)
16842 }
16843 }
16844
16845 pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
16847 if self.dialect.supports_table_versioning() {
16848 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
16849 {
16850 let expr = self.parse_expr()?;
16851 return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
16852 } else if self.peek_keyword(Keyword::CHANGES) {
16853 return self.parse_table_version_changes().map(Some);
16854 } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
16855 let func_name = self.parse_object_name(true)?;
16856 let func = self.parse_function(func_name)?;
16857 return Ok(Some(TableVersion::Function(func)));
16858 } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
16859 let expr = self.parse_expr()?;
16860 return Ok(Some(TableVersion::TimestampAsOf(expr)));
16861 } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
16862 let expr = Expr::Value(self.parse_number_value()?);
16863 return Ok(Some(TableVersion::VersionAsOf(expr)));
16864 }
16865 }
16866 Ok(None)
16867 }
16868
16869 fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
16880 let changes_name = self.parse_object_name(true)?;
16881 let changes = self.parse_function(changes_name)?;
16882 let at_name = self.parse_object_name(true)?;
16883 let at = self.parse_function(at_name)?;
16884 let end = if self.peek_keyword(Keyword::END) {
16885 let end_name = self.parse_object_name(true)?;
16886 Some(self.parse_function(end_name)?)
16887 } else {
16888 None
16889 };
16890 Ok(TableVersion::Changes { changes, at, end })
16891 }
16892
16893 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
16896 if self.parse_keyword(Keyword::NESTED) {
16897 let _has_path_keyword = self.parse_keyword(Keyword::PATH);
16898 let path = self.parse_value()?;
16899 self.expect_keyword_is(Keyword::COLUMNS)?;
16900 let columns = self.parse_parenthesized(|p| {
16901 p.parse_comma_separated(Self::parse_json_table_column_def)
16902 })?;
16903 return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
16904 path,
16905 columns,
16906 }));
16907 }
16908 let name = self.parse_identifier()?;
16909 if self.parse_keyword(Keyword::FOR) {
16910 self.expect_keyword_is(Keyword::ORDINALITY)?;
16911 return Ok(JsonTableColumn::ForOrdinality(name));
16912 }
16913 let r#type = self.parse_data_type()?;
16914 let exists = self.parse_keyword(Keyword::EXISTS);
16915 self.expect_keyword_is(Keyword::PATH)?;
16916 let path = self.parse_value()?;
16917 let mut on_empty = None;
16918 let mut on_error = None;
16919 while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
16920 if self.parse_keyword(Keyword::EMPTY) {
16921 on_empty = Some(error_handling);
16922 } else {
16923 self.expect_keyword_is(Keyword::ERROR)?;
16924 on_error = Some(error_handling);
16925 }
16926 }
16927 Ok(JsonTableColumn::Named(JsonTableNamedColumn {
16928 name,
16929 r#type,
16930 path,
16931 exists,
16932 on_empty,
16933 on_error,
16934 }))
16935 }
16936
16937 pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
16945 let name = self.parse_identifier()?;
16946 let r#type = self.parse_data_type()?;
16947 let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
16948 self.next_token();
16949 Some(path)
16950 } else {
16951 None
16952 };
16953 let as_json = self.parse_keyword(Keyword::AS);
16954 if as_json {
16955 self.expect_keyword_is(Keyword::JSON)?;
16956 }
16957 Ok(OpenJsonTableColumn {
16958 name,
16959 r#type,
16960 path,
16961 as_json,
16962 })
16963 }
16964
16965 fn parse_json_table_column_error_handling(
16966 &mut self,
16967 ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
16968 let res = if self.parse_keyword(Keyword::NULL) {
16969 JsonTableColumnErrorHandling::Null
16970 } else if self.parse_keyword(Keyword::ERROR) {
16971 JsonTableColumnErrorHandling::Error
16972 } else if self.parse_keyword(Keyword::DEFAULT) {
16973 JsonTableColumnErrorHandling::Default(self.parse_value()?)
16974 } else {
16975 return Ok(None);
16976 };
16977 self.expect_keyword_is(Keyword::ON)?;
16978 Ok(Some(res))
16979 }
16980
16981 pub fn parse_derived_table_factor(
16983 &mut self,
16984 lateral: IsLateral,
16985 ) -> Result<TableFactor, ParserError> {
16986 let subquery = self.parse_query()?;
16987 self.expect_token(&Token::RParen)?;
16988 let alias = self.maybe_parse_table_alias()?;
16989
16990 let sample = self
16992 .maybe_parse_table_sample()?
16993 .map(TableSampleKind::AfterTableAlias);
16994
16995 Ok(TableFactor::Derived {
16996 lateral: match lateral {
16997 Lateral => true,
16998 NotLateral => false,
16999 },
17000 subquery,
17001 alias,
17002 sample,
17003 })
17004 }
17005
17006 pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17029 let expr = self.parse_expr()?;
17030 let alias = if self.parse_keyword(Keyword::AS) {
17031 Some(self.parse_identifier()?)
17032 } else {
17033 None
17034 };
17035
17036 Ok(ExprWithAlias { expr, alias })
17037 }
17038
17039 fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17043 let expr = self.parse_expr()?;
17044 let alias = self.parse_identifier_optional_alias()?;
17045 Ok(ExprWithAlias { expr, alias })
17046 }
17047
17048 fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17050 let function_name = match self.next_token().token {
17051 Token::Word(w) => Ok(w.value),
17052 _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17053 }?;
17054 let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17055 let alias = {
17056 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17057 kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17059 }
17060 self.parse_optional_alias_inner(None, validator)?
17061 };
17062 Ok(ExprWithAlias { expr, alias })
17063 }
17064
17065 pub fn parse_pivot_table_factor(
17067 &mut self,
17068 table: TableFactor,
17069 ) -> Result<TableFactor, ParserError> {
17070 self.expect_token(&Token::LParen)?;
17071 let aggregate_functions =
17072 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17073 self.expect_keyword_is(Keyword::FOR)?;
17074 let value_column = if self.peek_token_ref().token == Token::LParen {
17075 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17076 p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17077 })?
17078 } else {
17079 vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17080 };
17081 self.expect_keyword_is(Keyword::IN)?;
17082
17083 self.expect_token(&Token::LParen)?;
17084 let value_source = if self.parse_keyword(Keyword::ANY) {
17085 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17086 self.parse_comma_separated(Parser::parse_order_by_expr)?
17087 } else {
17088 vec![]
17089 };
17090 PivotValueSource::Any(order_by)
17091 } else if self.peek_sub_query() {
17092 PivotValueSource::Subquery(self.parse_query()?)
17093 } else {
17094 PivotValueSource::List(
17095 self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17096 )
17097 };
17098 self.expect_token(&Token::RParen)?;
17099
17100 let default_on_null =
17101 if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17102 self.expect_token(&Token::LParen)?;
17103 let expr = self.parse_expr()?;
17104 self.expect_token(&Token::RParen)?;
17105 Some(expr)
17106 } else {
17107 None
17108 };
17109
17110 self.expect_token(&Token::RParen)?;
17111 let alias = self.maybe_parse_table_alias()?;
17112 Ok(TableFactor::Pivot {
17113 table: Box::new(table),
17114 aggregate_functions,
17115 value_column,
17116 value_source,
17117 default_on_null,
17118 alias,
17119 })
17120 }
17121
17122 pub fn parse_unpivot_table_factor(
17124 &mut self,
17125 table: TableFactor,
17126 ) -> Result<TableFactor, ParserError> {
17127 let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17128 self.expect_keyword_is(Keyword::NULLS)?;
17129 Some(NullInclusion::IncludeNulls)
17130 } else if self.parse_keyword(Keyword::EXCLUDE) {
17131 self.expect_keyword_is(Keyword::NULLS)?;
17132 Some(NullInclusion::ExcludeNulls)
17133 } else {
17134 None
17135 };
17136 self.expect_token(&Token::LParen)?;
17137 let value = self.parse_expr()?;
17138 self.expect_keyword_is(Keyword::FOR)?;
17139 let name = self.parse_identifier()?;
17140 self.expect_keyword_is(Keyword::IN)?;
17141 let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17142 p.parse_expr_with_alias()
17143 })?;
17144 self.expect_token(&Token::RParen)?;
17145 let alias = self.maybe_parse_table_alias()?;
17146 Ok(TableFactor::Unpivot {
17147 table: Box::new(table),
17148 value,
17149 null_inclusion,
17150 name,
17151 columns,
17152 alias,
17153 })
17154 }
17155
17156 pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17158 if natural {
17159 Ok(JoinConstraint::Natural)
17160 } else if self.parse_keyword(Keyword::ON) {
17161 let constraint = self.parse_expr()?;
17162 Ok(JoinConstraint::On(constraint))
17163 } else if self.parse_keyword(Keyword::USING) {
17164 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17165 Ok(JoinConstraint::Using(columns))
17166 } else {
17167 Ok(JoinConstraint::None)
17168 }
17170 }
17171
17172 pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17174 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17175
17176 self.expect_keyword_is(Keyword::TO)?;
17177 let grantees = self.parse_grantees()?;
17178
17179 let with_grant_option =
17180 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17181
17182 let current_grants =
17183 if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17184 Some(CurrentGrantsKind::CopyCurrentGrants)
17185 } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17186 Some(CurrentGrantsKind::RevokeCurrentGrants)
17187 } else {
17188 None
17189 };
17190
17191 let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17192 Some(self.parse_identifier()?)
17193 } else {
17194 None
17195 };
17196
17197 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17198 Some(self.parse_identifier()?)
17199 } else {
17200 None
17201 };
17202
17203 Ok(Grant {
17204 privileges,
17205 objects,
17206 grantees,
17207 with_grant_option,
17208 as_grantor,
17209 granted_by,
17210 current_grants,
17211 })
17212 }
17213
17214 fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17215 let mut values = vec![];
17216 let mut grantee_type = GranteesType::None;
17217 loop {
17218 let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17219 GranteesType::Role
17220 } else if self.parse_keyword(Keyword::USER) {
17221 GranteesType::User
17222 } else if self.parse_keyword(Keyword::SHARE) {
17223 GranteesType::Share
17224 } else if self.parse_keyword(Keyword::GROUP) {
17225 GranteesType::Group
17226 } else if self.parse_keyword(Keyword::PUBLIC) {
17227 GranteesType::Public
17228 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17229 GranteesType::DatabaseRole
17230 } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17231 GranteesType::ApplicationRole
17232 } else if self.parse_keyword(Keyword::APPLICATION) {
17233 GranteesType::Application
17234 } else {
17235 grantee_type.clone() };
17237
17238 if self
17239 .dialect
17240 .get_reserved_grantees_types()
17241 .contains(&new_grantee_type)
17242 {
17243 self.prev_token();
17244 } else {
17245 grantee_type = new_grantee_type;
17246 }
17247
17248 let grantee = if grantee_type == GranteesType::Public {
17249 Grantee {
17250 grantee_type: grantee_type.clone(),
17251 name: None,
17252 }
17253 } else {
17254 let mut name = self.parse_grantee_name()?;
17255 if self.consume_token(&Token::Colon) {
17256 let ident = self.parse_identifier()?;
17260 if let GranteeName::ObjectName(namespace) = name {
17261 name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17262 format!("{namespace}:{ident}"),
17263 )]));
17264 };
17265 }
17266 Grantee {
17267 grantee_type: grantee_type.clone(),
17268 name: Some(name),
17269 }
17270 };
17271
17272 values.push(grantee);
17273
17274 if !self.consume_token(&Token::Comma) {
17275 break;
17276 }
17277 }
17278
17279 Ok(values)
17280 }
17281
17282 pub fn parse_grant_deny_revoke_privileges_objects(
17284 &mut self,
17285 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17286 let privileges = if self.parse_keyword(Keyword::ALL) {
17287 Privileges::All {
17288 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17289 }
17290 } else {
17291 let actions = self.parse_actions_list()?;
17292 Privileges::Actions(actions)
17293 };
17294
17295 let objects = if self.parse_keyword(Keyword::ON) {
17296 if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17297 Some(GrantObjects::AllTablesInSchema {
17298 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17299 })
17300 } else if self.parse_keywords(&[
17301 Keyword::ALL,
17302 Keyword::EXTERNAL,
17303 Keyword::TABLES,
17304 Keyword::IN,
17305 Keyword::SCHEMA,
17306 ]) {
17307 Some(GrantObjects::AllExternalTablesInSchema {
17308 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17309 })
17310 } else if self.parse_keywords(&[
17311 Keyword::ALL,
17312 Keyword::VIEWS,
17313 Keyword::IN,
17314 Keyword::SCHEMA,
17315 ]) {
17316 Some(GrantObjects::AllViewsInSchema {
17317 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17318 })
17319 } else if self.parse_keywords(&[
17320 Keyword::ALL,
17321 Keyword::MATERIALIZED,
17322 Keyword::VIEWS,
17323 Keyword::IN,
17324 Keyword::SCHEMA,
17325 ]) {
17326 Some(GrantObjects::AllMaterializedViewsInSchema {
17327 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17328 })
17329 } else if self.parse_keywords(&[
17330 Keyword::ALL,
17331 Keyword::FUNCTIONS,
17332 Keyword::IN,
17333 Keyword::SCHEMA,
17334 ]) {
17335 Some(GrantObjects::AllFunctionsInSchema {
17336 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17337 })
17338 } else if self.parse_keywords(&[
17339 Keyword::FUTURE,
17340 Keyword::SCHEMAS,
17341 Keyword::IN,
17342 Keyword::DATABASE,
17343 ]) {
17344 Some(GrantObjects::FutureSchemasInDatabase {
17345 databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17346 })
17347 } else if self.parse_keywords(&[
17348 Keyword::FUTURE,
17349 Keyword::TABLES,
17350 Keyword::IN,
17351 Keyword::SCHEMA,
17352 ]) {
17353 Some(GrantObjects::FutureTablesInSchema {
17354 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17355 })
17356 } else if self.parse_keywords(&[
17357 Keyword::FUTURE,
17358 Keyword::EXTERNAL,
17359 Keyword::TABLES,
17360 Keyword::IN,
17361 Keyword::SCHEMA,
17362 ]) {
17363 Some(GrantObjects::FutureExternalTablesInSchema {
17364 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17365 })
17366 } else if self.parse_keywords(&[
17367 Keyword::FUTURE,
17368 Keyword::VIEWS,
17369 Keyword::IN,
17370 Keyword::SCHEMA,
17371 ]) {
17372 Some(GrantObjects::FutureViewsInSchema {
17373 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17374 })
17375 } else if self.parse_keywords(&[
17376 Keyword::FUTURE,
17377 Keyword::MATERIALIZED,
17378 Keyword::VIEWS,
17379 Keyword::IN,
17380 Keyword::SCHEMA,
17381 ]) {
17382 Some(GrantObjects::FutureMaterializedViewsInSchema {
17383 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17384 })
17385 } else if self.parse_keywords(&[
17386 Keyword::ALL,
17387 Keyword::SEQUENCES,
17388 Keyword::IN,
17389 Keyword::SCHEMA,
17390 ]) {
17391 Some(GrantObjects::AllSequencesInSchema {
17392 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17393 })
17394 } else if self.parse_keywords(&[
17395 Keyword::FUTURE,
17396 Keyword::SEQUENCES,
17397 Keyword::IN,
17398 Keyword::SCHEMA,
17399 ]) {
17400 Some(GrantObjects::FutureSequencesInSchema {
17401 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17402 })
17403 } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17404 Some(GrantObjects::ResourceMonitors(
17405 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17406 ))
17407 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17408 Some(GrantObjects::ComputePools(
17409 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17410 ))
17411 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17412 Some(GrantObjects::FailoverGroup(
17413 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17414 ))
17415 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17416 Some(GrantObjects::ReplicationGroup(
17417 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17418 ))
17419 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17420 Some(GrantObjects::ExternalVolumes(
17421 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17422 ))
17423 } else {
17424 let object_type = self.parse_one_of_keywords(&[
17425 Keyword::SEQUENCE,
17426 Keyword::DATABASE,
17427 Keyword::SCHEMA,
17428 Keyword::TABLE,
17429 Keyword::VIEW,
17430 Keyword::WAREHOUSE,
17431 Keyword::INTEGRATION,
17432 Keyword::VIEW,
17433 Keyword::WAREHOUSE,
17434 Keyword::INTEGRATION,
17435 Keyword::USER,
17436 Keyword::CONNECTION,
17437 Keyword::PROCEDURE,
17438 Keyword::FUNCTION,
17439 ]);
17440 let objects =
17441 self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
17442 match object_type {
17443 Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
17444 Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
17445 Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
17446 Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
17447 Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
17448 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
17449 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
17450 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
17451 kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
17452 if let Some(name) = objects?.first() {
17453 self.parse_grant_procedure_or_function(name, &kw)?
17454 } else {
17455 self.expected_ref("procedure or function name", self.peek_token_ref())?
17456 }
17457 }
17458 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
17459 Some(unexpected_keyword) => return Err(ParserError::ParserError(
17460 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
17461 )),
17462 }
17463 }
17464 } else {
17465 None
17466 };
17467
17468 Ok((privileges, objects))
17469 }
17470
17471 fn parse_grant_procedure_or_function(
17472 &mut self,
17473 name: &ObjectName,
17474 kw: &Option<Keyword>,
17475 ) -> Result<Option<GrantObjects>, ParserError> {
17476 let arg_types = if self.consume_token(&Token::LParen) {
17477 let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
17478 self.expect_token(&Token::RParen)?;
17479 list
17480 } else {
17481 vec![]
17482 };
17483 match kw {
17484 Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
17485 name: name.clone(),
17486 arg_types,
17487 })),
17488 Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
17489 name: name.clone(),
17490 arg_types,
17491 })),
17492 _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
17493 }
17494 }
17495
17496 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
17498 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
17499 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
17500 if columns.is_empty() {
17501 Ok(None)
17502 } else {
17503 Ok(Some(columns))
17504 }
17505 }
17506
17507 if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
17509 Ok(Action::ImportedPrivileges)
17510 } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
17511 Ok(Action::AddSearchOptimization)
17512 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
17513 Ok(Action::AttachListing)
17514 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
17515 Ok(Action::AttachPolicy)
17516 } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
17517 Ok(Action::BindServiceEndpoint)
17518 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17519 let role = self.parse_object_name(false)?;
17520 Ok(Action::DatabaseRole { role })
17521 } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
17522 Ok(Action::EvolveSchema)
17523 } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
17524 Ok(Action::ImportShare)
17525 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
17526 Ok(Action::ManageVersions)
17527 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
17528 Ok(Action::ManageReleases)
17529 } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
17530 Ok(Action::OverrideShareRestrictions)
17531 } else if self.parse_keywords(&[
17532 Keyword::PURCHASE,
17533 Keyword::DATA,
17534 Keyword::EXCHANGE,
17535 Keyword::LISTING,
17536 ]) {
17537 Ok(Action::PurchaseDataExchangeListing)
17538 } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
17539 Ok(Action::ResolveAll)
17540 } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
17541 Ok(Action::ReadSession)
17542
17543 } else if self.parse_keyword(Keyword::APPLY) {
17545 let apply_type = self.parse_action_apply_type()?;
17546 Ok(Action::Apply { apply_type })
17547 } else if self.parse_keyword(Keyword::APPLYBUDGET) {
17548 Ok(Action::ApplyBudget)
17549 } else if self.parse_keyword(Keyword::AUDIT) {
17550 Ok(Action::Audit)
17551 } else if self.parse_keyword(Keyword::CONNECT) {
17552 Ok(Action::Connect)
17553 } else if self.parse_keyword(Keyword::CREATE) {
17554 let obj_type = self.maybe_parse_action_create_object_type();
17555 Ok(Action::Create { obj_type })
17556 } else if self.parse_keyword(Keyword::DELETE) {
17557 Ok(Action::Delete)
17558 } else if self.parse_keyword(Keyword::EXEC) {
17559 let obj_type = self.maybe_parse_action_execute_obj_type();
17560 Ok(Action::Exec { obj_type })
17561 } else if self.parse_keyword(Keyword::EXECUTE) {
17562 let obj_type = self.maybe_parse_action_execute_obj_type();
17563 Ok(Action::Execute { obj_type })
17564 } else if self.parse_keyword(Keyword::FAILOVER) {
17565 Ok(Action::Failover)
17566 } else if self.parse_keyword(Keyword::INSERT) {
17567 Ok(Action::Insert {
17568 columns: parse_columns(self)?,
17569 })
17570 } else if self.parse_keyword(Keyword::MANAGE) {
17571 let manage_type = self.parse_action_manage_type()?;
17572 Ok(Action::Manage { manage_type })
17573 } else if self.parse_keyword(Keyword::MODIFY) {
17574 let modify_type = self.parse_action_modify_type();
17575 Ok(Action::Modify { modify_type })
17576 } else if self.parse_keyword(Keyword::MONITOR) {
17577 let monitor_type = self.parse_action_monitor_type();
17578 Ok(Action::Monitor { monitor_type })
17579 } else if self.parse_keyword(Keyword::OPERATE) {
17580 Ok(Action::Operate)
17581 } else if self.parse_keyword(Keyword::REFERENCES) {
17582 Ok(Action::References {
17583 columns: parse_columns(self)?,
17584 })
17585 } else if self.parse_keyword(Keyword::READ) {
17586 Ok(Action::Read)
17587 } else if self.parse_keyword(Keyword::REPLICATE) {
17588 Ok(Action::Replicate)
17589 } else if self.parse_keyword(Keyword::ROLE) {
17590 let role = self.parse_object_name(false)?;
17591 Ok(Action::Role { role })
17592 } else if self.parse_keyword(Keyword::SELECT) {
17593 Ok(Action::Select {
17594 columns: parse_columns(self)?,
17595 })
17596 } else if self.parse_keyword(Keyword::TEMPORARY) {
17597 Ok(Action::Temporary)
17598 } else if self.parse_keyword(Keyword::TRIGGER) {
17599 Ok(Action::Trigger)
17600 } else if self.parse_keyword(Keyword::TRUNCATE) {
17601 Ok(Action::Truncate)
17602 } else if self.parse_keyword(Keyword::UPDATE) {
17603 Ok(Action::Update {
17604 columns: parse_columns(self)?,
17605 })
17606 } else if self.parse_keyword(Keyword::USAGE) {
17607 Ok(Action::Usage)
17608 } else if self.parse_keyword(Keyword::OWNERSHIP) {
17609 Ok(Action::Ownership)
17610 } else if self.parse_keyword(Keyword::DROP) {
17611 Ok(Action::Drop)
17612 } else {
17613 self.expected_ref("a privilege keyword", self.peek_token_ref())?
17614 }
17615 }
17616
17617 fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
17618 if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
17620 Some(ActionCreateObjectType::ApplicationPackage)
17621 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17622 Some(ActionCreateObjectType::ComputePool)
17623 } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
17624 Some(ActionCreateObjectType::DataExchangeListing)
17625 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17626 Some(ActionCreateObjectType::ExternalVolume)
17627 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17628 Some(ActionCreateObjectType::FailoverGroup)
17629 } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
17630 Some(ActionCreateObjectType::NetworkPolicy)
17631 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
17632 Some(ActionCreateObjectType::OrganiationListing)
17633 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17634 Some(ActionCreateObjectType::ReplicationGroup)
17635 }
17636 else if self.parse_keyword(Keyword::ACCOUNT) {
17638 Some(ActionCreateObjectType::Account)
17639 } else if self.parse_keyword(Keyword::APPLICATION) {
17640 Some(ActionCreateObjectType::Application)
17641 } else if self.parse_keyword(Keyword::DATABASE) {
17642 Some(ActionCreateObjectType::Database)
17643 } else if self.parse_keyword(Keyword::INTEGRATION) {
17644 Some(ActionCreateObjectType::Integration)
17645 } else if self.parse_keyword(Keyword::ROLE) {
17646 Some(ActionCreateObjectType::Role)
17647 } else if self.parse_keyword(Keyword::SCHEMA) {
17648 Some(ActionCreateObjectType::Schema)
17649 } else if self.parse_keyword(Keyword::SHARE) {
17650 Some(ActionCreateObjectType::Share)
17651 } else if self.parse_keyword(Keyword::USER) {
17652 Some(ActionCreateObjectType::User)
17653 } else if self.parse_keyword(Keyword::WAREHOUSE) {
17654 Some(ActionCreateObjectType::Warehouse)
17655 } else {
17656 None
17657 }
17658 }
17659
17660 fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
17661 if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
17662 Ok(ActionApplyType::AggregationPolicy)
17663 } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
17664 Ok(ActionApplyType::AuthenticationPolicy)
17665 } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
17666 Ok(ActionApplyType::JoinPolicy)
17667 } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
17668 Ok(ActionApplyType::MaskingPolicy)
17669 } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
17670 Ok(ActionApplyType::PackagesPolicy)
17671 } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
17672 Ok(ActionApplyType::PasswordPolicy)
17673 } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
17674 Ok(ActionApplyType::ProjectionPolicy)
17675 } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
17676 Ok(ActionApplyType::RowAccessPolicy)
17677 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
17678 Ok(ActionApplyType::SessionPolicy)
17679 } else if self.parse_keyword(Keyword::TAG) {
17680 Ok(ActionApplyType::Tag)
17681 } else {
17682 self.expected_ref("GRANT APPLY type", self.peek_token_ref())
17683 }
17684 }
17685
17686 fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
17687 if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
17688 Some(ActionExecuteObjectType::DataMetricFunction)
17689 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
17690 Some(ActionExecuteObjectType::ManagedAlert)
17691 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
17692 Some(ActionExecuteObjectType::ManagedTask)
17693 } else if self.parse_keyword(Keyword::ALERT) {
17694 Some(ActionExecuteObjectType::Alert)
17695 } else if self.parse_keyword(Keyword::TASK) {
17696 Some(ActionExecuteObjectType::Task)
17697 } else {
17698 None
17699 }
17700 }
17701
17702 fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
17703 if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
17704 Ok(ActionManageType::AccountSupportCases)
17705 } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
17706 Ok(ActionManageType::EventSharing)
17707 } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
17708 Ok(ActionManageType::ListingAutoFulfillment)
17709 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
17710 Ok(ActionManageType::OrganizationSupportCases)
17711 } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
17712 Ok(ActionManageType::UserSupportCases)
17713 } else if self.parse_keyword(Keyword::GRANTS) {
17714 Ok(ActionManageType::Grants)
17715 } else if self.parse_keyword(Keyword::WAREHOUSES) {
17716 Ok(ActionManageType::Warehouses)
17717 } else {
17718 self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
17719 }
17720 }
17721
17722 fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
17723 if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
17724 Some(ActionModifyType::LogLevel)
17725 } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
17726 Some(ActionModifyType::TraceLevel)
17727 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
17728 Some(ActionModifyType::SessionLogLevel)
17729 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
17730 Some(ActionModifyType::SessionTraceLevel)
17731 } else {
17732 None
17733 }
17734 }
17735
17736 fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
17737 if self.parse_keyword(Keyword::EXECUTION) {
17738 Some(ActionMonitorType::Execution)
17739 } else if self.parse_keyword(Keyword::SECURITY) {
17740 Some(ActionMonitorType::Security)
17741 } else if self.parse_keyword(Keyword::USAGE) {
17742 Some(ActionMonitorType::Usage)
17743 } else {
17744 None
17745 }
17746 }
17747
17748 pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
17750 let mut name = self.parse_object_name(false)?;
17751 if self.dialect.supports_user_host_grantee()
17752 && name.0.len() == 1
17753 && name.0[0].as_ident().is_some()
17754 && self.consume_token(&Token::AtSign)
17755 {
17756 let user = name.0.pop().unwrap().as_ident().unwrap().clone();
17757 let host = self.parse_identifier()?;
17758 Ok(GranteeName::UserHost { user, host })
17759 } else {
17760 Ok(GranteeName::ObjectName(name))
17761 }
17762 }
17763
17764 pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
17766 self.expect_keyword(Keyword::DENY)?;
17767
17768 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17769 let objects = match objects {
17770 Some(o) => o,
17771 None => {
17772 return parser_err!(
17773 "DENY statements must specify an object",
17774 self.peek_token_ref().span.start
17775 )
17776 }
17777 };
17778
17779 self.expect_keyword_is(Keyword::TO)?;
17780 let grantees = self.parse_grantees()?;
17781 let cascade = self.parse_cascade_option();
17782 let granted_by = if self.parse_keywords(&[Keyword::AS]) {
17783 Some(self.parse_identifier()?)
17784 } else {
17785 None
17786 };
17787
17788 Ok(Statement::Deny(DenyStatement {
17789 privileges,
17790 objects,
17791 grantees,
17792 cascade,
17793 granted_by,
17794 }))
17795 }
17796
17797 pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
17799 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17800
17801 self.expect_keyword_is(Keyword::FROM)?;
17802 let grantees = self.parse_grantees()?;
17803
17804 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17805 Some(self.parse_identifier()?)
17806 } else {
17807 None
17808 };
17809
17810 let cascade = self.parse_cascade_option();
17811
17812 Ok(Revoke {
17813 privileges,
17814 objects,
17815 grantees,
17816 granted_by,
17817 cascade,
17818 })
17819 }
17820
17821 pub fn parse_replace(
17823 &mut self,
17824 replace_token: TokenWithSpan,
17825 ) -> Result<Statement, ParserError> {
17826 if !dialect_of!(self is MySqlDialect | GenericDialect) {
17827 return parser_err!(
17828 "Unsupported statement REPLACE",
17829 self.peek_token_ref().span.start
17830 );
17831 }
17832
17833 let mut insert = self.parse_insert(replace_token)?;
17834 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
17835 *replace_into = true;
17836 }
17837
17838 Ok(insert)
17839 }
17840
17841 fn parse_insert_setexpr_boxed(
17845 &mut self,
17846 insert_token: TokenWithSpan,
17847 ) -> Result<Box<SetExpr>, ParserError> {
17848 Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
17849 }
17850
17851 pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
17853 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
17854 let or = self.parse_conflict_clause();
17855 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
17856 None
17857 } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
17858 Some(MysqlInsertPriority::LowPriority)
17859 } else if self.parse_keyword(Keyword::DELAYED) {
17860 Some(MysqlInsertPriority::Delayed)
17861 } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
17862 Some(MysqlInsertPriority::HighPriority)
17863 } else {
17864 None
17865 };
17866
17867 let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
17868 && self.parse_keyword(Keyword::IGNORE);
17869
17870 let replace_into = false;
17871
17872 let overwrite = self.parse_keyword(Keyword::OVERWRITE);
17873 let into = self.parse_keyword(Keyword::INTO);
17874
17875 let local = self.parse_keyword(Keyword::LOCAL);
17876
17877 if self.parse_keyword(Keyword::DIRECTORY) {
17878 let path = self.parse_literal_string()?;
17879 let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
17880 Some(self.parse_file_format()?)
17881 } else {
17882 None
17883 };
17884 let source = self.parse_query()?;
17885 Ok(Statement::Directory {
17886 local,
17887 path,
17888 overwrite,
17889 file_format,
17890 source,
17891 })
17892 } else {
17893 let table = self.parse_keyword(Keyword::TABLE);
17895 let table_object = self.parse_table_object()?;
17896
17897 let table_alias = if self.dialect.supports_insert_table_alias()
17898 && !self.peek_sub_query()
17899 && self
17900 .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
17901 .is_none()
17902 {
17903 if self.parse_keyword(Keyword::AS) {
17904 Some(TableAliasWithoutColumns {
17905 explicit: true,
17906 alias: self.parse_identifier()?,
17907 })
17908 } else {
17909 self.maybe_parse(|parser| parser.parse_identifier())?
17910 .map(|alias| TableAliasWithoutColumns {
17911 explicit: false,
17912 alias,
17913 })
17914 }
17915 } else {
17916 None
17917 };
17918
17919 let is_mysql = dialect_of!(self is MySqlDialect);
17920
17921 let (columns, partitioned, after_columns, output, source, assignments) = if self
17922 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
17923 {
17924 (vec![], None, vec![], None, None, vec![])
17925 } else {
17926 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
17927 let columns =
17928 self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
17929
17930 let partitioned = self.parse_insert_partition()?;
17931 let after_columns = if dialect_of!(self is HiveDialect) {
17933 self.parse_parenthesized_column_list(Optional, false)?
17934 } else {
17935 vec![]
17936 };
17937 (columns, partitioned, after_columns)
17938 } else {
17939 Default::default()
17940 };
17941
17942 let output = self.maybe_parse_output_clause()?;
17943
17944 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
17945 || self.peek_keyword(Keyword::SETTINGS)
17946 {
17947 (None, vec![])
17948 } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
17949 (None, self.parse_comma_separated(Parser::parse_assignment)?)
17950 } else {
17951 (Some(self.parse_query()?), vec![])
17952 };
17953
17954 (
17955 columns,
17956 partitioned,
17957 after_columns,
17958 output,
17959 source,
17960 assignments,
17961 )
17962 };
17963
17964 let (format_clause, settings) = if self.dialect.supports_insert_format() {
17965 let settings = self.parse_settings()?;
17968
17969 let format = if self.parse_keyword(Keyword::FORMAT) {
17970 Some(self.parse_input_format_clause()?)
17971 } else {
17972 None
17973 };
17974
17975 (format, settings)
17976 } else {
17977 Default::default()
17978 };
17979
17980 let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
17981 && self.parse_keyword(Keyword::AS)
17982 {
17983 let row_alias = self.parse_object_name(false)?;
17984 let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
17985 Some(InsertAliases {
17986 row_alias,
17987 col_aliases,
17988 })
17989 } else {
17990 None
17991 };
17992
17993 let on = if self.parse_keyword(Keyword::ON) {
17994 if self.parse_keyword(Keyword::CONFLICT) {
17995 let conflict_target =
17996 if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
17997 Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
17998 } else if self.peek_token_ref().token == Token::LParen {
17999 Some(ConflictTarget::Columns(
18000 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18001 ))
18002 } else {
18003 None
18004 };
18005
18006 self.expect_keyword_is(Keyword::DO)?;
18007 let action = if self.parse_keyword(Keyword::NOTHING) {
18008 OnConflictAction::DoNothing
18009 } else {
18010 self.expect_keyword_is(Keyword::UPDATE)?;
18011 self.expect_keyword_is(Keyword::SET)?;
18012 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18013 let selection = if self.parse_keyword(Keyword::WHERE) {
18014 Some(self.parse_expr()?)
18015 } else {
18016 None
18017 };
18018 OnConflictAction::DoUpdate(DoUpdate {
18019 assignments,
18020 selection,
18021 })
18022 };
18023
18024 Some(OnInsert::OnConflict(OnConflict {
18025 conflict_target,
18026 action,
18027 }))
18028 } else {
18029 self.expect_keyword_is(Keyword::DUPLICATE)?;
18030 self.expect_keyword_is(Keyword::KEY)?;
18031 self.expect_keyword_is(Keyword::UPDATE)?;
18032 let l = self.parse_comma_separated(Parser::parse_assignment)?;
18033
18034 Some(OnInsert::DuplicateKeyUpdate(l))
18035 }
18036 } else {
18037 None
18038 };
18039
18040 let returning = if self.parse_keyword(Keyword::RETURNING) {
18041 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18042 } else {
18043 None
18044 };
18045
18046 Ok(Insert {
18047 insert_token: insert_token.into(),
18048 optimizer_hints,
18049 or,
18050 table: table_object,
18051 table_alias,
18052 ignore,
18053 into,
18054 overwrite,
18055 partitioned,
18056 columns,
18057 after_columns,
18058 source,
18059 assignments,
18060 has_table_keyword: table,
18061 on,
18062 returning,
18063 output,
18064 replace_into,
18065 priority,
18066 insert_alias,
18067 settings,
18068 format_clause,
18069 multi_table_insert_type: None,
18070 multi_table_into_clauses: vec![],
18071 multi_table_when_clauses: vec![],
18072 multi_table_else_clause: None,
18073 }
18074 .into())
18075 }
18076 }
18077
18078 pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18082 let ident = self.parse_identifier()?;
18083 let values = self
18084 .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18085 .unwrap_or_default();
18086
18087 Ok(InputFormatClause { ident, values })
18088 }
18089
18090 fn peek_subquery_start(&mut self) -> bool {
18093 matches!(
18094 self.peek_tokens_ref(),
18095 [
18096 TokenWithSpan {
18097 token: Token::LParen,
18098 ..
18099 },
18100 TokenWithSpan {
18101 token: Token::Word(Word {
18102 keyword: Keyword::SELECT,
18103 ..
18104 }),
18105 ..
18106 },
18107 ]
18108 )
18109 }
18110
18111 fn peek_subquery_or_cte_start(&mut self) -> bool {
18115 matches!(
18116 self.peek_tokens_ref(),
18117 [
18118 TokenWithSpan {
18119 token: Token::LParen,
18120 ..
18121 },
18122 TokenWithSpan {
18123 token: Token::Word(Word {
18124 keyword: Keyword::SELECT | Keyword::WITH,
18125 ..
18126 }),
18127 ..
18128 },
18129 ]
18130 )
18131 }
18132
18133 fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18134 if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18135 Some(SqliteOnConflict::Replace)
18136 } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18137 Some(SqliteOnConflict::Rollback)
18138 } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18139 Some(SqliteOnConflict::Abort)
18140 } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18141 Some(SqliteOnConflict::Fail)
18142 } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18143 Some(SqliteOnConflict::Ignore)
18144 } else if self.parse_keyword(Keyword::REPLACE) {
18145 Some(SqliteOnConflict::Replace)
18146 } else {
18147 None
18148 }
18149 }
18150
18151 pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18153 if self.parse_keyword(Keyword::PARTITION) {
18154 self.expect_token(&Token::LParen)?;
18155 let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18156 self.expect_token(&Token::RParen)?;
18157 Ok(partition_cols)
18158 } else {
18159 Ok(None)
18160 }
18161 }
18162
18163 pub fn parse_load_data_table_format(
18165 &mut self,
18166 ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18167 if self.parse_keyword(Keyword::INPUTFORMAT) {
18168 let input_format = self.parse_expr()?;
18169 self.expect_keyword_is(Keyword::SERDE)?;
18170 let serde = self.parse_expr()?;
18171 Ok(Some(HiveLoadDataFormat {
18172 input_format,
18173 serde,
18174 }))
18175 } else {
18176 Ok(None)
18177 }
18178 }
18179
18180 fn parse_update_setexpr_boxed(
18184 &mut self,
18185 update_token: TokenWithSpan,
18186 ) -> Result<Box<SetExpr>, ParserError> {
18187 Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18188 }
18189
18190 pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18192 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18193 let or = self.parse_conflict_clause();
18194 let table = self.parse_table_and_joins()?;
18195 let from_before_set = if self.parse_keyword(Keyword::FROM) {
18196 Some(UpdateTableFromKind::BeforeSet(
18197 self.parse_table_with_joins()?,
18198 ))
18199 } else {
18200 None
18201 };
18202 self.expect_keyword(Keyword::SET)?;
18203 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18204
18205 let output = self.maybe_parse_output_clause()?;
18206
18207 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18208 Some(UpdateTableFromKind::AfterSet(
18209 self.parse_table_with_joins()?,
18210 ))
18211 } else {
18212 from_before_set
18213 };
18214 let selection = if self.parse_keyword(Keyword::WHERE) {
18215 Some(self.parse_expr()?)
18216 } else {
18217 None
18218 };
18219 let returning = if self.parse_keyword(Keyword::RETURNING) {
18220 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18221 } else {
18222 None
18223 };
18224 let order_by = if self.dialect.supports_update_order_by()
18225 && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18226 {
18227 self.parse_comma_separated(Parser::parse_order_by_expr)?
18228 } else {
18229 vec![]
18230 };
18231 let limit = if self.parse_keyword(Keyword::LIMIT) {
18232 Some(self.parse_expr()?)
18233 } else {
18234 None
18235 };
18236 Ok(Update {
18237 update_token: update_token.into(),
18238 optimizer_hints,
18239 table,
18240 assignments,
18241 from,
18242 selection,
18243 returning,
18244 output,
18245 or,
18246 order_by,
18247 limit,
18248 }
18249 .into())
18250 }
18251
18252 pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18254 let target = self.parse_assignment_target()?;
18255 self.expect_token(&Token::Eq)?;
18256 let value = self.parse_expr()?;
18257 Ok(Assignment { target, value })
18258 }
18259
18260 pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18262 if self.consume_token(&Token::LParen) {
18263 let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18264 self.expect_token(&Token::RParen)?;
18265 Ok(AssignmentTarget::Tuple(columns))
18266 } else {
18267 let column = self.parse_object_name(false)?;
18268 Ok(AssignmentTarget::ColumnName(column))
18269 }
18270 }
18271
18272 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18274 let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18275 self.maybe_parse(|p| {
18276 let name = p.parse_expr()?;
18277 let operator = p.parse_function_named_arg_operator()?;
18278 let arg = p.parse_wildcard_expr()?.into();
18279 Ok(FunctionArg::ExprNamed {
18280 name,
18281 arg,
18282 operator,
18283 })
18284 })?
18285 } else {
18286 self.maybe_parse(|p| {
18287 let name = p.parse_identifier()?;
18288 let operator = p.parse_function_named_arg_operator()?;
18289 let arg = p.parse_wildcard_expr()?.into();
18290 Ok(FunctionArg::Named {
18291 name,
18292 arg,
18293 operator,
18294 })
18295 })?
18296 };
18297 if let Some(arg) = arg {
18298 return Ok(arg);
18299 }
18300 let wildcard_expr = self.parse_wildcard_expr()?;
18301 let arg_expr: FunctionArgExpr = match wildcard_expr {
18302 Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18303 let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18306 if opts.opt_exclude.is_some()
18307 || opts.opt_except.is_some()
18308 || opts.opt_replace.is_some()
18309 || opts.opt_rename.is_some()
18310 || opts.opt_ilike.is_some()
18311 {
18312 FunctionArgExpr::WildcardWithOptions(opts)
18313 } else {
18314 wildcard_expr.into()
18315 }
18316 }
18317 other => other.into(),
18318 };
18319 Ok(FunctionArg::Unnamed(arg_expr))
18320 }
18321
18322 fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18323 if self.parse_keyword(Keyword::VALUE) {
18324 return Ok(FunctionArgOperator::Value);
18325 }
18326 let tok = self.next_token();
18327 match tok.token {
18328 Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18329 Ok(FunctionArgOperator::RightArrow)
18330 }
18331 Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18332 Ok(FunctionArgOperator::Equals)
18333 }
18334 Token::Assignment
18335 if self
18336 .dialect
18337 .supports_named_fn_args_with_assignment_operator() =>
18338 {
18339 Ok(FunctionArgOperator::Assignment)
18340 }
18341 Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18342 Ok(FunctionArgOperator::Colon)
18343 }
18344 _ => {
18345 self.prev_token();
18346 self.expected("argument operator", tok)
18347 }
18348 }
18349 }
18350
18351 pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18353 if self.consume_token(&Token::RParen) {
18354 Ok(vec![])
18355 } else {
18356 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18357 self.expect_token(&Token::RParen)?;
18358 Ok(args)
18359 }
18360 }
18361
18362 fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18363 if self.consume_token(&Token::RParen) {
18364 return Ok(TableFunctionArgs {
18365 args: vec![],
18366 settings: None,
18367 });
18368 }
18369 let mut args = vec![];
18370 let settings = loop {
18371 if let Some(settings) = self.parse_settings()? {
18372 break Some(settings);
18373 }
18374 args.push(self.parse_function_args()?);
18375 if self.is_parse_comma_separated_end() {
18376 break None;
18377 }
18378 };
18379 self.expect_token(&Token::RParen)?;
18380 Ok(TableFunctionArgs { args, settings })
18381 }
18382
18383 fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18392 let mut clauses = vec![];
18393
18394 if let Some(null_clause) = self.parse_json_null_clause() {
18397 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18398 }
18399
18400 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18401 clauses.push(FunctionArgumentClause::JsonReturningClause(
18402 json_returning_clause,
18403 ));
18404 }
18405
18406 if self.consume_token(&Token::RParen) {
18407 return Ok(FunctionArgumentList {
18408 duplicate_treatment: None,
18409 args: vec![],
18410 clauses,
18411 });
18412 }
18413
18414 let duplicate_treatment = self.parse_duplicate_treatment()?;
18415 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18416
18417 if self.dialect.supports_window_function_null_treatment_arg() {
18418 if let Some(null_treatment) = self.parse_null_treatment()? {
18419 clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
18420 }
18421 }
18422
18423 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
18424 clauses.push(FunctionArgumentClause::OrderBy(
18425 self.parse_comma_separated(Parser::parse_order_by_expr)?,
18426 ));
18427 }
18428
18429 if self.parse_keyword(Keyword::LIMIT) {
18430 clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
18431 }
18432
18433 if dialect_of!(self is GenericDialect | BigQueryDialect)
18434 && self.parse_keyword(Keyword::HAVING)
18435 {
18436 let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
18437 Keyword::MIN => HavingBoundKind::Min,
18438 Keyword::MAX => HavingBoundKind::Max,
18439 unexpected_keyword => return Err(ParserError::ParserError(
18440 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
18441 )),
18442 };
18443 clauses.push(FunctionArgumentClause::Having(HavingBound(
18444 kind,
18445 self.parse_expr()?,
18446 )))
18447 }
18448
18449 if dialect_of!(self is GenericDialect | MySqlDialect)
18450 && self.parse_keyword(Keyword::SEPARATOR)
18451 {
18452 clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
18453 }
18454
18455 if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
18456 clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
18457 }
18458
18459 if let Some(null_clause) = self.parse_json_null_clause() {
18460 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18461 }
18462
18463 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18464 clauses.push(FunctionArgumentClause::JsonReturningClause(
18465 json_returning_clause,
18466 ));
18467 }
18468
18469 self.expect_token(&Token::RParen)?;
18470 Ok(FunctionArgumentList {
18471 duplicate_treatment,
18472 args,
18473 clauses,
18474 })
18475 }
18476
18477 fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
18478 if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
18479 Some(JsonNullClause::AbsentOnNull)
18480 } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
18481 Some(JsonNullClause::NullOnNull)
18482 } else {
18483 None
18484 }
18485 }
18486
18487 fn maybe_parse_json_returning_clause(
18488 &mut self,
18489 ) -> Result<Option<JsonReturningClause>, ParserError> {
18490 if self.parse_keyword(Keyword::RETURNING) {
18491 let data_type = self.parse_data_type()?;
18492 Ok(Some(JsonReturningClause { data_type }))
18493 } else {
18494 Ok(None)
18495 }
18496 }
18497
18498 fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
18499 let loc = self.peek_token_ref().span.start;
18500 match (
18501 self.parse_keyword(Keyword::ALL),
18502 self.parse_keyword(Keyword::DISTINCT),
18503 ) {
18504 (true, false) => Ok(Some(DuplicateTreatment::All)),
18505 (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
18506 (false, false) => Ok(None),
18507 (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
18508 }
18509 }
18510
18511 pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
18513 let prefix = self
18514 .parse_one_of_keywords(
18515 self.dialect
18516 .get_reserved_keywords_for_select_item_operator(),
18517 )
18518 .map(|keyword| Ident::new(format!("{keyword:?}")));
18519
18520 match self.parse_wildcard_expr()? {
18521 Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
18522 SelectItemQualifiedWildcardKind::ObjectName(prefix),
18523 self.parse_wildcard_additional_options(token.0)?,
18524 )),
18525 Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
18526 self.parse_wildcard_additional_options(token.0)?,
18527 )),
18528 Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
18529 parser_err!(
18530 format!("Expected an expression, found: {}", v),
18531 self.peek_token_ref().span.start
18532 )
18533 }
18534 Expr::BinaryOp {
18535 left,
18536 op: BinaryOperator::Eq,
18537 right,
18538 } if self.dialect.supports_eq_alias_assignment()
18539 && matches!(left.as_ref(), Expr::Identifier(_)) =>
18540 {
18541 let Expr::Identifier(alias) = *left else {
18542 return parser_err!(
18543 "BUG: expected identifier expression as alias",
18544 self.peek_token_ref().span.start
18545 );
18546 };
18547 Ok(SelectItem::ExprWithAlias {
18548 expr: *right,
18549 alias,
18550 })
18551 }
18552 expr if self.dialect.supports_select_expr_star()
18553 && self.consume_tokens(&[Token::Period, Token::Mul]) =>
18554 {
18555 let wildcard_token = self.get_previous_token().clone();
18556 Ok(SelectItem::QualifiedWildcard(
18557 SelectItemQualifiedWildcardKind::Expr(expr),
18558 self.parse_wildcard_additional_options(wildcard_token)?,
18559 ))
18560 }
18561 expr if self.dialect.supports_select_item_multi_column_alias()
18562 && self.peek_keyword(Keyword::AS)
18563 && self.peek_nth_token(1).token == Token::LParen =>
18564 {
18565 self.expect_keyword(Keyword::AS)?;
18566 self.expect_token(&Token::LParen)?;
18567 let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
18568 self.expect_token(&Token::RParen)?;
18569 Ok(SelectItem::ExprWithAliases {
18570 expr: maybe_prefixed_expr(expr, prefix),
18571 aliases,
18572 })
18573 }
18574 expr => self
18575 .maybe_parse_select_item_alias()
18576 .map(|alias| match alias {
18577 Some(alias) => SelectItem::ExprWithAlias {
18578 expr: maybe_prefixed_expr(expr, prefix),
18579 alias,
18580 },
18581 None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
18582 }),
18583 }
18584 }
18585
18586 pub fn parse_wildcard_additional_options(
18590 &mut self,
18591 wildcard_token: TokenWithSpan,
18592 ) -> Result<WildcardAdditionalOptions, ParserError> {
18593 let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
18594 self.parse_optional_select_item_ilike()?
18595 } else {
18596 None
18597 };
18598 let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
18599 {
18600 self.parse_optional_select_item_exclude()?
18601 } else {
18602 None
18603 };
18604 let opt_except = if self.dialect.supports_select_wildcard_except() {
18605 self.parse_optional_select_item_except()?
18606 } else {
18607 None
18608 };
18609 let opt_replace = if self.dialect.supports_select_wildcard_replace() {
18610 self.parse_optional_select_item_replace()?
18611 } else {
18612 None
18613 };
18614 let opt_rename = if self.dialect.supports_select_wildcard_rename() {
18615 self.parse_optional_select_item_rename()?
18616 } else {
18617 None
18618 };
18619
18620 let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
18621 self.maybe_parse_select_item_alias()?
18622 } else {
18623 None
18624 };
18625
18626 Ok(WildcardAdditionalOptions {
18627 wildcard_token: wildcard_token.into(),
18628 opt_ilike,
18629 opt_exclude,
18630 opt_except,
18631 opt_rename,
18632 opt_replace,
18633 opt_alias,
18634 })
18635 }
18636
18637 pub fn parse_optional_select_item_ilike(
18641 &mut self,
18642 ) -> Result<Option<IlikeSelectItem>, ParserError> {
18643 let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
18644 let next_token = self.next_token();
18645 let pattern = match next_token.token {
18646 Token::SingleQuotedString(s) => s,
18647 _ => return self.expected("ilike pattern", next_token),
18648 };
18649 Some(IlikeSelectItem { pattern })
18650 } else {
18651 None
18652 };
18653 Ok(opt_ilike)
18654 }
18655
18656 pub fn parse_optional_select_item_exclude(
18660 &mut self,
18661 ) -> Result<Option<ExcludeSelectItem>, ParserError> {
18662 let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
18663 if self.consume_token(&Token::LParen) {
18664 let columns =
18665 self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
18666 self.expect_token(&Token::RParen)?;
18667 Some(ExcludeSelectItem::Multiple(columns))
18668 } else {
18669 let column = self.parse_object_name(false)?;
18670 Some(ExcludeSelectItem::Single(column))
18671 }
18672 } else {
18673 None
18674 };
18675
18676 Ok(opt_exclude)
18677 }
18678
18679 pub fn parse_optional_select_item_except(
18683 &mut self,
18684 ) -> Result<Option<ExceptSelectItem>, ParserError> {
18685 let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
18686 if self.peek_token_ref().token == Token::LParen {
18687 let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
18688 match &idents[..] {
18689 [] => {
18690 return self.expected_ref(
18691 "at least one column should be parsed by the expect clause",
18692 self.peek_token_ref(),
18693 )?;
18694 }
18695 [first, idents @ ..] => Some(ExceptSelectItem {
18696 first_element: first.clone(),
18697 additional_elements: idents.to_vec(),
18698 }),
18699 }
18700 } else {
18701 let ident = self.parse_identifier()?;
18703 Some(ExceptSelectItem {
18704 first_element: ident,
18705 additional_elements: vec![],
18706 })
18707 }
18708 } else {
18709 None
18710 };
18711
18712 Ok(opt_except)
18713 }
18714
18715 pub fn parse_optional_select_item_rename(
18717 &mut self,
18718 ) -> Result<Option<RenameSelectItem>, ParserError> {
18719 let opt_rename = if self.parse_keyword(Keyword::RENAME) {
18720 if self.consume_token(&Token::LParen) {
18721 let idents =
18722 self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
18723 self.expect_token(&Token::RParen)?;
18724 Some(RenameSelectItem::Multiple(idents))
18725 } else {
18726 let ident = self.parse_identifier_with_alias()?;
18727 Some(RenameSelectItem::Single(ident))
18728 }
18729 } else {
18730 None
18731 };
18732
18733 Ok(opt_rename)
18734 }
18735
18736 pub fn parse_optional_select_item_replace(
18738 &mut self,
18739 ) -> Result<Option<ReplaceSelectItem>, ParserError> {
18740 let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
18741 if self.consume_token(&Token::LParen) {
18742 let items = self.parse_comma_separated(|parser| {
18743 Ok(Box::new(parser.parse_replace_elements()?))
18744 })?;
18745 self.expect_token(&Token::RParen)?;
18746 Some(ReplaceSelectItem { items })
18747 } else {
18748 let tok = self.next_token();
18749 return self.expected("( after REPLACE but", tok);
18750 }
18751 } else {
18752 None
18753 };
18754
18755 Ok(opt_replace)
18756 }
18757 pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
18759 let expr = self.parse_expr()?;
18760 let as_keyword = self.parse_keyword(Keyword::AS);
18761 let ident = self.parse_identifier()?;
18762 Ok(ReplaceSelectElement {
18763 expr,
18764 column_name: ident,
18765 as_keyword,
18766 })
18767 }
18768
18769 pub fn parse_asc_desc(&mut self) -> Option<bool> {
18772 if self.parse_keyword(Keyword::ASC) {
18773 Some(true)
18774 } else if self.parse_keyword(Keyword::DESC) {
18775 Some(false)
18776 } else {
18777 None
18778 }
18779 }
18780
18781 pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
18783 self.parse_order_by_expr_inner(false)
18784 .map(|(order_by, _)| order_by)
18785 }
18786
18787 pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
18789 self.parse_order_by_expr_inner(true)
18790 .map(|(column, operator_class)| IndexColumn {
18791 column,
18792 operator_class,
18793 })
18794 }
18795
18796 fn parse_order_by_expr_inner(
18797 &mut self,
18798 with_operator_class: bool,
18799 ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
18800 let expr = self.parse_expr()?;
18801
18802 let operator_class: Option<ObjectName> = if with_operator_class {
18803 if self
18806 .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
18807 .is_some()
18808 {
18809 None
18810 } else {
18811 self.maybe_parse(|parser| parser.parse_object_name(false))?
18812 }
18813 } else {
18814 None
18815 };
18816
18817 let options = self.parse_order_by_options()?;
18818
18819 let with_fill = if self.dialect.supports_with_fill()
18820 && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
18821 {
18822 Some(self.parse_with_fill()?)
18823 } else {
18824 None
18825 };
18826
18827 Ok((
18828 OrderByExpr {
18829 expr,
18830 options,
18831 with_fill,
18832 },
18833 operator_class,
18834 ))
18835 }
18836
18837 fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
18838 let asc = self.parse_asc_desc();
18839
18840 let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
18841 Some(true)
18842 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
18843 Some(false)
18844 } else {
18845 None
18846 };
18847
18848 Ok(OrderByOptions { asc, nulls_first })
18849 }
18850
18851 pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
18855 let from = if self.parse_keyword(Keyword::FROM) {
18856 Some(self.parse_expr()?)
18857 } else {
18858 None
18859 };
18860
18861 let to = if self.parse_keyword(Keyword::TO) {
18862 Some(self.parse_expr()?)
18863 } else {
18864 None
18865 };
18866
18867 let step = if self.parse_keyword(Keyword::STEP) {
18868 Some(self.parse_expr()?)
18869 } else {
18870 None
18871 };
18872
18873 Ok(WithFill { from, to, step })
18874 }
18875
18876 pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
18879 if !self.parse_keyword(Keyword::INTERPOLATE) {
18880 return Ok(None);
18881 }
18882
18883 if self.consume_token(&Token::LParen) {
18884 let interpolations =
18885 self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
18886 self.expect_token(&Token::RParen)?;
18887 return Ok(Some(Interpolate {
18889 exprs: Some(interpolations),
18890 }));
18891 }
18892
18893 Ok(Some(Interpolate { exprs: None }))
18895 }
18896
18897 pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
18899 let column = self.parse_identifier()?;
18900 let expr = if self.parse_keyword(Keyword::AS) {
18901 Some(self.parse_expr()?)
18902 } else {
18903 None
18904 };
18905 Ok(InterpolateExpr { column, expr })
18906 }
18907
18908 pub fn parse_top(&mut self) -> Result<Top, ParserError> {
18911 let quantity = if self.consume_token(&Token::LParen) {
18912 let quantity = self.parse_expr()?;
18913 self.expect_token(&Token::RParen)?;
18914 Some(TopQuantity::Expr(quantity))
18915 } else {
18916 let next_token = self.next_token();
18917 let quantity = match next_token.token {
18918 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
18919 _ => self.expected("literal int", next_token)?,
18920 };
18921 Some(TopQuantity::Constant(quantity))
18922 };
18923
18924 let percent = self.parse_keyword(Keyword::PERCENT);
18925
18926 let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
18927
18928 Ok(Top {
18929 with_ties,
18930 percent,
18931 quantity,
18932 })
18933 }
18934
18935 pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
18937 if self.parse_keyword(Keyword::ALL) {
18938 Ok(None)
18939 } else {
18940 Ok(Some(self.parse_expr()?))
18941 }
18942 }
18943
18944 pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
18946 let value = self.parse_expr()?;
18947 let rows = if self.parse_keyword(Keyword::ROW) {
18948 OffsetRows::Row
18949 } else if self.parse_keyword(Keyword::ROWS) {
18950 OffsetRows::Rows
18951 } else {
18952 OffsetRows::None
18953 };
18954 Ok(Offset { value, rows })
18955 }
18956
18957 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
18959 let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
18960
18961 let (quantity, percent) = if self
18962 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
18963 .is_some()
18964 {
18965 (None, false)
18966 } else {
18967 let quantity = Expr::Value(self.parse_value()?);
18968 let percent = self.parse_keyword(Keyword::PERCENT);
18969 let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
18970 (Some(quantity), percent)
18971 };
18972
18973 let with_ties = if self.parse_keyword(Keyword::ONLY) {
18974 false
18975 } else {
18976 self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
18977 };
18978
18979 Ok(Fetch {
18980 with_ties,
18981 percent,
18982 quantity,
18983 })
18984 }
18985
18986 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
18988 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
18989 Keyword::UPDATE => LockType::Update,
18990 Keyword::SHARE => LockType::Share,
18991 unexpected_keyword => return Err(ParserError::ParserError(
18992 format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
18993 )),
18994 };
18995 let of = if self.parse_keyword(Keyword::OF) {
18996 Some(self.parse_object_name(false)?)
18997 } else {
18998 None
18999 };
19000 let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19001 Some(NonBlock::Nowait)
19002 } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19003 Some(NonBlock::SkipLocked)
19004 } else {
19005 None
19006 };
19007 Ok(LockClause {
19008 lock_type,
19009 of,
19010 nonblock,
19011 })
19012 }
19013
19014 pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19016 self.expect_keyword(Keyword::LOCK)?;
19017
19018 if self.peek_keyword(Keyword::TABLES) {
19019 return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19020 }
19021
19022 let _ = self.parse_keyword(Keyword::TABLE);
19023 let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19024 let lock_mode = if self.parse_keyword(Keyword::IN) {
19025 let lock_mode = self.parse_lock_table_mode()?;
19026 self.expect_keyword(Keyword::MODE)?;
19027 Some(lock_mode)
19028 } else {
19029 None
19030 };
19031 let nowait = self.parse_keyword(Keyword::NOWAIT);
19032
19033 Ok(Lock {
19034 tables,
19035 lock_mode,
19036 nowait,
19037 })
19038 }
19039
19040 fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19041 let only = self.parse_keyword(Keyword::ONLY);
19042 let name = self.parse_object_name(false)?;
19043 let has_asterisk = self.consume_token(&Token::Mul);
19044
19045 Ok(LockTableTarget {
19046 name,
19047 only,
19048 has_asterisk,
19049 })
19050 }
19051
19052 fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19053 if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19054 Ok(LockTableMode::AccessShare)
19055 } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19056 Ok(LockTableMode::AccessExclusive)
19057 } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19058 Ok(LockTableMode::RowShare)
19059 } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19060 Ok(LockTableMode::RowExclusive)
19061 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19062 Ok(LockTableMode::ShareUpdateExclusive)
19063 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19064 Ok(LockTableMode::ShareRowExclusive)
19065 } else if self.parse_keyword(Keyword::SHARE) {
19066 Ok(LockTableMode::Share)
19067 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19068 Ok(LockTableMode::Exclusive)
19069 } else {
19070 self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19071 }
19072 }
19073
19074 pub fn parse_values(
19076 &mut self,
19077 allow_empty: bool,
19078 value_keyword: bool,
19079 ) -> Result<Values, ParserError> {
19080 let mut explicit_row = false;
19081
19082 let rows = self.parse_comma_separated(|parser| {
19083 if parser.parse_keyword(Keyword::ROW) {
19084 explicit_row = true;
19085 }
19086 Ok(Parens {
19087 opening_token: parser.expect_token(&Token::LParen)?.into(),
19088 content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19089 vec![]
19090 } else {
19091 parser.parse_comma_separated(Parser::parse_expr)?
19092 },
19093 closing_token: parser.expect_token(&Token::RParen)?.into(),
19094 })
19095 })?;
19096 Ok(Values {
19097 explicit_row,
19098 rows,
19099 value_keyword,
19100 })
19101 }
19102
19103 pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19105 self.expect_keyword_is(Keyword::TRANSACTION)?;
19106 Ok(Statement::StartTransaction {
19107 modes: self.parse_transaction_modes()?,
19108 begin: false,
19109 transaction: Some(BeginTransactionKind::Transaction),
19110 modifier: None,
19111 statements: vec![],
19112 exception: None,
19113 has_end_keyword: false,
19114 })
19115 }
19116
19117 pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19119 if !self.dialect.supports_start_transaction_modifier() {
19120 None
19121 } else if self.parse_keyword(Keyword::DEFERRED) {
19122 Some(TransactionModifier::Deferred)
19123 } else if self.parse_keyword(Keyword::IMMEDIATE) {
19124 Some(TransactionModifier::Immediate)
19125 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19126 Some(TransactionModifier::Exclusive)
19127 } else if self.parse_keyword(Keyword::TRY) {
19128 Some(TransactionModifier::Try)
19129 } else if self.parse_keyword(Keyword::CATCH) {
19130 Some(TransactionModifier::Catch)
19131 } else {
19132 None
19133 }
19134 }
19135
19136 pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19138 let modifier = self.parse_transaction_modifier();
19139 let transaction =
19140 match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19141 {
19142 Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19143 Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19144 Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19145 _ => None,
19146 };
19147 Ok(Statement::StartTransaction {
19148 modes: self.parse_transaction_modes()?,
19149 begin: true,
19150 transaction,
19151 modifier,
19152 statements: vec![],
19153 exception: None,
19154 has_end_keyword: false,
19155 })
19156 }
19157
19158 pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19160 let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19161
19162 let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19163 let mut when = Vec::new();
19164
19165 while !self.peek_keyword(Keyword::END) {
19167 self.expect_keyword(Keyword::WHEN)?;
19168
19169 let mut idents = Vec::new();
19173
19174 while !self.parse_keyword(Keyword::THEN) {
19175 let ident = self.parse_identifier()?;
19176 idents.push(ident);
19177
19178 self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19179 }
19180
19181 let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19182
19183 when.push(ExceptionWhen { idents, statements });
19184 }
19185
19186 Some(when)
19187 } else {
19188 None
19189 };
19190
19191 self.expect_keyword(Keyword::END)?;
19192
19193 Ok(Statement::StartTransaction {
19194 begin: true,
19195 statements,
19196 exception,
19197 has_end_keyword: true,
19198 transaction: None,
19199 modifier: None,
19200 modes: Default::default(),
19201 })
19202 }
19203
19204 pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19206 let modifier = if !self.dialect.supports_end_transaction_modifier() {
19207 None
19208 } else if self.parse_keyword(Keyword::TRY) {
19209 Some(TransactionModifier::Try)
19210 } else if self.parse_keyword(Keyword::CATCH) {
19211 Some(TransactionModifier::Catch)
19212 } else {
19213 None
19214 };
19215 Ok(Statement::Commit {
19216 chain: self.parse_commit_rollback_chain()?,
19217 end: true,
19218 modifier,
19219 })
19220 }
19221
19222 pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19224 let mut modes = vec![];
19225 let mut required = false;
19226 loop {
19227 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19228 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19229 TransactionIsolationLevel::ReadUncommitted
19230 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19231 TransactionIsolationLevel::ReadCommitted
19232 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19233 TransactionIsolationLevel::RepeatableRead
19234 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19235 TransactionIsolationLevel::Serializable
19236 } else if self.parse_keyword(Keyword::SNAPSHOT) {
19237 TransactionIsolationLevel::Snapshot
19238 } else {
19239 self.expected_ref("isolation level", self.peek_token_ref())?
19240 };
19241 TransactionMode::IsolationLevel(iso_level)
19242 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19243 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19244 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19245 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19246 } else if required {
19247 self.expected_ref("transaction mode", self.peek_token_ref())?
19248 } else {
19249 break;
19250 };
19251 modes.push(mode);
19252 required = self.consume_token(&Token::Comma);
19257 }
19258 Ok(modes)
19259 }
19260
19261 pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19263 Ok(Statement::Commit {
19264 chain: self.parse_commit_rollback_chain()?,
19265 end: false,
19266 modifier: None,
19267 })
19268 }
19269
19270 pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19272 let chain = self.parse_commit_rollback_chain()?;
19273 let savepoint = self.parse_rollback_savepoint()?;
19274
19275 Ok(Statement::Rollback { chain, savepoint })
19276 }
19277
19278 pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19280 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19281 if self.parse_keyword(Keyword::AND) {
19282 let chain = !self.parse_keyword(Keyword::NO);
19283 self.expect_keyword_is(Keyword::CHAIN)?;
19284 Ok(chain)
19285 } else {
19286 Ok(false)
19287 }
19288 }
19289
19290 pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19292 if self.parse_keyword(Keyword::TO) {
19293 let _ = self.parse_keyword(Keyword::SAVEPOINT);
19294 let savepoint = self.parse_identifier()?;
19295
19296 Ok(Some(savepoint))
19297 } else {
19298 Ok(None)
19299 }
19300 }
19301
19302 pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19304 self.expect_token(&Token::LParen)?;
19305 let message = Box::new(self.parse_expr()?);
19306 self.expect_token(&Token::Comma)?;
19307 let severity = Box::new(self.parse_expr()?);
19308 self.expect_token(&Token::Comma)?;
19309 let state = Box::new(self.parse_expr()?);
19310 let arguments = if self.consume_token(&Token::Comma) {
19311 self.parse_comma_separated(Parser::parse_expr)?
19312 } else {
19313 vec![]
19314 };
19315 self.expect_token(&Token::RParen)?;
19316 let options = if self.parse_keyword(Keyword::WITH) {
19317 self.parse_comma_separated(Parser::parse_raiserror_option)?
19318 } else {
19319 vec![]
19320 };
19321 Ok(Statement::RaisError {
19322 message,
19323 severity,
19324 state,
19325 arguments,
19326 options,
19327 })
19328 }
19329
19330 pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19332 match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19333 Keyword::LOG => Ok(RaisErrorOption::Log),
19334 Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19335 Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19336 _ => self.expected_ref(
19337 "LOG, NOWAIT OR SETERROR raiserror option",
19338 self.peek_token_ref(),
19339 ),
19340 }
19341 }
19342
19343 pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
19347 self.expect_keyword_is(Keyword::THROW)?;
19348
19349 let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
19350 let (message, state) = if error_number.is_some() {
19351 self.expect_token(&Token::Comma)?;
19352 let message = Box::new(self.parse_expr()?);
19353 self.expect_token(&Token::Comma)?;
19354 let state = Box::new(self.parse_expr()?);
19355 (Some(message), Some(state))
19356 } else {
19357 (None, None)
19358 };
19359
19360 Ok(ThrowStatement {
19361 error_number,
19362 message,
19363 state,
19364 })
19365 }
19366
19367 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
19369 let prepare = self.parse_keyword(Keyword::PREPARE);
19370 let name = self.parse_identifier()?;
19371 Ok(Statement::Deallocate { name, prepare })
19372 }
19373
19374 pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
19376 let immediate =
19377 self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
19378
19379 let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
19385 None
19386 } else {
19387 Some(self.parse_object_name(false)?)
19388 };
19389
19390 let has_parentheses = self.consume_token(&Token::LParen);
19391
19392 let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
19393 let end_token = match (has_parentheses, self.peek_token().token) {
19394 (true, _) => Token::RParen,
19395 (false, Token::EOF) => Token::EOF,
19396 (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
19397 (false, _) => Token::SemiColon,
19398 };
19399
19400 let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
19401
19402 if has_parentheses {
19403 self.expect_token(&Token::RParen)?;
19404 }
19405
19406 let into = if self.parse_keyword(Keyword::INTO) {
19407 self.parse_comma_separated(Self::parse_identifier)?
19408 } else {
19409 vec![]
19410 };
19411
19412 let using = if self.parse_keyword(Keyword::USING) {
19413 self.parse_comma_separated(Self::parse_expr_with_alias)?
19414 } else {
19415 vec![]
19416 };
19417
19418 let output = self.parse_keyword(Keyword::OUTPUT);
19419
19420 let default = self.parse_keyword(Keyword::DEFAULT);
19421
19422 Ok(Statement::Execute {
19423 immediate,
19424 name,
19425 parameters,
19426 has_parentheses,
19427 into,
19428 using,
19429 output,
19430 default,
19431 })
19432 }
19433
19434 pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
19436 let name = self.parse_identifier()?;
19437
19438 let mut data_types = vec![];
19439 if self.consume_token(&Token::LParen) {
19440 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
19441 self.expect_token(&Token::RParen)?;
19442 }
19443
19444 self.expect_keyword_is(Keyword::AS)?;
19445 let statement = Box::new(self.parse_statement()?);
19446 Ok(Statement::Prepare {
19447 name,
19448 data_types,
19449 statement,
19450 })
19451 }
19452
19453 pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
19455 self.expect_keyword(Keyword::UNLOAD)?;
19456 self.expect_token(&Token::LParen)?;
19457 let (query, query_text) =
19458 if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
19459 (None, Some(self.parse_literal_string()?))
19460 } else {
19461 (Some(self.parse_query()?), None)
19462 };
19463 self.expect_token(&Token::RParen)?;
19464
19465 self.expect_keyword_is(Keyword::TO)?;
19466 let to = self.parse_identifier()?;
19467 let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
19468 Some(self.parse_iam_role_kind()?)
19469 } else {
19470 None
19471 };
19472 let with = self.parse_options(Keyword::WITH)?;
19473 let mut options = vec![];
19474 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
19475 options.push(opt);
19476 }
19477 Ok(Statement::Unload {
19478 query,
19479 query_text,
19480 to,
19481 auth,
19482 with,
19483 options,
19484 })
19485 }
19486
19487 fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
19488 let temporary = self
19489 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
19490 .is_some();
19491 let unlogged = self.parse_keyword(Keyword::UNLOGGED);
19492 let table = self.parse_keyword(Keyword::TABLE);
19493 let name = self.parse_object_name(false)?;
19494
19495 Ok(SelectInto {
19496 temporary,
19497 unlogged,
19498 table,
19499 name,
19500 })
19501 }
19502
19503 fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
19504 let v = self.parse_value()?;
19505 match &v.value {
19506 Value::SingleQuotedString(_) => Ok(v),
19507 Value::DoubleQuotedString(_) => Ok(v),
19508 Value::Number(_, _) => Ok(v),
19509 Value::Placeholder(_) => Ok(v),
19510 _ => {
19511 self.prev_token();
19512 self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
19513 }
19514 }
19515 }
19516
19517 pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
19519 let name = self.parse_object_name(false)?;
19520 if self.consume_token(&Token::LParen) {
19521 let value = self.parse_pragma_value()?;
19522 self.expect_token(&Token::RParen)?;
19523 Ok(Statement::Pragma {
19524 name,
19525 value: Some(value),
19526 is_eq: false,
19527 })
19528 } else if self.consume_token(&Token::Eq) {
19529 Ok(Statement::Pragma {
19530 name,
19531 value: Some(self.parse_pragma_value()?),
19532 is_eq: true,
19533 })
19534 } else {
19535 Ok(Statement::Pragma {
19536 name,
19537 value: None,
19538 is_eq: false,
19539 })
19540 }
19541 }
19542
19543 pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
19545 let extension_name = self.parse_identifier()?;
19546
19547 Ok(Statement::Install { extension_name })
19548 }
19549
19550 pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
19552 if self.dialect.supports_load_extension() {
19553 let extension_name = self.parse_identifier()?;
19554 Ok(Statement::Load { extension_name })
19555 } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
19556 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
19557 self.expect_keyword_is(Keyword::INPATH)?;
19558 let inpath = self.parse_literal_string()?;
19559 let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
19560 self.expect_keyword_is(Keyword::INTO)?;
19561 self.expect_keyword_is(Keyword::TABLE)?;
19562 let table_name = self.parse_object_name(false)?;
19563 let partitioned = self.parse_insert_partition()?;
19564 let table_format = self.parse_load_data_table_format()?;
19565 Ok(Statement::LoadData {
19566 local,
19567 inpath,
19568 overwrite,
19569 table_name,
19570 partitioned,
19571 table_format,
19572 })
19573 } else {
19574 self.expected_ref(
19575 "`DATA` or an extension name after `LOAD`",
19576 self.peek_token_ref(),
19577 )
19578 }
19579 }
19580
19581 pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
19593 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
19594
19595 let name = self.parse_object_name(false)?;
19596
19597 let on_cluster = self.parse_optional_on_cluster()?;
19599
19600 let partition = if self.parse_keyword(Keyword::PARTITION) {
19601 if self.parse_keyword(Keyword::ID) {
19602 Some(Partition::Identifier(self.parse_identifier()?))
19603 } else {
19604 Some(Partition::Expr(self.parse_expr()?))
19605 }
19606 } else {
19607 None
19608 };
19609
19610 let include_final = self.parse_keyword(Keyword::FINAL);
19611
19612 let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
19613 if self.parse_keyword(Keyword::BY) {
19614 Some(Deduplicate::ByExpression(self.parse_expr()?))
19615 } else {
19616 Some(Deduplicate::All)
19617 }
19618 } else {
19619 None
19620 };
19621
19622 let predicate = if self.parse_keyword(Keyword::WHERE) {
19624 Some(self.parse_expr()?)
19625 } else {
19626 None
19627 };
19628
19629 let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
19630 self.expect_token(&Token::LParen)?;
19631 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
19632 self.expect_token(&Token::RParen)?;
19633 Some(columns)
19634 } else {
19635 None
19636 };
19637
19638 Ok(Statement::OptimizeTable {
19639 name,
19640 has_table_keyword,
19641 on_cluster,
19642 partition,
19643 include_final,
19644 deduplicate,
19645 predicate,
19646 zorder,
19647 })
19648 }
19649
19650 pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
19656 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19658 let name = self.parse_object_name(false)?;
19660 let mut data_type: Option<DataType> = None;
19662 if self.parse_keywords(&[Keyword::AS]) {
19663 data_type = Some(self.parse_data_type()?)
19664 }
19665 let sequence_options = self.parse_create_sequence_options()?;
19666 let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
19668 if self.parse_keywords(&[Keyword::NONE]) {
19669 Some(ObjectName::from(vec![Ident::new("NONE")]))
19670 } else {
19671 Some(self.parse_object_name(false)?)
19672 }
19673 } else {
19674 None
19675 };
19676 Ok(Statement::CreateSequence {
19677 temporary,
19678 if_not_exists,
19679 name,
19680 data_type,
19681 sequence_options,
19682 owned_by,
19683 })
19684 }
19685
19686 fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
19687 let mut sequence_options = vec![];
19688 if self.parse_keywords(&[Keyword::INCREMENT]) {
19690 if self.parse_keywords(&[Keyword::BY]) {
19691 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
19692 } else {
19693 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
19694 }
19695 }
19696 if self.parse_keyword(Keyword::MINVALUE) {
19698 sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
19699 } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
19700 sequence_options.push(SequenceOptions::MinValue(None));
19701 }
19702 if self.parse_keywords(&[Keyword::MAXVALUE]) {
19704 sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
19705 } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
19706 sequence_options.push(SequenceOptions::MaxValue(None));
19707 }
19708
19709 if self.parse_keywords(&[Keyword::START]) {
19711 if self.parse_keywords(&[Keyword::WITH]) {
19712 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
19713 } else {
19714 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
19715 }
19716 }
19717 if self.parse_keywords(&[Keyword::CACHE]) {
19719 sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
19720 }
19721 if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
19723 sequence_options.push(SequenceOptions::Cycle(true));
19724 } else if self.parse_keywords(&[Keyword::CYCLE]) {
19725 sequence_options.push(SequenceOptions::Cycle(false));
19726 }
19727
19728 Ok(sequence_options)
19729 }
19730
19731 pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
19735 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19736 let name = self.parse_object_name(false)?;
19737
19738 let server_type = if self.parse_keyword(Keyword::TYPE) {
19739 Some(self.parse_identifier()?)
19740 } else {
19741 None
19742 };
19743
19744 let version = if self.parse_keyword(Keyword::VERSION) {
19745 Some(self.parse_identifier()?)
19746 } else {
19747 None
19748 };
19749
19750 self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
19751 let foreign_data_wrapper = self.parse_object_name(false)?;
19752
19753 let mut options = None;
19754 if self.parse_keyword(Keyword::OPTIONS) {
19755 self.expect_token(&Token::LParen)?;
19756 options = Some(self.parse_comma_separated(|p| {
19757 let key = p.parse_identifier()?;
19758 let value = p.parse_identifier()?;
19759 Ok(CreateServerOption { key, value })
19760 })?);
19761 self.expect_token(&Token::RParen)?;
19762 }
19763
19764 Ok(Statement::CreateServer(CreateServerStatement {
19765 name,
19766 if_not_exists: ine,
19767 server_type,
19768 version,
19769 foreign_data_wrapper,
19770 options,
19771 }))
19772 }
19773
19774 pub fn index(&self) -> usize {
19776 self.index
19777 }
19778
19779 pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
19781 let ident = self.parse_identifier()?;
19782 self.expect_keyword_is(Keyword::AS)?;
19783
19784 let window_expr = if self.consume_token(&Token::LParen) {
19785 NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
19786 } else if self.dialect.supports_window_clause_named_window_reference() {
19787 NamedWindowExpr::NamedWindow(self.parse_identifier()?)
19788 } else {
19789 return self.expected_ref("(", self.peek_token_ref());
19790 };
19791
19792 Ok(NamedWindowDefinition(ident, window_expr))
19793 }
19794
19795 pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
19797 let name = self.parse_object_name(false)?;
19798 let params = self.parse_optional_procedure_parameters()?;
19799
19800 let language = if self.parse_keyword(Keyword::LANGUAGE) {
19801 Some(self.parse_identifier()?)
19802 } else {
19803 None
19804 };
19805
19806 self.expect_keyword_is(Keyword::AS)?;
19807
19808 let body = self.parse_conditional_statements(&[Keyword::END])?;
19809
19810 Ok(Statement::CreateProcedure {
19811 name,
19812 or_alter,
19813 params,
19814 language,
19815 body,
19816 })
19817 }
19818
19819 pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
19821 let window_name = match &self.peek_token_ref().token {
19822 Token::Word(word) if word.keyword == Keyword::NoKeyword => {
19823 self.parse_optional_ident()?
19824 }
19825 _ => None,
19826 };
19827
19828 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
19829 self.parse_comma_separated(Parser::parse_expr)?
19830 } else {
19831 vec![]
19832 };
19833 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
19834 self.parse_comma_separated(Parser::parse_order_by_expr)?
19835 } else {
19836 vec![]
19837 };
19838
19839 let window_frame = if !self.consume_token(&Token::RParen) {
19840 let window_frame = self.parse_window_frame()?;
19841 self.expect_token(&Token::RParen)?;
19842 Some(window_frame)
19843 } else {
19844 None
19845 };
19846 Ok(WindowSpec {
19847 window_name,
19848 partition_by,
19849 order_by,
19850 window_frame,
19851 })
19852 }
19853
19854 pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
19856 let name = self.parse_object_name(false)?;
19857
19858 let has_as = self.parse_keyword(Keyword::AS);
19860
19861 if !has_as {
19862 if self.consume_token(&Token::LParen) {
19864 let options = self.parse_create_type_sql_definition_options()?;
19866 self.expect_token(&Token::RParen)?;
19867 return Ok(Statement::CreateType {
19868 name,
19869 representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
19870 });
19871 }
19872
19873 return Ok(Statement::CreateType {
19875 name,
19876 representation: None,
19877 });
19878 }
19879
19880 if self.parse_keyword(Keyword::ENUM) {
19882 self.parse_create_type_enum(name)
19884 } else if self.parse_keyword(Keyword::RANGE) {
19885 self.parse_create_type_range(name)
19887 } else if self.consume_token(&Token::LParen) {
19888 self.parse_create_type_composite(name)
19890 } else {
19891 self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
19892 }
19893 }
19894
19895 fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
19899 if self.consume_token(&Token::RParen) {
19900 return Ok(Statement::CreateType {
19902 name,
19903 representation: Some(UserDefinedTypeRepresentation::Composite {
19904 attributes: vec![],
19905 }),
19906 });
19907 }
19908
19909 let mut attributes = vec![];
19910 loop {
19911 let attr_name = self.parse_identifier()?;
19912 let attr_data_type = self.parse_data_type()?;
19913 let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
19914 Some(self.parse_object_name(false)?)
19915 } else {
19916 None
19917 };
19918 attributes.push(UserDefinedTypeCompositeAttributeDef {
19919 name: attr_name,
19920 data_type: attr_data_type,
19921 collation: attr_collation,
19922 });
19923
19924 if !self.consume_token(&Token::Comma) {
19925 break;
19926 }
19927 }
19928 self.expect_token(&Token::RParen)?;
19929
19930 Ok(Statement::CreateType {
19931 name,
19932 representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
19933 })
19934 }
19935
19936 pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
19940 self.expect_token(&Token::LParen)?;
19941 let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
19942 self.expect_token(&Token::RParen)?;
19943
19944 Ok(Statement::CreateType {
19945 name,
19946 representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
19947 })
19948 }
19949
19950 fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
19954 self.expect_token(&Token::LParen)?;
19955 let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
19956 self.expect_token(&Token::RParen)?;
19957
19958 Ok(Statement::CreateType {
19959 name,
19960 representation: Some(UserDefinedTypeRepresentation::Range { options }),
19961 })
19962 }
19963
19964 fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
19966 let keyword = self.parse_one_of_keywords(&[
19967 Keyword::SUBTYPE,
19968 Keyword::SUBTYPE_OPCLASS,
19969 Keyword::COLLATION,
19970 Keyword::CANONICAL,
19971 Keyword::SUBTYPE_DIFF,
19972 Keyword::MULTIRANGE_TYPE_NAME,
19973 ]);
19974
19975 match keyword {
19976 Some(Keyword::SUBTYPE) => {
19977 self.expect_token(&Token::Eq)?;
19978 let data_type = self.parse_data_type()?;
19979 Ok(UserDefinedTypeRangeOption::Subtype(data_type))
19980 }
19981 Some(Keyword::SUBTYPE_OPCLASS) => {
19982 self.expect_token(&Token::Eq)?;
19983 let name = self.parse_object_name(false)?;
19984 Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
19985 }
19986 Some(Keyword::COLLATION) => {
19987 self.expect_token(&Token::Eq)?;
19988 let name = self.parse_object_name(false)?;
19989 Ok(UserDefinedTypeRangeOption::Collation(name))
19990 }
19991 Some(Keyword::CANONICAL) => {
19992 self.expect_token(&Token::Eq)?;
19993 let name = self.parse_object_name(false)?;
19994 Ok(UserDefinedTypeRangeOption::Canonical(name))
19995 }
19996 Some(Keyword::SUBTYPE_DIFF) => {
19997 self.expect_token(&Token::Eq)?;
19998 let name = self.parse_object_name(false)?;
19999 Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20000 }
20001 Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20002 self.expect_token(&Token::Eq)?;
20003 let name = self.parse_object_name(false)?;
20004 Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20005 }
20006 _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20007 }
20008 }
20009
20010 fn parse_create_type_sql_definition_options(
20012 &mut self,
20013 ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20014 self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20015 }
20016
20017 fn parse_sql_definition_option(
20019 &mut self,
20020 ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20021 let keyword = self.parse_one_of_keywords(&[
20022 Keyword::INPUT,
20023 Keyword::OUTPUT,
20024 Keyword::RECEIVE,
20025 Keyword::SEND,
20026 Keyword::TYPMOD_IN,
20027 Keyword::TYPMOD_OUT,
20028 Keyword::ANALYZE,
20029 Keyword::SUBSCRIPT,
20030 Keyword::INTERNALLENGTH,
20031 Keyword::PASSEDBYVALUE,
20032 Keyword::ALIGNMENT,
20033 Keyword::STORAGE,
20034 Keyword::LIKE,
20035 Keyword::CATEGORY,
20036 Keyword::PREFERRED,
20037 Keyword::DEFAULT,
20038 Keyword::ELEMENT,
20039 Keyword::DELIMITER,
20040 Keyword::COLLATABLE,
20041 ]);
20042
20043 match keyword {
20044 Some(Keyword::INPUT) => {
20045 self.expect_token(&Token::Eq)?;
20046 let name = self.parse_object_name(false)?;
20047 Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20048 }
20049 Some(Keyword::OUTPUT) => {
20050 self.expect_token(&Token::Eq)?;
20051 let name = self.parse_object_name(false)?;
20052 Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20053 }
20054 Some(Keyword::RECEIVE) => {
20055 self.expect_token(&Token::Eq)?;
20056 let name = self.parse_object_name(false)?;
20057 Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20058 }
20059 Some(Keyword::SEND) => {
20060 self.expect_token(&Token::Eq)?;
20061 let name = self.parse_object_name(false)?;
20062 Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20063 }
20064 Some(Keyword::TYPMOD_IN) => {
20065 self.expect_token(&Token::Eq)?;
20066 let name = self.parse_object_name(false)?;
20067 Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20068 }
20069 Some(Keyword::TYPMOD_OUT) => {
20070 self.expect_token(&Token::Eq)?;
20071 let name = self.parse_object_name(false)?;
20072 Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20073 }
20074 Some(Keyword::ANALYZE) => {
20075 self.expect_token(&Token::Eq)?;
20076 let name = self.parse_object_name(false)?;
20077 Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20078 }
20079 Some(Keyword::SUBSCRIPT) => {
20080 self.expect_token(&Token::Eq)?;
20081 let name = self.parse_object_name(false)?;
20082 Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20083 }
20084 Some(Keyword::INTERNALLENGTH) => {
20085 self.expect_token(&Token::Eq)?;
20086 if self.parse_keyword(Keyword::VARIABLE) {
20087 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20088 UserDefinedTypeInternalLength::Variable,
20089 ))
20090 } else {
20091 let value = self.parse_literal_uint()?;
20092 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20093 UserDefinedTypeInternalLength::Fixed(value),
20094 ))
20095 }
20096 }
20097 Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20098 Some(Keyword::ALIGNMENT) => {
20099 self.expect_token(&Token::Eq)?;
20100 let align_keyword = self.parse_one_of_keywords(&[
20101 Keyword::CHAR,
20102 Keyword::INT2,
20103 Keyword::INT4,
20104 Keyword::DOUBLE,
20105 ]);
20106 match align_keyword {
20107 Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20108 Alignment::Char,
20109 )),
20110 Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20111 Alignment::Int2,
20112 )),
20113 Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20114 Alignment::Int4,
20115 )),
20116 Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20117 Alignment::Double,
20118 )),
20119 _ => self.expected_ref(
20120 "alignment value (char, int2, int4, or double)",
20121 self.peek_token_ref(),
20122 ),
20123 }
20124 }
20125 Some(Keyword::STORAGE) => {
20126 self.expect_token(&Token::Eq)?;
20127 let storage_keyword = self.parse_one_of_keywords(&[
20128 Keyword::PLAIN,
20129 Keyword::EXTERNAL,
20130 Keyword::EXTENDED,
20131 Keyword::MAIN,
20132 ]);
20133 match storage_keyword {
20134 Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20135 UserDefinedTypeStorage::Plain,
20136 )),
20137 Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20138 UserDefinedTypeStorage::External,
20139 )),
20140 Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20141 UserDefinedTypeStorage::Extended,
20142 )),
20143 Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20144 UserDefinedTypeStorage::Main,
20145 )),
20146 _ => self.expected_ref(
20147 "storage value (plain, external, extended, or main)",
20148 self.peek_token_ref(),
20149 ),
20150 }
20151 }
20152 Some(Keyword::LIKE) => {
20153 self.expect_token(&Token::Eq)?;
20154 let name = self.parse_object_name(false)?;
20155 Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20156 }
20157 Some(Keyword::CATEGORY) => {
20158 self.expect_token(&Token::Eq)?;
20159 let category_str = self.parse_literal_string()?;
20160 let category_char = category_str.chars().next().ok_or_else(|| {
20161 ParserError::ParserError(
20162 "CATEGORY value must be a single character".to_string(),
20163 )
20164 })?;
20165 Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20166 }
20167 Some(Keyword::PREFERRED) => {
20168 self.expect_token(&Token::Eq)?;
20169 let value =
20170 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20171 Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20172 }
20173 Some(Keyword::DEFAULT) => {
20174 self.expect_token(&Token::Eq)?;
20175 let expr = self.parse_expr()?;
20176 Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20177 }
20178 Some(Keyword::ELEMENT) => {
20179 self.expect_token(&Token::Eq)?;
20180 let data_type = self.parse_data_type()?;
20181 Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20182 }
20183 Some(Keyword::DELIMITER) => {
20184 self.expect_token(&Token::Eq)?;
20185 let delimiter = self.parse_literal_string()?;
20186 Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20187 }
20188 Some(Keyword::COLLATABLE) => {
20189 self.expect_token(&Token::Eq)?;
20190 let value =
20191 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20192 Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20193 }
20194 _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20195 }
20196 }
20197
20198 fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20199 self.expect_token(&Token::LParen)?;
20200 let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20201 self.expect_token(&Token::RParen)?;
20202 Ok(idents)
20203 }
20204
20205 fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20206 if dialect_of!(self is MySqlDialect | GenericDialect) {
20207 if self.parse_keyword(Keyword::FIRST) {
20208 Ok(Some(MySQLColumnPosition::First))
20209 } else if self.parse_keyword(Keyword::AFTER) {
20210 let ident = self.parse_identifier()?;
20211 Ok(Some(MySQLColumnPosition::After(ident)))
20212 } else {
20213 Ok(None)
20214 }
20215 } else {
20216 Ok(None)
20217 }
20218 }
20219
20220 fn parse_print(&mut self) -> Result<Statement, ParserError> {
20222 Ok(Statement::Print(PrintStatement {
20223 message: Box::new(self.parse_expr()?),
20224 }))
20225 }
20226
20227 fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20231 let wait_type = if self.parse_keyword(Keyword::DELAY) {
20232 WaitForType::Delay
20233 } else if self.parse_keyword(Keyword::TIME) {
20234 WaitForType::Time
20235 } else {
20236 return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20237 };
20238 let expr = self.parse_expr()?;
20239 Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20240 }
20241
20242 fn parse_return(&mut self) -> Result<Statement, ParserError> {
20244 match self.maybe_parse(|p| p.parse_expr())? {
20245 Some(expr) => Ok(Statement::Return(ReturnStatement {
20246 value: Some(ReturnStatementValue::Expr(expr)),
20247 })),
20248 None => Ok(Statement::Return(ReturnStatement { value: None })),
20249 }
20250 }
20251
20252 fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20256 self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20257
20258 let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20259 Some(self.parse_object_name(false)?)
20260 } else {
20261 None
20262 };
20263 self.expect_keyword(Keyword::OPTIONS)?;
20264 self.expect_token(&Token::LParen)?;
20265 let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20266 self.expect_token(&Token::RParen)?;
20267 self.expect_keyword(Keyword::AS)?;
20268 let query = self.parse_query()?;
20269 Ok(Statement::ExportData(ExportData {
20270 options,
20271 query,
20272 connection,
20273 }))
20274 }
20275
20276 fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20277 self.expect_keyword(Keyword::VACUUM)?;
20278 let full = self.parse_keyword(Keyword::FULL);
20279 let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20280 let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20281 let reindex = self.parse_keyword(Keyword::REINDEX);
20282 let recluster = self.parse_keyword(Keyword::RECLUSTER);
20283 let (table_name, threshold, boost) =
20284 match self.maybe_parse(|p| p.parse_object_name(false))? {
20285 Some(table_name) => {
20286 let threshold = if self.parse_keyword(Keyword::TO) {
20287 let value = self.parse_value()?;
20288 self.expect_keyword(Keyword::PERCENT)?;
20289 Some(value)
20290 } else {
20291 None
20292 };
20293 let boost = self.parse_keyword(Keyword::BOOST);
20294 (Some(table_name), threshold, boost)
20295 }
20296 _ => (None, None, false),
20297 };
20298 Ok(Statement::Vacuum(VacuumStatement {
20299 full,
20300 sort_only,
20301 delete_only,
20302 reindex,
20303 recluster,
20304 table_name,
20305 threshold,
20306 boost,
20307 }))
20308 }
20309
20310 pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20312 self.tokens
20313 }
20314
20315 fn peek_sub_query(&mut self) -> bool {
20317 self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20318 .is_some()
20319 }
20320
20321 pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20322 let show_in;
20323 let mut filter_position = None;
20324 if self.dialect.supports_show_like_before_in() {
20325 if let Some(filter) = self.parse_show_statement_filter()? {
20326 filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20327 }
20328 show_in = self.maybe_parse_show_stmt_in()?;
20329 } else {
20330 show_in = self.maybe_parse_show_stmt_in()?;
20331 if let Some(filter) = self.parse_show_statement_filter()? {
20332 filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20333 }
20334 }
20335 let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20336 let limit = self.maybe_parse_show_stmt_limit()?;
20337 let from = self.maybe_parse_show_stmt_from()?;
20338 Ok(ShowStatementOptions {
20339 filter_position,
20340 show_in,
20341 starts_with,
20342 limit,
20343 limit_from: from,
20344 })
20345 }
20346
20347 fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
20348 let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
20349 Some(Keyword::FROM) => ShowStatementInClause::FROM,
20350 Some(Keyword::IN) => ShowStatementInClause::IN,
20351 None => return Ok(None),
20352 _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
20353 };
20354
20355 let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
20356 Keyword::ACCOUNT,
20357 Keyword::DATABASE,
20358 Keyword::SCHEMA,
20359 Keyword::TABLE,
20360 Keyword::VIEW,
20361 ]) {
20362 Some(Keyword::DATABASE)
20364 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20365 | self.peek_keyword(Keyword::LIMIT) =>
20366 {
20367 (Some(ShowStatementInParentType::Database), None)
20368 }
20369 Some(Keyword::SCHEMA)
20370 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20371 | self.peek_keyword(Keyword::LIMIT) =>
20372 {
20373 (Some(ShowStatementInParentType::Schema), None)
20374 }
20375 Some(parent_kw) => {
20376 let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
20380 match parent_kw {
20381 Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
20382 Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
20383 Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
20384 Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
20385 Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
20386 _ => {
20387 return self.expected_ref(
20388 "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
20389 self.peek_token_ref(),
20390 )
20391 }
20392 }
20393 }
20394 None => {
20395 let mut parent_name = self.parse_object_name(false)?;
20398 if self
20399 .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
20400 .is_some()
20401 {
20402 parent_name
20403 .0
20404 .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
20405 }
20406 (None, Some(parent_name))
20407 }
20408 };
20409
20410 Ok(Some(ShowStatementIn {
20411 clause,
20412 parent_type,
20413 parent_name,
20414 }))
20415 }
20416
20417 fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20418 if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
20419 Ok(Some(self.parse_value()?))
20420 } else {
20421 Ok(None)
20422 }
20423 }
20424
20425 fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
20426 if self.parse_keyword(Keyword::LIMIT) {
20427 Ok(self.parse_limit()?)
20428 } else {
20429 Ok(None)
20430 }
20431 }
20432
20433 fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20434 if self.parse_keyword(Keyword::FROM) {
20435 Ok(Some(self.parse_value()?))
20436 } else {
20437 Ok(None)
20438 }
20439 }
20440
20441 pub(crate) fn in_column_definition_state(&self) -> bool {
20442 matches!(self.state, ColumnDefinition)
20443 }
20444
20445 pub(crate) fn parse_key_value_options(
20450 &mut self,
20451 parenthesized: bool,
20452 end_words: &[Keyword],
20453 ) -> Result<KeyValueOptions, ParserError> {
20454 let mut options: Vec<KeyValueOption> = Vec::new();
20455 let mut delimiter = KeyValueOptionsDelimiter::Space;
20456 if parenthesized {
20457 self.expect_token(&Token::LParen)?;
20458 }
20459 loop {
20460 match self.next_token().token {
20461 Token::RParen => {
20462 if parenthesized {
20463 break;
20464 } else {
20465 return self.expected_ref(" another option or EOF", self.peek_token_ref());
20466 }
20467 }
20468 Token::EOF | Token::SemiColon => break,
20469 Token::Comma => {
20470 delimiter = KeyValueOptionsDelimiter::Comma;
20471 continue;
20472 }
20473 Token::Word(w) if !end_words.contains(&w.keyword) => {
20474 options.push(self.parse_key_value_option(&w)?)
20475 }
20476 Token::Word(w) if end_words.contains(&w.keyword) => {
20477 self.prev_token();
20478 break;
20479 }
20480 _ => {
20481 return self.expected_ref(
20482 "another option, EOF, SemiColon, Comma or ')'",
20483 self.peek_token_ref(),
20484 )
20485 }
20486 };
20487 }
20488
20489 Ok(KeyValueOptions { delimiter, options })
20490 }
20491
20492 pub(crate) fn parse_key_value_option(
20494 &mut self,
20495 key: &Word,
20496 ) -> Result<KeyValueOption, ParserError> {
20497 self.expect_token(&Token::Eq)?;
20498 let peeked_token = self.peek_token();
20499 match peeked_token.token {
20500 Token::SingleQuotedString(_) => Ok(KeyValueOption {
20501 option_name: key.value.clone(),
20502 option_value: KeyValueOptionKind::Single(self.parse_value()?),
20503 }),
20504 Token::Word(word)
20505 if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
20506 {
20507 Ok(KeyValueOption {
20508 option_name: key.value.clone(),
20509 option_value: KeyValueOptionKind::Single(self.parse_value()?),
20510 })
20511 }
20512 Token::Number(..) => Ok(KeyValueOption {
20513 option_name: key.value.clone(),
20514 option_value: KeyValueOptionKind::Single(self.parse_value()?),
20515 }),
20516 Token::Word(word) => {
20517 self.next_token();
20518 Ok(KeyValueOption {
20519 option_name: key.value.clone(),
20520 option_value: KeyValueOptionKind::Single(
20521 Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
20522 ),
20523 })
20524 }
20525 Token::LParen => {
20526 match self.maybe_parse(|parser| {
20530 parser.expect_token(&Token::LParen)?;
20531 let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
20532 parser.expect_token(&Token::RParen)?;
20533 values
20534 })? {
20535 Some(values) => Ok(KeyValueOption {
20536 option_name: key.value.clone(),
20537 option_value: KeyValueOptionKind::Multi(values),
20538 }),
20539 None => Ok(KeyValueOption {
20540 option_name: key.value.clone(),
20541 option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
20542 self.parse_key_value_options(true, &[])?,
20543 )),
20544 }),
20545 }
20546 }
20547 _ => self.expected_ref("expected option value", self.peek_token_ref()),
20548 }
20549 }
20550
20551 fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
20553 if self.parse_keyword(Keyword::ALL) {
20554 return Ok(ResetStatement { reset: Reset::ALL });
20555 }
20556
20557 let obj = self.parse_object_name(false)?;
20558 Ok(ResetStatement {
20559 reset: Reset::ConfigurationParameter(obj),
20560 })
20561 }
20562}
20563
20564fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
20565 if let Some(prefix) = prefix {
20566 Expr::Prefixed {
20567 prefix,
20568 value: Box::new(expr),
20569 }
20570 } else {
20571 expr
20572 }
20573}
20574
20575impl Word {
20576 pub fn to_ident(&self, span: Span) -> Ident {
20582 Ident {
20583 value: self.value.clone(),
20584 quote_style: self.quote_style,
20585 span,
20586 }
20587 }
20588
20589 pub fn into_ident(self, span: Span) -> Ident {
20594 Ident {
20595 value: self.value,
20596 quote_style: self.quote_style,
20597 span,
20598 }
20599 }
20600}
20601
20602#[cfg(test)]
20603mod tests {
20604 use crate::test_utils::{all_dialects, TestedDialects};
20605
20606 use super::*;
20607
20608 #[test]
20609 fn test_prev_index() {
20610 let sql = "SELECT version";
20611 all_dialects().run_parser_method(sql, |parser| {
20612 assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
20613 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20614 parser.prev_token();
20615 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20616 assert_eq!(parser.next_token(), Token::make_word("version", None));
20617 parser.prev_token();
20618 assert_eq!(parser.peek_token(), Token::make_word("version", None));
20619 assert_eq!(parser.next_token(), Token::make_word("version", None));
20620 assert_eq!(parser.peek_token(), Token::EOF);
20621 parser.prev_token();
20622 assert_eq!(parser.next_token(), Token::make_word("version", None));
20623 assert_eq!(parser.next_token(), Token::EOF);
20624 assert_eq!(parser.next_token(), Token::EOF);
20625 parser.prev_token();
20626 });
20627 }
20628
20629 #[test]
20630 fn test_peek_tokens() {
20631 all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
20632 assert!(matches!(
20633 parser.peek_tokens(),
20634 [Token::Word(Word {
20635 keyword: Keyword::SELECT,
20636 ..
20637 })]
20638 ));
20639
20640 assert!(matches!(
20641 parser.peek_tokens(),
20642 [
20643 Token::Word(Word {
20644 keyword: Keyword::SELECT,
20645 ..
20646 }),
20647 Token::Word(_),
20648 Token::Word(Word {
20649 keyword: Keyword::AS,
20650 ..
20651 }),
20652 ]
20653 ));
20654
20655 for _ in 0..4 {
20656 parser.next_token();
20657 }
20658
20659 assert!(matches!(
20660 parser.peek_tokens(),
20661 [
20662 Token::Word(Word {
20663 keyword: Keyword::FROM,
20664 ..
20665 }),
20666 Token::Word(_),
20667 Token::EOF,
20668 Token::EOF,
20669 ]
20670 ))
20671 })
20672 }
20673
20674 #[cfg(test)]
20675 mod test_parse_data_type {
20676 use crate::ast::{
20677 CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
20678 };
20679 use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
20680 use crate::test_utils::TestedDialects;
20681
20682 macro_rules! test_parse_data_type {
20683 ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
20684 $dialect.run_parser_method(&*$input, |parser| {
20685 let data_type = parser.parse_data_type().unwrap();
20686 assert_eq!($expected_type, data_type);
20687 assert_eq!($input.to_string(), data_type.to_string());
20688 });
20689 }};
20690 }
20691
20692 #[test]
20693 fn test_ansii_character_string_types() {
20694 let dialect =
20696 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20697
20698 test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
20699
20700 test_parse_data_type!(
20701 dialect,
20702 "CHARACTER(20)",
20703 DataType::Character(Some(CharacterLength::IntegerLength {
20704 length: 20,
20705 unit: None
20706 }))
20707 );
20708
20709 test_parse_data_type!(
20710 dialect,
20711 "CHARACTER(20 CHARACTERS)",
20712 DataType::Character(Some(CharacterLength::IntegerLength {
20713 length: 20,
20714 unit: Some(CharLengthUnits::Characters)
20715 }))
20716 );
20717
20718 test_parse_data_type!(
20719 dialect,
20720 "CHARACTER(20 OCTETS)",
20721 DataType::Character(Some(CharacterLength::IntegerLength {
20722 length: 20,
20723 unit: Some(CharLengthUnits::Octets)
20724 }))
20725 );
20726
20727 test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
20728
20729 test_parse_data_type!(
20730 dialect,
20731 "CHAR(20)",
20732 DataType::Char(Some(CharacterLength::IntegerLength {
20733 length: 20,
20734 unit: None
20735 }))
20736 );
20737
20738 test_parse_data_type!(
20739 dialect,
20740 "CHAR(20 CHARACTERS)",
20741 DataType::Char(Some(CharacterLength::IntegerLength {
20742 length: 20,
20743 unit: Some(CharLengthUnits::Characters)
20744 }))
20745 );
20746
20747 test_parse_data_type!(
20748 dialect,
20749 "CHAR(20 OCTETS)",
20750 DataType::Char(Some(CharacterLength::IntegerLength {
20751 length: 20,
20752 unit: Some(CharLengthUnits::Octets)
20753 }))
20754 );
20755
20756 test_parse_data_type!(
20757 dialect,
20758 "CHARACTER VARYING(20)",
20759 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20760 length: 20,
20761 unit: None
20762 }))
20763 );
20764
20765 test_parse_data_type!(
20766 dialect,
20767 "CHARACTER VARYING(20 CHARACTERS)",
20768 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20769 length: 20,
20770 unit: Some(CharLengthUnits::Characters)
20771 }))
20772 );
20773
20774 test_parse_data_type!(
20775 dialect,
20776 "CHARACTER VARYING(20 OCTETS)",
20777 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20778 length: 20,
20779 unit: Some(CharLengthUnits::Octets)
20780 }))
20781 );
20782
20783 test_parse_data_type!(
20784 dialect,
20785 "CHAR VARYING(20)",
20786 DataType::CharVarying(Some(CharacterLength::IntegerLength {
20787 length: 20,
20788 unit: None
20789 }))
20790 );
20791
20792 test_parse_data_type!(
20793 dialect,
20794 "CHAR VARYING(20 CHARACTERS)",
20795 DataType::CharVarying(Some(CharacterLength::IntegerLength {
20796 length: 20,
20797 unit: Some(CharLengthUnits::Characters)
20798 }))
20799 );
20800
20801 test_parse_data_type!(
20802 dialect,
20803 "CHAR VARYING(20 OCTETS)",
20804 DataType::CharVarying(Some(CharacterLength::IntegerLength {
20805 length: 20,
20806 unit: Some(CharLengthUnits::Octets)
20807 }))
20808 );
20809
20810 test_parse_data_type!(
20811 dialect,
20812 "VARCHAR(20)",
20813 DataType::Varchar(Some(CharacterLength::IntegerLength {
20814 length: 20,
20815 unit: None
20816 }))
20817 );
20818 }
20819
20820 #[test]
20821 fn test_ansii_character_large_object_types() {
20822 let dialect =
20824 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20825
20826 test_parse_data_type!(
20827 dialect,
20828 "CHARACTER LARGE OBJECT",
20829 DataType::CharacterLargeObject(None)
20830 );
20831 test_parse_data_type!(
20832 dialect,
20833 "CHARACTER LARGE OBJECT(20)",
20834 DataType::CharacterLargeObject(Some(20))
20835 );
20836
20837 test_parse_data_type!(
20838 dialect,
20839 "CHAR LARGE OBJECT",
20840 DataType::CharLargeObject(None)
20841 );
20842 test_parse_data_type!(
20843 dialect,
20844 "CHAR LARGE OBJECT(20)",
20845 DataType::CharLargeObject(Some(20))
20846 );
20847
20848 test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
20849 test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
20850 }
20851
20852 #[test]
20853 fn test_parse_custom_types() {
20854 let dialect =
20855 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20856
20857 test_parse_data_type!(
20858 dialect,
20859 "GEOMETRY",
20860 DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
20861 );
20862
20863 test_parse_data_type!(
20864 dialect,
20865 "GEOMETRY(POINT)",
20866 DataType::Custom(
20867 ObjectName::from(vec!["GEOMETRY".into()]),
20868 vec!["POINT".to_string()]
20869 )
20870 );
20871
20872 test_parse_data_type!(
20873 dialect,
20874 "GEOMETRY(POINT, 4326)",
20875 DataType::Custom(
20876 ObjectName::from(vec!["GEOMETRY".into()]),
20877 vec!["POINT".to_string(), "4326".to_string()]
20878 )
20879 );
20880 }
20881
20882 #[test]
20883 fn test_ansii_exact_numeric_types() {
20884 let dialect = TestedDialects::new(vec![
20886 Box::new(GenericDialect {}),
20887 Box::new(AnsiDialect {}),
20888 Box::new(PostgreSqlDialect {}),
20889 ]);
20890
20891 test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
20892
20893 test_parse_data_type!(
20894 dialect,
20895 "NUMERIC(2)",
20896 DataType::Numeric(ExactNumberInfo::Precision(2))
20897 );
20898
20899 test_parse_data_type!(
20900 dialect,
20901 "NUMERIC(2,10)",
20902 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
20903 );
20904
20905 test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
20906
20907 test_parse_data_type!(
20908 dialect,
20909 "DECIMAL(2)",
20910 DataType::Decimal(ExactNumberInfo::Precision(2))
20911 );
20912
20913 test_parse_data_type!(
20914 dialect,
20915 "DECIMAL(2,10)",
20916 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
20917 );
20918
20919 test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
20920
20921 test_parse_data_type!(
20922 dialect,
20923 "DEC(2)",
20924 DataType::Dec(ExactNumberInfo::Precision(2))
20925 );
20926
20927 test_parse_data_type!(
20928 dialect,
20929 "DEC(2,10)",
20930 DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
20931 );
20932
20933 test_parse_data_type!(
20935 dialect,
20936 "NUMERIC(10,-2)",
20937 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
20938 );
20939
20940 test_parse_data_type!(
20941 dialect,
20942 "DECIMAL(1000,-10)",
20943 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
20944 );
20945
20946 test_parse_data_type!(
20947 dialect,
20948 "DEC(5,-1000)",
20949 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
20950 );
20951
20952 test_parse_data_type!(
20953 dialect,
20954 "NUMERIC(10,-5)",
20955 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
20956 );
20957
20958 test_parse_data_type!(
20959 dialect,
20960 "DECIMAL(20,-10)",
20961 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
20962 );
20963
20964 test_parse_data_type!(
20965 dialect,
20966 "DEC(5,-2)",
20967 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
20968 );
20969
20970 dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
20971 let data_type = parser.parse_data_type().unwrap();
20972 assert_eq!(
20973 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
20974 data_type
20975 );
20976 assert_eq!("NUMERIC(10,5)", data_type.to_string());
20978 });
20979 }
20980
20981 #[test]
20982 fn test_ansii_date_type() {
20983 let dialect =
20985 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20986
20987 test_parse_data_type!(dialect, "DATE", DataType::Date);
20988
20989 test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
20990
20991 test_parse_data_type!(
20992 dialect,
20993 "TIME(6)",
20994 DataType::Time(Some(6), TimezoneInfo::None)
20995 );
20996
20997 test_parse_data_type!(
20998 dialect,
20999 "TIME WITH TIME ZONE",
21000 DataType::Time(None, TimezoneInfo::WithTimeZone)
21001 );
21002
21003 test_parse_data_type!(
21004 dialect,
21005 "TIME(6) WITH TIME ZONE",
21006 DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21007 );
21008
21009 test_parse_data_type!(
21010 dialect,
21011 "TIME WITHOUT TIME ZONE",
21012 DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21013 );
21014
21015 test_parse_data_type!(
21016 dialect,
21017 "TIME(6) WITHOUT TIME ZONE",
21018 DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21019 );
21020
21021 test_parse_data_type!(
21022 dialect,
21023 "TIMESTAMP",
21024 DataType::Timestamp(None, TimezoneInfo::None)
21025 );
21026
21027 test_parse_data_type!(
21028 dialect,
21029 "TIMESTAMP(22)",
21030 DataType::Timestamp(Some(22), TimezoneInfo::None)
21031 );
21032
21033 test_parse_data_type!(
21034 dialect,
21035 "TIMESTAMP(22) WITH TIME ZONE",
21036 DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21037 );
21038
21039 test_parse_data_type!(
21040 dialect,
21041 "TIMESTAMP(33) WITHOUT TIME ZONE",
21042 DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21043 );
21044 }
21045 }
21046
21047 #[test]
21048 fn test_parse_schema_name() {
21049 macro_rules! test_parse_schema_name {
21051 ($input:expr, $expected_name:expr $(,)?) => {{
21052 all_dialects().run_parser_method(&*$input, |parser| {
21053 let schema_name = parser.parse_schema_name().unwrap();
21054 assert_eq!(schema_name, $expected_name);
21056 assert_eq!(schema_name.to_string(), $input.to_string());
21058 });
21059 }};
21060 }
21061
21062 let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21063 let dummy_authorization = Ident::new("dummy_authorization");
21064
21065 test_parse_schema_name!(
21066 format!("{dummy_name}"),
21067 SchemaName::Simple(dummy_name.clone())
21068 );
21069
21070 test_parse_schema_name!(
21071 format!("AUTHORIZATION {dummy_authorization}"),
21072 SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21073 );
21074 test_parse_schema_name!(
21075 format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21076 SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21077 );
21078 }
21079
21080 #[test]
21081 fn mysql_parse_index_table_constraint() {
21082 macro_rules! test_parse_table_constraint {
21083 ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21084 $dialect.run_parser_method(&*$input, |parser| {
21085 let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21086 assert_eq!(constraint, $expected);
21088 assert_eq!(constraint.to_string(), $input.to_string());
21090 });
21091 }};
21092 }
21093
21094 fn mk_expected_col(name: &str) -> IndexColumn {
21095 IndexColumn {
21096 column: OrderByExpr {
21097 expr: Expr::Identifier(name.into()),
21098 options: OrderByOptions {
21099 asc: None,
21100 nulls_first: None,
21101 },
21102 with_fill: None,
21103 },
21104 operator_class: None,
21105 }
21106 }
21107
21108 let dialect =
21109 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21110
21111 test_parse_table_constraint!(
21112 dialect,
21113 "INDEX (c1)",
21114 IndexConstraint {
21115 display_as_key: false,
21116 name: None,
21117 index_type: None,
21118 columns: vec![mk_expected_col("c1")],
21119 index_options: vec![],
21120 }
21121 .into()
21122 );
21123
21124 test_parse_table_constraint!(
21125 dialect,
21126 "KEY (c1)",
21127 IndexConstraint {
21128 display_as_key: true,
21129 name: None,
21130 index_type: None,
21131 columns: vec![mk_expected_col("c1")],
21132 index_options: vec![],
21133 }
21134 .into()
21135 );
21136
21137 test_parse_table_constraint!(
21138 dialect,
21139 "INDEX 'index' (c1, c2)",
21140 TableConstraint::Index(IndexConstraint {
21141 display_as_key: false,
21142 name: Some(Ident::with_quote('\'', "index")),
21143 index_type: None,
21144 columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21145 index_options: vec![],
21146 })
21147 );
21148
21149 test_parse_table_constraint!(
21150 dialect,
21151 "INDEX USING BTREE (c1)",
21152 IndexConstraint {
21153 display_as_key: false,
21154 name: None,
21155 index_type: Some(IndexType::BTree),
21156 columns: vec![mk_expected_col("c1")],
21157 index_options: vec![],
21158 }
21159 .into()
21160 );
21161
21162 test_parse_table_constraint!(
21163 dialect,
21164 "INDEX USING HASH (c1)",
21165 IndexConstraint {
21166 display_as_key: false,
21167 name: None,
21168 index_type: Some(IndexType::Hash),
21169 columns: vec![mk_expected_col("c1")],
21170 index_options: vec![],
21171 }
21172 .into()
21173 );
21174
21175 test_parse_table_constraint!(
21176 dialect,
21177 "INDEX idx_name USING BTREE (c1)",
21178 IndexConstraint {
21179 display_as_key: false,
21180 name: Some(Ident::new("idx_name")),
21181 index_type: Some(IndexType::BTree),
21182 columns: vec![mk_expected_col("c1")],
21183 index_options: vec![],
21184 }
21185 .into()
21186 );
21187
21188 test_parse_table_constraint!(
21189 dialect,
21190 "INDEX idx_name USING HASH (c1)",
21191 IndexConstraint {
21192 display_as_key: false,
21193 name: Some(Ident::new("idx_name")),
21194 index_type: Some(IndexType::Hash),
21195 columns: vec![mk_expected_col("c1")],
21196 index_options: vec![],
21197 }
21198 .into()
21199 );
21200 }
21201
21202 #[test]
21203 fn test_tokenizer_error_loc() {
21204 let sql = "foo '";
21205 let ast = Parser::parse_sql(&GenericDialect, sql);
21206 assert_eq!(
21207 ast,
21208 Err(ParserError::TokenizerError(
21209 "Unterminated string literal at Line: 1, Column: 5".to_string()
21210 ))
21211 );
21212 }
21213
21214 #[test]
21215 fn test_parser_error_loc() {
21216 let sql = "SELECT this is a syntax error";
21217 let ast = Parser::parse_sql(&GenericDialect, sql);
21218 assert_eq!(
21219 ast,
21220 Err(ParserError::ParserError(
21221 "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
21222 .to_string()
21223 ))
21224 );
21225 }
21226
21227 #[test]
21228 fn test_nested_explain_error() {
21229 let sql = "EXPLAIN EXPLAIN SELECT 1";
21230 let ast = Parser::parse_sql(&GenericDialect, sql);
21231 assert_eq!(
21232 ast,
21233 Err(ParserError::ParserError(
21234 "Explain must be root of the plan".to_string()
21235 ))
21236 );
21237 }
21238
21239 #[test]
21240 fn test_parse_multipart_identifier_positive() {
21241 let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21242
21243 let expected = vec![
21245 Ident {
21246 value: "CATALOG".to_string(),
21247 quote_style: None,
21248 span: Span::empty(),
21249 },
21250 Ident {
21251 value: "F(o)o. \"bar".to_string(),
21252 quote_style: Some('"'),
21253 span: Span::empty(),
21254 },
21255 Ident {
21256 value: "table".to_string(),
21257 quote_style: None,
21258 span: Span::empty(),
21259 },
21260 ];
21261 dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21262 let actual = parser.parse_multipart_identifier().unwrap();
21263 assert_eq!(expected, actual);
21264 });
21265
21266 let expected = vec![
21268 Ident {
21269 value: "CATALOG".to_string(),
21270 quote_style: None,
21271 span: Span::empty(),
21272 },
21273 Ident {
21274 value: "table".to_string(),
21275 quote_style: None,
21276 span: Span::empty(),
21277 },
21278 ];
21279 dialect.run_parser_method("CATALOG . table", |parser| {
21280 let actual = parser.parse_multipart_identifier().unwrap();
21281 assert_eq!(expected, actual);
21282 });
21283 }
21284
21285 #[test]
21286 fn test_parse_multipart_identifier_negative() {
21287 macro_rules! test_parse_multipart_identifier_error {
21288 ($input:expr, $expected_err:expr $(,)?) => {{
21289 all_dialects().run_parser_method(&*$input, |parser| {
21290 let actual_err = parser.parse_multipart_identifier().unwrap_err();
21291 assert_eq!(actual_err.to_string(), $expected_err);
21292 });
21293 }};
21294 }
21295
21296 test_parse_multipart_identifier_error!(
21297 "",
21298 "sql parser error: Empty input when parsing identifier",
21299 );
21300
21301 test_parse_multipart_identifier_error!(
21302 "*schema.table",
21303 "sql parser error: Unexpected token in identifier: *",
21304 );
21305
21306 test_parse_multipart_identifier_error!(
21307 "schema.table*",
21308 "sql parser error: Unexpected token in identifier: *",
21309 );
21310
21311 test_parse_multipart_identifier_error!(
21312 "schema.table.",
21313 "sql parser error: Trailing period in identifier",
21314 );
21315
21316 test_parse_multipart_identifier_error!(
21317 "schema.*",
21318 "sql parser error: Unexpected token following period in identifier: *",
21319 );
21320 }
21321
21322 #[test]
21323 fn test_mysql_partition_selection() {
21324 let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21325 let expected = vec!["p0", "p2"];
21326
21327 let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21328 assert_eq!(ast.len(), 1);
21329 if let Statement::Query(v) = &ast[0] {
21330 if let SetExpr::Select(select) = &*v.body {
21331 assert_eq!(select.from.len(), 1);
21332 let from: &TableWithJoins = &select.from[0];
21333 let table_factor = &from.relation;
21334 if let TableFactor::Table { partitions, .. } = table_factor {
21335 let actual: Vec<&str> = partitions
21336 .iter()
21337 .map(|ident| ident.value.as_str())
21338 .collect();
21339 assert_eq!(expected, actual);
21340 }
21341 }
21342 } else {
21343 panic!("fail to parse mysql partition selection");
21344 }
21345 }
21346
21347 #[test]
21348 fn test_replace_into_placeholders() {
21349 let sql = "REPLACE INTO t (a) VALUES (&a)";
21350
21351 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21352 }
21353
21354 #[test]
21355 fn test_replace_into_set_placeholder() {
21356 let sql = "REPLACE INTO t SET ?";
21357
21358 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21359 }
21360
21361 #[test]
21362 fn test_replace_incomplete() {
21363 let sql = r#"REPLACE"#;
21364
21365 assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
21366 }
21367
21368 #[test]
21369 fn test_placeholder_invalid_whitespace() {
21370 for w in [" ", "/*invalid*/"] {
21371 let sql = format!("\nSELECT\n :{w}fooBar");
21372 assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
21373 }
21374 }
21375}