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)?.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 sort: self.parse_optional_order_by_sort(),
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 multiset = self.maybe_parse_multiset();
5128 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5129 let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5130 let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5131 let global: Option<bool> = if global {
5132 Some(true)
5133 } else if local {
5134 Some(false)
5135 } else {
5136 None
5137 };
5138 let temporary = self
5139 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5140 .is_some();
5141 let volatile = self.parse_keyword(Keyword::VOLATILE);
5142 let persistent = dialect_of!(self is DuckDbDialect)
5143 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5144 let create_view_params = self.parse_create_view_params()?;
5145 if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5146 self.parse_create_snapshot_table().map(Into::into)
5147 } else if self.parse_keyword(Keyword::TABLE) {
5148 self.parse_create_table(or_replace, temporary, global, transient, volatile, multiset)
5149 .map(Into::into)
5150 } else if self.peek_keyword(Keyword::MATERIALIZED)
5151 || self.peek_keyword(Keyword::VIEW)
5152 || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5153 || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5154 {
5155 self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5156 .map(Into::into)
5157 } else if self.parse_keyword(Keyword::POLICY) {
5158 self.parse_create_policy().map(Into::into)
5159 } else if self.parse_keyword(Keyword::EXTERNAL) {
5160 self.parse_create_external_table(or_replace).map(Into::into)
5161 } else if self.parse_keyword(Keyword::FUNCTION) {
5162 self.parse_create_function(or_alter, or_replace, temporary)
5163 } else if self.parse_keyword(Keyword::DOMAIN) {
5164 self.parse_create_domain().map(Into::into)
5165 } else if self.parse_keyword(Keyword::TRIGGER) {
5166 self.parse_create_trigger(temporary, or_alter, or_replace, false)
5167 .map(Into::into)
5168 } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5169 self.parse_create_trigger(temporary, or_alter, or_replace, true)
5170 .map(Into::into)
5171 } else if self.parse_keyword(Keyword::MACRO) {
5172 self.parse_create_macro(or_replace, temporary)
5173 } else if self.parse_keyword(Keyword::SECRET) {
5174 self.parse_create_secret(or_replace, temporary, persistent)
5175 } else if self.parse_keyword(Keyword::USER) {
5176 self.parse_create_user(or_replace).map(Into::into)
5177 } else if or_replace {
5178 self.expected_ref(
5179 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
5180 self.peek_token_ref(),
5181 )
5182 } else if self.parse_keyword(Keyword::EXTENSION) {
5183 self.parse_create_extension().map(Into::into)
5184 } else if self.parse_keyword(Keyword::INDEX) {
5185 self.parse_create_index(false).map(Into::into)
5186 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5187 self.parse_create_index(true).map(Into::into)
5188 } else if self.parse_keyword(Keyword::VIRTUAL) {
5189 self.parse_create_virtual_table()
5190 } else if self.parse_keyword(Keyword::SCHEMA) {
5191 self.parse_create_schema()
5192 } else if self.parse_keyword(Keyword::DATABASE) {
5193 self.parse_create_database()
5194 } else if self.parse_keyword(Keyword::ROLE) {
5195 self.parse_create_role().map(Into::into)
5196 } else if self.parse_keyword(Keyword::SEQUENCE) {
5197 self.parse_create_sequence(temporary)
5198 } else if self.parse_keyword(Keyword::COLLATION) {
5199 self.parse_create_collation().map(Into::into)
5200 } else if self.parse_keyword(Keyword::TYPE) {
5201 self.parse_create_type()
5202 } else if self.parse_keyword(Keyword::PROCEDURE) {
5203 self.parse_create_procedure(or_alter)
5204 } else if self.parse_keyword(Keyword::CONNECTOR) {
5205 self.parse_create_connector().map(Into::into)
5206 } else if self.parse_keyword(Keyword::OPERATOR) {
5207 if self.parse_keyword(Keyword::FAMILY) {
5209 self.parse_create_operator_family().map(Into::into)
5210 } else if self.parse_keyword(Keyword::CLASS) {
5211 self.parse_create_operator_class().map(Into::into)
5212 } else {
5213 self.parse_create_operator().map(Into::into)
5214 }
5215 } else if self.parse_keyword(Keyword::SERVER) {
5216 self.parse_pg_create_server()
5217 } else {
5218 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5219 }
5220 }
5221
5222 fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5223 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5224 let name = self.parse_identifier()?;
5225 let options = self
5226 .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5227 .options;
5228 let with_tags = self.parse_keyword(Keyword::WITH);
5229 let tags = if self.parse_keyword(Keyword::TAG) {
5230 self.parse_key_value_options(true, &[])?.options
5231 } else {
5232 vec![]
5233 };
5234 Ok(CreateUser {
5235 or_replace,
5236 if_not_exists,
5237 name,
5238 options: KeyValueOptions {
5239 options,
5240 delimiter: KeyValueOptionsDelimiter::Space,
5241 },
5242 with_tags,
5243 tags: KeyValueOptions {
5244 options: tags,
5245 delimiter: KeyValueOptionsDelimiter::Comma,
5246 },
5247 })
5248 }
5249
5250 pub fn parse_create_secret(
5252 &mut self,
5253 or_replace: bool,
5254 temporary: bool,
5255 persistent: bool,
5256 ) -> Result<Statement, ParserError> {
5257 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5258
5259 let mut storage_specifier = None;
5260 let mut name = None;
5261 if self.peek_token_ref().token != Token::LParen {
5262 if self.parse_keyword(Keyword::IN) {
5263 storage_specifier = self.parse_identifier().ok()
5264 } else {
5265 name = self.parse_identifier().ok();
5266 }
5267
5268 if storage_specifier.is_none()
5270 && self.peek_token_ref().token != Token::LParen
5271 && self.parse_keyword(Keyword::IN)
5272 {
5273 storage_specifier = self.parse_identifier().ok();
5274 }
5275 }
5276
5277 self.expect_token(&Token::LParen)?;
5278 self.expect_keyword_is(Keyword::TYPE)?;
5279 let secret_type = self.parse_identifier()?;
5280
5281 let mut options = Vec::new();
5282 if self.consume_token(&Token::Comma) {
5283 options.append(&mut self.parse_comma_separated(|p| {
5284 let key = p.parse_identifier()?;
5285 let value = p.parse_identifier()?;
5286 Ok(SecretOption { key, value })
5287 })?);
5288 }
5289 self.expect_token(&Token::RParen)?;
5290
5291 let temp = match (temporary, persistent) {
5292 (true, false) => Some(true),
5293 (false, true) => Some(false),
5294 (false, false) => None,
5295 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5296 };
5297
5298 Ok(Statement::CreateSecret {
5299 or_replace,
5300 temporary: temp,
5301 if_not_exists,
5302 name,
5303 storage_specifier,
5304 secret_type,
5305 options,
5306 })
5307 }
5308
5309 pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5311 let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5312 if self.parse_keyword(Keyword::TABLE) {
5313 let table_name = self.parse_object_name(false)?;
5314 if self.peek_token_ref().token != Token::EOF {
5315 if let Token::Word(word) = &self.peek_token_ref().token {
5316 if word.keyword == Keyword::OPTIONS {
5317 options = self.parse_options(Keyword::OPTIONS)?
5318 }
5319 };
5320
5321 if self.peek_token_ref().token != Token::EOF {
5322 let (a, q) = self.parse_as_query()?;
5323 has_as = a;
5324 query = Some(q);
5325 }
5326
5327 Ok(Statement::Cache {
5328 table_flag,
5329 table_name,
5330 has_as,
5331 options,
5332 query,
5333 })
5334 } else {
5335 Ok(Statement::Cache {
5336 table_flag,
5337 table_name,
5338 has_as,
5339 options,
5340 query,
5341 })
5342 }
5343 } else {
5344 table_flag = Some(self.parse_object_name(false)?);
5345 if self.parse_keyword(Keyword::TABLE) {
5346 let table_name = self.parse_object_name(false)?;
5347 if self.peek_token_ref().token != Token::EOF {
5348 if let Token::Word(word) = &self.peek_token_ref().token {
5349 if word.keyword == Keyword::OPTIONS {
5350 options = self.parse_options(Keyword::OPTIONS)?
5351 }
5352 };
5353
5354 if self.peek_token_ref().token != Token::EOF {
5355 let (a, q) = self.parse_as_query()?;
5356 has_as = a;
5357 query = Some(q);
5358 }
5359
5360 Ok(Statement::Cache {
5361 table_flag,
5362 table_name,
5363 has_as,
5364 options,
5365 query,
5366 })
5367 } else {
5368 Ok(Statement::Cache {
5369 table_flag,
5370 table_name,
5371 has_as,
5372 options,
5373 query,
5374 })
5375 }
5376 } else {
5377 if self.peek_token_ref().token == Token::EOF {
5378 self.prev_token();
5379 }
5380 self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5381 }
5382 }
5383 }
5384
5385 pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5387 match &self.peek_token_ref().token {
5388 Token::Word(word) => match word.keyword {
5389 Keyword::AS => {
5390 self.next_token();
5391 Ok((true, self.parse_query()?))
5392 }
5393 _ => Ok((false, self.parse_query()?)),
5394 },
5395 _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5396 }
5397 }
5398
5399 pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5401 self.expect_keyword_is(Keyword::TABLE)?;
5402 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5403 let table_name = self.parse_object_name(false)?;
5404 Ok(Statement::UNCache {
5405 table_name,
5406 if_exists,
5407 })
5408 }
5409
5410 pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5412 self.expect_keyword_is(Keyword::TABLE)?;
5413 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5414 let table_name = self.parse_object_name(false)?;
5415 self.expect_keyword_is(Keyword::USING)?;
5416 let module_name = self.parse_identifier()?;
5417 let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5422 Ok(Statement::CreateVirtualTable {
5423 name: table_name,
5424 if_not_exists,
5425 module_name,
5426 module_args,
5427 })
5428 }
5429
5430 pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
5432 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5433
5434 let schema_name = self.parse_schema_name()?;
5435
5436 let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5437 Some(self.parse_expr()?)
5438 } else {
5439 None
5440 };
5441
5442 let with = if self.peek_keyword(Keyword::WITH) {
5443 Some(self.parse_options(Keyword::WITH)?)
5444 } else {
5445 None
5446 };
5447
5448 let options = if self.peek_keyword(Keyword::OPTIONS) {
5449 Some(self.parse_options(Keyword::OPTIONS)?)
5450 } else {
5451 None
5452 };
5453
5454 let clone = if self.parse_keyword(Keyword::CLONE) {
5455 Some(self.parse_object_name(false)?)
5456 } else {
5457 None
5458 };
5459
5460 Ok(Statement::CreateSchema {
5461 schema_name,
5462 if_not_exists,
5463 with,
5464 options,
5465 default_collate_spec,
5466 clone,
5467 })
5468 }
5469
5470 fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5471 if self.parse_keyword(Keyword::AUTHORIZATION) {
5472 Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5473 } else {
5474 let name = self.parse_object_name(false)?;
5475
5476 if self.parse_keyword(Keyword::AUTHORIZATION) {
5477 Ok(SchemaName::NamedAuthorization(
5478 name,
5479 self.parse_identifier()?,
5480 ))
5481 } else {
5482 Ok(SchemaName::Simple(name))
5483 }
5484 }
5485 }
5486
5487 pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5489 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5490 let db_name = self.parse_object_name(false)?;
5491 let mut location = None;
5492 let mut managed_location = None;
5493 loop {
5494 match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5495 Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5496 Some(Keyword::MANAGEDLOCATION) => {
5497 managed_location = Some(self.parse_literal_string()?)
5498 }
5499 _ => break,
5500 }
5501 }
5502 let clone = if self.parse_keyword(Keyword::CLONE) {
5503 Some(self.parse_object_name(false)?)
5504 } else {
5505 None
5506 };
5507
5508 let mut default_charset = None;
5516 let mut default_collation = None;
5517 loop {
5518 let has_default = self.parse_keyword(Keyword::DEFAULT);
5519 if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5520 || self.parse_keyword(Keyword::CHARSET)
5521 {
5522 let _ = self.consume_token(&Token::Eq);
5523 default_charset = Some(self.parse_identifier()?.value);
5524 } else if self.parse_keyword(Keyword::COLLATE) {
5525 let _ = self.consume_token(&Token::Eq);
5526 default_collation = Some(self.parse_identifier()?.value);
5527 } else if has_default {
5528 self.prev_token();
5530 break;
5531 } else {
5532 break;
5533 }
5534 }
5535
5536 Ok(Statement::CreateDatabase {
5537 db_name,
5538 if_not_exists: ine,
5539 location,
5540 managed_location,
5541 or_replace: false,
5542 transient: false,
5543 clone,
5544 data_retention_time_in_days: None,
5545 max_data_extension_time_in_days: None,
5546 external_volume: None,
5547 catalog: None,
5548 replace_invalid_characters: None,
5549 default_ddl_collation: None,
5550 storage_serialization_policy: None,
5551 comment: None,
5552 default_charset,
5553 default_collation,
5554 catalog_sync: None,
5555 catalog_sync_namespace_mode: None,
5556 catalog_sync_namespace_flatten_delimiter: None,
5557 with_tags: None,
5558 with_contacts: None,
5559 })
5560 }
5561
5562 pub fn parse_optional_create_function_using(
5564 &mut self,
5565 ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5566 if !self.parse_keyword(Keyword::USING) {
5567 return Ok(None);
5568 };
5569 let keyword =
5570 self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5571
5572 let uri = self.parse_literal_string()?;
5573
5574 match keyword {
5575 Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5576 Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5577 Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5578 _ => self.expected(
5579 "JAR, FILE or ARCHIVE, got {:?}",
5580 TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5581 ),
5582 }
5583 }
5584
5585 pub fn parse_create_function(
5587 &mut self,
5588 or_alter: bool,
5589 or_replace: bool,
5590 temporary: bool,
5591 ) -> Result<Statement, ParserError> {
5592 if dialect_of!(self is HiveDialect) {
5593 self.parse_hive_create_function(or_replace, temporary)
5594 .map(Into::into)
5595 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5596 self.parse_postgres_create_function(or_replace, temporary)
5597 .map(Into::into)
5598 } else if dialect_of!(self is DuckDbDialect) {
5599 self.parse_create_macro(or_replace, temporary)
5600 } else if dialect_of!(self is BigQueryDialect) {
5601 self.parse_bigquery_create_function(or_replace, temporary)
5602 .map(Into::into)
5603 } else if dialect_of!(self is MsSqlDialect) {
5604 self.parse_mssql_create_function(or_alter, or_replace, temporary)
5605 .map(Into::into)
5606 } else {
5607 self.prev_token();
5608 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5609 }
5610 }
5611
5612 fn parse_postgres_create_function(
5616 &mut self,
5617 or_replace: bool,
5618 temporary: bool,
5619 ) -> Result<CreateFunction, ParserError> {
5620 let name = self.parse_object_name(false)?;
5621
5622 self.expect_token(&Token::LParen)?;
5623 let args = if Token::RParen != self.peek_token_ref().token {
5624 self.parse_comma_separated(Parser::parse_function_arg)?
5625 } else {
5626 vec![]
5627 };
5628 self.expect_token(&Token::RParen)?;
5629
5630 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5631 Some(self.parse_function_return_type()?)
5632 } else {
5633 None
5634 };
5635
5636 #[derive(Default)]
5637 struct Body {
5638 language: Option<Ident>,
5639 behavior: Option<FunctionBehavior>,
5640 function_body: Option<CreateFunctionBody>,
5641 called_on_null: Option<FunctionCalledOnNull>,
5642 parallel: Option<FunctionParallel>,
5643 security: Option<FunctionSecurity>,
5644 }
5645 let mut body = Body::default();
5646 let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5647 loop {
5648 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5649 if field.is_some() {
5650 return Err(ParserError::ParserError(format!(
5651 "{name} specified more than once",
5652 )));
5653 }
5654 Ok(())
5655 }
5656 if self.parse_keyword(Keyword::AS) {
5657 ensure_not_set(&body.function_body, "AS")?;
5658 body.function_body = Some(self.parse_create_function_body_string()?);
5659 } else if self.parse_keyword(Keyword::LANGUAGE) {
5660 ensure_not_set(&body.language, "LANGUAGE")?;
5661 body.language = Some(self.parse_identifier()?);
5662 } else if self.parse_keyword(Keyword::IMMUTABLE) {
5663 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5664 body.behavior = Some(FunctionBehavior::Immutable);
5665 } else if self.parse_keyword(Keyword::STABLE) {
5666 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5667 body.behavior = Some(FunctionBehavior::Stable);
5668 } else if self.parse_keyword(Keyword::VOLATILE) {
5669 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5670 body.behavior = Some(FunctionBehavior::Volatile);
5671 } else if self.parse_keywords(&[
5672 Keyword::CALLED,
5673 Keyword::ON,
5674 Keyword::NULL,
5675 Keyword::INPUT,
5676 ]) {
5677 ensure_not_set(
5678 &body.called_on_null,
5679 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5680 )?;
5681 body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5682 } else if self.parse_keywords(&[
5683 Keyword::RETURNS,
5684 Keyword::NULL,
5685 Keyword::ON,
5686 Keyword::NULL,
5687 Keyword::INPUT,
5688 ]) {
5689 ensure_not_set(
5690 &body.called_on_null,
5691 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5692 )?;
5693 body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5694 } else if self.parse_keyword(Keyword::STRICT) {
5695 ensure_not_set(
5696 &body.called_on_null,
5697 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5698 )?;
5699 body.called_on_null = Some(FunctionCalledOnNull::Strict);
5700 } else if self.parse_keyword(Keyword::PARALLEL) {
5701 ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5702 if self.parse_keyword(Keyword::UNSAFE) {
5703 body.parallel = Some(FunctionParallel::Unsafe);
5704 } else if self.parse_keyword(Keyword::RESTRICTED) {
5705 body.parallel = Some(FunctionParallel::Restricted);
5706 } else if self.parse_keyword(Keyword::SAFE) {
5707 body.parallel = Some(FunctionParallel::Safe);
5708 } else {
5709 return self
5710 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5711 }
5712 } else if self.parse_keyword(Keyword::SECURITY) {
5713 ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5714 if self.parse_keyword(Keyword::DEFINER) {
5715 body.security = Some(FunctionSecurity::Definer);
5716 } else if self.parse_keyword(Keyword::INVOKER) {
5717 body.security = Some(FunctionSecurity::Invoker);
5718 } else {
5719 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5720 }
5721 } else if self.parse_keyword(Keyword::SET) {
5722 let name = self.parse_object_name(false)?;
5723 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5724 FunctionSetValue::FromCurrent
5725 } else {
5726 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5727 return self.expected_ref("= or TO", self.peek_token_ref());
5728 }
5729 if self.parse_keyword(Keyword::DEFAULT) {
5730 FunctionSetValue::Default
5731 } else {
5732 let values = self.parse_comma_separated(Parser::parse_expr)?;
5733 FunctionSetValue::Values(values)
5734 }
5735 };
5736 set_params.push(FunctionDefinitionSetParam { name, value });
5737 } else if self.parse_keyword(Keyword::RETURN) {
5738 ensure_not_set(&body.function_body, "RETURN")?;
5739 body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5740 } else {
5741 break;
5742 }
5743 }
5744
5745 Ok(CreateFunction {
5746 or_alter: false,
5747 or_replace,
5748 temporary,
5749 name,
5750 args: Some(args),
5751 return_type,
5752 behavior: body.behavior,
5753 called_on_null: body.called_on_null,
5754 parallel: body.parallel,
5755 security: body.security,
5756 set_params,
5757 language: body.language,
5758 function_body: body.function_body,
5759 if_not_exists: false,
5760 using: None,
5761 determinism_specifier: None,
5762 options: None,
5763 remote_connection: None,
5764 })
5765 }
5766
5767 fn parse_hive_create_function(
5771 &mut self,
5772 or_replace: bool,
5773 temporary: bool,
5774 ) -> Result<CreateFunction, ParserError> {
5775 let name = self.parse_object_name(false)?;
5776 self.expect_keyword_is(Keyword::AS)?;
5777
5778 let body = self.parse_create_function_body_string()?;
5779 let using = self.parse_optional_create_function_using()?;
5780
5781 Ok(CreateFunction {
5782 or_alter: false,
5783 or_replace,
5784 temporary,
5785 name,
5786 function_body: Some(body),
5787 using,
5788 if_not_exists: false,
5789 args: None,
5790 return_type: None,
5791 behavior: None,
5792 called_on_null: None,
5793 parallel: None,
5794 security: None,
5795 set_params: vec![],
5796 language: None,
5797 determinism_specifier: None,
5798 options: None,
5799 remote_connection: None,
5800 })
5801 }
5802
5803 fn parse_bigquery_create_function(
5807 &mut self,
5808 or_replace: bool,
5809 temporary: bool,
5810 ) -> Result<CreateFunction, ParserError> {
5811 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5812 let (name, args) = self.parse_create_function_name_and_params()?;
5813
5814 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5815 Some(self.parse_function_return_type()?)
5816 } else {
5817 None
5818 };
5819
5820 let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
5821 Some(FunctionDeterminismSpecifier::Deterministic)
5822 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
5823 Some(FunctionDeterminismSpecifier::NotDeterministic)
5824 } else {
5825 None
5826 };
5827
5828 let language = if self.parse_keyword(Keyword::LANGUAGE) {
5829 Some(self.parse_identifier()?)
5830 } else {
5831 None
5832 };
5833
5834 let remote_connection =
5835 if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
5836 Some(self.parse_object_name(false)?)
5837 } else {
5838 None
5839 };
5840
5841 let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
5844
5845 let function_body = if remote_connection.is_none() {
5846 self.expect_keyword_is(Keyword::AS)?;
5847 let expr = self.parse_expr()?;
5848 if options.is_none() {
5849 options = self.maybe_parse_options(Keyword::OPTIONS)?;
5850 Some(CreateFunctionBody::AsBeforeOptions {
5851 body: expr,
5852 link_symbol: None,
5853 })
5854 } else {
5855 Some(CreateFunctionBody::AsAfterOptions(expr))
5856 }
5857 } else {
5858 None
5859 };
5860
5861 Ok(CreateFunction {
5862 or_alter: false,
5863 or_replace,
5864 temporary,
5865 if_not_exists,
5866 name,
5867 args: Some(args),
5868 return_type,
5869 function_body,
5870 language,
5871 determinism_specifier,
5872 options,
5873 remote_connection,
5874 using: None,
5875 behavior: None,
5876 called_on_null: None,
5877 parallel: None,
5878 security: None,
5879 set_params: vec![],
5880 })
5881 }
5882
5883 fn parse_mssql_create_function(
5887 &mut self,
5888 or_alter: bool,
5889 or_replace: bool,
5890 temporary: bool,
5891 ) -> Result<CreateFunction, ParserError> {
5892 let (name, args) = self.parse_create_function_name_and_params()?;
5893
5894 self.expect_keyword(Keyword::RETURNS)?;
5895
5896 let return_table = self.maybe_parse(|p| {
5897 let return_table_name = p.parse_identifier()?;
5898
5899 p.expect_keyword_is(Keyword::TABLE)?;
5900 p.prev_token();
5901
5902 let table_column_defs = match p.parse_data_type()? {
5903 DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5904 table_column_defs
5905 }
5906 _ => parser_err!(
5907 "Expected table column definitions after TABLE keyword",
5908 p.peek_token_ref().span.start
5909 )?,
5910 };
5911
5912 Ok(DataType::NamedTable {
5913 name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5914 columns: table_column_defs,
5915 })
5916 })?;
5917
5918 let data_type = match return_table {
5919 Some(table_type) => table_type,
5920 None => self.parse_data_type()?,
5921 };
5922 let return_type = Some(FunctionReturnType::DataType(data_type));
5923
5924 let _ = self.parse_keyword(Keyword::AS);
5925
5926 let function_body = if self.peek_keyword(Keyword::BEGIN) {
5927 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5928 let statements = self.parse_statement_list(&[Keyword::END])?;
5929 let end_token = self.expect_keyword(Keyword::END)?;
5930
5931 Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
5932 begin_token: AttachedToken(begin_token),
5933 statements,
5934 end_token: AttachedToken(end_token),
5935 }))
5936 } else if self.parse_keyword(Keyword::RETURN) {
5937 if self.peek_token_ref().token == Token::LParen {
5938 Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
5939 } else if self.peek_keyword(Keyword::SELECT) {
5940 let select = self.parse_select()?;
5941 Some(CreateFunctionBody::AsReturnSelect(select))
5942 } else {
5943 parser_err!(
5944 "Expected a subquery (or bare SELECT statement) after RETURN",
5945 self.peek_token_ref().span.start
5946 )?
5947 }
5948 } else {
5949 parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
5950 };
5951
5952 Ok(CreateFunction {
5953 or_alter,
5954 or_replace,
5955 temporary,
5956 if_not_exists: false,
5957 name,
5958 args: Some(args),
5959 return_type,
5960 function_body,
5961 language: None,
5962 determinism_specifier: None,
5963 options: None,
5964 remote_connection: None,
5965 using: None,
5966 behavior: None,
5967 called_on_null: None,
5968 parallel: None,
5969 security: None,
5970 set_params: vec![],
5971 })
5972 }
5973
5974 fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
5975 if self.parse_keyword(Keyword::SETOF) {
5976 Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
5977 } else {
5978 Ok(FunctionReturnType::DataType(self.parse_data_type()?))
5979 }
5980 }
5981
5982 fn parse_create_function_name_and_params(
5983 &mut self,
5984 ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
5985 let name = self.parse_object_name(false)?;
5986 let parse_function_param =
5987 |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
5988 let name = parser.parse_identifier()?;
5989 let data_type = parser.parse_data_type()?;
5990 let default_expr = if parser.consume_token(&Token::Eq) {
5991 Some(parser.parse_expr()?)
5992 } else {
5993 None
5994 };
5995
5996 Ok(OperateFunctionArg {
5997 mode: None,
5998 name: Some(name),
5999 data_type,
6000 default_expr,
6001 })
6002 };
6003 self.expect_token(&Token::LParen)?;
6004 let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6005 self.expect_token(&Token::RParen)?;
6006 Ok((name, args))
6007 }
6008
6009 fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6010 let mode = if self.parse_keyword(Keyword::IN) {
6011 Some(ArgMode::In)
6012 } else if self.parse_keyword(Keyword::OUT) {
6013 Some(ArgMode::Out)
6014 } else if self.parse_keyword(Keyword::INOUT) {
6015 Some(ArgMode::InOut)
6016 } else if self.parse_keyword(Keyword::VARIADIC) {
6017 Some(ArgMode::Variadic)
6018 } else {
6019 None
6020 };
6021
6022 let mut name = None;
6024 let mut data_type = self.parse_data_type()?;
6025
6026 let data_type_idx = self.get_current_index();
6030
6031 fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6033 if parser.peek_keyword(Keyword::DEFAULT) {
6034 parser_err!(
6036 "The DEFAULT keyword is not a type",
6037 parser.peek_token_ref().span.start
6038 )
6039 } else {
6040 parser.parse_data_type()
6041 }
6042 }
6043
6044 if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6045 let token = self.token_at(data_type_idx);
6046
6047 if !matches!(token.token, Token::Word(_)) {
6049 return self.expected("a name or type", token.clone());
6050 }
6051
6052 name = Some(Ident::new(token.to_string()));
6053 data_type = next_data_type;
6054 }
6055
6056 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6057 {
6058 Some(self.parse_expr()?)
6059 } else {
6060 None
6061 };
6062 Ok(OperateFunctionArg {
6063 mode,
6064 name,
6065 data_type,
6066 default_expr,
6067 })
6068 }
6069
6070 fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6071 let mode = if self.parse_keyword(Keyword::IN) {
6072 Some(ArgMode::In)
6073 } else {
6074 if self
6075 .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6076 .is_some()
6077 {
6078 return self.expected_ref(
6079 "IN or argument type in aggregate signature",
6080 self.peek_token_ref(),
6081 );
6082 }
6083 None
6084 };
6085
6086 let mut name = None;
6089 let mut data_type = self.parse_data_type()?;
6090 let data_type_idx = self.get_current_index();
6091
6092 fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6093 if parser.peek_keyword(Keyword::DEFAULT)
6094 || parser.peek_keyword(Keyword::ORDER)
6095 || parser.peek_token_ref().token == Token::Comma
6096 || parser.peek_token_ref().token == Token::RParen
6097 {
6098 parser_err!(
6100 "The current token cannot start an aggregate argument type",
6101 parser.peek_token_ref().span.start
6102 )
6103 } else {
6104 parser.parse_data_type()
6105 }
6106 }
6107
6108 if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6109 let token = self.token_at(data_type_idx);
6110 if !matches!(token.token, Token::Word(_)) {
6111 return self.expected("a name or type", token.clone());
6112 }
6113
6114 name = Some(Ident::new(token.to_string()));
6115 data_type = next_data_type;
6116 }
6117
6118 if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6119 return self.expected_ref(
6120 "',' or ')' or ORDER BY after aggregate argument type",
6121 self.peek_token_ref(),
6122 );
6123 }
6124
6125 Ok(OperateFunctionArg {
6126 mode,
6127 name,
6128 data_type,
6129 default_expr: None,
6130 })
6131 }
6132
6133 pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6139 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6140 {
6141 self.prev_token();
6142 return self.expected_ref("an object type after DROP", self.peek_token_ref());
6143 }
6144 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6145 let trigger_name = self.parse_object_name(false)?;
6146 let table_name = if self.parse_keyword(Keyword::ON) {
6147 Some(self.parse_object_name(false)?)
6148 } else {
6149 None
6150 };
6151 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6152 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6153 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6154 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6155 format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6156 )),
6157 None => None,
6158 };
6159 Ok(DropTrigger {
6160 if_exists,
6161 trigger_name,
6162 table_name,
6163 option,
6164 })
6165 }
6166
6167 pub fn parse_create_trigger(
6169 &mut self,
6170 temporary: bool,
6171 or_alter: bool,
6172 or_replace: bool,
6173 is_constraint: bool,
6174 ) -> Result<CreateTrigger, ParserError> {
6175 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6176 {
6177 self.prev_token();
6178 return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6179 }
6180
6181 let name = self.parse_object_name(false)?;
6182 let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6183
6184 let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6185 self.expect_keyword_is(Keyword::ON)?;
6186 let table_name = self.parse_object_name(false)?;
6187
6188 let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6189 self.parse_object_name(true).ok()
6190 } else {
6191 None
6192 };
6193
6194 let characteristics = self.parse_constraint_characteristics()?;
6195
6196 let mut referencing = vec![];
6197 if self.parse_keyword(Keyword::REFERENCING) {
6198 while let Some(refer) = self.parse_trigger_referencing()? {
6199 referencing.push(refer);
6200 }
6201 }
6202
6203 let trigger_object = if self.parse_keyword(Keyword::FOR) {
6204 let include_each = self.parse_keyword(Keyword::EACH);
6205 let trigger_object =
6206 match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6207 Keyword::ROW => TriggerObject::Row,
6208 Keyword::STATEMENT => TriggerObject::Statement,
6209 unexpected_keyword => return Err(ParserError::ParserError(
6210 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6211 )),
6212 };
6213
6214 Some(if include_each {
6215 TriggerObjectKind::ForEach(trigger_object)
6216 } else {
6217 TriggerObjectKind::For(trigger_object)
6218 })
6219 } else {
6220 let _ = self.parse_keyword(Keyword::FOR);
6221
6222 None
6223 };
6224
6225 let condition = self
6226 .parse_keyword(Keyword::WHEN)
6227 .then(|| self.parse_expr())
6228 .transpose()?;
6229
6230 let mut exec_body = None;
6231 let mut statements = None;
6232 if self.parse_keyword(Keyword::EXECUTE) {
6233 exec_body = Some(self.parse_trigger_exec_body()?);
6234 } else {
6235 statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6236 }
6237
6238 Ok(CreateTrigger {
6239 or_alter,
6240 temporary,
6241 or_replace,
6242 is_constraint,
6243 name,
6244 period,
6245 period_before_table: true,
6246 events,
6247 table_name,
6248 referenced_table_name,
6249 referencing,
6250 trigger_object,
6251 condition,
6252 exec_body,
6253 statements_as: false,
6254 statements,
6255 characteristics,
6256 })
6257 }
6258
6259 pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6261 Ok(
6262 match self.expect_one_of_keywords(&[
6263 Keyword::FOR,
6264 Keyword::BEFORE,
6265 Keyword::AFTER,
6266 Keyword::INSTEAD,
6267 ])? {
6268 Keyword::FOR => TriggerPeriod::For,
6269 Keyword::BEFORE => TriggerPeriod::Before,
6270 Keyword::AFTER => TriggerPeriod::After,
6271 Keyword::INSTEAD => self
6272 .expect_keyword_is(Keyword::OF)
6273 .map(|_| TriggerPeriod::InsteadOf)?,
6274 unexpected_keyword => return Err(ParserError::ParserError(
6275 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6276 )),
6277 },
6278 )
6279 }
6280
6281 pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6283 Ok(
6284 match self.expect_one_of_keywords(&[
6285 Keyword::INSERT,
6286 Keyword::UPDATE,
6287 Keyword::DELETE,
6288 Keyword::TRUNCATE,
6289 ])? {
6290 Keyword::INSERT => TriggerEvent::Insert,
6291 Keyword::UPDATE => {
6292 if self.parse_keyword(Keyword::OF) {
6293 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6294 TriggerEvent::Update(cols)
6295 } else {
6296 TriggerEvent::Update(vec![])
6297 }
6298 }
6299 Keyword::DELETE => TriggerEvent::Delete,
6300 Keyword::TRUNCATE => TriggerEvent::Truncate,
6301 unexpected_keyword => return Err(ParserError::ParserError(
6302 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6303 )),
6304 },
6305 )
6306 }
6307
6308 pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6310 let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6311 Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6312 TriggerReferencingType::OldTable
6313 }
6314 Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6315 TriggerReferencingType::NewTable
6316 }
6317 _ => {
6318 return Ok(None);
6319 }
6320 };
6321
6322 let is_as = self.parse_keyword(Keyword::AS);
6323 let transition_relation_name = self.parse_object_name(false)?;
6324 Ok(Some(TriggerReferencing {
6325 refer_type,
6326 is_as,
6327 transition_relation_name,
6328 }))
6329 }
6330
6331 pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6333 Ok(TriggerExecBody {
6334 exec_type: match self
6335 .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6336 {
6337 Keyword::FUNCTION => TriggerExecBodyType::Function,
6338 Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6339 unexpected_keyword => return Err(ParserError::ParserError(
6340 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6341 )),
6342 },
6343 func_desc: self.parse_function_desc()?,
6344 })
6345 }
6346
6347 pub fn parse_create_macro(
6349 &mut self,
6350 or_replace: bool,
6351 temporary: bool,
6352 ) -> Result<Statement, ParserError> {
6353 if dialect_of!(self is DuckDbDialect | GenericDialect) {
6354 let name = self.parse_object_name(false)?;
6355 self.expect_token(&Token::LParen)?;
6356 let args = if self.consume_token(&Token::RParen) {
6357 self.prev_token();
6358 None
6359 } else {
6360 Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6361 };
6362
6363 self.expect_token(&Token::RParen)?;
6364 self.expect_keyword_is(Keyword::AS)?;
6365
6366 Ok(Statement::CreateMacro {
6367 or_replace,
6368 temporary,
6369 name,
6370 args,
6371 definition: if self.parse_keyword(Keyword::TABLE) {
6372 MacroDefinition::Table(self.parse_query()?)
6373 } else {
6374 MacroDefinition::Expr(self.parse_expr()?)
6375 },
6376 })
6377 } else {
6378 self.prev_token();
6379 self.expected_ref("an object type after CREATE", self.peek_token_ref())
6380 }
6381 }
6382
6383 fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6384 let name = self.parse_identifier()?;
6385
6386 let default_expr =
6387 if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6388 Some(self.parse_expr()?)
6389 } else {
6390 None
6391 };
6392 Ok(MacroArg { name, default_expr })
6393 }
6394
6395 pub fn parse_create_external_table(
6397 &mut self,
6398 or_replace: bool,
6399 ) -> Result<CreateTable, ParserError> {
6400 self.expect_keyword_is(Keyword::TABLE)?;
6401 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6402 let table_name = self.parse_object_name(false)?;
6403 let (columns, constraints) = self.parse_columns()?;
6404
6405 let hive_distribution = self.parse_hive_distribution()?;
6406 let hive_formats = self.parse_hive_formats()?;
6407
6408 let file_format = if let Some(ref hf) = hive_formats {
6409 if let Some(ref ff) = hf.storage {
6410 match ff {
6411 HiveIOFormat::FileFormat { format } => Some(*format),
6412 _ => None,
6413 }
6414 } else {
6415 None
6416 }
6417 } else {
6418 None
6419 };
6420 let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6421
6422 let with_connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
6423 Some(self.parse_object_name(false)?)
6424 } else {
6425 None
6426 };
6427 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6428 let table_options = if !table_properties.is_empty() {
6429 CreateTableOptions::TableProperties(table_properties)
6430 } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6431 CreateTableOptions::Options(options)
6432 } else {
6433 CreateTableOptions::None
6434 };
6435 Ok(CreateTableBuilder::new(table_name)
6436 .columns(columns)
6437 .constraints(constraints)
6438 .hive_distribution(hive_distribution)
6439 .hive_formats(hive_formats)
6440 .table_options(table_options)
6441 .with_connection(with_connection)
6442 .or_replace(or_replace)
6443 .if_not_exists(if_not_exists)
6444 .external(true)
6445 .file_format(file_format)
6446 .location(location)
6447 .build())
6448 }
6449
6450 pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6454 self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6455 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6456 let table_name = self.parse_object_name(true)?;
6457
6458 self.expect_keyword_is(Keyword::CLONE)?;
6459 let clone = Some(self.parse_object_name(true)?);
6460
6461 let version =
6462 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6463 {
6464 Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6465 } else {
6466 None
6467 };
6468
6469 let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6470 CreateTableOptions::Options(options)
6471 } else {
6472 CreateTableOptions::None
6473 };
6474
6475 Ok(CreateTableBuilder::new(table_name)
6476 .snapshot(true)
6477 .if_not_exists(if_not_exists)
6478 .clone_clause(clone)
6479 .version(version)
6480 .table_options(table_options)
6481 .build())
6482 }
6483
6484 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6486 let next_token = self.next_token();
6487 match &next_token.token {
6488 Token::Word(w) => match w.keyword {
6489 Keyword::AVRO => Ok(FileFormat::AVRO),
6490 Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6491 Keyword::ORC => Ok(FileFormat::ORC),
6492 Keyword::PARQUET => Ok(FileFormat::PARQUET),
6493 Keyword::RCFILE => Ok(FileFormat::RCFILE),
6494 Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6495 Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6496 _ => self.expected("fileformat", next_token),
6497 },
6498 _ => self.expected("fileformat", next_token),
6499 }
6500 }
6501
6502 fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6503 if self.consume_token(&Token::Eq) {
6504 Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6505 } else {
6506 Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6507 }
6508 }
6509
6510 pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6512 let next_token = self.next_token();
6513 match &next_token.token {
6514 Token::Word(w) => match w.keyword {
6515 Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6516 Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6517 Keyword::JSON => Ok(AnalyzeFormat::JSON),
6518 Keyword::TREE => Ok(AnalyzeFormat::TREE),
6519 _ => self.expected("fileformat", next_token),
6520 },
6521 _ => self.expected("fileformat", next_token),
6522 }
6523 }
6524
6525 pub fn parse_create_view(
6527 &mut self,
6528 or_alter: bool,
6529 or_replace: bool,
6530 temporary: bool,
6531 create_view_params: Option<CreateViewParams>,
6532 ) -> Result<CreateView, ParserError> {
6533 let secure = self.parse_keyword(Keyword::SECURE);
6534 let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6535 self.expect_keyword_is(Keyword::VIEW)?;
6536 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6537 let if_not_exists_first =
6540 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6541 let name = self.parse_object_name(allow_unquoted_hyphen)?;
6542 let name_before_not_exists = !if_not_exists_first
6543 && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6544 let if_not_exists = if_not_exists_first || name_before_not_exists;
6545 let mut copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6546 let columns = self.parse_view_columns()?;
6549 if !copy_grants {
6553 copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6554 }
6555 let mut options = CreateTableOptions::None;
6556 let with_options = self.parse_options(Keyword::WITH)?;
6557 if !with_options.is_empty() {
6558 options = CreateTableOptions::With(with_options);
6559 }
6560
6561 let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6562 self.expect_keyword_is(Keyword::BY)?;
6563 self.parse_parenthesized_column_list(Optional, false)?
6564 } else {
6565 vec![]
6566 };
6567
6568 if dialect_of!(self is BigQueryDialect | GenericDialect) {
6569 if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6570 if !opts.is_empty() {
6571 options = CreateTableOptions::Options(opts);
6572 }
6573 };
6574 }
6575
6576 let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6577 && self.parse_keyword(Keyword::TO)
6578 {
6579 Some(self.parse_object_name(false)?)
6580 } else {
6581 None
6582 };
6583
6584 let comment = if self.dialect.supports_create_view_comment_syntax()
6585 && self.parse_keyword(Keyword::COMMENT)
6586 {
6587 self.expect_token(&Token::Eq)?;
6588 Some(self.parse_comment_value()?)
6589 } else {
6590 None
6591 };
6592
6593 self.expect_keyword_is(Keyword::AS)?;
6594 let query = self.parse_query()?;
6595 let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6598 && self.parse_keywords(&[
6599 Keyword::WITH,
6600 Keyword::NO,
6601 Keyword::SCHEMA,
6602 Keyword::BINDING,
6603 ]);
6604
6605 Ok(CreateView {
6606 or_alter,
6607 name,
6608 columns,
6609 query,
6610 materialized,
6611 secure,
6612 or_replace,
6613 options,
6614 cluster_by,
6615 comment,
6616 with_no_schema_binding,
6617 if_not_exists,
6618 temporary,
6619 copy_grants,
6620 to,
6621 params: create_view_params,
6622 name_before_not_exists,
6623 })
6624 }
6625
6626 fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6630 let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6631 self.expect_token(&Token::Eq)?;
6632 Some(
6633 match self.expect_one_of_keywords(&[
6634 Keyword::UNDEFINED,
6635 Keyword::MERGE,
6636 Keyword::TEMPTABLE,
6637 ])? {
6638 Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6639 Keyword::MERGE => CreateViewAlgorithm::Merge,
6640 Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6641 _ => {
6642 self.prev_token();
6643 let found = self.next_token();
6644 return self
6645 .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6646 }
6647 },
6648 )
6649 } else {
6650 None
6651 };
6652 let definer = if self.parse_keyword(Keyword::DEFINER) {
6653 self.expect_token(&Token::Eq)?;
6654 Some(self.parse_grantee_name()?)
6655 } else {
6656 None
6657 };
6658 let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6659 Some(
6660 match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6661 Keyword::DEFINER => CreateViewSecurity::Definer,
6662 Keyword::INVOKER => CreateViewSecurity::Invoker,
6663 _ => {
6664 self.prev_token();
6665 let found = self.next_token();
6666 return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6667 }
6668 },
6669 )
6670 } else {
6671 None
6672 };
6673 if algorithm.is_some() || definer.is_some() || security.is_some() {
6674 Ok(Some(CreateViewParams {
6675 algorithm,
6676 definer,
6677 security,
6678 }))
6679 } else {
6680 Ok(None)
6681 }
6682 }
6683
6684 pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6686 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6687 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6688
6689 let _ = self.parse_keyword(Keyword::WITH); let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6692 vec![Keyword::AUTHORIZATION]
6693 } else if dialect_of!(self is PostgreSqlDialect) {
6694 vec![
6695 Keyword::LOGIN,
6696 Keyword::NOLOGIN,
6697 Keyword::INHERIT,
6698 Keyword::NOINHERIT,
6699 Keyword::BYPASSRLS,
6700 Keyword::NOBYPASSRLS,
6701 Keyword::PASSWORD,
6702 Keyword::CREATEDB,
6703 Keyword::NOCREATEDB,
6704 Keyword::CREATEROLE,
6705 Keyword::NOCREATEROLE,
6706 Keyword::SUPERUSER,
6707 Keyword::NOSUPERUSER,
6708 Keyword::REPLICATION,
6709 Keyword::NOREPLICATION,
6710 Keyword::CONNECTION,
6711 Keyword::VALID,
6712 Keyword::IN,
6713 Keyword::ROLE,
6714 Keyword::ADMIN,
6715 Keyword::USER,
6716 ]
6717 } else {
6718 vec![]
6719 };
6720
6721 let mut authorization_owner = None;
6723 let mut login = None;
6725 let mut inherit = None;
6726 let mut bypassrls = None;
6727 let mut password = None;
6728 let mut create_db = None;
6729 let mut create_role = None;
6730 let mut superuser = None;
6731 let mut replication = None;
6732 let mut connection_limit = None;
6733 let mut valid_until = None;
6734 let mut in_role = vec![];
6735 let mut in_group = vec![];
6736 let mut role = vec![];
6737 let mut user = vec![];
6738 let mut admin = vec![];
6739
6740 while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6741 let loc = self
6742 .tokens
6743 .get(self.index - 1)
6744 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6745 match keyword {
6746 Keyword::AUTHORIZATION => {
6747 if authorization_owner.is_some() {
6748 parser_err!("Found multiple AUTHORIZATION", loc)
6749 } else {
6750 authorization_owner = Some(self.parse_object_name(false)?);
6751 Ok(())
6752 }
6753 }
6754 Keyword::LOGIN | Keyword::NOLOGIN => {
6755 if login.is_some() {
6756 parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6757 } else {
6758 login = Some(keyword == Keyword::LOGIN);
6759 Ok(())
6760 }
6761 }
6762 Keyword::INHERIT | Keyword::NOINHERIT => {
6763 if inherit.is_some() {
6764 parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6765 } else {
6766 inherit = Some(keyword == Keyword::INHERIT);
6767 Ok(())
6768 }
6769 }
6770 Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6771 if bypassrls.is_some() {
6772 parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6773 } else {
6774 bypassrls = Some(keyword == Keyword::BYPASSRLS);
6775 Ok(())
6776 }
6777 }
6778 Keyword::CREATEDB | Keyword::NOCREATEDB => {
6779 if create_db.is_some() {
6780 parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6781 } else {
6782 create_db = Some(keyword == Keyword::CREATEDB);
6783 Ok(())
6784 }
6785 }
6786 Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
6787 if create_role.is_some() {
6788 parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
6789 } else {
6790 create_role = Some(keyword == Keyword::CREATEROLE);
6791 Ok(())
6792 }
6793 }
6794 Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
6795 if superuser.is_some() {
6796 parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
6797 } else {
6798 superuser = Some(keyword == Keyword::SUPERUSER);
6799 Ok(())
6800 }
6801 }
6802 Keyword::REPLICATION | Keyword::NOREPLICATION => {
6803 if replication.is_some() {
6804 parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
6805 } else {
6806 replication = Some(keyword == Keyword::REPLICATION);
6807 Ok(())
6808 }
6809 }
6810 Keyword::PASSWORD => {
6811 if password.is_some() {
6812 parser_err!("Found multiple PASSWORD", loc)
6813 } else {
6814 password = if self.parse_keyword(Keyword::NULL) {
6815 Some(Password::NullPassword)
6816 } else {
6817 Some(Password::Password(Expr::Value(self.parse_value()?)))
6818 };
6819 Ok(())
6820 }
6821 }
6822 Keyword::CONNECTION => {
6823 self.expect_keyword_is(Keyword::LIMIT)?;
6824 if connection_limit.is_some() {
6825 parser_err!("Found multiple CONNECTION LIMIT", loc)
6826 } else {
6827 connection_limit = Some(Expr::Value(self.parse_number_value()?));
6828 Ok(())
6829 }
6830 }
6831 Keyword::VALID => {
6832 self.expect_keyword_is(Keyword::UNTIL)?;
6833 if valid_until.is_some() {
6834 parser_err!("Found multiple VALID UNTIL", loc)
6835 } else {
6836 valid_until = Some(Expr::Value(self.parse_value()?));
6837 Ok(())
6838 }
6839 }
6840 Keyword::IN => {
6841 if self.parse_keyword(Keyword::ROLE) {
6842 if !in_role.is_empty() {
6843 parser_err!("Found multiple IN ROLE", loc)
6844 } else {
6845 in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
6846 Ok(())
6847 }
6848 } else if self.parse_keyword(Keyword::GROUP) {
6849 if !in_group.is_empty() {
6850 parser_err!("Found multiple IN GROUP", loc)
6851 } else {
6852 in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
6853 Ok(())
6854 }
6855 } else {
6856 self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
6857 }
6858 }
6859 Keyword::ROLE => {
6860 if !role.is_empty() {
6861 parser_err!("Found multiple ROLE", loc)
6862 } else {
6863 role = self.parse_comma_separated(|p| p.parse_identifier())?;
6864 Ok(())
6865 }
6866 }
6867 Keyword::USER => {
6868 if !user.is_empty() {
6869 parser_err!("Found multiple USER", loc)
6870 } else {
6871 user = self.parse_comma_separated(|p| p.parse_identifier())?;
6872 Ok(())
6873 }
6874 }
6875 Keyword::ADMIN => {
6876 if !admin.is_empty() {
6877 parser_err!("Found multiple ADMIN", loc)
6878 } else {
6879 admin = self.parse_comma_separated(|p| p.parse_identifier())?;
6880 Ok(())
6881 }
6882 }
6883 _ => break,
6884 }?
6885 }
6886
6887 Ok(CreateRole {
6888 names,
6889 if_not_exists,
6890 login,
6891 inherit,
6892 bypassrls,
6893 password,
6894 create_db,
6895 create_role,
6896 replication,
6897 superuser,
6898 connection_limit,
6899 valid_until,
6900 in_role,
6901 in_group,
6902 role,
6903 user,
6904 admin,
6905 authorization_owner,
6906 })
6907 }
6908
6909 pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
6911 let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
6912 Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
6913 Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
6914 Some(Keyword::SESSION_USER) => Owner::SessionUser,
6915 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6916 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
6917 )),
6918 None => {
6919 match self.parse_identifier() {
6920 Ok(ident) => Owner::Ident(ident),
6921 Err(e) => {
6922 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
6923 }
6924 }
6925 }
6926 };
6927 Ok(owner)
6928 }
6929
6930 fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
6932 let name = self.parse_object_name(false)?;
6933 self.expect_keyword_is(Keyword::AS)?;
6934 let data_type = self.parse_data_type()?;
6935 let collation = if self.parse_keyword(Keyword::COLLATE) {
6936 Some(self.parse_identifier()?)
6937 } else {
6938 None
6939 };
6940 let default = if self.parse_keyword(Keyword::DEFAULT) {
6941 Some(self.parse_expr()?)
6942 } else {
6943 None
6944 };
6945 let mut constraints = Vec::new();
6946 while let Some(constraint) = self.parse_optional_table_constraint()? {
6947 constraints.push(constraint);
6948 }
6949
6950 Ok(CreateDomain {
6951 name,
6952 data_type,
6953 collation,
6954 default,
6955 constraints,
6956 })
6957 }
6958
6959 pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
6969 let name = self.parse_identifier()?;
6970 self.expect_keyword_is(Keyword::ON)?;
6971 let table_name = self.parse_object_name(false)?;
6972
6973 let policy_type = if self.parse_keyword(Keyword::AS) {
6974 let keyword =
6975 self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
6976 Some(match keyword {
6977 Keyword::PERMISSIVE => CreatePolicyType::Permissive,
6978 Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
6979 unexpected_keyword => return Err(ParserError::ParserError(
6980 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
6981 )),
6982 })
6983 } else {
6984 None
6985 };
6986
6987 let command = if self.parse_keyword(Keyword::FOR) {
6988 let keyword = self.expect_one_of_keywords(&[
6989 Keyword::ALL,
6990 Keyword::SELECT,
6991 Keyword::INSERT,
6992 Keyword::UPDATE,
6993 Keyword::DELETE,
6994 ])?;
6995 Some(match keyword {
6996 Keyword::ALL => CreatePolicyCommand::All,
6997 Keyword::SELECT => CreatePolicyCommand::Select,
6998 Keyword::INSERT => CreatePolicyCommand::Insert,
6999 Keyword::UPDATE => CreatePolicyCommand::Update,
7000 Keyword::DELETE => CreatePolicyCommand::Delete,
7001 unexpected_keyword => return Err(ParserError::ParserError(
7002 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7003 )),
7004 })
7005 } else {
7006 None
7007 };
7008
7009 let to = if self.parse_keyword(Keyword::TO) {
7010 Some(self.parse_comma_separated(|p| p.parse_owner())?)
7011 } else {
7012 None
7013 };
7014
7015 let using = if self.parse_keyword(Keyword::USING) {
7016 self.expect_token(&Token::LParen)?;
7017 let expr = self.parse_expr()?;
7018 self.expect_token(&Token::RParen)?;
7019 Some(expr)
7020 } else {
7021 None
7022 };
7023
7024 let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7025 self.expect_token(&Token::LParen)?;
7026 let expr = self.parse_expr()?;
7027 self.expect_token(&Token::RParen)?;
7028 Some(expr)
7029 } else {
7030 None
7031 };
7032
7033 Ok(CreatePolicy {
7034 name,
7035 table_name,
7036 policy_type,
7037 command,
7038 to,
7039 using,
7040 with_check,
7041 })
7042 }
7043
7044 pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7054 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7055 let name = self.parse_identifier()?;
7056
7057 let connector_type = if self.parse_keyword(Keyword::TYPE) {
7058 Some(self.parse_literal_string()?)
7059 } else {
7060 None
7061 };
7062
7063 let url = if self.parse_keyword(Keyword::URL) {
7064 Some(self.parse_literal_string()?)
7065 } else {
7066 None
7067 };
7068
7069 let comment = self.parse_optional_inline_comment()?;
7070
7071 let with_dcproperties =
7072 match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7073 properties if !properties.is_empty() => Some(properties),
7074 _ => None,
7075 };
7076
7077 Ok(CreateConnector {
7078 name,
7079 if_not_exists,
7080 connector_type,
7081 url,
7082 comment,
7083 with_dcproperties,
7084 })
7085 }
7086
7087 fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7093 let mut parts = vec![];
7094 loop {
7095 parts.push(ObjectNamePart::Identifier(Ident::new(
7096 self.next_token().to_string(),
7097 )));
7098 if !self.consume_token(&Token::Period) {
7099 break;
7100 }
7101 }
7102 Ok(ObjectName(parts))
7103 }
7104
7105 pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7109 let name = self.parse_operator_name()?;
7110 self.expect_token(&Token::LParen)?;
7111
7112 let mut function: Option<ObjectName> = None;
7113 let mut is_procedure = false;
7114 let mut left_arg: Option<DataType> = None;
7115 let mut right_arg: Option<DataType> = None;
7116 let mut options: Vec<OperatorOption> = Vec::new();
7117
7118 loop {
7119 let keyword = self.expect_one_of_keywords(&[
7120 Keyword::FUNCTION,
7121 Keyword::PROCEDURE,
7122 Keyword::LEFTARG,
7123 Keyword::RIGHTARG,
7124 Keyword::COMMUTATOR,
7125 Keyword::NEGATOR,
7126 Keyword::RESTRICT,
7127 Keyword::JOIN,
7128 Keyword::HASHES,
7129 Keyword::MERGES,
7130 ])?;
7131
7132 match keyword {
7133 Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7134 options.push(OperatorOption::Hashes);
7135 }
7136 Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7137 options.push(OperatorOption::Merges);
7138 }
7139 Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7140 self.expect_token(&Token::Eq)?;
7141 function = Some(self.parse_object_name(false)?);
7142 is_procedure = keyword == Keyword::PROCEDURE;
7143 }
7144 Keyword::LEFTARG if left_arg.is_none() => {
7145 self.expect_token(&Token::Eq)?;
7146 left_arg = Some(self.parse_data_type()?);
7147 }
7148 Keyword::RIGHTARG if right_arg.is_none() => {
7149 self.expect_token(&Token::Eq)?;
7150 right_arg = Some(self.parse_data_type()?);
7151 }
7152 Keyword::COMMUTATOR
7153 if !options
7154 .iter()
7155 .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
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::Commutator(op));
7163 } else {
7164 options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7165 }
7166 }
7167 Keyword::NEGATOR
7168 if !options
7169 .iter()
7170 .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7171 {
7172 self.expect_token(&Token::Eq)?;
7173 if self.parse_keyword(Keyword::OPERATOR) {
7174 self.expect_token(&Token::LParen)?;
7175 let op = self.parse_operator_name()?;
7176 self.expect_token(&Token::RParen)?;
7177 options.push(OperatorOption::Negator(op));
7178 } else {
7179 options.push(OperatorOption::Negator(self.parse_operator_name()?));
7180 }
7181 }
7182 Keyword::RESTRICT
7183 if !options
7184 .iter()
7185 .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7186 {
7187 self.expect_token(&Token::Eq)?;
7188 options.push(OperatorOption::Restrict(Some(
7189 self.parse_object_name(false)?,
7190 )));
7191 }
7192 Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7193 self.expect_token(&Token::Eq)?;
7194 options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7195 }
7196 _ => {
7197 return Err(ParserError::ParserError(format!(
7198 "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7199 keyword
7200 )))
7201 }
7202 }
7203
7204 if !self.consume_token(&Token::Comma) {
7205 break;
7206 }
7207 }
7208
7209 self.expect_token(&Token::RParen)?;
7211
7212 let function = function.ok_or_else(|| {
7214 ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7215 })?;
7216
7217 Ok(CreateOperator {
7218 name,
7219 function,
7220 is_procedure,
7221 left_arg,
7222 right_arg,
7223 options,
7224 })
7225 }
7226
7227 pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7231 let name = self.parse_object_name(false)?;
7232 self.expect_keyword(Keyword::USING)?;
7233 let using = self.parse_identifier()?;
7234
7235 Ok(CreateOperatorFamily { name, using })
7236 }
7237
7238 pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7242 let name = self.parse_object_name(false)?;
7243 let default = self.parse_keyword(Keyword::DEFAULT);
7244 self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7245 let for_type = self.parse_data_type()?;
7246 self.expect_keyword(Keyword::USING)?;
7247 let using = self.parse_identifier()?;
7248
7249 let family = if self.parse_keyword(Keyword::FAMILY) {
7250 Some(self.parse_object_name(false)?)
7251 } else {
7252 None
7253 };
7254
7255 self.expect_keyword(Keyword::AS)?;
7256
7257 let mut items = vec![];
7258 loop {
7259 if self.parse_keyword(Keyword::OPERATOR) {
7260 let strategy_number = self.parse_literal_uint()?;
7261 let operator_name = self.parse_operator_name()?;
7262
7263 let op_types = if self.consume_token(&Token::LParen) {
7265 let left = self.parse_data_type()?;
7266 self.expect_token(&Token::Comma)?;
7267 let right = self.parse_data_type()?;
7268 self.expect_token(&Token::RParen)?;
7269 Some(OperatorArgTypes { left, right })
7270 } else {
7271 None
7272 };
7273
7274 let purpose = if self.parse_keyword(Keyword::FOR) {
7276 if self.parse_keyword(Keyword::SEARCH) {
7277 Some(OperatorPurpose::ForSearch)
7278 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7279 let sort_family = self.parse_object_name(false)?;
7280 Some(OperatorPurpose::ForOrderBy { sort_family })
7281 } else {
7282 return self
7283 .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7284 }
7285 } else {
7286 None
7287 };
7288
7289 items.push(OperatorClassItem::Operator {
7290 strategy_number,
7291 operator_name,
7292 op_types,
7293 purpose,
7294 });
7295 } else if self.parse_keyword(Keyword::FUNCTION) {
7296 let support_number = self.parse_literal_uint()?;
7297
7298 let op_types = if self.consume_token(&Token::LParen)
7300 && self.peek_token_ref().token != Token::RParen
7301 {
7302 let mut types = vec![];
7303 loop {
7304 types.push(self.parse_data_type()?);
7305 if !self.consume_token(&Token::Comma) {
7306 break;
7307 }
7308 }
7309 self.expect_token(&Token::RParen)?;
7310 Some(types)
7311 } else if self.consume_token(&Token::LParen) {
7312 self.expect_token(&Token::RParen)?;
7313 Some(vec![])
7314 } else {
7315 None
7316 };
7317
7318 let function_name = self.parse_object_name(false)?;
7319
7320 let argument_types = if self.consume_token(&Token::LParen) {
7322 let mut types = vec![];
7323 loop {
7324 if self.peek_token_ref().token == Token::RParen {
7325 break;
7326 }
7327 types.push(self.parse_data_type()?);
7328 if !self.consume_token(&Token::Comma) {
7329 break;
7330 }
7331 }
7332 self.expect_token(&Token::RParen)?;
7333 types
7334 } else {
7335 vec![]
7336 };
7337
7338 items.push(OperatorClassItem::Function {
7339 support_number,
7340 op_types,
7341 function_name,
7342 argument_types,
7343 });
7344 } else if self.parse_keyword(Keyword::STORAGE) {
7345 let storage_type = self.parse_data_type()?;
7346 items.push(OperatorClassItem::Storage { storage_type });
7347 } else {
7348 break;
7349 }
7350
7351 if !self.consume_token(&Token::Comma) {
7353 break;
7354 }
7355 }
7356
7357 Ok(CreateOperatorClass {
7358 name,
7359 default,
7360 for_type,
7361 using,
7362 family,
7363 items,
7364 })
7365 }
7366
7367 pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7369 let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7371 && self.parse_keyword(Keyword::TEMPORARY);
7372 let persistent = dialect_of!(self is DuckDbDialect)
7373 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7374
7375 let object_type = if self.parse_keyword(Keyword::TABLE) {
7376 ObjectType::Table
7377 } else if self.parse_keyword(Keyword::COLLATION) {
7378 ObjectType::Collation
7379 } else if self.parse_keyword(Keyword::VIEW) {
7380 ObjectType::View
7381 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7382 ObjectType::MaterializedView
7383 } else if self.parse_keyword(Keyword::INDEX) {
7384 ObjectType::Index
7385 } else if self.parse_keyword(Keyword::ROLE) {
7386 ObjectType::Role
7387 } else if self.parse_keyword(Keyword::SCHEMA) {
7388 ObjectType::Schema
7389 } else if self.parse_keyword(Keyword::DATABASE) {
7390 ObjectType::Database
7391 } else if self.parse_keyword(Keyword::SEQUENCE) {
7392 ObjectType::Sequence
7393 } else if self.parse_keyword(Keyword::STAGE) {
7394 ObjectType::Stage
7395 } else if self.parse_keyword(Keyword::TYPE) {
7396 ObjectType::Type
7397 } else if self.parse_keyword(Keyword::USER) {
7398 ObjectType::User
7399 } else if self.parse_keyword(Keyword::STREAM) {
7400 ObjectType::Stream
7401 } else if self.parse_keyword(Keyword::FUNCTION) {
7402 return self.parse_drop_function().map(Into::into);
7403 } else if self.parse_keyword(Keyword::POLICY) {
7404 return self.parse_drop_policy().map(Into::into);
7405 } else if self.parse_keyword(Keyword::CONNECTOR) {
7406 return self.parse_drop_connector();
7407 } else if self.parse_keyword(Keyword::DOMAIN) {
7408 return self.parse_drop_domain().map(Into::into);
7409 } else if self.parse_keyword(Keyword::PROCEDURE) {
7410 return self.parse_drop_procedure();
7411 } else if self.parse_keyword(Keyword::SECRET) {
7412 return self.parse_drop_secret(temporary, persistent);
7413 } else if self.parse_keyword(Keyword::TRIGGER) {
7414 return self.parse_drop_trigger().map(Into::into);
7415 } else if self.parse_keyword(Keyword::EXTENSION) {
7416 return self.parse_drop_extension();
7417 } else if self.parse_keyword(Keyword::OPERATOR) {
7418 return if self.parse_keyword(Keyword::FAMILY) {
7420 self.parse_drop_operator_family()
7421 } else if self.parse_keyword(Keyword::CLASS) {
7422 self.parse_drop_operator_class()
7423 } else {
7424 self.parse_drop_operator()
7425 };
7426 } else {
7427 return self.expected_ref(
7428 "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
7429 self.peek_token_ref(),
7430 );
7431 };
7432 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7435 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7436
7437 let loc = self.peek_token_ref().span.start;
7438 let cascade = self.parse_keyword(Keyword::CASCADE);
7439 let restrict = self.parse_keyword(Keyword::RESTRICT);
7440 let purge = self.parse_keyword(Keyword::PURGE);
7441 if cascade && restrict {
7442 return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7443 }
7444 if object_type == ObjectType::Role && (cascade || restrict || purge) {
7445 return parser_err!(
7446 "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7447 loc
7448 );
7449 }
7450 let table = if self.parse_keyword(Keyword::ON) {
7451 Some(self.parse_object_name(false)?)
7452 } else {
7453 None
7454 };
7455 Ok(Statement::Drop {
7456 object_type,
7457 if_exists,
7458 names,
7459 cascade,
7460 restrict,
7461 purge,
7462 temporary,
7463 table,
7464 })
7465 }
7466
7467 fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7468 match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7469 Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7470 Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7471 _ => None,
7472 }
7473 }
7474
7475 fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7480 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7481 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7482 let drop_behavior = self.parse_optional_drop_behavior();
7483 Ok(DropFunction {
7484 if_exists,
7485 func_desc,
7486 drop_behavior,
7487 })
7488 }
7489
7490 fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7496 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7497 let name = self.parse_identifier()?;
7498 self.expect_keyword_is(Keyword::ON)?;
7499 let table_name = self.parse_object_name(false)?;
7500 let drop_behavior = self.parse_optional_drop_behavior();
7501 Ok(DropPolicy {
7502 if_exists,
7503 name,
7504 table_name,
7505 drop_behavior,
7506 })
7507 }
7508 fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7514 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7515 let name = self.parse_identifier()?;
7516 Ok(Statement::DropConnector { if_exists, name })
7517 }
7518
7519 fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7523 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7524 let name = self.parse_object_name(false)?;
7525 let drop_behavior = self.parse_optional_drop_behavior();
7526 Ok(DropDomain {
7527 if_exists,
7528 name,
7529 drop_behavior,
7530 })
7531 }
7532
7533 fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7538 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7539 let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7540 let drop_behavior = self.parse_optional_drop_behavior();
7541 Ok(Statement::DropProcedure {
7542 if_exists,
7543 proc_desc,
7544 drop_behavior,
7545 })
7546 }
7547
7548 fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7549 let name = self.parse_object_name(false)?;
7550
7551 let args = if self.consume_token(&Token::LParen) {
7552 if self.consume_token(&Token::RParen) {
7553 Some(vec![])
7554 } else {
7555 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7556 self.expect_token(&Token::RParen)?;
7557 Some(args)
7558 }
7559 } else {
7560 None
7561 };
7562
7563 Ok(FunctionDesc { name, args })
7564 }
7565
7566 fn parse_drop_secret(
7568 &mut self,
7569 temporary: bool,
7570 persistent: bool,
7571 ) -> Result<Statement, ParserError> {
7572 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7573 let name = self.parse_identifier()?;
7574 let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7575 self.parse_identifier().ok()
7576 } else {
7577 None
7578 };
7579 let temp = match (temporary, persistent) {
7580 (true, false) => Some(true),
7581 (false, true) => Some(false),
7582 (false, false) => None,
7583 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7584 };
7585
7586 Ok(Statement::DropSecret {
7587 if_exists,
7588 temporary: temp,
7589 name,
7590 storage_specifier,
7591 })
7592 }
7593
7594 pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7604 if dialect_of!(self is BigQueryDialect) {
7605 return self.parse_big_query_declare();
7606 }
7607 if dialect_of!(self is SnowflakeDialect) {
7608 return self.parse_snowflake_declare();
7609 }
7610 if dialect_of!(self is MsSqlDialect) {
7611 return self.parse_mssql_declare();
7612 }
7613
7614 let name = self.parse_identifier()?;
7615
7616 let binary = Some(self.parse_keyword(Keyword::BINARY));
7617 let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7618 Some(true)
7619 } else if self.parse_keyword(Keyword::ASENSITIVE) {
7620 Some(false)
7621 } else {
7622 None
7623 };
7624 let scroll = if self.parse_keyword(Keyword::SCROLL) {
7625 Some(true)
7626 } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7627 Some(false)
7628 } else {
7629 None
7630 };
7631
7632 self.expect_keyword_is(Keyword::CURSOR)?;
7633 let declare_type = Some(DeclareType::Cursor);
7634
7635 let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7636 Some(keyword) => {
7637 self.expect_keyword_is(Keyword::HOLD)?;
7638
7639 match keyword {
7640 Keyword::WITH => Some(true),
7641 Keyword::WITHOUT => Some(false),
7642 unexpected_keyword => return Err(ParserError::ParserError(
7643 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7644 )),
7645 }
7646 }
7647 None => None,
7648 };
7649
7650 self.expect_keyword_is(Keyword::FOR)?;
7651
7652 let query = Some(self.parse_query()?);
7653
7654 Ok(Statement::Declare {
7655 stmts: vec![Declare {
7656 names: vec![name],
7657 data_type: None,
7658 assignment: None,
7659 declare_type,
7660 binary,
7661 sensitive,
7662 scroll,
7663 hold,
7664 for_query: query,
7665 }],
7666 })
7667 }
7668
7669 pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7677 let names = self.parse_comma_separated(Parser::parse_identifier)?;
7678
7679 let data_type = match &self.peek_token_ref().token {
7680 Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7681 _ => Some(self.parse_data_type()?),
7682 };
7683
7684 let expr = if data_type.is_some() {
7685 if self.parse_keyword(Keyword::DEFAULT) {
7686 Some(self.parse_expr()?)
7687 } else {
7688 None
7689 }
7690 } else {
7691 self.expect_keyword_is(Keyword::DEFAULT)?;
7694 Some(self.parse_expr()?)
7695 };
7696
7697 Ok(Statement::Declare {
7698 stmts: vec![Declare {
7699 names,
7700 data_type,
7701 assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7702 declare_type: None,
7703 binary: None,
7704 sensitive: None,
7705 scroll: None,
7706 hold: None,
7707 for_query: None,
7708 }],
7709 })
7710 }
7711
7712 pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7737 let mut stmts = vec![];
7738 loop {
7739 let name = self.parse_identifier()?;
7740 let (declare_type, for_query, assigned_expr, data_type) =
7741 if self.parse_keyword(Keyword::CURSOR) {
7742 self.expect_keyword_is(Keyword::FOR)?;
7743 match &self.peek_token_ref().token {
7744 Token::Word(w) if w.keyword == Keyword::SELECT => (
7745 Some(DeclareType::Cursor),
7746 Some(self.parse_query()?),
7747 None,
7748 None,
7749 ),
7750 _ => (
7751 Some(DeclareType::Cursor),
7752 None,
7753 Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7754 None,
7755 ),
7756 }
7757 } else if self.parse_keyword(Keyword::RESULTSET) {
7758 let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7759 self.parse_snowflake_variable_declaration_expression()?
7760 } else {
7761 None
7763 };
7764
7765 (Some(DeclareType::ResultSet), None, assigned_expr, None)
7766 } else if self.parse_keyword(Keyword::EXCEPTION) {
7767 let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7768 Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7769 } else {
7770 None
7772 };
7773
7774 (Some(DeclareType::Exception), None, assigned_expr, None)
7775 } else {
7776 let (assigned_expr, data_type) = if let Some(assigned_expr) =
7778 self.parse_snowflake_variable_declaration_expression()?
7779 {
7780 (Some(assigned_expr), None)
7781 } else if let Token::Word(_) = &self.peek_token_ref().token {
7782 let data_type = self.parse_data_type()?;
7783 (
7784 self.parse_snowflake_variable_declaration_expression()?,
7785 Some(data_type),
7786 )
7787 } else {
7788 (None, None)
7789 };
7790 (None, None, assigned_expr, data_type)
7791 };
7792 let stmt = Declare {
7793 names: vec![name],
7794 data_type,
7795 assignment: assigned_expr,
7796 declare_type,
7797 binary: None,
7798 sensitive: None,
7799 scroll: None,
7800 hold: None,
7801 for_query,
7802 };
7803
7804 stmts.push(stmt);
7805 if self.consume_token(&Token::SemiColon) {
7806 match &self.peek_token_ref().token {
7807 Token::Word(w)
7808 if ALL_KEYWORDS
7809 .binary_search(&w.value.to_uppercase().as_str())
7810 .is_err() =>
7811 {
7812 continue;
7814 }
7815 _ => {
7816 self.prev_token();
7818 }
7819 }
7820 }
7821
7822 break;
7823 }
7824
7825 Ok(Statement::Declare { stmts })
7826 }
7827
7828 pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
7840 let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
7841
7842 Ok(Statement::Declare { stmts })
7843 }
7844
7845 pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
7856 let name = {
7857 let ident = self.parse_identifier()?;
7858 if !ident.value.starts_with('@')
7859 && !matches!(
7860 &self.peek_token_ref().token,
7861 Token::Word(w) if w.keyword == Keyword::CURSOR
7862 )
7863 {
7864 Err(ParserError::TokenizerError(
7865 "Invalid MsSql variable declaration.".to_string(),
7866 ))
7867 } else {
7868 Ok(ident)
7869 }
7870 }?;
7871
7872 let (declare_type, data_type) = match &self.peek_token_ref().token {
7873 Token::Word(w) => match w.keyword {
7874 Keyword::CURSOR => {
7875 self.next_token();
7876 (Some(DeclareType::Cursor), None)
7877 }
7878 Keyword::AS => {
7879 self.next_token();
7880 (None, Some(self.parse_data_type()?))
7881 }
7882 _ => (None, Some(self.parse_data_type()?)),
7883 },
7884 _ => (None, Some(self.parse_data_type()?)),
7885 };
7886
7887 let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
7888 self.next_token();
7889 let query = Some(self.parse_query()?);
7890 (query, None)
7891 } else {
7892 let assignment = self.parse_mssql_variable_declaration_expression()?;
7893 (None, assignment)
7894 };
7895
7896 Ok(Declare {
7897 names: vec![name],
7898 data_type,
7899 assignment,
7900 declare_type,
7901 binary: None,
7902 sensitive: None,
7903 scroll: None,
7904 hold: None,
7905 for_query,
7906 })
7907 }
7908
7909 pub fn parse_snowflake_variable_declaration_expression(
7917 &mut self,
7918 ) -> Result<Option<DeclareAssignment>, ParserError> {
7919 Ok(match &self.peek_token_ref().token {
7920 Token::Word(w) if w.keyword == Keyword::DEFAULT => {
7921 self.next_token(); Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
7923 }
7924 Token::Assignment => {
7925 self.next_token(); Some(DeclareAssignment::DuckAssignment(Box::new(
7927 self.parse_expr()?,
7928 )))
7929 }
7930 _ => None,
7931 })
7932 }
7933
7934 pub fn parse_mssql_variable_declaration_expression(
7941 &mut self,
7942 ) -> Result<Option<DeclareAssignment>, ParserError> {
7943 Ok(match &self.peek_token_ref().token {
7944 Token::Eq => {
7945 self.next_token(); Some(DeclareAssignment::MsSqlAssignment(Box::new(
7947 self.parse_expr()?,
7948 )))
7949 }
7950 _ => None,
7951 })
7952 }
7953
7954 pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
7956 let direction = if self.parse_keyword(Keyword::NEXT) {
7957 FetchDirection::Next
7958 } else if self.parse_keyword(Keyword::PRIOR) {
7959 FetchDirection::Prior
7960 } else if self.parse_keyword(Keyword::FIRST) {
7961 FetchDirection::First
7962 } else if self.parse_keyword(Keyword::LAST) {
7963 FetchDirection::Last
7964 } else if self.parse_keyword(Keyword::ABSOLUTE) {
7965 FetchDirection::Absolute {
7966 limit: self.parse_number_value()?,
7967 }
7968 } else if self.parse_keyword(Keyword::RELATIVE) {
7969 FetchDirection::Relative {
7970 limit: self.parse_number_value()?,
7971 }
7972 } else if self.parse_keyword(Keyword::FORWARD) {
7973 if self.parse_keyword(Keyword::ALL) {
7974 FetchDirection::ForwardAll
7975 } else {
7976 FetchDirection::Forward {
7977 limit: Some(self.parse_number_value()?),
7979 }
7980 }
7981 } else if self.parse_keyword(Keyword::BACKWARD) {
7982 if self.parse_keyword(Keyword::ALL) {
7983 FetchDirection::BackwardAll
7984 } else {
7985 FetchDirection::Backward {
7986 limit: Some(self.parse_number_value()?),
7988 }
7989 }
7990 } else if self.parse_keyword(Keyword::ALL) {
7991 FetchDirection::All
7992 } else {
7993 FetchDirection::Count {
7994 limit: self.parse_number_value()?,
7995 }
7996 };
7997
7998 let position = if self.peek_keyword(Keyword::FROM) {
7999 self.expect_keyword(Keyword::FROM)?;
8000 FetchPosition::From
8001 } else if self.peek_keyword(Keyword::IN) {
8002 self.expect_keyword(Keyword::IN)?;
8003 FetchPosition::In
8004 } else {
8005 return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8006 };
8007
8008 let name = self.parse_identifier()?;
8009
8010 let into = if self.parse_keyword(Keyword::INTO) {
8011 Some(self.parse_object_name(false)?)
8012 } else {
8013 None
8014 };
8015
8016 Ok(Statement::Fetch {
8017 name,
8018 direction,
8019 position,
8020 into,
8021 })
8022 }
8023
8024 pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8026 let object_type = if self.parse_keyword(Keyword::ALL) {
8027 DiscardObject::ALL
8028 } else if self.parse_keyword(Keyword::PLANS) {
8029 DiscardObject::PLANS
8030 } else if self.parse_keyword(Keyword::SEQUENCES) {
8031 DiscardObject::SEQUENCES
8032 } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8033 DiscardObject::TEMP
8034 } else {
8035 return self.expected_ref(
8036 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8037 self.peek_token_ref(),
8038 );
8039 };
8040 Ok(Statement::Discard { object_type })
8041 }
8042
8043 pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8045 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8046 let r#async = self.parse_keyword(Keyword::ASYNC);
8047 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8048
8049 let mut using = None;
8050
8051 let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8052 let index_name = self.parse_object_name(false)?;
8053 using = self.parse_optional_using_then_index_type()?;
8055 self.expect_keyword_is(Keyword::ON)?;
8056 Some(index_name)
8057 } else {
8058 None
8059 };
8060
8061 let table_name = self.parse_object_name(false)?;
8062
8063 using = self.parse_optional_using_then_index_type()?.or(using);
8066
8067 let columns = self.parse_parenthesized_index_column_list()?;
8068
8069 let include = if self.parse_keyword(Keyword::INCLUDE) {
8070 self.expect_token(&Token::LParen)?;
8071 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8072 self.expect_token(&Token::RParen)?;
8073 columns
8074 } else {
8075 vec![]
8076 };
8077
8078 let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8079 let not = self.parse_keyword(Keyword::NOT);
8080 self.expect_keyword_is(Keyword::DISTINCT)?;
8081 Some(!not)
8082 } else {
8083 None
8084 };
8085
8086 let with = if self.dialect.supports_create_index_with_clause()
8087 && self.parse_keyword(Keyword::WITH)
8088 {
8089 self.expect_token(&Token::LParen)?;
8090 let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8091 self.expect_token(&Token::RParen)?;
8092 with_params
8093 } else {
8094 Vec::new()
8095 };
8096
8097 let predicate = if self.parse_keyword(Keyword::WHERE) {
8098 Some(self.parse_expr()?)
8099 } else {
8100 None
8101 };
8102
8103 let index_options = self.parse_index_options()?;
8109
8110 let mut alter_options = Vec::new();
8112 while self
8113 .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8114 .is_some()
8115 {
8116 alter_options.push(self.parse_alter_table_operation()?)
8117 }
8118
8119 Ok(CreateIndex {
8120 name: index_name,
8121 table_name,
8122 using,
8123 columns,
8124 unique,
8125 concurrently,
8126 r#async,
8127 if_not_exists,
8128 include,
8129 nulls_distinct,
8130 with,
8131 predicate,
8132 index_options,
8133 alter_options,
8134 })
8135 }
8136
8137 pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8139 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8140 let name = self.parse_identifier()?;
8141
8142 let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8143 let schema = if self.parse_keyword(Keyword::SCHEMA) {
8144 Some(self.parse_identifier()?)
8145 } else {
8146 None
8147 };
8148
8149 let version = if self.parse_keyword(Keyword::VERSION) {
8150 Some(self.parse_identifier()?)
8151 } else {
8152 None
8153 };
8154
8155 let cascade = self.parse_keyword(Keyword::CASCADE);
8156
8157 (schema, version, cascade)
8158 } else {
8159 (None, None, false)
8160 };
8161
8162 Ok(CreateExtension {
8163 name,
8164 if_not_exists,
8165 schema,
8166 version,
8167 cascade,
8168 })
8169 }
8170
8171 pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8173 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8174 let name = self.parse_object_name(false)?;
8175
8176 let definition = if self.parse_keyword(Keyword::FROM) {
8177 CreateCollationDefinition::From(self.parse_object_name(false)?)
8178 } else if self.consume_token(&Token::LParen) {
8179 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8180 self.expect_token(&Token::RParen)?;
8181 CreateCollationDefinition::Options(options)
8182 } else {
8183 return self.expected_ref(
8184 "FROM or parenthesized option list after CREATE COLLATION name",
8185 self.peek_token_ref(),
8186 );
8187 };
8188
8189 Ok(CreateCollation {
8190 if_not_exists,
8191 name,
8192 definition,
8193 })
8194 }
8195
8196 pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8198 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8199 let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8200 let cascade_or_restrict =
8201 self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8202 Ok(Statement::DropExtension(DropExtension {
8203 names,
8204 if_exists,
8205 cascade_or_restrict: cascade_or_restrict
8206 .map(|k| match k {
8207 Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8208 Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8209 _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8210 })
8211 .transpose()?,
8212 }))
8213 }
8214
8215 pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8218 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8219 let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8220 let drop_behavior = self.parse_optional_drop_behavior();
8221 Ok(Statement::DropOperator(DropOperator {
8222 if_exists,
8223 operators,
8224 drop_behavior,
8225 }))
8226 }
8227
8228 fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8231 let name = self.parse_operator_name()?;
8232 self.expect_token(&Token::LParen)?;
8233
8234 let left_type = if self.parse_keyword(Keyword::NONE) {
8236 None
8237 } else {
8238 Some(self.parse_data_type()?)
8239 };
8240
8241 self.expect_token(&Token::Comma)?;
8242
8243 let right_type = self.parse_data_type()?;
8245
8246 self.expect_token(&Token::RParen)?;
8247
8248 Ok(DropOperatorSignature {
8249 name,
8250 left_type,
8251 right_type,
8252 })
8253 }
8254
8255 pub fn parse_drop_operator_family(&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::DropOperatorFamily(DropOperatorFamily {
8265 if_exists,
8266 names,
8267 using,
8268 drop_behavior,
8269 }))
8270 }
8271
8272 pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8276 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8277 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8278 self.expect_keyword(Keyword::USING)?;
8279 let using = self.parse_identifier()?;
8280 let drop_behavior = self.parse_optional_drop_behavior();
8281 Ok(Statement::DropOperatorClass(DropOperatorClass {
8282 if_exists,
8283 names,
8284 using,
8285 drop_behavior,
8286 }))
8287 }
8288
8289 pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8293 if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8294 self.expect_token(&Token::LParen)?;
8295 let columns =
8296 self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8297 self.expect_token(&Token::RParen)?;
8298 Ok(HiveDistributionStyle::PARTITIONED { columns })
8299 } else {
8300 Ok(HiveDistributionStyle::NONE)
8301 }
8302 }
8303
8304 fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8308 let token = self.next_token();
8309 match &token.token {
8310 Token::Word(w) => match w.keyword {
8311 Keyword::AUTO => Ok(DistStyle::Auto),
8312 Keyword::EVEN => Ok(DistStyle::Even),
8313 Keyword::KEY => Ok(DistStyle::Key),
8314 Keyword::ALL => Ok(DistStyle::All),
8315 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8316 },
8317 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8318 }
8319 }
8320
8321 pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8323 let mut hive_format: Option<HiveFormat> = None;
8324 loop {
8325 match self.parse_one_of_keywords(&[
8326 Keyword::ROW,
8327 Keyword::STORED,
8328 Keyword::LOCATION,
8329 Keyword::WITH,
8330 Keyword::USING,
8331 ]) {
8332 Some(Keyword::ROW) => {
8333 hive_format
8334 .get_or_insert_with(HiveFormat::default)
8335 .row_format = Some(self.parse_row_format()?);
8336 }
8337 Some(Keyword::STORED) => {
8338 self.expect_keyword_is(Keyword::AS)?;
8339 if self.parse_keyword(Keyword::INPUTFORMAT) {
8340 let input_format = self.parse_expr()?;
8341 self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8342 let output_format = self.parse_expr()?;
8343 hive_format.get_or_insert_with(HiveFormat::default).storage =
8344 Some(HiveIOFormat::IOF {
8345 input_format,
8346 output_format,
8347 });
8348 } else {
8349 let format = self.parse_file_format()?;
8350 hive_format.get_or_insert_with(HiveFormat::default).storage =
8351 Some(HiveIOFormat::FileFormat { format });
8352 }
8353 }
8354 Some(Keyword::LOCATION) => {
8355 hive_format.get_or_insert_with(HiveFormat::default).location =
8356 Some(self.parse_literal_string()?);
8357 }
8358 Some(Keyword::WITH) => {
8359 self.prev_token();
8360 let properties = self
8361 .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8362 if !properties.is_empty() {
8363 hive_format
8364 .get_or_insert_with(HiveFormat::default)
8365 .serde_properties = Some(properties);
8366 } else {
8367 break;
8368 }
8369 }
8370 Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8371 let format = self.parse_identifier()?;
8372 hive_format.get_or_insert_with(HiveFormat::default).storage =
8373 Some(HiveIOFormat::Using { format });
8374 }
8375 Some(Keyword::USING) => {
8376 self.prev_token();
8378 break;
8379 }
8380 None => break,
8381 _ => break,
8382 }
8383 }
8384
8385 Ok(hive_format)
8386 }
8387
8388 pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8390 self.expect_keyword_is(Keyword::FORMAT)?;
8391 match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8392 Some(Keyword::SERDE) => {
8393 let class = self.parse_literal_string()?;
8394 Ok(HiveRowFormat::SERDE { class })
8395 }
8396 _ => {
8397 let mut row_delimiters = vec![];
8398
8399 loop {
8400 match self.parse_one_of_keywords(&[
8401 Keyword::FIELDS,
8402 Keyword::COLLECTION,
8403 Keyword::MAP,
8404 Keyword::LINES,
8405 Keyword::NULL,
8406 ]) {
8407 Some(Keyword::FIELDS)
8408 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8409 {
8410 row_delimiters.push(HiveRowDelimiter {
8411 delimiter: HiveDelimiter::FieldsTerminatedBy,
8412 char: self.parse_identifier()?,
8413 });
8414
8415 if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8416 row_delimiters.push(HiveRowDelimiter {
8417 delimiter: HiveDelimiter::FieldsEscapedBy,
8418 char: self.parse_identifier()?,
8419 });
8420 }
8421 }
8422 Some(Keyword::COLLECTION)
8423 if self.parse_keywords(&[
8424 Keyword::ITEMS,
8425 Keyword::TERMINATED,
8426 Keyword::BY,
8427 ]) =>
8428 {
8429 row_delimiters.push(HiveRowDelimiter {
8430 delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8431 char: self.parse_identifier()?,
8432 });
8433 }
8434 Some(Keyword::MAP)
8435 if self.parse_keywords(&[
8436 Keyword::KEYS,
8437 Keyword::TERMINATED,
8438 Keyword::BY,
8439 ]) =>
8440 {
8441 row_delimiters.push(HiveRowDelimiter {
8442 delimiter: HiveDelimiter::MapKeysTerminatedBy,
8443 char: self.parse_identifier()?,
8444 });
8445 }
8446 Some(Keyword::LINES)
8447 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8448 {
8449 row_delimiters.push(HiveRowDelimiter {
8450 delimiter: HiveDelimiter::LinesTerminatedBy,
8451 char: self.parse_identifier()?,
8452 });
8453 }
8454 Some(Keyword::NULL)
8455 if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8456 {
8457 row_delimiters.push(HiveRowDelimiter {
8458 delimiter: HiveDelimiter::NullDefinedAs,
8459 char: self.parse_identifier()?,
8460 });
8461 }
8462 _ => {
8463 break;
8464 }
8465 }
8466 }
8467
8468 Ok(HiveRowFormat::DELIMITED {
8469 delimiters: row_delimiters,
8470 })
8471 }
8472 }
8473 }
8474
8475 fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8476 if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8477 Ok(Some(self.parse_identifier()?))
8478 } else {
8479 Ok(None)
8480 }
8481 }
8482
8483 pub fn parse_create_table(
8485 &mut self,
8486 or_replace: bool,
8487 temporary: bool,
8488 global: Option<bool>,
8489 transient: bool,
8490 volatile: bool,
8491 multiset: Option<bool>,
8492 ) -> Result<CreateTable, ParserError> {
8493 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8494 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8495 let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8496
8497 let fallback = if self.dialect.supports_leading_comma_before_table_options()
8498 && self.consume_token(&Token::Comma)
8499 {
8500 let fallback = self.maybe_parse_fallback()?;
8501 if fallback.is_none() {
8502 self.prev_token(); }
8504 fallback
8505 } else {
8506 None
8507 };
8508
8509 let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8520 Some(self.parse_object_name(allow_unquoted_hyphen)?)
8521 } else {
8522 None
8523 };
8524
8525 let on_cluster = self.parse_optional_on_cluster()?;
8527
8528 let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8529
8530 let clone = if self.parse_keyword(Keyword::CLONE) {
8531 self.parse_object_name(allow_unquoted_hyphen).ok()
8532 } else {
8533 None
8534 };
8535
8536 let (columns, constraints) = self.parse_columns()?;
8538 let comment_after_column_def =
8539 if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8540 let next_token = self.next_token();
8541 match next_token.token {
8542 Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8543 _ => self.expected("comment", next_token)?,
8544 }
8545 } else {
8546 None
8547 };
8548
8549 let for_values = if partition_of.is_some() {
8551 if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8552 Some(self.parse_partition_for_values()?)
8553 } else {
8554 return self.expected_ref(
8555 "FOR VALUES or DEFAULT after PARTITION OF",
8556 self.peek_token_ref(),
8557 );
8558 }
8559 } else {
8560 None
8561 };
8562
8563 let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8565
8566 let hive_distribution = self.parse_hive_distribution()?;
8567 let clustered_by = self.parse_optional_clustered_by()?;
8568 let hive_formats = self.parse_hive_formats()?;
8569
8570 let create_table_config = self.parse_optional_create_table_config()?;
8571
8572 let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8575 && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8576 {
8577 Some(Box::new(self.parse_expr()?))
8578 } else {
8579 None
8580 };
8581
8582 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8583 if self.consume_token(&Token::LParen) {
8584 let columns = if self.peek_token_ref().token != Token::RParen {
8585 self.parse_comma_separated(|p| p.parse_expr())?
8586 } else {
8587 vec![]
8588 };
8589 self.expect_token(&Token::RParen)?;
8590 Some(OneOrManyWithParens::Many(columns))
8591 } else {
8592 Some(OneOrManyWithParens::One(self.parse_expr()?))
8593 }
8594 } else {
8595 None
8596 };
8597
8598 let partition_by = if create_table_config.partition_by.is_none()
8601 && self.dialect.supports_partition_by_after_order_by()
8602 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8603 {
8604 Some(Box::new(self.parse_expr()?))
8605 } else {
8606 create_table_config.partition_by
8607 };
8608
8609 let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8610 Some(self.parse_create_table_on_commit()?)
8611 } else {
8612 None
8613 };
8614
8615 let strict = self.parse_keyword(Keyword::STRICT);
8616
8617 let backup = if self.parse_keyword(Keyword::BACKUP) {
8619 let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8620 Some(keyword == Keyword::YES)
8621 } else {
8622 None
8623 };
8624
8625 let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8627 Some(self.parse_dist_style()?)
8628 } else {
8629 None
8630 };
8631 let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8632 self.expect_token(&Token::LParen)?;
8633 let expr = self.parse_expr()?;
8634 self.expect_token(&Token::RParen)?;
8635 Some(expr)
8636 } else {
8637 None
8638 };
8639 let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8640 self.expect_token(&Token::LParen)?;
8641 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8642 self.expect_token(&Token::RParen)?;
8643 Some(columns)
8644 } else {
8645 None
8646 };
8647
8648 let query = if self.parse_keyword(Keyword::AS) {
8650 Some(self.parse_query()?)
8651 } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8652 {
8653 self.prev_token();
8655 Some(self.parse_query()?)
8656 } else {
8657 None
8658 };
8659
8660 let with_data = if query.is_some() {
8662 self.maybe_parse_with_data()?
8663 } else {
8664 None
8665 };
8666
8667 Ok(CreateTableBuilder::new(table_name)
8668 .temporary(temporary)
8669 .columns(columns)
8670 .constraints(constraints)
8671 .or_replace(or_replace)
8672 .if_not_exists(if_not_exists)
8673 .transient(transient)
8674 .volatile(volatile)
8675 .multiset(multiset)
8676 .fallback(fallback)
8677 .hive_distribution(hive_distribution)
8678 .hive_formats(hive_formats)
8679 .global(global)
8680 .query(query)
8681 .without_rowid(without_rowid)
8682 .like(like)
8683 .clone_clause(clone)
8684 .comment_after_column_def(comment_after_column_def)
8685 .order_by(order_by)
8686 .on_commit(on_commit)
8687 .on_cluster(on_cluster)
8688 .clustered_by(clustered_by)
8689 .partition_by(partition_by)
8690 .cluster_by(create_table_config.cluster_by)
8691 .inherits(create_table_config.inherits)
8692 .partition_of(partition_of)
8693 .for_values(for_values)
8694 .table_options(create_table_config.table_options)
8695 .primary_key(primary_key)
8696 .with_data(with_data)
8697 .strict(strict)
8698 .backup(backup)
8699 .diststyle(diststyle)
8700 .distkey(distkey)
8701 .sortkey(sortkey)
8702 .build())
8703 }
8704
8705 fn maybe_parse_multiset(&mut self) -> Option<bool> {
8707 match self.parse_one_of_keywords(&[Keyword::SET, Keyword::MULTISET]) {
8708 Some(Keyword::MULTISET) => Some(true),
8709 Some(Keyword::SET) => Some(false),
8710 _ => None,
8711 }
8712 }
8713
8714 fn maybe_parse_fallback(&mut self) -> Result<Option<bool>, ParserError> {
8716 if self.parse_keywords(&[Keyword::NO, Keyword::FALLBACK]) {
8717 Ok(Some(false))
8718 } else if self.parse_keyword(Keyword::FALLBACK) {
8719 Ok(Some(true))
8720 } else {
8721 Ok(None)
8722 }
8723 }
8724
8725 fn maybe_parse_with_data(&mut self) -> Result<Option<WithData>, ParserError> {
8727 let data = if self.parse_keywords(&[Keyword::WITH, Keyword::DATA]) {
8728 true
8729 } else if self.parse_keywords(&[Keyword::WITH, Keyword::NO, Keyword::DATA]) {
8730 false
8731 } else {
8732 return Ok(None);
8733 };
8734
8735 let statistics = if self.parse_keywords(&[Keyword::AND, Keyword::STATISTICS]) {
8736 Some(true)
8737 } else if self.parse_keywords(&[Keyword::AND, Keyword::NO, Keyword::STATISTICS]) {
8738 Some(false)
8739 } else {
8740 None
8741 };
8742
8743 Ok(Some(WithData { data, statistics }))
8744 }
8745
8746 fn maybe_parse_create_table_like(
8747 &mut self,
8748 allow_unquoted_hyphen: bool,
8749 ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8750 let like = if self.dialect.supports_create_table_like_parenthesized()
8751 && self.consume_token(&Token::LParen)
8752 {
8753 if self.parse_keyword(Keyword::LIKE) {
8754 let name = self.parse_object_name(allow_unquoted_hyphen)?;
8755 let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
8756 Some(CreateTableLikeDefaults::Including)
8757 } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
8758 Some(CreateTableLikeDefaults::Excluding)
8759 } else {
8760 None
8761 };
8762 self.expect_token(&Token::RParen)?;
8763 Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
8764 name,
8765 defaults,
8766 }))
8767 } else {
8768 self.prev_token();
8770 None
8771 }
8772 } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
8773 let name = self.parse_object_name(allow_unquoted_hyphen)?;
8774 Some(CreateTableLikeKind::Plain(CreateTableLike {
8775 name,
8776 defaults: None,
8777 }))
8778 } else {
8779 None
8780 };
8781 Ok(like)
8782 }
8783
8784 pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
8785 if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
8786 Ok(OnCommit::DeleteRows)
8787 } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
8788 Ok(OnCommit::PreserveRows)
8789 } else if self.parse_keywords(&[Keyword::DROP]) {
8790 Ok(OnCommit::Drop)
8791 } else {
8792 parser_err!(
8793 "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
8794 self.peek_token_ref()
8795 )
8796 }
8797 }
8798
8799 fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
8805 if self.parse_keyword(Keyword::DEFAULT) {
8806 return Ok(ForValues::Default);
8807 }
8808
8809 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
8810
8811 if self.parse_keyword(Keyword::IN) {
8812 self.expect_token(&Token::LParen)?;
8814 if self.peek_token_ref().token == Token::RParen {
8815 return self.expected_ref("at least one value", self.peek_token_ref());
8816 }
8817 let values = self.parse_comma_separated(Parser::parse_expr)?;
8818 self.expect_token(&Token::RParen)?;
8819 Ok(ForValues::In(values))
8820 } else if self.parse_keyword(Keyword::FROM) {
8821 self.expect_token(&Token::LParen)?;
8823 if self.peek_token_ref().token == Token::RParen {
8824 return self.expected_ref("at least one value", self.peek_token_ref());
8825 }
8826 let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8827 self.expect_token(&Token::RParen)?;
8828 self.expect_keyword(Keyword::TO)?;
8829 self.expect_token(&Token::LParen)?;
8830 if self.peek_token_ref().token == Token::RParen {
8831 return self.expected_ref("at least one value", self.peek_token_ref());
8832 }
8833 let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
8834 self.expect_token(&Token::RParen)?;
8835 Ok(ForValues::From { from, to })
8836 } else if self.parse_keyword(Keyword::WITH) {
8837 self.expect_token(&Token::LParen)?;
8839 self.expect_keyword(Keyword::MODULUS)?;
8840 let modulus = self.parse_literal_uint()?;
8841 self.expect_token(&Token::Comma)?;
8842 self.expect_keyword(Keyword::REMAINDER)?;
8843 let remainder = self.parse_literal_uint()?;
8844 self.expect_token(&Token::RParen)?;
8845 Ok(ForValues::With { modulus, remainder })
8846 } else {
8847 self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
8848 }
8849 }
8850
8851 fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
8853 if self.parse_keyword(Keyword::MINVALUE) {
8854 Ok(PartitionBoundValue::MinValue)
8855 } else if self.parse_keyword(Keyword::MAXVALUE) {
8856 Ok(PartitionBoundValue::MaxValue)
8857 } else {
8858 Ok(PartitionBoundValue::Expr(self.parse_expr()?))
8859 }
8860 }
8861
8862 fn parse_optional_create_table_config(
8868 &mut self,
8869 ) -> Result<CreateTableConfiguration, ParserError> {
8870 let mut table_options = CreateTableOptions::None;
8871
8872 let inherits = if self.parse_keyword(Keyword::INHERITS) {
8873 Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
8874 } else {
8875 None
8876 };
8877
8878 let with_options = self.parse_options(Keyword::WITH)?;
8880 if !with_options.is_empty() {
8881 table_options = CreateTableOptions::With(with_options)
8882 }
8883
8884 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
8885 if !table_properties.is_empty() {
8886 table_options = CreateTableOptions::TableProperties(table_properties);
8887 }
8888 let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
8889 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8890 {
8891 Some(Box::new(self.parse_expr()?))
8892 } else {
8893 None
8894 };
8895
8896 let mut cluster_by = None;
8897 if dialect_of!(self is BigQueryDialect | GenericDialect) {
8898 if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
8899 cluster_by = Some(WrappedCollection::NoWrapping(
8900 self.parse_comma_separated(|p| p.parse_expr())?,
8901 ));
8902 };
8903
8904 if let Token::Word(word) = &self.peek_token_ref().token {
8905 if word.keyword == Keyword::OPTIONS {
8906 table_options =
8907 CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
8908 }
8909 };
8910 }
8911
8912 if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
8913 let plain_options = self.parse_plain_options()?;
8914 if !plain_options.is_empty() {
8915 table_options = CreateTableOptions::Plain(plain_options)
8916 }
8917 };
8918
8919 Ok(CreateTableConfiguration {
8920 partition_by,
8921 cluster_by,
8922 inherits,
8923 table_options,
8924 })
8925 }
8926
8927 fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
8928 if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
8931 return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
8932 }
8933
8934 if self.parse_keywords(&[Keyword::COMMENT]) {
8937 let has_eq = self.consume_token(&Token::Eq);
8938 let value = self.next_token();
8939
8940 let comment = match (has_eq, value.token) {
8941 (true, Token::SingleQuotedString(s)) => {
8942 Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
8943 }
8944 (false, Token::SingleQuotedString(s)) => {
8945 Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
8946 }
8947 (_, token) => {
8948 self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
8949 }
8950 };
8951 return comment;
8952 }
8953
8954 if self.parse_keywords(&[Keyword::ENGINE]) {
8957 let _ = self.consume_token(&Token::Eq);
8958 let value = self.next_token();
8959
8960 let engine = match value.token {
8961 Token::Word(w) => {
8962 let parameters = if self.peek_token_ref().token == Token::LParen {
8963 self.parse_parenthesized_identifiers()?
8964 } else {
8965 vec![]
8966 };
8967
8968 Ok(Some(SqlOption::NamedParenthesizedList(
8969 NamedParenthesizedList {
8970 key: Ident::new("ENGINE"),
8971 name: Some(Ident::new(w.value)),
8972 values: parameters,
8973 },
8974 )))
8975 }
8976 _ => {
8977 return self.expected("Token::Word", value)?;
8978 }
8979 };
8980
8981 return engine;
8982 }
8983
8984 if self.parse_keywords(&[Keyword::TABLESPACE]) {
8986 let _ = self.consume_token(&Token::Eq);
8987 let value = self.next_token();
8988
8989 let tablespace = match value.token {
8990 Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
8991 let storage = match self.parse_keyword(Keyword::STORAGE) {
8992 true => {
8993 let _ = self.consume_token(&Token::Eq);
8994 let storage_token = self.next_token();
8995 match &storage_token.token {
8996 Token::Word(w) => match w.value.to_uppercase().as_str() {
8997 "DISK" => Some(StorageType::Disk),
8998 "MEMORY" => Some(StorageType::Memory),
8999 _ => self
9000 .expected("Storage type (DISK or MEMORY)", storage_token)?,
9001 },
9002 _ => self.expected("Token::Word", storage_token)?,
9003 }
9004 }
9005 false => None,
9006 };
9007
9008 Ok(Some(SqlOption::TableSpace(TablespaceOption {
9009 name,
9010 storage,
9011 })))
9012 }
9013 _ => {
9014 return self.expected("Token::Word", value)?;
9015 }
9016 };
9017
9018 return tablespace;
9019 }
9020
9021 if self.parse_keyword(Keyword::UNION) {
9023 let _ = self.consume_token(&Token::Eq);
9024 let value = self.next_token();
9025
9026 match value.token {
9027 Token::LParen => {
9028 let tables: Vec<Ident> =
9029 self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9030 self.expect_token(&Token::RParen)?;
9031
9032 return Ok(Some(SqlOption::NamedParenthesizedList(
9033 NamedParenthesizedList {
9034 key: Ident::new("UNION"),
9035 name: None,
9036 values: tables,
9037 },
9038 )));
9039 }
9040 _ => {
9041 return self.expected("Token::LParen", value)?;
9042 }
9043 }
9044 }
9045
9046 let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9048 Ident::new("DEFAULT CHARSET")
9049 } else if self.parse_keyword(Keyword::CHARSET) {
9050 Ident::new("CHARSET")
9051 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9052 Ident::new("DEFAULT CHARACTER SET")
9053 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9054 Ident::new("CHARACTER SET")
9055 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9056 Ident::new("DEFAULT COLLATE")
9057 } else if self.parse_keyword(Keyword::COLLATE) {
9058 Ident::new("COLLATE")
9059 } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9060 Ident::new("DATA DIRECTORY")
9061 } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9062 Ident::new("INDEX DIRECTORY")
9063 } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9064 Ident::new("KEY_BLOCK_SIZE")
9065 } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9066 Ident::new("ROW_FORMAT")
9067 } else if self.parse_keyword(Keyword::PACK_KEYS) {
9068 Ident::new("PACK_KEYS")
9069 } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9070 Ident::new("STATS_AUTO_RECALC")
9071 } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9072 Ident::new("STATS_PERSISTENT")
9073 } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9074 Ident::new("STATS_SAMPLE_PAGES")
9075 } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9076 Ident::new("DELAY_KEY_WRITE")
9077 } else if self.parse_keyword(Keyword::COMPRESSION) {
9078 Ident::new("COMPRESSION")
9079 } else if self.parse_keyword(Keyword::ENCRYPTION) {
9080 Ident::new("ENCRYPTION")
9081 } else if self.parse_keyword(Keyword::MAX_ROWS) {
9082 Ident::new("MAX_ROWS")
9083 } else if self.parse_keyword(Keyword::MIN_ROWS) {
9084 Ident::new("MIN_ROWS")
9085 } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9086 Ident::new("AUTOEXTEND_SIZE")
9087 } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9088 Ident::new("AVG_ROW_LENGTH")
9089 } else if self.parse_keyword(Keyword::CHECKSUM) {
9090 Ident::new("CHECKSUM")
9091 } else if self.parse_keyword(Keyword::CONNECTION) {
9092 Ident::new("CONNECTION")
9093 } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9094 Ident::new("ENGINE_ATTRIBUTE")
9095 } else if self.parse_keyword(Keyword::PASSWORD) {
9096 Ident::new("PASSWORD")
9097 } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9098 Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9099 } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9100 Ident::new("INSERT_METHOD")
9101 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9102 Ident::new("AUTO_INCREMENT")
9103 } else {
9104 return Ok(None);
9105 };
9106
9107 let _ = self.consume_token(&Token::Eq);
9108
9109 let value = match self
9110 .maybe_parse(|parser| parser.parse_value())?
9111 .map(Expr::Value)
9112 {
9113 Some(expr) => expr,
9114 None => Expr::Identifier(self.parse_identifier()?),
9115 };
9116
9117 Ok(Some(SqlOption::KeyValue { key, value }))
9118 }
9119
9120 pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9122 let mut options = Vec::new();
9123
9124 while let Some(option) = self.parse_plain_option()? {
9125 options.push(option);
9126 let _ = self.consume_token(&Token::Comma);
9129 }
9130
9131 Ok(options)
9132 }
9133
9134 pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9136 let comment = if self.parse_keyword(Keyword::COMMENT) {
9137 let has_eq = self.consume_token(&Token::Eq);
9138 let comment = self.parse_comment_value()?;
9139 Some(if has_eq {
9140 CommentDef::WithEq(comment)
9141 } else {
9142 CommentDef::WithoutEq(comment)
9143 })
9144 } else {
9145 None
9146 };
9147 Ok(comment)
9148 }
9149
9150 pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9152 let next_token = self.next_token();
9153 let value = match next_token.token {
9154 Token::SingleQuotedString(str) => str,
9155 Token::DollarQuotedString(str) => str.value,
9156 _ => self.expected("string literal", next_token)?,
9157 };
9158 Ok(value)
9159 }
9160
9161 pub fn parse_optional_procedure_parameters(
9163 &mut self,
9164 ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9165 let mut params = vec![];
9166 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9167 return Ok(Some(params));
9168 }
9169 loop {
9170 if let Token::Word(_) = &self.peek_token_ref().token {
9171 params.push(self.parse_procedure_param()?)
9172 }
9173 let comma = self.consume_token(&Token::Comma);
9174 if self.consume_token(&Token::RParen) {
9175 break;
9177 } else if !comma {
9178 return self.expected_ref(
9179 "',' or ')' after parameter definition",
9180 self.peek_token_ref(),
9181 );
9182 }
9183 }
9184 Ok(Some(params))
9185 }
9186
9187 pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9189 let mut columns = vec![];
9190 let mut constraints = vec![];
9191 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9192 return Ok((columns, constraints));
9193 }
9194
9195 loop {
9196 if let Some(constraint) = self.parse_optional_table_constraint()? {
9197 constraints.push(constraint);
9198 } else if let Token::Word(_) = &self.peek_token_ref().token {
9199 columns.push(self.parse_column_def()?);
9200 } else {
9201 return self.expected_ref(
9202 "column name or constraint definition",
9203 self.peek_token_ref(),
9204 );
9205 }
9206
9207 let comma = self.consume_token(&Token::Comma);
9208 let rparen = self.peek_token_ref().token == Token::RParen;
9209
9210 if !comma && !rparen {
9211 return self
9212 .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9213 };
9214
9215 if rparen
9216 && (!comma
9217 || self.dialect.supports_column_definition_trailing_commas()
9218 || self.options.trailing_commas)
9219 {
9220 let _ = self.consume_token(&Token::RParen);
9221 break;
9222 }
9223 }
9224
9225 Ok((columns, constraints))
9226 }
9227
9228 pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9230 let mode = if self.parse_keyword(Keyword::IN) {
9231 Some(ArgMode::In)
9232 } else if self.parse_keyword(Keyword::OUT) {
9233 Some(ArgMode::Out)
9234 } else if self.parse_keyword(Keyword::INOUT) {
9235 Some(ArgMode::InOut)
9236 } else {
9237 None
9238 };
9239 let name = self.parse_identifier()?;
9240 let data_type = self.parse_data_type()?;
9241 let default = if self.consume_token(&Token::Eq) {
9242 Some(self.parse_expr()?)
9243 } else {
9244 None
9245 };
9246
9247 Ok(ProcedureParam {
9248 name,
9249 data_type,
9250 mode,
9251 default,
9252 })
9253 }
9254
9255 pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9257 self.parse_column_def_inner(false)
9258 }
9259
9260 fn parse_column_def_inner(
9261 &mut self,
9262 optional_data_type: bool,
9263 ) -> Result<ColumnDef, ParserError> {
9264 let col_name = self.parse_identifier()?;
9265 let data_type = if self.is_column_type_sqlite_unspecified() {
9266 DataType::Unspecified
9267 } else if optional_data_type {
9268 self.maybe_parse(|parser| parser.parse_data_type())?
9269 .unwrap_or(DataType::Unspecified)
9270 } else {
9271 self.parse_data_type()?
9272 };
9273 let mut options = vec![];
9274 loop {
9275 if self.parse_keyword(Keyword::CONSTRAINT) {
9276 let name = Some(self.parse_identifier()?);
9277 if let Some(option) = self.parse_optional_column_option()? {
9278 options.push(ColumnOptionDef { name, option });
9279 } else {
9280 return self.expected_ref(
9281 "constraint details after CONSTRAINT <name>",
9282 self.peek_token_ref(),
9283 );
9284 }
9285 } else if let Some(option) = self.parse_optional_column_option()? {
9286 options.push(ColumnOptionDef { name: None, option });
9287 } else {
9288 break;
9289 };
9290 }
9291 Ok(ColumnDef {
9292 name: col_name,
9293 data_type,
9294 options,
9295 })
9296 }
9297
9298 fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9299 if dialect_of!(self is SQLiteDialect) {
9300 match &self.peek_token_ref().token {
9301 Token::Word(word) => matches!(
9302 word.keyword,
9303 Keyword::CONSTRAINT
9304 | Keyword::PRIMARY
9305 | Keyword::NOT
9306 | Keyword::UNIQUE
9307 | Keyword::CHECK
9308 | Keyword::DEFAULT
9309 | Keyword::COLLATE
9310 | Keyword::REFERENCES
9311 | Keyword::GENERATED
9312 | Keyword::AS
9313 ),
9314 _ => true, }
9316 } else {
9317 false
9318 }
9319 }
9320
9321 pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9323 if let Some(option) = self.dialect.parse_column_option(self)? {
9324 return option;
9325 }
9326
9327 self.with_state(
9328 ColumnDefinition,
9329 |parser| -> Result<Option<ColumnOption>, ParserError> {
9330 parser.parse_optional_column_option_inner()
9331 },
9332 )
9333 }
9334
9335 fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9336 if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9337 Ok(Some(ColumnOption::CharacterSet(
9338 self.parse_object_name(false)?,
9339 )))
9340 } else if self.parse_keywords(&[Keyword::COLLATE]) {
9341 Ok(Some(ColumnOption::Collation(
9342 self.parse_object_name(false)?,
9343 )))
9344 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9345 Ok(Some(ColumnOption::NotNull))
9346 } else if self.parse_keywords(&[Keyword::COMMENT]) {
9347 Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9348 } else if self.parse_keyword(Keyword::NULL) {
9349 Ok(Some(ColumnOption::Null))
9350 } else if self.parse_keyword(Keyword::DEFAULT) {
9351 Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9352 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
9353 && self.parse_keyword(Keyword::STORAGE)
9354 {
9355 Ok(Some(ColumnOption::Storage(self.parse_column_storage()?)))
9356 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9357 && self.parse_keyword(Keyword::MATERIALIZED)
9358 {
9359 Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9360 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9361 && self.parse_keyword(Keyword::ALIAS)
9362 {
9363 Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9364 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9365 && self.parse_keyword(Keyword::EPHEMERAL)
9366 {
9367 if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9370 Ok(Some(ColumnOption::Ephemeral(None)))
9371 } else {
9372 Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9373 }
9374 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9375 let characteristics = self.parse_constraint_characteristics()?;
9376 Ok(Some(
9377 PrimaryKeyConstraint {
9378 name: None,
9379 index_name: None,
9380 index_type: None,
9381 columns: vec![],
9382 include: vec![],
9383 index_options: vec![],
9384 characteristics,
9385 }
9386 .into(),
9387 ))
9388 } else if self.parse_keyword(Keyword::UNIQUE) {
9389 let index_type_display =
9390 if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9391 KeyOrIndexDisplay::Key
9392 } else {
9393 KeyOrIndexDisplay::None
9394 };
9395 let characteristics = self.parse_constraint_characteristics()?;
9396 Ok(Some(
9397 UniqueConstraint {
9398 name: None,
9399 index_name: None,
9400 index_type_display,
9401 index_type: None,
9402 columns: vec![],
9403 include: vec![],
9404 index_options: vec![],
9405 characteristics,
9406 nulls_distinct: NullsDistinctOption::None,
9407 }
9408 .into(),
9409 ))
9410 } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9411 let characteristics = self.parse_constraint_characteristics()?;
9414 Ok(Some(
9415 PrimaryKeyConstraint {
9416 name: None,
9417 index_name: None,
9418 index_type: None,
9419 columns: vec![],
9420 include: vec![],
9421 index_options: vec![],
9422 characteristics,
9423 }
9424 .into(),
9425 ))
9426 } else if self.parse_keyword(Keyword::REFERENCES) {
9427 let foreign_table = self.parse_object_name(false)?;
9428 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9431 let mut match_kind = None;
9432 let mut on_delete = None;
9433 let mut on_update = None;
9434 loop {
9435 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9436 match_kind = Some(self.parse_match_kind()?);
9437 } else if on_delete.is_none()
9438 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9439 {
9440 on_delete = Some(self.parse_referential_action()?);
9441 } else if on_update.is_none()
9442 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9443 {
9444 on_update = Some(self.parse_referential_action()?);
9445 } else {
9446 break;
9447 }
9448 }
9449 let characteristics = self.parse_constraint_characteristics()?;
9450
9451 Ok(Some(
9452 ForeignKeyConstraint {
9453 name: None, index_name: None, columns: vec![], foreign_table,
9457 referred_columns,
9458 on_delete,
9459 on_update,
9460 match_kind,
9461 characteristics,
9462 }
9463 .into(),
9464 ))
9465 } else if self.parse_keyword(Keyword::CHECK) {
9466 self.expect_token(&Token::LParen)?;
9467 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9469 self.expect_token(&Token::RParen)?;
9470
9471 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9472 Some(true)
9473 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9474 Some(false)
9475 } else {
9476 None
9477 };
9478
9479 Ok(Some(
9480 CheckConstraint {
9481 name: None, expr: Box::new(expr),
9483 enforced,
9484 }
9485 .into(),
9486 ))
9487 } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9488 && dialect_of!(self is MySqlDialect | GenericDialect)
9489 {
9490 Ok(Some(ColumnOption::DialectSpecific(vec![
9492 Token::make_keyword("AUTO_INCREMENT"),
9493 ])))
9494 } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9495 && dialect_of!(self is SQLiteDialect | GenericDialect)
9496 {
9497 Ok(Some(ColumnOption::DialectSpecific(vec![
9499 Token::make_keyword("AUTOINCREMENT"),
9500 ])))
9501 } else if self.parse_keyword(Keyword::ASC)
9502 && self.dialect.supports_asc_desc_in_column_definition()
9503 {
9504 Ok(Some(ColumnOption::DialectSpecific(vec![
9506 Token::make_keyword("ASC"),
9507 ])))
9508 } else if self.parse_keyword(Keyword::DESC)
9509 && self.dialect.supports_asc_desc_in_column_definition()
9510 {
9511 Ok(Some(ColumnOption::DialectSpecific(vec![
9513 Token::make_keyword("DESC"),
9514 ])))
9515 } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9516 && dialect_of!(self is MySqlDialect | GenericDialect)
9517 {
9518 let expr = self.parse_expr()?;
9519 Ok(Some(ColumnOption::OnUpdate(expr)))
9520 } else if self.parse_keyword(Keyword::GENERATED) {
9521 self.parse_optional_column_option_generated()
9522 } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9523 && self.parse_keyword(Keyword::OPTIONS)
9524 {
9525 self.prev_token();
9526 Ok(Some(ColumnOption::Options(
9527 self.parse_options(Keyword::OPTIONS)?,
9528 )))
9529 } else if self.parse_keyword(Keyword::AS)
9530 && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9531 {
9532 self.parse_optional_column_option_as()
9533 } else if self.parse_keyword(Keyword::SRID)
9534 && dialect_of!(self is MySqlDialect | GenericDialect)
9535 {
9536 Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9537 } else if self.parse_keyword(Keyword::IDENTITY)
9538 && dialect_of!(self is MsSqlDialect | GenericDialect)
9539 {
9540 let parameters = if self.consume_token(&Token::LParen) {
9541 let seed = self.parse_number()?;
9542 self.expect_token(&Token::Comma)?;
9543 let increment = self.parse_number()?;
9544 self.expect_token(&Token::RParen)?;
9545
9546 Some(IdentityPropertyFormatKind::FunctionCall(
9547 IdentityParameters { seed, increment },
9548 ))
9549 } else {
9550 None
9551 };
9552 Ok(Some(ColumnOption::Identity(
9553 IdentityPropertyKind::Identity(IdentityProperty {
9554 parameters,
9555 order: None,
9556 }),
9557 )))
9558 } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9559 && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9560 {
9561 Ok(Some(ColumnOption::OnConflict(
9563 self.expect_one_of_keywords(&[
9564 Keyword::ROLLBACK,
9565 Keyword::ABORT,
9566 Keyword::FAIL,
9567 Keyword::IGNORE,
9568 Keyword::REPLACE,
9569 ])?,
9570 )))
9571 } else if self.parse_keyword(Keyword::INVISIBLE) {
9572 Ok(Some(ColumnOption::Invisible))
9573 } else {
9574 Ok(None)
9575 }
9576 }
9577
9578 pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9579 let name = self.parse_object_name(false)?;
9580 self.expect_token(&Token::Eq)?;
9581 let value = self.parse_literal_string()?;
9582
9583 Ok(Tag::new(name, value))
9584 }
9585
9586 fn parse_optional_column_option_generated(
9587 &mut self,
9588 ) -> Result<Option<ColumnOption>, ParserError> {
9589 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9590 let mut sequence_options = vec![];
9591 if self.expect_token(&Token::LParen).is_ok() {
9592 sequence_options = self.parse_create_sequence_options()?;
9593 self.expect_token(&Token::RParen)?;
9594 }
9595 Ok(Some(ColumnOption::Generated {
9596 generated_as: GeneratedAs::Always,
9597 sequence_options: Some(sequence_options),
9598 generation_expr: None,
9599 generation_expr_mode: None,
9600 generated_keyword: true,
9601 }))
9602 } else if self.parse_keywords(&[
9603 Keyword::BY,
9604 Keyword::DEFAULT,
9605 Keyword::AS,
9606 Keyword::IDENTITY,
9607 ]) {
9608 let mut sequence_options = vec![];
9609 if self.expect_token(&Token::LParen).is_ok() {
9610 sequence_options = self.parse_create_sequence_options()?;
9611 self.expect_token(&Token::RParen)?;
9612 }
9613 Ok(Some(ColumnOption::Generated {
9614 generated_as: GeneratedAs::ByDefault,
9615 sequence_options: Some(sequence_options),
9616 generation_expr: None,
9617 generation_expr_mode: None,
9618 generated_keyword: true,
9619 }))
9620 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9621 if self.expect_token(&Token::LParen).is_ok() {
9622 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9623 self.expect_token(&Token::RParen)?;
9624 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9625 Ok((
9626 GeneratedAs::ExpStored,
9627 Some(GeneratedExpressionMode::Stored),
9628 ))
9629 } else if dialect_of!(self is PostgreSqlDialect) {
9630 self.expected_ref("STORED", self.peek_token_ref())
9632 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9633 Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9634 } else {
9635 Ok((GeneratedAs::Always, None))
9636 }?;
9637
9638 Ok(Some(ColumnOption::Generated {
9639 generated_as: gen_as,
9640 sequence_options: None,
9641 generation_expr: Some(expr),
9642 generation_expr_mode: expr_mode,
9643 generated_keyword: true,
9644 }))
9645 } else {
9646 Ok(None)
9647 }
9648 } else {
9649 Ok(None)
9650 }
9651 }
9652
9653 fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9654 self.expect_token(&Token::LParen)?;
9656 let expr = self.parse_expr()?;
9657 self.expect_token(&Token::RParen)?;
9658
9659 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9660 (
9661 GeneratedAs::ExpStored,
9662 Some(GeneratedExpressionMode::Stored),
9663 )
9664 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9665 (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9666 } else {
9667 (GeneratedAs::Always, None)
9668 };
9669
9670 Ok(Some(ColumnOption::Generated {
9671 generated_as: gen_as,
9672 sequence_options: None,
9673 generation_expr: Some(expr),
9674 generation_expr_mode: expr_mode,
9675 generated_keyword: false,
9676 }))
9677 }
9678
9679 pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9681 let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9682 && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9683 {
9684 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9685
9686 let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9687 self.expect_token(&Token::LParen)?;
9688 let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9689 self.expect_token(&Token::RParen)?;
9690 Some(sorted_by_columns)
9691 } else {
9692 None
9693 };
9694
9695 self.expect_keyword_is(Keyword::INTO)?;
9696 let num_buckets = self.parse_number_value()?.value;
9697 self.expect_keyword_is(Keyword::BUCKETS)?;
9698 Some(ClusteredBy {
9699 columns,
9700 sorted_by,
9701 num_buckets,
9702 })
9703 } else {
9704 None
9705 };
9706 Ok(clustered_by)
9707 }
9708
9709 pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9713 if self.parse_keyword(Keyword::RESTRICT) {
9714 Ok(ReferentialAction::Restrict)
9715 } else if self.parse_keyword(Keyword::CASCADE) {
9716 Ok(ReferentialAction::Cascade)
9717 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9718 Ok(ReferentialAction::SetNull)
9719 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9720 Ok(ReferentialAction::NoAction)
9721 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9722 Ok(ReferentialAction::SetDefault)
9723 } else {
9724 self.expected_ref(
9725 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9726 self.peek_token_ref(),
9727 )
9728 }
9729 }
9730
9731 pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9733 if self.parse_keyword(Keyword::FULL) {
9734 Ok(ConstraintReferenceMatchKind::Full)
9735 } else if self.parse_keyword(Keyword::PARTIAL) {
9736 Ok(ConstraintReferenceMatchKind::Partial)
9737 } else if self.parse_keyword(Keyword::SIMPLE) {
9738 Ok(ConstraintReferenceMatchKind::Simple)
9739 } else {
9740 self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9741 }
9742 }
9743
9744 fn parse_constraint_using_index(
9747 &mut self,
9748 name: Option<Ident>,
9749 ) -> Result<ConstraintUsingIndex, ParserError> {
9750 let index_name = self.parse_identifier()?;
9751 let characteristics = self.parse_constraint_characteristics()?;
9752 Ok(ConstraintUsingIndex {
9753 name,
9754 index_name,
9755 characteristics,
9756 })
9757 }
9758
9759 pub fn parse_constraint_characteristics(
9761 &mut self,
9762 ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
9763 let mut cc = ConstraintCharacteristics::default();
9764
9765 loop {
9766 if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
9767 {
9768 cc.deferrable = Some(false);
9769 } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
9770 cc.deferrable = Some(true);
9771 } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
9772 if self.parse_keyword(Keyword::DEFERRED) {
9773 cc.initially = Some(DeferrableInitial::Deferred);
9774 } else if self.parse_keyword(Keyword::IMMEDIATE) {
9775 cc.initially = Some(DeferrableInitial::Immediate);
9776 } else {
9777 self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
9778 }
9779 } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
9780 cc.enforced = Some(true);
9781 } else if cc.enforced.is_none()
9782 && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
9783 {
9784 cc.enforced = Some(false);
9785 } else {
9786 break;
9787 }
9788 }
9789
9790 if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
9791 Ok(Some(cc))
9792 } else {
9793 Ok(None)
9794 }
9795 }
9796
9797 pub fn parse_optional_table_constraint(
9799 &mut self,
9800 ) -> Result<Option<TableConstraint>, ParserError> {
9801 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
9802 if self.dialect.supports_constraint_keyword_without_name()
9803 && self
9804 .peek_one_of_keywords(&[
9805 Keyword::CHECK,
9806 Keyword::PRIMARY,
9807 Keyword::UNIQUE,
9808 Keyword::FOREIGN,
9809 ])
9810 .is_some()
9811 {
9812 None
9813 } else {
9814 Some(self.parse_identifier()?)
9815 }
9816 } else {
9817 None
9818 };
9819
9820 let next_token = self.next_token();
9821 match next_token.token {
9822 Token::Word(w) if w.keyword == Keyword::UNIQUE => {
9823 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9826 return Ok(Some(TableConstraint::UniqueUsingIndex(
9827 self.parse_constraint_using_index(name)?,
9828 )));
9829 }
9830
9831 let index_type_display = self.parse_index_type_display();
9832 if !dialect_of!(self is GenericDialect | MySqlDialect)
9833 && !index_type_display.is_none()
9834 {
9835 return self.expected_ref(
9836 "`index_name` or `(column_name [, ...])`",
9837 self.peek_token_ref(),
9838 );
9839 }
9840
9841 let nulls_distinct = self.parse_optional_nulls_distinct()?;
9842
9843 let index_name = self.parse_optional_ident()?;
9845 let index_type = self.parse_optional_using_then_index_type()?;
9846
9847 let columns = self.parse_parenthesized_index_column_list()?;
9848 let include = self.parse_optional_include_columns()?;
9849 let index_options = self.parse_index_options()?;
9850 let characteristics = self.parse_constraint_characteristics()?;
9851 Ok(Some(
9852 UniqueConstraint {
9853 name,
9854 index_name,
9855 index_type_display,
9856 index_type,
9857 columns,
9858 include,
9859 index_options,
9860 characteristics,
9861 nulls_distinct,
9862 }
9863 .into(),
9864 ))
9865 }
9866 Token::Word(w) if w.keyword == Keyword::PRIMARY => {
9867 self.expect_keyword_is(Keyword::KEY)?;
9869
9870 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
9873 return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
9874 self.parse_constraint_using_index(name)?,
9875 )));
9876 }
9877
9878 let index_name = self.parse_optional_ident()?;
9880 let index_type = self.parse_optional_using_then_index_type()?;
9881
9882 let columns = self.parse_parenthesized_index_column_list()?;
9883 let include = self.parse_optional_include_columns()?;
9884 let index_options = self.parse_index_options()?;
9885 let characteristics = self.parse_constraint_characteristics()?;
9886 Ok(Some(
9887 PrimaryKeyConstraint {
9888 name,
9889 index_name,
9890 index_type,
9891 columns,
9892 include,
9893 index_options,
9894 characteristics,
9895 }
9896 .into(),
9897 ))
9898 }
9899 Token::Word(w) if w.keyword == Keyword::FOREIGN => {
9900 self.expect_keyword_is(Keyword::KEY)?;
9901 let index_name = self.parse_optional_ident()?;
9902 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9903 self.expect_keyword_is(Keyword::REFERENCES)?;
9904 let foreign_table = self.parse_object_name(false)?;
9905 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9906 let mut match_kind = None;
9907 let mut on_delete = None;
9908 let mut on_update = None;
9909 loop {
9910 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9911 match_kind = Some(self.parse_match_kind()?);
9912 } else if on_delete.is_none()
9913 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9914 {
9915 on_delete = Some(self.parse_referential_action()?);
9916 } else if on_update.is_none()
9917 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9918 {
9919 on_update = Some(self.parse_referential_action()?);
9920 } else {
9921 break;
9922 }
9923 }
9924
9925 let characteristics = self.parse_constraint_characteristics()?;
9926
9927 Ok(Some(
9928 ForeignKeyConstraint {
9929 name,
9930 index_name,
9931 columns,
9932 foreign_table,
9933 referred_columns,
9934 on_delete,
9935 on_update,
9936 match_kind,
9937 characteristics,
9938 }
9939 .into(),
9940 ))
9941 }
9942 Token::Word(w) if w.keyword == Keyword::CHECK => {
9943 self.expect_token(&Token::LParen)?;
9944 let expr = Box::new(self.parse_expr()?);
9945 self.expect_token(&Token::RParen)?;
9946
9947 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9948 Some(true)
9949 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9950 Some(false)
9951 } else {
9952 None
9953 };
9954
9955 Ok(Some(
9956 CheckConstraint {
9957 name,
9958 expr,
9959 enforced,
9960 }
9961 .into(),
9962 ))
9963 }
9964 Token::Word(w)
9965 if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
9966 && dialect_of!(self is GenericDialect | MySqlDialect)
9967 && name.is_none() =>
9968 {
9969 let display_as_key = w.keyword == Keyword::KEY;
9970
9971 let name = match &self.peek_token_ref().token {
9972 Token::Word(word) if word.keyword == Keyword::USING => None,
9973 _ => self.parse_optional_ident()?,
9974 };
9975
9976 let index_type = self.parse_optional_using_then_index_type()?;
9977 let columns = self.parse_parenthesized_index_column_list()?;
9978 let index_options = self.parse_index_options()?;
9979
9980 Ok(Some(
9981 IndexConstraint {
9982 display_as_key,
9983 name,
9984 index_type,
9985 columns,
9986 index_options,
9987 }
9988 .into(),
9989 ))
9990 }
9991 Token::Word(w)
9992 if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
9993 && dialect_of!(self is GenericDialect | MySqlDialect) =>
9994 {
9995 if let Some(name) = name {
9996 return self.expected(
9997 "FULLTEXT or SPATIAL option without constraint name",
9998 TokenWithSpan {
9999 token: Token::make_keyword(&name.to_string()),
10000 span: next_token.span,
10001 },
10002 );
10003 }
10004
10005 let fulltext = w.keyword == Keyword::FULLTEXT;
10006
10007 let index_type_display = self.parse_index_type_display();
10008
10009 let opt_index_name = self.parse_optional_ident()?;
10010
10011 let columns = self.parse_parenthesized_index_column_list()?;
10012
10013 Ok(Some(
10014 FullTextOrSpatialConstraint {
10015 fulltext,
10016 index_type_display,
10017 opt_index_name,
10018 columns,
10019 }
10020 .into(),
10021 ))
10022 }
10023 _ => {
10024 if name.is_some() {
10025 self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
10026 } else {
10027 self.prev_token();
10028 Ok(None)
10029 }
10030 }
10031 }
10032 }
10033
10034 fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10035 Ok(if self.parse_keyword(Keyword::NULLS) {
10036 let not = self.parse_keyword(Keyword::NOT);
10037 self.expect_keyword_is(Keyword::DISTINCT)?;
10038 if not {
10039 NullsDistinctOption::NotDistinct
10040 } else {
10041 NullsDistinctOption::Distinct
10042 }
10043 } else {
10044 NullsDistinctOption::None
10045 })
10046 }
10047
10048 pub fn maybe_parse_options(
10050 &mut self,
10051 keyword: Keyword,
10052 ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10053 if let Token::Word(word) = &self.peek_token_ref().token {
10054 if word.keyword == keyword {
10055 return Ok(Some(self.parse_options(keyword)?));
10056 }
10057 };
10058 Ok(None)
10059 }
10060
10061 pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10063 if self.parse_keyword(keyword) {
10064 self.expect_token(&Token::LParen)?;
10065 let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10066 self.expect_token(&Token::RParen)?;
10067 Ok(options)
10068 } else {
10069 Ok(vec![])
10070 }
10071 }
10072
10073 pub fn parse_options_with_keywords(
10075 &mut self,
10076 keywords: &[Keyword],
10077 ) -> Result<Vec<SqlOption>, ParserError> {
10078 if self.parse_keywords(keywords) {
10079 self.expect_token(&Token::LParen)?;
10080 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10081 self.expect_token(&Token::RParen)?;
10082 Ok(options)
10083 } else {
10084 Ok(vec![])
10085 }
10086 }
10087
10088 pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10090 Ok(if self.parse_keyword(Keyword::BTREE) {
10091 IndexType::BTree
10092 } else if self.parse_keyword(Keyword::HASH) {
10093 IndexType::Hash
10094 } else if self.parse_keyword(Keyword::GIN) {
10095 IndexType::GIN
10096 } else if self.parse_keyword(Keyword::GIST) {
10097 IndexType::GiST
10098 } else if self.parse_keyword(Keyword::SPGIST) {
10099 IndexType::SPGiST
10100 } else if self.parse_keyword(Keyword::BRIN) {
10101 IndexType::BRIN
10102 } else if self.parse_keyword(Keyword::BLOOM) {
10103 IndexType::Bloom
10104 } else {
10105 IndexType::Custom(self.parse_identifier()?)
10106 })
10107 }
10108
10109 pub fn parse_optional_using_then_index_type(
10116 &mut self,
10117 ) -> Result<Option<IndexType>, ParserError> {
10118 if self.parse_keyword(Keyword::USING) {
10119 Ok(Some(self.parse_index_type()?))
10120 } else {
10121 Ok(None)
10122 }
10123 }
10124
10125 pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10129 self.maybe_parse(|parser| parser.parse_identifier())
10130 }
10131
10132 #[must_use]
10133 pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10135 if self.parse_keyword(Keyword::KEY) {
10136 KeyOrIndexDisplay::Key
10137 } else if self.parse_keyword(Keyword::INDEX) {
10138 KeyOrIndexDisplay::Index
10139 } else {
10140 KeyOrIndexDisplay::None
10141 }
10142 }
10143
10144 pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10146 if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10147 Ok(Some(IndexOption::Using(index_type)))
10148 } else if self.parse_keyword(Keyword::COMMENT) {
10149 let s = self.parse_literal_string()?;
10150 Ok(Some(IndexOption::Comment(s)))
10151 } else {
10152 Ok(None)
10153 }
10154 }
10155
10156 pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10158 let mut options = Vec::new();
10159
10160 loop {
10161 match self.parse_optional_index_option()? {
10162 Some(index_option) => options.push(index_option),
10163 None => return Ok(options),
10164 }
10165 }
10166 }
10167
10168 pub fn parse_optional_include_columns(&mut self) -> Result<Vec<Ident>, ParserError> {
10170 if self.parse_keyword(Keyword::INCLUDE) {
10171 self.expect_token(&Token::LParen)?;
10172 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
10173 self.expect_token(&Token::RParen)?;
10174 Ok(columns)
10175 } else {
10176 Ok(vec![])
10177 }
10178 }
10179
10180 pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10182 let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10183
10184 match &self.peek_token_ref().token {
10185 Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10186 Ok(SqlOption::Ident(self.parse_identifier()?))
10187 }
10188 Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10189 self.parse_option_partition()
10190 }
10191 Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10192 self.parse_option_clustered()
10193 }
10194 _ => {
10195 let name = self.parse_identifier()?;
10196 self.expect_token(&Token::Eq)?;
10197 let value = self.parse_expr()?;
10198
10199 Ok(SqlOption::KeyValue { key: name, value })
10200 }
10201 }
10202 }
10203
10204 pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10206 if self.parse_keywords(&[
10207 Keyword::CLUSTERED,
10208 Keyword::COLUMNSTORE,
10209 Keyword::INDEX,
10210 Keyword::ORDER,
10211 ]) {
10212 Ok(SqlOption::Clustered(
10213 TableOptionsClustered::ColumnstoreIndexOrder(
10214 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10215 ),
10216 ))
10217 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10218 Ok(SqlOption::Clustered(
10219 TableOptionsClustered::ColumnstoreIndex,
10220 ))
10221 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10222 self.expect_token(&Token::LParen)?;
10223
10224 let columns = self.parse_comma_separated(|p| {
10225 let name = p.parse_identifier()?;
10226 let asc = p.parse_asc_desc();
10227
10228 Ok(ClusteredIndex { name, asc })
10229 })?;
10230
10231 self.expect_token(&Token::RParen)?;
10232
10233 Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10234 } else {
10235 Err(ParserError::ParserError(
10236 "invalid CLUSTERED sequence".to_string(),
10237 ))
10238 }
10239 }
10240
10241 pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10243 self.expect_keyword_is(Keyword::PARTITION)?;
10244 self.expect_token(&Token::LParen)?;
10245 let column_name = self.parse_identifier()?;
10246
10247 self.expect_keyword_is(Keyword::RANGE)?;
10248 let range_direction = if self.parse_keyword(Keyword::LEFT) {
10249 Some(PartitionRangeDirection::Left)
10250 } else if self.parse_keyword(Keyword::RIGHT) {
10251 Some(PartitionRangeDirection::Right)
10252 } else {
10253 None
10254 };
10255
10256 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10257 self.expect_token(&Token::LParen)?;
10258
10259 let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10260
10261 self.expect_token(&Token::RParen)?;
10262 self.expect_token(&Token::RParen)?;
10263
10264 Ok(SqlOption::Partition {
10265 column_name,
10266 range_direction,
10267 for_values,
10268 })
10269 }
10270
10271 pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10273 self.expect_token(&Token::LParen)?;
10274 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10275 self.expect_token(&Token::RParen)?;
10276 Ok(Partition::Partitions(partitions))
10277 }
10278
10279 pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10281 self.expect_token(&Token::LParen)?;
10282 self.expect_keyword_is(Keyword::SELECT)?;
10283 let projection = self.parse_projection()?;
10284 let group_by = self.parse_optional_group_by()?;
10285 let order_by = self.parse_optional_order_by()?;
10286 self.expect_token(&Token::RParen)?;
10287 Ok(ProjectionSelect {
10288 projection,
10289 group_by,
10290 order_by,
10291 })
10292 }
10293 pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10295 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10296 let name = self.parse_identifier()?;
10297 let query = self.parse_projection_select()?;
10298 Ok(AlterTableOperation::AddProjection {
10299 if_not_exists,
10300 name,
10301 select: query,
10302 })
10303 }
10304
10305 fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10309 self.expect_keyword_is(Keyword::ALTER)?;
10310 self.expect_keyword_is(Keyword::SORTKEY)?;
10311 self.expect_token(&Token::LParen)?;
10312 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10313 self.expect_token(&Token::RParen)?;
10314 Ok(AlterTableOperation::AlterSortKey { columns })
10315 }
10316
10317 pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10319 let operation = if self.parse_keyword(Keyword::ADD) {
10320 if let Some(constraint) = self.parse_optional_table_constraint()? {
10321 let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10322 AlterTableOperation::AddConstraint {
10323 constraint,
10324 not_valid,
10325 }
10326 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10327 && self.parse_keyword(Keyword::PROJECTION)
10328 {
10329 return self.parse_alter_table_add_projection();
10330 } else {
10331 let if_not_exists =
10332 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10333 let mut new_partitions = vec![];
10334 loop {
10335 if self.parse_keyword(Keyword::PARTITION) {
10336 new_partitions.push(self.parse_partition()?);
10337 } else {
10338 break;
10339 }
10340 }
10341 if !new_partitions.is_empty() {
10342 AlterTableOperation::AddPartitions {
10343 if_not_exists,
10344 new_partitions,
10345 }
10346 } else {
10347 let column_keyword = self.parse_keyword(Keyword::COLUMN);
10348
10349 let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10350 {
10351 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10352 || if_not_exists
10353 } else {
10354 false
10355 };
10356
10357 let column_def = self.parse_column_def()?;
10358
10359 let column_position = self.parse_column_position()?;
10360
10361 AlterTableOperation::AddColumn {
10362 column_keyword,
10363 if_not_exists,
10364 column_def,
10365 column_position,
10366 }
10367 }
10368 }
10369 } else if self.parse_keyword(Keyword::RENAME) {
10370 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10371 let old_name = self.parse_identifier()?;
10372 self.expect_keyword_is(Keyword::TO)?;
10373 let new_name = self.parse_identifier()?;
10374 AlterTableOperation::RenameConstraint { old_name, new_name }
10375 } else if self.parse_keyword(Keyword::TO) {
10376 let table_name = self.parse_object_name(false)?;
10377 AlterTableOperation::RenameTable {
10378 table_name: RenameTableNameKind::To(table_name),
10379 }
10380 } else if self.parse_keyword(Keyword::AS) {
10381 let table_name = self.parse_object_name(false)?;
10382 AlterTableOperation::RenameTable {
10383 table_name: RenameTableNameKind::As(table_name),
10384 }
10385 } else {
10386 let _ = self.parse_keyword(Keyword::COLUMN); let old_column_name = self.parse_identifier()?;
10388 self.expect_keyword_is(Keyword::TO)?;
10389 let new_column_name = self.parse_identifier()?;
10390 AlterTableOperation::RenameColumn {
10391 old_column_name,
10392 new_column_name,
10393 }
10394 }
10395 } else if self.parse_keyword(Keyword::DISABLE) {
10396 if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10397 AlterTableOperation::DisableRowLevelSecurity {}
10398 } else if self.parse_keyword(Keyword::RULE) {
10399 let name = self.parse_identifier()?;
10400 AlterTableOperation::DisableRule { name }
10401 } else if self.parse_keyword(Keyword::TRIGGER) {
10402 let name = self.parse_identifier()?;
10403 AlterTableOperation::DisableTrigger { name }
10404 } else {
10405 return self.expected_ref(
10406 "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10407 self.peek_token_ref(),
10408 );
10409 }
10410 } else if self.parse_keyword(Keyword::ENABLE) {
10411 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10412 let name = self.parse_identifier()?;
10413 AlterTableOperation::EnableAlwaysRule { name }
10414 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10415 let name = self.parse_identifier()?;
10416 AlterTableOperation::EnableAlwaysTrigger { name }
10417 } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10418 AlterTableOperation::EnableRowLevelSecurity {}
10419 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10420 let name = self.parse_identifier()?;
10421 AlterTableOperation::EnableReplicaRule { name }
10422 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10423 let name = self.parse_identifier()?;
10424 AlterTableOperation::EnableReplicaTrigger { name }
10425 } else if self.parse_keyword(Keyword::RULE) {
10426 let name = self.parse_identifier()?;
10427 AlterTableOperation::EnableRule { name }
10428 } else if self.parse_keyword(Keyword::TRIGGER) {
10429 let name = self.parse_identifier()?;
10430 AlterTableOperation::EnableTrigger { name }
10431 } else {
10432 return self.expected_ref(
10433 "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10434 self.peek_token_ref(),
10435 );
10436 }
10437 } else if self.parse_keywords(&[
10438 Keyword::FORCE,
10439 Keyword::ROW,
10440 Keyword::LEVEL,
10441 Keyword::SECURITY,
10442 ]) {
10443 AlterTableOperation::ForceRowLevelSecurity
10444 } else if self.parse_keywords(&[
10445 Keyword::NO,
10446 Keyword::FORCE,
10447 Keyword::ROW,
10448 Keyword::LEVEL,
10449 Keyword::SECURITY,
10450 ]) {
10451 AlterTableOperation::NoForceRowLevelSecurity
10452 } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10453 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10454 {
10455 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10456 let name = self.parse_identifier()?;
10457 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10458 Some(self.parse_identifier()?)
10459 } else {
10460 None
10461 };
10462 AlterTableOperation::ClearProjection {
10463 if_exists,
10464 name,
10465 partition,
10466 }
10467 } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10468 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10469 {
10470 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10471 let name = self.parse_identifier()?;
10472 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10473 Some(self.parse_identifier()?)
10474 } else {
10475 None
10476 };
10477 AlterTableOperation::MaterializeProjection {
10478 if_exists,
10479 name,
10480 partition,
10481 }
10482 } else if self.parse_keyword(Keyword::DROP) {
10483 if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10484 self.expect_token(&Token::LParen)?;
10485 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10486 self.expect_token(&Token::RParen)?;
10487 AlterTableOperation::DropPartitions {
10488 partitions,
10489 if_exists: true,
10490 }
10491 } else if self.parse_keyword(Keyword::PARTITION) {
10492 self.expect_token(&Token::LParen)?;
10493 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10494 self.expect_token(&Token::RParen)?;
10495 AlterTableOperation::DropPartitions {
10496 partitions,
10497 if_exists: false,
10498 }
10499 } else if self.parse_keyword(Keyword::CONSTRAINT) {
10500 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10501 let name = self.parse_identifier()?;
10502 let drop_behavior = self.parse_optional_drop_behavior();
10503 AlterTableOperation::DropConstraint {
10504 if_exists,
10505 name,
10506 drop_behavior,
10507 }
10508 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10509 let drop_behavior = self.parse_optional_drop_behavior();
10510 AlterTableOperation::DropPrimaryKey { drop_behavior }
10511 } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10512 let name = self.parse_identifier()?;
10513 let drop_behavior = self.parse_optional_drop_behavior();
10514 AlterTableOperation::DropForeignKey {
10515 name,
10516 drop_behavior,
10517 }
10518 } else if self.parse_keyword(Keyword::INDEX) {
10519 let name = self.parse_identifier()?;
10520 AlterTableOperation::DropIndex { name }
10521 } else if self.parse_keyword(Keyword::PROJECTION)
10522 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10523 {
10524 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10525 let name = self.parse_identifier()?;
10526 AlterTableOperation::DropProjection { if_exists, name }
10527 } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10528 AlterTableOperation::DropClusteringKey
10529 } else {
10530 let has_column_keyword = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10532 let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10533 self.parse_comma_separated(Parser::parse_identifier)?
10534 } else {
10535 vec![self.parse_identifier()?]
10536 };
10537 let drop_behavior = self.parse_optional_drop_behavior();
10538 AlterTableOperation::DropColumn {
10539 has_column_keyword,
10540 column_names,
10541 if_exists,
10542 drop_behavior,
10543 }
10544 }
10545 } else if self.parse_keyword(Keyword::PARTITION) {
10546 self.expect_token(&Token::LParen)?;
10547 let before = self.parse_comma_separated(Parser::parse_expr)?;
10548 self.expect_token(&Token::RParen)?;
10549 self.expect_keyword_is(Keyword::RENAME)?;
10550 self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10551 self.expect_token(&Token::LParen)?;
10552 let renames = self.parse_comma_separated(Parser::parse_expr)?;
10553 self.expect_token(&Token::RParen)?;
10554 AlterTableOperation::RenamePartitions {
10555 old_partitions: before,
10556 new_partitions: renames,
10557 }
10558 } else if self.parse_keyword(Keyword::CHANGE) {
10559 let _ = self.parse_keyword(Keyword::COLUMN); let old_name = self.parse_identifier()?;
10561 let new_name = self.parse_identifier()?;
10562 let data_type = self.parse_data_type()?;
10563 let mut options = vec![];
10564 while let Some(option) = self.parse_optional_column_option()? {
10565 options.push(option);
10566 }
10567
10568 let column_position = self.parse_column_position()?;
10569
10570 AlterTableOperation::ChangeColumn {
10571 old_name,
10572 new_name,
10573 data_type,
10574 options,
10575 column_position,
10576 }
10577 } else if self.parse_keyword(Keyword::MODIFY) {
10578 let _ = self.parse_keyword(Keyword::COLUMN); let col_name = self.parse_identifier()?;
10580 let data_type = self.parse_data_type()?;
10581 let mut options = vec![];
10582 while let Some(option) = self.parse_optional_column_option()? {
10583 options.push(option);
10584 }
10585
10586 let column_position = self.parse_column_position()?;
10587
10588 AlterTableOperation::ModifyColumn {
10589 col_name,
10590 data_type,
10591 options,
10592 column_position,
10593 }
10594 } else if self.parse_keyword(Keyword::ALTER) {
10595 if self.peek_keyword(Keyword::SORTKEY) {
10596 self.prev_token();
10597 return self.parse_alter_sort_key();
10598 }
10599
10600 let _ = self.parse_keyword(Keyword::COLUMN); let column_name = self.parse_identifier()?;
10602 let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10603
10604 let op: AlterColumnOperation = if self.parse_keywords(&[
10605 Keyword::SET,
10606 Keyword::NOT,
10607 Keyword::NULL,
10608 ]) {
10609 AlterColumnOperation::SetNotNull {}
10610 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10611 AlterColumnOperation::DropNotNull {}
10612 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10613 AlterColumnOperation::SetDefault {
10614 value: self.parse_expr()?,
10615 }
10616 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10617 AlterColumnOperation::DropDefault {}
10618 } else if self.parse_keywords(&[Keyword::SET, Keyword::STORAGE]) {
10619 let storage = self.parse_column_storage()?;
10620 AlterColumnOperation::SetStorage { storage }
10621 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10622 self.parse_set_data_type(true)?
10623 } else if self.parse_keyword(Keyword::TYPE) {
10624 self.parse_set_data_type(false)?
10625 } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10626 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10627 Some(GeneratedAs::Always)
10628 } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10629 Some(GeneratedAs::ByDefault)
10630 } else {
10631 None
10632 };
10633
10634 self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10635
10636 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10637
10638 if self.peek_token_ref().token == Token::LParen {
10639 self.expect_token(&Token::LParen)?;
10640 sequence_options = Some(self.parse_create_sequence_options()?);
10641 self.expect_token(&Token::RParen)?;
10642 }
10643
10644 AlterColumnOperation::AddGenerated {
10645 generated_as,
10646 sequence_options,
10647 }
10648 } else {
10649 let message = if is_postgresql {
10650 "SET/DROP NOT NULL, SET DEFAULT, SET STORAGE, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10651 } else {
10652 "SET/DROP NOT NULL, SET DEFAULT, SET STORAGE, or SET DATA TYPE after ALTER COLUMN"
10653 };
10654
10655 return self.expected_ref(message, self.peek_token_ref());
10656 };
10657 AlterTableOperation::AlterColumn { column_name, op }
10658 } else if self.parse_keyword(Keyword::SWAP) {
10659 self.expect_keyword_is(Keyword::WITH)?;
10660 let table_name = self.parse_object_name(false)?;
10661 AlterTableOperation::SwapWith { table_name }
10662 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10663 && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10664 {
10665 let new_owner = self.parse_owner()?;
10666 AlterTableOperation::OwnerTo { new_owner }
10667 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10668 && self.parse_keyword(Keyword::ATTACH)
10669 {
10670 AlterTableOperation::AttachPartition {
10671 partition: self.parse_part_or_partition()?,
10672 }
10673 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10674 && self.parse_keyword(Keyword::DETACH)
10675 {
10676 AlterTableOperation::DetachPartition {
10677 partition: self.parse_part_or_partition()?,
10678 }
10679 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10680 && self.parse_keyword(Keyword::FREEZE)
10681 {
10682 let partition = self.parse_part_or_partition()?;
10683 let with_name = if self.parse_keyword(Keyword::WITH) {
10684 self.expect_keyword_is(Keyword::NAME)?;
10685 Some(self.parse_identifier()?)
10686 } else {
10687 None
10688 };
10689 AlterTableOperation::FreezePartition {
10690 partition,
10691 with_name,
10692 }
10693 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10694 && self.parse_keyword(Keyword::UNFREEZE)
10695 {
10696 let partition = self.parse_part_or_partition()?;
10697 let with_name = if self.parse_keyword(Keyword::WITH) {
10698 self.expect_keyword_is(Keyword::NAME)?;
10699 Some(self.parse_identifier()?)
10700 } else {
10701 None
10702 };
10703 AlterTableOperation::UnfreezePartition {
10704 partition,
10705 with_name,
10706 }
10707 } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
10708 self.expect_token(&Token::LParen)?;
10709 let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
10710 self.expect_token(&Token::RParen)?;
10711 AlterTableOperation::ClusterBy { exprs }
10712 } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
10713 AlterTableOperation::SuspendRecluster
10714 } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
10715 AlterTableOperation::ResumeRecluster
10716 } else if self.parse_keyword(Keyword::LOCK) {
10717 let equals = self.consume_token(&Token::Eq);
10718 let lock = match self.parse_one_of_keywords(&[
10719 Keyword::DEFAULT,
10720 Keyword::EXCLUSIVE,
10721 Keyword::NONE,
10722 Keyword::SHARED,
10723 ]) {
10724 Some(Keyword::DEFAULT) => AlterTableLock::Default,
10725 Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
10726 Some(Keyword::NONE) => AlterTableLock::None,
10727 Some(Keyword::SHARED) => AlterTableLock::Shared,
10728 _ => self.expected_ref(
10729 "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
10730 self.peek_token_ref(),
10731 )?,
10732 };
10733 AlterTableOperation::Lock { equals, lock }
10734 } else if self.parse_keyword(Keyword::ALGORITHM) {
10735 let equals = self.consume_token(&Token::Eq);
10736 let algorithm = match self.parse_one_of_keywords(&[
10737 Keyword::DEFAULT,
10738 Keyword::INSTANT,
10739 Keyword::INPLACE,
10740 Keyword::COPY,
10741 ]) {
10742 Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
10743 Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
10744 Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
10745 Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
10746 _ => self.expected_ref(
10747 "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
10748 self.peek_token_ref(),
10749 )?,
10750 };
10751 AlterTableOperation::Algorithm { equals, algorithm }
10752 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
10753 let equals = self.consume_token(&Token::Eq);
10754 let value = self.parse_number_value()?;
10755 AlterTableOperation::AutoIncrement { equals, value }
10756 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
10757 let identity = if self.parse_keyword(Keyword::NOTHING) {
10758 ReplicaIdentity::Nothing
10759 } else if self.parse_keyword(Keyword::FULL) {
10760 ReplicaIdentity::Full
10761 } else if self.parse_keyword(Keyword::DEFAULT) {
10762 ReplicaIdentity::Default
10763 } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10764 ReplicaIdentity::Index(self.parse_identifier()?)
10765 } else {
10766 return self.expected_ref(
10767 "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
10768 self.peek_token_ref(),
10769 );
10770 };
10771
10772 AlterTableOperation::ReplicaIdentity { identity }
10773 } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
10774 let name = self.parse_identifier()?;
10775 AlterTableOperation::ValidateConstraint { name }
10776 } else {
10777 let mut options =
10778 self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
10779 if !options.is_empty() {
10780 AlterTableOperation::SetTblProperties {
10781 table_properties: options,
10782 }
10783 } else {
10784 options = self.parse_options(Keyword::SET)?;
10785 if !options.is_empty() {
10786 AlterTableOperation::SetOptionsParens { options }
10787 } else {
10788 return self.expected_ref(
10789 "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
10790 self.peek_token_ref(),
10791 );
10792 }
10793 }
10794 };
10795 Ok(operation)
10796 }
10797
10798 fn parse_column_storage(&mut self) -> Result<AlterColumnStorage, ParserError> {
10799 match self.parse_one_of_keywords(&[
10800 Keyword::PLAIN,
10801 Keyword::EXTERNAL,
10802 Keyword::EXTENDED,
10803 Keyword::MAIN,
10804 Keyword::DEFAULT,
10805 ]) {
10806 Some(Keyword::PLAIN) => Ok(AlterColumnStorage::Plain),
10807 Some(Keyword::EXTERNAL) => Ok(AlterColumnStorage::External),
10808 Some(Keyword::EXTENDED) => Ok(AlterColumnStorage::Extended),
10809 Some(Keyword::MAIN) => Ok(AlterColumnStorage::Main),
10810 Some(Keyword::DEFAULT) => Ok(AlterColumnStorage::Default),
10811 _ => self.expected_ref(
10812 "storage value (PLAIN, EXTERNAL, EXTENDED, MAIN, or DEFAULT)",
10813 self.peek_token_ref(),
10814 ),
10815 }
10816 }
10817
10818 fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
10819 let data_type = self.parse_data_type()?;
10820 let using = if self.dialect.supports_alter_column_type_using()
10821 && self.parse_keyword(Keyword::USING)
10822 {
10823 Some(self.parse_expr()?)
10824 } else {
10825 None
10826 };
10827 Ok(AlterColumnOperation::SetDataType {
10828 data_type,
10829 using,
10830 had_set,
10831 })
10832 }
10833
10834 fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
10835 let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
10836 match keyword {
10837 Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
10838 Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
10839 unexpected_keyword => Err(ParserError::ParserError(
10841 format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
10842 )),
10843 }
10844 }
10845
10846 pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
10848 let object_type = self.expect_one_of_keywords(&[
10849 Keyword::VIEW,
10850 Keyword::TYPE,
10851 Keyword::COLLATION,
10852 Keyword::TABLE,
10853 Keyword::INDEX,
10854 Keyword::FUNCTION,
10855 Keyword::AGGREGATE,
10856 Keyword::ROLE,
10857 Keyword::POLICY,
10858 Keyword::CONNECTOR,
10859 Keyword::ICEBERG,
10860 Keyword::SCHEMA,
10861 Keyword::USER,
10862 Keyword::OPERATOR,
10863 ])?;
10864 match object_type {
10865 Keyword::SCHEMA => {
10866 self.prev_token();
10867 self.prev_token();
10868 self.parse_alter_schema()
10869 }
10870 Keyword::VIEW => self.parse_alter_view(),
10871 Keyword::TYPE => self.parse_alter_type(),
10872 Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
10873 Keyword::TABLE => self.parse_alter_table(false),
10874 Keyword::ICEBERG => {
10875 self.expect_keyword(Keyword::TABLE)?;
10876 self.parse_alter_table(true)
10877 }
10878 Keyword::INDEX => {
10879 let index_name = self.parse_object_name(false)?;
10880 let operation = if self.parse_keyword(Keyword::RENAME) {
10881 if self.parse_keyword(Keyword::TO) {
10882 let index_name = self.parse_object_name(false)?;
10883 AlterIndexOperation::RenameIndex { index_name }
10884 } else {
10885 return self.expected_ref("TO after RENAME", self.peek_token_ref());
10886 }
10887 } else {
10888 return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
10889 };
10890
10891 Ok(Statement::AlterIndex {
10892 name: index_name,
10893 operation,
10894 })
10895 }
10896 Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
10897 Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
10898 Keyword::OPERATOR => {
10899 if self.parse_keyword(Keyword::FAMILY) {
10900 self.parse_alter_operator_family().map(Into::into)
10901 } else if self.parse_keyword(Keyword::CLASS) {
10902 self.parse_alter_operator_class().map(Into::into)
10903 } else {
10904 self.parse_alter_operator().map(Into::into)
10905 }
10906 }
10907 Keyword::ROLE => self.parse_alter_role(),
10908 Keyword::POLICY => self.parse_alter_policy().map(Into::into),
10909 Keyword::CONNECTOR => self.parse_alter_connector(),
10910 Keyword::USER => self.parse_alter_user().map(Into::into),
10911 unexpected_keyword => Err(ParserError::ParserError(
10913 format!("Internal parser error: expected any of {{VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
10914 )),
10915 }
10916 }
10917
10918 fn parse_alter_aggregate_signature(
10919 &mut self,
10920 ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
10921 let name = self.parse_object_name(false)?;
10922 self.expect_token(&Token::LParen)?;
10923
10924 if self.consume_token(&Token::Mul) {
10925 self.expect_token(&Token::RParen)?;
10926 return Ok((
10927 FunctionDesc {
10928 name,
10929 args: Some(vec![]),
10930 },
10931 true,
10932 None,
10933 ));
10934 }
10935
10936 let args =
10937 if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
10938 vec![]
10939 } else {
10940 self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
10941 };
10942
10943 let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
10944 Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
10945 } else {
10946 None
10947 };
10948
10949 self.expect_token(&Token::RParen)?;
10950 Ok((
10951 FunctionDesc {
10952 name,
10953 args: Some(args),
10954 },
10955 false,
10956 aggregate_order_by,
10957 ))
10958 }
10959
10960 fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
10961 let action = if self.parse_keywords(&[
10962 Keyword::CALLED,
10963 Keyword::ON,
10964 Keyword::NULL,
10965 Keyword::INPUT,
10966 ]) {
10967 Some(AlterFunctionAction::CalledOnNull(
10968 FunctionCalledOnNull::CalledOnNullInput,
10969 ))
10970 } else if self.parse_keywords(&[
10971 Keyword::RETURNS,
10972 Keyword::NULL,
10973 Keyword::ON,
10974 Keyword::NULL,
10975 Keyword::INPUT,
10976 ]) {
10977 Some(AlterFunctionAction::CalledOnNull(
10978 FunctionCalledOnNull::ReturnsNullOnNullInput,
10979 ))
10980 } else if self.parse_keyword(Keyword::STRICT) {
10981 Some(AlterFunctionAction::CalledOnNull(
10982 FunctionCalledOnNull::Strict,
10983 ))
10984 } else if self.parse_keyword(Keyword::IMMUTABLE) {
10985 Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
10986 } else if self.parse_keyword(Keyword::STABLE) {
10987 Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
10988 } else if self.parse_keyword(Keyword::VOLATILE) {
10989 Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
10990 } else if self.parse_keyword(Keyword::NOT) {
10991 self.expect_keyword(Keyword::LEAKPROOF)?;
10992 Some(AlterFunctionAction::Leakproof(false))
10993 } else if self.parse_keyword(Keyword::LEAKPROOF) {
10994 Some(AlterFunctionAction::Leakproof(true))
10995 } else if self.parse_keyword(Keyword::EXTERNAL) {
10996 self.expect_keyword(Keyword::SECURITY)?;
10997 let security = if self.parse_keyword(Keyword::DEFINER) {
10998 FunctionSecurity::Definer
10999 } else if self.parse_keyword(Keyword::INVOKER) {
11000 FunctionSecurity::Invoker
11001 } else {
11002 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11003 };
11004 Some(AlterFunctionAction::Security {
11005 external: true,
11006 security,
11007 })
11008 } else if self.parse_keyword(Keyword::SECURITY) {
11009 let security = if self.parse_keyword(Keyword::DEFINER) {
11010 FunctionSecurity::Definer
11011 } else if self.parse_keyword(Keyword::INVOKER) {
11012 FunctionSecurity::Invoker
11013 } else {
11014 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11015 };
11016 Some(AlterFunctionAction::Security {
11017 external: false,
11018 security,
11019 })
11020 } else if self.parse_keyword(Keyword::PARALLEL) {
11021 let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11022 FunctionParallel::Unsafe
11023 } else if self.parse_keyword(Keyword::RESTRICTED) {
11024 FunctionParallel::Restricted
11025 } else if self.parse_keyword(Keyword::SAFE) {
11026 FunctionParallel::Safe
11027 } else {
11028 return self
11029 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11030 };
11031 Some(AlterFunctionAction::Parallel(parallel))
11032 } else if self.parse_keyword(Keyword::COST) {
11033 Some(AlterFunctionAction::Cost(self.parse_number()?))
11034 } else if self.parse_keyword(Keyword::ROWS) {
11035 Some(AlterFunctionAction::Rows(self.parse_number()?))
11036 } else if self.parse_keyword(Keyword::SUPPORT) {
11037 Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11038 } else if self.parse_keyword(Keyword::SET) {
11039 let name = self.parse_object_name(false)?;
11040 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11041 FunctionSetValue::FromCurrent
11042 } else {
11043 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11044 return self.expected_ref("= or TO", self.peek_token_ref());
11045 }
11046 if self.parse_keyword(Keyword::DEFAULT) {
11047 FunctionSetValue::Default
11048 } else {
11049 FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11050 }
11051 };
11052 Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11053 name,
11054 value,
11055 }))
11056 } else if self.parse_keyword(Keyword::RESET) {
11057 let reset_config = if self.parse_keyword(Keyword::ALL) {
11058 ResetConfig::ALL
11059 } else {
11060 ResetConfig::ConfigName(self.parse_object_name(false)?)
11061 };
11062 Some(AlterFunctionAction::Reset(reset_config))
11063 } else {
11064 None
11065 };
11066
11067 Ok(action)
11068 }
11069
11070 fn parse_alter_function_actions(
11071 &mut self,
11072 ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11073 let mut actions = vec![];
11074 while let Some(action) = self.parse_alter_function_action()? {
11075 actions.push(action);
11076 }
11077 if actions.is_empty() {
11078 return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11079 }
11080 let restrict = self.parse_keyword(Keyword::RESTRICT);
11081 Ok((actions, restrict))
11082 }
11083
11084 pub fn parse_alter_function(
11086 &mut self,
11087 kind: AlterFunctionKind,
11088 ) -> Result<Statement, ParserError> {
11089 let (function, aggregate_star, aggregate_order_by) = match kind {
11090 AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
11091 AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11092 };
11093
11094 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11095 let new_name = self.parse_identifier()?;
11096 AlterFunctionOperation::RenameTo { new_name }
11097 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11098 AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11099 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11100 AlterFunctionOperation::SetSchema {
11101 schema_name: self.parse_object_name(false)?,
11102 }
11103 } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
11104 if !self.parse_keyword(Keyword::DEPENDS) {
11105 return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11106 }
11107 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11108 AlterFunctionOperation::DependsOnExtension {
11109 no: true,
11110 extension_name: self.parse_object_name(false)?,
11111 }
11112 } else if matches!(kind, AlterFunctionKind::Function)
11113 && self.parse_keyword(Keyword::DEPENDS)
11114 {
11115 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11116 AlterFunctionOperation::DependsOnExtension {
11117 no: false,
11118 extension_name: self.parse_object_name(false)?,
11119 }
11120 } else if matches!(kind, AlterFunctionKind::Function) {
11121 let (actions, restrict) = self.parse_alter_function_actions()?;
11122 AlterFunctionOperation::Actions { actions, restrict }
11123 } else {
11124 return self.expected_ref(
11125 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11126 self.peek_token_ref(),
11127 );
11128 };
11129
11130 Ok(Statement::AlterFunction(AlterFunction {
11131 kind,
11132 function,
11133 aggregate_order_by,
11134 aggregate_star,
11135 operation,
11136 }))
11137 }
11138
11139 pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11141 let r#async = self.parse_keyword(Keyword::ASYNC); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11143 let only = self.parse_keyword(Keyword::ONLY); let table_name = self.parse_object_name(false)?;
11145 let on_cluster = self.parse_optional_on_cluster()?;
11146 let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11147
11148 let mut location = None;
11149 if self.parse_keyword(Keyword::LOCATION) {
11150 location = Some(HiveSetLocation {
11151 has_set: false,
11152 location: self.parse_identifier()?,
11153 });
11154 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11155 location = Some(HiveSetLocation {
11156 has_set: true,
11157 location: self.parse_identifier()?,
11158 });
11159 }
11160
11161 let end_token = if self.peek_token_ref().token == Token::SemiColon {
11162 self.peek_token_ref().clone()
11163 } else {
11164 self.get_current_token().clone()
11165 };
11166
11167 Ok(AlterTable {
11168 name: table_name,
11169 r#async,
11170 if_exists,
11171 only,
11172 operations,
11173 location,
11174 on_cluster,
11175 table_type: if iceberg {
11176 Some(AlterTableType::Iceberg)
11177 } else {
11178 None
11179 },
11180 end_token: AttachedToken(end_token),
11181 }
11182 .into())
11183 }
11184
11185 pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11187 let name = self.parse_object_name(false)?;
11188 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11189
11190 let with_options = self.parse_options(Keyword::WITH)?;
11191
11192 self.expect_keyword_is(Keyword::AS)?;
11193 let query = self.parse_query()?;
11194
11195 Ok(Statement::AlterView {
11196 name,
11197 columns,
11198 query,
11199 with_options,
11200 })
11201 }
11202
11203 pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11205 let name = self.parse_object_name(false)?;
11206
11207 if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11208 let new_name = self.parse_identifier()?;
11209 Ok(Statement::AlterType(AlterType {
11210 name,
11211 operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11212 }))
11213 } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11214 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11215 let new_enum_value = self.parse_identifier()?;
11216 let position = if self.parse_keyword(Keyword::BEFORE) {
11217 Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11218 } else if self.parse_keyword(Keyword::AFTER) {
11219 Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11220 } else {
11221 None
11222 };
11223
11224 Ok(Statement::AlterType(AlterType {
11225 name,
11226 operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11227 if_not_exists,
11228 value: new_enum_value,
11229 position,
11230 }),
11231 }))
11232 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11233 let existing_enum_value = self.parse_identifier()?;
11234 self.expect_keyword(Keyword::TO)?;
11235 let new_enum_value = self.parse_identifier()?;
11236
11237 Ok(Statement::AlterType(AlterType {
11238 name,
11239 operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11240 from: existing_enum_value,
11241 to: new_enum_value,
11242 }),
11243 }))
11244 } else {
11245 self.expected_ref(
11246 "{RENAME TO | { RENAME | ADD } VALUE}",
11247 self.peek_token_ref(),
11248 )
11249 }
11250 }
11251
11252 pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11256 let name = self.parse_object_name(false)?;
11257 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11258 AlterCollationOperation::RenameTo {
11259 new_name: self.parse_identifier()?,
11260 }
11261 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11262 AlterCollationOperation::OwnerTo(self.parse_owner()?)
11263 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11264 AlterCollationOperation::SetSchema {
11265 schema_name: self.parse_object_name(false)?,
11266 }
11267 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11268 AlterCollationOperation::RefreshVersion
11269 } else {
11270 return self.expected_ref(
11271 "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11272 self.peek_token_ref(),
11273 );
11274 };
11275
11276 Ok(AlterCollation { name, operation })
11277 }
11278
11279 pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11283 let name = self.parse_operator_name()?;
11284
11285 self.expect_token(&Token::LParen)?;
11287
11288 let left_type = if self.parse_keyword(Keyword::NONE) {
11289 None
11290 } else {
11291 Some(self.parse_data_type()?)
11292 };
11293
11294 self.expect_token(&Token::Comma)?;
11295 let right_type = self.parse_data_type()?;
11296 self.expect_token(&Token::RParen)?;
11297
11298 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11300 let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11301 Owner::CurrentRole
11302 } else if self.parse_keyword(Keyword::CURRENT_USER) {
11303 Owner::CurrentUser
11304 } else if self.parse_keyword(Keyword::SESSION_USER) {
11305 Owner::SessionUser
11306 } else {
11307 Owner::Ident(self.parse_identifier()?)
11308 };
11309 AlterOperatorOperation::OwnerTo(owner)
11310 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11311 let schema_name = self.parse_object_name(false)?;
11312 AlterOperatorOperation::SetSchema { schema_name }
11313 } else if self.parse_keyword(Keyword::SET) {
11314 self.expect_token(&Token::LParen)?;
11315
11316 let mut options = Vec::new();
11317 loop {
11318 let keyword = self.expect_one_of_keywords(&[
11319 Keyword::RESTRICT,
11320 Keyword::JOIN,
11321 Keyword::COMMUTATOR,
11322 Keyword::NEGATOR,
11323 Keyword::HASHES,
11324 Keyword::MERGES,
11325 ])?;
11326
11327 match keyword {
11328 Keyword::RESTRICT => {
11329 self.expect_token(&Token::Eq)?;
11330 let proc_name = if self.parse_keyword(Keyword::NONE) {
11331 None
11332 } else {
11333 Some(self.parse_object_name(false)?)
11334 };
11335 options.push(OperatorOption::Restrict(proc_name));
11336 }
11337 Keyword::JOIN => {
11338 self.expect_token(&Token::Eq)?;
11339 let proc_name = if self.parse_keyword(Keyword::NONE) {
11340 None
11341 } else {
11342 Some(self.parse_object_name(false)?)
11343 };
11344 options.push(OperatorOption::Join(proc_name));
11345 }
11346 Keyword::COMMUTATOR => {
11347 self.expect_token(&Token::Eq)?;
11348 let op_name = self.parse_operator_name()?;
11349 options.push(OperatorOption::Commutator(op_name));
11350 }
11351 Keyword::NEGATOR => {
11352 self.expect_token(&Token::Eq)?;
11353 let op_name = self.parse_operator_name()?;
11354 options.push(OperatorOption::Negator(op_name));
11355 }
11356 Keyword::HASHES => {
11357 options.push(OperatorOption::Hashes);
11358 }
11359 Keyword::MERGES => {
11360 options.push(OperatorOption::Merges);
11361 }
11362 unexpected_keyword => return Err(ParserError::ParserError(
11363 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11364 )),
11365 }
11366
11367 if !self.consume_token(&Token::Comma) {
11368 break;
11369 }
11370 }
11371
11372 self.expect_token(&Token::RParen)?;
11373 AlterOperatorOperation::Set { options }
11374 } else {
11375 return self.expected_ref(
11376 "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11377 self.peek_token_ref(),
11378 );
11379 };
11380
11381 Ok(AlterOperator {
11382 name,
11383 left_type,
11384 right_type,
11385 operation,
11386 })
11387 }
11388
11389 fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11391 let strategy_number = self.parse_literal_uint()?;
11392 let operator_name = self.parse_operator_name()?;
11393
11394 self.expect_token(&Token::LParen)?;
11396 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11397 self.expect_token(&Token::RParen)?;
11398
11399 let purpose = if self.parse_keyword(Keyword::FOR) {
11401 if self.parse_keyword(Keyword::SEARCH) {
11402 Some(OperatorPurpose::ForSearch)
11403 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11404 let sort_family = self.parse_object_name(false)?;
11405 Some(OperatorPurpose::ForOrderBy { sort_family })
11406 } else {
11407 return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11408 }
11409 } else {
11410 None
11411 };
11412
11413 Ok(OperatorFamilyItem::Operator {
11414 strategy_number,
11415 operator_name,
11416 op_types,
11417 purpose,
11418 })
11419 }
11420
11421 fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11423 let support_number = self.parse_literal_uint()?;
11424
11425 let op_types =
11427 if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11428 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11429 self.expect_token(&Token::RParen)?;
11430 Some(types)
11431 } else if self.consume_token(&Token::LParen) {
11432 self.expect_token(&Token::RParen)?;
11433 Some(vec![])
11434 } else {
11435 None
11436 };
11437
11438 let function_name = self.parse_object_name(false)?;
11439
11440 let argument_types = if self.consume_token(&Token::LParen) {
11442 if self.peek_token_ref().token == Token::RParen {
11443 self.expect_token(&Token::RParen)?;
11444 vec![]
11445 } else {
11446 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11447 self.expect_token(&Token::RParen)?;
11448 types
11449 }
11450 } else {
11451 vec![]
11452 };
11453
11454 Ok(OperatorFamilyItem::Function {
11455 support_number,
11456 op_types,
11457 function_name,
11458 argument_types,
11459 })
11460 }
11461
11462 fn parse_operator_family_drop_operator(
11464 &mut self,
11465 ) -> Result<OperatorFamilyDropItem, ParserError> {
11466 let strategy_number = self.parse_literal_uint()?;
11467
11468 self.expect_token(&Token::LParen)?;
11470 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11471 self.expect_token(&Token::RParen)?;
11472
11473 Ok(OperatorFamilyDropItem::Operator {
11474 strategy_number,
11475 op_types,
11476 })
11477 }
11478
11479 fn parse_operator_family_drop_function(
11481 &mut self,
11482 ) -> Result<OperatorFamilyDropItem, ParserError> {
11483 let support_number = self.parse_literal_uint()?;
11484
11485 self.expect_token(&Token::LParen)?;
11487 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11488 self.expect_token(&Token::RParen)?;
11489
11490 Ok(OperatorFamilyDropItem::Function {
11491 support_number,
11492 op_types,
11493 })
11494 }
11495
11496 fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11498 if self.parse_keyword(Keyword::OPERATOR) {
11499 self.parse_operator_family_add_operator()
11500 } else if self.parse_keyword(Keyword::FUNCTION) {
11501 self.parse_operator_family_add_function()
11502 } else {
11503 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11504 }
11505 }
11506
11507 fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11509 if self.parse_keyword(Keyword::OPERATOR) {
11510 self.parse_operator_family_drop_operator()
11511 } else if self.parse_keyword(Keyword::FUNCTION) {
11512 self.parse_operator_family_drop_function()
11513 } else {
11514 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11515 }
11516 }
11517
11518 pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11521 let name = self.parse_object_name(false)?;
11522 self.expect_keyword(Keyword::USING)?;
11523 let using = self.parse_identifier()?;
11524
11525 let operation = if self.parse_keyword(Keyword::ADD) {
11526 let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11527 AlterOperatorFamilyOperation::Add { items }
11528 } else if self.parse_keyword(Keyword::DROP) {
11529 let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11530 AlterOperatorFamilyOperation::Drop { items }
11531 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11532 let new_name = self.parse_object_name(false)?;
11533 AlterOperatorFamilyOperation::RenameTo { new_name }
11534 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11535 let owner = self.parse_owner()?;
11536 AlterOperatorFamilyOperation::OwnerTo(owner)
11537 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11538 let schema_name = self.parse_object_name(false)?;
11539 AlterOperatorFamilyOperation::SetSchema { schema_name }
11540 } else {
11541 return self.expected_ref(
11542 "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11543 self.peek_token_ref(),
11544 );
11545 };
11546
11547 Ok(AlterOperatorFamily {
11548 name,
11549 using,
11550 operation,
11551 })
11552 }
11553
11554 pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11558 let name = self.parse_object_name(false)?;
11559 self.expect_keyword(Keyword::USING)?;
11560 let using = self.parse_identifier()?;
11561
11562 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11563 let new_name = self.parse_object_name(false)?;
11564 AlterOperatorClassOperation::RenameTo { new_name }
11565 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11566 let owner = self.parse_owner()?;
11567 AlterOperatorClassOperation::OwnerTo(owner)
11568 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11569 let schema_name = self.parse_object_name(false)?;
11570 AlterOperatorClassOperation::SetSchema { schema_name }
11571 } else {
11572 return self.expected_ref(
11573 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11574 self.peek_token_ref(),
11575 );
11576 };
11577
11578 Ok(AlterOperatorClass {
11579 name,
11580 using,
11581 operation,
11582 })
11583 }
11584
11585 pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11589 self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11590 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11591 let name = self.parse_object_name(false)?;
11592 let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11593 self.prev_token();
11594 let options = self.parse_options(Keyword::OPTIONS)?;
11595 AlterSchemaOperation::SetOptionsParens { options }
11596 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11597 let collate = self.parse_expr()?;
11598 AlterSchemaOperation::SetDefaultCollate { collate }
11599 } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11600 let replica = self.parse_identifier()?;
11601 let options = if self.peek_keyword(Keyword::OPTIONS) {
11602 Some(self.parse_options(Keyword::OPTIONS)?)
11603 } else {
11604 None
11605 };
11606 AlterSchemaOperation::AddReplica { replica, options }
11607 } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11608 let replica = self.parse_identifier()?;
11609 AlterSchemaOperation::DropReplica { replica }
11610 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11611 let new_name = self.parse_object_name(false)?;
11612 AlterSchemaOperation::Rename { name: new_name }
11613 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11614 let owner = self.parse_owner()?;
11615 AlterSchemaOperation::OwnerTo { owner }
11616 } else {
11617 return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11618 };
11619 Ok(Statement::AlterSchema(AlterSchema {
11620 name,
11621 if_exists,
11622 operations: vec![operation],
11623 }))
11624 }
11625
11626 pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11629 let object_name = self.parse_object_name(false)?;
11630 if self.peek_token_ref().token == Token::LParen {
11631 match self.parse_function(object_name)? {
11632 Expr::Function(f) => Ok(Statement::Call(f)),
11633 other => parser_err!(
11634 format!("Expected a simple procedure call but found: {other}"),
11635 self.peek_token_ref().span.start
11636 ),
11637 }
11638 } else {
11639 Ok(Statement::Call(Function {
11640 name: object_name,
11641 uses_odbc_syntax: false,
11642 parameters: FunctionArguments::None,
11643 args: FunctionArguments::None,
11644 over: None,
11645 filter: None,
11646 null_treatment: None,
11647 within_group: vec![],
11648 }))
11649 }
11650 }
11651
11652 pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11654 let source;
11655 if self.consume_token(&Token::LParen) {
11656 source = CopySource::Query(self.parse_query()?);
11657 self.expect_token(&Token::RParen)?;
11658 } else {
11659 let table_name = self.parse_object_name(false)?;
11660 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11661 source = CopySource::Table {
11662 table_name,
11663 columns,
11664 };
11665 }
11666 let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
11667 Some(Keyword::FROM) => false,
11668 Some(Keyword::TO) => true,
11669 _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
11670 };
11671 if !to {
11672 if let CopySource::Query(_) = source {
11675 return Err(ParserError::ParserError(
11676 "COPY ... FROM does not support query as a source".to_string(),
11677 ));
11678 }
11679 }
11680 let target = if self.parse_keyword(Keyword::STDIN) {
11681 CopyTarget::Stdin
11682 } else if self.parse_keyword(Keyword::STDOUT) {
11683 CopyTarget::Stdout
11684 } else if self.parse_keyword(Keyword::PROGRAM) {
11685 CopyTarget::Program {
11686 command: self.parse_literal_string()?,
11687 }
11688 } else {
11689 CopyTarget::File {
11690 filename: self.parse_literal_string()?,
11691 }
11692 };
11693 let _ = self.parse_keyword(Keyword::WITH); let mut options = vec![];
11695 if self.consume_token(&Token::LParen) {
11696 options = self.parse_comma_separated(Parser::parse_copy_option)?;
11697 self.expect_token(&Token::RParen)?;
11698 }
11699 let mut legacy_options = vec![];
11700 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
11701 legacy_options.push(opt);
11702 }
11703 let values =
11704 if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
11705 self.expect_token(&Token::SemiColon)?;
11706 self.parse_tsv()
11707 } else {
11708 vec![]
11709 };
11710 Ok(Statement::Copy {
11711 source,
11712 to,
11713 target,
11714 options,
11715 legacy_options,
11716 values,
11717 })
11718 }
11719
11720 fn parse_open(&mut self) -> Result<Statement, ParserError> {
11722 self.expect_keyword(Keyword::OPEN)?;
11723 Ok(Statement::Open(OpenStatement {
11724 cursor_name: self.parse_identifier()?,
11725 }))
11726 }
11727
11728 pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
11730 let cursor = if self.parse_keyword(Keyword::ALL) {
11731 CloseCursor::All
11732 } else {
11733 let name = self.parse_identifier()?;
11734
11735 CloseCursor::Specific { name }
11736 };
11737
11738 Ok(Statement::Close { cursor })
11739 }
11740
11741 fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
11742 let ret = match self.parse_one_of_keywords(&[
11743 Keyword::FORMAT,
11744 Keyword::FREEZE,
11745 Keyword::DELIMITER,
11746 Keyword::NULL,
11747 Keyword::HEADER,
11748 Keyword::QUOTE,
11749 Keyword::ESCAPE,
11750 Keyword::FORCE_QUOTE,
11751 Keyword::FORCE_NOT_NULL,
11752 Keyword::FORCE_NULL,
11753 Keyword::ENCODING,
11754 ]) {
11755 Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
11756 Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
11757 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11758 Some(Keyword::FALSE)
11759 )),
11760 Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
11761 Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
11762 Some(Keyword::HEADER) => CopyOption::Header(!matches!(
11763 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
11764 Some(Keyword::FALSE)
11765 )),
11766 Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
11767 Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
11768 Some(Keyword::FORCE_QUOTE) => {
11769 CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
11770 }
11771 Some(Keyword::FORCE_NOT_NULL) => {
11772 CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11773 }
11774 Some(Keyword::FORCE_NULL) => {
11775 CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
11776 }
11777 Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
11778 _ => self.expected_ref("option", self.peek_token_ref())?,
11779 };
11780 Ok(ret)
11781 }
11782
11783 fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
11784 if self.parse_keyword(Keyword::FORMAT) {
11786 let _ = self.parse_keyword(Keyword::AS);
11787 }
11788
11789 let ret = match self.parse_one_of_keywords(&[
11790 Keyword::ACCEPTANYDATE,
11791 Keyword::ACCEPTINVCHARS,
11792 Keyword::ADDQUOTES,
11793 Keyword::ALLOWOVERWRITE,
11794 Keyword::BINARY,
11795 Keyword::BLANKSASNULL,
11796 Keyword::BZIP2,
11797 Keyword::CLEANPATH,
11798 Keyword::COMPUPDATE,
11799 Keyword::CREDENTIALS,
11800 Keyword::CSV,
11801 Keyword::DATEFORMAT,
11802 Keyword::DELIMITER,
11803 Keyword::EMPTYASNULL,
11804 Keyword::ENCRYPTED,
11805 Keyword::ESCAPE,
11806 Keyword::EXTENSION,
11807 Keyword::FIXEDWIDTH,
11808 Keyword::GZIP,
11809 Keyword::HEADER,
11810 Keyword::IAM_ROLE,
11811 Keyword::IGNOREHEADER,
11812 Keyword::JSON,
11813 Keyword::MANIFEST,
11814 Keyword::MAXFILESIZE,
11815 Keyword::NULL,
11816 Keyword::PARALLEL,
11817 Keyword::PARQUET,
11818 Keyword::PARTITION,
11819 Keyword::REGION,
11820 Keyword::REMOVEQUOTES,
11821 Keyword::ROWGROUPSIZE,
11822 Keyword::STATUPDATE,
11823 Keyword::TIMEFORMAT,
11824 Keyword::TRUNCATECOLUMNS,
11825 Keyword::ZSTD,
11826 ]) {
11827 Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
11828 Some(Keyword::ACCEPTINVCHARS) => {
11829 let _ = self.parse_keyword(Keyword::AS); let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11831 Some(self.parse_literal_string()?)
11832 } else {
11833 None
11834 };
11835 CopyLegacyOption::AcceptInvChars(ch)
11836 }
11837 Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
11838 Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
11839 Some(Keyword::BINARY) => CopyLegacyOption::Binary,
11840 Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
11841 Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
11842 Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
11843 Some(Keyword::COMPUPDATE) => {
11844 let preset = self.parse_keyword(Keyword::PRESET);
11845 let enabled = match self.parse_one_of_keywords(&[
11846 Keyword::TRUE,
11847 Keyword::FALSE,
11848 Keyword::ON,
11849 Keyword::OFF,
11850 ]) {
11851 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11852 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11853 _ => None,
11854 };
11855 CopyLegacyOption::CompUpdate { preset, enabled }
11856 }
11857 Some(Keyword::CREDENTIALS) => {
11858 CopyLegacyOption::Credentials(self.parse_literal_string()?)
11859 }
11860 Some(Keyword::CSV) => CopyLegacyOption::Csv({
11861 let mut opts = vec![];
11862 while let Some(opt) =
11863 self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
11864 {
11865 opts.push(opt);
11866 }
11867 opts
11868 }),
11869 Some(Keyword::DATEFORMAT) => {
11870 let _ = self.parse_keyword(Keyword::AS);
11871 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11872 Some(self.parse_literal_string()?)
11873 } else {
11874 None
11875 };
11876 CopyLegacyOption::DateFormat(fmt)
11877 }
11878 Some(Keyword::DELIMITER) => {
11879 let _ = self.parse_keyword(Keyword::AS);
11880 CopyLegacyOption::Delimiter(self.parse_literal_char()?)
11881 }
11882 Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
11883 Some(Keyword::ENCRYPTED) => {
11884 let auto = self.parse_keyword(Keyword::AUTO);
11885 CopyLegacyOption::Encrypted { auto }
11886 }
11887 Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
11888 Some(Keyword::EXTENSION) => {
11889 let ext = self.parse_literal_string()?;
11890 CopyLegacyOption::Extension(ext)
11891 }
11892 Some(Keyword::FIXEDWIDTH) => {
11893 let spec = self.parse_literal_string()?;
11894 CopyLegacyOption::FixedWidth(spec)
11895 }
11896 Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
11897 Some(Keyword::HEADER) => CopyLegacyOption::Header,
11898 Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
11899 Some(Keyword::IGNOREHEADER) => {
11900 let _ = self.parse_keyword(Keyword::AS);
11901 let num_rows = self.parse_literal_uint()?;
11902 CopyLegacyOption::IgnoreHeader(num_rows)
11903 }
11904 Some(Keyword::JSON) => {
11905 let _ = self.parse_keyword(Keyword::AS);
11906 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11907 Some(self.parse_literal_string()?)
11908 } else {
11909 None
11910 };
11911 CopyLegacyOption::Json(fmt)
11912 }
11913 Some(Keyword::MANIFEST) => {
11914 let verbose = self.parse_keyword(Keyword::VERBOSE);
11915 CopyLegacyOption::Manifest { verbose }
11916 }
11917 Some(Keyword::MAXFILESIZE) => {
11918 let _ = self.parse_keyword(Keyword::AS);
11919 let size = self.parse_number_value()?;
11920 let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11921 Some(Keyword::MB) => Some(FileSizeUnit::MB),
11922 Some(Keyword::GB) => Some(FileSizeUnit::GB),
11923 _ => None,
11924 };
11925 CopyLegacyOption::MaxFileSize(FileSize { size, unit })
11926 }
11927 Some(Keyword::NULL) => {
11928 let _ = self.parse_keyword(Keyword::AS);
11929 CopyLegacyOption::Null(self.parse_literal_string()?)
11930 }
11931 Some(Keyword::PARALLEL) => {
11932 let enabled = match self.parse_one_of_keywords(&[
11933 Keyword::TRUE,
11934 Keyword::FALSE,
11935 Keyword::ON,
11936 Keyword::OFF,
11937 ]) {
11938 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11939 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11940 _ => None,
11941 };
11942 CopyLegacyOption::Parallel(enabled)
11943 }
11944 Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
11945 Some(Keyword::PARTITION) => {
11946 self.expect_keyword(Keyword::BY)?;
11947 let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
11948 let include = self.parse_keyword(Keyword::INCLUDE);
11949 CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
11950 }
11951 Some(Keyword::REGION) => {
11952 let _ = self.parse_keyword(Keyword::AS);
11953 let region = self.parse_literal_string()?;
11954 CopyLegacyOption::Region(region)
11955 }
11956 Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
11957 Some(Keyword::ROWGROUPSIZE) => {
11958 let _ = self.parse_keyword(Keyword::AS);
11959 let file_size = self.parse_file_size()?;
11960 CopyLegacyOption::RowGroupSize(file_size)
11961 }
11962 Some(Keyword::STATUPDATE) => {
11963 let enabled = match self.parse_one_of_keywords(&[
11964 Keyword::TRUE,
11965 Keyword::FALSE,
11966 Keyword::ON,
11967 Keyword::OFF,
11968 ]) {
11969 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
11970 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
11971 _ => None,
11972 };
11973 CopyLegacyOption::StatUpdate(enabled)
11974 }
11975 Some(Keyword::TIMEFORMAT) => {
11976 let _ = self.parse_keyword(Keyword::AS);
11977 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
11978 Some(self.parse_literal_string()?)
11979 } else {
11980 None
11981 };
11982 CopyLegacyOption::TimeFormat(fmt)
11983 }
11984 Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
11985 Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
11986 _ => self.expected_ref("option", self.peek_token_ref())?,
11987 };
11988 Ok(ret)
11989 }
11990
11991 fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
11992 let size = self.parse_number_value()?;
11993 let unit = self.maybe_parse_file_size_unit();
11994 Ok(FileSize { size, unit })
11995 }
11996
11997 fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
11998 match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
11999 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12000 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12001 _ => None,
12002 }
12003 }
12004
12005 fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12006 if self.parse_keyword(Keyword::DEFAULT) {
12007 Ok(IamRoleKind::Default)
12008 } else {
12009 let arn = self.parse_literal_string()?;
12010 Ok(IamRoleKind::Arn(arn))
12011 }
12012 }
12013
12014 fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12015 let ret = match self.parse_one_of_keywords(&[
12016 Keyword::HEADER,
12017 Keyword::QUOTE,
12018 Keyword::ESCAPE,
12019 Keyword::FORCE,
12020 ]) {
12021 Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12022 Some(Keyword::QUOTE) => {
12023 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12025 }
12026 Some(Keyword::ESCAPE) => {
12027 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12029 }
12030 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12031 CopyLegacyCsvOption::ForceNotNull(
12032 self.parse_comma_separated(|p| p.parse_identifier())?,
12033 )
12034 }
12035 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12036 CopyLegacyCsvOption::ForceQuote(
12037 self.parse_comma_separated(|p| p.parse_identifier())?,
12038 )
12039 }
12040 _ => self.expected_ref("csv option", self.peek_token_ref())?,
12041 };
12042 Ok(ret)
12043 }
12044
12045 fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12046 let s = self.parse_literal_string()?;
12047 if s.len() != 1 {
12048 let loc = self
12049 .tokens
12050 .get(self.index - 1)
12051 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12052 return parser_err!(format!("Expect a char, found {s:?}"), loc);
12053 }
12054 Ok(s.chars().next().unwrap())
12055 }
12056
12057 pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12060 self.parse_tab_value()
12061 }
12062
12063 pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12065 let mut values = vec![];
12066 let mut content = String::new();
12067 while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12068 match t {
12069 Token::Whitespace(Whitespace::Tab) => {
12070 values.push(Some(core::mem::take(&mut content)));
12071 }
12072 Token::Whitespace(Whitespace::Newline) => {
12073 values.push(Some(core::mem::take(&mut content)));
12074 }
12075 Token::Backslash => {
12076 if self.consume_token(&Token::Period) {
12077 return values;
12078 }
12079 if let Token::Word(w) = self.next_token().token {
12080 if w.value == "N" {
12081 values.push(None);
12082 }
12083 }
12084 }
12085 _ => {
12086 content.push_str(&t.to_string());
12087 }
12088 }
12089 }
12090 values
12091 }
12092
12093 pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12095 let next_token = self.next_token();
12096 let span = next_token.span;
12097 let ok_value = |value: Value| Ok(value.with_span(span));
12098 match next_token.token {
12099 Token::Word(w) => match w.keyword {
12100 Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12101 ok_value(Value::Boolean(true))
12102 }
12103 Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12104 ok_value(Value::Boolean(false))
12105 }
12106 Keyword::NULL => ok_value(Value::Null),
12107 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12108 Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12109 Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12110 _ => self.expected(
12111 "A value?",
12112 TokenWithSpan {
12113 token: Token::Word(w),
12114 span,
12115 },
12116 )?,
12117 },
12118 _ => self.expected(
12119 "a concrete value",
12120 TokenWithSpan {
12121 token: Token::Word(w),
12122 span,
12123 },
12124 ),
12125 },
12126 Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12130 Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12131 self.maybe_concat_string_literal(s.to_string()),
12132 )),
12133 Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12134 self.maybe_concat_string_literal(s.to_string()),
12135 )),
12136 Token::TripleSingleQuotedString(ref s) => {
12137 ok_value(Value::TripleSingleQuotedString(s.to_string()))
12138 }
12139 Token::TripleDoubleQuotedString(ref s) => {
12140 ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12141 }
12142 Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12143 Token::SingleQuotedByteStringLiteral(ref s) => {
12144 ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12145 }
12146 Token::DoubleQuotedByteStringLiteral(ref s) => {
12147 ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12148 }
12149 Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12150 ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12151 }
12152 Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12153 ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12154 }
12155 Token::SingleQuotedRawStringLiteral(ref s) => {
12156 ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12157 }
12158 Token::DoubleQuotedRawStringLiteral(ref s) => {
12159 ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12160 }
12161 Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12162 ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12163 }
12164 Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12165 ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12166 }
12167 Token::NationalStringLiteral(ref s) => {
12168 ok_value(Value::NationalStringLiteral(s.to_string()))
12169 }
12170 Token::QuoteDelimitedStringLiteral(v) => {
12171 ok_value(Value::QuoteDelimitedStringLiteral(v))
12172 }
12173 Token::NationalQuoteDelimitedStringLiteral(v) => {
12174 ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12175 }
12176 Token::EscapedStringLiteral(ref s) => {
12177 ok_value(Value::EscapedStringLiteral(s.to_string()))
12178 }
12179 Token::UnicodeStringLiteral(ref s) => {
12180 ok_value(Value::UnicodeStringLiteral(s.to_string()))
12181 }
12182 Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12183 Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12184 tok @ Token::Colon | tok @ Token::AtSign => {
12185 let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12193 let ident = match next_token.token {
12194 Token::Word(w) => Ok(w.into_ident(next_token.span)),
12195 Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12196 _ => self.expected("placeholder", next_token),
12197 }?;
12198 Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12199 .with_span(Span::new(span.start, ident.span.end)))
12200 }
12201 unexpected => self.expected(
12202 "a value",
12203 TokenWithSpan {
12204 token: unexpected,
12205 span,
12206 },
12207 ),
12208 }
12209 }
12210
12211 fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12212 if self.dialect.supports_string_literal_concatenation() {
12213 while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12214 self.peek_token_ref().token
12215 {
12216 str.push_str(s);
12217 self.advance_token();
12218 }
12219 } else if self
12220 .dialect
12221 .supports_string_literal_concatenation_with_newline()
12222 {
12223 let mut after_newline = false;
12226 loop {
12227 match self.peek_token_no_skip().token {
12228 Token::Whitespace(Whitespace::Newline) => {
12229 after_newline = true;
12230 self.next_token_no_skip();
12231 }
12232 Token::Whitespace(_) => {
12233 self.next_token_no_skip();
12234 }
12235 Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12236 if after_newline =>
12237 {
12238 str.push_str(s.clone().as_str());
12239 self.next_token_no_skip();
12240 after_newline = false;
12241 }
12242 _ => break,
12243 }
12244 }
12245 }
12246
12247 str
12248 }
12249
12250 pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12252 let value_wrapper = self.parse_value()?;
12253 match &value_wrapper.value {
12254 Value::Number(_, _) => Ok(value_wrapper),
12255 Value::Placeholder(_) => Ok(value_wrapper),
12256 _ => {
12257 self.prev_token();
12258 self.expected_ref("literal number", self.peek_token_ref())
12259 }
12260 }
12261 }
12262
12263 pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12266 let next_token = self.next_token();
12267 match next_token.token {
12268 Token::Plus => Ok(Expr::UnaryOp {
12269 op: UnaryOperator::Plus,
12270 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12271 }),
12272 Token::Minus => Ok(Expr::UnaryOp {
12273 op: UnaryOperator::Minus,
12274 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12275 }),
12276 _ => {
12277 self.prev_token();
12278 Ok(Expr::Value(self.parse_number_value()?))
12279 }
12280 }
12281 }
12282
12283 fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12284 let next_token = self.next_token();
12285 let span = next_token.span;
12286 match next_token.token {
12287 Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12288 Value::SingleQuotedString(s.to_string()).with_span(span),
12289 )),
12290 Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12291 Value::DoubleQuotedString(s.to_string()).with_span(span),
12292 )),
12293 Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12294 Value::HexStringLiteral(s.to_string()).with_span(span),
12295 )),
12296 unexpected => self.expected(
12297 "a string value",
12298 TokenWithSpan {
12299 token: unexpected,
12300 span,
12301 },
12302 ),
12303 }
12304 }
12305
12306 pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12308 let next_token = self.next_token();
12309 match next_token.token {
12310 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12311 _ => self.expected("literal int", next_token),
12312 }
12313 }
12314
12315 fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12318 let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12319 let peek_token = parser.peek_token();
12320 let span = peek_token.span;
12321 match peek_token.token {
12322 Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12323 {
12324 parser.next_token();
12325 Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12326 }
12327 _ => Ok(Expr::Value(
12328 Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12329 )),
12330 }
12331 };
12332
12333 Ok(CreateFunctionBody::AsBeforeOptions {
12334 body: parse_string_expr(self)?,
12335 link_symbol: if self.consume_token(&Token::Comma) {
12336 Some(parse_string_expr(self)?)
12337 } else {
12338 None
12339 },
12340 })
12341 }
12342
12343 pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12345 let next_token = self.next_token();
12346 match next_token.token {
12347 Token::Word(Word {
12348 value,
12349 keyword: Keyword::NoKeyword,
12350 ..
12351 }) => Ok(value),
12352 Token::SingleQuotedString(s) => Ok(s),
12353 Token::DoubleQuotedString(s) => Ok(s),
12354 Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12355 Ok(s)
12356 }
12357 Token::UnicodeStringLiteral(s) => Ok(s),
12358 _ => self.expected("literal string", next_token),
12359 }
12360 }
12361
12362 pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12364 match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12365 Some(Keyword::TRUE) => Ok(true),
12366 Some(Keyword::FALSE) => Ok(false),
12367 _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12368 }
12369 }
12370
12371 pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12373 let neg = self.parse_keyword(Keyword::NOT);
12374 let normalized_form = self.maybe_parse(|parser| {
12375 match parser.parse_one_of_keywords(&[
12376 Keyword::NFC,
12377 Keyword::NFD,
12378 Keyword::NFKC,
12379 Keyword::NFKD,
12380 ]) {
12381 Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12382 Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12383 Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12384 Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12385 _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12386 }
12387 })?;
12388 if self.parse_keyword(Keyword::NORMALIZED) {
12389 return Ok(Expr::IsNormalized {
12390 expr: Box::new(expr),
12391 form: normalized_form,
12392 negated: neg,
12393 });
12394 }
12395 self.expected_ref("unicode normalization form", self.peek_token_ref())
12396 }
12397
12398 pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12400 self.expect_token(&Token::LParen)?;
12401 let values = self.parse_comma_separated(|parser| {
12402 let name = parser.parse_literal_string()?;
12403 let e = if parser.consume_token(&Token::Eq) {
12404 let value = parser.parse_number()?;
12405 EnumMember::NamedValue(name, value)
12406 } else {
12407 EnumMember::Name(name)
12408 };
12409 Ok(e)
12410 })?;
12411 self.expect_token(&Token::RParen)?;
12412
12413 Ok(values)
12414 }
12415
12416 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12418 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12419 if trailing_bracket.0 {
12420 return parser_err!(
12421 format!("unmatched > after parsing data type {ty}"),
12422 self.peek_token_ref()
12423 );
12424 }
12425
12426 Ok(ty)
12427 }
12428
12429 fn parse_data_type_helper(
12430 &mut self,
12431 ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12432 let dialect = self.dialect;
12433 self.advance_token();
12434 let next_token = self.get_current_token();
12435 let next_token_index = self.get_current_index();
12436
12437 let mut trailing_bracket: MatchedTrailingBracket = false.into();
12438 let mut data = match &next_token.token {
12439 Token::Word(w) => match w.keyword {
12440 Keyword::BOOLEAN => Ok(DataType::Boolean),
12441 Keyword::BOOL => Ok(DataType::Bool),
12442 Keyword::FLOAT => {
12443 let precision = self.parse_exact_number_optional_precision_scale()?;
12444
12445 if self.parse_keyword(Keyword::UNSIGNED) {
12446 Ok(DataType::FloatUnsigned(precision))
12447 } else {
12448 Ok(DataType::Float(precision))
12449 }
12450 }
12451 Keyword::REAL => {
12452 if self.parse_keyword(Keyword::UNSIGNED) {
12453 Ok(DataType::RealUnsigned)
12454 } else {
12455 Ok(DataType::Real)
12456 }
12457 }
12458 Keyword::FLOAT4 => Ok(DataType::Float4),
12459 Keyword::FLOAT32 => Ok(DataType::Float32),
12460 Keyword::FLOAT64 => Ok(DataType::Float64),
12461 Keyword::FLOAT8 => Ok(DataType::Float8),
12462 Keyword::DOUBLE => {
12463 if self.parse_keyword(Keyword::PRECISION) {
12464 if self.parse_keyword(Keyword::UNSIGNED) {
12465 Ok(DataType::DoublePrecisionUnsigned)
12466 } else {
12467 Ok(DataType::DoublePrecision)
12468 }
12469 } else {
12470 let precision = self.parse_exact_number_optional_precision_scale()?;
12471
12472 if self.parse_keyword(Keyword::UNSIGNED) {
12473 Ok(DataType::DoubleUnsigned(precision))
12474 } else {
12475 Ok(DataType::Double(precision))
12476 }
12477 }
12478 }
12479 Keyword::TINYINT => {
12480 let optional_precision = self.parse_optional_precision();
12481 if self.parse_keyword(Keyword::UNSIGNED) {
12482 Ok(DataType::TinyIntUnsigned(optional_precision?))
12483 } else {
12484 if dialect.supports_data_type_signed_suffix() {
12485 let _ = self.parse_keyword(Keyword::SIGNED);
12486 }
12487 Ok(DataType::TinyInt(optional_precision?))
12488 }
12489 }
12490 Keyword::INT2 => {
12491 let optional_precision = self.parse_optional_precision();
12492 if self.parse_keyword(Keyword::UNSIGNED) {
12493 Ok(DataType::Int2Unsigned(optional_precision?))
12494 } else {
12495 Ok(DataType::Int2(optional_precision?))
12496 }
12497 }
12498 Keyword::SMALLINT => {
12499 let optional_precision = self.parse_optional_precision();
12500 if self.parse_keyword(Keyword::UNSIGNED) {
12501 Ok(DataType::SmallIntUnsigned(optional_precision?))
12502 } else {
12503 if dialect.supports_data_type_signed_suffix() {
12504 let _ = self.parse_keyword(Keyword::SIGNED);
12505 }
12506 Ok(DataType::SmallInt(optional_precision?))
12507 }
12508 }
12509 Keyword::MEDIUMINT => {
12510 let optional_precision = self.parse_optional_precision();
12511 if self.parse_keyword(Keyword::UNSIGNED) {
12512 Ok(DataType::MediumIntUnsigned(optional_precision?))
12513 } else {
12514 if dialect.supports_data_type_signed_suffix() {
12515 let _ = self.parse_keyword(Keyword::SIGNED);
12516 }
12517 Ok(DataType::MediumInt(optional_precision?))
12518 }
12519 }
12520 Keyword::INT => {
12521 let optional_precision = self.parse_optional_precision();
12522 if self.parse_keyword(Keyword::UNSIGNED) {
12523 Ok(DataType::IntUnsigned(optional_precision?))
12524 } else {
12525 if dialect.supports_data_type_signed_suffix() {
12526 let _ = self.parse_keyword(Keyword::SIGNED);
12527 }
12528 Ok(DataType::Int(optional_precision?))
12529 }
12530 }
12531 Keyword::INT4 => {
12532 let optional_precision = self.parse_optional_precision();
12533 if self.parse_keyword(Keyword::UNSIGNED) {
12534 Ok(DataType::Int4Unsigned(optional_precision?))
12535 } else {
12536 Ok(DataType::Int4(optional_precision?))
12537 }
12538 }
12539 Keyword::INT8 => {
12540 let optional_precision = self.parse_optional_precision();
12541 if self.parse_keyword(Keyword::UNSIGNED) {
12542 Ok(DataType::Int8Unsigned(optional_precision?))
12543 } else {
12544 Ok(DataType::Int8(optional_precision?))
12545 }
12546 }
12547 Keyword::INT16 => Ok(DataType::Int16),
12548 Keyword::INT32 => Ok(DataType::Int32),
12549 Keyword::INT64 => Ok(DataType::Int64),
12550 Keyword::INT128 => Ok(DataType::Int128),
12551 Keyword::INT256 => Ok(DataType::Int256),
12552 Keyword::INTEGER => {
12553 let optional_precision = self.parse_optional_precision();
12554 if self.parse_keyword(Keyword::UNSIGNED) {
12555 Ok(DataType::IntegerUnsigned(optional_precision?))
12556 } else {
12557 if dialect.supports_data_type_signed_suffix() {
12558 let _ = self.parse_keyword(Keyword::SIGNED);
12559 }
12560 Ok(DataType::Integer(optional_precision?))
12561 }
12562 }
12563 Keyword::BIGINT => {
12564 let optional_precision = self.parse_optional_precision();
12565 if self.parse_keyword(Keyword::UNSIGNED) {
12566 Ok(DataType::BigIntUnsigned(optional_precision?))
12567 } else {
12568 if dialect.supports_data_type_signed_suffix() {
12569 let _ = self.parse_keyword(Keyword::SIGNED);
12570 }
12571 Ok(DataType::BigInt(optional_precision?))
12572 }
12573 }
12574 Keyword::HUGEINT => Ok(DataType::HugeInt),
12575 Keyword::UBIGINT => Ok(DataType::UBigInt),
12576 Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12577 Keyword::USMALLINT => Ok(DataType::USmallInt),
12578 Keyword::UTINYINT => Ok(DataType::UTinyInt),
12579 Keyword::UINT8 => Ok(DataType::UInt8),
12580 Keyword::UINT16 => Ok(DataType::UInt16),
12581 Keyword::UINT32 => Ok(DataType::UInt32),
12582 Keyword::UINT64 => Ok(DataType::UInt64),
12583 Keyword::UINT128 => Ok(DataType::UInt128),
12584 Keyword::UINT256 => Ok(DataType::UInt256),
12585 Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12586 Keyword::NVARCHAR => {
12587 Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12588 }
12589 Keyword::CHARACTER => {
12590 if self.parse_keyword(Keyword::VARYING) {
12591 Ok(DataType::CharacterVarying(
12592 self.parse_optional_character_length()?,
12593 ))
12594 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12595 Ok(DataType::CharacterLargeObject(
12596 self.parse_optional_precision()?,
12597 ))
12598 } else {
12599 Ok(DataType::Character(self.parse_optional_character_length()?))
12600 }
12601 }
12602 Keyword::CHAR => {
12603 if self.parse_keyword(Keyword::VARYING) {
12604 Ok(DataType::CharVarying(
12605 self.parse_optional_character_length()?,
12606 ))
12607 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12608 Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12609 } else {
12610 Ok(DataType::Char(self.parse_optional_character_length()?))
12611 }
12612 }
12613 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12614 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12615 Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12616 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12617 Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12618 Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12619 Keyword::LONGBLOB => Ok(DataType::LongBlob),
12620 Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12621 Ok(DataType::BigInt(None))
12622 }
12623 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12624 Keyword::BIT => {
12625 if self.parse_keyword(Keyword::VARYING) {
12626 Ok(DataType::BitVarying(self.parse_optional_precision()?))
12627 } else {
12628 Ok(DataType::Bit(self.parse_optional_precision()?))
12629 }
12630 }
12631 Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12632 Keyword::UUID => Ok(DataType::Uuid),
12633 Keyword::DATE => Ok(DataType::Date),
12634 Keyword::DATE32 => Ok(DataType::Date32),
12635 Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12636 Keyword::DATETIME64 => {
12637 self.prev_token();
12638 let (precision, time_zone) = self.parse_datetime_64()?;
12639 Ok(DataType::Datetime64(precision, time_zone))
12640 }
12641 Keyword::TIMESTAMP => {
12642 let precision = self.parse_optional_precision()?;
12643 let tz = if self.parse_keyword(Keyword::WITH) {
12644 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12645 TimezoneInfo::WithTimeZone
12646 } else if self.parse_keyword(Keyword::WITHOUT) {
12647 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12648 TimezoneInfo::WithoutTimeZone
12649 } else {
12650 TimezoneInfo::None
12651 };
12652 Ok(DataType::Timestamp(precision, tz))
12653 }
12654 Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
12655 self.parse_optional_precision()?,
12656 TimezoneInfo::Tz,
12657 )),
12658 Keyword::TIMESTAMP_NTZ => {
12659 Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
12660 }
12661 Keyword::TIME => {
12662 let precision = self.parse_optional_precision()?;
12663 let tz = if self.parse_keyword(Keyword::WITH) {
12664 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12665 TimezoneInfo::WithTimeZone
12666 } else if self.parse_keyword(Keyword::WITHOUT) {
12667 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
12668 TimezoneInfo::WithoutTimeZone
12669 } else {
12670 TimezoneInfo::None
12671 };
12672 Ok(DataType::Time(precision, tz))
12673 }
12674 Keyword::TIMETZ => Ok(DataType::Time(
12675 self.parse_optional_precision()?,
12676 TimezoneInfo::Tz,
12677 )),
12678 Keyword::INTERVAL => {
12679 if self.dialect.supports_interval_options() {
12680 let fields = self.maybe_parse_optional_interval_fields()?;
12681 let precision = self.parse_optional_precision()?;
12682 Ok(DataType::Interval { fields, precision })
12683 } else {
12684 Ok(DataType::Interval {
12685 fields: None,
12686 precision: None,
12687 })
12688 }
12689 }
12690 Keyword::JSON => Ok(DataType::JSON),
12691 Keyword::JSONB => Ok(DataType::JSONB),
12692 Keyword::REGCLASS => Ok(DataType::Regclass),
12693 Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
12694 Keyword::FIXEDSTRING => {
12695 self.expect_token(&Token::LParen)?;
12696 let character_length = self.parse_literal_uint()?;
12697 self.expect_token(&Token::RParen)?;
12698 Ok(DataType::FixedString(character_length))
12699 }
12700 Keyword::TEXT => {
12701 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12702 Ok(DataType::Custom(
12703 ObjectName::from(vec![Ident::new("TEXT")]),
12704 modifiers,
12705 ))
12706 } else {
12707 Ok(DataType::Text)
12708 }
12709 }
12710 Keyword::TINYTEXT => Ok(DataType::TinyText),
12711 Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
12712 Keyword::LONGTEXT => Ok(DataType::LongText),
12713 Keyword::BYTEA => Ok(DataType::Bytea),
12714 Keyword::NUMERIC => Ok(DataType::Numeric(
12715 self.parse_exact_number_optional_precision_scale()?,
12716 )),
12717 Keyword::DECIMAL => {
12718 let precision = self.parse_exact_number_optional_precision_scale()?;
12719
12720 if self.parse_keyword(Keyword::UNSIGNED) {
12721 Ok(DataType::DecimalUnsigned(precision))
12722 } else {
12723 Ok(DataType::Decimal(precision))
12724 }
12725 }
12726 Keyword::DEC => {
12727 let precision = self.parse_exact_number_optional_precision_scale()?;
12728
12729 if self.parse_keyword(Keyword::UNSIGNED) {
12730 Ok(DataType::DecUnsigned(precision))
12731 } else {
12732 Ok(DataType::Dec(precision))
12733 }
12734 }
12735 Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
12736 self.parse_exact_number_optional_precision_scale()?,
12737 )),
12738 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
12739 self.parse_exact_number_optional_precision_scale()?,
12740 )),
12741 Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
12742 Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
12743 Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
12744 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
12745 Keyword::ARRAY => {
12746 if self.dialect.supports_array_typedef_without_element_type() {
12747 Ok(DataType::Array(ArrayElemTypeDef::None))
12748 } else if dialect_of!(self is ClickHouseDialect) {
12749 Ok(self.parse_sub_type(|internal_type| {
12750 DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
12751 })?)
12752 } else {
12753 self.expect_token(&Token::Lt)?;
12754 let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
12755 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12756 Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
12757 inside_type,
12758 ))))
12759 }
12760 }
12761 Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
12762 self.prev_token();
12763 let field_defs = self.parse_duckdb_struct_type_def()?;
12764 Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
12765 }
12766 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
12767 self.prev_token();
12768 let (field_defs, _trailing_bracket) =
12769 self.parse_struct_type_def(Self::parse_struct_field_def)?;
12770 trailing_bracket = _trailing_bracket;
12771 Ok(DataType::Struct(
12772 field_defs,
12773 StructBracketKind::AngleBrackets,
12774 ))
12775 }
12776 Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
12777 self.prev_token();
12778 let fields = self.parse_union_type_def()?;
12779 Ok(DataType::Union(fields))
12780 }
12781 Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12782 Ok(self.parse_sub_type(DataType::Nullable)?)
12783 }
12784 Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12785 Ok(self.parse_sub_type(DataType::LowCardinality)?)
12786 }
12787 Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
12788 self.expect_token(&Token::Lt)?;
12789 let key_data_type = self.parse_data_type()?;
12790 self.expect_token(&Token::Comma)?;
12791 let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
12792 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
12793 Ok(DataType::Map(
12794 Box::new(key_data_type),
12795 Box::new(value_data_type),
12796 ))
12797 }
12798 Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12799 self.prev_token();
12800 let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
12801 Ok(DataType::Map(
12802 Box::new(key_data_type),
12803 Box::new(value_data_type),
12804 ))
12805 }
12806 Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12807 self.expect_token(&Token::LParen)?;
12808 let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
12809 self.expect_token(&Token::RParen)?;
12810 Ok(DataType::Nested(field_defs))
12811 }
12812 Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
12813 self.prev_token();
12814 let field_defs = self.parse_click_house_tuple_def()?;
12815 Ok(DataType::Tuple(field_defs))
12816 }
12817 Keyword::TRIGGER => Ok(DataType::Trigger),
12818 Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
12819 let _ = self.parse_keyword(Keyword::TYPE);
12820 Ok(DataType::AnyType)
12821 }
12822 Keyword::TABLE => {
12823 if self.peek_token_ref().token == Token::LParen {
12826 let columns = self.parse_returns_table_columns()?;
12827 Ok(DataType::Table(Some(columns)))
12828 } else {
12829 Ok(DataType::Table(None))
12830 }
12831 }
12832 Keyword::SIGNED => {
12833 if self.parse_keyword(Keyword::INTEGER) {
12834 Ok(DataType::SignedInteger)
12835 } else {
12836 Ok(DataType::Signed)
12837 }
12838 }
12839 Keyword::UNSIGNED => {
12840 if self.parse_keyword(Keyword::INTEGER) {
12841 Ok(DataType::UnsignedInteger)
12842 } else {
12843 Ok(DataType::Unsigned)
12844 }
12845 }
12846 Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12847 Ok(DataType::TsVector)
12848 }
12849 Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
12850 Ok(DataType::TsQuery)
12851 }
12852 _ => {
12853 self.prev_token();
12854 let type_name = self.parse_object_name(false)?;
12855 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
12856 Ok(DataType::Custom(type_name, modifiers))
12857 } else {
12858 Ok(DataType::Custom(type_name, vec![]))
12859 }
12860 }
12861 },
12862 _ => self.expected_at("a data type name", next_token_index),
12863 }?;
12864
12865 if self.dialect.supports_array_typedef_with_brackets() {
12866 while self.consume_token(&Token::LBracket) {
12867 let size = self.maybe_parse(|p| p.parse_literal_uint())?;
12869 self.expect_token(&Token::RBracket)?;
12870 data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
12871 }
12872 }
12873 Ok((data, trailing_bracket))
12874 }
12875
12876 fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
12877 self.parse_column_def()
12878 }
12879
12880 fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
12881 self.expect_token(&Token::LParen)?;
12882 let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
12883 self.expect_token(&Token::RParen)?;
12884 Ok(columns)
12885 }
12886
12887 pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
12889 self.expect_token(&Token::LParen)?;
12890 let mut values = Vec::new();
12891 loop {
12892 let next_token = self.next_token();
12893 match next_token.token {
12894 Token::SingleQuotedString(value) => values.push(value),
12895 _ => self.expected("a string", next_token)?,
12896 }
12897 let next_token = self.next_token();
12898 match next_token.token {
12899 Token::Comma => (),
12900 Token::RParen => break,
12901 _ => self.expected(", or }", next_token)?,
12902 }
12903 }
12904 Ok(values)
12905 }
12906
12907 pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12909 let ident = self.parse_identifier()?;
12910 self.expect_keyword_is(Keyword::AS)?;
12911 let alias = self.parse_identifier()?;
12912 Ok(IdentWithAlias { ident, alias })
12913 }
12914
12915 fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
12917 let ident = self.parse_identifier()?;
12918 let _after_as = self.parse_keyword(Keyword::AS);
12919 let alias = self.parse_identifier()?;
12920 Ok(IdentWithAlias { ident, alias })
12921 }
12922
12923 fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
12925 self.parse_comma_separated(|parser| {
12926 parser.expect_token(&Token::LParen)?;
12927 let query = parser.parse_query()?;
12928 parser.expect_token(&Token::RParen)?;
12929 Ok(*query)
12930 })
12931 }
12932
12933 fn parse_distinct_required_set_quantifier(
12935 &mut self,
12936 operator_name: &str,
12937 ) -> Result<SetQuantifier, ParserError> {
12938 let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
12939 match quantifier {
12940 SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
12941 _ => Err(ParserError::ParserError(format!(
12942 "{operator_name} pipe operator requires DISTINCT modifier",
12943 ))),
12944 }
12945 }
12946
12947 fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12949 if self.parse_keyword(Keyword::AS) {
12950 Ok(Some(self.parse_identifier()?))
12951 } else {
12952 self.maybe_parse(|parser| parser.parse_identifier())
12954 }
12955 }
12956
12957 fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
12959 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12960 parser.dialect.is_select_item_alias(explicit, kw, parser)
12961 }
12962 self.parse_optional_alias_inner(None, validator)
12963 }
12964
12965 pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
12969 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
12970 parser.dialect.is_table_factor_alias(explicit, kw, parser)
12971 }
12972 let explicit = self.peek_keyword(Keyword::AS);
12973 match self.parse_optional_alias_inner(None, validator)? {
12974 Some(name) => {
12975 let columns = self.parse_table_alias_column_defs()?;
12976 let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
12977 Some(self.parse_identifier()?)
12978 } else {
12979 None
12980 };
12981 Ok(Some(TableAlias {
12982 explicit,
12983 name,
12984 columns,
12985 at,
12986 }))
12987 }
12988 None => Ok(None),
12989 }
12990 }
12991
12992 fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
12993 let mut hints = vec![];
12994 while let Some(hint_type) =
12995 self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
12996 {
12997 let hint_type = match hint_type {
12998 Keyword::USE => TableIndexHintType::Use,
12999 Keyword::IGNORE => TableIndexHintType::Ignore,
13000 Keyword::FORCE => TableIndexHintType::Force,
13001 _ => {
13002 return self.expected_ref(
13003 "expected to match USE/IGNORE/FORCE keyword",
13004 self.peek_token_ref(),
13005 )
13006 }
13007 };
13008 let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13009 Some(Keyword::INDEX) => TableIndexType::Index,
13010 Some(Keyword::KEY) => TableIndexType::Key,
13011 _ => {
13012 return self
13013 .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13014 }
13015 };
13016 let for_clause = if self.parse_keyword(Keyword::FOR) {
13017 let clause = if self.parse_keyword(Keyword::JOIN) {
13018 TableIndexHintForClause::Join
13019 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13020 TableIndexHintForClause::OrderBy
13021 } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13022 TableIndexHintForClause::GroupBy
13023 } else {
13024 return self.expected_ref(
13025 "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13026 self.peek_token_ref(),
13027 );
13028 };
13029 Some(clause)
13030 } else {
13031 None
13032 };
13033
13034 self.expect_token(&Token::LParen)?;
13035 let index_names = if self.peek_token_ref().token != Token::RParen {
13036 self.parse_comma_separated(Parser::parse_identifier)?
13037 } else {
13038 vec![]
13039 };
13040 self.expect_token(&Token::RParen)?;
13041 hints.push(TableIndexHints {
13042 hint_type,
13043 index_type,
13044 for_clause,
13045 index_names,
13046 });
13047 }
13048 Ok(hints)
13049 }
13050
13051 pub fn parse_optional_alias(
13055 &mut self,
13056 reserved_kwds: &[Keyword],
13057 ) -> Result<Option<Ident>, ParserError> {
13058 fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13059 false
13060 }
13061 self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13062 }
13063
13064 fn parse_optional_alias_inner<F>(
13071 &mut self,
13072 reserved_kwds: Option<&[Keyword]>,
13073 validator: F,
13074 ) -> Result<Option<Ident>, ParserError>
13075 where
13076 F: Fn(bool, &Keyword, &mut Parser) -> bool,
13077 {
13078 let after_as = self.parse_keyword(Keyword::AS);
13079
13080 let next_token = self.next_token();
13081 match next_token.token {
13082 Token::Word(w)
13085 if reserved_kwds.is_some()
13086 && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13087 {
13088 Ok(Some(w.into_ident(next_token.span)))
13089 }
13090 Token::Word(w) if validator(after_as, &w.keyword, self) => {
13094 Ok(Some(w.into_ident(next_token.span)))
13095 }
13096 Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13098 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13099 _ => {
13100 if after_as {
13101 return self.expected("an identifier after AS", next_token);
13102 }
13103 self.prev_token();
13104 Ok(None) }
13106 }
13107 }
13108
13109 pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13111 if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13112 let expressions = if self.parse_keyword(Keyword::ALL) {
13113 None
13114 } else {
13115 Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13116 };
13117
13118 let mut modifiers = vec![];
13119 if self.dialect.supports_group_by_with_modifier() {
13120 loop {
13121 if !self.parse_keyword(Keyword::WITH) {
13122 break;
13123 }
13124 let keyword = self.expect_one_of_keywords(&[
13125 Keyword::ROLLUP,
13126 Keyword::CUBE,
13127 Keyword::TOTALS,
13128 ])?;
13129 modifiers.push(match keyword {
13130 Keyword::ROLLUP => GroupByWithModifier::Rollup,
13131 Keyword::CUBE => GroupByWithModifier::Cube,
13132 Keyword::TOTALS => GroupByWithModifier::Totals,
13133 _ => {
13134 return parser_err!(
13135 "BUG: expected to match GroupBy modifier keyword",
13136 self.peek_token_ref().span.start
13137 )
13138 }
13139 });
13140 }
13141 }
13142 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13143 self.expect_token(&Token::LParen)?;
13144 let result = self.parse_comma_separated(|p| {
13145 if p.peek_token_ref().token == Token::LParen {
13146 p.parse_tuple(true, true)
13147 } else {
13148 Ok(vec![p.parse_expr()?])
13149 }
13150 })?;
13151 self.expect_token(&Token::RParen)?;
13152 modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13153 result,
13154 )));
13155 };
13156 let group_by = match expressions {
13157 None => GroupByExpr::All(modifiers),
13158 Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13159 };
13160 Ok(Some(group_by))
13161 } else {
13162 Ok(None)
13163 }
13164 }
13165
13166 pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13168 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13169 let order_by =
13170 if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13171 let order_by_options = self.parse_order_by_options()?;
13172 OrderBy {
13173 kind: OrderByKind::All(order_by_options),
13174 interpolate: None,
13175 }
13176 } else {
13177 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13178 let interpolate = if self.dialect.supports_interpolate() {
13179 self.parse_interpolations()?
13180 } else {
13181 None
13182 };
13183 OrderBy {
13184 kind: OrderByKind::Expressions(exprs),
13185 interpolate,
13186 }
13187 };
13188 Ok(Some(order_by))
13189 } else {
13190 Ok(None)
13191 }
13192 }
13193
13194 fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13195 let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13196 Some(self.parse_offset()?)
13197 } else {
13198 None
13199 };
13200
13201 let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13202 let expr = self.parse_limit()?;
13203
13204 if self.dialect.supports_limit_comma()
13205 && offset.is_none()
13206 && expr.is_some() && self.consume_token(&Token::Comma)
13208 {
13209 let offset = expr.ok_or_else(|| {
13210 ParserError::ParserError(
13211 "Missing offset for LIMIT <offset>, <limit>".to_string(),
13212 )
13213 })?;
13214 return Ok(Some(LimitClause::OffsetCommaLimit {
13215 offset,
13216 limit: self.parse_expr()?,
13217 }));
13218 }
13219
13220 let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13221 Some(self.parse_comma_separated(Parser::parse_expr)?)
13222 } else {
13223 None
13224 };
13225
13226 (Some(expr), limit_by)
13227 } else {
13228 (None, None)
13229 };
13230
13231 if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13232 offset = Some(self.parse_offset()?);
13233 }
13234
13235 if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13236 Ok(Some(LimitClause::LimitOffset {
13237 limit: limit.unwrap_or_default(),
13238 offset,
13239 limit_by: limit_by.unwrap_or_default(),
13240 }))
13241 } else {
13242 Ok(None)
13243 }
13244 }
13245
13246 pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13249 if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13250 let fn_name = self.parse_object_name(false)?;
13251 self.parse_function_call(fn_name)
13252 .map(TableObject::TableFunction)
13253 } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13254 self.parse_parenthesized(|p| p.parse_query())
13255 .map(TableObject::TableQuery)
13256 } else {
13257 self.parse_object_name(false).map(TableObject::TableName)
13258 }
13259 }
13260
13261 pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13268 self.parse_object_name_inner(in_table_clause, false)
13269 }
13270
13271 fn parse_object_name_inner(
13281 &mut self,
13282 in_table_clause: bool,
13283 allow_wildcards: bool,
13284 ) -> Result<ObjectName, ParserError> {
13285 let mut parts = vec![];
13286 if dialect_of!(self is BigQueryDialect) && in_table_clause {
13287 loop {
13288 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13289 parts.push(ObjectNamePart::Identifier(ident));
13290 if !self.consume_token(&Token::Period) && !end_with_period {
13291 break;
13292 }
13293 }
13294 } else {
13295 loop {
13296 if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13297 let span = self.next_token().span;
13298 parts.push(ObjectNamePart::Identifier(Ident {
13299 value: Token::Mul.to_string(),
13300 quote_style: None,
13301 span,
13302 }));
13303 } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13304 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13305 parts.push(ObjectNamePart::Identifier(ident));
13306 if !self.consume_token(&Token::Period) && !end_with_period {
13307 break;
13308 }
13309 } else if self.dialect.supports_object_name_double_dot_notation()
13310 && parts.len() == 1
13311 && matches!(self.peek_token_ref().token, Token::Period)
13312 {
13313 parts.push(ObjectNamePart::Identifier(Ident::new("")));
13315 } else {
13316 let ident = self.parse_identifier()?;
13317 let part = if self
13318 .dialect
13319 .is_identifier_generating_function_name(&ident, &parts)
13320 {
13321 self.expect_token(&Token::LParen)?;
13322 let args: Vec<FunctionArg> =
13323 self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13324 self.expect_token(&Token::RParen)?;
13325 ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13326 } else {
13327 ObjectNamePart::Identifier(ident)
13328 };
13329 parts.push(part);
13330 }
13331
13332 if !self.consume_token(&Token::Period) {
13333 break;
13334 }
13335 }
13336 }
13337
13338 if dialect_of!(self is BigQueryDialect)
13341 && parts.iter().any(|part| {
13342 part.as_ident()
13343 .is_some_and(|ident| ident.value.contains('.'))
13344 })
13345 {
13346 parts = parts
13347 .into_iter()
13348 .flat_map(|part| match part.as_ident() {
13349 Some(ident) => ident
13350 .value
13351 .split('.')
13352 .map(|value| {
13353 ObjectNamePart::Identifier(Ident {
13354 value: value.into(),
13355 quote_style: ident.quote_style,
13356 span: ident.span,
13357 })
13358 })
13359 .collect::<Vec<_>>(),
13360 None => vec![part],
13361 })
13362 .collect()
13363 }
13364
13365 Ok(ObjectName(parts))
13366 }
13367
13368 pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13370 let mut idents = vec![];
13371 loop {
13372 let token = self.peek_token_ref();
13373 match &token.token {
13374 Token::Word(w) => {
13375 idents.push(w.to_ident(token.span));
13376 }
13377 Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13378 break
13379 }
13380 _ => {}
13381 }
13382 self.advance_token();
13383 }
13384 Ok(idents)
13385 }
13386
13387 pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13427 let mut idents = vec![];
13428
13429 let next_token = self.next_token();
13431 match next_token.token {
13432 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13433 Token::EOF => {
13434 return Err(ParserError::ParserError(
13435 "Empty input when parsing identifier".to_string(),
13436 ))?
13437 }
13438 token => {
13439 return Err(ParserError::ParserError(format!(
13440 "Unexpected token in identifier: {token}"
13441 )))?
13442 }
13443 };
13444
13445 loop {
13447 match self.next_token().token {
13448 Token::Period => {
13450 let next_token = self.next_token();
13451 match next_token.token {
13452 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13453 Token::EOF => {
13454 return Err(ParserError::ParserError(
13455 "Trailing period in identifier".to_string(),
13456 ))?
13457 }
13458 token => {
13459 return Err(ParserError::ParserError(format!(
13460 "Unexpected token following period in identifier: {token}"
13461 )))?
13462 }
13463 }
13464 }
13465 Token::EOF => break,
13466 token => {
13467 Err(ParserError::ParserError(format!(
13468 "Unexpected token in identifier: {token}"
13469 )))?;
13470 }
13471 }
13472 }
13473
13474 Ok(idents)
13475 }
13476
13477 pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13479 let next_token = self.next_token();
13480 match next_token.token {
13481 Token::Word(w) => Ok(w.into_ident(next_token.span)),
13482 Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13483 Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13484 _ => self.expected("identifier", next_token),
13485 }
13486 }
13487
13488 fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13499 match self.peek_token().token {
13500 Token::Word(w) => {
13501 let quote_style_is_none = w.quote_style.is_none();
13502 let mut requires_whitespace = false;
13503 let mut ident = w.into_ident(self.next_token().span);
13504 if quote_style_is_none {
13505 while matches!(self.peek_token_no_skip().token, Token::Minus) {
13506 self.next_token();
13507 ident.value.push('-');
13508
13509 let token = self
13510 .next_token_no_skip()
13511 .cloned()
13512 .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13513 requires_whitespace = match token.token {
13514 Token::Word(next_word) if next_word.quote_style.is_none() => {
13515 ident.value.push_str(&next_word.value);
13516 false
13517 }
13518 Token::Number(s, false) => {
13519 if s.ends_with('.') {
13526 let Some(s) = s.split('.').next().filter(|s| {
13527 !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13528 }) else {
13529 return self.expected(
13530 "continuation of hyphenated identifier",
13531 TokenWithSpan::new(Token::Number(s, false), token.span),
13532 );
13533 };
13534 ident.value.push_str(s);
13535 return Ok((ident, true));
13536 } else {
13537 ident.value.push_str(&s);
13538 }
13539 !matches!(self.peek_token_ref().token, Token::Period)
13542 }
13543 _ => {
13544 return self
13545 .expected("continuation of hyphenated identifier", token);
13546 }
13547 }
13548 }
13549
13550 if requires_whitespace {
13553 let token = self.next_token();
13554 if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13555 return self
13556 .expected("whitespace following hyphenated identifier", token);
13557 }
13558 }
13559 }
13560 Ok((ident, false))
13561 }
13562 _ => Ok((self.parse_identifier()?, false)),
13563 }
13564 }
13565
13566 fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13568 if self.consume_token(&Token::LParen) {
13569 if self.peek_token_ref().token == Token::RParen {
13570 self.next_token();
13571 Ok(vec![])
13572 } else {
13573 let cols = self.parse_comma_separated_with_trailing_commas(
13574 Parser::parse_view_column,
13575 self.dialect.supports_column_definition_trailing_commas(),
13576 Self::is_reserved_for_column_alias,
13577 )?;
13578 self.expect_token(&Token::RParen)?;
13579 Ok(cols)
13580 }
13581 } else {
13582 Ok(vec![])
13583 }
13584 }
13585
13586 fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13588 let name = self.parse_identifier()?;
13589 let options = self.parse_view_column_options()?;
13590 let data_type = if dialect_of!(self is ClickHouseDialect) {
13591 Some(self.parse_data_type()?)
13592 } else {
13593 None
13594 };
13595 Ok(ViewColumnDef {
13596 name,
13597 data_type,
13598 options,
13599 })
13600 }
13601
13602 fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13603 let mut options = Vec::new();
13604 loop {
13605 let option = self.parse_optional_column_option()?;
13606 if let Some(option) = option {
13607 options.push(option);
13608 } else {
13609 break;
13610 }
13611 }
13612 if options.is_empty() {
13613 Ok(None)
13614 } else if self.dialect.supports_space_separated_column_options() {
13615 Ok(Some(ColumnOptions::SpaceSeparated(options)))
13616 } else {
13617 Ok(Some(ColumnOptions::CommaSeparated(options)))
13618 }
13619 }
13620
13621 pub fn parse_parenthesized_column_list(
13624 &mut self,
13625 optional: IsOptional,
13626 allow_empty: bool,
13627 ) -> Result<Vec<Ident>, ParserError> {
13628 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
13629 }
13630
13631 pub fn parse_parenthesized_compound_identifier_list(
13633 &mut self,
13634 optional: IsOptional,
13635 allow_empty: bool,
13636 ) -> Result<Vec<Expr>, ParserError> {
13637 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13638 Ok(Expr::CompoundIdentifier(
13639 p.parse_period_separated(|p| p.parse_identifier())?,
13640 ))
13641 })
13642 }
13643
13644 fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
13647 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
13648 p.parse_create_index_expr()
13649 })
13650 }
13651
13652 pub fn parse_parenthesized_qualified_column_list(
13655 &mut self,
13656 optional: IsOptional,
13657 allow_empty: bool,
13658 ) -> Result<Vec<ObjectName>, ParserError> {
13659 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
13660 p.parse_object_name(true)
13661 })
13662 }
13663
13664 fn parse_parenthesized_column_list_inner<F, T>(
13667 &mut self,
13668 optional: IsOptional,
13669 allow_empty: bool,
13670 mut f: F,
13671 ) -> Result<Vec<T>, ParserError>
13672 where
13673 F: FnMut(&mut Parser) -> Result<T, ParserError>,
13674 {
13675 if self.consume_token(&Token::LParen) {
13676 if allow_empty && self.peek_token_ref().token == Token::RParen {
13677 self.next_token();
13678 Ok(vec![])
13679 } else {
13680 let cols = self.parse_comma_separated(|p| f(p))?;
13681 self.expect_token(&Token::RParen)?;
13682 Ok(cols)
13683 }
13684 } else if optional == Optional {
13685 Ok(vec![])
13686 } else {
13687 self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
13688 }
13689 }
13690
13691 fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
13693 if self.consume_token(&Token::LParen) {
13694 let cols = self.parse_comma_separated(|p| {
13695 let name = p.parse_identifier()?;
13696 let data_type = p.maybe_parse(|p| p.parse_data_type())?;
13697 Ok(TableAliasColumnDef { name, data_type })
13698 })?;
13699 self.expect_token(&Token::RParen)?;
13700 Ok(cols)
13701 } else {
13702 Ok(vec![])
13703 }
13704 }
13705
13706 pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
13708 self.expect_token(&Token::LParen)?;
13709 let n = self.parse_literal_uint()?;
13710 self.expect_token(&Token::RParen)?;
13711 Ok(n)
13712 }
13713
13714 pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
13716 if self.consume_token(&Token::LParen) {
13717 let n = self.parse_literal_uint()?;
13718 self.expect_token(&Token::RParen)?;
13719 Ok(Some(n))
13720 } else {
13721 Ok(None)
13722 }
13723 }
13724
13725 fn maybe_parse_optional_interval_fields(
13726 &mut self,
13727 ) -> Result<Option<IntervalFields>, ParserError> {
13728 match self.parse_one_of_keywords(&[
13729 Keyword::YEAR,
13731 Keyword::DAY,
13732 Keyword::HOUR,
13733 Keyword::MINUTE,
13734 Keyword::MONTH,
13736 Keyword::SECOND,
13737 ]) {
13738 Some(Keyword::YEAR) => {
13739 if self.peek_keyword(Keyword::TO) {
13740 self.expect_keyword(Keyword::TO)?;
13741 self.expect_keyword(Keyword::MONTH)?;
13742 Ok(Some(IntervalFields::YearToMonth))
13743 } else {
13744 Ok(Some(IntervalFields::Year))
13745 }
13746 }
13747 Some(Keyword::DAY) => {
13748 if self.peek_keyword(Keyword::TO) {
13749 self.expect_keyword(Keyword::TO)?;
13750 match self.expect_one_of_keywords(&[
13751 Keyword::HOUR,
13752 Keyword::MINUTE,
13753 Keyword::SECOND,
13754 ])? {
13755 Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
13756 Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
13757 Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
13758 _ => {
13759 self.prev_token();
13760 self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
13761 }
13762 }
13763 } else {
13764 Ok(Some(IntervalFields::Day))
13765 }
13766 }
13767 Some(Keyword::HOUR) => {
13768 if self.peek_keyword(Keyword::TO) {
13769 self.expect_keyword(Keyword::TO)?;
13770 match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
13771 Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
13772 Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
13773 _ => {
13774 self.prev_token();
13775 self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
13776 }
13777 }
13778 } else {
13779 Ok(Some(IntervalFields::Hour))
13780 }
13781 }
13782 Some(Keyword::MINUTE) => {
13783 if self.peek_keyword(Keyword::TO) {
13784 self.expect_keyword(Keyword::TO)?;
13785 self.expect_keyword(Keyword::SECOND)?;
13786 Ok(Some(IntervalFields::MinuteToSecond))
13787 } else {
13788 Ok(Some(IntervalFields::Minute))
13789 }
13790 }
13791 Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
13792 Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
13793 Some(_) => {
13794 self.prev_token();
13795 self.expected_ref(
13796 "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
13797 self.peek_token_ref(),
13798 )
13799 }
13800 None => Ok(None),
13801 }
13802 }
13803
13804 pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
13812 self.expect_keyword_is(Keyword::DATETIME64)?;
13813 self.expect_token(&Token::LParen)?;
13814 let precision = self.parse_literal_uint()?;
13815 let time_zone = if self.consume_token(&Token::Comma) {
13816 Some(self.parse_literal_string()?)
13817 } else {
13818 None
13819 };
13820 self.expect_token(&Token::RParen)?;
13821 Ok((precision, time_zone))
13822 }
13823
13824 pub fn parse_optional_character_length(
13826 &mut self,
13827 ) -> Result<Option<CharacterLength>, ParserError> {
13828 if self.consume_token(&Token::LParen) {
13829 let character_length = self.parse_character_length()?;
13830 self.expect_token(&Token::RParen)?;
13831 Ok(Some(character_length))
13832 } else {
13833 Ok(None)
13834 }
13835 }
13836
13837 pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
13839 if self.consume_token(&Token::LParen) {
13840 let binary_length = self.parse_binary_length()?;
13841 self.expect_token(&Token::RParen)?;
13842 Ok(Some(binary_length))
13843 } else {
13844 Ok(None)
13845 }
13846 }
13847
13848 pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
13850 if self.parse_keyword(Keyword::MAX) {
13851 return Ok(CharacterLength::Max);
13852 }
13853 let length = self.parse_literal_uint()?;
13854 let unit = if self.parse_keyword(Keyword::CHARACTERS) {
13855 Some(CharLengthUnits::Characters)
13856 } else if self.parse_keyword(Keyword::OCTETS) {
13857 Some(CharLengthUnits::Octets)
13858 } else {
13859 None
13860 };
13861 Ok(CharacterLength::IntegerLength { length, unit })
13862 }
13863
13864 pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
13866 if self.parse_keyword(Keyword::MAX) {
13867 return Ok(BinaryLength::Max);
13868 }
13869 let length = self.parse_literal_uint()?;
13870 Ok(BinaryLength::IntegerLength { length })
13871 }
13872
13873 pub fn parse_optional_precision_scale(
13875 &mut self,
13876 ) -> Result<(Option<u64>, Option<u64>), ParserError> {
13877 if self.consume_token(&Token::LParen) {
13878 let n = self.parse_literal_uint()?;
13879 let scale = if self.consume_token(&Token::Comma) {
13880 Some(self.parse_literal_uint()?)
13881 } else {
13882 None
13883 };
13884 self.expect_token(&Token::RParen)?;
13885 Ok((Some(n), scale))
13886 } else {
13887 Ok((None, None))
13888 }
13889 }
13890
13891 pub fn parse_exact_number_optional_precision_scale(
13893 &mut self,
13894 ) -> Result<ExactNumberInfo, ParserError> {
13895 if self.consume_token(&Token::LParen) {
13896 let precision = self.parse_literal_uint()?;
13897 let scale = if self.consume_token(&Token::Comma) {
13898 Some(self.parse_signed_integer()?)
13899 } else {
13900 None
13901 };
13902
13903 self.expect_token(&Token::RParen)?;
13904
13905 match scale {
13906 None => Ok(ExactNumberInfo::Precision(precision)),
13907 Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
13908 }
13909 } else {
13910 Ok(ExactNumberInfo::None)
13911 }
13912 }
13913
13914 fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
13916 let is_negative = self.consume_token(&Token::Minus);
13917
13918 if !is_negative {
13919 let _ = self.consume_token(&Token::Plus);
13920 }
13921
13922 let current_token = self.peek_token_ref();
13923 match ¤t_token.token {
13924 Token::Number(s, _) => {
13925 let s = s.clone();
13926 let span_start = current_token.span.start;
13927 self.advance_token();
13928 let value = Self::parse::<i64>(s, span_start)?;
13929 Ok(if is_negative { -value } else { value })
13930 }
13931 _ => self.expected_ref("number", current_token),
13932 }
13933 }
13934
13935 pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
13937 if self.consume_token(&Token::LParen) {
13938 let mut modifiers = Vec::new();
13939 loop {
13940 let next_token = self.next_token();
13941 match next_token.token {
13942 Token::Word(w) => modifiers.push(w.to_string()),
13943 Token::Number(n, _) => modifiers.push(n),
13944 Token::SingleQuotedString(s) => modifiers.push(s),
13945
13946 Token::Comma => {
13947 continue;
13948 }
13949 Token::RParen => {
13950 break;
13951 }
13952 _ => self.expected("type modifiers", next_token)?,
13953 }
13954 }
13955
13956 Ok(Some(modifiers))
13957 } else {
13958 Ok(None)
13959 }
13960 }
13961
13962 fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
13964 where
13965 F: FnOnce(Box<DataType>) -> DataType,
13966 {
13967 self.expect_token(&Token::LParen)?;
13968 let inside_type = self.parse_data_type()?;
13969 self.expect_token(&Token::RParen)?;
13970 Ok(parent_type(inside_type.into()))
13971 }
13972
13973 fn parse_delete_setexpr_boxed(
13977 &mut self,
13978 delete_token: TokenWithSpan,
13979 ) -> Result<Box<SetExpr>, ParserError> {
13980 Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
13981 }
13982
13983 pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
13985 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
13986 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
13987 if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
13990 (vec![], false)
13991 } else {
13992 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
13993 self.expect_keyword_is(Keyword::FROM)?;
13994 (tables, true)
13995 }
13996 } else {
13997 (vec![], true)
13998 };
13999
14000 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14001
14002 let output = self.maybe_parse_output_clause()?;
14003
14004 let using = if self.parse_keyword(Keyword::USING) {
14005 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14006 } else {
14007 None
14008 };
14009 let selection = if self.parse_keyword(Keyword::WHERE) {
14010 Some(self.parse_expr()?)
14011 } else {
14012 None
14013 };
14014 let returning = if self.parse_keyword(Keyword::RETURNING) {
14015 Some(self.parse_comma_separated(Parser::parse_select_item)?)
14016 } else {
14017 None
14018 };
14019 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14020 self.parse_comma_separated(Parser::parse_order_by_expr)?
14021 } else {
14022 vec![]
14023 };
14024 let limit = if self.parse_keyword(Keyword::LIMIT) {
14025 self.parse_limit()?
14026 } else {
14027 None
14028 };
14029
14030 Ok(Statement::Delete(Delete {
14031 delete_token: delete_token.into(),
14032 optimizer_hints,
14033 tables,
14034 from: if with_from_keyword {
14035 FromTable::WithFromKeyword(from)
14036 } else {
14037 FromTable::WithoutKeyword(from)
14038 },
14039 using,
14040 selection,
14041 returning,
14042 output,
14043 order_by,
14044 limit,
14045 }))
14046 }
14047
14048 pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14051 let modifier_keyword =
14052 self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14053
14054 let id = self.parse_literal_uint()?;
14055
14056 let modifier = match modifier_keyword {
14057 Some(Keyword::CONNECTION) => Some(KillType::Connection),
14058 Some(Keyword::QUERY) => Some(KillType::Query),
14059 Some(Keyword::MUTATION) => {
14060 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14061 Some(KillType::Mutation)
14062 } else {
14063 self.expected_ref(
14064 "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14065 self.peek_token_ref(),
14066 )?
14067 }
14068 }
14069 _ => None,
14070 };
14071
14072 Ok(Statement::Kill { modifier, id })
14073 }
14074
14075 pub fn parse_explain(
14077 &mut self,
14078 describe_alias: DescribeAlias,
14079 ) -> Result<Statement, ParserError> {
14080 let mut analyze = false;
14081 let mut verbose = false;
14082 let mut query_plan = false;
14083 let mut estimate = false;
14084 let mut format = None;
14085 let mut options = None;
14086
14087 if describe_alias == DescribeAlias::Explain
14090 && self.dialect.supports_explain_with_utility_options()
14091 && self.peek_token_ref().token == Token::LParen
14092 {
14093 options = Some(self.parse_utility_options()?)
14094 } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14095 query_plan = true;
14096 } else if self.parse_keyword(Keyword::ESTIMATE) {
14097 estimate = true;
14098 } else {
14099 analyze = self.parse_keyword(Keyword::ANALYZE);
14100 verbose = self.parse_keyword(Keyword::VERBOSE);
14101 if self.parse_keyword(Keyword::FORMAT) {
14102 format = Some(self.parse_analyze_format_kind()?);
14103 }
14104 }
14105
14106 match self.maybe_parse(|parser| parser.parse_statement())? {
14107 Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14108 ParserError::ParserError("Explain must be root of the plan".to_string()),
14109 ),
14110 Some(statement) => Ok(Statement::Explain {
14111 describe_alias,
14112 analyze,
14113 verbose,
14114 query_plan,
14115 estimate,
14116 statement: Box::new(statement),
14117 format,
14118 options,
14119 }),
14120 _ => {
14121 let hive_format =
14122 match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14123 Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14124 Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14125 _ => None,
14126 };
14127
14128 let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14129 self.parse_keyword(Keyword::TABLE)
14131 } else {
14132 false
14133 };
14134
14135 let table_name = self.parse_object_name(false)?;
14136 Ok(Statement::ExplainTable {
14137 describe_alias,
14138 hive_format,
14139 has_table_keyword,
14140 table_name,
14141 })
14142 }
14143 }
14144 }
14145
14146 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14151 pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14152 let _guard = self.recursion_counter.try_decrease()?;
14153 let with = if self.parse_keyword(Keyword::WITH) {
14154 let with_token = self.get_current_token();
14155 Some(With {
14156 with_token: with_token.clone().into(),
14157 recursive: self.parse_keyword(Keyword::RECURSIVE),
14158 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14159 })
14160 } else {
14161 None
14162 };
14163 if self.parse_keyword(Keyword::INSERT) {
14164 Ok(Query {
14165 with,
14166 body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14167 order_by: None,
14168 limit_clause: None,
14169 fetch: None,
14170 locks: vec![],
14171 for_clause: None,
14172 settings: None,
14173 format_clause: None,
14174 pipe_operators: vec![],
14175 }
14176 .into())
14177 } else if self.parse_keyword(Keyword::UPDATE) {
14178 Ok(Query {
14179 with,
14180 body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14181 order_by: None,
14182 limit_clause: None,
14183 fetch: None,
14184 locks: vec![],
14185 for_clause: None,
14186 settings: None,
14187 format_clause: None,
14188 pipe_operators: vec![],
14189 }
14190 .into())
14191 } else if self.parse_keyword(Keyword::DELETE) {
14192 Ok(Query {
14193 with,
14194 body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14195 limit_clause: None,
14196 order_by: None,
14197 fetch: None,
14198 locks: vec![],
14199 for_clause: None,
14200 settings: None,
14201 format_clause: None,
14202 pipe_operators: vec![],
14203 }
14204 .into())
14205 } else if self.parse_keyword(Keyword::MERGE) {
14206 Ok(Query {
14207 with,
14208 body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14209 limit_clause: None,
14210 order_by: None,
14211 fetch: None,
14212 locks: vec![],
14213 for_clause: None,
14214 settings: None,
14215 format_clause: None,
14216 pipe_operators: vec![],
14217 }
14218 .into())
14219 } else {
14220 let body = self.parse_query_body(self.dialect.prec_unknown())?;
14221
14222 let order_by = self.parse_optional_order_by()?;
14223
14224 let limit_clause = self.parse_optional_limit_clause()?;
14225
14226 let settings = self.parse_settings()?;
14227
14228 let fetch = if self.parse_keyword(Keyword::FETCH) {
14229 Some(self.parse_fetch()?)
14230 } else {
14231 None
14232 };
14233
14234 let mut for_clause = None;
14235 let mut locks = Vec::new();
14236 while self.parse_keyword(Keyword::FOR) {
14237 if let Some(parsed_for_clause) = self.parse_for_clause()? {
14238 for_clause = Some(parsed_for_clause);
14239 break;
14240 } else {
14241 locks.push(self.parse_lock()?);
14242 }
14243 }
14244 let format_clause =
14245 if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14246 if self.parse_keyword(Keyword::NULL) {
14247 Some(FormatClause::Null)
14248 } else {
14249 let ident = self.parse_identifier()?;
14250 Some(FormatClause::Identifier(ident))
14251 }
14252 } else {
14253 None
14254 };
14255
14256 let pipe_operators = if self.dialect.supports_pipe_operator() {
14257 self.parse_pipe_operators()?
14258 } else {
14259 Vec::new()
14260 };
14261
14262 Ok(Query {
14263 with,
14264 body,
14265 order_by,
14266 limit_clause,
14267 fetch,
14268 locks,
14269 for_clause,
14270 settings,
14271 format_clause,
14272 pipe_operators,
14273 }
14274 .into())
14275 }
14276 }
14277
14278 fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14279 let mut pipe_operators = Vec::new();
14280
14281 while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14282 let kw = self.expect_one_of_keywords(&[
14283 Keyword::SELECT,
14284 Keyword::EXTEND,
14285 Keyword::SET,
14286 Keyword::DROP,
14287 Keyword::AS,
14288 Keyword::WHERE,
14289 Keyword::LIMIT,
14290 Keyword::AGGREGATE,
14291 Keyword::ORDER,
14292 Keyword::TABLESAMPLE,
14293 Keyword::RENAME,
14294 Keyword::UNION,
14295 Keyword::INTERSECT,
14296 Keyword::EXCEPT,
14297 Keyword::CALL,
14298 Keyword::PIVOT,
14299 Keyword::UNPIVOT,
14300 Keyword::JOIN,
14301 Keyword::INNER,
14302 Keyword::LEFT,
14303 Keyword::RIGHT,
14304 Keyword::FULL,
14305 Keyword::CROSS,
14306 ])?;
14307 match kw {
14308 Keyword::SELECT => {
14309 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14310 pipe_operators.push(PipeOperator::Select { exprs })
14311 }
14312 Keyword::EXTEND => {
14313 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14314 pipe_operators.push(PipeOperator::Extend { exprs })
14315 }
14316 Keyword::SET => {
14317 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14318 pipe_operators.push(PipeOperator::Set { assignments })
14319 }
14320 Keyword::DROP => {
14321 let columns = self.parse_identifiers()?;
14322 pipe_operators.push(PipeOperator::Drop { columns })
14323 }
14324 Keyword::AS => {
14325 let alias = self.parse_identifier()?;
14326 pipe_operators.push(PipeOperator::As { alias })
14327 }
14328 Keyword::WHERE => {
14329 let expr = self.parse_expr()?;
14330 pipe_operators.push(PipeOperator::Where { expr })
14331 }
14332 Keyword::LIMIT => {
14333 let expr = self.parse_expr()?;
14334 let offset = if self.parse_keyword(Keyword::OFFSET) {
14335 Some(self.parse_expr()?)
14336 } else {
14337 None
14338 };
14339 pipe_operators.push(PipeOperator::Limit { expr, offset })
14340 }
14341 Keyword::AGGREGATE => {
14342 let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14343 vec![]
14344 } else {
14345 self.parse_comma_separated(|parser| {
14346 parser.parse_expr_with_alias_and_order_by()
14347 })?
14348 };
14349
14350 let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14351 self.parse_comma_separated(|parser| {
14352 parser.parse_expr_with_alias_and_order_by()
14353 })?
14354 } else {
14355 vec![]
14356 };
14357
14358 pipe_operators.push(PipeOperator::Aggregate {
14359 full_table_exprs,
14360 group_by_expr,
14361 })
14362 }
14363 Keyword::ORDER => {
14364 self.expect_one_of_keywords(&[Keyword::BY])?;
14365 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14366 pipe_operators.push(PipeOperator::OrderBy { exprs })
14367 }
14368 Keyword::TABLESAMPLE => {
14369 let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14370 pipe_operators.push(PipeOperator::TableSample { sample });
14371 }
14372 Keyword::RENAME => {
14373 let mappings =
14374 self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14375 pipe_operators.push(PipeOperator::Rename { mappings });
14376 }
14377 Keyword::UNION => {
14378 let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14379 let queries = self.parse_pipe_operator_queries()?;
14380 pipe_operators.push(PipeOperator::Union {
14381 set_quantifier,
14382 queries,
14383 });
14384 }
14385 Keyword::INTERSECT => {
14386 let set_quantifier =
14387 self.parse_distinct_required_set_quantifier("INTERSECT")?;
14388 let queries = self.parse_pipe_operator_queries()?;
14389 pipe_operators.push(PipeOperator::Intersect {
14390 set_quantifier,
14391 queries,
14392 });
14393 }
14394 Keyword::EXCEPT => {
14395 let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14396 let queries = self.parse_pipe_operator_queries()?;
14397 pipe_operators.push(PipeOperator::Except {
14398 set_quantifier,
14399 queries,
14400 });
14401 }
14402 Keyword::CALL => {
14403 let function_name = self.parse_object_name(false)?;
14404 let function_expr = self.parse_function(function_name)?;
14405 if let Expr::Function(function) = function_expr {
14406 let alias = self.parse_identifier_optional_alias()?;
14407 pipe_operators.push(PipeOperator::Call { function, alias });
14408 } else {
14409 return Err(ParserError::ParserError(
14410 "Expected function call after CALL".to_string(),
14411 ));
14412 }
14413 }
14414 Keyword::PIVOT => {
14415 self.expect_token(&Token::LParen)?;
14416 let aggregate_functions =
14417 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14418 self.expect_keyword_is(Keyword::FOR)?;
14419 let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14420 self.expect_keyword_is(Keyword::IN)?;
14421
14422 self.expect_token(&Token::LParen)?;
14423 let value_source = if self.parse_keyword(Keyword::ANY) {
14424 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14425 self.parse_comma_separated(Parser::parse_order_by_expr)?
14426 } else {
14427 vec![]
14428 };
14429 PivotValueSource::Any(order_by)
14430 } else if self.peek_sub_query() {
14431 PivotValueSource::Subquery(self.parse_query()?)
14432 } else {
14433 PivotValueSource::List(
14434 self.parse_comma_separated(Self::parse_expr_with_alias)?,
14435 )
14436 };
14437 self.expect_token(&Token::RParen)?;
14438 self.expect_token(&Token::RParen)?;
14439
14440 let alias = self.parse_identifier_optional_alias()?;
14441
14442 pipe_operators.push(PipeOperator::Pivot {
14443 aggregate_functions,
14444 value_column,
14445 value_source,
14446 alias,
14447 });
14448 }
14449 Keyword::UNPIVOT => {
14450 self.expect_token(&Token::LParen)?;
14451 let value_column = self.parse_identifier()?;
14452 self.expect_keyword(Keyword::FOR)?;
14453 let name_column = self.parse_identifier()?;
14454 self.expect_keyword(Keyword::IN)?;
14455
14456 self.expect_token(&Token::LParen)?;
14457 let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14458 self.expect_token(&Token::RParen)?;
14459
14460 self.expect_token(&Token::RParen)?;
14461
14462 let alias = self.parse_identifier_optional_alias()?;
14463
14464 pipe_operators.push(PipeOperator::Unpivot {
14465 value_column,
14466 name_column,
14467 unpivot_columns,
14468 alias,
14469 });
14470 }
14471 Keyword::JOIN
14472 | Keyword::INNER
14473 | Keyword::LEFT
14474 | Keyword::RIGHT
14475 | Keyword::FULL
14476 | Keyword::CROSS => {
14477 self.prev_token();
14478 let mut joins = self.parse_joins()?;
14479 if joins.len() != 1 {
14480 return Err(ParserError::ParserError(
14481 "Join pipe operator must have a single join".to_string(),
14482 ));
14483 }
14484 let join = joins.swap_remove(0);
14485 pipe_operators.push(PipeOperator::Join(join))
14486 }
14487 unhandled => {
14488 return Err(ParserError::ParserError(format!(
14489 "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14490 )))
14491 }
14492 }
14493 }
14494 Ok(pipe_operators)
14495 }
14496
14497 fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14498 let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14499 {
14500 let key_values = self.parse_comma_separated(|p| {
14501 let key = p.parse_identifier()?;
14502 p.expect_token(&Token::Eq)?;
14503 let value = p.parse_expr()?;
14504 Ok(Setting { key, value })
14505 })?;
14506 Some(key_values)
14507 } else {
14508 None
14509 };
14510 Ok(settings)
14511 }
14512
14513 pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14515 if self.parse_keyword(Keyword::XML) {
14516 Ok(Some(self.parse_for_xml()?))
14517 } else if self.parse_keyword(Keyword::JSON) {
14518 Ok(Some(self.parse_for_json()?))
14519 } else if self.parse_keyword(Keyword::BROWSE) {
14520 Ok(Some(ForClause::Browse))
14521 } else {
14522 Ok(None)
14523 }
14524 }
14525
14526 pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14528 let for_xml = if self.parse_keyword(Keyword::RAW) {
14529 let mut element_name = None;
14530 if self.peek_token_ref().token == Token::LParen {
14531 self.expect_token(&Token::LParen)?;
14532 element_name = Some(self.parse_literal_string()?);
14533 self.expect_token(&Token::RParen)?;
14534 }
14535 ForXml::Raw(element_name)
14536 } else if self.parse_keyword(Keyword::AUTO) {
14537 ForXml::Auto
14538 } else if self.parse_keyword(Keyword::EXPLICIT) {
14539 ForXml::Explicit
14540 } else if self.parse_keyword(Keyword::PATH) {
14541 let mut element_name = None;
14542 if self.peek_token_ref().token == Token::LParen {
14543 self.expect_token(&Token::LParen)?;
14544 element_name = Some(self.parse_literal_string()?);
14545 self.expect_token(&Token::RParen)?;
14546 }
14547 ForXml::Path(element_name)
14548 } else {
14549 return Err(ParserError::ParserError(
14550 "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14551 ));
14552 };
14553 let mut elements = false;
14554 let mut binary_base64 = false;
14555 let mut root = None;
14556 let mut r#type = false;
14557 while self.peek_token_ref().token == Token::Comma {
14558 self.next_token();
14559 if self.parse_keyword(Keyword::ELEMENTS) {
14560 elements = true;
14561 } else if self.parse_keyword(Keyword::BINARY) {
14562 self.expect_keyword_is(Keyword::BASE64)?;
14563 binary_base64 = true;
14564 } else if self.parse_keyword(Keyword::ROOT) {
14565 self.expect_token(&Token::LParen)?;
14566 root = Some(self.parse_literal_string()?);
14567 self.expect_token(&Token::RParen)?;
14568 } else if self.parse_keyword(Keyword::TYPE) {
14569 r#type = true;
14570 }
14571 }
14572 Ok(ForClause::Xml {
14573 for_xml,
14574 elements,
14575 binary_base64,
14576 root,
14577 r#type,
14578 })
14579 }
14580
14581 pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14583 let for_json = if self.parse_keyword(Keyword::AUTO) {
14584 ForJson::Auto
14585 } else if self.parse_keyword(Keyword::PATH) {
14586 ForJson::Path
14587 } else {
14588 return Err(ParserError::ParserError(
14589 "Expected FOR JSON [AUTO | PATH ]".to_string(),
14590 ));
14591 };
14592 let mut root = None;
14593 let mut include_null_values = false;
14594 let mut without_array_wrapper = false;
14595 while self.peek_token_ref().token == Token::Comma {
14596 self.next_token();
14597 if self.parse_keyword(Keyword::ROOT) {
14598 self.expect_token(&Token::LParen)?;
14599 root = Some(self.parse_literal_string()?);
14600 self.expect_token(&Token::RParen)?;
14601 } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14602 include_null_values = true;
14603 } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14604 without_array_wrapper = true;
14605 }
14606 }
14607 Ok(ForClause::Json {
14608 for_json,
14609 root,
14610 include_null_values,
14611 without_array_wrapper,
14612 })
14613 }
14614
14615 pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
14617 let name = self.parse_identifier()?;
14618
14619 let as_optional = self.dialect.supports_cte_without_as();
14620
14621 if as_optional && !self.peek_keyword(Keyword::AS) {
14623 if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
14624 p.expect_token(&Token::LParen)?;
14625 let query = p.parse_query()?;
14626 let closing_paren_token = p.expect_token(&Token::RParen)?;
14627 Ok((query, closing_paren_token))
14628 })? {
14629 let mut cte = Cte {
14630 alias: TableAlias {
14631 explicit: false,
14632 name,
14633 columns: vec![],
14634 at: None,
14635 },
14636 query,
14637 from: None,
14638 materialized: None,
14639 closing_paren_token: closing_paren_token.into(),
14640 };
14641 if self.parse_keyword(Keyword::FROM) {
14642 cte.from = Some(self.parse_identifier()?);
14643 }
14644 return Ok(cte);
14645 }
14646 }
14647
14648 let columns = if self.parse_keyword(Keyword::AS) {
14650 vec![]
14651 } else {
14652 let columns = self.parse_table_alias_column_defs()?;
14653 if as_optional {
14654 let _ = self.parse_keyword(Keyword::AS);
14655 } else {
14656 self.expect_keyword_is(Keyword::AS)?;
14657 }
14658 columns
14659 };
14660
14661 let mut is_materialized = None;
14662 if dialect_of!(self is PostgreSqlDialect) {
14663 if self.parse_keyword(Keyword::MATERIALIZED) {
14664 is_materialized = Some(CteAsMaterialized::Materialized);
14665 } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
14666 is_materialized = Some(CteAsMaterialized::NotMaterialized);
14667 }
14668 }
14669
14670 self.expect_token(&Token::LParen)?;
14671 let query = self.parse_query()?;
14672 let closing_paren_token = self.expect_token(&Token::RParen)?;
14673
14674 let mut cte = Cte {
14675 alias: TableAlias {
14676 explicit: false,
14677 name,
14678 columns,
14679 at: None,
14680 },
14681 query,
14682 from: None,
14683 materialized: is_materialized,
14684 closing_paren_token: closing_paren_token.into(),
14685 };
14686 if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
14687 cte.from = Some(self.parse_identifier()?);
14688 }
14689 Ok(cte)
14690 }
14691
14692 pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
14701 let expr = if self.peek_keyword(Keyword::SELECT)
14704 || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
14705 {
14706 SetExpr::Select(self.parse_select().map(Box::new)?)
14707 } else if self.consume_token(&Token::LParen) {
14708 let subquery = self.parse_query()?;
14710 self.expect_token(&Token::RParen)?;
14711 SetExpr::Query(subquery)
14712 } else if self.parse_keyword(Keyword::VALUES) {
14713 let is_mysql = dialect_of!(self is MySqlDialect);
14714 SetExpr::Values(self.parse_values(is_mysql, false)?)
14715 } else if self.parse_keyword(Keyword::VALUE) {
14716 let is_mysql = dialect_of!(self is MySqlDialect);
14717 SetExpr::Values(self.parse_values(is_mysql, true)?)
14718 } else if self.parse_keyword(Keyword::TABLE) {
14719 SetExpr::Table(Box::new(self.parse_as_table()?))
14720 } else {
14721 return self.expected_ref(
14722 "SELECT, VALUES, or a subquery in the query body",
14723 self.peek_token_ref(),
14724 );
14725 };
14726
14727 self.parse_remaining_set_exprs(expr, precedence)
14728 }
14729
14730 fn parse_remaining_set_exprs(
14734 &mut self,
14735 mut expr: SetExpr,
14736 precedence: u8,
14737 ) -> Result<Box<SetExpr>, ParserError> {
14738 loop {
14739 let op = self.parse_set_operator(&self.peek_token().token);
14741 let next_precedence = match op {
14742 Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
14744 10
14745 }
14746 Some(SetOperator::Intersect) => 20,
14748 None => break,
14750 };
14751 if precedence >= next_precedence {
14752 break;
14753 }
14754 self.next_token(); let set_quantifier = self.parse_set_quantifier(&op);
14756 expr = SetExpr::SetOperation {
14757 left: Box::new(expr),
14758 op: op.unwrap(),
14759 set_quantifier,
14760 right: self.parse_query_body(next_precedence)?,
14761 };
14762 }
14763
14764 Ok(expr.into())
14765 }
14766
14767 pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
14769 match token {
14770 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
14771 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
14772 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
14773 Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
14774 _ => None,
14775 }
14776 }
14777
14778 pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
14780 match op {
14781 Some(
14782 SetOperator::Except
14783 | SetOperator::Intersect
14784 | SetOperator::Union
14785 | SetOperator::Minus,
14786 ) => {
14787 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
14788 SetQuantifier::DistinctByName
14789 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14790 SetQuantifier::ByName
14791 } else if self.parse_keyword(Keyword::ALL) {
14792 if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
14793 SetQuantifier::AllByName
14794 } else {
14795 SetQuantifier::All
14796 }
14797 } else if self.parse_keyword(Keyword::DISTINCT) {
14798 SetQuantifier::Distinct
14799 } else {
14800 SetQuantifier::None
14801 }
14802 }
14803 _ => SetQuantifier::None,
14804 }
14805 }
14806
14807 pub fn parse_select(&mut self) -> Result<Select, ParserError> {
14809 let mut from_first = None;
14810
14811 if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
14812 let from_token = self.expect_keyword(Keyword::FROM)?;
14813 let from = self.parse_table_with_joins()?;
14814 if !self.peek_keyword(Keyword::SELECT) {
14815 return Ok(Select {
14816 select_token: AttachedToken(from_token),
14817 optimizer_hints: vec![],
14818 distinct: None,
14819 select_modifiers: None,
14820 top: None,
14821 top_before_distinct: false,
14822 projection: vec![],
14823 exclude: None,
14824 into: None,
14825 from,
14826 lateral_views: vec![],
14827 prewhere: None,
14828 selection: None,
14829 group_by: GroupByExpr::Expressions(vec![], vec![]),
14830 cluster_by: vec![],
14831 distribute_by: vec![],
14832 sort_by: vec![],
14833 having: None,
14834 named_window: vec![],
14835 window_before_qualify: false,
14836 qualify: None,
14837 value_table_mode: None,
14838 connect_by: vec![],
14839 flavor: SelectFlavor::FromFirstNoSelect,
14840 });
14841 }
14842 from_first = Some(from);
14843 }
14844
14845 let select_token = self.expect_keyword(Keyword::SELECT)?;
14846 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14847 let value_table_mode = self.parse_value_table_mode()?;
14848
14849 let (select_modifiers, distinct_select_modifier) =
14850 if self.dialect.supports_select_modifiers() {
14851 self.parse_select_modifiers()?
14852 } else {
14853 (None, None)
14854 };
14855
14856 let mut top_before_distinct = false;
14857 let mut top = None;
14858 if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14859 top = Some(self.parse_top()?);
14860 top_before_distinct = true;
14861 }
14862
14863 let distinct = if distinct_select_modifier.is_some() {
14864 distinct_select_modifier
14865 } else {
14866 self.parse_all_or_distinct()?
14867 };
14868
14869 if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
14870 top = Some(self.parse_top()?);
14871 }
14872
14873 let projection =
14874 if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
14875 vec![]
14876 } else {
14877 self.parse_projection()?
14878 };
14879
14880 let exclude = if self.dialect.supports_select_exclude() {
14881 self.parse_optional_select_item_exclude()?
14882 } else {
14883 None
14884 };
14885
14886 let into = if self.parse_keyword(Keyword::INTO) {
14887 Some(self.parse_select_into()?)
14888 } else {
14889 None
14890 };
14891
14892 let (from, from_first) = if let Some(from) = from_first.take() {
14898 (from, true)
14899 } else if self.parse_keyword(Keyword::FROM) {
14900 (self.parse_table_with_joins()?, false)
14901 } else {
14902 (vec![], false)
14903 };
14904
14905 let mut lateral_views = vec![];
14906 loop {
14907 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
14908 let outer = self.parse_keyword(Keyword::OUTER);
14909 let lateral_view = self.parse_expr()?;
14910 let lateral_view_name = self.parse_object_name(false)?;
14911 let lateral_col_alias = self
14912 .parse_comma_separated(|parser| {
14913 parser.parse_optional_alias(&[
14914 Keyword::WHERE,
14915 Keyword::GROUP,
14916 Keyword::CLUSTER,
14917 Keyword::HAVING,
14918 Keyword::LATERAL,
14919 ]) })?
14921 .into_iter()
14922 .flatten()
14923 .collect();
14924
14925 lateral_views.push(LateralView {
14926 lateral_view,
14927 lateral_view_name,
14928 lateral_col_alias,
14929 outer,
14930 });
14931 } else {
14932 break;
14933 }
14934 }
14935
14936 let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
14937 {
14938 Some(self.parse_expr()?)
14939 } else {
14940 None
14941 };
14942
14943 let selection = if self.parse_keyword(Keyword::WHERE) {
14944 Some(self.parse_expr()?)
14945 } else {
14946 None
14947 };
14948
14949 let connect_by = self.maybe_parse_connect_by()?;
14950
14951 let group_by = self
14952 .parse_optional_group_by()?
14953 .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
14954
14955 let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
14956 self.parse_comma_separated(Parser::parse_expr)?
14957 } else {
14958 vec![]
14959 };
14960
14961 let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
14962 self.parse_comma_separated(Parser::parse_expr)?
14963 } else {
14964 vec![]
14965 };
14966
14967 let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
14968 self.parse_comma_separated(Parser::parse_order_by_expr)?
14969 } else {
14970 vec![]
14971 };
14972
14973 let having = if self.parse_keyword(Keyword::HAVING) {
14974 Some(self.parse_expr()?)
14975 } else {
14976 None
14977 };
14978
14979 let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
14981 {
14982 let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
14983 if self.parse_keyword(Keyword::QUALIFY) {
14984 (named_windows, Some(self.parse_expr()?), true)
14985 } else {
14986 (named_windows, None, true)
14987 }
14988 } else if self.parse_keyword(Keyword::QUALIFY) {
14989 let qualify = Some(self.parse_expr()?);
14990 if self.parse_keyword(Keyword::WINDOW) {
14991 (
14992 self.parse_comma_separated(Parser::parse_named_window)?,
14993 qualify,
14994 false,
14995 )
14996 } else {
14997 (Default::default(), qualify, false)
14998 }
14999 } else {
15000 Default::default()
15001 };
15002
15003 Ok(Select {
15004 select_token: AttachedToken(select_token),
15005 optimizer_hints,
15006 distinct,
15007 select_modifiers,
15008 top,
15009 top_before_distinct,
15010 projection,
15011 exclude,
15012 into,
15013 from,
15014 lateral_views,
15015 prewhere,
15016 selection,
15017 group_by,
15018 cluster_by,
15019 distribute_by,
15020 sort_by,
15021 having,
15022 named_window: named_windows,
15023 window_before_qualify,
15024 qualify,
15025 value_table_mode,
15026 connect_by,
15027 flavor: if from_first {
15028 SelectFlavor::FromFirst
15029 } else {
15030 SelectFlavor::Standard
15031 },
15032 })
15033 }
15034
15035 fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15044 let supports_hints = self.dialect.supports_comment_optimizer_hint();
15045 if !supports_hints {
15046 return Ok(vec![]);
15047 }
15048 let mut hints = vec![];
15049 loop {
15050 let t = self.peek_nth_token_no_skip_ref(0);
15051 let Token::Whitespace(ws) = &t.token else {
15052 break;
15053 };
15054 match ws {
15055 Whitespace::SingleLineComment { comment, prefix } => {
15056 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15057 hints.push(OptimizerHint {
15058 prefix: hint_prefix,
15059 text,
15060 style: OptimizerHintStyle::SingleLine {
15061 prefix: prefix.clone(),
15062 },
15063 });
15064 }
15065 self.next_token_no_skip();
15066 }
15067 Whitespace::MultiLineComment(comment) => {
15068 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15069 hints.push(OptimizerHint {
15070 prefix: hint_prefix,
15071 text,
15072 style: OptimizerHintStyle::MultiLine,
15073 });
15074 }
15075 self.next_token_no_skip();
15076 }
15077 Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15078 self.next_token_no_skip();
15079 }
15080 }
15081 }
15082 Ok(hints)
15083 }
15084
15085 fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15088 let (before_plus, text) = comment.split_once('+')?;
15089 if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15090 Some((before_plus.to_string(), text.to_string()))
15091 } else {
15092 None
15093 }
15094 }
15095
15096 fn parse_select_modifiers(
15103 &mut self,
15104 ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15105 let mut modifiers = SelectModifiers::default();
15106 let mut distinct = None;
15107
15108 let keywords = &[
15109 Keyword::ALL,
15110 Keyword::DISTINCT,
15111 Keyword::DISTINCTROW,
15112 Keyword::HIGH_PRIORITY,
15113 Keyword::STRAIGHT_JOIN,
15114 Keyword::SQL_SMALL_RESULT,
15115 Keyword::SQL_BIG_RESULT,
15116 Keyword::SQL_BUFFER_RESULT,
15117 Keyword::SQL_NO_CACHE,
15118 Keyword::SQL_CALC_FOUND_ROWS,
15119 ];
15120
15121 while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15122 match keyword {
15123 Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15124 self.prev_token();
15125 distinct = self.parse_all_or_distinct()?;
15126 }
15127 Keyword::DISTINCTROW if distinct.is_none() => {
15129 distinct = Some(Distinct::Distinct);
15130 }
15131 Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15132 Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15133 Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15134 Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15135 Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15136 Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15137 Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15138 _ => {
15139 self.prev_token();
15140 return self.expected_ref(
15141 "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15142 self.peek_token_ref(),
15143 );
15144 }
15145 }
15146 }
15147
15148 let select_modifiers = if modifiers.is_any_set() {
15151 Some(modifiers)
15152 } else {
15153 None
15154 };
15155 Ok((select_modifiers, distinct))
15156 }
15157
15158 fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15159 if !dialect_of!(self is BigQueryDialect) {
15160 return Ok(None);
15161 }
15162
15163 let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15164 Some(ValueTableMode::DistinctAsValue)
15165 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15166 Some(ValueTableMode::DistinctAsStruct)
15167 } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15168 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15169 {
15170 Some(ValueTableMode::AsValue)
15171 } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15172 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15173 {
15174 Some(ValueTableMode::AsStruct)
15175 } else if self.parse_keyword(Keyword::AS) {
15176 self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15177 } else {
15178 None
15179 };
15180
15181 Ok(mode)
15182 }
15183
15184 fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15188 where
15189 F: FnMut(&mut Parser) -> Result<T, ParserError>,
15190 {
15191 let current_state = self.state;
15192 self.state = state;
15193 let res = f(self);
15194 self.state = current_state;
15195 res
15196 }
15197
15198 pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15200 let mut clauses = Vec::with_capacity(2);
15201 loop {
15202 if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15203 clauses.push(ConnectByKind::StartWith {
15204 start_token: self.token_at(idx).clone().into(),
15205 condition: self.parse_expr()?.into(),
15206 });
15207 } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15208 {
15209 clauses.push(ConnectByKind::ConnectBy {
15210 connect_token: self.token_at(idx).clone().into(),
15211 nocycle: self.parse_keyword(Keyword::NOCYCLE),
15212 relationships: self.with_state(ParserState::ConnectBy, |parser| {
15213 parser.parse_comma_separated(Parser::parse_expr)
15214 })?,
15215 });
15216 } else {
15217 break;
15218 }
15219 }
15220 Ok(clauses)
15221 }
15222
15223 pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15225 let token1 = self.next_token();
15226 let token2 = self.next_token();
15227 let token3 = self.next_token();
15228
15229 let table_name;
15230 let schema_name;
15231 if token2 == Token::Period {
15232 match token1.token {
15233 Token::Word(w) => {
15234 schema_name = w.value;
15235 }
15236 _ => {
15237 return self.expected("Schema name", token1);
15238 }
15239 }
15240 match token3.token {
15241 Token::Word(w) => {
15242 table_name = w.value;
15243 }
15244 _ => {
15245 return self.expected("Table name", token3);
15246 }
15247 }
15248 Ok(Table {
15249 table_name: Some(table_name),
15250 schema_name: Some(schema_name),
15251 })
15252 } else {
15253 match token1.token {
15254 Token::Word(w) => {
15255 table_name = w.value;
15256 }
15257 _ => {
15258 return self.expected("Table name", token1);
15259 }
15260 }
15261 Ok(Table {
15262 table_name: Some(table_name),
15263 schema_name: None,
15264 })
15265 }
15266 }
15267
15268 fn parse_set_role(
15270 &mut self,
15271 modifier: Option<ContextModifier>,
15272 ) -> Result<Statement, ParserError> {
15273 self.expect_keyword_is(Keyword::ROLE)?;
15274
15275 let role_name = if self.parse_keyword(Keyword::NONE) {
15276 None
15277 } else {
15278 Some(self.parse_identifier()?)
15279 };
15280 Ok(Statement::Set(Set::SetRole {
15281 context_modifier: modifier,
15282 role_name,
15283 }))
15284 }
15285
15286 fn parse_set_values(
15287 &mut self,
15288 parenthesized_assignment: bool,
15289 ) -> Result<Vec<Expr>, ParserError> {
15290 let mut values = vec![];
15291
15292 if parenthesized_assignment {
15293 self.expect_token(&Token::LParen)?;
15294 }
15295
15296 loop {
15297 let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15298 expr
15299 } else if let Ok(expr) = self.parse_expr() {
15300 expr
15301 } else {
15302 self.expected_ref("variable value", self.peek_token_ref())?
15303 };
15304
15305 values.push(value);
15306 if self.consume_token(&Token::Comma) {
15307 continue;
15308 }
15309
15310 if parenthesized_assignment {
15311 self.expect_token(&Token::RParen)?;
15312 }
15313 return Ok(values);
15314 }
15315 }
15316
15317 fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15318 let modifier =
15319 self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15320
15321 Self::keyword_to_modifier(modifier)
15322 }
15323
15324 fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15326 let scope = self.parse_context_modifier();
15327
15328 let name = if self.dialect.supports_parenthesized_set_variables()
15329 && self.consume_token(&Token::LParen)
15330 {
15331 self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15335 } else {
15336 self.parse_object_name(false)?
15337 };
15338
15339 if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15340 return self.expected_ref("assignment operator", self.peek_token_ref());
15341 }
15342
15343 let value = self.parse_expr()?;
15344
15345 Ok(SetAssignment { scope, name, value })
15346 }
15347
15348 fn parse_set(&mut self) -> Result<Statement, ParserError> {
15349 let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15350
15351 let scope = if !hivevar {
15353 self.parse_context_modifier()
15354 } else {
15355 None
15356 };
15357
15358 if hivevar {
15359 self.expect_token(&Token::Colon)?;
15360 }
15361
15362 if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15363 return Ok(set_role_stmt);
15364 }
15365
15366 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15368 || self.parse_keyword(Keyword::TIMEZONE)
15369 {
15370 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15371 return Ok(Set::SingleAssignment {
15372 scope,
15373 hivevar,
15374 variable: ObjectName::from(vec!["TIMEZONE".into()]),
15375 values: self.parse_set_values(false)?,
15376 }
15377 .into());
15378 } else {
15379 return Ok(Set::SetTimeZone {
15383 local: scope == Some(ContextModifier::Local),
15384 value: self.parse_expr()?,
15385 }
15386 .into());
15387 }
15388 } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15389 if self.parse_keyword(Keyword::DEFAULT) {
15390 return Ok(Set::SetNamesDefault {}.into());
15391 }
15392 let charset_name = self.parse_identifier()?;
15393 let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15394 Some(self.parse_literal_string()?)
15395 } else {
15396 None
15397 };
15398
15399 return Ok(Set::SetNames {
15400 charset_name,
15401 collation_name,
15402 }
15403 .into());
15404 } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15405 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15406 return Ok(Set::SetTransaction {
15407 modes: self.parse_transaction_modes()?,
15408 snapshot: None,
15409 session: true,
15410 }
15411 .into());
15412 } else if self.parse_keyword(Keyword::TRANSACTION) {
15413 if self.parse_keyword(Keyword::SNAPSHOT) {
15414 let snapshot_id = self.parse_value()?;
15415 return Ok(Set::SetTransaction {
15416 modes: vec![],
15417 snapshot: Some(snapshot_id),
15418 session: false,
15419 }
15420 .into());
15421 }
15422 return Ok(Set::SetTransaction {
15423 modes: self.parse_transaction_modes()?,
15424 snapshot: None,
15425 session: false,
15426 }
15427 .into());
15428 } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15429 let scope = match scope {
15430 Some(s) => s,
15431 None => {
15432 return self.expected_at(
15433 "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15434 self.get_current_index(),
15435 )
15436 }
15437 };
15438 let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15439 SetSessionAuthorizationParamKind::Default
15440 } else {
15441 let value = self.parse_identifier()?;
15442 SetSessionAuthorizationParamKind::User(value)
15443 };
15444 return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15445 scope,
15446 kind: auth_value,
15447 })
15448 .into());
15449 }
15450
15451 if self.dialect.supports_comma_separated_set_assignments() {
15452 if scope.is_some() {
15453 self.prev_token();
15454 }
15455
15456 if let Some(assignments) = self
15457 .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15458 {
15459 return if assignments.len() > 1 {
15460 Ok(Set::MultipleAssignments { assignments }.into())
15461 } else {
15462 let SetAssignment { scope, name, value } =
15463 assignments.into_iter().next().ok_or_else(|| {
15464 ParserError::ParserError("Expected at least one assignment".to_string())
15465 })?;
15466
15467 Ok(Set::SingleAssignment {
15468 scope,
15469 hivevar,
15470 variable: name,
15471 values: vec![value],
15472 }
15473 .into())
15474 };
15475 }
15476 }
15477
15478 let variables = if self.dialect.supports_parenthesized_set_variables()
15479 && self.consume_token(&Token::LParen)
15480 {
15481 let vars = OneOrManyWithParens::Many(
15482 self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15483 .into_iter()
15484 .map(|ident| ObjectName::from(vec![ident]))
15485 .collect(),
15486 );
15487 self.expect_token(&Token::RParen)?;
15488 vars
15489 } else {
15490 OneOrManyWithParens::One(self.parse_object_name(false)?)
15491 };
15492
15493 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15494 let stmt = match variables {
15495 OneOrManyWithParens::One(var) => Set::SingleAssignment {
15496 scope,
15497 hivevar,
15498 variable: var,
15499 values: self.parse_set_values(false)?,
15500 },
15501 OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15502 variables: vars,
15503 values: self.parse_set_values(true)?,
15504 },
15505 };
15506
15507 return Ok(stmt.into());
15508 }
15509
15510 if self.dialect.supports_set_stmt_without_operator() {
15511 self.prev_token();
15512 return self.parse_set_session_params();
15513 };
15514
15515 self.expected_ref("equals sign or TO", self.peek_token_ref())
15516 }
15517
15518 pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15520 if self.parse_keyword(Keyword::STATISTICS) {
15521 let topic = match self.parse_one_of_keywords(&[
15522 Keyword::IO,
15523 Keyword::PROFILE,
15524 Keyword::TIME,
15525 Keyword::XML,
15526 ]) {
15527 Some(Keyword::IO) => SessionParamStatsTopic::IO,
15528 Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15529 Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15530 Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15531 _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15532 };
15533 let value = self.parse_session_param_value()?;
15534 Ok(
15535 Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15536 topic,
15537 value,
15538 }))
15539 .into(),
15540 )
15541 } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15542 let obj = self.parse_object_name(false)?;
15543 let value = self.parse_session_param_value()?;
15544 Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15545 SetSessionParamIdentityInsert { obj, value },
15546 ))
15547 .into())
15548 } else if self.parse_keyword(Keyword::OFFSETS) {
15549 let keywords = self.parse_comma_separated(|parser| {
15550 let next_token = parser.next_token();
15551 match &next_token.token {
15552 Token::Word(w) => Ok(w.to_string()),
15553 _ => parser.expected("SQL keyword", next_token),
15554 }
15555 })?;
15556 let value = self.parse_session_param_value()?;
15557 Ok(
15558 Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15559 keywords,
15560 value,
15561 }))
15562 .into(),
15563 )
15564 } else {
15565 let names = self.parse_comma_separated(|parser| {
15566 let next_token = parser.next_token();
15567 match next_token.token {
15568 Token::Word(w) => Ok(w.to_string()),
15569 _ => parser.expected("Session param name", next_token),
15570 }
15571 })?;
15572 let value = self.parse_expr()?.to_string();
15573 Ok(
15574 Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15575 names,
15576 value,
15577 }))
15578 .into(),
15579 )
15580 }
15581 }
15582
15583 fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15584 if self.parse_keyword(Keyword::ON) {
15585 Ok(SessionParamValue::On)
15586 } else if self.parse_keyword(Keyword::OFF) {
15587 Ok(SessionParamValue::Off)
15588 } else {
15589 self.expected_ref("ON or OFF", self.peek_token_ref())
15590 }
15591 }
15592
15593 pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15595 let terse = self.parse_keyword(Keyword::TERSE);
15596 let extended = self.parse_keyword(Keyword::EXTENDED);
15597 let full = self.parse_keyword(Keyword::FULL);
15598 let session = self.parse_keyword(Keyword::SESSION);
15599 let global = self.parse_keyword(Keyword::GLOBAL);
15600 let external = self.parse_keyword(Keyword::EXTERNAL);
15601 if self
15602 .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15603 .is_some()
15604 {
15605 Ok(self.parse_show_columns(extended, full)?)
15606 } else if self.parse_keyword(Keyword::TABLES) {
15607 Ok(self.parse_show_tables(terse, extended, full, external)?)
15608 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15609 Ok(self.parse_show_views(terse, true)?)
15610 } else if self.parse_keyword(Keyword::VIEWS) {
15611 Ok(self.parse_show_views(terse, false)?)
15612 } else if self.parse_keyword(Keyword::FUNCTIONS) {
15613 Ok(self.parse_show_functions()?)
15614 } else if self.parse_keyword(Keyword::PROCESSLIST) {
15615 Ok(Statement::ShowProcessList { full })
15616 } else if extended || full {
15617 Err(ParserError::ParserError(
15618 "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
15619 ))
15620 } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
15621 Ok(self.parse_show_create()?)
15622 } else if self.parse_keyword(Keyword::COLLATION) {
15623 Ok(self.parse_show_collation()?)
15624 } else if self.parse_keyword(Keyword::VARIABLES)
15625 && dialect_of!(self is MySqlDialect | GenericDialect)
15626 {
15627 Ok(Statement::ShowVariables {
15628 filter: self.parse_show_statement_filter()?,
15629 session,
15630 global,
15631 })
15632 } else if self.parse_keyword(Keyword::STATUS)
15633 && dialect_of!(self is MySqlDialect | GenericDialect)
15634 {
15635 Ok(Statement::ShowStatus {
15636 filter: self.parse_show_statement_filter()?,
15637 session,
15638 global,
15639 })
15640 } else if self.parse_keyword(Keyword::CATALOGS) {
15641 self.parse_show_catalogs(terse)
15642 } else if self.parse_keyword(Keyword::DATABASES) {
15643 self.parse_show_databases(terse)
15644 } else if self.parse_keyword(Keyword::SCHEMAS) {
15645 self.parse_show_schemas(terse)
15646 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
15647 self.parse_show_charset(false)
15648 } else if self.parse_keyword(Keyword::CHARSET) {
15649 self.parse_show_charset(true)
15650 } else {
15651 Ok(Statement::ShowVariable {
15652 variable: self.parse_identifiers()?,
15653 })
15654 }
15655 }
15656
15657 fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
15658 Ok(Statement::ShowCharset(ShowCharset {
15660 is_shorthand,
15661 filter: self.parse_show_statement_filter()?,
15662 }))
15663 }
15664
15665 fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
15666 let history = self.parse_keyword(Keyword::HISTORY);
15667 let show_options = self.parse_show_stmt_options()?;
15668 Ok(Statement::ShowCatalogs {
15669 terse,
15670 history,
15671 show_options,
15672 })
15673 }
15674
15675 fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
15676 let history = self.parse_keyword(Keyword::HISTORY);
15677 let show_options = self.parse_show_stmt_options()?;
15678 Ok(Statement::ShowDatabases {
15679 terse,
15680 history,
15681 show_options,
15682 })
15683 }
15684
15685 fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
15686 let history = self.parse_keyword(Keyword::HISTORY);
15687 let show_options = self.parse_show_stmt_options()?;
15688 Ok(Statement::ShowSchemas {
15689 terse,
15690 history,
15691 show_options,
15692 })
15693 }
15694
15695 pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
15697 let obj_type = match self.expect_one_of_keywords(&[
15698 Keyword::TABLE,
15699 Keyword::TRIGGER,
15700 Keyword::FUNCTION,
15701 Keyword::PROCEDURE,
15702 Keyword::EVENT,
15703 Keyword::VIEW,
15704 ])? {
15705 Keyword::TABLE => Ok(ShowCreateObject::Table),
15706 Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
15707 Keyword::FUNCTION => Ok(ShowCreateObject::Function),
15708 Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
15709 Keyword::EVENT => Ok(ShowCreateObject::Event),
15710 Keyword::VIEW => Ok(ShowCreateObject::View),
15711 keyword => Err(ParserError::ParserError(format!(
15712 "Unable to map keyword to ShowCreateObject: {keyword:?}"
15713 ))),
15714 }?;
15715
15716 let obj_name = self.parse_object_name(false)?;
15717
15718 Ok(Statement::ShowCreate { obj_type, obj_name })
15719 }
15720
15721 pub fn parse_show_columns(
15723 &mut self,
15724 extended: bool,
15725 full: bool,
15726 ) -> Result<Statement, ParserError> {
15727 let show_options = self.parse_show_stmt_options()?;
15728 Ok(Statement::ShowColumns {
15729 extended,
15730 full,
15731 show_options,
15732 })
15733 }
15734
15735 fn parse_show_tables(
15736 &mut self,
15737 terse: bool,
15738 extended: bool,
15739 full: bool,
15740 external: bool,
15741 ) -> Result<Statement, ParserError> {
15742 let history = !external && self.parse_keyword(Keyword::HISTORY);
15743 let show_options = self.parse_show_stmt_options()?;
15744 Ok(Statement::ShowTables {
15745 terse,
15746 history,
15747 extended,
15748 full,
15749 external,
15750 show_options,
15751 })
15752 }
15753
15754 fn parse_show_views(
15755 &mut self,
15756 terse: bool,
15757 materialized: bool,
15758 ) -> Result<Statement, ParserError> {
15759 let show_options = self.parse_show_stmt_options()?;
15760 Ok(Statement::ShowViews {
15761 materialized,
15762 terse,
15763 show_options,
15764 })
15765 }
15766
15767 pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
15769 let filter = self.parse_show_statement_filter()?;
15770 Ok(Statement::ShowFunctions { filter })
15771 }
15772
15773 pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
15775 let filter = self.parse_show_statement_filter()?;
15776 Ok(Statement::ShowCollation { filter })
15777 }
15778
15779 pub fn parse_show_statement_filter(
15781 &mut self,
15782 ) -> Result<Option<ShowStatementFilter>, ParserError> {
15783 if self.parse_keyword(Keyword::LIKE) {
15784 Ok(Some(ShowStatementFilter::Like(
15785 self.parse_literal_string()?,
15786 )))
15787 } else if self.parse_keyword(Keyword::ILIKE) {
15788 Ok(Some(ShowStatementFilter::ILike(
15789 self.parse_literal_string()?,
15790 )))
15791 } else if self.parse_keyword(Keyword::WHERE) {
15792 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
15793 } else {
15794 self.maybe_parse(|parser| -> Result<String, ParserError> {
15795 parser.parse_literal_string()
15796 })?
15797 .map_or(Ok(None), |filter| {
15798 Ok(Some(ShowStatementFilter::NoKeyword(filter)))
15799 })
15800 }
15801 }
15802
15803 pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
15805 let parsed_keyword = if dialect_of!(self is HiveDialect) {
15807 if self.parse_keyword(Keyword::DEFAULT) {
15809 return Ok(Statement::Use(Use::Default));
15810 }
15811 None } else if dialect_of!(self is DatabricksDialect) {
15813 self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
15814 } else if dialect_of!(self is SnowflakeDialect) {
15815 self.parse_one_of_keywords(&[
15816 Keyword::DATABASE,
15817 Keyword::SCHEMA,
15818 Keyword::WAREHOUSE,
15819 Keyword::ROLE,
15820 Keyword::SECONDARY,
15821 ])
15822 } else {
15823 None };
15825
15826 let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
15827 self.parse_secondary_roles()?
15828 } else {
15829 let obj_name = self.parse_object_name(false)?;
15830 match parsed_keyword {
15831 Some(Keyword::CATALOG) => Use::Catalog(obj_name),
15832 Some(Keyword::DATABASE) => Use::Database(obj_name),
15833 Some(Keyword::SCHEMA) => Use::Schema(obj_name),
15834 Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
15835 Some(Keyword::ROLE) => Use::Role(obj_name),
15836 _ => Use::Object(obj_name),
15837 }
15838 };
15839
15840 Ok(Statement::Use(result))
15841 }
15842
15843 fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
15844 self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
15845 if self.parse_keyword(Keyword::NONE) {
15846 Ok(Use::SecondaryRoles(SecondaryRoles::None))
15847 } else if self.parse_keyword(Keyword::ALL) {
15848 Ok(Use::SecondaryRoles(SecondaryRoles::All))
15849 } else {
15850 let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
15851 Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
15852 }
15853 }
15854
15855 pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
15857 let relation = self.parse_table_factor()?;
15858 let joins = self.parse_joins()?;
15862 Ok(TableWithJoins { relation, joins })
15863 }
15864
15865 fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
15866 let mut joins = vec![];
15867 loop {
15868 let global = self.parse_keyword(Keyword::GLOBAL);
15869 let join = if self.parse_keyword(Keyword::CROSS) {
15870 let join_operator = if self.parse_keyword(Keyword::JOIN) {
15871 JoinOperator::CrossJoin(JoinConstraint::None)
15872 } else if self.parse_keyword(Keyword::APPLY) {
15873 JoinOperator::CrossApply
15875 } else {
15876 return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
15877 };
15878 let relation = self.parse_table_factor()?;
15879 let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
15880 && self.dialect.supports_cross_join_constraint()
15881 {
15882 let constraint = self.parse_join_constraint(false)?;
15883 JoinOperator::CrossJoin(constraint)
15884 } else {
15885 join_operator
15886 };
15887 Join {
15888 relation,
15889 global,
15890 join_operator,
15891 }
15892 } else if self.parse_keyword(Keyword::OUTER) {
15893 self.expect_keyword_is(Keyword::APPLY)?;
15895 Join {
15896 relation: self.parse_table_factor()?,
15897 global,
15898 join_operator: JoinOperator::OuterApply,
15899 }
15900 } else if self.parse_keyword(Keyword::ASOF) {
15901 self.expect_keyword_is(Keyword::JOIN)?;
15902 let relation = self.parse_table_factor()?;
15903 self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
15904 let match_condition = self.parse_parenthesized(Self::parse_expr)?;
15905 Join {
15906 relation,
15907 global,
15908 join_operator: JoinOperator::AsOf {
15909 match_condition,
15910 constraint: self.parse_join_constraint(false)?,
15911 },
15912 }
15913 } else if self.dialect.supports_array_join_syntax()
15914 && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
15915 {
15916 Join {
15918 relation: self.parse_table_factor()?,
15919 global,
15920 join_operator: JoinOperator::InnerArrayJoin,
15921 }
15922 } else if self.dialect.supports_array_join_syntax()
15923 && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
15924 {
15925 Join {
15927 relation: self.parse_table_factor()?,
15928 global,
15929 join_operator: JoinOperator::LeftArrayJoin,
15930 }
15931 } else if self.dialect.supports_array_join_syntax()
15932 && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
15933 {
15934 Join {
15936 relation: self.parse_table_factor()?,
15937 global,
15938 join_operator: JoinOperator::ArrayJoin,
15939 }
15940 } else {
15941 let natural = self.parse_keyword(Keyword::NATURAL);
15942 let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
15943 w.keyword
15944 } else {
15945 Keyword::NoKeyword
15946 };
15947
15948 let join_operator_type = match peek_keyword {
15949 Keyword::INNER | Keyword::JOIN => {
15950 let inner = self.parse_keyword(Keyword::INNER); self.expect_keyword_is(Keyword::JOIN)?;
15952 if inner {
15953 JoinOperator::Inner
15954 } else {
15955 JoinOperator::Join
15956 }
15957 }
15958 kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
15959 let _ = self.next_token(); let is_left = kw == Keyword::LEFT;
15961 let join_type = self.parse_one_of_keywords(&[
15962 Keyword::OUTER,
15963 Keyword::SEMI,
15964 Keyword::ANTI,
15965 Keyword::JOIN,
15966 ]);
15967 match join_type {
15968 Some(Keyword::OUTER) => {
15969 self.expect_keyword_is(Keyword::JOIN)?;
15970 if is_left {
15971 JoinOperator::LeftOuter
15972 } else {
15973 JoinOperator::RightOuter
15974 }
15975 }
15976 Some(Keyword::SEMI) => {
15977 self.expect_keyword_is(Keyword::JOIN)?;
15978 if is_left {
15979 JoinOperator::LeftSemi
15980 } else {
15981 JoinOperator::RightSemi
15982 }
15983 }
15984 Some(Keyword::ANTI) => {
15985 self.expect_keyword_is(Keyword::JOIN)?;
15986 if is_left {
15987 JoinOperator::LeftAnti
15988 } else {
15989 JoinOperator::RightAnti
15990 }
15991 }
15992 Some(Keyword::JOIN) => {
15993 if is_left {
15994 JoinOperator::Left
15995 } else {
15996 JoinOperator::Right
15997 }
15998 }
15999 _ => {
16000 return Err(ParserError::ParserError(format!(
16001 "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16002 )))
16003 }
16004 }
16005 }
16006 Keyword::ANTI => {
16007 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16009 JoinOperator::Anti
16010 }
16011 Keyword::SEMI => {
16012 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16014 JoinOperator::Semi
16015 }
16016 Keyword::FULL => {
16017 let _ = self.next_token(); let _ = self.parse_keyword(Keyword::OUTER); self.expect_keyword_is(Keyword::JOIN)?;
16020 JoinOperator::FullOuter
16021 }
16022 Keyword::OUTER => {
16023 return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16024 }
16025 Keyword::STRAIGHT_JOIN => {
16026 let _ = self.next_token(); JoinOperator::StraightJoin
16028 }
16029 _ if natural => {
16030 return self
16031 .expected_ref("a join type after NATURAL", self.peek_token_ref());
16032 }
16033 _ => break,
16034 };
16035 let mut relation = self.parse_table_factor()?;
16036
16037 if !self
16038 .dialect
16039 .supports_left_associative_joins_without_parens()
16040 && self.peek_parens_less_nested_join()
16041 {
16042 let joins = self.parse_joins()?;
16043 relation = TableFactor::NestedJoin {
16044 table_with_joins: Box::new(TableWithJoins { relation, joins }),
16045 alias: None,
16046 };
16047 }
16048
16049 let join_constraint = self.parse_join_constraint(natural)?;
16050 Join {
16051 relation,
16052 global,
16053 join_operator: join_operator_type(join_constraint),
16054 }
16055 };
16056 joins.push(join);
16057 }
16058 Ok(joins)
16059 }
16060
16061 fn peek_parens_less_nested_join(&self) -> bool {
16062 matches!(
16063 self.peek_token_ref().token,
16064 Token::Word(Word {
16065 keyword: Keyword::JOIN
16066 | Keyword::INNER
16067 | Keyword::LEFT
16068 | Keyword::RIGHT
16069 | Keyword::FULL,
16070 ..
16071 })
16072 )
16073 }
16074
16075 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16077 pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16078 let _guard = self.recursion_counter.try_decrease()?;
16079 if self.parse_keyword(Keyword::LATERAL) {
16080 if self.consume_token(&Token::LParen) {
16082 self.parse_derived_table_factor(Lateral)
16083 } else {
16084 let name = self.parse_object_name(false)?;
16085 self.expect_token(&Token::LParen)?;
16086 let args = self.parse_optional_args()?;
16087 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16088 let alias = self.maybe_parse_table_alias()?;
16089 Ok(TableFactor::Function {
16090 lateral: true,
16091 name,
16092 args,
16093 with_ordinality,
16094 alias,
16095 })
16096 }
16097 } else if self.parse_keyword(Keyword::TABLE) {
16098 self.expect_token(&Token::LParen)?;
16100 let expr = self.parse_expr()?;
16101 self.expect_token(&Token::RParen)?;
16102 let alias = self.maybe_parse_table_alias()?;
16103 Ok(TableFactor::TableFunction { expr, alias })
16104 } else if self.consume_token(&Token::LParen) {
16105 if let Some(mut table) =
16127 self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))?
16128 {
16129 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16130 {
16131 table = match kw {
16132 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16133 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16134 unexpected_keyword => return Err(ParserError::ParserError(
16135 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16136 )),
16137 }
16138 }
16139 return Ok(table);
16140 }
16141
16142 let mut table_and_joins = self.parse_table_and_joins()?;
16149
16150 #[allow(clippy::if_same_then_else)]
16151 if !table_and_joins.joins.is_empty() {
16152 self.expect_token(&Token::RParen)?;
16153 let alias = self.maybe_parse_table_alias()?;
16154 Ok(TableFactor::NestedJoin {
16155 table_with_joins: Box::new(table_and_joins),
16156 alias,
16157 }) } else if let TableFactor::NestedJoin {
16159 table_with_joins: _,
16160 alias: _,
16161 } = &table_and_joins.relation
16162 {
16163 self.expect_token(&Token::RParen)?;
16166 let alias = self.maybe_parse_table_alias()?;
16167 Ok(TableFactor::NestedJoin {
16168 table_with_joins: Box::new(table_and_joins),
16169 alias,
16170 })
16171 } else if self.dialect.supports_parens_around_table_factor() {
16172 self.expect_token(&Token::RParen)?;
16179
16180 if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16181 match &mut table_and_joins.relation {
16184 TableFactor::Derived { alias, .. }
16185 | TableFactor::Table { alias, .. }
16186 | TableFactor::Function { alias, .. }
16187 | TableFactor::UNNEST { alias, .. }
16188 | TableFactor::JsonTable { alias, .. }
16189 | TableFactor::XmlTable { alias, .. }
16190 | TableFactor::OpenJsonTable { alias, .. }
16191 | TableFactor::TableFunction { alias, .. }
16192 | TableFactor::Pivot { alias, .. }
16193 | TableFactor::Unpivot { alias, .. }
16194 | TableFactor::MatchRecognize { alias, .. }
16195 | TableFactor::SemanticView { alias, .. }
16196 | TableFactor::NestedJoin { alias, .. } => {
16197 if let Some(inner_alias) = alias {
16199 return Err(ParserError::ParserError(format!(
16200 "duplicate alias {inner_alias}"
16201 )));
16202 }
16203 alias.replace(outer_alias);
16207 }
16208 };
16209 }
16210 Ok(table_and_joins.relation)
16212 } else {
16213 self.expected_ref("joined table", self.peek_token_ref())
16216 }
16217 } else if self.dialect.supports_values_as_table_factor()
16218 && matches!(
16219 self.peek_tokens(),
16220 [
16221 Token::Word(Word {
16222 keyword: Keyword::VALUES,
16223 ..
16224 }),
16225 Token::LParen
16226 ]
16227 )
16228 {
16229 self.expect_keyword_is(Keyword::VALUES)?;
16230
16231 let values = SetExpr::Values(self.parse_values(false, false)?);
16235 let alias = self.maybe_parse_table_alias()?;
16236 Ok(TableFactor::Derived {
16237 lateral: false,
16238 subquery: Box::new(Query {
16239 with: None,
16240 body: Box::new(values),
16241 order_by: None,
16242 limit_clause: None,
16243 fetch: None,
16244 locks: vec![],
16245 for_clause: None,
16246 settings: None,
16247 format_clause: None,
16248 pipe_operators: vec![],
16249 }),
16250 alias,
16251 sample: None,
16252 })
16253 } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16254 && self.parse_keyword(Keyword::UNNEST)
16255 {
16256 self.expect_token(&Token::LParen)?;
16257 let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16258 self.expect_token(&Token::RParen)?;
16259
16260 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16261 let alias = match self.maybe_parse_table_alias() {
16262 Ok(Some(alias)) => Some(alias),
16263 Ok(None) => None,
16264 Err(e) => return Err(e),
16265 };
16266
16267 let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16268 Ok(()) => true,
16269 Err(_) => false,
16270 };
16271
16272 let with_offset_alias = if with_offset {
16273 match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16274 Ok(Some(alias)) => Some(alias),
16275 Ok(None) => None,
16276 Err(e) => return Err(e),
16277 }
16278 } else {
16279 None
16280 };
16281
16282 Ok(TableFactor::UNNEST {
16283 alias,
16284 array_exprs,
16285 with_offset,
16286 with_offset_alias,
16287 with_ordinality,
16288 })
16289 } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16290 let json_expr = self.parse_expr()?;
16291 self.expect_token(&Token::Comma)?;
16292 let json_path = self.parse_value()?;
16293 self.expect_keyword_is(Keyword::COLUMNS)?;
16294 self.expect_token(&Token::LParen)?;
16295 let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16296 self.expect_token(&Token::RParen)?;
16297 self.expect_token(&Token::RParen)?;
16298 let alias = self.maybe_parse_table_alias()?;
16299 Ok(TableFactor::JsonTable {
16300 json_expr,
16301 json_path,
16302 columns,
16303 alias,
16304 })
16305 } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16306 self.prev_token();
16307 self.parse_open_json_table_factor()
16308 } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16309 self.prev_token();
16310 self.parse_xml_table_factor()
16311 } else if self.dialect.supports_semantic_view_table_factor()
16312 && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16313 {
16314 self.parse_semantic_view_table_factor()
16315 } else if self.peek_token_ref().token == Token::AtSign {
16316 self.parse_snowflake_stage_table_factor()
16318 } else {
16319 let name = self.parse_object_name(true)?;
16320
16321 let json_path = match &self.peek_token_ref().token {
16322 Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16323 _ => None,
16324 };
16325
16326 let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16327 && self.parse_keyword(Keyword::PARTITION)
16328 {
16329 self.parse_parenthesized_identifiers()?
16330 } else {
16331 vec![]
16332 };
16333
16334 let version = self.maybe_parse_table_version()?;
16336
16337 let args = if self.consume_token(&Token::LParen) {
16339 Some(self.parse_table_function_args()?)
16340 } else {
16341 None
16342 };
16343
16344 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16345
16346 let mut sample = None;
16347 if self.dialect.supports_table_sample_before_alias() {
16348 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16349 sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16350 }
16351 }
16352
16353 let alias = self.maybe_parse_table_alias()?;
16354
16355 let index_hints = if self.dialect.supports_table_hints() {
16357 self.maybe_parse(|p| p.parse_table_index_hints())?
16358 .unwrap_or(vec![])
16359 } else {
16360 vec![]
16361 };
16362
16363 let mut with_hints = vec![];
16365 if self.parse_keyword(Keyword::WITH) {
16366 if self.consume_token(&Token::LParen) {
16367 with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16368 self.expect_token(&Token::RParen)?;
16369 } else {
16370 self.prev_token();
16372 }
16373 };
16374
16375 if !self.dialect.supports_table_sample_before_alias() {
16376 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16377 sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16378 }
16379 }
16380
16381 let mut table = TableFactor::Table {
16382 name,
16383 alias,
16384 args,
16385 with_hints,
16386 version,
16387 partitions,
16388 with_ordinality,
16389 json_path,
16390 sample,
16391 index_hints,
16392 };
16393
16394 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16395 table = match kw {
16396 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16397 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16398 unexpected_keyword => return Err(ParserError::ParserError(
16399 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16400 )),
16401 }
16402 }
16403
16404 if self.dialect.supports_match_recognize()
16405 && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16406 {
16407 table = self.parse_match_recognize(table)?;
16408 }
16409
16410 Ok(table)
16411 }
16412 }
16413
16414 fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16419 let name = crate::dialect::parse_snowflake_stage_name(self)?;
16421
16422 let args = if self.consume_token(&Token::LParen) {
16424 Some(self.parse_table_function_args()?)
16425 } else {
16426 None
16427 };
16428
16429 let alias = self.maybe_parse_table_alias()?;
16430
16431 Ok(TableFactor::Table {
16432 name,
16433 alias,
16434 args,
16435 with_hints: vec![],
16436 version: None,
16437 partitions: vec![],
16438 with_ordinality: false,
16439 json_path: None,
16440 sample: None,
16441 index_hints: vec![],
16442 })
16443 }
16444
16445 fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16446 let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16447 TableSampleModifier::TableSample
16448 } else if self.parse_keyword(Keyword::SAMPLE) {
16449 TableSampleModifier::Sample
16450 } else {
16451 return Ok(None);
16452 };
16453 self.parse_table_sample(modifier).map(Some)
16454 }
16455
16456 fn parse_table_sample(
16457 &mut self,
16458 modifier: TableSampleModifier,
16459 ) -> Result<Box<TableSample>, ParserError> {
16460 let name = match self.parse_one_of_keywords(&[
16461 Keyword::BERNOULLI,
16462 Keyword::ROW,
16463 Keyword::SYSTEM,
16464 Keyword::BLOCK,
16465 ]) {
16466 Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16467 Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16468 Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16469 Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16470 _ => None,
16471 };
16472
16473 let parenthesized = self.consume_token(&Token::LParen);
16474
16475 let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16476 let selected_bucket = self.parse_number_value()?;
16477 self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16478 let total = self.parse_number_value()?;
16479 let on = if self.parse_keyword(Keyword::ON) {
16480 Some(self.parse_expr()?)
16481 } else {
16482 None
16483 };
16484 (
16485 None,
16486 Some(TableSampleBucket {
16487 bucket: selected_bucket,
16488 total,
16489 on,
16490 }),
16491 )
16492 } else {
16493 let value = match self.maybe_parse(|p| p.parse_expr())? {
16494 Some(num) => num,
16495 None => {
16496 let next_token = self.next_token();
16497 if let Token::Word(w) = next_token.token {
16498 Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16499 } else {
16500 return parser_err!(
16501 "Expecting number or byte length e.g. 100M",
16502 self.peek_token_ref().span.start
16503 );
16504 }
16505 }
16506 };
16507 let unit = if self.parse_keyword(Keyword::ROWS) {
16508 Some(TableSampleUnit::Rows)
16509 } else if self.parse_keyword(Keyword::PERCENT) {
16510 Some(TableSampleUnit::Percent)
16511 } else {
16512 None
16513 };
16514 (
16515 Some(TableSampleQuantity {
16516 parenthesized,
16517 value,
16518 unit,
16519 }),
16520 None,
16521 )
16522 };
16523 if parenthesized {
16524 self.expect_token(&Token::RParen)?;
16525 }
16526
16527 let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16528 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16529 } else if self.parse_keyword(Keyword::SEED) {
16530 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16531 } else {
16532 None
16533 };
16534
16535 let offset = if self.parse_keyword(Keyword::OFFSET) {
16536 Some(self.parse_expr()?)
16537 } else {
16538 None
16539 };
16540
16541 Ok(Box::new(TableSample {
16542 modifier,
16543 name,
16544 quantity,
16545 seed,
16546 bucket,
16547 offset,
16548 }))
16549 }
16550
16551 fn parse_table_sample_seed(
16552 &mut self,
16553 modifier: TableSampleSeedModifier,
16554 ) -> Result<TableSampleSeed, ParserError> {
16555 self.expect_token(&Token::LParen)?;
16556 let value = self.parse_number_value()?;
16557 self.expect_token(&Token::RParen)?;
16558 Ok(TableSampleSeed { modifier, value })
16559 }
16560
16561 fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16564 self.expect_token(&Token::LParen)?;
16565 let json_expr = self.parse_expr()?;
16566 let json_path = if self.consume_token(&Token::Comma) {
16567 Some(self.parse_value()?)
16568 } else {
16569 None
16570 };
16571 self.expect_token(&Token::RParen)?;
16572 let columns = if self.parse_keyword(Keyword::WITH) {
16573 self.expect_token(&Token::LParen)?;
16574 let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16575 self.expect_token(&Token::RParen)?;
16576 columns
16577 } else {
16578 Vec::new()
16579 };
16580 let alias = self.maybe_parse_table_alias()?;
16581 Ok(TableFactor::OpenJsonTable {
16582 json_expr,
16583 json_path,
16584 columns,
16585 alias,
16586 })
16587 }
16588
16589 fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16590 self.expect_token(&Token::LParen)?;
16591 let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
16592 self.expect_token(&Token::LParen)?;
16593 let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
16594 self.expect_token(&Token::RParen)?;
16595 self.expect_token(&Token::Comma)?;
16596 namespaces
16597 } else {
16598 vec![]
16599 };
16600 let row_expression = self.parse_expr()?;
16601 let passing = self.parse_xml_passing_clause()?;
16602 self.expect_keyword_is(Keyword::COLUMNS)?;
16603 let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
16604 self.expect_token(&Token::RParen)?;
16605 let alias = self.maybe_parse_table_alias()?;
16606 Ok(TableFactor::XmlTable {
16607 namespaces,
16608 row_expression,
16609 passing,
16610 columns,
16611 alias,
16612 })
16613 }
16614
16615 fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
16616 let uri = self.parse_expr()?;
16617 self.expect_keyword_is(Keyword::AS)?;
16618 let name = self.parse_identifier()?;
16619 Ok(XmlNamespaceDefinition { uri, name })
16620 }
16621
16622 fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
16623 let name = self.parse_identifier()?;
16624
16625 let option = if self.parse_keyword(Keyword::FOR) {
16626 self.expect_keyword(Keyword::ORDINALITY)?;
16627 XmlTableColumnOption::ForOrdinality
16628 } else {
16629 let r#type = self.parse_data_type()?;
16630 let mut path = None;
16631 let mut default = None;
16632
16633 if self.parse_keyword(Keyword::PATH) {
16634 path = Some(self.parse_expr()?);
16635 }
16636
16637 if self.parse_keyword(Keyword::DEFAULT) {
16638 default = Some(self.parse_expr()?);
16639 }
16640
16641 let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
16642 if !not_null {
16643 let _ = self.parse_keyword(Keyword::NULL);
16645 }
16646
16647 XmlTableColumnOption::NamedInfo {
16648 r#type,
16649 path,
16650 default,
16651 nullable: !not_null,
16652 }
16653 };
16654 Ok(XmlTableColumn { name, option })
16655 }
16656
16657 fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
16658 let mut arguments = vec![];
16659 if self.parse_keyword(Keyword::PASSING) {
16660 loop {
16661 let by_value =
16662 self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
16663 let expr = self.parse_expr()?;
16664 let alias = if self.parse_keyword(Keyword::AS) {
16665 Some(self.parse_identifier()?)
16666 } else {
16667 None
16668 };
16669 arguments.push(XmlPassingArgument {
16670 expr,
16671 alias,
16672 by_value,
16673 });
16674 if !self.consume_token(&Token::Comma) {
16675 break;
16676 }
16677 }
16678 }
16679 Ok(XmlPassingClause { arguments })
16680 }
16681
16682 fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16684 self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
16685 self.expect_token(&Token::LParen)?;
16686
16687 let name = self.parse_object_name(true)?;
16688
16689 let mut dimensions = Vec::new();
16691 let mut metrics = Vec::new();
16692 let mut facts = Vec::new();
16693 let mut where_clause = None;
16694
16695 while self.peek_token_ref().token != Token::RParen {
16696 if self.parse_keyword(Keyword::DIMENSIONS) {
16697 if !dimensions.is_empty() {
16698 return Err(ParserError::ParserError(
16699 "DIMENSIONS clause can only be specified once".to_string(),
16700 ));
16701 }
16702 dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16703 } else if self.parse_keyword(Keyword::METRICS) {
16704 if !metrics.is_empty() {
16705 return Err(ParserError::ParserError(
16706 "METRICS clause can only be specified once".to_string(),
16707 ));
16708 }
16709 metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16710 } else if self.parse_keyword(Keyword::FACTS) {
16711 if !facts.is_empty() {
16712 return Err(ParserError::ParserError(
16713 "FACTS clause can only be specified once".to_string(),
16714 ));
16715 }
16716 facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
16717 } else if self.parse_keyword(Keyword::WHERE) {
16718 if where_clause.is_some() {
16719 return Err(ParserError::ParserError(
16720 "WHERE clause can only be specified once".to_string(),
16721 ));
16722 }
16723 where_clause = Some(self.parse_expr()?);
16724 } else {
16725 let tok = self.peek_token_ref();
16726 parser_err!(
16727 format!(
16728 "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
16729 tok.token
16730 ),
16731 tok.span.start
16732 )?;
16733 }
16734 }
16735
16736 self.expect_token(&Token::RParen)?;
16737
16738 let alias = self.maybe_parse_table_alias()?;
16739
16740 Ok(TableFactor::SemanticView {
16741 name,
16742 dimensions,
16743 metrics,
16744 facts,
16745 where_clause,
16746 alias,
16747 })
16748 }
16749
16750 fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
16751 self.expect_token(&Token::LParen)?;
16752
16753 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
16754 self.parse_comma_separated(Parser::parse_expr)?
16755 } else {
16756 vec![]
16757 };
16758
16759 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
16760 self.parse_comma_separated(Parser::parse_order_by_expr)?
16761 } else {
16762 vec![]
16763 };
16764
16765 let measures = if self.parse_keyword(Keyword::MEASURES) {
16766 self.parse_comma_separated(|p| {
16767 let expr = p.parse_expr()?;
16768 let _ = p.parse_keyword(Keyword::AS);
16769 let alias = p.parse_identifier()?;
16770 Ok(Measure { expr, alias })
16771 })?
16772 } else {
16773 vec![]
16774 };
16775
16776 let rows_per_match =
16777 if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
16778 Some(RowsPerMatch::OneRow)
16779 } else if self.parse_keywords(&[
16780 Keyword::ALL,
16781 Keyword::ROWS,
16782 Keyword::PER,
16783 Keyword::MATCH,
16784 ]) {
16785 Some(RowsPerMatch::AllRows(
16786 if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
16787 Some(EmptyMatchesMode::Show)
16788 } else if self.parse_keywords(&[
16789 Keyword::OMIT,
16790 Keyword::EMPTY,
16791 Keyword::MATCHES,
16792 ]) {
16793 Some(EmptyMatchesMode::Omit)
16794 } else if self.parse_keywords(&[
16795 Keyword::WITH,
16796 Keyword::UNMATCHED,
16797 Keyword::ROWS,
16798 ]) {
16799 Some(EmptyMatchesMode::WithUnmatched)
16800 } else {
16801 None
16802 },
16803 ))
16804 } else {
16805 None
16806 };
16807
16808 let after_match_skip =
16809 if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
16810 if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
16811 Some(AfterMatchSkip::PastLastRow)
16812 } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
16813 Some(AfterMatchSkip::ToNextRow)
16814 } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
16815 Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
16816 } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
16817 Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
16818 } else {
16819 let found = self.next_token();
16820 return self.expected("after match skip option", found);
16821 }
16822 } else {
16823 None
16824 };
16825
16826 self.expect_keyword_is(Keyword::PATTERN)?;
16827 let pattern = self.parse_parenthesized(Self::parse_pattern)?;
16828
16829 self.expect_keyword_is(Keyword::DEFINE)?;
16830
16831 let symbols = self.parse_comma_separated(|p| {
16832 let symbol = p.parse_identifier()?;
16833 p.expect_keyword_is(Keyword::AS)?;
16834 let definition = p.parse_expr()?;
16835 Ok(SymbolDefinition { symbol, definition })
16836 })?;
16837
16838 self.expect_token(&Token::RParen)?;
16839
16840 let alias = self.maybe_parse_table_alias()?;
16841
16842 Ok(TableFactor::MatchRecognize {
16843 table: Box::new(table),
16844 partition_by,
16845 order_by,
16846 measures,
16847 rows_per_match,
16848 after_match_skip,
16849 pattern,
16850 symbols,
16851 alias,
16852 })
16853 }
16854
16855 fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16856 match self.next_token().token {
16857 Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
16858 Token::Placeholder(s) if s == "$" => {
16859 Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
16860 }
16861 Token::LBrace => {
16862 self.expect_token(&Token::Minus)?;
16863 let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
16864 self.expect_token(&Token::Minus)?;
16865 self.expect_token(&Token::RBrace)?;
16866 Ok(MatchRecognizePattern::Exclude(symbol))
16867 }
16868 Token::Word(Word {
16869 value,
16870 quote_style: None,
16871 ..
16872 }) if value == "PERMUTE" => {
16873 self.expect_token(&Token::LParen)?;
16874 let symbols = self.parse_comma_separated(|p| {
16875 p.parse_identifier().map(MatchRecognizeSymbol::Named)
16876 })?;
16877 self.expect_token(&Token::RParen)?;
16878 Ok(MatchRecognizePattern::Permute(symbols))
16879 }
16880 Token::LParen => {
16881 let pattern = self.parse_pattern()?;
16882 self.expect_token(&Token::RParen)?;
16883 Ok(MatchRecognizePattern::Group(Box::new(pattern)))
16884 }
16885 _ => {
16886 self.prev_token();
16887 self.parse_identifier()
16888 .map(MatchRecognizeSymbol::Named)
16889 .map(MatchRecognizePattern::Symbol)
16890 }
16891 }
16892 }
16893
16894 fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16895 let mut pattern = self.parse_base_pattern()?;
16896 loop {
16897 let token = self.next_token();
16898 let quantifier = match token.token {
16899 Token::Mul => RepetitionQuantifier::ZeroOrMore,
16900 Token::Plus => RepetitionQuantifier::OneOrMore,
16901 Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
16902 Token::LBrace => {
16903 let token = self.next_token();
16905 match token.token {
16906 Token::Comma => {
16907 let next_token = self.next_token();
16908 let Token::Number(n, _) = next_token.token else {
16909 return self.expected("literal number", next_token);
16910 };
16911 self.expect_token(&Token::RBrace)?;
16912 RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
16913 }
16914 Token::Number(n, _) if self.consume_token(&Token::Comma) => {
16915 let next_token = self.next_token();
16916 match next_token.token {
16917 Token::Number(m, _) => {
16918 self.expect_token(&Token::RBrace)?;
16919 RepetitionQuantifier::Range(
16920 Self::parse(n, token.span.start)?,
16921 Self::parse(m, token.span.start)?,
16922 )
16923 }
16924 Token::RBrace => {
16925 RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
16926 }
16927 _ => {
16928 return self.expected("} or upper bound", next_token);
16929 }
16930 }
16931 }
16932 Token::Number(n, _) => {
16933 self.expect_token(&Token::RBrace)?;
16934 RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
16935 }
16936 _ => return self.expected("quantifier range", token),
16937 }
16938 }
16939 _ => {
16940 self.prev_token();
16941 break;
16942 }
16943 };
16944 pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
16945 }
16946 Ok(pattern)
16947 }
16948
16949 fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16950 let mut patterns = vec![self.parse_repetition_pattern()?];
16951 while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
16952 patterns.push(self.parse_repetition_pattern()?);
16953 }
16954 match <[MatchRecognizePattern; 1]>::try_from(patterns) {
16955 Ok([pattern]) => Ok(pattern),
16956 Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
16957 }
16958 }
16959
16960 fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
16961 let pattern = self.parse_concat_pattern()?;
16962 if self.consume_token(&Token::Pipe) {
16963 match self.parse_pattern()? {
16964 MatchRecognizePattern::Alternation(mut patterns) => {
16966 patterns.insert(0, pattern);
16967 Ok(MatchRecognizePattern::Alternation(patterns))
16968 }
16969 next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
16970 }
16971 } else {
16972 Ok(pattern)
16973 }
16974 }
16975
16976 pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
16978 if self.dialect.supports_table_versioning() {
16979 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
16980 {
16981 let expr = self.parse_expr()?;
16982 return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
16983 } else if self.peek_keyword(Keyword::CHANGES) {
16984 return self.parse_table_version_changes().map(Some);
16985 } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
16986 let func_name = self.parse_object_name(true)?;
16987 let func = self.parse_function(func_name)?;
16988 return Ok(Some(TableVersion::Function(func)));
16989 } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
16990 let expr = self.parse_expr()?;
16991 return Ok(Some(TableVersion::TimestampAsOf(expr)));
16992 } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
16993 let expr = Expr::Value(self.parse_number_value()?);
16994 return Ok(Some(TableVersion::VersionAsOf(expr)));
16995 }
16996 }
16997 Ok(None)
16998 }
16999
17000 fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17011 let changes_name = self.parse_object_name(true)?;
17012 let changes = self.parse_function(changes_name)?;
17013 let at_name = self.parse_object_name(true)?;
17014 let at = self.parse_function(at_name)?;
17015 let end = if self.peek_keyword(Keyword::END) {
17016 let end_name = self.parse_object_name(true)?;
17017 Some(self.parse_function(end_name)?)
17018 } else {
17019 None
17020 };
17021 Ok(TableVersion::Changes { changes, at, end })
17022 }
17023
17024 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17027 if self.parse_keyword(Keyword::NESTED) {
17028 let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17029 let path = self.parse_value()?;
17030 self.expect_keyword_is(Keyword::COLUMNS)?;
17031 let columns = self.parse_parenthesized(|p| {
17032 p.parse_comma_separated(Self::parse_json_table_column_def)
17033 })?;
17034 return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17035 path,
17036 columns,
17037 }));
17038 }
17039 let name = self.parse_identifier()?;
17040 if self.parse_keyword(Keyword::FOR) {
17041 self.expect_keyword_is(Keyword::ORDINALITY)?;
17042 return Ok(JsonTableColumn::ForOrdinality(name));
17043 }
17044 let r#type = self.parse_data_type()?;
17045 let exists = self.parse_keyword(Keyword::EXISTS);
17046 self.expect_keyword_is(Keyword::PATH)?;
17047 let path = self.parse_value()?;
17048 let mut on_empty = None;
17049 let mut on_error = None;
17050 while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17051 if self.parse_keyword(Keyword::EMPTY) {
17052 on_empty = Some(error_handling);
17053 } else {
17054 self.expect_keyword_is(Keyword::ERROR)?;
17055 on_error = Some(error_handling);
17056 }
17057 }
17058 Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17059 name,
17060 r#type,
17061 path,
17062 exists,
17063 on_empty,
17064 on_error,
17065 }))
17066 }
17067
17068 pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17076 let name = self.parse_identifier()?;
17077 let r#type = self.parse_data_type()?;
17078 let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17079 self.next_token();
17080 Some(path)
17081 } else {
17082 None
17083 };
17084 let as_json = self.parse_keyword(Keyword::AS);
17085 if as_json {
17086 self.expect_keyword_is(Keyword::JSON)?;
17087 }
17088 Ok(OpenJsonTableColumn {
17089 name,
17090 r#type,
17091 path,
17092 as_json,
17093 })
17094 }
17095
17096 fn parse_json_table_column_error_handling(
17097 &mut self,
17098 ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17099 let res = if self.parse_keyword(Keyword::NULL) {
17100 JsonTableColumnErrorHandling::Null
17101 } else if self.parse_keyword(Keyword::ERROR) {
17102 JsonTableColumnErrorHandling::Error
17103 } else if self.parse_keyword(Keyword::DEFAULT) {
17104 JsonTableColumnErrorHandling::Default(self.parse_value()?)
17105 } else {
17106 return Ok(None);
17107 };
17108 self.expect_keyword_is(Keyword::ON)?;
17109 Ok(Some(res))
17110 }
17111
17112 pub fn parse_derived_table_factor(
17114 &mut self,
17115 lateral: IsLateral,
17116 ) -> Result<TableFactor, ParserError> {
17117 let subquery = self.parse_query()?;
17118 self.expect_token(&Token::RParen)?;
17119 let alias = self.maybe_parse_table_alias()?;
17120
17121 let sample = self
17123 .maybe_parse_table_sample()?
17124 .map(TableSampleKind::AfterTableAlias);
17125
17126 Ok(TableFactor::Derived {
17127 lateral: match lateral {
17128 Lateral => true,
17129 NotLateral => false,
17130 },
17131 subquery,
17132 alias,
17133 sample,
17134 })
17135 }
17136
17137 pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17160 let expr = self.parse_expr()?;
17161 let alias = if self.parse_keyword(Keyword::AS) {
17162 Some(self.parse_identifier()?)
17163 } else {
17164 None
17165 };
17166
17167 Ok(ExprWithAlias { expr, alias })
17168 }
17169
17170 fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17174 let expr = self.parse_expr()?;
17175 let alias = self.parse_identifier_optional_alias()?;
17176 Ok(ExprWithAlias { expr, alias })
17177 }
17178
17179 fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17181 let function_name = match self.next_token().token {
17182 Token::Word(w) => Ok(w.value),
17183 _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17184 }?;
17185 let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17186 let alias = {
17187 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17188 kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17190 }
17191 self.parse_optional_alias_inner(None, validator)?
17192 };
17193 Ok(ExprWithAlias { expr, alias })
17194 }
17195
17196 pub fn parse_pivot_table_factor(
17198 &mut self,
17199 table: TableFactor,
17200 ) -> Result<TableFactor, ParserError> {
17201 self.expect_token(&Token::LParen)?;
17202 let aggregate_functions =
17203 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17204 self.expect_keyword_is(Keyword::FOR)?;
17205 let value_column = if self.peek_token_ref().token == Token::LParen {
17206 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17207 p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17208 })?
17209 } else {
17210 vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17211 };
17212 self.expect_keyword_is(Keyword::IN)?;
17213
17214 self.expect_token(&Token::LParen)?;
17215 let value_source = if self.parse_keyword(Keyword::ANY) {
17216 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17217 self.parse_comma_separated(Parser::parse_order_by_expr)?
17218 } else {
17219 vec![]
17220 };
17221 PivotValueSource::Any(order_by)
17222 } else if self.peek_sub_query() {
17223 PivotValueSource::Subquery(self.parse_query()?)
17224 } else {
17225 PivotValueSource::List(
17226 self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17227 )
17228 };
17229 self.expect_token(&Token::RParen)?;
17230
17231 let default_on_null =
17232 if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17233 self.expect_token(&Token::LParen)?;
17234 let expr = self.parse_expr()?;
17235 self.expect_token(&Token::RParen)?;
17236 Some(expr)
17237 } else {
17238 None
17239 };
17240
17241 self.expect_token(&Token::RParen)?;
17242 let alias = self.maybe_parse_table_alias()?;
17243 Ok(TableFactor::Pivot {
17244 table: Box::new(table),
17245 aggregate_functions,
17246 value_column,
17247 value_source,
17248 default_on_null,
17249 alias,
17250 })
17251 }
17252
17253 pub fn parse_unpivot_table_factor(
17255 &mut self,
17256 table: TableFactor,
17257 ) -> Result<TableFactor, ParserError> {
17258 let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17259 self.expect_keyword_is(Keyword::NULLS)?;
17260 Some(NullInclusion::IncludeNulls)
17261 } else if self.parse_keyword(Keyword::EXCLUDE) {
17262 self.expect_keyword_is(Keyword::NULLS)?;
17263 Some(NullInclusion::ExcludeNulls)
17264 } else {
17265 None
17266 };
17267 self.expect_token(&Token::LParen)?;
17268 let value = self.parse_expr()?;
17269 self.expect_keyword_is(Keyword::FOR)?;
17270 let name = self.parse_identifier()?;
17271 self.expect_keyword_is(Keyword::IN)?;
17272 let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17273 p.parse_expr_with_alias()
17274 })?;
17275 self.expect_token(&Token::RParen)?;
17276 let alias = self.maybe_parse_table_alias()?;
17277 Ok(TableFactor::Unpivot {
17278 table: Box::new(table),
17279 value,
17280 null_inclusion,
17281 name,
17282 columns,
17283 alias,
17284 })
17285 }
17286
17287 pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17289 if natural {
17290 Ok(JoinConstraint::Natural)
17291 } else if self.parse_keyword(Keyword::ON) {
17292 let constraint = self.parse_expr()?;
17293 Ok(JoinConstraint::On(constraint))
17294 } else if self.parse_keyword(Keyword::USING) {
17295 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17296 Ok(JoinConstraint::Using(columns))
17297 } else {
17298 Ok(JoinConstraint::None)
17299 }
17301 }
17302
17303 pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17305 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17306
17307 self.expect_keyword_is(Keyword::TO)?;
17308 let grantees = self.parse_grantees()?;
17309
17310 let with_grant_option =
17311 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17312
17313 let current_grants =
17314 if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17315 Some(CurrentGrantsKind::CopyCurrentGrants)
17316 } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17317 Some(CurrentGrantsKind::RevokeCurrentGrants)
17318 } else {
17319 None
17320 };
17321
17322 let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17323 Some(self.parse_identifier()?)
17324 } else {
17325 None
17326 };
17327
17328 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17329 Some(self.parse_identifier()?)
17330 } else {
17331 None
17332 };
17333
17334 Ok(Grant {
17335 privileges,
17336 objects,
17337 grantees,
17338 with_grant_option,
17339 as_grantor,
17340 granted_by,
17341 current_grants,
17342 })
17343 }
17344
17345 fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17346 let mut values = vec![];
17347 let mut grantee_type = GranteesType::None;
17348 loop {
17349 let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17350 GranteesType::Role
17351 } else if self.parse_keyword(Keyword::USER) {
17352 GranteesType::User
17353 } else if self.parse_keyword(Keyword::SHARE) {
17354 GranteesType::Share
17355 } else if self.parse_keyword(Keyword::GROUP) {
17356 GranteesType::Group
17357 } else if self.parse_keyword(Keyword::PUBLIC) {
17358 GranteesType::Public
17359 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17360 GranteesType::DatabaseRole
17361 } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17362 GranteesType::ApplicationRole
17363 } else if self.parse_keyword(Keyword::APPLICATION) {
17364 GranteesType::Application
17365 } else {
17366 grantee_type.clone() };
17368
17369 if self
17370 .dialect
17371 .get_reserved_grantees_types()
17372 .contains(&new_grantee_type)
17373 {
17374 self.prev_token();
17375 } else {
17376 grantee_type = new_grantee_type;
17377 }
17378
17379 let grantee = if grantee_type == GranteesType::Public {
17380 Grantee {
17381 grantee_type: grantee_type.clone(),
17382 name: None,
17383 }
17384 } else {
17385 let mut name = self.parse_grantee_name()?;
17386 if self.consume_token(&Token::Colon) {
17387 let ident = self.parse_identifier()?;
17391 if let GranteeName::ObjectName(namespace) = name {
17392 name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17393 format!("{namespace}:{ident}"),
17394 )]));
17395 };
17396 }
17397 Grantee {
17398 grantee_type: grantee_type.clone(),
17399 name: Some(name),
17400 }
17401 };
17402
17403 values.push(grantee);
17404
17405 if !self.consume_token(&Token::Comma) {
17406 break;
17407 }
17408 }
17409
17410 Ok(values)
17411 }
17412
17413 pub fn parse_grant_deny_revoke_privileges_objects(
17415 &mut self,
17416 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17417 let privileges = if self.parse_keyword(Keyword::ALL) {
17418 Privileges::All {
17419 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17420 }
17421 } else {
17422 let actions = self.parse_actions_list()?;
17423 Privileges::Actions(actions)
17424 };
17425
17426 let objects = if self.parse_keyword(Keyword::ON) {
17427 if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17428 Some(GrantObjects::AllTablesInSchema {
17429 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17430 })
17431 } else if self.parse_keywords(&[
17432 Keyword::ALL,
17433 Keyword::EXTERNAL,
17434 Keyword::TABLES,
17435 Keyword::IN,
17436 Keyword::SCHEMA,
17437 ]) {
17438 Some(GrantObjects::AllExternalTablesInSchema {
17439 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17440 })
17441 } else if self.parse_keywords(&[
17442 Keyword::ALL,
17443 Keyword::VIEWS,
17444 Keyword::IN,
17445 Keyword::SCHEMA,
17446 ]) {
17447 Some(GrantObjects::AllViewsInSchema {
17448 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17449 })
17450 } else if self.parse_keywords(&[
17451 Keyword::ALL,
17452 Keyword::MATERIALIZED,
17453 Keyword::VIEWS,
17454 Keyword::IN,
17455 Keyword::SCHEMA,
17456 ]) {
17457 Some(GrantObjects::AllMaterializedViewsInSchema {
17458 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17459 })
17460 } else if self.parse_keywords(&[
17461 Keyword::ALL,
17462 Keyword::FUNCTIONS,
17463 Keyword::IN,
17464 Keyword::SCHEMA,
17465 ]) {
17466 Some(GrantObjects::AllFunctionsInSchema {
17467 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17468 })
17469 } else if self.parse_keywords(&[
17470 Keyword::FUTURE,
17471 Keyword::SCHEMAS,
17472 Keyword::IN,
17473 Keyword::DATABASE,
17474 ]) {
17475 Some(GrantObjects::FutureSchemasInDatabase {
17476 databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17477 })
17478 } else if self.parse_keywords(&[
17479 Keyword::FUTURE,
17480 Keyword::TABLES,
17481 Keyword::IN,
17482 Keyword::SCHEMA,
17483 ]) {
17484 Some(GrantObjects::FutureTablesInSchema {
17485 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17486 })
17487 } else if self.parse_keywords(&[
17488 Keyword::FUTURE,
17489 Keyword::EXTERNAL,
17490 Keyword::TABLES,
17491 Keyword::IN,
17492 Keyword::SCHEMA,
17493 ]) {
17494 Some(GrantObjects::FutureExternalTablesInSchema {
17495 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17496 })
17497 } else if self.parse_keywords(&[
17498 Keyword::FUTURE,
17499 Keyword::VIEWS,
17500 Keyword::IN,
17501 Keyword::SCHEMA,
17502 ]) {
17503 Some(GrantObjects::FutureViewsInSchema {
17504 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17505 })
17506 } else if self.parse_keywords(&[
17507 Keyword::FUTURE,
17508 Keyword::MATERIALIZED,
17509 Keyword::VIEWS,
17510 Keyword::IN,
17511 Keyword::SCHEMA,
17512 ]) {
17513 Some(GrantObjects::FutureMaterializedViewsInSchema {
17514 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17515 })
17516 } else if self.parse_keywords(&[
17517 Keyword::ALL,
17518 Keyword::SEQUENCES,
17519 Keyword::IN,
17520 Keyword::SCHEMA,
17521 ]) {
17522 Some(GrantObjects::AllSequencesInSchema {
17523 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17524 })
17525 } else if self.parse_keywords(&[
17526 Keyword::FUTURE,
17527 Keyword::SEQUENCES,
17528 Keyword::IN,
17529 Keyword::SCHEMA,
17530 ]) {
17531 Some(GrantObjects::FutureSequencesInSchema {
17532 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17533 })
17534 } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17535 Some(GrantObjects::ResourceMonitors(
17536 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17537 ))
17538 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17539 Some(GrantObjects::ComputePools(
17540 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17541 ))
17542 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17543 Some(GrantObjects::FailoverGroup(
17544 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17545 ))
17546 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17547 Some(GrantObjects::ReplicationGroup(
17548 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17549 ))
17550 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17551 Some(GrantObjects::ExternalVolumes(
17552 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17553 ))
17554 } else {
17555 let object_type = self.parse_one_of_keywords(&[
17556 Keyword::SEQUENCE,
17557 Keyword::DATABASE,
17558 Keyword::SCHEMA,
17559 Keyword::TABLE,
17560 Keyword::VIEW,
17561 Keyword::WAREHOUSE,
17562 Keyword::INTEGRATION,
17563 Keyword::VIEW,
17564 Keyword::WAREHOUSE,
17565 Keyword::INTEGRATION,
17566 Keyword::USER,
17567 Keyword::CONNECTION,
17568 Keyword::PROCEDURE,
17569 Keyword::FUNCTION,
17570 ]);
17571 let objects =
17572 self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
17573 match object_type {
17574 Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
17575 Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
17576 Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
17577 Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
17578 Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
17579 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
17580 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
17581 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
17582 kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
17583 if let Some(name) = objects?.first() {
17584 self.parse_grant_procedure_or_function(name, &kw)?
17585 } else {
17586 self.expected_ref("procedure or function name", self.peek_token_ref())?
17587 }
17588 }
17589 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
17590 Some(unexpected_keyword) => return Err(ParserError::ParserError(
17591 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
17592 )),
17593 }
17594 }
17595 } else {
17596 None
17597 };
17598
17599 Ok((privileges, objects))
17600 }
17601
17602 fn parse_grant_procedure_or_function(
17603 &mut self,
17604 name: &ObjectName,
17605 kw: &Option<Keyword>,
17606 ) -> Result<Option<GrantObjects>, ParserError> {
17607 let arg_types = if self.consume_token(&Token::LParen) {
17608 let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
17609 self.expect_token(&Token::RParen)?;
17610 list
17611 } else {
17612 vec![]
17613 };
17614 match kw {
17615 Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
17616 name: name.clone(),
17617 arg_types,
17618 })),
17619 Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
17620 name: name.clone(),
17621 arg_types,
17622 })),
17623 _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
17624 }
17625 }
17626
17627 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
17629 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
17630 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
17631 if columns.is_empty() {
17632 Ok(None)
17633 } else {
17634 Ok(Some(columns))
17635 }
17636 }
17637
17638 if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
17640 Ok(Action::ImportedPrivileges)
17641 } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
17642 Ok(Action::AddSearchOptimization)
17643 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
17644 Ok(Action::AttachListing)
17645 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
17646 Ok(Action::AttachPolicy)
17647 } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
17648 Ok(Action::BindServiceEndpoint)
17649 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17650 let role = self.parse_object_name(false)?;
17651 Ok(Action::DatabaseRole { role })
17652 } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
17653 Ok(Action::EvolveSchema)
17654 } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
17655 Ok(Action::ImportShare)
17656 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
17657 Ok(Action::ManageVersions)
17658 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
17659 Ok(Action::ManageReleases)
17660 } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
17661 Ok(Action::OverrideShareRestrictions)
17662 } else if self.parse_keywords(&[
17663 Keyword::PURCHASE,
17664 Keyword::DATA,
17665 Keyword::EXCHANGE,
17666 Keyword::LISTING,
17667 ]) {
17668 Ok(Action::PurchaseDataExchangeListing)
17669 } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
17670 Ok(Action::ResolveAll)
17671 } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
17672 Ok(Action::ReadSession)
17673
17674 } else if self.parse_keyword(Keyword::APPLY) {
17676 let apply_type = self.parse_action_apply_type()?;
17677 Ok(Action::Apply { apply_type })
17678 } else if self.parse_keyword(Keyword::APPLYBUDGET) {
17679 Ok(Action::ApplyBudget)
17680 } else if self.parse_keyword(Keyword::AUDIT) {
17681 Ok(Action::Audit)
17682 } else if self.parse_keyword(Keyword::CONNECT) {
17683 Ok(Action::Connect)
17684 } else if self.parse_keyword(Keyword::CREATE) {
17685 let obj_type = self.maybe_parse_action_create_object_type();
17686 Ok(Action::Create { obj_type })
17687 } else if self.parse_keyword(Keyword::DELETE) {
17688 Ok(Action::Delete)
17689 } else if self.parse_keyword(Keyword::EXEC) {
17690 let obj_type = self.maybe_parse_action_execute_obj_type();
17691 Ok(Action::Exec { obj_type })
17692 } else if self.parse_keyword(Keyword::EXECUTE) {
17693 let obj_type = self.maybe_parse_action_execute_obj_type();
17694 Ok(Action::Execute { obj_type })
17695 } else if self.parse_keyword(Keyword::FAILOVER) {
17696 Ok(Action::Failover)
17697 } else if self.parse_keyword(Keyword::INSERT) {
17698 Ok(Action::Insert {
17699 columns: parse_columns(self)?,
17700 })
17701 } else if self.parse_keyword(Keyword::MANAGE) {
17702 let manage_type = self.parse_action_manage_type()?;
17703 Ok(Action::Manage { manage_type })
17704 } else if self.parse_keyword(Keyword::MODIFY) {
17705 let modify_type = self.parse_action_modify_type();
17706 Ok(Action::Modify { modify_type })
17707 } else if self.parse_keyword(Keyword::MONITOR) {
17708 let monitor_type = self.parse_action_monitor_type();
17709 Ok(Action::Monitor { monitor_type })
17710 } else if self.parse_keyword(Keyword::OPERATE) {
17711 Ok(Action::Operate)
17712 } else if self.parse_keyword(Keyword::REFERENCES) {
17713 Ok(Action::References {
17714 columns: parse_columns(self)?,
17715 })
17716 } else if self.parse_keyword(Keyword::READ) {
17717 Ok(Action::Read)
17718 } else if self.parse_keyword(Keyword::REPLICATE) {
17719 Ok(Action::Replicate)
17720 } else if self.parse_keyword(Keyword::ROLE) {
17721 let role = self.parse_object_name(false)?;
17722 Ok(Action::Role { role })
17723 } else if self.parse_keyword(Keyword::SELECT) {
17724 Ok(Action::Select {
17725 columns: parse_columns(self)?,
17726 })
17727 } else if self.parse_keyword(Keyword::TEMPORARY) {
17728 Ok(Action::Temporary)
17729 } else if self.parse_keyword(Keyword::TRIGGER) {
17730 Ok(Action::Trigger)
17731 } else if self.parse_keyword(Keyword::TRUNCATE) {
17732 Ok(Action::Truncate)
17733 } else if self.parse_keyword(Keyword::UPDATE) {
17734 Ok(Action::Update {
17735 columns: parse_columns(self)?,
17736 })
17737 } else if self.parse_keyword(Keyword::USAGE) {
17738 Ok(Action::Usage)
17739 } else if self.parse_keyword(Keyword::OWNERSHIP) {
17740 Ok(Action::Ownership)
17741 } else if self.parse_keyword(Keyword::DROP) {
17742 Ok(Action::Drop)
17743 } else {
17744 self.expected_ref("a privilege keyword", self.peek_token_ref())?
17745 }
17746 }
17747
17748 fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
17749 if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
17751 Some(ActionCreateObjectType::ApplicationPackage)
17752 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17753 Some(ActionCreateObjectType::ComputePool)
17754 } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
17755 Some(ActionCreateObjectType::DataExchangeListing)
17756 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17757 Some(ActionCreateObjectType::ExternalVolume)
17758 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17759 Some(ActionCreateObjectType::FailoverGroup)
17760 } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
17761 Some(ActionCreateObjectType::NetworkPolicy)
17762 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
17763 Some(ActionCreateObjectType::OrganiationListing)
17764 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17765 Some(ActionCreateObjectType::ReplicationGroup)
17766 }
17767 else if self.parse_keyword(Keyword::ACCOUNT) {
17769 Some(ActionCreateObjectType::Account)
17770 } else if self.parse_keyword(Keyword::APPLICATION) {
17771 Some(ActionCreateObjectType::Application)
17772 } else if self.parse_keyword(Keyword::DATABASE) {
17773 Some(ActionCreateObjectType::Database)
17774 } else if self.parse_keyword(Keyword::INTEGRATION) {
17775 Some(ActionCreateObjectType::Integration)
17776 } else if self.parse_keyword(Keyword::ROLE) {
17777 Some(ActionCreateObjectType::Role)
17778 } else if self.parse_keyword(Keyword::SCHEMA) {
17779 Some(ActionCreateObjectType::Schema)
17780 } else if self.parse_keyword(Keyword::SHARE) {
17781 Some(ActionCreateObjectType::Share)
17782 } else if self.parse_keyword(Keyword::USER) {
17783 Some(ActionCreateObjectType::User)
17784 } else if self.parse_keyword(Keyword::WAREHOUSE) {
17785 Some(ActionCreateObjectType::Warehouse)
17786 } else {
17787 None
17788 }
17789 }
17790
17791 fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
17792 if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
17793 Ok(ActionApplyType::AggregationPolicy)
17794 } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
17795 Ok(ActionApplyType::AuthenticationPolicy)
17796 } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
17797 Ok(ActionApplyType::JoinPolicy)
17798 } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
17799 Ok(ActionApplyType::MaskingPolicy)
17800 } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
17801 Ok(ActionApplyType::PackagesPolicy)
17802 } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
17803 Ok(ActionApplyType::PasswordPolicy)
17804 } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
17805 Ok(ActionApplyType::ProjectionPolicy)
17806 } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
17807 Ok(ActionApplyType::RowAccessPolicy)
17808 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
17809 Ok(ActionApplyType::SessionPolicy)
17810 } else if self.parse_keyword(Keyword::TAG) {
17811 Ok(ActionApplyType::Tag)
17812 } else {
17813 self.expected_ref("GRANT APPLY type", self.peek_token_ref())
17814 }
17815 }
17816
17817 fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
17818 if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
17819 Some(ActionExecuteObjectType::DataMetricFunction)
17820 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
17821 Some(ActionExecuteObjectType::ManagedAlert)
17822 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
17823 Some(ActionExecuteObjectType::ManagedTask)
17824 } else if self.parse_keyword(Keyword::ALERT) {
17825 Some(ActionExecuteObjectType::Alert)
17826 } else if self.parse_keyword(Keyword::TASK) {
17827 Some(ActionExecuteObjectType::Task)
17828 } else {
17829 None
17830 }
17831 }
17832
17833 fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
17834 if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
17835 Ok(ActionManageType::AccountSupportCases)
17836 } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
17837 Ok(ActionManageType::EventSharing)
17838 } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
17839 Ok(ActionManageType::ListingAutoFulfillment)
17840 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
17841 Ok(ActionManageType::OrganizationSupportCases)
17842 } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
17843 Ok(ActionManageType::UserSupportCases)
17844 } else if self.parse_keyword(Keyword::GRANTS) {
17845 Ok(ActionManageType::Grants)
17846 } else if self.parse_keyword(Keyword::WAREHOUSES) {
17847 Ok(ActionManageType::Warehouses)
17848 } else {
17849 self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
17850 }
17851 }
17852
17853 fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
17854 if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
17855 Some(ActionModifyType::LogLevel)
17856 } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
17857 Some(ActionModifyType::TraceLevel)
17858 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
17859 Some(ActionModifyType::SessionLogLevel)
17860 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
17861 Some(ActionModifyType::SessionTraceLevel)
17862 } else {
17863 None
17864 }
17865 }
17866
17867 fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
17868 if self.parse_keyword(Keyword::EXECUTION) {
17869 Some(ActionMonitorType::Execution)
17870 } else if self.parse_keyword(Keyword::SECURITY) {
17871 Some(ActionMonitorType::Security)
17872 } else if self.parse_keyword(Keyword::USAGE) {
17873 Some(ActionMonitorType::Usage)
17874 } else {
17875 None
17876 }
17877 }
17878
17879 pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
17881 let mut name = self.parse_object_name(false)?;
17882 if self.dialect.supports_user_host_grantee()
17883 && name.0.len() == 1
17884 && name.0[0].as_ident().is_some()
17885 && self.consume_token(&Token::AtSign)
17886 {
17887 let user = name.0.pop().unwrap().as_ident().unwrap().clone();
17888 let host = self.parse_identifier()?;
17889 Ok(GranteeName::UserHost { user, host })
17890 } else {
17891 Ok(GranteeName::ObjectName(name))
17892 }
17893 }
17894
17895 pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
17897 self.expect_keyword(Keyword::DENY)?;
17898
17899 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17900 let objects = match objects {
17901 Some(o) => o,
17902 None => {
17903 return parser_err!(
17904 "DENY statements must specify an object",
17905 self.peek_token_ref().span.start
17906 )
17907 }
17908 };
17909
17910 self.expect_keyword_is(Keyword::TO)?;
17911 let grantees = self.parse_grantees()?;
17912 let cascade = self.parse_cascade_option();
17913 let granted_by = if self.parse_keywords(&[Keyword::AS]) {
17914 Some(self.parse_identifier()?)
17915 } else {
17916 None
17917 };
17918
17919 Ok(Statement::Deny(DenyStatement {
17920 privileges,
17921 objects,
17922 grantees,
17923 cascade,
17924 granted_by,
17925 }))
17926 }
17927
17928 pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
17930 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17931
17932 self.expect_keyword_is(Keyword::FROM)?;
17933 let grantees = self.parse_grantees()?;
17934
17935 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17936 Some(self.parse_identifier()?)
17937 } else {
17938 None
17939 };
17940
17941 let cascade = self.parse_cascade_option();
17942
17943 Ok(Revoke {
17944 privileges,
17945 objects,
17946 grantees,
17947 granted_by,
17948 cascade,
17949 })
17950 }
17951
17952 pub fn parse_replace(
17954 &mut self,
17955 replace_token: TokenWithSpan,
17956 ) -> Result<Statement, ParserError> {
17957 if !dialect_of!(self is MySqlDialect | GenericDialect) {
17958 return parser_err!(
17959 "Unsupported statement REPLACE",
17960 self.peek_token_ref().span.start
17961 );
17962 }
17963
17964 let mut insert = self.parse_insert(replace_token)?;
17965 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
17966 *replace_into = true;
17967 }
17968
17969 Ok(insert)
17970 }
17971
17972 fn parse_insert_setexpr_boxed(
17976 &mut self,
17977 insert_token: TokenWithSpan,
17978 ) -> Result<Box<SetExpr>, ParserError> {
17979 Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
17980 }
17981
17982 pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
17984 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
17985 let or = self.parse_conflict_clause();
17986 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
17987 None
17988 } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
17989 Some(MysqlInsertPriority::LowPriority)
17990 } else if self.parse_keyword(Keyword::DELAYED) {
17991 Some(MysqlInsertPriority::Delayed)
17992 } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
17993 Some(MysqlInsertPriority::HighPriority)
17994 } else {
17995 None
17996 };
17997
17998 let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
17999 && self.parse_keyword(Keyword::IGNORE);
18000
18001 let replace_into = false;
18002
18003 let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18004 let into = self.parse_keyword(Keyword::INTO);
18005
18006 let local = self.parse_keyword(Keyword::LOCAL);
18007
18008 if self.parse_keyword(Keyword::DIRECTORY) {
18009 let path = self.parse_literal_string()?;
18010 let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18011 Some(self.parse_file_format()?)
18012 } else {
18013 None
18014 };
18015 let source = self.parse_query()?;
18016 Ok(Statement::Directory {
18017 local,
18018 path,
18019 overwrite,
18020 file_format,
18021 source,
18022 })
18023 } else {
18024 let table = self.parse_keyword(Keyword::TABLE);
18026 let table_object = self.parse_table_object()?;
18027
18028 let table_alias = if self.dialect.supports_insert_table_alias()
18029 && !self.peek_sub_query()
18030 && self
18031 .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18032 .is_none()
18033 {
18034 if self.parse_keyword(Keyword::AS) {
18035 Some(TableAliasWithoutColumns {
18036 explicit: true,
18037 alias: self.parse_identifier()?,
18038 })
18039 } else {
18040 self.maybe_parse(|parser| parser.parse_identifier())?
18041 .map(|alias| TableAliasWithoutColumns {
18042 explicit: false,
18043 alias,
18044 })
18045 }
18046 } else {
18047 None
18048 };
18049
18050 let is_mysql = dialect_of!(self is MySqlDialect);
18051
18052 let (columns, partitioned, after_columns, output, source, assignments) = if self
18053 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18054 {
18055 (vec![], None, vec![], None, None, vec![])
18056 } else {
18057 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18058 let columns =
18059 self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18060
18061 let partitioned = self.parse_insert_partition()?;
18062 let after_columns = if dialect_of!(self is HiveDialect) {
18064 self.parse_parenthesized_column_list(Optional, false)?
18065 } else {
18066 vec![]
18067 };
18068 (columns, partitioned, after_columns)
18069 } else {
18070 Default::default()
18071 };
18072
18073 let output = self.maybe_parse_output_clause()?;
18074
18075 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18076 || self.peek_keyword(Keyword::SETTINGS)
18077 {
18078 (None, vec![])
18079 } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18080 (None, self.parse_comma_separated(Parser::parse_assignment)?)
18081 } else {
18082 (Some(self.parse_query()?), vec![])
18083 };
18084
18085 (
18086 columns,
18087 partitioned,
18088 after_columns,
18089 output,
18090 source,
18091 assignments,
18092 )
18093 };
18094
18095 let (format_clause, settings) = if self.dialect.supports_insert_format() {
18096 let settings = self.parse_settings()?;
18099
18100 let format = if self.parse_keyword(Keyword::FORMAT) {
18101 Some(self.parse_input_format_clause()?)
18102 } else {
18103 None
18104 };
18105
18106 (format, settings)
18107 } else {
18108 Default::default()
18109 };
18110
18111 let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18112 && self.parse_keyword(Keyword::AS)
18113 {
18114 let row_alias = self.parse_object_name(false)?;
18115 let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18116 Some(InsertAliases {
18117 row_alias,
18118 col_aliases,
18119 })
18120 } else {
18121 None
18122 };
18123
18124 let on = if self.parse_keyword(Keyword::ON) {
18125 if self.parse_keyword(Keyword::CONFLICT) {
18126 let conflict_target =
18127 if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18128 Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18129 } else if self.peek_token_ref().token == Token::LParen {
18130 Some(ConflictTarget::Columns(
18131 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18132 ))
18133 } else {
18134 None
18135 };
18136
18137 self.expect_keyword_is(Keyword::DO)?;
18138 let action = if self.parse_keyword(Keyword::NOTHING) {
18139 OnConflictAction::DoNothing
18140 } else {
18141 self.expect_keyword_is(Keyword::UPDATE)?;
18142 self.expect_keyword_is(Keyword::SET)?;
18143 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18144 let selection = if self.parse_keyword(Keyword::WHERE) {
18145 Some(self.parse_expr()?)
18146 } else {
18147 None
18148 };
18149 OnConflictAction::DoUpdate(DoUpdate {
18150 assignments,
18151 selection,
18152 })
18153 };
18154
18155 Some(OnInsert::OnConflict(OnConflict {
18156 conflict_target,
18157 action,
18158 }))
18159 } else {
18160 self.expect_keyword_is(Keyword::DUPLICATE)?;
18161 self.expect_keyword_is(Keyword::KEY)?;
18162 self.expect_keyword_is(Keyword::UPDATE)?;
18163 let l = self.parse_comma_separated(Parser::parse_assignment)?;
18164
18165 Some(OnInsert::DuplicateKeyUpdate(l))
18166 }
18167 } else {
18168 None
18169 };
18170
18171 let returning = if self.parse_keyword(Keyword::RETURNING) {
18172 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18173 } else {
18174 None
18175 };
18176
18177 Ok(Insert {
18178 insert_token: insert_token.into(),
18179 optimizer_hints,
18180 or,
18181 table: table_object,
18182 table_alias,
18183 ignore,
18184 into,
18185 overwrite,
18186 partitioned,
18187 columns,
18188 after_columns,
18189 source,
18190 assignments,
18191 has_table_keyword: table,
18192 on,
18193 returning,
18194 output,
18195 replace_into,
18196 priority,
18197 insert_alias,
18198 settings,
18199 format_clause,
18200 multi_table_insert_type: None,
18201 multi_table_into_clauses: vec![],
18202 multi_table_when_clauses: vec![],
18203 multi_table_else_clause: None,
18204 }
18205 .into())
18206 }
18207 }
18208
18209 pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18213 let ident = self.parse_identifier()?;
18214 let values = self
18215 .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18216 .unwrap_or_default();
18217
18218 Ok(InputFormatClause { ident, values })
18219 }
18220
18221 fn peek_subquery_start(&mut self) -> bool {
18224 matches!(
18225 self.peek_tokens_ref(),
18226 [
18227 TokenWithSpan {
18228 token: Token::LParen,
18229 ..
18230 },
18231 TokenWithSpan {
18232 token: Token::Word(Word {
18233 keyword: Keyword::SELECT,
18234 ..
18235 }),
18236 ..
18237 },
18238 ]
18239 )
18240 }
18241
18242 fn peek_subquery_or_cte_start(&mut self) -> bool {
18246 matches!(
18247 self.peek_tokens_ref(),
18248 [
18249 TokenWithSpan {
18250 token: Token::LParen,
18251 ..
18252 },
18253 TokenWithSpan {
18254 token: Token::Word(Word {
18255 keyword: Keyword::SELECT | Keyword::WITH,
18256 ..
18257 }),
18258 ..
18259 },
18260 ]
18261 )
18262 }
18263
18264 fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18265 if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18266 Some(SqliteOnConflict::Replace)
18267 } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18268 Some(SqliteOnConflict::Rollback)
18269 } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18270 Some(SqliteOnConflict::Abort)
18271 } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18272 Some(SqliteOnConflict::Fail)
18273 } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18274 Some(SqliteOnConflict::Ignore)
18275 } else if self.parse_keyword(Keyword::REPLACE) {
18276 Some(SqliteOnConflict::Replace)
18277 } else {
18278 None
18279 }
18280 }
18281
18282 pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18284 if self.parse_keyword(Keyword::PARTITION) {
18285 self.expect_token(&Token::LParen)?;
18286 let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18287 self.expect_token(&Token::RParen)?;
18288 Ok(partition_cols)
18289 } else {
18290 Ok(None)
18291 }
18292 }
18293
18294 pub fn parse_load_data_table_format(
18296 &mut self,
18297 ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18298 if self.parse_keyword(Keyword::INPUTFORMAT) {
18299 let input_format = self.parse_expr()?;
18300 self.expect_keyword_is(Keyword::SERDE)?;
18301 let serde = self.parse_expr()?;
18302 Ok(Some(HiveLoadDataFormat {
18303 input_format,
18304 serde,
18305 }))
18306 } else {
18307 Ok(None)
18308 }
18309 }
18310
18311 fn parse_update_setexpr_boxed(
18315 &mut self,
18316 update_token: TokenWithSpan,
18317 ) -> Result<Box<SetExpr>, ParserError> {
18318 Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18319 }
18320
18321 pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18323 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18324 let or = self.parse_conflict_clause();
18325 let table = self.parse_table_and_joins()?;
18326 let from_before_set = if self.parse_keyword(Keyword::FROM) {
18327 Some(UpdateTableFromKind::BeforeSet(
18328 self.parse_table_with_joins()?,
18329 ))
18330 } else {
18331 None
18332 };
18333 self.expect_keyword(Keyword::SET)?;
18334 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18335
18336 let output = self.maybe_parse_output_clause()?;
18337
18338 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18339 Some(UpdateTableFromKind::AfterSet(
18340 self.parse_table_with_joins()?,
18341 ))
18342 } else {
18343 from_before_set
18344 };
18345 let selection = if self.parse_keyword(Keyword::WHERE) {
18346 Some(self.parse_expr()?)
18347 } else {
18348 None
18349 };
18350 let returning = if self.parse_keyword(Keyword::RETURNING) {
18351 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18352 } else {
18353 None
18354 };
18355 let order_by = if self.dialect.supports_update_order_by()
18356 && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18357 {
18358 self.parse_comma_separated(Parser::parse_order_by_expr)?
18359 } else {
18360 vec![]
18361 };
18362 let limit = if self.parse_keyword(Keyword::LIMIT) {
18363 Some(self.parse_expr()?)
18364 } else {
18365 None
18366 };
18367 Ok(Update {
18368 update_token: update_token.into(),
18369 optimizer_hints,
18370 table,
18371 assignments,
18372 from,
18373 selection,
18374 returning,
18375 output,
18376 or,
18377 order_by,
18378 limit,
18379 }
18380 .into())
18381 }
18382
18383 pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18385 let target = self.parse_assignment_target()?;
18386 self.expect_token(&Token::Eq)?;
18387 let value = self.parse_expr()?;
18388 Ok(Assignment { target, value })
18389 }
18390
18391 pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18393 if self.consume_token(&Token::LParen) {
18394 let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18395 self.expect_token(&Token::RParen)?;
18396 Ok(AssignmentTarget::Tuple(columns))
18397 } else {
18398 let column = self.parse_object_name(false)?;
18399 Ok(AssignmentTarget::ColumnName(column))
18400 }
18401 }
18402
18403 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18405 let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
18406 self.maybe_parse(|p| {
18407 let name = p.parse_expr()?;
18408 let operator = p.parse_function_named_arg_operator()?;
18409 let arg = p.parse_wildcard_expr()?.into();
18410 Ok(FunctionArg::ExprNamed {
18411 name,
18412 arg,
18413 operator,
18414 })
18415 })?
18416 } else {
18417 self.maybe_parse(|p| {
18418 let name = p.parse_identifier()?;
18419 let operator = p.parse_function_named_arg_operator()?;
18420 let arg = p.parse_wildcard_expr()?.into();
18421 Ok(FunctionArg::Named {
18422 name,
18423 arg,
18424 operator,
18425 })
18426 })?
18427 };
18428 if let Some(arg) = arg {
18429 return Ok(arg);
18430 }
18431 let wildcard_expr = self.parse_wildcard_expr()?;
18432 let arg_expr: FunctionArgExpr = match wildcard_expr {
18433 Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18434 let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18437 if opts.opt_exclude.is_some()
18438 || opts.opt_except.is_some()
18439 || opts.opt_replace.is_some()
18440 || opts.opt_rename.is_some()
18441 || opts.opt_ilike.is_some()
18442 {
18443 FunctionArgExpr::WildcardWithOptions(opts)
18444 } else {
18445 wildcard_expr.into()
18446 }
18447 }
18448 other => other.into(),
18449 };
18450 Ok(FunctionArg::Unnamed(arg_expr))
18451 }
18452
18453 fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18454 if self.parse_keyword(Keyword::VALUE) {
18455 return Ok(FunctionArgOperator::Value);
18456 }
18457 let tok = self.next_token();
18458 match tok.token {
18459 Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18460 Ok(FunctionArgOperator::RightArrow)
18461 }
18462 Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18463 Ok(FunctionArgOperator::Equals)
18464 }
18465 Token::Assignment
18466 if self
18467 .dialect
18468 .supports_named_fn_args_with_assignment_operator() =>
18469 {
18470 Ok(FunctionArgOperator::Assignment)
18471 }
18472 Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18473 Ok(FunctionArgOperator::Colon)
18474 }
18475 _ => {
18476 self.prev_token();
18477 self.expected("argument operator", tok)
18478 }
18479 }
18480 }
18481
18482 pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18484 if self.consume_token(&Token::RParen) {
18485 Ok(vec![])
18486 } else {
18487 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18488 self.expect_token(&Token::RParen)?;
18489 Ok(args)
18490 }
18491 }
18492
18493 fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18494 if self.consume_token(&Token::RParen) {
18495 return Ok(TableFunctionArgs {
18496 args: vec![],
18497 settings: None,
18498 });
18499 }
18500 let mut args = vec![];
18501 let settings = loop {
18502 if let Some(settings) = self.parse_settings()? {
18503 break Some(settings);
18504 }
18505 args.push(self.parse_function_args()?);
18506 if self.is_parse_comma_separated_end() {
18507 break None;
18508 }
18509 };
18510 self.expect_token(&Token::RParen)?;
18511 Ok(TableFunctionArgs { args, settings })
18512 }
18513
18514 fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18523 let mut clauses = vec![];
18524
18525 if let Some(null_clause) = self.parse_json_null_clause() {
18528 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18529 }
18530
18531 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18532 clauses.push(FunctionArgumentClause::JsonReturningClause(
18533 json_returning_clause,
18534 ));
18535 }
18536
18537 if self.consume_token(&Token::RParen) {
18538 return Ok(FunctionArgumentList {
18539 duplicate_treatment: None,
18540 args: vec![],
18541 clauses,
18542 });
18543 }
18544
18545 let duplicate_treatment = self.parse_duplicate_treatment()?;
18546 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18547
18548 if self.dialect.supports_window_function_null_treatment_arg() {
18549 if let Some(null_treatment) = self.parse_null_treatment()? {
18550 clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
18551 }
18552 }
18553
18554 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
18555 clauses.push(FunctionArgumentClause::OrderBy(
18556 self.parse_comma_separated(Parser::parse_order_by_expr)?,
18557 ));
18558 }
18559
18560 if self.parse_keyword(Keyword::LIMIT) {
18561 clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
18562 }
18563
18564 if dialect_of!(self is GenericDialect | BigQueryDialect)
18565 && self.parse_keyword(Keyword::HAVING)
18566 {
18567 let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
18568 Keyword::MIN => HavingBoundKind::Min,
18569 Keyword::MAX => HavingBoundKind::Max,
18570 unexpected_keyword => return Err(ParserError::ParserError(
18571 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
18572 )),
18573 };
18574 clauses.push(FunctionArgumentClause::Having(HavingBound(
18575 kind,
18576 self.parse_expr()?,
18577 )))
18578 }
18579
18580 if dialect_of!(self is GenericDialect | MySqlDialect)
18581 && self.parse_keyword(Keyword::SEPARATOR)
18582 {
18583 clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
18584 }
18585
18586 if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
18587 clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
18588 }
18589
18590 if let Some(null_clause) = self.parse_json_null_clause() {
18591 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
18592 }
18593
18594 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
18595 clauses.push(FunctionArgumentClause::JsonReturningClause(
18596 json_returning_clause,
18597 ));
18598 }
18599
18600 self.expect_token(&Token::RParen)?;
18601 Ok(FunctionArgumentList {
18602 duplicate_treatment,
18603 args,
18604 clauses,
18605 })
18606 }
18607
18608 fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
18609 if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
18610 Some(JsonNullClause::AbsentOnNull)
18611 } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
18612 Some(JsonNullClause::NullOnNull)
18613 } else {
18614 None
18615 }
18616 }
18617
18618 fn maybe_parse_json_returning_clause(
18619 &mut self,
18620 ) -> Result<Option<JsonReturningClause>, ParserError> {
18621 if self.parse_keyword(Keyword::RETURNING) {
18622 let data_type = self.parse_data_type()?;
18623 Ok(Some(JsonReturningClause { data_type }))
18624 } else {
18625 Ok(None)
18626 }
18627 }
18628
18629 fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
18630 let loc = self.peek_token_ref().span.start;
18631 match (
18632 self.parse_keyword(Keyword::ALL),
18633 self.parse_keyword(Keyword::DISTINCT),
18634 ) {
18635 (true, false) => Ok(Some(DuplicateTreatment::All)),
18636 (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
18637 (false, false) => Ok(None),
18638 (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
18639 }
18640 }
18641
18642 pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
18644 let prefix = self
18645 .parse_one_of_keywords(
18646 self.dialect
18647 .get_reserved_keywords_for_select_item_operator(),
18648 )
18649 .map(|keyword| Ident::new(format!("{keyword:?}")));
18650
18651 match self.parse_wildcard_expr()? {
18652 Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
18653 SelectItemQualifiedWildcardKind::ObjectName(prefix),
18654 self.parse_wildcard_additional_options(token.0)?,
18655 )),
18656 Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
18657 self.parse_wildcard_additional_options(token.0)?,
18658 )),
18659 Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
18660 parser_err!(
18661 format!("Expected an expression, found: {}", v),
18662 self.peek_token_ref().span.start
18663 )
18664 }
18665 Expr::BinaryOp {
18666 left,
18667 op: BinaryOperator::Eq,
18668 right,
18669 } if self.dialect.supports_eq_alias_assignment()
18670 && matches!(left.as_ref(), Expr::Identifier(_)) =>
18671 {
18672 let Expr::Identifier(alias) = *left else {
18673 return parser_err!(
18674 "BUG: expected identifier expression as alias",
18675 self.peek_token_ref().span.start
18676 );
18677 };
18678 Ok(SelectItem::ExprWithAlias {
18679 expr: *right,
18680 alias,
18681 })
18682 }
18683 expr if self.dialect.supports_select_expr_star()
18684 && self.consume_tokens(&[Token::Period, Token::Mul]) =>
18685 {
18686 let wildcard_token = self.get_previous_token().clone();
18687 Ok(SelectItem::QualifiedWildcard(
18688 SelectItemQualifiedWildcardKind::Expr(expr),
18689 self.parse_wildcard_additional_options(wildcard_token)?,
18690 ))
18691 }
18692 expr if self.dialect.supports_select_item_multi_column_alias()
18693 && self.peek_keyword(Keyword::AS)
18694 && self.peek_nth_token(1).token == Token::LParen =>
18695 {
18696 self.expect_keyword(Keyword::AS)?;
18697 self.expect_token(&Token::LParen)?;
18698 let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
18699 self.expect_token(&Token::RParen)?;
18700 Ok(SelectItem::ExprWithAliases {
18701 expr: maybe_prefixed_expr(expr, prefix),
18702 aliases,
18703 })
18704 }
18705 expr => self
18706 .maybe_parse_select_item_alias()
18707 .map(|alias| match alias {
18708 Some(alias) => SelectItem::ExprWithAlias {
18709 expr: maybe_prefixed_expr(expr, prefix),
18710 alias,
18711 },
18712 None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
18713 }),
18714 }
18715 }
18716
18717 pub fn parse_wildcard_additional_options(
18721 &mut self,
18722 wildcard_token: TokenWithSpan,
18723 ) -> Result<WildcardAdditionalOptions, ParserError> {
18724 let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
18725 self.parse_optional_select_item_ilike()?
18726 } else {
18727 None
18728 };
18729 let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
18730 {
18731 self.parse_optional_select_item_exclude()?
18732 } else {
18733 None
18734 };
18735 let opt_except = if self.dialect.supports_select_wildcard_except() {
18736 self.parse_optional_select_item_except()?
18737 } else {
18738 None
18739 };
18740 let opt_replace = if self.dialect.supports_select_wildcard_replace() {
18741 self.parse_optional_select_item_replace()?
18742 } else {
18743 None
18744 };
18745 let opt_rename = if self.dialect.supports_select_wildcard_rename() {
18746 self.parse_optional_select_item_rename()?
18747 } else {
18748 None
18749 };
18750
18751 let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
18752 self.maybe_parse_select_item_alias()?
18753 } else {
18754 None
18755 };
18756
18757 Ok(WildcardAdditionalOptions {
18758 wildcard_token: wildcard_token.into(),
18759 opt_ilike,
18760 opt_exclude,
18761 opt_except,
18762 opt_rename,
18763 opt_replace,
18764 opt_alias,
18765 })
18766 }
18767
18768 pub fn parse_optional_select_item_ilike(
18772 &mut self,
18773 ) -> Result<Option<IlikeSelectItem>, ParserError> {
18774 let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
18775 let next_token = self.next_token();
18776 let pattern = match next_token.token {
18777 Token::SingleQuotedString(s) => s,
18778 _ => return self.expected("ilike pattern", next_token),
18779 };
18780 Some(IlikeSelectItem { pattern })
18781 } else {
18782 None
18783 };
18784 Ok(opt_ilike)
18785 }
18786
18787 pub fn parse_optional_select_item_exclude(
18791 &mut self,
18792 ) -> Result<Option<ExcludeSelectItem>, ParserError> {
18793 let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
18794 if self.consume_token(&Token::LParen) {
18795 let columns =
18796 self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
18797 self.expect_token(&Token::RParen)?;
18798 Some(ExcludeSelectItem::Multiple(columns))
18799 } else {
18800 let column = self.parse_object_name(false)?;
18801 Some(ExcludeSelectItem::Single(column))
18802 }
18803 } else {
18804 None
18805 };
18806
18807 Ok(opt_exclude)
18808 }
18809
18810 pub fn parse_optional_select_item_except(
18814 &mut self,
18815 ) -> Result<Option<ExceptSelectItem>, ParserError> {
18816 let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
18817 if self.peek_token_ref().token == Token::LParen {
18818 let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
18819 match &idents[..] {
18820 [] => {
18821 return self.expected_ref(
18822 "at least one column should be parsed by the expect clause",
18823 self.peek_token_ref(),
18824 )?;
18825 }
18826 [first, idents @ ..] => Some(ExceptSelectItem {
18827 first_element: first.clone(),
18828 additional_elements: idents.to_vec(),
18829 }),
18830 }
18831 } else {
18832 let ident = self.parse_identifier()?;
18834 Some(ExceptSelectItem {
18835 first_element: ident,
18836 additional_elements: vec![],
18837 })
18838 }
18839 } else {
18840 None
18841 };
18842
18843 Ok(opt_except)
18844 }
18845
18846 pub fn parse_optional_select_item_rename(
18848 &mut self,
18849 ) -> Result<Option<RenameSelectItem>, ParserError> {
18850 let opt_rename = if self.parse_keyword(Keyword::RENAME) {
18851 if self.consume_token(&Token::LParen) {
18852 let idents =
18853 self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
18854 self.expect_token(&Token::RParen)?;
18855 Some(RenameSelectItem::Multiple(idents))
18856 } else {
18857 let ident = self.parse_identifier_with_alias()?;
18858 Some(RenameSelectItem::Single(ident))
18859 }
18860 } else {
18861 None
18862 };
18863
18864 Ok(opt_rename)
18865 }
18866
18867 pub fn parse_optional_select_item_replace(
18869 &mut self,
18870 ) -> Result<Option<ReplaceSelectItem>, ParserError> {
18871 let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
18872 if self.consume_token(&Token::LParen) {
18873 let items = self.parse_comma_separated(|parser| {
18874 Ok(Box::new(parser.parse_replace_elements()?))
18875 })?;
18876 self.expect_token(&Token::RParen)?;
18877 Some(ReplaceSelectItem { items })
18878 } else {
18879 let tok = self.next_token();
18880 return self.expected("( after REPLACE but", tok);
18881 }
18882 } else {
18883 None
18884 };
18885
18886 Ok(opt_replace)
18887 }
18888 pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
18890 let expr = self.parse_expr()?;
18891 let as_keyword = self.parse_keyword(Keyword::AS);
18892 let ident = self.parse_identifier()?;
18893 Ok(ReplaceSelectElement {
18894 expr,
18895 column_name: ident,
18896 as_keyword,
18897 })
18898 }
18899
18900 pub fn parse_asc_desc(&mut self) -> Option<bool> {
18903 if self.parse_keyword(Keyword::ASC) {
18904 Some(true)
18905 } else if self.parse_keyword(Keyword::DESC) {
18906 Some(false)
18907 } else {
18908 None
18909 }
18910 }
18911
18912 fn parse_optional_order_by_sort(&mut self) -> Option<OrderBySort> {
18914 match self.parse_asc_desc() {
18915 Some(true) => Some(OrderBySort::Asc),
18916 Some(false) => Some(OrderBySort::Desc),
18917 None => None,
18918 }
18919 }
18920
18921 pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
18923 self.parse_order_by_expr_inner(false)
18924 .map(|(order_by, _)| order_by)
18925 }
18926
18927 pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
18929 self.parse_order_by_expr_inner(true)
18930 .map(|(column, operator_class)| IndexColumn {
18931 column,
18932 operator_class,
18933 })
18934 }
18935
18936 fn parse_order_by_expr_inner(
18937 &mut self,
18938 with_operator_class: bool,
18939 ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
18940 let expr = self.parse_expr()?;
18941
18942 let operator_class: Option<ObjectName> = if with_operator_class {
18943 if self
18946 .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
18947 .is_some()
18948 {
18949 None
18950 } else {
18951 self.maybe_parse(|parser| parser.parse_object_name(false))?
18952 }
18953 } else {
18954 None
18955 };
18956
18957 let options = if !with_operator_class
18958 && self.dialect.supports_order_by_using_operator()
18959 && self.parse_keyword(Keyword::USING)
18960 {
18961 let op = self.parse_order_by_using_operator()?;
18962 OrderByOptions {
18963 sort: Some(OrderBySort::Using(op)),
18964 nulls_first: self.parse_null_ordering_modifier(),
18965 }
18966 } else {
18967 self.parse_order_by_options()?
18968 };
18969
18970 let with_fill = if self.dialect.supports_with_fill()
18971 && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
18972 {
18973 Some(self.parse_with_fill()?)
18974 } else {
18975 None
18976 };
18977
18978 Ok((
18979 OrderByExpr {
18980 expr,
18981 options,
18982 with_fill,
18983 },
18984 operator_class,
18985 ))
18986 }
18987
18988 fn parse_order_by_using_operator(&mut self) -> Result<ObjectName, ParserError> {
18989 if self.parse_keyword(Keyword::OPERATOR) {
18990 self.expect_token(&Token::LParen)?;
18991 let operator_name = self.parse_operator_name()?;
18992 self.expect_token(&Token::RParen)?;
18993 return Ok(operator_name);
18994 }
18995
18996 let token = self.next_token();
18997 Ok(ObjectName::from(vec![Ident::new(token.token.to_string())]))
18998 }
18999
19000 fn parse_null_ordering_modifier(&mut self) -> Option<bool> {
19001 if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19002 Some(true)
19003 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19004 Some(false)
19005 } else {
19006 None
19007 }
19008 }
19009
19010 fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19011 let sort = self.parse_optional_order_by_sort();
19012 let nulls_first = self.parse_null_ordering_modifier();
19013
19014 Ok(OrderByOptions { sort, nulls_first })
19015 }
19016
19017 pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19021 let from = if self.parse_keyword(Keyword::FROM) {
19022 Some(self.parse_expr()?)
19023 } else {
19024 None
19025 };
19026
19027 let to = if self.parse_keyword(Keyword::TO) {
19028 Some(self.parse_expr()?)
19029 } else {
19030 None
19031 };
19032
19033 let step = if self.parse_keyword(Keyword::STEP) {
19034 Some(self.parse_expr()?)
19035 } else {
19036 None
19037 };
19038
19039 Ok(WithFill { from, to, step })
19040 }
19041
19042 pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19045 if !self.parse_keyword(Keyword::INTERPOLATE) {
19046 return Ok(None);
19047 }
19048
19049 if self.consume_token(&Token::LParen) {
19050 let interpolations =
19051 self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19052 self.expect_token(&Token::RParen)?;
19053 return Ok(Some(Interpolate {
19055 exprs: Some(interpolations),
19056 }));
19057 }
19058
19059 Ok(Some(Interpolate { exprs: None }))
19061 }
19062
19063 pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19065 let column = self.parse_identifier()?;
19066 let expr = if self.parse_keyword(Keyword::AS) {
19067 Some(self.parse_expr()?)
19068 } else {
19069 None
19070 };
19071 Ok(InterpolateExpr { column, expr })
19072 }
19073
19074 pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19077 let quantity = if self.consume_token(&Token::LParen) {
19078 let quantity = self.parse_expr()?;
19079 self.expect_token(&Token::RParen)?;
19080 Some(TopQuantity::Expr(quantity))
19081 } else {
19082 let next_token = self.next_token();
19083 let quantity = match next_token.token {
19084 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19085 _ => self.expected("literal int", next_token)?,
19086 };
19087 Some(TopQuantity::Constant(quantity))
19088 };
19089
19090 let percent = self.parse_keyword(Keyword::PERCENT);
19091
19092 let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19093
19094 Ok(Top {
19095 with_ties,
19096 percent,
19097 quantity,
19098 })
19099 }
19100
19101 pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19103 if self.parse_keyword(Keyword::ALL) {
19104 Ok(None)
19105 } else {
19106 Ok(Some(self.parse_expr()?))
19107 }
19108 }
19109
19110 pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19112 let value = self.parse_expr()?;
19113 let rows = if self.parse_keyword(Keyword::ROW) {
19114 OffsetRows::Row
19115 } else if self.parse_keyword(Keyword::ROWS) {
19116 OffsetRows::Rows
19117 } else {
19118 OffsetRows::None
19119 };
19120 Ok(Offset { value, rows })
19121 }
19122
19123 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19125 let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19126
19127 let (quantity, percent) = if self
19128 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19129 .is_some()
19130 {
19131 (None, false)
19132 } else {
19133 let quantity = Expr::Value(self.parse_value()?);
19134 let percent = self.parse_keyword(Keyword::PERCENT);
19135 let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19136 (Some(quantity), percent)
19137 };
19138
19139 let with_ties = if self.parse_keyword(Keyword::ONLY) {
19140 false
19141 } else {
19142 self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19143 };
19144
19145 Ok(Fetch {
19146 with_ties,
19147 percent,
19148 quantity,
19149 })
19150 }
19151
19152 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19154 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19155 Keyword::UPDATE => LockType::Update,
19156 Keyword::SHARE => LockType::Share,
19157 unexpected_keyword => return Err(ParserError::ParserError(
19158 format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19159 )),
19160 };
19161 let of = if self.parse_keyword(Keyword::OF) {
19162 Some(self.parse_object_name(false)?)
19163 } else {
19164 None
19165 };
19166 let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19167 Some(NonBlock::Nowait)
19168 } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19169 Some(NonBlock::SkipLocked)
19170 } else {
19171 None
19172 };
19173 Ok(LockClause {
19174 lock_type,
19175 of,
19176 nonblock,
19177 })
19178 }
19179
19180 pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19182 self.expect_keyword(Keyword::LOCK)?;
19183
19184 if self.peek_keyword(Keyword::TABLES) {
19185 return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19186 }
19187
19188 let _ = self.parse_keyword(Keyword::TABLE);
19189 let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19190 let lock_mode = if self.parse_keyword(Keyword::IN) {
19191 let lock_mode = self.parse_lock_table_mode()?;
19192 self.expect_keyword(Keyword::MODE)?;
19193 Some(lock_mode)
19194 } else {
19195 None
19196 };
19197 let nowait = self.parse_keyword(Keyword::NOWAIT);
19198
19199 Ok(Lock {
19200 tables,
19201 lock_mode,
19202 nowait,
19203 })
19204 }
19205
19206 fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19207 let only = self.parse_keyword(Keyword::ONLY);
19208 let name = self.parse_object_name(false)?;
19209 let has_asterisk = self.consume_token(&Token::Mul);
19210
19211 Ok(LockTableTarget {
19212 name,
19213 only,
19214 has_asterisk,
19215 })
19216 }
19217
19218 fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19219 if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19220 Ok(LockTableMode::AccessShare)
19221 } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19222 Ok(LockTableMode::AccessExclusive)
19223 } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19224 Ok(LockTableMode::RowShare)
19225 } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19226 Ok(LockTableMode::RowExclusive)
19227 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19228 Ok(LockTableMode::ShareUpdateExclusive)
19229 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19230 Ok(LockTableMode::ShareRowExclusive)
19231 } else if self.parse_keyword(Keyword::SHARE) {
19232 Ok(LockTableMode::Share)
19233 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19234 Ok(LockTableMode::Exclusive)
19235 } else {
19236 self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19237 }
19238 }
19239
19240 pub fn parse_values(
19242 &mut self,
19243 allow_empty: bool,
19244 value_keyword: bool,
19245 ) -> Result<Values, ParserError> {
19246 let mut explicit_row = false;
19247
19248 let rows = self.parse_comma_separated(|parser| {
19249 if parser.parse_keyword(Keyword::ROW) {
19250 explicit_row = true;
19251 }
19252 Ok(Parens {
19253 opening_token: parser.expect_token(&Token::LParen)?.into(),
19254 content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19255 vec![]
19256 } else {
19257 parser.parse_comma_separated(Parser::parse_expr)?
19258 },
19259 closing_token: parser.expect_token(&Token::RParen)?.into(),
19260 })
19261 })?;
19262 Ok(Values {
19263 explicit_row,
19264 rows,
19265 value_keyword,
19266 })
19267 }
19268
19269 pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19271 self.expect_keyword_is(Keyword::TRANSACTION)?;
19272 Ok(Statement::StartTransaction {
19273 modes: self.parse_transaction_modes()?,
19274 begin: false,
19275 transaction: Some(BeginTransactionKind::Transaction),
19276 modifier: None,
19277 statements: vec![],
19278 exception: None,
19279 has_end_keyword: false,
19280 })
19281 }
19282
19283 pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19285 if !self.dialect.supports_start_transaction_modifier() {
19286 None
19287 } else if self.parse_keyword(Keyword::DEFERRED) {
19288 Some(TransactionModifier::Deferred)
19289 } else if self.parse_keyword(Keyword::IMMEDIATE) {
19290 Some(TransactionModifier::Immediate)
19291 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19292 Some(TransactionModifier::Exclusive)
19293 } else if self.parse_keyword(Keyword::TRY) {
19294 Some(TransactionModifier::Try)
19295 } else if self.parse_keyword(Keyword::CATCH) {
19296 Some(TransactionModifier::Catch)
19297 } else {
19298 None
19299 }
19300 }
19301
19302 pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19304 let modifier = self.parse_transaction_modifier();
19305 let transaction =
19306 match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19307 {
19308 Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19309 Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19310 Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19311 _ => None,
19312 };
19313 Ok(Statement::StartTransaction {
19314 modes: self.parse_transaction_modes()?,
19315 begin: true,
19316 transaction,
19317 modifier,
19318 statements: vec![],
19319 exception: None,
19320 has_end_keyword: false,
19321 })
19322 }
19323
19324 pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19326 let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19327
19328 let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19329 let mut when = Vec::new();
19330
19331 while !self.peek_keyword(Keyword::END) {
19333 self.expect_keyword(Keyword::WHEN)?;
19334
19335 let mut idents = Vec::new();
19339
19340 while !self.parse_keyword(Keyword::THEN) {
19341 let ident = self.parse_identifier()?;
19342 idents.push(ident);
19343
19344 self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19345 }
19346
19347 let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19348
19349 when.push(ExceptionWhen { idents, statements });
19350 }
19351
19352 Some(when)
19353 } else {
19354 None
19355 };
19356
19357 self.expect_keyword(Keyword::END)?;
19358
19359 Ok(Statement::StartTransaction {
19360 begin: true,
19361 statements,
19362 exception,
19363 has_end_keyword: true,
19364 transaction: None,
19365 modifier: None,
19366 modes: Default::default(),
19367 })
19368 }
19369
19370 pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19372 let modifier = if !self.dialect.supports_end_transaction_modifier() {
19373 None
19374 } else if self.parse_keyword(Keyword::TRY) {
19375 Some(TransactionModifier::Try)
19376 } else if self.parse_keyword(Keyword::CATCH) {
19377 Some(TransactionModifier::Catch)
19378 } else {
19379 None
19380 };
19381 Ok(Statement::Commit {
19382 chain: self.parse_commit_rollback_chain()?,
19383 end: true,
19384 modifier,
19385 })
19386 }
19387
19388 pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19390 let mut modes = vec![];
19391 let mut required = false;
19392 loop {
19393 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19394 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19395 TransactionIsolationLevel::ReadUncommitted
19396 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19397 TransactionIsolationLevel::ReadCommitted
19398 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19399 TransactionIsolationLevel::RepeatableRead
19400 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19401 TransactionIsolationLevel::Serializable
19402 } else if self.parse_keyword(Keyword::SNAPSHOT) {
19403 TransactionIsolationLevel::Snapshot
19404 } else {
19405 self.expected_ref("isolation level", self.peek_token_ref())?
19406 };
19407 TransactionMode::IsolationLevel(iso_level)
19408 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19409 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19410 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19411 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19412 } else if required {
19413 self.expected_ref("transaction mode", self.peek_token_ref())?
19414 } else {
19415 break;
19416 };
19417 modes.push(mode);
19418 required = self.consume_token(&Token::Comma);
19423 }
19424 Ok(modes)
19425 }
19426
19427 pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19429 Ok(Statement::Commit {
19430 chain: self.parse_commit_rollback_chain()?,
19431 end: false,
19432 modifier: None,
19433 })
19434 }
19435
19436 pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19438 let chain = self.parse_commit_rollback_chain()?;
19439 let savepoint = self.parse_rollback_savepoint()?;
19440
19441 Ok(Statement::Rollback { chain, savepoint })
19442 }
19443
19444 pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19446 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19447 if self.parse_keyword(Keyword::AND) {
19448 let chain = !self.parse_keyword(Keyword::NO);
19449 self.expect_keyword_is(Keyword::CHAIN)?;
19450 Ok(chain)
19451 } else {
19452 Ok(false)
19453 }
19454 }
19455
19456 pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19458 if self.parse_keyword(Keyword::TO) {
19459 let _ = self.parse_keyword(Keyword::SAVEPOINT);
19460 let savepoint = self.parse_identifier()?;
19461
19462 Ok(Some(savepoint))
19463 } else {
19464 Ok(None)
19465 }
19466 }
19467
19468 pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19470 self.expect_token(&Token::LParen)?;
19471 let message = Box::new(self.parse_expr()?);
19472 self.expect_token(&Token::Comma)?;
19473 let severity = Box::new(self.parse_expr()?);
19474 self.expect_token(&Token::Comma)?;
19475 let state = Box::new(self.parse_expr()?);
19476 let arguments = if self.consume_token(&Token::Comma) {
19477 self.parse_comma_separated(Parser::parse_expr)?
19478 } else {
19479 vec![]
19480 };
19481 self.expect_token(&Token::RParen)?;
19482 let options = if self.parse_keyword(Keyword::WITH) {
19483 self.parse_comma_separated(Parser::parse_raiserror_option)?
19484 } else {
19485 vec![]
19486 };
19487 Ok(Statement::RaisError {
19488 message,
19489 severity,
19490 state,
19491 arguments,
19492 options,
19493 })
19494 }
19495
19496 pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19498 match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19499 Keyword::LOG => Ok(RaisErrorOption::Log),
19500 Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19501 Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19502 _ => self.expected_ref(
19503 "LOG, NOWAIT OR SETERROR raiserror option",
19504 self.peek_token_ref(),
19505 ),
19506 }
19507 }
19508
19509 pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
19513 self.expect_keyword_is(Keyword::THROW)?;
19514
19515 let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
19516 let (message, state) = if error_number.is_some() {
19517 self.expect_token(&Token::Comma)?;
19518 let message = Box::new(self.parse_expr()?);
19519 self.expect_token(&Token::Comma)?;
19520 let state = Box::new(self.parse_expr()?);
19521 (Some(message), Some(state))
19522 } else {
19523 (None, None)
19524 };
19525
19526 Ok(ThrowStatement {
19527 error_number,
19528 message,
19529 state,
19530 })
19531 }
19532
19533 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
19535 let prepare = self.parse_keyword(Keyword::PREPARE);
19536 let name = self.parse_identifier()?;
19537 Ok(Statement::Deallocate { name, prepare })
19538 }
19539
19540 pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
19542 let immediate =
19543 self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
19544
19545 let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
19551 None
19552 } else {
19553 Some(self.parse_object_name(false)?)
19554 };
19555
19556 let has_parentheses = self.consume_token(&Token::LParen);
19557
19558 let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
19559 let end_token = match (has_parentheses, self.peek_token().token) {
19560 (true, _) => Token::RParen,
19561 (false, Token::EOF) => Token::EOF,
19562 (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
19563 (false, _) => Token::SemiColon,
19564 };
19565
19566 let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
19567
19568 if has_parentheses {
19569 self.expect_token(&Token::RParen)?;
19570 }
19571
19572 let into = if self.parse_keyword(Keyword::INTO) {
19573 self.parse_comma_separated(Self::parse_identifier)?
19574 } else {
19575 vec![]
19576 };
19577
19578 let using = if self.parse_keyword(Keyword::USING) {
19579 self.parse_comma_separated(Self::parse_expr_with_alias)?
19580 } else {
19581 vec![]
19582 };
19583
19584 let output = self.parse_keyword(Keyword::OUTPUT);
19585
19586 let default = self.parse_keyword(Keyword::DEFAULT);
19587
19588 Ok(Statement::Execute {
19589 immediate,
19590 name,
19591 parameters,
19592 has_parentheses,
19593 into,
19594 using,
19595 output,
19596 default,
19597 })
19598 }
19599
19600 pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
19602 let name = self.parse_identifier()?;
19603
19604 let mut data_types = vec![];
19605 if self.consume_token(&Token::LParen) {
19606 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
19607 self.expect_token(&Token::RParen)?;
19608 }
19609
19610 self.expect_keyword_is(Keyword::AS)?;
19611 let statement = Box::new(self.parse_statement()?);
19612 Ok(Statement::Prepare {
19613 name,
19614 data_types,
19615 statement,
19616 })
19617 }
19618
19619 pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
19621 self.expect_keyword(Keyword::UNLOAD)?;
19622 self.expect_token(&Token::LParen)?;
19623 let (query, query_text) =
19624 if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
19625 (None, Some(self.parse_literal_string()?))
19626 } else {
19627 (Some(self.parse_query()?), None)
19628 };
19629 self.expect_token(&Token::RParen)?;
19630
19631 self.expect_keyword_is(Keyword::TO)?;
19632 let to = self.parse_identifier()?;
19633 let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
19634 Some(self.parse_iam_role_kind()?)
19635 } else {
19636 None
19637 };
19638 let with = self.parse_options(Keyword::WITH)?;
19639 let mut options = vec![];
19640 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
19641 options.push(opt);
19642 }
19643 Ok(Statement::Unload {
19644 query,
19645 query_text,
19646 to,
19647 auth,
19648 with,
19649 options,
19650 })
19651 }
19652
19653 fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
19654 let temporary = self
19655 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
19656 .is_some();
19657 let unlogged = self.parse_keyword(Keyword::UNLOGGED);
19658 let table = self.parse_keyword(Keyword::TABLE);
19659 let name = self.parse_object_name(false)?;
19660
19661 Ok(SelectInto {
19662 temporary,
19663 unlogged,
19664 table,
19665 name,
19666 })
19667 }
19668
19669 fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
19670 let v = self.parse_value()?;
19671 match &v.value {
19672 Value::SingleQuotedString(_) => Ok(v),
19673 Value::DoubleQuotedString(_) => Ok(v),
19674 Value::Number(_, _) => Ok(v),
19675 Value::Placeholder(_) => Ok(v),
19676 _ => {
19677 self.prev_token();
19678 self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
19679 }
19680 }
19681 }
19682
19683 pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
19685 let name = self.parse_object_name(false)?;
19686 if self.consume_token(&Token::LParen) {
19687 let value = self.parse_pragma_value()?;
19688 self.expect_token(&Token::RParen)?;
19689 Ok(Statement::Pragma {
19690 name,
19691 value: Some(value),
19692 is_eq: false,
19693 })
19694 } else if self.consume_token(&Token::Eq) {
19695 Ok(Statement::Pragma {
19696 name,
19697 value: Some(self.parse_pragma_value()?),
19698 is_eq: true,
19699 })
19700 } else {
19701 Ok(Statement::Pragma {
19702 name,
19703 value: None,
19704 is_eq: false,
19705 })
19706 }
19707 }
19708
19709 pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
19711 let extension_name = self.parse_identifier()?;
19712
19713 Ok(Statement::Install { extension_name })
19714 }
19715
19716 pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
19718 if self.dialect.supports_load_extension() {
19719 let extension_name = self.parse_identifier()?;
19720 Ok(Statement::Load { extension_name })
19721 } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
19722 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
19723 self.expect_keyword_is(Keyword::INPATH)?;
19724 let inpath = self.parse_literal_string()?;
19725 let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
19726 self.expect_keyword_is(Keyword::INTO)?;
19727 self.expect_keyword_is(Keyword::TABLE)?;
19728 let table_name = self.parse_object_name(false)?;
19729 let partitioned = self.parse_insert_partition()?;
19730 let table_format = self.parse_load_data_table_format()?;
19731 Ok(Statement::LoadData {
19732 local,
19733 inpath,
19734 overwrite,
19735 table_name,
19736 partitioned,
19737 table_format,
19738 })
19739 } else {
19740 self.expected_ref(
19741 "`DATA` or an extension name after `LOAD`",
19742 self.peek_token_ref(),
19743 )
19744 }
19745 }
19746
19747 pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
19759 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
19760
19761 let name = self.parse_object_name(false)?;
19762
19763 let on_cluster = self.parse_optional_on_cluster()?;
19765
19766 let partition = if self.parse_keyword(Keyword::PARTITION) {
19767 if self.parse_keyword(Keyword::ID) {
19768 Some(Partition::Identifier(self.parse_identifier()?))
19769 } else {
19770 Some(Partition::Expr(self.parse_expr()?))
19771 }
19772 } else {
19773 None
19774 };
19775
19776 let include_final = self.parse_keyword(Keyword::FINAL);
19777
19778 let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
19779 if self.parse_keyword(Keyword::BY) {
19780 Some(Deduplicate::ByExpression(self.parse_expr()?))
19781 } else {
19782 Some(Deduplicate::All)
19783 }
19784 } else {
19785 None
19786 };
19787
19788 let predicate = if self.parse_keyword(Keyword::WHERE) {
19790 Some(self.parse_expr()?)
19791 } else {
19792 None
19793 };
19794
19795 let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
19796 self.expect_token(&Token::LParen)?;
19797 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
19798 self.expect_token(&Token::RParen)?;
19799 Some(columns)
19800 } else {
19801 None
19802 };
19803
19804 Ok(Statement::OptimizeTable {
19805 name,
19806 has_table_keyword,
19807 on_cluster,
19808 partition,
19809 include_final,
19810 deduplicate,
19811 predicate,
19812 zorder,
19813 })
19814 }
19815
19816 pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
19822 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19824 let name = self.parse_object_name(false)?;
19826 let mut data_type: Option<DataType> = None;
19828 if self.parse_keywords(&[Keyword::AS]) {
19829 data_type = Some(self.parse_data_type()?)
19830 }
19831 let sequence_options = self.parse_create_sequence_options()?;
19832 let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
19834 if self.parse_keywords(&[Keyword::NONE]) {
19835 Some(ObjectName::from(vec![Ident::new("NONE")]))
19836 } else {
19837 Some(self.parse_object_name(false)?)
19838 }
19839 } else {
19840 None
19841 };
19842 Ok(Statement::CreateSequence {
19843 temporary,
19844 if_not_exists,
19845 name,
19846 data_type,
19847 sequence_options,
19848 owned_by,
19849 })
19850 }
19851
19852 fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
19853 let mut sequence_options = vec![];
19854 loop {
19858 if self.parse_keywords(&[Keyword::INCREMENT]) {
19860 if self.parse_keywords(&[Keyword::BY]) {
19861 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
19862 } else {
19863 sequence_options
19864 .push(SequenceOptions::IncrementBy(self.parse_number()?, false));
19865 }
19866 }
19867 else if self.parse_keyword(Keyword::MINVALUE) {
19869 sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
19870 } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
19871 sequence_options.push(SequenceOptions::MinValue(None));
19872 }
19873 else if self.parse_keywords(&[Keyword::MAXVALUE]) {
19875 sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
19876 } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
19877 sequence_options.push(SequenceOptions::MaxValue(None));
19878 }
19879 else if self.parse_keywords(&[Keyword::START]) {
19881 if self.parse_keywords(&[Keyword::WITH]) {
19882 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
19883 } else {
19884 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
19885 }
19886 }
19887 else if self.parse_keywords(&[Keyword::CACHE]) {
19889 sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
19890 }
19891 else if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
19893 sequence_options.push(SequenceOptions::Cycle(true));
19894 } else if self.parse_keywords(&[Keyword::CYCLE]) {
19895 sequence_options.push(SequenceOptions::Cycle(false));
19896 } else {
19897 break;
19898 }
19899 }
19900
19901 Ok(sequence_options)
19902 }
19903
19904 pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
19908 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
19909 let name = self.parse_object_name(false)?;
19910
19911 let server_type = if self.parse_keyword(Keyword::TYPE) {
19912 Some(self.parse_identifier()?)
19913 } else {
19914 None
19915 };
19916
19917 let version = if self.parse_keyword(Keyword::VERSION) {
19918 Some(self.parse_identifier()?)
19919 } else {
19920 None
19921 };
19922
19923 self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
19924 let foreign_data_wrapper = self.parse_object_name(false)?;
19925
19926 let mut options = None;
19927 if self.parse_keyword(Keyword::OPTIONS) {
19928 self.expect_token(&Token::LParen)?;
19929 options = Some(self.parse_comma_separated(|p| {
19930 let key = p.parse_identifier()?;
19931 let value = p.parse_identifier()?;
19932 Ok(CreateServerOption { key, value })
19933 })?);
19934 self.expect_token(&Token::RParen)?;
19935 }
19936
19937 Ok(Statement::CreateServer(CreateServerStatement {
19938 name,
19939 if_not_exists: ine,
19940 server_type,
19941 version,
19942 foreign_data_wrapper,
19943 options,
19944 }))
19945 }
19946
19947 pub fn index(&self) -> usize {
19949 self.index
19950 }
19951
19952 pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
19954 let ident = self.parse_identifier()?;
19955 self.expect_keyword_is(Keyword::AS)?;
19956
19957 let window_expr = if self.consume_token(&Token::LParen) {
19958 NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
19959 } else if self.dialect.supports_window_clause_named_window_reference() {
19960 NamedWindowExpr::NamedWindow(self.parse_identifier()?)
19961 } else {
19962 return self.expected_ref("(", self.peek_token_ref());
19963 };
19964
19965 Ok(NamedWindowDefinition(ident, window_expr))
19966 }
19967
19968 pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
19970 let name = self.parse_object_name(false)?;
19971 let params = self.parse_optional_procedure_parameters()?;
19972
19973 let language = if self.parse_keyword(Keyword::LANGUAGE) {
19974 Some(self.parse_identifier()?)
19975 } else {
19976 None
19977 };
19978
19979 self.expect_keyword_is(Keyword::AS)?;
19980
19981 let body = self.parse_conditional_statements(&[Keyword::END])?;
19982
19983 Ok(Statement::CreateProcedure {
19984 name,
19985 or_alter,
19986 params,
19987 language,
19988 body,
19989 })
19990 }
19991
19992 pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
19994 let window_name = match &self.peek_token_ref().token {
19995 Token::Word(word) if word.keyword == Keyword::NoKeyword => {
19996 self.parse_optional_ident()?
19997 }
19998 _ => None,
19999 };
20000
20001 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
20002 self.parse_comma_separated(Parser::parse_expr)?
20003 } else {
20004 vec![]
20005 };
20006 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
20007 self.parse_comma_separated(Parser::parse_order_by_expr)?
20008 } else {
20009 vec![]
20010 };
20011
20012 let window_frame = if !self.consume_token(&Token::RParen) {
20013 let window_frame = self.parse_window_frame()?;
20014 self.expect_token(&Token::RParen)?;
20015 Some(window_frame)
20016 } else {
20017 None
20018 };
20019 Ok(WindowSpec {
20020 window_name,
20021 partition_by,
20022 order_by,
20023 window_frame,
20024 })
20025 }
20026
20027 pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
20029 let name = self.parse_object_name(false)?;
20030
20031 let has_as = self.parse_keyword(Keyword::AS);
20033
20034 if !has_as {
20035 if self.consume_token(&Token::LParen) {
20037 let options = self.parse_create_type_sql_definition_options()?;
20039 self.expect_token(&Token::RParen)?;
20040 return Ok(Statement::CreateType {
20041 name,
20042 representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
20043 });
20044 }
20045
20046 return Ok(Statement::CreateType {
20048 name,
20049 representation: None,
20050 });
20051 }
20052
20053 if self.parse_keyword(Keyword::ENUM) {
20055 self.parse_create_type_enum(name)
20057 } else if self.parse_keyword(Keyword::RANGE) {
20058 self.parse_create_type_range(name)
20060 } else if self.consume_token(&Token::LParen) {
20061 self.parse_create_type_composite(name)
20063 } else {
20064 self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
20065 }
20066 }
20067
20068 fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20072 if self.consume_token(&Token::RParen) {
20073 return Ok(Statement::CreateType {
20075 name,
20076 representation: Some(UserDefinedTypeRepresentation::Composite {
20077 attributes: vec![],
20078 }),
20079 });
20080 }
20081
20082 let mut attributes = vec![];
20083 loop {
20084 let attr_name = self.parse_identifier()?;
20085 let attr_data_type = self.parse_data_type()?;
20086 let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
20087 Some(self.parse_object_name(false)?)
20088 } else {
20089 None
20090 };
20091 attributes.push(UserDefinedTypeCompositeAttributeDef {
20092 name: attr_name,
20093 data_type: attr_data_type,
20094 collation: attr_collation,
20095 });
20096
20097 if !self.consume_token(&Token::Comma) {
20098 break;
20099 }
20100 }
20101 self.expect_token(&Token::RParen)?;
20102
20103 Ok(Statement::CreateType {
20104 name,
20105 representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
20106 })
20107 }
20108
20109 pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20113 self.expect_token(&Token::LParen)?;
20114 let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20115 self.expect_token(&Token::RParen)?;
20116
20117 Ok(Statement::CreateType {
20118 name,
20119 representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
20120 })
20121 }
20122
20123 fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20127 self.expect_token(&Token::LParen)?;
20128 let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
20129 self.expect_token(&Token::RParen)?;
20130
20131 Ok(Statement::CreateType {
20132 name,
20133 representation: Some(UserDefinedTypeRepresentation::Range { options }),
20134 })
20135 }
20136
20137 fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
20139 let keyword = self.parse_one_of_keywords(&[
20140 Keyword::SUBTYPE,
20141 Keyword::SUBTYPE_OPCLASS,
20142 Keyword::COLLATION,
20143 Keyword::CANONICAL,
20144 Keyword::SUBTYPE_DIFF,
20145 Keyword::MULTIRANGE_TYPE_NAME,
20146 ]);
20147
20148 match keyword {
20149 Some(Keyword::SUBTYPE) => {
20150 self.expect_token(&Token::Eq)?;
20151 let data_type = self.parse_data_type()?;
20152 Ok(UserDefinedTypeRangeOption::Subtype(data_type))
20153 }
20154 Some(Keyword::SUBTYPE_OPCLASS) => {
20155 self.expect_token(&Token::Eq)?;
20156 let name = self.parse_object_name(false)?;
20157 Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
20158 }
20159 Some(Keyword::COLLATION) => {
20160 self.expect_token(&Token::Eq)?;
20161 let name = self.parse_object_name(false)?;
20162 Ok(UserDefinedTypeRangeOption::Collation(name))
20163 }
20164 Some(Keyword::CANONICAL) => {
20165 self.expect_token(&Token::Eq)?;
20166 let name = self.parse_object_name(false)?;
20167 Ok(UserDefinedTypeRangeOption::Canonical(name))
20168 }
20169 Some(Keyword::SUBTYPE_DIFF) => {
20170 self.expect_token(&Token::Eq)?;
20171 let name = self.parse_object_name(false)?;
20172 Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20173 }
20174 Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20175 self.expect_token(&Token::Eq)?;
20176 let name = self.parse_object_name(false)?;
20177 Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20178 }
20179 _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20180 }
20181 }
20182
20183 fn parse_create_type_sql_definition_options(
20185 &mut self,
20186 ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20187 self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20188 }
20189
20190 fn parse_sql_definition_option(
20192 &mut self,
20193 ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20194 let keyword = self.parse_one_of_keywords(&[
20195 Keyword::INPUT,
20196 Keyword::OUTPUT,
20197 Keyword::RECEIVE,
20198 Keyword::SEND,
20199 Keyword::TYPMOD_IN,
20200 Keyword::TYPMOD_OUT,
20201 Keyword::ANALYZE,
20202 Keyword::SUBSCRIPT,
20203 Keyword::INTERNALLENGTH,
20204 Keyword::PASSEDBYVALUE,
20205 Keyword::ALIGNMENT,
20206 Keyword::STORAGE,
20207 Keyword::LIKE,
20208 Keyword::CATEGORY,
20209 Keyword::PREFERRED,
20210 Keyword::DEFAULT,
20211 Keyword::ELEMENT,
20212 Keyword::DELIMITER,
20213 Keyword::COLLATABLE,
20214 ]);
20215
20216 match keyword {
20217 Some(Keyword::INPUT) => {
20218 self.expect_token(&Token::Eq)?;
20219 let name = self.parse_object_name(false)?;
20220 Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20221 }
20222 Some(Keyword::OUTPUT) => {
20223 self.expect_token(&Token::Eq)?;
20224 let name = self.parse_object_name(false)?;
20225 Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20226 }
20227 Some(Keyword::RECEIVE) => {
20228 self.expect_token(&Token::Eq)?;
20229 let name = self.parse_object_name(false)?;
20230 Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20231 }
20232 Some(Keyword::SEND) => {
20233 self.expect_token(&Token::Eq)?;
20234 let name = self.parse_object_name(false)?;
20235 Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20236 }
20237 Some(Keyword::TYPMOD_IN) => {
20238 self.expect_token(&Token::Eq)?;
20239 let name = self.parse_object_name(false)?;
20240 Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20241 }
20242 Some(Keyword::TYPMOD_OUT) => {
20243 self.expect_token(&Token::Eq)?;
20244 let name = self.parse_object_name(false)?;
20245 Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20246 }
20247 Some(Keyword::ANALYZE) => {
20248 self.expect_token(&Token::Eq)?;
20249 let name = self.parse_object_name(false)?;
20250 Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20251 }
20252 Some(Keyword::SUBSCRIPT) => {
20253 self.expect_token(&Token::Eq)?;
20254 let name = self.parse_object_name(false)?;
20255 Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20256 }
20257 Some(Keyword::INTERNALLENGTH) => {
20258 self.expect_token(&Token::Eq)?;
20259 if self.parse_keyword(Keyword::VARIABLE) {
20260 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20261 UserDefinedTypeInternalLength::Variable,
20262 ))
20263 } else {
20264 let value = self.parse_literal_uint()?;
20265 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20266 UserDefinedTypeInternalLength::Fixed(value),
20267 ))
20268 }
20269 }
20270 Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20271 Some(Keyword::ALIGNMENT) => {
20272 self.expect_token(&Token::Eq)?;
20273 let align_keyword = self.parse_one_of_keywords(&[
20274 Keyword::CHAR,
20275 Keyword::INT2,
20276 Keyword::INT4,
20277 Keyword::DOUBLE,
20278 ]);
20279 match align_keyword {
20280 Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20281 Alignment::Char,
20282 )),
20283 Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20284 Alignment::Int2,
20285 )),
20286 Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20287 Alignment::Int4,
20288 )),
20289 Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20290 Alignment::Double,
20291 )),
20292 _ => self.expected_ref(
20293 "alignment value (char, int2, int4, or double)",
20294 self.peek_token_ref(),
20295 ),
20296 }
20297 }
20298 Some(Keyword::STORAGE) => {
20299 self.expect_token(&Token::Eq)?;
20300 let storage_keyword = self.parse_one_of_keywords(&[
20301 Keyword::PLAIN,
20302 Keyword::EXTERNAL,
20303 Keyword::EXTENDED,
20304 Keyword::MAIN,
20305 ]);
20306 match storage_keyword {
20307 Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20308 UserDefinedTypeStorage::Plain,
20309 )),
20310 Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20311 UserDefinedTypeStorage::External,
20312 )),
20313 Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20314 UserDefinedTypeStorage::Extended,
20315 )),
20316 Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20317 UserDefinedTypeStorage::Main,
20318 )),
20319 _ => self.expected_ref(
20320 "storage value (plain, external, extended, or main)",
20321 self.peek_token_ref(),
20322 ),
20323 }
20324 }
20325 Some(Keyword::LIKE) => {
20326 self.expect_token(&Token::Eq)?;
20327 let name = self.parse_object_name(false)?;
20328 Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20329 }
20330 Some(Keyword::CATEGORY) => {
20331 self.expect_token(&Token::Eq)?;
20332 let category_str = self.parse_literal_string()?;
20333 let category_char = category_str.chars().next().ok_or_else(|| {
20334 ParserError::ParserError(
20335 "CATEGORY value must be a single character".to_string(),
20336 )
20337 })?;
20338 Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20339 }
20340 Some(Keyword::PREFERRED) => {
20341 self.expect_token(&Token::Eq)?;
20342 let value =
20343 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20344 Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20345 }
20346 Some(Keyword::DEFAULT) => {
20347 self.expect_token(&Token::Eq)?;
20348 let expr = self.parse_expr()?;
20349 Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20350 }
20351 Some(Keyword::ELEMENT) => {
20352 self.expect_token(&Token::Eq)?;
20353 let data_type = self.parse_data_type()?;
20354 Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20355 }
20356 Some(Keyword::DELIMITER) => {
20357 self.expect_token(&Token::Eq)?;
20358 let delimiter = self.parse_literal_string()?;
20359 Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20360 }
20361 Some(Keyword::COLLATABLE) => {
20362 self.expect_token(&Token::Eq)?;
20363 let value =
20364 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20365 Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20366 }
20367 _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20368 }
20369 }
20370
20371 fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20372 self.expect_token(&Token::LParen)?;
20373 let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20374 self.expect_token(&Token::RParen)?;
20375 Ok(idents)
20376 }
20377
20378 fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20379 if dialect_of!(self is MySqlDialect | GenericDialect) {
20380 if self.parse_keyword(Keyword::FIRST) {
20381 Ok(Some(MySQLColumnPosition::First))
20382 } else if self.parse_keyword(Keyword::AFTER) {
20383 let ident = self.parse_identifier()?;
20384 Ok(Some(MySQLColumnPosition::After(ident)))
20385 } else {
20386 Ok(None)
20387 }
20388 } else {
20389 Ok(None)
20390 }
20391 }
20392
20393 fn parse_print(&mut self) -> Result<Statement, ParserError> {
20395 Ok(Statement::Print(PrintStatement {
20396 message: Box::new(self.parse_expr()?),
20397 }))
20398 }
20399
20400 fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20404 let wait_type = if self.parse_keyword(Keyword::DELAY) {
20405 WaitForType::Delay
20406 } else if self.parse_keyword(Keyword::TIME) {
20407 WaitForType::Time
20408 } else {
20409 return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20410 };
20411 let expr = self.parse_expr()?;
20412 Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20413 }
20414
20415 fn parse_return(&mut self) -> Result<Statement, ParserError> {
20417 match self.maybe_parse(|p| p.parse_expr())? {
20418 Some(expr) => Ok(Statement::Return(ReturnStatement {
20419 value: Some(ReturnStatementValue::Expr(expr)),
20420 })),
20421 None => Ok(Statement::Return(ReturnStatement { value: None })),
20422 }
20423 }
20424
20425 fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20429 self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20430
20431 let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20432 Some(self.parse_object_name(false)?)
20433 } else {
20434 None
20435 };
20436 self.expect_keyword(Keyword::OPTIONS)?;
20437 self.expect_token(&Token::LParen)?;
20438 let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20439 self.expect_token(&Token::RParen)?;
20440 self.expect_keyword(Keyword::AS)?;
20441 let query = self.parse_query()?;
20442 Ok(Statement::ExportData(ExportData {
20443 options,
20444 query,
20445 connection,
20446 }))
20447 }
20448
20449 fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20450 self.expect_keyword(Keyword::VACUUM)?;
20451 let full = self.parse_keyword(Keyword::FULL);
20452 let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20453 let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20454 let reindex = self.parse_keyword(Keyword::REINDEX);
20455 let recluster = self.parse_keyword(Keyword::RECLUSTER);
20456 let (table_name, threshold, boost) =
20457 match self.maybe_parse(|p| p.parse_object_name(false))? {
20458 Some(table_name) => {
20459 let threshold = if self.parse_keyword(Keyword::TO) {
20460 let value = self.parse_value()?;
20461 self.expect_keyword(Keyword::PERCENT)?;
20462 Some(value)
20463 } else {
20464 None
20465 };
20466 let boost = self.parse_keyword(Keyword::BOOST);
20467 (Some(table_name), threshold, boost)
20468 }
20469 _ => (None, None, false),
20470 };
20471 Ok(Statement::Vacuum(VacuumStatement {
20472 full,
20473 sort_only,
20474 delete_only,
20475 reindex,
20476 recluster,
20477 table_name,
20478 threshold,
20479 boost,
20480 }))
20481 }
20482
20483 pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20485 self.tokens
20486 }
20487
20488 fn peek_sub_query(&mut self) -> bool {
20490 self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20491 .is_some()
20492 }
20493
20494 pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20495 let show_in;
20496 let mut filter_position = None;
20497 if self.dialect.supports_show_like_before_in() {
20498 if let Some(filter) = self.parse_show_statement_filter()? {
20499 filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20500 }
20501 show_in = self.maybe_parse_show_stmt_in()?;
20502 } else {
20503 show_in = self.maybe_parse_show_stmt_in()?;
20504 if let Some(filter) = self.parse_show_statement_filter()? {
20505 filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20506 }
20507 }
20508 let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20509 let limit = self.maybe_parse_show_stmt_limit()?;
20510 let from = self.maybe_parse_show_stmt_from()?;
20511 Ok(ShowStatementOptions {
20512 filter_position,
20513 show_in,
20514 starts_with,
20515 limit,
20516 limit_from: from,
20517 })
20518 }
20519
20520 fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
20521 let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
20522 Some(Keyword::FROM) => ShowStatementInClause::FROM,
20523 Some(Keyword::IN) => ShowStatementInClause::IN,
20524 None => return Ok(None),
20525 _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
20526 };
20527
20528 let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
20529 Keyword::ACCOUNT,
20530 Keyword::DATABASE,
20531 Keyword::SCHEMA,
20532 Keyword::TABLE,
20533 Keyword::VIEW,
20534 ]) {
20535 Some(Keyword::DATABASE)
20537 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20538 | self.peek_keyword(Keyword::LIMIT) =>
20539 {
20540 (Some(ShowStatementInParentType::Database), None)
20541 }
20542 Some(Keyword::SCHEMA)
20543 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
20544 | self.peek_keyword(Keyword::LIMIT) =>
20545 {
20546 (Some(ShowStatementInParentType::Schema), None)
20547 }
20548 Some(parent_kw) => {
20549 let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
20553 match parent_kw {
20554 Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
20555 Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
20556 Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
20557 Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
20558 Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
20559 _ => {
20560 return self.expected_ref(
20561 "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
20562 self.peek_token_ref(),
20563 )
20564 }
20565 }
20566 }
20567 None => {
20568 let mut parent_name = self.parse_object_name(false)?;
20571 if self
20572 .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
20573 .is_some()
20574 {
20575 parent_name
20576 .0
20577 .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
20578 }
20579 (None, Some(parent_name))
20580 }
20581 };
20582
20583 Ok(Some(ShowStatementIn {
20584 clause,
20585 parent_type,
20586 parent_name,
20587 }))
20588 }
20589
20590 fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20591 if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
20592 Ok(Some(self.parse_value()?))
20593 } else {
20594 Ok(None)
20595 }
20596 }
20597
20598 fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
20599 if self.parse_keyword(Keyword::LIMIT) {
20600 Ok(self.parse_limit()?)
20601 } else {
20602 Ok(None)
20603 }
20604 }
20605
20606 fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
20607 if self.parse_keyword(Keyword::FROM) {
20608 Ok(Some(self.parse_value()?))
20609 } else {
20610 Ok(None)
20611 }
20612 }
20613
20614 pub(crate) fn in_column_definition_state(&self) -> bool {
20615 matches!(self.state, ColumnDefinition)
20616 }
20617
20618 pub(crate) fn parse_key_value_options(
20623 &mut self,
20624 parenthesized: bool,
20625 end_words: &[Keyword],
20626 ) -> Result<KeyValueOptions, ParserError> {
20627 let mut options: Vec<KeyValueOption> = Vec::new();
20628 let mut delimiter = KeyValueOptionsDelimiter::Space;
20629 if parenthesized {
20630 self.expect_token(&Token::LParen)?;
20631 }
20632 loop {
20633 match self.next_token().token {
20634 Token::RParen => {
20635 if parenthesized {
20636 break;
20637 } else {
20638 return self.expected_ref(" another option or EOF", self.peek_token_ref());
20639 }
20640 }
20641 Token::EOF | Token::SemiColon => break,
20642 Token::Comma => {
20643 delimiter = KeyValueOptionsDelimiter::Comma;
20644 continue;
20645 }
20646 Token::Word(w) if !end_words.contains(&w.keyword) => {
20647 options.push(self.parse_key_value_option(&w)?)
20648 }
20649 Token::Word(w) if end_words.contains(&w.keyword) => {
20650 self.prev_token();
20651 break;
20652 }
20653 _ => {
20654 return self.expected_ref(
20655 "another option, EOF, SemiColon, Comma or ')'",
20656 self.peek_token_ref(),
20657 )
20658 }
20659 };
20660 }
20661
20662 Ok(KeyValueOptions { delimiter, options })
20663 }
20664
20665 pub(crate) fn parse_key_value_option(
20667 &mut self,
20668 key: &Word,
20669 ) -> Result<KeyValueOption, ParserError> {
20670 self.expect_token(&Token::Eq)?;
20671 let peeked_token = self.peek_token();
20672 match peeked_token.token {
20673 Token::SingleQuotedString(_) => Ok(KeyValueOption {
20674 option_name: key.value.clone(),
20675 option_value: KeyValueOptionKind::Single(self.parse_value()?),
20676 }),
20677 Token::Word(word)
20678 if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
20679 {
20680 Ok(KeyValueOption {
20681 option_name: key.value.clone(),
20682 option_value: KeyValueOptionKind::Single(self.parse_value()?),
20683 })
20684 }
20685 Token::Number(..) => Ok(KeyValueOption {
20686 option_name: key.value.clone(),
20687 option_value: KeyValueOptionKind::Single(self.parse_value()?),
20688 }),
20689 Token::Word(word) => {
20690 self.next_token();
20691 Ok(KeyValueOption {
20692 option_name: key.value.clone(),
20693 option_value: KeyValueOptionKind::Single(
20694 Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
20695 ),
20696 })
20697 }
20698 Token::LParen => {
20699 match self.maybe_parse(|parser| {
20703 parser.expect_token(&Token::LParen)?;
20704 let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
20705 parser.expect_token(&Token::RParen)?;
20706 values
20707 })? {
20708 Some(values) => Ok(KeyValueOption {
20709 option_name: key.value.clone(),
20710 option_value: KeyValueOptionKind::Multi(values),
20711 }),
20712 None => Ok(KeyValueOption {
20713 option_name: key.value.clone(),
20714 option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
20715 self.parse_key_value_options(true, &[])?,
20716 )),
20717 }),
20718 }
20719 }
20720 _ => self.expected_ref("expected option value", self.peek_token_ref()),
20721 }
20722 }
20723
20724 fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
20726 if self.parse_keyword(Keyword::ALL) {
20727 return Ok(ResetStatement { reset: Reset::ALL });
20728 }
20729
20730 let obj = self.parse_object_name(false)?;
20731 Ok(ResetStatement {
20732 reset: Reset::ConfigurationParameter(obj),
20733 })
20734 }
20735}
20736
20737fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
20738 if let Some(prefix) = prefix {
20739 Expr::Prefixed {
20740 prefix,
20741 value: Box::new(expr),
20742 }
20743 } else {
20744 expr
20745 }
20746}
20747
20748impl Word {
20749 pub fn to_ident(&self, span: Span) -> Ident {
20755 Ident {
20756 value: self.value.clone(),
20757 quote_style: self.quote_style,
20758 span,
20759 }
20760 }
20761
20762 pub fn into_ident(self, span: Span) -> Ident {
20767 Ident {
20768 value: self.value,
20769 quote_style: self.quote_style,
20770 span,
20771 }
20772 }
20773}
20774
20775#[cfg(test)]
20776mod tests {
20777 use crate::test_utils::{all_dialects, TestedDialects};
20778
20779 use super::*;
20780
20781 #[test]
20782 fn test_prev_index() {
20783 let sql = "SELECT version";
20784 all_dialects().run_parser_method(sql, |parser| {
20785 assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
20786 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20787 parser.prev_token();
20788 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
20789 assert_eq!(parser.next_token(), Token::make_word("version", None));
20790 parser.prev_token();
20791 assert_eq!(parser.peek_token(), Token::make_word("version", None));
20792 assert_eq!(parser.next_token(), Token::make_word("version", None));
20793 assert_eq!(parser.peek_token(), Token::EOF);
20794 parser.prev_token();
20795 assert_eq!(parser.next_token(), Token::make_word("version", None));
20796 assert_eq!(parser.next_token(), Token::EOF);
20797 assert_eq!(parser.next_token(), Token::EOF);
20798 parser.prev_token();
20799 });
20800 }
20801
20802 #[test]
20803 fn test_peek_tokens() {
20804 all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
20805 assert!(matches!(
20806 parser.peek_tokens(),
20807 [Token::Word(Word {
20808 keyword: Keyword::SELECT,
20809 ..
20810 })]
20811 ));
20812
20813 assert!(matches!(
20814 parser.peek_tokens(),
20815 [
20816 Token::Word(Word {
20817 keyword: Keyword::SELECT,
20818 ..
20819 }),
20820 Token::Word(_),
20821 Token::Word(Word {
20822 keyword: Keyword::AS,
20823 ..
20824 }),
20825 ]
20826 ));
20827
20828 for _ in 0..4 {
20829 parser.next_token();
20830 }
20831
20832 assert!(matches!(
20833 parser.peek_tokens(),
20834 [
20835 Token::Word(Word {
20836 keyword: Keyword::FROM,
20837 ..
20838 }),
20839 Token::Word(_),
20840 Token::EOF,
20841 Token::EOF,
20842 ]
20843 ))
20844 })
20845 }
20846
20847 #[cfg(test)]
20848 mod test_parse_data_type {
20849 use crate::ast::{
20850 CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
20851 };
20852 use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
20853 use crate::test_utils::TestedDialects;
20854
20855 macro_rules! test_parse_data_type {
20856 ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
20857 $dialect.run_parser_method(&*$input, |parser| {
20858 let data_type = parser.parse_data_type().unwrap();
20859 assert_eq!($expected_type, data_type);
20860 assert_eq!($input.to_string(), data_type.to_string());
20861 });
20862 }};
20863 }
20864
20865 #[test]
20866 fn test_ansii_character_string_types() {
20867 let dialect =
20869 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20870
20871 test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
20872
20873 test_parse_data_type!(
20874 dialect,
20875 "CHARACTER(20)",
20876 DataType::Character(Some(CharacterLength::IntegerLength {
20877 length: 20,
20878 unit: None
20879 }))
20880 );
20881
20882 test_parse_data_type!(
20883 dialect,
20884 "CHARACTER(20 CHARACTERS)",
20885 DataType::Character(Some(CharacterLength::IntegerLength {
20886 length: 20,
20887 unit: Some(CharLengthUnits::Characters)
20888 }))
20889 );
20890
20891 test_parse_data_type!(
20892 dialect,
20893 "CHARACTER(20 OCTETS)",
20894 DataType::Character(Some(CharacterLength::IntegerLength {
20895 length: 20,
20896 unit: Some(CharLengthUnits::Octets)
20897 }))
20898 );
20899
20900 test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
20901
20902 test_parse_data_type!(
20903 dialect,
20904 "CHAR(20)",
20905 DataType::Char(Some(CharacterLength::IntegerLength {
20906 length: 20,
20907 unit: None
20908 }))
20909 );
20910
20911 test_parse_data_type!(
20912 dialect,
20913 "CHAR(20 CHARACTERS)",
20914 DataType::Char(Some(CharacterLength::IntegerLength {
20915 length: 20,
20916 unit: Some(CharLengthUnits::Characters)
20917 }))
20918 );
20919
20920 test_parse_data_type!(
20921 dialect,
20922 "CHAR(20 OCTETS)",
20923 DataType::Char(Some(CharacterLength::IntegerLength {
20924 length: 20,
20925 unit: Some(CharLengthUnits::Octets)
20926 }))
20927 );
20928
20929 test_parse_data_type!(
20930 dialect,
20931 "CHARACTER VARYING(20)",
20932 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20933 length: 20,
20934 unit: None
20935 }))
20936 );
20937
20938 test_parse_data_type!(
20939 dialect,
20940 "CHARACTER VARYING(20 CHARACTERS)",
20941 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20942 length: 20,
20943 unit: Some(CharLengthUnits::Characters)
20944 }))
20945 );
20946
20947 test_parse_data_type!(
20948 dialect,
20949 "CHARACTER VARYING(20 OCTETS)",
20950 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
20951 length: 20,
20952 unit: Some(CharLengthUnits::Octets)
20953 }))
20954 );
20955
20956 test_parse_data_type!(
20957 dialect,
20958 "CHAR VARYING(20)",
20959 DataType::CharVarying(Some(CharacterLength::IntegerLength {
20960 length: 20,
20961 unit: None
20962 }))
20963 );
20964
20965 test_parse_data_type!(
20966 dialect,
20967 "CHAR VARYING(20 CHARACTERS)",
20968 DataType::CharVarying(Some(CharacterLength::IntegerLength {
20969 length: 20,
20970 unit: Some(CharLengthUnits::Characters)
20971 }))
20972 );
20973
20974 test_parse_data_type!(
20975 dialect,
20976 "CHAR VARYING(20 OCTETS)",
20977 DataType::CharVarying(Some(CharacterLength::IntegerLength {
20978 length: 20,
20979 unit: Some(CharLengthUnits::Octets)
20980 }))
20981 );
20982
20983 test_parse_data_type!(
20984 dialect,
20985 "VARCHAR(20)",
20986 DataType::Varchar(Some(CharacterLength::IntegerLength {
20987 length: 20,
20988 unit: None
20989 }))
20990 );
20991 }
20992
20993 #[test]
20994 fn test_ansii_character_large_object_types() {
20995 let dialect =
20997 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
20998
20999 test_parse_data_type!(
21000 dialect,
21001 "CHARACTER LARGE OBJECT",
21002 DataType::CharacterLargeObject(None)
21003 );
21004 test_parse_data_type!(
21005 dialect,
21006 "CHARACTER LARGE OBJECT(20)",
21007 DataType::CharacterLargeObject(Some(20))
21008 );
21009
21010 test_parse_data_type!(
21011 dialect,
21012 "CHAR LARGE OBJECT",
21013 DataType::CharLargeObject(None)
21014 );
21015 test_parse_data_type!(
21016 dialect,
21017 "CHAR LARGE OBJECT(20)",
21018 DataType::CharLargeObject(Some(20))
21019 );
21020
21021 test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
21022 test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
21023 }
21024
21025 #[test]
21026 fn test_parse_custom_types() {
21027 let dialect =
21028 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21029
21030 test_parse_data_type!(
21031 dialect,
21032 "GEOMETRY",
21033 DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
21034 );
21035
21036 test_parse_data_type!(
21037 dialect,
21038 "GEOMETRY(POINT)",
21039 DataType::Custom(
21040 ObjectName::from(vec!["GEOMETRY".into()]),
21041 vec!["POINT".to_string()]
21042 )
21043 );
21044
21045 test_parse_data_type!(
21046 dialect,
21047 "GEOMETRY(POINT, 4326)",
21048 DataType::Custom(
21049 ObjectName::from(vec!["GEOMETRY".into()]),
21050 vec!["POINT".to_string(), "4326".to_string()]
21051 )
21052 );
21053 }
21054
21055 #[test]
21056 fn test_ansii_exact_numeric_types() {
21057 let dialect = TestedDialects::new(vec![
21059 Box::new(GenericDialect {}),
21060 Box::new(AnsiDialect {}),
21061 Box::new(PostgreSqlDialect {}),
21062 ]);
21063
21064 test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
21065
21066 test_parse_data_type!(
21067 dialect,
21068 "NUMERIC(2)",
21069 DataType::Numeric(ExactNumberInfo::Precision(2))
21070 );
21071
21072 test_parse_data_type!(
21073 dialect,
21074 "NUMERIC(2,10)",
21075 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
21076 );
21077
21078 test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
21079
21080 test_parse_data_type!(
21081 dialect,
21082 "DECIMAL(2)",
21083 DataType::Decimal(ExactNumberInfo::Precision(2))
21084 );
21085
21086 test_parse_data_type!(
21087 dialect,
21088 "DECIMAL(2,10)",
21089 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
21090 );
21091
21092 test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
21093
21094 test_parse_data_type!(
21095 dialect,
21096 "DEC(2)",
21097 DataType::Dec(ExactNumberInfo::Precision(2))
21098 );
21099
21100 test_parse_data_type!(
21101 dialect,
21102 "DEC(2,10)",
21103 DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
21104 );
21105
21106 test_parse_data_type!(
21108 dialect,
21109 "NUMERIC(10,-2)",
21110 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
21111 );
21112
21113 test_parse_data_type!(
21114 dialect,
21115 "DECIMAL(1000,-10)",
21116 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
21117 );
21118
21119 test_parse_data_type!(
21120 dialect,
21121 "DEC(5,-1000)",
21122 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
21123 );
21124
21125 test_parse_data_type!(
21126 dialect,
21127 "NUMERIC(10,-5)",
21128 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
21129 );
21130
21131 test_parse_data_type!(
21132 dialect,
21133 "DECIMAL(20,-10)",
21134 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
21135 );
21136
21137 test_parse_data_type!(
21138 dialect,
21139 "DEC(5,-2)",
21140 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
21141 );
21142
21143 dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
21144 let data_type = parser.parse_data_type().unwrap();
21145 assert_eq!(
21146 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
21147 data_type
21148 );
21149 assert_eq!("NUMERIC(10,5)", data_type.to_string());
21151 });
21152 }
21153
21154 #[test]
21155 fn test_ansii_date_type() {
21156 let dialect =
21158 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21159
21160 test_parse_data_type!(dialect, "DATE", DataType::Date);
21161
21162 test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
21163
21164 test_parse_data_type!(
21165 dialect,
21166 "TIME(6)",
21167 DataType::Time(Some(6), TimezoneInfo::None)
21168 );
21169
21170 test_parse_data_type!(
21171 dialect,
21172 "TIME WITH TIME ZONE",
21173 DataType::Time(None, TimezoneInfo::WithTimeZone)
21174 );
21175
21176 test_parse_data_type!(
21177 dialect,
21178 "TIME(6) WITH TIME ZONE",
21179 DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21180 );
21181
21182 test_parse_data_type!(
21183 dialect,
21184 "TIME WITHOUT TIME ZONE",
21185 DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21186 );
21187
21188 test_parse_data_type!(
21189 dialect,
21190 "TIME(6) WITHOUT TIME ZONE",
21191 DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21192 );
21193
21194 test_parse_data_type!(
21195 dialect,
21196 "TIMESTAMP",
21197 DataType::Timestamp(None, TimezoneInfo::None)
21198 );
21199
21200 test_parse_data_type!(
21201 dialect,
21202 "TIMESTAMP(22)",
21203 DataType::Timestamp(Some(22), TimezoneInfo::None)
21204 );
21205
21206 test_parse_data_type!(
21207 dialect,
21208 "TIMESTAMP(22) WITH TIME ZONE",
21209 DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21210 );
21211
21212 test_parse_data_type!(
21213 dialect,
21214 "TIMESTAMP(33) WITHOUT TIME ZONE",
21215 DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21216 );
21217 }
21218 }
21219
21220 #[test]
21221 fn test_parse_schema_name() {
21222 macro_rules! test_parse_schema_name {
21224 ($input:expr, $expected_name:expr $(,)?) => {{
21225 all_dialects().run_parser_method(&*$input, |parser| {
21226 let schema_name = parser.parse_schema_name().unwrap();
21227 assert_eq!(schema_name, $expected_name);
21229 assert_eq!(schema_name.to_string(), $input.to_string());
21231 });
21232 }};
21233 }
21234
21235 let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21236 let dummy_authorization = Ident::new("dummy_authorization");
21237
21238 test_parse_schema_name!(
21239 format!("{dummy_name}"),
21240 SchemaName::Simple(dummy_name.clone())
21241 );
21242
21243 test_parse_schema_name!(
21244 format!("AUTHORIZATION {dummy_authorization}"),
21245 SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21246 );
21247 test_parse_schema_name!(
21248 format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21249 SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21250 );
21251 }
21252
21253 #[test]
21254 fn mysql_parse_index_table_constraint() {
21255 macro_rules! test_parse_table_constraint {
21256 ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21257 $dialect.run_parser_method(&*$input, |parser| {
21258 let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21259 assert_eq!(constraint, $expected);
21261 assert_eq!(constraint.to_string(), $input.to_string());
21263 });
21264 }};
21265 }
21266
21267 fn mk_expected_col(name: &str) -> IndexColumn {
21268 IndexColumn {
21269 column: OrderByExpr {
21270 expr: Expr::Identifier(name.into()),
21271 options: OrderByOptions {
21272 sort: None,
21273 nulls_first: None,
21274 },
21275 with_fill: None,
21276 },
21277 operator_class: None,
21278 }
21279 }
21280
21281 let dialect =
21282 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21283
21284 test_parse_table_constraint!(
21285 dialect,
21286 "INDEX (c1)",
21287 IndexConstraint {
21288 display_as_key: false,
21289 name: None,
21290 index_type: None,
21291 columns: vec![mk_expected_col("c1")],
21292 index_options: vec![],
21293 }
21294 .into()
21295 );
21296
21297 test_parse_table_constraint!(
21298 dialect,
21299 "KEY (c1)",
21300 IndexConstraint {
21301 display_as_key: true,
21302 name: None,
21303 index_type: None,
21304 columns: vec![mk_expected_col("c1")],
21305 index_options: vec![],
21306 }
21307 .into()
21308 );
21309
21310 test_parse_table_constraint!(
21311 dialect,
21312 "INDEX 'index' (c1, c2)",
21313 TableConstraint::Index(IndexConstraint {
21314 display_as_key: false,
21315 name: Some(Ident::with_quote('\'', "index")),
21316 index_type: None,
21317 columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21318 index_options: vec![],
21319 })
21320 );
21321
21322 test_parse_table_constraint!(
21323 dialect,
21324 "INDEX USING BTREE (c1)",
21325 IndexConstraint {
21326 display_as_key: false,
21327 name: None,
21328 index_type: Some(IndexType::BTree),
21329 columns: vec![mk_expected_col("c1")],
21330 index_options: vec![],
21331 }
21332 .into()
21333 );
21334
21335 test_parse_table_constraint!(
21336 dialect,
21337 "INDEX USING HASH (c1)",
21338 IndexConstraint {
21339 display_as_key: false,
21340 name: None,
21341 index_type: Some(IndexType::Hash),
21342 columns: vec![mk_expected_col("c1")],
21343 index_options: vec![],
21344 }
21345 .into()
21346 );
21347
21348 test_parse_table_constraint!(
21349 dialect,
21350 "INDEX idx_name USING BTREE (c1)",
21351 IndexConstraint {
21352 display_as_key: false,
21353 name: Some(Ident::new("idx_name")),
21354 index_type: Some(IndexType::BTree),
21355 columns: vec![mk_expected_col("c1")],
21356 index_options: vec![],
21357 }
21358 .into()
21359 );
21360
21361 test_parse_table_constraint!(
21362 dialect,
21363 "INDEX idx_name USING HASH (c1)",
21364 IndexConstraint {
21365 display_as_key: false,
21366 name: Some(Ident::new("idx_name")),
21367 index_type: Some(IndexType::Hash),
21368 columns: vec![mk_expected_col("c1")],
21369 index_options: vec![],
21370 }
21371 .into()
21372 );
21373 }
21374
21375 #[test]
21376 fn test_tokenizer_error_loc() {
21377 let sql = "foo '";
21378 let ast = Parser::parse_sql(&GenericDialect, sql);
21379 assert_eq!(
21380 ast,
21381 Err(ParserError::TokenizerError(
21382 "Unterminated string literal at Line: 1, Column: 5".to_string()
21383 ))
21384 );
21385 }
21386
21387 #[test]
21388 fn test_parser_error_loc() {
21389 let sql = "SELECT this is a syntax error";
21390 let ast = Parser::parse_sql(&GenericDialect, sql);
21391 assert_eq!(
21392 ast,
21393 Err(ParserError::ParserError(
21394 "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
21395 .to_string()
21396 ))
21397 );
21398 }
21399
21400 #[test]
21401 fn test_nested_explain_error() {
21402 let sql = "EXPLAIN EXPLAIN SELECT 1";
21403 let ast = Parser::parse_sql(&GenericDialect, sql);
21404 assert_eq!(
21405 ast,
21406 Err(ParserError::ParserError(
21407 "Explain must be root of the plan".to_string()
21408 ))
21409 );
21410 }
21411
21412 #[test]
21413 fn test_parse_multipart_identifier_positive() {
21414 let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21415
21416 let expected = vec![
21418 Ident {
21419 value: "CATALOG".to_string(),
21420 quote_style: None,
21421 span: Span::empty(),
21422 },
21423 Ident {
21424 value: "F(o)o. \"bar".to_string(),
21425 quote_style: Some('"'),
21426 span: Span::empty(),
21427 },
21428 Ident {
21429 value: "table".to_string(),
21430 quote_style: None,
21431 span: Span::empty(),
21432 },
21433 ];
21434 dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21435 let actual = parser.parse_multipart_identifier().unwrap();
21436 assert_eq!(expected, actual);
21437 });
21438
21439 let expected = vec![
21441 Ident {
21442 value: "CATALOG".to_string(),
21443 quote_style: None,
21444 span: Span::empty(),
21445 },
21446 Ident {
21447 value: "table".to_string(),
21448 quote_style: None,
21449 span: Span::empty(),
21450 },
21451 ];
21452 dialect.run_parser_method("CATALOG . table", |parser| {
21453 let actual = parser.parse_multipart_identifier().unwrap();
21454 assert_eq!(expected, actual);
21455 });
21456 }
21457
21458 #[test]
21459 fn test_parse_multipart_identifier_negative() {
21460 macro_rules! test_parse_multipart_identifier_error {
21461 ($input:expr, $expected_err:expr $(,)?) => {{
21462 all_dialects().run_parser_method(&*$input, |parser| {
21463 let actual_err = parser.parse_multipart_identifier().unwrap_err();
21464 assert_eq!(actual_err.to_string(), $expected_err);
21465 });
21466 }};
21467 }
21468
21469 test_parse_multipart_identifier_error!(
21470 "",
21471 "sql parser error: Empty input when parsing identifier",
21472 );
21473
21474 test_parse_multipart_identifier_error!(
21475 "*schema.table",
21476 "sql parser error: Unexpected token in identifier: *",
21477 );
21478
21479 test_parse_multipart_identifier_error!(
21480 "schema.table*",
21481 "sql parser error: Unexpected token in identifier: *",
21482 );
21483
21484 test_parse_multipart_identifier_error!(
21485 "schema.table.",
21486 "sql parser error: Trailing period in identifier",
21487 );
21488
21489 test_parse_multipart_identifier_error!(
21490 "schema.*",
21491 "sql parser error: Unexpected token following period in identifier: *",
21492 );
21493 }
21494
21495 #[test]
21496 fn test_mysql_partition_selection() {
21497 let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21498 let expected = vec!["p0", "p2"];
21499
21500 let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21501 assert_eq!(ast.len(), 1);
21502 if let Statement::Query(v) = &ast[0] {
21503 if let SetExpr::Select(select) = &*v.body {
21504 assert_eq!(select.from.len(), 1);
21505 let from: &TableWithJoins = &select.from[0];
21506 let table_factor = &from.relation;
21507 if let TableFactor::Table { partitions, .. } = table_factor {
21508 let actual: Vec<&str> = partitions
21509 .iter()
21510 .map(|ident| ident.value.as_str())
21511 .collect();
21512 assert_eq!(expected, actual);
21513 }
21514 }
21515 } else {
21516 panic!("fail to parse mysql partition selection");
21517 }
21518 }
21519
21520 #[test]
21521 fn test_replace_into_placeholders() {
21522 let sql = "REPLACE INTO t (a) VALUES (&a)";
21523
21524 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21525 }
21526
21527 #[test]
21528 fn test_replace_into_set_placeholder() {
21529 let sql = "REPLACE INTO t SET ?";
21530
21531 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
21532 }
21533
21534 #[test]
21535 fn test_replace_incomplete() {
21536 let sql = r#"REPLACE"#;
21537
21538 assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
21539 }
21540
21541 #[test]
21542 fn test_placeholder_invalid_whitespace() {
21543 for w in [" ", "/*invalid*/"] {
21544 let sql = format!("\nSELECT\n :{w}fooBar");
21545 assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
21546 }
21547 }
21548}