1#[cfg(not(feature = "std"))]
16use alloc::{
17 boxed::Box,
18 collections::{BTreeMap, BTreeSet},
19 format,
20 string::{String, ToString},
21 vec,
22 vec::Vec,
23};
24use core::{
25 fmt::{self, Display},
26 str::FromStr,
27};
28#[cfg(feature = "std")]
29use std::collections::{BTreeMap, BTreeSet};
30
31use helpers::attached_token::AttachedToken;
32
33use log::debug;
34
35use recursion::RecursionCounter;
36use IsLateral::*;
37use IsOptional::*;
38
39use crate::ast::*;
40use crate::ast::{
41 comments,
42 helpers::{
43 key_value_options::{
44 KeyValueOption, KeyValueOptionKind, KeyValueOptions, KeyValueOptionsDelimiter,
45 },
46 stmt_create_table::{CreateTableBuilder, CreateTableConfiguration},
47 },
48};
49use crate::dialect::*;
50use crate::keywords::{Keyword, ALL_KEYWORDS};
51use crate::tokenizer::*;
52use sqlparser::parser::ParserState::ColumnDefinition;
53
54#[derive(Debug, Clone, PartialEq, Eq)]
56pub enum ParserError {
57 TokenizerError(String),
59 ParserError(String),
61 RecursionLimitExceeded,
63}
64
65macro_rules! parser_err {
67 ($MSG:expr, $loc:expr) => {
68 Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
69 };
70}
71
72mod alter;
73mod merge;
74
75mod recursion {
80 use alloc::rc::Rc;
81 use core::cell::Cell;
82
83 use super::ParserError;
84
85 pub(crate) struct RecursionCounter {
96 remaining_depth: Rc<Cell<usize>>,
97 }
98
99 impl RecursionCounter {
100 pub fn new(remaining_depth: usize) -> Self {
103 Self {
104 remaining_depth: Rc::new(remaining_depth.into()),
105 }
106 }
107
108 pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
115 let old_value = self.remaining_depth.get();
116 if old_value == 0 {
118 Err(ParserError::RecursionLimitExceeded)
119 } else {
120 self.remaining_depth.set(old_value - 1);
121 Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
122 }
123 }
124 }
125
126 pub struct DepthGuard {
128 remaining_depth: Rc<Cell<usize>>,
129 }
130
131 impl DepthGuard {
132 fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
133 Self { remaining_depth }
134 }
135 }
136
137 impl Drop for DepthGuard {
138 fn drop(&mut self) {
139 let old_value = self.remaining_depth.get();
140 self.remaining_depth.set(old_value.saturating_add(1));
141 }
142 }
143}
144
145#[derive(PartialEq, Eq)]
146pub enum IsOptional {
148 Optional,
150 Mandatory,
152}
153
154pub enum IsLateral {
156 Lateral,
158 NotLateral,
160}
161
162pub enum WildcardExpr {
164 Expr(Expr),
166 QualifiedWildcard(ObjectName),
168 Wildcard,
170}
171
172impl From<TokenizerError> for ParserError {
173 fn from(e: TokenizerError) -> Self {
174 ParserError::TokenizerError(e.to_string())
175 }
176}
177
178impl fmt::Display for ParserError {
179 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
180 write!(
181 f,
182 "sql parser error: {}",
183 match self {
184 ParserError::TokenizerError(s) => s,
185 ParserError::ParserError(s) => s,
186 ParserError::RecursionLimitExceeded => "recursion limit exceeded",
187 }
188 )
189 }
190}
191
192impl core::error::Error for ParserError {}
193
194const DEFAULT_REMAINING_DEPTH: usize = 50;
196
197const EOF_TOKEN: TokenWithSpan = TokenWithSpan {
199 token: Token::EOF,
200 span: Span {
201 start: Location { line: 0, column: 0 },
202 end: Location { line: 0, column: 0 },
203 },
204};
205
206struct MatchedTrailingBracket(bool);
219
220impl From<bool> for MatchedTrailingBracket {
221 fn from(value: bool) -> Self {
222 Self(value)
223 }
224}
225
226#[derive(Debug, Clone, PartialEq, Eq)]
228pub struct ParserOptions {
229 pub trailing_commas: bool,
231 pub unescape: bool,
234 pub require_semicolon_stmt_delimiter: bool,
237}
238
239impl Default for ParserOptions {
240 fn default() -> Self {
241 Self {
242 trailing_commas: false,
243 unescape: true,
244 require_semicolon_stmt_delimiter: true,
245 }
246 }
247}
248
249impl ParserOptions {
250 pub fn new() -> Self {
252 Default::default()
253 }
254
255 pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
267 self.trailing_commas = trailing_commas;
268 self
269 }
270
271 pub fn with_unescape(mut self, unescape: bool) -> Self {
274 self.unescape = unescape;
275 self
276 }
277}
278
279#[derive(Copy, Clone)]
280enum ParserState {
281 Normal,
283 ConnectBy,
287 ColumnDefinition,
293}
294
295pub struct Parser<'a> {
334 tokens: Vec<TokenWithSpan>,
336 index: usize,
338 state: ParserState,
340 dialect: &'a dyn Dialect,
342 options: ParserOptions,
346 recursion_counter: RecursionCounter,
348 failed_prefix_positions: BTreeMap<usize, ExprPrefixError>,
351 failed_reserved_word_prefix_positions: BTreeMap<usize, ExprPrefixError>,
354 failed_derived_table_factor_positions: BTreeSet<usize>,
358}
359
360#[derive(Debug, Clone, Copy)]
363enum ExprPrefixError {
364 RecursionLimitExceeded,
365 Err,
366}
367
368impl From<&ParserError> for ExprPrefixError {
369 fn from(e: &ParserError) -> Self {
370 match e {
371 ParserError::RecursionLimitExceeded => Self::RecursionLimitExceeded,
372 _ => Self::Err,
373 }
374 }
375}
376
377impl<'a> Parser<'a> {
378 pub fn new(dialect: &'a dyn Dialect) -> Self {
394 Self {
395 tokens: vec![],
396 index: 0,
397 state: ParserState::Normal,
398 dialect,
399 recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
400 options: ParserOptions::new().with_trailing_commas(dialect.supports_trailing_commas()),
401 failed_prefix_positions: BTreeMap::new(),
402 failed_reserved_word_prefix_positions: BTreeMap::new(),
403 failed_derived_table_factor_positions: BTreeSet::new(),
404 }
405 }
406
407 pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
434 self.recursion_counter = RecursionCounter::new(recursion_limit);
435 self
436 }
437
438 pub fn with_options(mut self, options: ParserOptions) -> Self {
461 self.options = options;
462 self
463 }
464
465 pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithSpan>) -> Self {
467 self.tokens = tokens;
468 self.index = 0;
469 self.failed_prefix_positions.clear();
470 self.failed_reserved_word_prefix_positions.clear();
471 self.failed_derived_table_factor_positions.clear();
472 self
473 }
474
475 pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
477 let tokens_with_locations: Vec<TokenWithSpan> = tokens
479 .into_iter()
480 .map(|token| TokenWithSpan {
481 token,
482 span: Span::empty(),
483 })
484 .collect();
485 self.with_tokens_with_locations(tokens_with_locations)
486 }
487
488 pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
495 debug!("Parsing sql '{sql}'...");
496 let tokens = Tokenizer::new(self.dialect, sql)
497 .with_unescape(self.options.unescape)
498 .tokenize_with_location()?;
499 Ok(self.with_tokens_with_locations(tokens))
500 }
501
502 pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
518 let mut stmts = Vec::new();
519 let mut expecting_statement_delimiter = false;
520 loop {
521 while self.consume_token(&Token::SemiColon) {
523 expecting_statement_delimiter = false;
524 }
525
526 if !self.options.require_semicolon_stmt_delimiter {
527 expecting_statement_delimiter = false;
528 }
529
530 match &self.peek_token_ref().token {
531 Token::EOF => break,
532 Token::Word(word)
534 if expecting_statement_delimiter && word.keyword == Keyword::END =>
535 {
536 break;
537 }
538 _ => {}
539 }
540
541 if expecting_statement_delimiter {
542 return self.expected_ref("end of statement", self.peek_token_ref());
543 }
544
545 let statement = self.parse_statement()?;
546 stmts.push(statement);
547 expecting_statement_delimiter = true;
548 }
549 Ok(stmts)
550 }
551
552 pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
568 Parser::new(dialect).try_with_sql(sql)?.parse_statements()
569 }
570
571 pub fn parse_sql_with_comments(
576 dialect: &'a dyn Dialect,
577 sql: &str,
578 ) -> Result<(Vec<Statement>, comments::Comments), ParserError> {
579 let mut p = Parser::new(dialect).try_with_sql(sql)?;
580 p.parse_statements().map(|stmts| (stmts, p.into_comments()))
581 }
582
583 pub fn into_comments(self) -> comments::Comments {
585 let mut comments = comments::Comments::default();
586 for t in self.tokens.into_iter() {
587 match t.token {
588 Token::Whitespace(Whitespace::SingleLineComment { comment, prefix }) => {
589 comments.offer(comments::CommentWithSpan {
590 comment: comments::Comment::SingleLine {
591 content: comment,
592 prefix,
593 },
594 span: t.span,
595 });
596 }
597 Token::Whitespace(Whitespace::MultiLineComment(comment)) => {
598 comments.offer(comments::CommentWithSpan {
599 comment: comments::Comment::MultiLine(comment),
600 span: t.span,
601 });
602 }
603 _ => {}
604 }
605 }
606 comments
607 }
608
609 pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
612 let _guard = self.recursion_counter.try_decrease()?;
613
614 if let Some(statement) = self.dialect.parse_statement(self) {
616 return statement;
617 }
618
619 let next_token = self.next_token();
620 match &next_token.token {
621 Token::Word(w) => match w.keyword {
622 Keyword::KILL => self.parse_kill(),
623 Keyword::FLUSH => self.parse_flush(),
624 Keyword::DESC => self.parse_explain(DescribeAlias::Desc),
625 Keyword::DESCRIBE => self.parse_explain(DescribeAlias::Describe),
626 Keyword::EXPLAIN => self.parse_explain(DescribeAlias::Explain),
627 Keyword::ANALYZE => self.parse_analyze().map(Into::into),
628 Keyword::CASE => {
629 self.prev_token();
630 self.parse_case_stmt().map(Into::into)
631 }
632 Keyword::IF => {
633 self.prev_token();
634 self.parse_if_stmt().map(Into::into)
635 }
636 Keyword::WHILE => {
637 self.prev_token();
638 self.parse_while().map(Into::into)
639 }
640 Keyword::RAISE => {
641 self.prev_token();
642 self.parse_raise_stmt().map(Into::into)
643 }
644 Keyword::SELECT | Keyword::WITH | Keyword::VALUES | Keyword::FROM => {
645 self.prev_token();
646 self.parse_query().map(Into::into)
647 }
648 Keyword::TRUNCATE => self.parse_truncate().map(Into::into),
649 Keyword::ATTACH => {
650 if dialect_of!(self is DuckDbDialect) {
651 self.parse_attach_duckdb_database()
652 } else {
653 self.parse_attach_database()
654 }
655 }
656 Keyword::DETACH if self.dialect.supports_detach() => {
657 self.parse_detach_duckdb_database()
658 }
659 Keyword::MSCK => self.parse_msck().map(Into::into),
660 Keyword::CREATE => self.parse_create(),
661 Keyword::CACHE => self.parse_cache_table(),
662 Keyword::DROP => self.parse_drop(),
663 Keyword::DISCARD => self.parse_discard(),
664 Keyword::DECLARE => self.parse_declare(),
665 Keyword::FETCH => self.parse_fetch_statement(),
666 Keyword::DELETE => self.parse_delete(next_token),
667 Keyword::INSERT => self.parse_insert(next_token),
668 Keyword::REPLACE => self.parse_replace(next_token),
669 Keyword::UNCACHE => self.parse_uncache_table(),
670 Keyword::UPDATE => self.parse_update(next_token),
671 Keyword::ALTER => self.parse_alter(),
672 Keyword::CALL => self.parse_call(),
673 Keyword::COPY => self.parse_copy(),
674 Keyword::OPEN => {
675 self.prev_token();
676 self.parse_open()
677 }
678 Keyword::CLOSE => self.parse_close(),
679 Keyword::SET => self.parse_set(),
680 Keyword::SHOW => self.parse_show(),
681 Keyword::USE => self.parse_use(),
682 Keyword::GRANT => self.parse_grant().map(Into::into),
683 Keyword::DENY => {
684 self.prev_token();
685 self.parse_deny()
686 }
687 Keyword::REVOKE => self.parse_revoke().map(Into::into),
688 Keyword::START => self.parse_start_transaction(),
689 Keyword::BEGIN => self.parse_begin(),
690 Keyword::END => self.parse_end(),
691 Keyword::SAVEPOINT => self.parse_savepoint(),
692 Keyword::RELEASE => self.parse_release(),
693 Keyword::COMMIT => self.parse_commit(),
694 Keyword::RAISERROR => Ok(self.parse_raiserror()?),
695 Keyword::THROW => {
696 self.prev_token();
697 self.parse_throw().map(Into::into)
698 }
699 Keyword::ROLLBACK => self.parse_rollback(),
700 Keyword::ABORT => self.parse_abort(),
701 Keyword::ASSERT => self.parse_assert(),
702 Keyword::DEALLOCATE => self.parse_deallocate(),
705 Keyword::EXECUTE | Keyword::EXEC => self.parse_execute(),
706 Keyword::PREPARE => self.parse_prepare(),
707 Keyword::MERGE => self.parse_merge(next_token).map(Into::into),
708 Keyword::LISTEN if self.dialect.supports_listen_notify() => self.parse_listen(),
711 Keyword::UNLISTEN if self.dialect.supports_listen_notify() => self.parse_unlisten(),
712 Keyword::NOTIFY if self.dialect.supports_listen_notify() => self.parse_notify(),
713 Keyword::PRAGMA => self.parse_pragma(),
715 Keyword::UNLOAD => {
716 self.prev_token();
717 self.parse_unload()
718 }
719 Keyword::RENAME => self.parse_rename(),
720 Keyword::INSTALL if self.dialect.supports_install() => self.parse_install(),
722 Keyword::LOAD => self.parse_load(),
723 Keyword::LOCK => {
724 self.prev_token();
725 self.parse_lock_statement().map(Into::into)
726 }
727 Keyword::OPTIMIZE if self.dialect.supports_optimize_table() => {
728 self.parse_optimize_table()
729 }
730 Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
732 Keyword::PRINT => self.parse_print(),
733 Keyword::WAITFOR => self.parse_waitfor(),
735 Keyword::RETURN => self.parse_return(),
736 Keyword::EXPORT => {
737 self.prev_token();
738 self.parse_export_data()
739 }
740 Keyword::VACUUM => {
741 self.prev_token();
742 self.parse_vacuum()
743 }
744 Keyword::RESET => self.parse_reset().map(Into::into),
745 _ => self.expected("an SQL statement", next_token),
746 },
747 Token::LParen => {
748 self.prev_token();
749 self.parse_query().map(Into::into)
750 }
751 _ => self.expected("an SQL statement", next_token),
752 }
753 }
754
755 pub fn parse_case_stmt(&mut self) -> Result<CaseStatement, ParserError> {
759 let case_token = self.expect_keyword(Keyword::CASE)?;
760
761 let match_expr = if self.peek_keyword(Keyword::WHEN) {
762 None
763 } else {
764 Some(self.parse_expr()?)
765 };
766
767 self.expect_keyword_is(Keyword::WHEN)?;
768 let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
769 parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
770 })?;
771
772 let else_block = if self.parse_keyword(Keyword::ELSE) {
773 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
774 } else {
775 None
776 };
777
778 let mut end_case_token = self.expect_keyword(Keyword::END)?;
779 if self.peek_keyword(Keyword::CASE) {
780 end_case_token = self.expect_keyword(Keyword::CASE)?;
781 }
782
783 Ok(CaseStatement {
784 case_token: AttachedToken(case_token),
785 match_expr,
786 when_blocks,
787 else_block,
788 end_case_token: AttachedToken(end_case_token),
789 })
790 }
791
792 pub fn parse_if_stmt(&mut self) -> Result<IfStatement, ParserError> {
796 self.expect_keyword_is(Keyword::IF)?;
797 let if_block = self.parse_conditional_statement_block(&[
798 Keyword::ELSE,
799 Keyword::ELSEIF,
800 Keyword::END,
801 ])?;
802
803 let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
804 self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
805 parser.parse_conditional_statement_block(&[
806 Keyword::ELSEIF,
807 Keyword::ELSE,
808 Keyword::END,
809 ])
810 })?
811 } else {
812 vec![]
813 };
814
815 let else_block = if self.parse_keyword(Keyword::ELSE) {
816 Some(self.parse_conditional_statement_block(&[Keyword::END])?)
817 } else {
818 None
819 };
820
821 self.expect_keyword_is(Keyword::END)?;
822 let end_token = self.expect_keyword(Keyword::IF)?;
823
824 Ok(IfStatement {
825 if_block,
826 elseif_blocks,
827 else_block,
828 end_token: Some(AttachedToken(end_token)),
829 })
830 }
831
832 fn parse_while(&mut self) -> Result<WhileStatement, ParserError> {
836 self.expect_keyword_is(Keyword::WHILE)?;
837 let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
838
839 Ok(WhileStatement { while_block })
840 }
841
842 fn parse_conditional_statement_block(
850 &mut self,
851 terminal_keywords: &[Keyword],
852 ) -> Result<ConditionalStatementBlock, ParserError> {
853 let start_token = self.get_current_token().clone(); let mut then_token = None;
855
856 let condition = match &start_token.token {
857 Token::Word(w) if w.keyword == Keyword::ELSE => None,
858 Token::Word(w) if w.keyword == Keyword::WHILE => {
859 let expr = self.parse_expr()?;
860 Some(expr)
861 }
862 _ => {
863 let expr = self.parse_expr()?;
864 then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
865 Some(expr)
866 }
867 };
868
869 let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
870
871 Ok(ConditionalStatementBlock {
872 start_token: AttachedToken(start_token),
873 condition,
874 then_token,
875 conditional_statements,
876 })
877 }
878
879 pub(crate) fn parse_conditional_statements(
882 &mut self,
883 terminal_keywords: &[Keyword],
884 ) -> Result<ConditionalStatements, ParserError> {
885 let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
886 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
887 let statements = self.parse_statement_list(terminal_keywords)?;
888 let end_token = self.expect_keyword(Keyword::END)?;
889
890 ConditionalStatements::BeginEnd(BeginEndStatements {
891 begin_token: AttachedToken(begin_token),
892 statements,
893 end_token: AttachedToken(end_token),
894 })
895 } else {
896 ConditionalStatements::Sequence {
897 statements: self.parse_statement_list(terminal_keywords)?,
898 }
899 };
900 Ok(conditional_statements)
901 }
902
903 pub fn parse_raise_stmt(&mut self) -> Result<RaiseStatement, ParserError> {
907 self.expect_keyword_is(Keyword::RAISE)?;
908
909 let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
910 self.expect_token(&Token::Eq)?;
911 Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
912 } else {
913 self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
914 };
915
916 Ok(RaiseStatement { value })
917 }
918 pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
922 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
923
924 self.expect_keyword_is(Keyword::ON)?;
925 let token = self.next_token();
926
927 let (object_type, object_name) = match token.token {
928 Token::Word(w) if w.keyword == Keyword::COLLATION => {
929 (CommentObject::Collation, self.parse_object_name(false)?)
930 }
931 Token::Word(w) if w.keyword == Keyword::COLUMN => {
932 (CommentObject::Column, self.parse_object_name(false)?)
933 }
934 Token::Word(w) if w.keyword == Keyword::DATABASE => {
935 (CommentObject::Database, self.parse_object_name(false)?)
936 }
937 Token::Word(w) if w.keyword == Keyword::DOMAIN => {
938 (CommentObject::Domain, self.parse_object_name(false)?)
939 }
940 Token::Word(w) if w.keyword == Keyword::EXTENSION => {
941 (CommentObject::Extension, self.parse_object_name(false)?)
942 }
943 Token::Word(w) if w.keyword == Keyword::FUNCTION => {
944 (CommentObject::Function, self.parse_object_name(false)?)
945 }
946 Token::Word(w) if w.keyword == Keyword::INDEX => {
947 (CommentObject::Index, self.parse_object_name(false)?)
948 }
949 Token::Word(w) if w.keyword == Keyword::MATERIALIZED => {
950 self.expect_keyword_is(Keyword::VIEW)?;
951 (
952 CommentObject::MaterializedView,
953 self.parse_object_name(false)?,
954 )
955 }
956 Token::Word(w) if w.keyword == Keyword::PROCEDURE => {
957 (CommentObject::Procedure, self.parse_object_name(false)?)
958 }
959 Token::Word(w) if w.keyword == Keyword::ROLE => {
960 (CommentObject::Role, self.parse_object_name(false)?)
961 }
962 Token::Word(w) if w.keyword == Keyword::SCHEMA => {
963 (CommentObject::Schema, self.parse_object_name(false)?)
964 }
965 Token::Word(w) if w.keyword == Keyword::SEQUENCE => {
966 (CommentObject::Sequence, self.parse_object_name(false)?)
967 }
968 Token::Word(w) if w.keyword == Keyword::TABLE => {
969 (CommentObject::Table, self.parse_object_name(false)?)
970 }
971 Token::Word(w) if w.keyword == Keyword::TYPE => {
972 (CommentObject::Type, self.parse_object_name(false)?)
973 }
974 Token::Word(w) if w.keyword == Keyword::USER => {
975 (CommentObject::User, self.parse_object_name(false)?)
976 }
977 Token::Word(w) if w.keyword == Keyword::VIEW => {
978 (CommentObject::View, self.parse_object_name(false)?)
979 }
980 _ => self.expected("comment object_type", token)?,
981 };
982
983 self.expect_keyword_is(Keyword::IS)?;
984 let comment = if self.parse_keyword(Keyword::NULL) {
985 None
986 } else {
987 Some(self.parse_literal_string()?)
988 };
989 Ok(Statement::Comment {
990 object_type,
991 object_name,
992 comment,
993 if_exists,
994 })
995 }
996
997 pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
999 let mut channel = None;
1000 let mut tables: Vec<ObjectName> = vec![];
1001 let mut read_lock = false;
1002 let mut export = false;
1003
1004 if !dialect_of!(self is MySqlDialect | GenericDialect) {
1005 return parser_err!(
1006 "Unsupported statement FLUSH",
1007 self.peek_token_ref().span.start
1008 );
1009 }
1010
1011 let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
1012 Some(FlushLocation::NoWriteToBinlog)
1013 } else if self.parse_keyword(Keyword::LOCAL) {
1014 Some(FlushLocation::Local)
1015 } else {
1016 None
1017 };
1018
1019 let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
1020 FlushType::BinaryLogs
1021 } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
1022 FlushType::EngineLogs
1023 } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
1024 FlushType::ErrorLogs
1025 } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
1026 FlushType::GeneralLogs
1027 } else if self.parse_keywords(&[Keyword::HOSTS]) {
1028 FlushType::Hosts
1029 } else if self.parse_keyword(Keyword::PRIVILEGES) {
1030 FlushType::Privileges
1031 } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
1032 FlushType::OptimizerCosts
1033 } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
1034 if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
1035 channel = Some(self.parse_object_name(false)?.to_string());
1036 }
1037 FlushType::RelayLogs
1038 } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
1039 FlushType::SlowLogs
1040 } else if self.parse_keyword(Keyword::STATUS) {
1041 FlushType::Status
1042 } else if self.parse_keyword(Keyword::USER_RESOURCES) {
1043 FlushType::UserResources
1044 } else if self.parse_keywords(&[Keyword::LOGS]) {
1045 FlushType::Logs
1046 } else if self.parse_keywords(&[Keyword::TABLES]) {
1047 loop {
1048 let next_token = self.next_token();
1049 match &next_token.token {
1050 Token::Word(w) => match w.keyword {
1051 Keyword::WITH => {
1052 read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
1053 }
1054 Keyword::FOR => {
1055 export = self.parse_keyword(Keyword::EXPORT);
1056 }
1057 Keyword::NoKeyword => {
1058 self.prev_token();
1059 tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
1060 }
1061 _ => {}
1062 },
1063 _ => {
1064 break;
1065 }
1066 }
1067 }
1068
1069 FlushType::Tables
1070 } else {
1071 return self.expected_ref(
1072 "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
1073 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
1074 self.peek_token_ref(),
1075 );
1076 };
1077
1078 Ok(Statement::Flush {
1079 object_type,
1080 location,
1081 channel,
1082 read_lock,
1083 export,
1084 tables,
1085 })
1086 }
1087
1088 pub fn parse_msck(&mut self) -> Result<Msck, ParserError> {
1090 let repair = self.parse_keyword(Keyword::REPAIR);
1091 self.expect_keyword_is(Keyword::TABLE)?;
1092 let table_name = self.parse_object_name(false)?;
1093 let partition_action = self
1094 .maybe_parse(|parser| {
1095 let pa = match parser.parse_one_of_keywords(&[
1096 Keyword::ADD,
1097 Keyword::DROP,
1098 Keyword::SYNC,
1099 ]) {
1100 Some(Keyword::ADD) => Some(AddDropSync::ADD),
1101 Some(Keyword::DROP) => Some(AddDropSync::DROP),
1102 Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
1103 _ => None,
1104 };
1105 parser.expect_keyword_is(Keyword::PARTITIONS)?;
1106 Ok(pa)
1107 })?
1108 .unwrap_or_default();
1109 Ok(Msck {
1110 repair,
1111 table_name,
1112 partition_action,
1113 })
1114 }
1115
1116 pub fn parse_truncate(&mut self) -> Result<Truncate, ParserError> {
1118 let table = self.parse_keyword(Keyword::TABLE);
1119 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1120
1121 let table_names = self.parse_comma_separated(|p| {
1122 let only = p.parse_keyword(Keyword::ONLY);
1123 let name = p.parse_object_name(false)?;
1124 let has_asterisk = p.consume_token(&Token::Mul);
1125 Ok(TruncateTableTarget {
1126 name,
1127 only,
1128 has_asterisk,
1129 })
1130 })?;
1131
1132 let mut partitions = None;
1133 if self.parse_keyword(Keyword::PARTITION) {
1134 self.expect_token(&Token::LParen)?;
1135 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1136 self.expect_token(&Token::RParen)?;
1137 }
1138
1139 let mut identity = None;
1140 let mut cascade = None;
1141
1142 if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
1143 identity = if self.parse_keywords(&[Keyword::RESTART, Keyword::IDENTITY]) {
1144 Some(TruncateIdentityOption::Restart)
1145 } else if self.parse_keywords(&[Keyword::CONTINUE, Keyword::IDENTITY]) {
1146 Some(TruncateIdentityOption::Continue)
1147 } else {
1148 None
1149 };
1150
1151 cascade = self.parse_cascade_option();
1152 };
1153
1154 let on_cluster = self.parse_optional_on_cluster()?;
1155
1156 Ok(Truncate {
1157 table_names,
1158 partitions,
1159 table,
1160 if_exists,
1161 identity,
1162 cascade,
1163 on_cluster,
1164 })
1165 }
1166
1167 fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
1168 if self.parse_keyword(Keyword::CASCADE) {
1169 Some(CascadeOption::Cascade)
1170 } else if self.parse_keyword(Keyword::RESTRICT) {
1171 Some(CascadeOption::Restrict)
1172 } else {
1173 None
1174 }
1175 }
1176
1177 pub fn parse_attach_duckdb_database_options(
1179 &mut self,
1180 ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
1181 if !self.consume_token(&Token::LParen) {
1182 return Ok(vec![]);
1183 }
1184
1185 let mut options = vec![];
1186 loop {
1187 if self.parse_keyword(Keyword::READ_ONLY) {
1188 let boolean = if self.parse_keyword(Keyword::TRUE) {
1189 Some(true)
1190 } else if self.parse_keyword(Keyword::FALSE) {
1191 Some(false)
1192 } else {
1193 None
1194 };
1195 options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
1196 } else if self.parse_keyword(Keyword::TYPE) {
1197 let ident = self.parse_identifier()?;
1198 options.push(AttachDuckDBDatabaseOption::Type(ident));
1199 } else {
1200 return self
1201 .expected_ref("expected one of: ), READ_ONLY, TYPE", self.peek_token_ref());
1202 };
1203
1204 if self.consume_token(&Token::RParen) {
1205 return Ok(options);
1206 } else if self.consume_token(&Token::Comma) {
1207 continue;
1208 } else {
1209 return self.expected_ref("expected one of: ')', ','", self.peek_token_ref());
1210 }
1211 }
1212 }
1213
1214 pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1216 let database = self.parse_keyword(Keyword::DATABASE);
1217 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
1218 let database_path = self.parse_identifier()?;
1219 let database_alias = if self.parse_keyword(Keyword::AS) {
1220 Some(self.parse_identifier()?)
1221 } else {
1222 None
1223 };
1224
1225 let attach_options = self.parse_attach_duckdb_database_options()?;
1226 Ok(Statement::AttachDuckDBDatabase {
1227 if_not_exists,
1228 database,
1229 database_path,
1230 database_alias,
1231 attach_options,
1232 })
1233 }
1234
1235 pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
1237 let database = self.parse_keyword(Keyword::DATABASE);
1238 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
1239 let database_alias = self.parse_identifier()?;
1240 Ok(Statement::DetachDuckDBDatabase {
1241 if_exists,
1242 database,
1243 database_alias,
1244 })
1245 }
1246
1247 pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
1249 let database = self.parse_keyword(Keyword::DATABASE);
1250 let database_file_name = self.parse_expr()?;
1251 self.expect_keyword_is(Keyword::AS)?;
1252 let schema_name = self.parse_identifier()?;
1253 Ok(Statement::AttachDatabase {
1254 database,
1255 schema_name,
1256 database_file_name,
1257 })
1258 }
1259
1260 pub fn parse_analyze(&mut self) -> Result<Analyze, ParserError> {
1262 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
1263 let table_name = self.maybe_parse(|parser| parser.parse_object_name(false))?;
1264 let mut for_columns = false;
1265 let mut cache_metadata = false;
1266 let mut noscan = false;
1267 let mut partitions = None;
1268 let mut compute_statistics = false;
1269 let mut columns = vec![];
1270
1271 if table_name.is_some() && self.consume_token(&Token::LParen) {
1273 columns = self.parse_comma_separated(|p| p.parse_identifier())?;
1274 self.expect_token(&Token::RParen)?;
1275 }
1276
1277 loop {
1278 match self.parse_one_of_keywords(&[
1279 Keyword::PARTITION,
1280 Keyword::FOR,
1281 Keyword::CACHE,
1282 Keyword::NOSCAN,
1283 Keyword::COMPUTE,
1284 ]) {
1285 Some(Keyword::PARTITION) => {
1286 self.expect_token(&Token::LParen)?;
1287 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
1288 self.expect_token(&Token::RParen)?;
1289 }
1290 Some(Keyword::NOSCAN) => noscan = true,
1291 Some(Keyword::FOR) => {
1292 self.expect_keyword_is(Keyword::COLUMNS)?;
1293
1294 columns = self
1295 .maybe_parse(|parser| {
1296 parser.parse_comma_separated(|p| p.parse_identifier())
1297 })?
1298 .unwrap_or_default();
1299 for_columns = true
1300 }
1301 Some(Keyword::CACHE) => {
1302 self.expect_keyword_is(Keyword::METADATA)?;
1303 cache_metadata = true
1304 }
1305 Some(Keyword::COMPUTE) => {
1306 self.expect_keyword_is(Keyword::STATISTICS)?;
1307 compute_statistics = true
1308 }
1309 _ => break,
1310 }
1311 }
1312
1313 Ok(Analyze {
1314 has_table_keyword,
1315 table_name,
1316 for_columns,
1317 columns,
1318 partitions,
1319 cache_metadata,
1320 noscan,
1321 compute_statistics,
1322 })
1323 }
1324
1325 pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
1327 let index = self.index;
1328
1329 let next_token = self.next_token();
1330 match next_token.token {
1331 t @ (Token::Word(_) | Token::SingleQuotedString(_))
1332 if self.peek_token_ref().token == Token::Period =>
1333 {
1334 let mut id_parts: Vec<Ident> = vec![match t {
1335 Token::Word(w) => w.into_ident(next_token.span),
1336 Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
1337 _ => {
1338 return Err(ParserError::ParserError(
1339 "Internal parser error: unexpected token type".to_string(),
1340 ))
1341 }
1342 }];
1343
1344 while self.consume_token(&Token::Period) {
1345 let next_token = self.next_token();
1346 match next_token.token {
1347 Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
1348 Token::SingleQuotedString(s) => {
1349 id_parts.push(Ident::with_quote('\'', s))
1351 }
1352 Token::Placeholder(s) => {
1353 id_parts.push(Ident::new(s))
1356 }
1357 Token::Mul => {
1358 return Ok(Expr::QualifiedWildcard(
1359 ObjectName::from(id_parts),
1360 AttachedToken(next_token),
1361 ));
1362 }
1363 _ => {
1364 return self.expected("an identifier or a '*' after '.'", next_token);
1365 }
1366 }
1367 }
1368 }
1369 Token::Mul => {
1370 return Ok(Expr::Wildcard(AttachedToken(next_token)));
1371 }
1372 Token::LParen => {
1374 let [maybe_mul, maybe_rparen] = self.peek_tokens_ref();
1375 if maybe_mul.token == Token::Mul && maybe_rparen.token == Token::RParen {
1376 let mul_token = self.next_token(); self.next_token(); return Ok(Expr::Wildcard(AttachedToken(mul_token)));
1379 }
1380 }
1381 _ => (),
1382 };
1383
1384 self.index = index;
1385 self.parse_expr()
1386 }
1387
1388 pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
1390 self.parse_subexpr(self.dialect.prec_unknown())
1391 }
1392
1393 pub fn parse_expr_with_alias_and_order_by(
1395 &mut self,
1396 ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
1397 let expr = self.parse_expr()?;
1398
1399 fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
1400 explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
1401 }
1402 let alias = self.parse_optional_alias_inner(None, validator)?;
1403 let order_by = OrderByOptions {
1404 sort: self.parse_optional_order_by_sort(),
1405 nulls_first: None,
1406 };
1407 Ok(ExprWithAliasAndOrderBy {
1408 expr: ExprWithAlias { expr, alias },
1409 order_by,
1410 })
1411 }
1412
1413 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1415 pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
1416 let _guard = self.recursion_counter.try_decrease()?;
1417 debug!("parsing expr");
1418 let mut expr = self.parse_prefix()?;
1419
1420 expr = self.parse_compound_expr(expr, vec![])?;
1421
1422 if !self.in_column_definition_state() && self.parse_keyword(Keyword::COLLATE) {
1426 expr = Expr::Collate {
1427 expr: Box::new(expr),
1428 collation: self.parse_object_name(false)?,
1429 };
1430 }
1431
1432 debug!("prefix: {expr:?}");
1433 loop {
1434 let next_precedence = self.get_next_precedence()?;
1435 debug!("next precedence: {next_precedence:?}");
1436
1437 if precedence >= next_precedence {
1438 break;
1439 }
1440
1441 if Token::Period == self.peek_token_ref().token {
1444 break;
1445 }
1446
1447 expr = self.parse_infix(expr, next_precedence)?;
1448 }
1449 Ok(expr)
1450 }
1451
1452 pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
1454 let condition = self.parse_expr()?;
1455 let message = if self.parse_keyword(Keyword::AS) {
1456 Some(self.parse_expr()?)
1457 } else {
1458 None
1459 };
1460
1461 Ok(Statement::Assert { condition, message })
1462 }
1463
1464 pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
1466 let name = self.parse_identifier()?;
1467 Ok(Statement::Savepoint { name })
1468 }
1469
1470 pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
1472 let _ = self.parse_keyword(Keyword::SAVEPOINT);
1473 let name = self.parse_identifier()?;
1474
1475 Ok(Statement::ReleaseSavepoint { name })
1476 }
1477
1478 pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
1480 let channel = self.parse_identifier()?;
1481 Ok(Statement::LISTEN { channel })
1482 }
1483
1484 pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
1486 let channel = if self.consume_token(&Token::Mul) {
1487 Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
1488 } else {
1489 match self.parse_identifier() {
1490 Ok(expr) => expr,
1491 _ => {
1492 self.prev_token();
1493 return self.expected_ref("wildcard or identifier", self.peek_token_ref());
1494 }
1495 }
1496 };
1497 Ok(Statement::UNLISTEN { channel })
1498 }
1499
1500 pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
1502 let channel = self.parse_identifier()?;
1503 let payload = if self.consume_token(&Token::Comma) {
1504 Some(self.parse_literal_string()?)
1505 } else {
1506 None
1507 };
1508 Ok(Statement::NOTIFY { channel, payload })
1509 }
1510
1511 pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
1513 if self.peek_keyword(Keyword::TABLE) {
1514 self.expect_keyword(Keyword::TABLE)?;
1515 let rename_tables = self.parse_comma_separated(|parser| {
1516 let old_name = parser.parse_object_name(false)?;
1517 parser.expect_keyword(Keyword::TO)?;
1518 let new_name = parser.parse_object_name(false)?;
1519
1520 Ok(RenameTable { old_name, new_name })
1521 })?;
1522 Ok(rename_tables.into())
1523 } else {
1524 self.expected_ref("KEYWORD `TABLE` after RENAME", self.peek_token_ref())
1525 }
1526 }
1527
1528 fn parse_expr_prefix_by_reserved_word(
1531 &mut self,
1532 w: &Word,
1533 w_span: Span,
1534 ) -> Result<Option<Expr>, ParserError> {
1535 match w.keyword {
1536 Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
1537 self.prev_token();
1538 Ok(Some(Expr::Value(self.parse_value()?)))
1539 }
1540 Keyword::NULL => {
1541 self.prev_token();
1542 Ok(Some(Expr::Value(self.parse_value()?)))
1543 }
1544 Keyword::CURRENT_CATALOG
1545 | Keyword::CURRENT_USER
1546 | Keyword::SESSION_USER
1547 | Keyword::USER
1548 if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1549 {
1550 Ok(Some(Expr::Function(Function {
1551 name: ObjectName::from(vec![w.to_ident(w_span)]),
1552 uses_odbc_syntax: false,
1553 parameters: FunctionArguments::None,
1554 args: FunctionArguments::None,
1555 null_treatment: None,
1556 filter: None,
1557 over: None,
1558 within_group: vec![],
1559 })))
1560 }
1561 Keyword::CURRENT_TIMESTAMP
1562 | Keyword::CURRENT_TIME
1563 | Keyword::CURRENT_DATE
1564 | Keyword::LOCALTIME
1565 | Keyword::LOCALTIMESTAMP => {
1566 Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.to_ident(w_span)]))?))
1567 }
1568 Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
1569 Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
1570 Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
1571 Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
1572 Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
1573 Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
1574 Keyword::EXISTS
1575 if !dialect_of!(self is DatabricksDialect)
1577 || matches!(
1578 self.peek_nth_token_ref(1).token,
1579 Token::Word(Word {
1580 keyword: Keyword::SELECT | Keyword::WITH,
1581 ..
1582 })
1583 ) =>
1584 {
1585 Ok(Some(self.parse_exists_expr(false)?))
1586 }
1587 Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
1588 Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
1589 Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
1590 Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
1591 Ok(Some(self.parse_position_expr(w.to_ident(w_span))?))
1592 }
1593 Keyword::SUBSTR | Keyword::SUBSTRING => {
1594 self.prev_token();
1595 Ok(Some(self.parse_substring()?))
1596 }
1597 Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
1598 Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
1599 Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
1600 Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
1602 self.expect_token(&Token::LBracket)?;
1603 Ok(Some(self.parse_array_expr(true)?))
1604 }
1605 Keyword::ARRAY
1606 if self.peek_token_ref().token == Token::LParen
1607 && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
1608 {
1609 self.expect_token(&Token::LParen)?;
1610 let query = self.parse_query()?;
1611 self.expect_token(&Token::RParen)?;
1612 Ok(Some(Expr::Function(Function {
1613 name: ObjectName::from(vec![w.to_ident(w_span)]),
1614 uses_odbc_syntax: false,
1615 parameters: FunctionArguments::None,
1616 args: FunctionArguments::Subquery(query),
1617 filter: None,
1618 null_treatment: None,
1619 over: None,
1620 within_group: vec![],
1621 })))
1622 }
1623 Keyword::NOT => Ok(Some(self.parse_not()?)),
1624 Keyword::MATCH if self.dialect.supports_match_against() => {
1625 Ok(Some(self.parse_match_against()?))
1626 }
1627 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
1628 let struct_expr = self.parse_struct_literal()?;
1629 Ok(Some(struct_expr))
1630 }
1631 Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
1632 let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
1633 Ok(Some(Expr::Prior(Box::new(expr))))
1634 }
1635 Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
1636 Ok(Some(self.parse_duckdb_map_literal()?))
1637 }
1638 Keyword::LAMBDA if self.dialect.supports_lambda_functions() => {
1639 Ok(Some(self.parse_lambda_expr()?))
1640 }
1641 _ if self.dialect.supports_geometric_types() => match w.keyword {
1642 Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
1643 Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
1644 Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
1645 Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
1646 Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
1647 Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
1648 Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
1649 _ => Ok(None),
1650 },
1651 _ => Ok(None),
1652 }
1653 }
1654
1655 fn parse_expr_prefix_by_unreserved_word(
1657 &mut self,
1658 w: &Word,
1659 w_span: Span,
1660 ) -> Result<Expr, ParserError> {
1661 let is_outer_join = self.peek_outer_join_operator();
1662 match &self.peek_token_ref().token {
1663 Token::LParen if !is_outer_join => {
1664 let id_parts = vec![w.to_ident(w_span)];
1665 self.parse_function(ObjectName::from(id_parts))
1666 }
1667 Token::SingleQuotedString(_)
1669 | Token::DoubleQuotedString(_)
1670 | Token::HexStringLiteral(_)
1671 if w.value.starts_with('_') =>
1672 {
1673 Ok(Expr::Prefixed {
1674 prefix: w.to_ident(w_span),
1675 value: self.parse_introduced_string_expr()?.into(),
1676 })
1677 }
1678 Token::SingleQuotedString(_)
1680 | Token::DoubleQuotedString(_)
1681 | Token::HexStringLiteral(_)
1682 if w.value.starts_with('_') =>
1683 {
1684 Ok(Expr::Prefixed {
1685 prefix: w.to_ident(w_span),
1686 value: self.parse_introduced_string_expr()?.into(),
1687 })
1688 }
1689 Token::Arrow if self.dialect.supports_lambda_functions() => {
1693 self.expect_token(&Token::Arrow)?;
1694 Ok(Expr::Lambda(LambdaFunction {
1695 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1696 name: w.to_ident(w_span),
1697 data_type: None,
1698 }),
1699 body: Box::new(self.parse_expr()?),
1700 syntax: LambdaSyntax::Arrow,
1701 }))
1702 }
1703 Token::Word(_)
1707 if self.dialect.supports_lambda_functions()
1708 && self.peek_nth_token_ref(1).token == Token::Arrow =>
1709 {
1710 let data_type = self.parse_data_type()?;
1711 self.expect_token(&Token::Arrow)?;
1712 Ok(Expr::Lambda(LambdaFunction {
1713 params: OneOrManyWithParens::One(LambdaFunctionParameter {
1714 name: w.to_ident(w_span),
1715 data_type: Some(data_type),
1716 }),
1717 body: Box::new(self.parse_expr()?),
1718 syntax: LambdaSyntax::Arrow,
1719 }))
1720 }
1721 _ => Ok(Expr::Identifier(w.to_ident(w_span))),
1722 }
1723 }
1724
1725 fn is_simple_unquoted_object_name(name: &ObjectName, expected: &str) -> bool {
1728 if let [ObjectNamePart::Identifier(ident)] = name.0.as_slice() {
1729 ident.quote_style.is_none() && ident.value.eq_ignore_ascii_case(expected)
1730 } else {
1731 false
1732 }
1733 }
1734
1735 pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
1737 if let Some(prefix) = self.dialect.parse_prefix(self) {
1739 return prefix;
1740 }
1741
1742 let start_index = self.index;
1748 if let Some(&cached) = self.failed_prefix_positions.get(&start_index) {
1749 return self.cached_prefix_error(cached, self.peek_token_ref());
1750 }
1751 let result = self.parse_prefix_inner();
1752 if let Err(ref e) = result {
1753 self.failed_prefix_positions.insert(start_index, e.into());
1754 }
1755 result
1756 }
1757
1758 fn cached_prefix_error<T>(
1760 &self,
1761 cached: ExprPrefixError,
1762 found: &TokenWithSpan,
1763 ) -> Result<T, ParserError> {
1764 match cached {
1765 ExprPrefixError::RecursionLimitExceeded => Err(ParserError::RecursionLimitExceeded),
1766 ExprPrefixError::Err => self.expected_ref("an expression", found),
1767 }
1768 }
1769
1770 fn parse_prefix_inner(&mut self) -> Result<Expr, ParserError> {
1771 let loc = self.peek_token_ref().span.start;
1788 let opt_expr = self.maybe_parse(|parser| {
1789 match parser.parse_data_type()? {
1790 DataType::Interval { .. } => parser.parse_interval(),
1791 DataType::Custom(ref name, ref modifiers)
1802 if modifiers.is_empty()
1803 && Self::is_simple_unquoted_object_name(name, "xml")
1804 && parser.dialect.supports_xml_expressions() =>
1805 {
1806 Ok(Expr::TypedString(TypedString {
1807 data_type: DataType::Custom(name.clone(), modifiers.clone()),
1808 value: parser.parse_value()?,
1809 uses_odbc_syntax: false,
1810 }))
1811 }
1812 DataType::Custom(..) => parser_err!("dummy", loc),
1813 DataType::Binary(..) if self.dialect.supports_binary_kw_as_cast() => {
1815 Ok(Expr::Cast {
1816 kind: CastKind::Cast,
1817 expr: Box::new(parser.parse_expr()?),
1818 data_type: DataType::Binary(None),
1819 format: None,
1820 })
1821 }
1822 data_type => Ok(Expr::TypedString(TypedString {
1823 data_type,
1824 value: parser.parse_value()?,
1825 uses_odbc_syntax: false,
1826 })),
1827 }
1828 })?;
1829
1830 if let Some(expr) = opt_expr {
1831 return Ok(expr);
1832 }
1833
1834 let dialect = self.dialect;
1838
1839 self.advance_token();
1840 let next_token_index = self.get_current_index();
1841 let next_token = self.get_current_token();
1842 let span = next_token.span;
1843 let expr = match &next_token.token {
1844 Token::Word(w) => {
1845 let w = w.clone();
1854 let try_parse_result = if let Some(&cached) = self
1861 .failed_reserved_word_prefix_positions
1862 .get(&next_token_index)
1863 {
1864 self.cached_prefix_error(cached, self.get_current_token())
1865 } else {
1866 self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span))
1867 };
1868 match try_parse_result {
1869 Ok(Some(expr)) => Ok(expr),
1871
1872 Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
1874
1875 Err(e) => {
1882 self.failed_reserved_word_prefix_positions
1883 .insert(next_token_index, (&e).into());
1884 if !self.dialect.is_reserved_for_identifier(w.keyword) {
1885 if let Ok(Some(expr)) = self.maybe_parse(|parser| {
1886 parser.parse_expr_prefix_by_unreserved_word(&w, span)
1887 }) {
1888 return Ok(expr);
1889 }
1890 }
1891 return Err(e);
1892 }
1893 }
1894 } Token::LBracket => self.parse_array_expr(false),
1897 tok @ Token::Minus | tok @ Token::Plus => {
1898 let op = if *tok == Token::Plus {
1899 UnaryOperator::Plus
1900 } else {
1901 UnaryOperator::Minus
1902 };
1903 Ok(Expr::UnaryOp {
1904 op,
1905 expr: Box::new(
1906 self.parse_subexpr(self.dialect.prec_value(Precedence::MulDivModOp))?,
1907 ),
1908 })
1909 }
1910 Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
1911 op: UnaryOperator::BangNot,
1912 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
1913 }),
1914 tok @ Token::DoubleExclamationMark
1915 | tok @ Token::PGSquareRoot
1916 | tok @ Token::PGCubeRoot
1917 | tok @ Token::AtSign
1918 if dialect_is!(dialect is PostgreSqlDialect) =>
1919 {
1920 let op = match tok {
1921 Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1922 Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1923 Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1924 Token::AtSign => UnaryOperator::PGAbs,
1925 _ => {
1926 return Err(ParserError::ParserError(
1927 "Internal parser error: unexpected unary operator token".to_string(),
1928 ))
1929 }
1930 };
1931 Ok(Expr::UnaryOp {
1932 op,
1933 expr: Box::new(
1934 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1935 ),
1936 })
1937 }
1938 Token::Tilde => Ok(Expr::UnaryOp {
1939 op: UnaryOperator::BitwiseNot,
1940 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?),
1941 }),
1942 tok @ Token::Sharp
1943 | tok @ Token::AtDashAt
1944 | tok @ Token::AtAt
1945 | tok @ Token::QuestionMarkDash
1946 | tok @ Token::QuestionPipe
1947 if self.dialect.supports_geometric_types() =>
1948 {
1949 let op = match tok {
1950 Token::Sharp => UnaryOperator::Hash,
1951 Token::AtDashAt => UnaryOperator::AtDashAt,
1952 Token::AtAt => UnaryOperator::DoubleAt,
1953 Token::QuestionMarkDash => UnaryOperator::QuestionDash,
1954 Token::QuestionPipe => UnaryOperator::QuestionPipe,
1955 _ => {
1956 return Err(ParserError::ParserError(format!(
1957 "Unexpected token in unary operator parsing: {tok:?}"
1958 )))
1959 }
1960 };
1961 Ok(Expr::UnaryOp {
1962 op,
1963 expr: Box::new(
1964 self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
1965 ),
1966 })
1967 }
1968 Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
1969 {
1970 self.prev_token();
1971 Ok(Expr::Value(self.parse_value()?))
1972 }
1973 Token::UnicodeStringLiteral(_) => {
1974 self.prev_token();
1975 Ok(Expr::Value(self.parse_value()?))
1976 }
1977 Token::Number(_, _)
1978 | Token::SingleQuotedString(_)
1979 | Token::DoubleQuotedString(_)
1980 | Token::TripleSingleQuotedString(_)
1981 | Token::TripleDoubleQuotedString(_)
1982 | Token::DollarQuotedString(_)
1983 | Token::SingleQuotedByteStringLiteral(_)
1984 | Token::DoubleQuotedByteStringLiteral(_)
1985 | Token::TripleSingleQuotedByteStringLiteral(_)
1986 | Token::TripleDoubleQuotedByteStringLiteral(_)
1987 | Token::SingleQuotedRawStringLiteral(_)
1988 | Token::DoubleQuotedRawStringLiteral(_)
1989 | Token::TripleSingleQuotedRawStringLiteral(_)
1990 | Token::TripleDoubleQuotedRawStringLiteral(_)
1991 | Token::NationalStringLiteral(_)
1992 | Token::QuoteDelimitedStringLiteral(_)
1993 | Token::NationalQuoteDelimitedStringLiteral(_)
1994 | Token::HexStringLiteral(_) => {
1995 self.prev_token();
1996 Ok(Expr::Value(self.parse_value()?))
1997 }
1998 Token::LParen => {
1999 let expr =
2000 if let Some(expr) = self.try_parse_expr_sub_query()? {
2001 expr
2002 } else if let Some(lambda) = self.try_parse_lambda()? {
2003 return Ok(lambda);
2004 } else {
2005 let exprs = self.with_state(ParserState::Normal, |p| {
2016 p.parse_comma_separated(Parser::parse_expr)
2017 })?;
2018 match exprs.len() {
2019 0 => return Err(ParserError::ParserError(
2020 "Internal parser error: parse_comma_separated returned empty list"
2021 .to_string(),
2022 )),
2023 1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
2024 _ => Expr::Tuple(exprs),
2025 }
2026 };
2027 self.expect_token(&Token::RParen)?;
2028 Ok(expr)
2029 }
2030 Token::Placeholder(_) | Token::Colon | Token::AtSign => {
2031 self.prev_token();
2032 Ok(Expr::Value(self.parse_value()?))
2033 }
2034 Token::LBrace => {
2035 self.prev_token();
2036 self.parse_lbrace_expr()
2037 }
2038 _ => self.expected_at("an expression", next_token_index),
2039 }?;
2040
2041 Ok(expr)
2042 }
2043
2044 fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
2045 Ok(Expr::TypedString(TypedString {
2046 data_type: DataType::GeometricType(kind),
2047 value: self.parse_value()?,
2048 uses_odbc_syntax: false,
2049 }))
2050 }
2051
2052 pub fn parse_compound_expr(
2059 &mut self,
2060 root: Expr,
2061 mut chain: Vec<AccessExpr>,
2062 ) -> Result<Expr, ParserError> {
2063 let mut ending_wildcard: Option<TokenWithSpan> = None;
2064 loop {
2065 if self.consume_token(&Token::Period) {
2066 let next_token = self.peek_token_ref();
2067 match &next_token.token {
2068 Token::Mul => {
2069 if dialect_of!(self is PostgreSqlDialect) {
2072 ending_wildcard = Some(self.next_token());
2073 } else {
2074 self.prev_token(); }
2081
2082 break;
2083 }
2084 Token::SingleQuotedString(s) => {
2085 let expr =
2086 Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
2087 chain.push(AccessExpr::Dot(expr));
2088 self.advance_token(); }
2090 Token::Placeholder(s) => {
2091 let expr = Expr::Identifier(Ident::with_span(next_token.span, s));
2094 chain.push(AccessExpr::Dot(expr));
2095 self.advance_token(); }
2097 _ => {
2105 let word_field_no_lparen =
2113 matches!(self.peek_token_ref().token, Token::Word(_))
2114 && self.peek_nth_token_ref(1).token != Token::LParen;
2115
2116 let expr = if word_field_no_lparen {
2117 None
2118 } else {
2119 self.maybe_parse(|parser| {
2120 let expr = parser.parse_prefix()?;
2121 match &expr {
2122 Expr::CompoundFieldAccess { .. }
2123 | Expr::CompoundIdentifier(_)
2124 | Expr::Identifier(_)
2125 | Expr::Value(_)
2126 | Expr::Function(_) => Ok(expr),
2127 _ => parser.expected_ref(
2128 "an identifier or value",
2129 parser.peek_token_ref(),
2130 ),
2131 }
2132 })?
2133 };
2134
2135 match expr {
2136 Some(Expr::CompoundFieldAccess { root, access_chain }) => {
2145 chain.push(AccessExpr::Dot(*root));
2146 chain.extend(access_chain);
2147 }
2148 Some(Expr::CompoundIdentifier(parts)) => chain.extend(
2149 parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot),
2150 ),
2151 Some(expr) => {
2152 chain.push(AccessExpr::Dot(expr));
2153 }
2154 None => {
2158 chain.push(AccessExpr::Dot(Expr::Identifier(
2159 self.parse_identifier()?,
2160 )));
2161 }
2162 }
2163 }
2164 }
2165 } else if !self.dialect.supports_partiql()
2166 && self.peek_token_ref().token == Token::LBracket
2167 {
2168 self.parse_multi_dim_subscript(&mut chain)?;
2169 } else {
2170 break;
2171 }
2172 }
2173
2174 let tok_index = self.get_current_index();
2175 if let Some(wildcard_token) = ending_wildcard {
2176 if !Self::is_all_ident(&root, &chain) {
2177 return self
2178 .expected_ref("an identifier or a '*' after '.'", self.peek_token_ref());
2179 };
2180 Ok(Expr::QualifiedWildcard(
2181 ObjectName::from(Self::exprs_to_idents(root, chain)?),
2182 AttachedToken(wildcard_token),
2183 ))
2184 } else if self.maybe_parse_outer_join_operator() {
2185 if !Self::is_all_ident(&root, &chain) {
2186 return self.expected_at("column identifier before (+)", tok_index);
2187 };
2188 let expr = if chain.is_empty() {
2189 root
2190 } else {
2191 Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
2192 };
2193 Ok(Expr::OuterJoin(expr.into()))
2194 } else {
2195 Self::build_compound_expr(root, chain)
2196 }
2197 }
2198
2199 fn build_compound_expr(
2204 root: Expr,
2205 mut access_chain: Vec<AccessExpr>,
2206 ) -> Result<Expr, ParserError> {
2207 if access_chain.is_empty() {
2208 return Ok(root);
2209 }
2210
2211 if Self::is_all_ident(&root, &access_chain) {
2212 return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
2213 root,
2214 access_chain,
2215 )?));
2216 }
2217
2218 if matches!(root, Expr::Identifier(_))
2223 && matches!(
2224 access_chain.last(),
2225 Some(AccessExpr::Dot(Expr::Function(_)))
2226 )
2227 && access_chain
2228 .iter()
2229 .rev()
2230 .skip(1) .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
2232 {
2233 let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
2234 return parser_err!("expected function expression", root.span().start);
2235 };
2236
2237 let compound_func_name = [root]
2238 .into_iter()
2239 .chain(access_chain.into_iter().flat_map(|access| match access {
2240 AccessExpr::Dot(expr) => Some(expr),
2241 _ => None,
2242 }))
2243 .flat_map(|expr| match expr {
2244 Expr::Identifier(ident) => Some(ident),
2245 _ => None,
2246 })
2247 .map(ObjectNamePart::Identifier)
2248 .chain(func.name.0)
2249 .collect::<Vec<_>>();
2250 func.name = ObjectName(compound_func_name);
2251
2252 return Ok(Expr::Function(func));
2253 }
2254
2255 if access_chain.len() == 1
2260 && matches!(
2261 access_chain.last(),
2262 Some(AccessExpr::Dot(Expr::OuterJoin(_)))
2263 )
2264 {
2265 let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
2266 return parser_err!("expected (+) expression", root.span().start);
2267 };
2268
2269 if !Self::is_all_ident(&root, &[]) {
2270 return parser_err!("column identifier before (+)", root.span().start);
2271 };
2272
2273 let token_start = root.span().start;
2274 let mut idents = Self::exprs_to_idents(root, vec![])?;
2275 match *inner_expr {
2276 Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
2277 Expr::Identifier(suffix) => idents.push(suffix),
2278 _ => {
2279 return parser_err!("column identifier before (+)", token_start);
2280 }
2281 }
2282
2283 return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
2284 }
2285
2286 Ok(Expr::CompoundFieldAccess {
2287 root: Box::new(root),
2288 access_chain,
2289 })
2290 }
2291
2292 fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
2293 match k {
2294 Keyword::LOCAL => Some(ContextModifier::Local),
2295 Keyword::GLOBAL => Some(ContextModifier::Global),
2296 Keyword::SESSION => Some(ContextModifier::Session),
2297 _ => None,
2298 }
2299 }
2300
2301 fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
2303 if !matches!(root, Expr::Identifier(_)) {
2304 return false;
2305 }
2306 fields
2307 .iter()
2308 .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
2309 }
2310
2311 fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
2313 let mut idents = vec![];
2314 if let Expr::Identifier(root) = root {
2315 idents.push(root);
2316 for x in fields {
2317 if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
2318 idents.push(ident);
2319 } else {
2320 return parser_err!(
2321 format!("Expected identifier, found: {}", x),
2322 x.span().start
2323 );
2324 }
2325 }
2326 Ok(idents)
2327 } else {
2328 parser_err!(
2329 format!("Expected identifier, found: {}", root),
2330 root.span().start
2331 )
2332 }
2333 }
2334
2335 fn peek_outer_join_operator(&mut self) -> bool {
2337 if !self.dialect.supports_outer_join_operator() {
2338 return false;
2339 }
2340
2341 let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
2342 Token::LParen == maybe_lparen.token
2343 && Token::Plus == maybe_plus.token
2344 && Token::RParen == maybe_rparen.token
2345 }
2346
2347 fn maybe_parse_outer_join_operator(&mut self) -> bool {
2350 self.dialect.supports_outer_join_operator()
2351 && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
2352 }
2353
2354 pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
2356 self.expect_token(&Token::LParen)?;
2357 let options = self.parse_comma_separated(Self::parse_utility_option)?;
2358 self.expect_token(&Token::RParen)?;
2359
2360 Ok(options)
2361 }
2362
2363 fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
2364 let name = self.parse_identifier()?;
2365
2366 let next_token = self.peek_token_ref();
2367 if next_token == &Token::Comma || next_token == &Token::RParen {
2368 return Ok(UtilityOption { name, arg: None });
2369 }
2370 let arg = self.parse_expr()?;
2371
2372 Ok(UtilityOption {
2373 name,
2374 arg: Some(arg),
2375 })
2376 }
2377
2378 fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
2379 if !self.peek_sub_query() {
2380 return Ok(None);
2381 }
2382
2383 Ok(Some(Expr::Subquery(self.parse_query()?)))
2384 }
2385
2386 fn try_parse_lambda(&mut self) -> Result<Option<Expr>, ParserError> {
2387 if !self.dialect.supports_lambda_functions() {
2388 return Ok(None);
2389 }
2390 self.maybe_parse(|p| {
2391 let params = p.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2392 p.expect_token(&Token::RParen)?;
2393 p.expect_token(&Token::Arrow)?;
2394 let expr = p.parse_expr()?;
2395 Ok(Expr::Lambda(LambdaFunction {
2396 params: OneOrManyWithParens::Many(params),
2397 body: Box::new(expr),
2398 syntax: LambdaSyntax::Arrow,
2399 }))
2400 })
2401 }
2402
2403 fn parse_lambda_expr(&mut self) -> Result<Expr, ParserError> {
2413 let params = self.parse_lambda_function_parameters()?;
2415 self.expect_token(&Token::Colon)?;
2417 let body = self.parse_expr()?;
2419 Ok(Expr::Lambda(LambdaFunction {
2420 params,
2421 body: Box::new(body),
2422 syntax: LambdaSyntax::LambdaKeyword,
2423 }))
2424 }
2425
2426 fn parse_lambda_function_parameters(
2428 &mut self,
2429 ) -> Result<OneOrManyWithParens<LambdaFunctionParameter>, ParserError> {
2430 let params = if self.consume_token(&Token::LParen) {
2432 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2434 self.expect_token(&Token::RParen)?;
2435 OneOrManyWithParens::Many(params)
2436 } else {
2437 let params = self.parse_comma_separated(|p| p.parse_lambda_function_parameter())?;
2439 if params.len() == 1 {
2440 OneOrManyWithParens::One(params.into_iter().next().unwrap())
2441 } else {
2442 OneOrManyWithParens::Many(params)
2443 }
2444 };
2445 Ok(params)
2446 }
2447
2448 fn parse_lambda_function_parameter(&mut self) -> Result<LambdaFunctionParameter, ParserError> {
2450 let name = self.parse_identifier()?;
2451 let data_type = match &self.peek_token_ref().token {
2452 Token::Word(_) => self.maybe_parse(|p| p.parse_data_type())?,
2453 _ => None,
2454 };
2455 Ok(LambdaFunctionParameter { name, data_type })
2456 }
2457
2458 fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
2465 if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
2467 return Ok(Some(expr));
2468 }
2469 self.maybe_parse_odbc_body_datetime()
2471 }
2472
2473 fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
2484 self.maybe_parse(|p| {
2485 let token = p.next_token().clone();
2486 let word_string = token.token.to_string();
2487 let data_type = match word_string.as_str() {
2488 "t" => DataType::Time(None, TimezoneInfo::None),
2489 "d" => DataType::Date,
2490 "ts" => DataType::Timestamp(None, TimezoneInfo::None),
2491 _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
2492 };
2493 let value = p.parse_value()?;
2494 Ok(Expr::TypedString(TypedString {
2495 data_type,
2496 value,
2497 uses_odbc_syntax: true,
2498 }))
2499 })
2500 }
2501
2502 fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
2511 self.maybe_parse(|p| {
2512 p.expect_keyword(Keyword::FN)?;
2513 let fn_name = p.parse_object_name(false)?;
2514 let mut fn_call = p.parse_function_call(fn_name)?;
2515 fn_call.uses_odbc_syntax = true;
2516 Ok(Expr::Function(fn_call))
2517 })
2518 }
2519
2520 fn parse_xmlparse_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
2524 let arg = FunctionArg::Named {
2525 name: self.parse_identifier()?,
2526 arg: FunctionArgExpr::Expr(self.parse_expr()?),
2527 operator: FunctionArgOperator::Space,
2528 };
2529 self.expect_token(&Token::RParen)?;
2530 Ok(FunctionArgumentList {
2531 duplicate_treatment: None,
2532 args: vec![arg],
2533 clauses: vec![],
2534 })
2535 }
2536
2537 pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2539 self.parse_function_call(name).map(Expr::Function)
2540 }
2541
2542 fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
2543 self.expect_token(&Token::LParen)?;
2544
2545 if self.dialect.supports_subquery_as_function_arg() && self.peek_sub_query() {
2548 let subquery = self.parse_query()?;
2549 self.expect_token(&Token::RParen)?;
2550 return Ok(Function {
2551 name,
2552 uses_odbc_syntax: false,
2553 parameters: FunctionArguments::None,
2554 args: FunctionArguments::Subquery(subquery),
2555 filter: None,
2556 null_treatment: None,
2557 over: None,
2558 within_group: vec![],
2559 });
2560 }
2561
2562 let mut args = if self.dialect.supports_xml_expressions()
2563 && Self::is_simple_unquoted_object_name(&name, "xmlparse")
2564 {
2565 self.parse_xmlparse_argument_list()?
2566 } else {
2567 self.parse_function_argument_list()?
2568 };
2569 let mut parameters = FunctionArguments::None;
2570 if dialect_of!(self is ClickHouseDialect | GenericDialect)
2573 && self.consume_token(&Token::LParen)
2574 {
2575 parameters = FunctionArguments::List(args);
2576 args = self.parse_function_argument_list()?;
2577 }
2578
2579 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
2580 self.expect_token(&Token::LParen)?;
2581 self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
2582 let order_by = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2583 self.expect_token(&Token::RParen)?;
2584 order_by
2585 } else {
2586 vec![]
2587 };
2588
2589 let filter = if self.dialect.supports_filter_during_aggregation()
2590 && self.parse_keyword(Keyword::FILTER)
2591 && self.consume_token(&Token::LParen)
2592 && self.parse_keyword(Keyword::WHERE)
2593 {
2594 let filter = Some(Box::new(self.parse_expr()?));
2595 self.expect_token(&Token::RParen)?;
2596 filter
2597 } else {
2598 None
2599 };
2600
2601 let null_treatment = if args
2604 .clauses
2605 .iter()
2606 .all(|clause| !matches!(clause, FunctionArgumentClause::IgnoreOrRespectNulls(_)))
2607 {
2608 self.parse_null_treatment()?
2609 } else {
2610 None
2611 };
2612
2613 let over = if self.parse_keyword(Keyword::OVER) {
2614 if self.consume_token(&Token::LParen) {
2615 let window_spec = self.parse_window_spec()?;
2616 Some(WindowType::WindowSpec(window_spec))
2617 } else {
2618 Some(WindowType::NamedWindow(self.parse_identifier()?))
2619 }
2620 } else {
2621 None
2622 };
2623
2624 Ok(Function {
2625 name,
2626 uses_odbc_syntax: false,
2627 parameters,
2628 args: FunctionArguments::List(args),
2629 null_treatment,
2630 filter,
2631 over,
2632 within_group,
2633 })
2634 }
2635
2636 fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
2638 match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
2639 Some(keyword) => {
2640 self.expect_keyword_is(Keyword::NULLS)?;
2641
2642 Ok(match keyword {
2643 Keyword::RESPECT => Some(NullTreatment::RespectNulls),
2644 Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
2645 _ => None,
2646 })
2647 }
2648 None => Ok(None),
2649 }
2650 }
2651
2652 pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
2654 let args = if self.consume_token(&Token::LParen) {
2655 FunctionArguments::List(self.parse_function_argument_list()?)
2656 } else {
2657 FunctionArguments::None
2658 };
2659 Ok(Expr::Function(Function {
2660 name,
2661 uses_odbc_syntax: false,
2662 parameters: FunctionArguments::None,
2663 args,
2664 filter: None,
2665 over: None,
2666 null_treatment: None,
2667 within_group: vec![],
2668 }))
2669 }
2670
2671 pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
2673 let next_token = self.next_token();
2674 match &next_token.token {
2675 Token::Word(w) => match w.keyword {
2676 Keyword::ROWS => Ok(WindowFrameUnits::Rows),
2677 Keyword::RANGE => Ok(WindowFrameUnits::Range),
2678 Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
2679 _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
2680 },
2681 _ => self.expected("ROWS, RANGE, GROUPS", next_token),
2682 }
2683 }
2684
2685 pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
2687 let units = self.parse_window_frame_units()?;
2688 let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
2689 let start_bound = self.parse_window_frame_bound()?;
2690 self.expect_keyword_is(Keyword::AND)?;
2691 let end_bound = Some(self.parse_window_frame_bound()?);
2692 (start_bound, end_bound)
2693 } else {
2694 (self.parse_window_frame_bound()?, None)
2695 };
2696 Ok(WindowFrame {
2697 units,
2698 start_bound,
2699 end_bound,
2700 })
2701 }
2702
2703 pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
2705 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
2706 Ok(WindowFrameBound::CurrentRow)
2707 } else {
2708 let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
2709 None
2710 } else {
2711 Some(Box::new(match &self.peek_token_ref().token {
2712 Token::SingleQuotedString(_) => self.parse_interval()?,
2713 _ => self.parse_expr()?,
2714 }))
2715 };
2716 if self.parse_keyword(Keyword::PRECEDING) {
2717 Ok(WindowFrameBound::Preceding(rows))
2718 } else if self.parse_keyword(Keyword::FOLLOWING) {
2719 Ok(WindowFrameBound::Following(rows))
2720 } else {
2721 self.expected_ref("PRECEDING or FOLLOWING", self.peek_token_ref())
2722 }
2723 }
2724 }
2725
2726 fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
2728 if self.dialect.supports_group_by_expr() {
2729 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
2730 self.expect_token(&Token::LParen)?;
2731 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2732 self.expect_token(&Token::RParen)?;
2733 Ok(Expr::GroupingSets(result))
2734 } else if self.parse_keyword(Keyword::CUBE) {
2735 self.expect_token(&Token::LParen)?;
2736 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2737 self.expect_token(&Token::RParen)?;
2738 Ok(Expr::Cube(result))
2739 } else if self.parse_keyword(Keyword::ROLLUP) {
2740 self.expect_token(&Token::LParen)?;
2741 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
2742 self.expect_token(&Token::RParen)?;
2743 Ok(Expr::Rollup(result))
2744 } else if self.consume_tokens(&[Token::LParen, Token::RParen]) {
2745 Ok(Expr::Tuple(vec![]))
2749 } else {
2750 self.parse_expr()
2751 }
2752 } else {
2753 self.parse_expr()
2755 }
2756 }
2757
2758 fn parse_tuple(
2762 &mut self,
2763 lift_singleton: bool,
2764 allow_empty: bool,
2765 ) -> Result<Vec<Expr>, ParserError> {
2766 if lift_singleton {
2767 if self.consume_token(&Token::LParen) {
2768 let result = if allow_empty && self.consume_token(&Token::RParen) {
2769 vec![]
2770 } else {
2771 let result = self.parse_comma_separated(Parser::parse_expr)?;
2772 self.expect_token(&Token::RParen)?;
2773 result
2774 };
2775 Ok(result)
2776 } else {
2777 Ok(vec![self.parse_expr()?])
2778 }
2779 } else {
2780 self.expect_token(&Token::LParen)?;
2781 let result = if allow_empty && self.consume_token(&Token::RParen) {
2782 vec![]
2783 } else {
2784 let result = self.parse_comma_separated(Parser::parse_expr)?;
2785 self.expect_token(&Token::RParen)?;
2786 result
2787 };
2788 Ok(result)
2789 }
2790 }
2791
2792 pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
2794 let case_token = AttachedToken(self.get_current_token().clone());
2795 let mut operand = None;
2796 if !self.parse_keyword(Keyword::WHEN) {
2797 operand = Some(Box::new(self.parse_expr()?));
2798 self.expect_keyword_is(Keyword::WHEN)?;
2799 }
2800 let mut conditions = vec![];
2801 loop {
2802 let condition = self.parse_expr()?;
2803 self.expect_keyword_is(Keyword::THEN)?;
2804 let result = self.parse_expr()?;
2805 conditions.push(CaseWhen { condition, result });
2806 if !self.parse_keyword(Keyword::WHEN) {
2807 break;
2808 }
2809 }
2810 let else_result = if self.parse_keyword(Keyword::ELSE) {
2811 Some(Box::new(self.parse_expr()?))
2812 } else {
2813 None
2814 };
2815 let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
2816 Ok(Expr::Case {
2817 case_token,
2818 end_token,
2819 operand,
2820 conditions,
2821 else_result,
2822 })
2823 }
2824
2825 pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
2827 if self.parse_keyword(Keyword::FORMAT) {
2828 let value = self.parse_value()?;
2829 match self.parse_optional_time_zone()? {
2830 Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
2831 None => Ok(Some(CastFormat::Value(value))),
2832 }
2833 } else {
2834 Ok(None)
2835 }
2836 }
2837
2838 pub fn parse_optional_time_zone(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
2840 if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
2841 self.parse_value().map(Some)
2842 } else {
2843 Ok(None)
2844 }
2845 }
2846
2847 fn parse_mssql_convert(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2849 self.expect_token(&Token::LParen)?;
2850 let data_type = self.parse_data_type()?;
2851 self.expect_token(&Token::Comma)?;
2852 let expr = self.parse_expr()?;
2853 let styles = if self.consume_token(&Token::Comma) {
2854 self.parse_comma_separated(Parser::parse_expr)?
2855 } else {
2856 Default::default()
2857 };
2858 self.expect_token(&Token::RParen)?;
2859 Ok(Expr::Convert {
2860 is_try,
2861 expr: Box::new(expr),
2862 data_type: Some(data_type),
2863 charset: None,
2864 target_before_value: true,
2865 styles,
2866 })
2867 }
2868
2869 pub fn parse_convert_expr(&mut self, is_try: bool) -> Result<Expr, ParserError> {
2874 if self.dialect.convert_type_before_value() {
2875 return self.parse_mssql_convert(is_try);
2876 }
2877 self.expect_token(&Token::LParen)?;
2878 let expr = self.parse_expr()?;
2879 if self.parse_keyword(Keyword::USING) {
2880 let charset = self.parse_object_name(false)?;
2881 self.expect_token(&Token::RParen)?;
2882 return Ok(Expr::Convert {
2883 is_try,
2884 expr: Box::new(expr),
2885 data_type: None,
2886 charset: Some(charset),
2887 target_before_value: false,
2888 styles: vec![],
2889 });
2890 }
2891 self.expect_token(&Token::Comma)?;
2892 let data_type = self.parse_data_type()?;
2893 let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
2894 Some(self.parse_object_name(false)?)
2895 } else {
2896 None
2897 };
2898 self.expect_token(&Token::RParen)?;
2899 Ok(Expr::Convert {
2900 is_try,
2901 expr: Box::new(expr),
2902 data_type: Some(data_type),
2903 charset,
2904 target_before_value: false,
2905 styles: vec![],
2906 })
2907 }
2908
2909 pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
2911 self.expect_token(&Token::LParen)?;
2912 let expr = self.parse_expr()?;
2913 self.expect_keyword_is(Keyword::AS)?;
2914 let data_type = self.parse_data_type()?;
2915 let format = self.parse_optional_cast_format()?;
2916 self.expect_token(&Token::RParen)?;
2917 Ok(Expr::Cast {
2918 kind,
2919 expr: Box::new(expr),
2920 data_type,
2921 format,
2922 })
2923 }
2924
2925 pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
2927 self.expect_token(&Token::LParen)?;
2928 let exists_node = Expr::Exists {
2929 negated,
2930 subquery: self.parse_query()?,
2931 };
2932 self.expect_token(&Token::RParen)?;
2933 Ok(exists_node)
2934 }
2935
2936 pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
2938 self.expect_token(&Token::LParen)?;
2939 let field = self.parse_date_time_field()?;
2940
2941 let syntax = if self.parse_keyword(Keyword::FROM) {
2942 ExtractSyntax::From
2943 } else if self.dialect.supports_extract_comma_syntax() && self.consume_token(&Token::Comma)
2944 {
2945 ExtractSyntax::Comma
2946 } else {
2947 return Err(ParserError::ParserError(
2948 "Expected 'FROM' or ','".to_string(),
2949 ));
2950 };
2951
2952 let expr = self.parse_expr()?;
2953 self.expect_token(&Token::RParen)?;
2954 Ok(Expr::Extract {
2955 field,
2956 expr: Box::new(expr),
2957 syntax,
2958 })
2959 }
2960
2961 pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
2963 self.expect_token(&Token::LParen)?;
2964 let expr = self.parse_expr()?;
2965 let field = if self.parse_keyword(Keyword::TO) {
2967 CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
2969 } else if self.consume_token(&Token::Comma) {
2970 let v = self.parse_value()?;
2972 if matches!(v.value, Value::Number(_, _)) {
2973 CeilFloorKind::Scale(v)
2974 } else {
2975 return Err(ParserError::ParserError(
2976 "Scale field can only be of number type".to_string(),
2977 ));
2978 }
2979 } else {
2980 CeilFloorKind::DateTimeField(DateTimeField::NoDateTime)
2981 };
2982 self.expect_token(&Token::RParen)?;
2983 if is_ceil {
2984 Ok(Expr::Ceil {
2985 expr: Box::new(expr),
2986 field,
2987 })
2988 } else {
2989 Ok(Expr::Floor {
2990 expr: Box::new(expr),
2991 field,
2992 })
2993 }
2994 }
2995
2996 pub fn parse_position_expr(&mut self, ident: Ident) -> Result<Expr, ParserError> {
2998 let between_prec = self.dialect.prec_value(Precedence::Between);
2999 let position_expr = self.maybe_parse(|p| {
3000 p.expect_token(&Token::LParen)?;
3002
3003 let expr = p.parse_subexpr(between_prec)?;
3005 p.expect_keyword_is(Keyword::IN)?;
3006 let from = p.parse_expr()?;
3007 p.expect_token(&Token::RParen)?;
3008 Ok(Expr::Position {
3009 expr: Box::new(expr),
3010 r#in: Box::new(from),
3011 })
3012 })?;
3013 match position_expr {
3014 Some(expr) => Ok(expr),
3015 None => self.parse_function(ObjectName::from(vec![ident])),
3018 }
3019 }
3020
3021 pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
3023 let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
3024 Keyword::SUBSTR => true,
3025 Keyword::SUBSTRING => false,
3026 _ => {
3027 self.prev_token();
3028 return self.expected_ref("SUBSTR or SUBSTRING", self.peek_token_ref());
3029 }
3030 };
3031 self.expect_token(&Token::LParen)?;
3032 let expr = self.parse_expr()?;
3033 let mut from_expr = None;
3034 let special = self.consume_token(&Token::Comma);
3035 if special || self.parse_keyword(Keyword::FROM) {
3036 from_expr = Some(self.parse_expr()?);
3037 }
3038
3039 let mut to_expr = None;
3040 if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
3041 to_expr = Some(self.parse_expr()?);
3042 }
3043 self.expect_token(&Token::RParen)?;
3044
3045 Ok(Expr::Substring {
3046 expr: Box::new(expr),
3047 substring_from: from_expr.map(Box::new),
3048 substring_for: to_expr.map(Box::new),
3049 special,
3050 shorthand,
3051 })
3052 }
3053
3054 pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
3058 self.expect_token(&Token::LParen)?;
3060 let expr = self.parse_expr()?;
3061 self.expect_keyword_is(Keyword::PLACING)?;
3062 let what_expr = self.parse_expr()?;
3063 self.expect_keyword_is(Keyword::FROM)?;
3064 let from_expr = self.parse_expr()?;
3065 let mut for_expr = None;
3066 if self.parse_keyword(Keyword::FOR) {
3067 for_expr = Some(self.parse_expr()?);
3068 }
3069 self.expect_token(&Token::RParen)?;
3070
3071 Ok(Expr::Overlay {
3072 expr: Box::new(expr),
3073 overlay_what: Box::new(what_expr),
3074 overlay_from: Box::new(from_expr),
3075 overlay_for: for_expr.map(Box::new),
3076 })
3077 }
3078
3079 pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
3085 self.expect_token(&Token::LParen)?;
3086 let mut trim_where = None;
3087 if let Token::Word(word) = &self.peek_token_ref().token {
3088 if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
3089 trim_where = Some(self.parse_trim_where()?);
3090 }
3091 }
3092 let expr = self.parse_expr()?;
3093 if self.parse_keyword(Keyword::FROM) {
3094 let trim_what = Box::new(expr);
3095 let expr = self.parse_expr()?;
3096 self.expect_token(&Token::RParen)?;
3097 Ok(Expr::Trim {
3098 expr: Box::new(expr),
3099 trim_where,
3100 trim_what: Some(trim_what),
3101 trim_characters: None,
3102 })
3103 } else if self.dialect.supports_comma_separated_trim() && self.consume_token(&Token::Comma)
3104 {
3105 let characters = self.parse_comma_separated(Parser::parse_expr)?;
3106 self.expect_token(&Token::RParen)?;
3107 Ok(Expr::Trim {
3108 expr: Box::new(expr),
3109 trim_where: None,
3110 trim_what: None,
3111 trim_characters: Some(characters),
3112 })
3113 } else {
3114 self.expect_token(&Token::RParen)?;
3115 Ok(Expr::Trim {
3116 expr: Box::new(expr),
3117 trim_where,
3118 trim_what: None,
3119 trim_characters: None,
3120 })
3121 }
3122 }
3123
3124 pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
3128 let next_token = self.next_token();
3129 match &next_token.token {
3130 Token::Word(w) => match w.keyword {
3131 Keyword::BOTH => Ok(TrimWhereField::Both),
3132 Keyword::LEADING => Ok(TrimWhereField::Leading),
3133 Keyword::TRAILING => Ok(TrimWhereField::Trailing),
3134 _ => self.expected("trim_where field", next_token)?,
3135 },
3136 _ => self.expected("trim_where field", next_token),
3137 }
3138 }
3139
3140 pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
3143 let exprs = self.parse_comma_separated0(Parser::parse_expr, Token::RBracket)?;
3144 self.expect_token(&Token::RBracket)?;
3145 Ok(Expr::Array(Array { elem: exprs, named }))
3146 }
3147
3148 pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
3152 if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
3153 if self.parse_keyword(Keyword::ERROR) {
3154 Ok(Some(ListAggOnOverflow::Error))
3155 } else {
3156 self.expect_keyword_is(Keyword::TRUNCATE)?;
3157 let filler = match &self.peek_token_ref().token {
3158 Token::Word(w)
3159 if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
3160 {
3161 None
3162 }
3163 Token::SingleQuotedString(_)
3164 | Token::EscapedStringLiteral(_)
3165 | Token::UnicodeStringLiteral(_)
3166 | Token::NationalStringLiteral(_)
3167 | Token::QuoteDelimitedStringLiteral(_)
3168 | Token::NationalQuoteDelimitedStringLiteral(_)
3169 | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
3170 _ => self.expected_ref(
3171 "either filler, WITH, or WITHOUT in LISTAGG",
3172 self.peek_token_ref(),
3173 )?,
3174 };
3175 let with_count = self.parse_keyword(Keyword::WITH);
3176 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
3177 self.expected_ref("either WITH or WITHOUT in LISTAGG", self.peek_token_ref())?;
3178 }
3179 self.expect_keyword_is(Keyword::COUNT)?;
3180 Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
3181 }
3182 } else {
3183 Ok(None)
3184 }
3185 }
3186
3187 pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
3194 let next_token = self.next_token();
3195 match &next_token.token {
3196 Token::Word(w) => match w.keyword {
3197 Keyword::YEAR => Ok(DateTimeField::Year),
3198 Keyword::YEARS => Ok(DateTimeField::Years),
3199 Keyword::MONTH => Ok(DateTimeField::Month),
3200 Keyword::MONTHS => Ok(DateTimeField::Months),
3201 Keyword::WEEK => {
3202 let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
3203 && self.consume_token(&Token::LParen)
3204 {
3205 let week_day = self.parse_identifier()?;
3206 self.expect_token(&Token::RParen)?;
3207 Some(week_day)
3208 } else {
3209 None
3210 };
3211 Ok(DateTimeField::Week(week_day))
3212 }
3213 Keyword::WEEKS => Ok(DateTimeField::Weeks),
3214 Keyword::DAY => Ok(DateTimeField::Day),
3215 Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
3216 Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
3217 Keyword::DAYS => Ok(DateTimeField::Days),
3218 Keyword::DATE => Ok(DateTimeField::Date),
3219 Keyword::DATETIME => Ok(DateTimeField::Datetime),
3220 Keyword::HOUR => Ok(DateTimeField::Hour),
3221 Keyword::HOURS => Ok(DateTimeField::Hours),
3222 Keyword::MINUTE => Ok(DateTimeField::Minute),
3223 Keyword::MINUTES => Ok(DateTimeField::Minutes),
3224 Keyword::SECOND => Ok(DateTimeField::Second),
3225 Keyword::SECONDS => Ok(DateTimeField::Seconds),
3226 Keyword::CENTURY => Ok(DateTimeField::Century),
3227 Keyword::DECADE => Ok(DateTimeField::Decade),
3228 Keyword::DOY => Ok(DateTimeField::Doy),
3229 Keyword::DOW => Ok(DateTimeField::Dow),
3230 Keyword::EPOCH => Ok(DateTimeField::Epoch),
3231 Keyword::ISODOW => Ok(DateTimeField::Isodow),
3232 Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
3233 Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
3234 Keyword::JULIAN => Ok(DateTimeField::Julian),
3235 Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
3236 Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
3237 Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
3238 Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
3239 Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
3240 Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
3241 Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
3242 Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
3243 Keyword::QUARTER => Ok(DateTimeField::Quarter),
3244 Keyword::TIME => Ok(DateTimeField::Time),
3245 Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
3246 Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
3247 Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
3248 Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
3249 Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
3250 _ if self.dialect.allow_extract_custom() => {
3251 self.prev_token();
3252 let custom = self.parse_identifier()?;
3253 Ok(DateTimeField::Custom(custom))
3254 }
3255 _ => self.expected("date/time field", next_token),
3256 },
3257 Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
3258 self.prev_token();
3259 let custom = self.parse_identifier()?;
3260 Ok(DateTimeField::Custom(custom))
3261 }
3262 _ => self.expected("date/time field", next_token),
3263 }
3264 }
3265
3266 pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
3270 match &self.peek_token_ref().token {
3271 Token::Word(w) => match w.keyword {
3272 Keyword::EXISTS => {
3273 let negated = true;
3274 let _ = self.parse_keyword(Keyword::EXISTS);
3275 self.parse_exists_expr(negated)
3276 }
3277 _ => Ok(Expr::UnaryOp {
3278 op: UnaryOperator::Not,
3279 expr: Box::new(
3280 self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
3281 ),
3282 }),
3283 },
3284 _ => Ok(Expr::UnaryOp {
3285 op: UnaryOperator::Not,
3286 expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
3287 }),
3288 }
3289 }
3290
3291 fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
3301 let token = self.expect_token(&Token::LBrace)?;
3302
3303 if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
3304 self.expect_token(&Token::RBrace)?;
3305 return Ok(fn_expr);
3306 }
3307
3308 if self.dialect.supports_dictionary_syntax() {
3309 self.prev_token(); return self.parse_dictionary();
3311 }
3312
3313 self.expected("an expression", token)
3314 }
3315
3316 pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
3322 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
3323
3324 self.expect_keyword_is(Keyword::AGAINST)?;
3325
3326 self.expect_token(&Token::LParen)?;
3327
3328 let match_value = self.parse_value()?;
3330
3331 let in_natural_language_mode_keywords = &[
3332 Keyword::IN,
3333 Keyword::NATURAL,
3334 Keyword::LANGUAGE,
3335 Keyword::MODE,
3336 ];
3337
3338 let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
3339
3340 let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
3341
3342 let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
3343 if self.parse_keywords(with_query_expansion_keywords) {
3344 Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
3345 } else {
3346 Some(SearchModifier::InNaturalLanguageMode)
3347 }
3348 } else if self.parse_keywords(in_boolean_mode_keywords) {
3349 Some(SearchModifier::InBooleanMode)
3350 } else if self.parse_keywords(with_query_expansion_keywords) {
3351 Some(SearchModifier::WithQueryExpansion)
3352 } else {
3353 None
3354 };
3355
3356 self.expect_token(&Token::RParen)?;
3357
3358 Ok(Expr::MatchAgainst {
3359 columns,
3360 match_value,
3361 opt_search_modifier,
3362 })
3363 }
3364
3365 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
3381 pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
3382 let _guard = self.recursion_counter.try_decrease()?;
3383
3384 let value = if self.dialect.require_interval_qualifier() {
3393 self.parse_expr()?
3395 } else {
3396 self.parse_prefix()?
3399 };
3400
3401 let leading_field = if self.next_token_is_temporal_unit() {
3407 Some(self.parse_date_time_field()?)
3408 } else if self.dialect.require_interval_qualifier() {
3409 return parser_err!(
3410 "INTERVAL requires a unit after the literal value",
3411 self.peek_token_ref().span.start
3412 );
3413 } else {
3414 None
3415 };
3416
3417 let (leading_precision, last_field, fsec_precision) =
3418 if leading_field == Some(DateTimeField::Second) {
3419 let last_field = None;
3425 let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
3426 (leading_precision, last_field, fsec_precision)
3427 } else {
3428 let leading_precision = self.parse_optional_precision()?;
3429 if self.parse_keyword(Keyword::TO) {
3430 let last_field = Some(self.parse_date_time_field()?);
3431 let fsec_precision = if last_field == Some(DateTimeField::Second) {
3432 self.parse_optional_precision()?
3433 } else {
3434 None
3435 };
3436 (leading_precision, last_field, fsec_precision)
3437 } else {
3438 (leading_precision, None, None)
3439 }
3440 };
3441
3442 Ok(Expr::Interval(Interval {
3443 value: Box::new(value),
3444 leading_field,
3445 leading_precision,
3446 last_field,
3447 fractional_seconds_precision: fsec_precision,
3448 }))
3449 }
3450
3451 pub fn next_token_is_temporal_unit(&mut self) -> bool {
3454 if let Token::Word(word) = &self.peek_token_ref().token {
3455 matches!(
3456 word.keyword,
3457 Keyword::YEAR
3458 | Keyword::YEARS
3459 | Keyword::MONTH
3460 | Keyword::MONTHS
3461 | Keyword::WEEK
3462 | Keyword::WEEKS
3463 | Keyword::DAY
3464 | Keyword::DAYS
3465 | Keyword::HOUR
3466 | Keyword::HOURS
3467 | Keyword::MINUTE
3468 | Keyword::MINUTES
3469 | Keyword::SECOND
3470 | Keyword::SECONDS
3471 | Keyword::CENTURY
3472 | Keyword::DECADE
3473 | Keyword::DOW
3474 | Keyword::DOY
3475 | Keyword::EPOCH
3476 | Keyword::ISODOW
3477 | Keyword::ISOYEAR
3478 | Keyword::JULIAN
3479 | Keyword::MICROSECOND
3480 | Keyword::MICROSECONDS
3481 | Keyword::MILLENIUM
3482 | Keyword::MILLENNIUM
3483 | Keyword::MILLISECOND
3484 | Keyword::MILLISECONDS
3485 | Keyword::NANOSECOND
3486 | Keyword::NANOSECONDS
3487 | Keyword::QUARTER
3488 | Keyword::TIMEZONE
3489 | Keyword::TIMEZONE_HOUR
3490 | Keyword::TIMEZONE_MINUTE
3491 )
3492 } else {
3493 false
3494 }
3495 }
3496
3497 fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
3505 self.prev_token();
3507 let (fields, trailing_bracket) =
3508 self.parse_struct_type_def(Self::parse_struct_field_def)?;
3509 if trailing_bracket.0 {
3510 return parser_err!(
3511 "unmatched > in STRUCT literal",
3512 self.peek_token_ref().span.start
3513 );
3514 }
3515
3516 self.expect_token(&Token::LParen)?;
3518 let values = self
3519 .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
3520 self.expect_token(&Token::RParen)?;
3521
3522 Ok(Expr::Struct { values, fields })
3523 }
3524
3525 fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
3539 let expr = self.parse_expr()?;
3540 if self.parse_keyword(Keyword::AS) {
3541 if typed_syntax {
3542 return parser_err!("Typed syntax does not allow AS", {
3543 self.prev_token();
3544 self.peek_token_ref().span.start
3545 });
3546 }
3547 let field_name = self.parse_identifier()?;
3548 Ok(Expr::Named {
3549 expr: expr.into(),
3550 name: field_name,
3551 })
3552 } else {
3553 Ok(expr)
3554 }
3555 }
3556
3557 fn parse_struct_type_def<F>(
3570 &mut self,
3571 mut elem_parser: F,
3572 ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
3573 where
3574 F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
3575 {
3576 self.expect_keyword_is(Keyword::STRUCT)?;
3577
3578 if self.peek_token_ref().token != Token::Lt {
3580 return Ok((Default::default(), false.into()));
3581 }
3582 self.next_token();
3583
3584 let mut field_defs = vec![];
3585 let trailing_bracket = loop {
3586 let (def, trailing_bracket) = elem_parser(self)?;
3587 field_defs.push(def);
3588 if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
3590 break trailing_bracket;
3591 }
3592 };
3593
3594 Ok((
3595 field_defs,
3596 self.expect_closing_angle_bracket(trailing_bracket)?,
3597 ))
3598 }
3599
3600 fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3602 self.expect_keyword_is(Keyword::STRUCT)?;
3603 self.expect_token(&Token::LParen)?;
3604 let struct_body = self.parse_comma_separated(|parser| {
3605 let field_name = parser.parse_identifier()?;
3606 let field_type = parser.parse_data_type()?;
3607
3608 Ok(StructField {
3609 field_name: Some(field_name),
3610 field_type,
3611 options: None,
3612 })
3613 });
3614 self.expect_token(&Token::RParen)?;
3615 struct_body
3616 }
3617
3618 fn parse_struct_field_def(
3630 &mut self,
3631 ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
3632 let is_named_field = matches!(
3635 (self.peek_nth_token(0).token, self.peek_nth_token(1).token),
3636 (Token::Word(_), Token::Word(_)) | (Token::Word(_), Token::Colon)
3637 );
3638
3639 let field_name = if is_named_field {
3640 let name = self.parse_identifier()?;
3641 let _ = self.consume_token(&Token::Colon);
3642 Some(name)
3643 } else {
3644 None
3645 };
3646
3647 let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
3648
3649 let options = self.maybe_parse_options(Keyword::OPTIONS)?;
3650 Ok((
3651 StructField {
3652 field_name,
3653 field_type,
3654 options,
3655 },
3656 trailing_bracket,
3657 ))
3658 }
3659
3660 fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
3670 self.expect_keyword_is(Keyword::UNION)?;
3671
3672 self.expect_token(&Token::LParen)?;
3673
3674 let fields = self.parse_comma_separated(|p| {
3675 Ok(UnionField {
3676 field_name: p.parse_identifier()?,
3677 field_type: p.parse_data_type()?,
3678 })
3679 })?;
3680
3681 self.expect_token(&Token::RParen)?;
3682
3683 Ok(fields)
3684 }
3685
3686 fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
3697 self.expect_token(&Token::LBrace)?;
3698
3699 let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
3700
3701 self.expect_token(&Token::RBrace)?;
3702
3703 Ok(Expr::Dictionary(fields))
3704 }
3705
3706 fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
3717 let key = self.parse_identifier()?;
3718
3719 self.expect_token(&Token::Colon)?;
3720
3721 let expr = self.parse_expr()?;
3722
3723 Ok(DictionaryField {
3724 key,
3725 value: Box::new(expr),
3726 })
3727 }
3728
3729 fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
3739 self.expect_token(&Token::LBrace)?;
3740 let fields = self.parse_comma_separated0(Self::parse_duckdb_map_field, Token::RBrace)?;
3741 self.expect_token(&Token::RBrace)?;
3742 Ok(Expr::Map(Map { entries: fields }))
3743 }
3744
3745 fn parse_duckdb_map_field(&mut self) -> Result<MapEntry, ParserError> {
3755 let key = self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?;
3757
3758 self.expect_token(&Token::Colon)?;
3759
3760 let value = self.parse_expr()?;
3761
3762 Ok(MapEntry {
3763 key: Box::new(key),
3764 value: Box::new(value),
3765 })
3766 }
3767
3768 fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
3778 self.expect_keyword_is(Keyword::MAP)?;
3779 self.expect_token(&Token::LParen)?;
3780 let key_data_type = self.parse_data_type()?;
3781 self.expect_token(&Token::Comma)?;
3782 let value_data_type = self.parse_data_type()?;
3783 self.expect_token(&Token::RParen)?;
3784
3785 Ok((key_data_type, value_data_type))
3786 }
3787
3788 fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
3798 self.expect_keyword_is(Keyword::TUPLE)?;
3799 self.expect_token(&Token::LParen)?;
3800 let mut field_defs = vec![];
3801 loop {
3802 let (def, _) = self.parse_struct_field_def()?;
3803 field_defs.push(def);
3804 if !self.consume_token(&Token::Comma) {
3805 break;
3806 }
3807 }
3808 self.expect_token(&Token::RParen)?;
3809
3810 Ok(field_defs)
3811 }
3812
3813 fn expect_closing_angle_bracket(
3818 &mut self,
3819 trailing_bracket: MatchedTrailingBracket,
3820 ) -> Result<MatchedTrailingBracket, ParserError> {
3821 let trailing_bracket = if !trailing_bracket.0 {
3822 match &self.peek_token_ref().token {
3823 Token::Gt => {
3824 self.next_token();
3825 false.into()
3826 }
3827 Token::ShiftRight => {
3828 self.next_token();
3829 true.into()
3830 }
3831 _ => return self.expected_ref(">", self.peek_token_ref()),
3832 }
3833 } else {
3834 false.into()
3835 };
3836
3837 Ok(trailing_bracket)
3838 }
3839
3840 pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
3842 if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
3844 return infix;
3845 }
3846
3847 let dialect = self.dialect;
3848
3849 self.advance_token();
3850 let tok = self.get_current_token();
3851 debug!("infix: {tok:?}");
3852 let tok_index = self.get_current_index();
3853 let span = tok.span;
3854 let regular_binary_operator = match &tok.token {
3855 Token::Spaceship => Some(BinaryOperator::Spaceship),
3856 Token::DoubleEq => Some(BinaryOperator::Eq),
3857 Token::Assignment => Some(BinaryOperator::Assignment),
3858 Token::Eq => Some(BinaryOperator::Eq),
3859 Token::Neq => Some(BinaryOperator::NotEq),
3860 Token::Gt => Some(BinaryOperator::Gt),
3861 Token::GtEq => Some(BinaryOperator::GtEq),
3862 Token::Lt => Some(BinaryOperator::Lt),
3863 Token::LtEq => Some(BinaryOperator::LtEq),
3864 Token::Plus => Some(BinaryOperator::Plus),
3865 Token::Minus => Some(BinaryOperator::Minus),
3866 Token::Mul => Some(BinaryOperator::Multiply),
3867 Token::Mod => Some(BinaryOperator::Modulo),
3868 Token::StringConcat => Some(BinaryOperator::StringConcat),
3869 Token::Pipe => Some(BinaryOperator::BitwiseOr),
3870 Token::Caret => {
3871 if dialect_is!(dialect is PostgreSqlDialect) {
3874 Some(BinaryOperator::PGExp)
3875 } else {
3876 Some(BinaryOperator::BitwiseXor)
3877 }
3878 }
3879 Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
3880 Token::Div => Some(BinaryOperator::Divide),
3881 Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
3882 Some(BinaryOperator::DuckIntegerDivide)
3883 }
3884 Token::ShiftLeft if dialect.supports_bitwise_shift_operators() => {
3885 Some(BinaryOperator::PGBitwiseShiftLeft)
3886 }
3887 Token::ShiftRight if dialect.supports_bitwise_shift_operators() => {
3888 Some(BinaryOperator::PGBitwiseShiftRight)
3889 }
3890 Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3891 Some(BinaryOperator::PGBitwiseXor)
3892 }
3893 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
3894 Some(BinaryOperator::PGOverlap)
3895 }
3896 Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3897 Some(BinaryOperator::PGOverlap)
3898 }
3899 Token::Overlap if dialect.supports_double_ampersand_operator() => {
3900 Some(BinaryOperator::And)
3901 }
3902 Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3903 Some(BinaryOperator::PGStartsWith)
3904 }
3905 Token::Tilde => Some(BinaryOperator::PGRegexMatch),
3906 Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
3907 Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
3908 Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
3909 Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
3910 Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
3911 Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
3912 Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
3913 Token::Arrow => Some(BinaryOperator::Arrow),
3914 Token::LongArrow => Some(BinaryOperator::LongArrow),
3915 Token::HashArrow => Some(BinaryOperator::HashArrow),
3916 Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
3917 Token::AtArrow => Some(BinaryOperator::AtArrow),
3918 Token::ArrowAt => Some(BinaryOperator::ArrowAt),
3919 Token::HashMinus => Some(BinaryOperator::HashMinus),
3920 Token::AtQuestion => Some(BinaryOperator::AtQuestion),
3921 Token::AtAt => Some(BinaryOperator::AtAt),
3922 Token::Question => Some(BinaryOperator::Question),
3923 Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
3924 Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
3925 Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
3926 Token::DoubleSharp if self.dialect.supports_geometric_types() => {
3927 Some(BinaryOperator::DoubleHash)
3928 }
3929
3930 Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
3931 Some(BinaryOperator::AndLt)
3932 }
3933 Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
3934 Some(BinaryOperator::AndGt)
3935 }
3936 Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
3937 Some(BinaryOperator::QuestionDash)
3938 }
3939 Token::AmpersandLeftAngleBracketVerticalBar
3940 if self.dialect.supports_geometric_types() =>
3941 {
3942 Some(BinaryOperator::AndLtPipe)
3943 }
3944 Token::VerticalBarAmpersandRightAngleBracket
3945 if self.dialect.supports_geometric_types() =>
3946 {
3947 Some(BinaryOperator::PipeAndGt)
3948 }
3949 Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
3950 Some(BinaryOperator::LtDashGt)
3951 }
3952 Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
3953 Some(BinaryOperator::LtCaret)
3954 }
3955 Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
3956 Some(BinaryOperator::GtCaret)
3957 }
3958 Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
3959 Some(BinaryOperator::QuestionHash)
3960 }
3961 Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
3962 Some(BinaryOperator::QuestionDoublePipe)
3963 }
3964 Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
3965 Some(BinaryOperator::QuestionDashPipe)
3966 }
3967 Token::TildeEqual if self.dialect.supports_geometric_types() => {
3968 Some(BinaryOperator::TildeEq)
3969 }
3970 Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
3971 Some(BinaryOperator::LtLtPipe)
3972 }
3973 Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
3974 Some(BinaryOperator::PipeGtGt)
3975 }
3976 Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
3977
3978 Token::Word(w) => match w.keyword {
3979 Keyword::AND => Some(BinaryOperator::And),
3980 Keyword::OR => Some(BinaryOperator::Or),
3981 Keyword::XOR => Some(BinaryOperator::Xor),
3982 Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
3983 Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
3984 Some(BinaryOperator::PGCustomBinaryOperator(
3989 self.parse_pg_operator_ident_parts()?,
3990 ))
3991 }
3992 _ => None,
3993 },
3994 _ => None,
3995 };
3996
3997 let tok = self.token_at(tok_index);
3998 if let Some(op) = regular_binary_operator {
3999 if let Some(keyword) =
4000 self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
4001 {
4002 self.expect_token(&Token::LParen)?;
4003 let right = if self.peek_sub_query() {
4004 self.prev_token(); self.parse_subexpr(precedence)?
4008 } else {
4009 let right = self.parse_subexpr(precedence)?;
4011 self.expect_token(&Token::RParen)?;
4012 right
4013 };
4014
4015 if !matches!(
4016 op,
4017 BinaryOperator::Gt
4018 | BinaryOperator::Lt
4019 | BinaryOperator::GtEq
4020 | BinaryOperator::LtEq
4021 | BinaryOperator::Eq
4022 | BinaryOperator::NotEq
4023 | BinaryOperator::PGRegexMatch
4024 | BinaryOperator::PGRegexIMatch
4025 | BinaryOperator::PGRegexNotMatch
4026 | BinaryOperator::PGRegexNotIMatch
4027 | BinaryOperator::PGLikeMatch
4028 | BinaryOperator::PGILikeMatch
4029 | BinaryOperator::PGNotLikeMatch
4030 | BinaryOperator::PGNotILikeMatch
4031 ) {
4032 return parser_err!(
4033 format!(
4034 "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
4035 ),
4036 span.start
4037 );
4038 };
4039
4040 Ok(match keyword {
4041 Keyword::ALL => Expr::AllOp {
4042 left: Box::new(expr),
4043 compare_op: op,
4044 right: Box::new(right),
4045 },
4046 Keyword::ANY | Keyword::SOME => Expr::AnyOp {
4047 left: Box::new(expr),
4048 compare_op: op,
4049 right: Box::new(right),
4050 is_some: keyword == Keyword::SOME,
4051 },
4052 unexpected_keyword => return Err(ParserError::ParserError(
4053 format!("Internal parser error: expected any of {{ALL, ANY, SOME}}, got {unexpected_keyword:?}"),
4054 )),
4055 })
4056 } else {
4057 Ok(Expr::BinaryOp {
4058 left: Box::new(expr),
4059 op,
4060 right: Box::new(self.parse_subexpr(precedence)?),
4061 })
4062 }
4063 } else if let Token::Word(w) = &tok.token {
4064 match w.keyword {
4065 Keyword::IS => {
4066 if self.parse_keyword(Keyword::NULL) {
4067 Ok(Expr::IsNull(Box::new(expr)))
4068 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
4069 Ok(Expr::IsNotNull(Box::new(expr)))
4070 } else if self.parse_keywords(&[Keyword::TRUE]) {
4071 Ok(Expr::IsTrue(Box::new(expr)))
4072 } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
4073 Ok(Expr::IsNotTrue(Box::new(expr)))
4074 } else if self.parse_keywords(&[Keyword::FALSE]) {
4075 Ok(Expr::IsFalse(Box::new(expr)))
4076 } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
4077 Ok(Expr::IsNotFalse(Box::new(expr)))
4078 } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
4079 Ok(Expr::IsUnknown(Box::new(expr)))
4080 } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
4081 Ok(Expr::IsNotUnknown(Box::new(expr)))
4082 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
4083 let expr2 = self.parse_subexpr(precedence)?;
4087 Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
4088 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
4089 {
4090 let expr2 = self.parse_subexpr(precedence)?;
4091 Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
4092 } else if self.parse_keyword(Keyword::JSON) {
4093 self.parse_is_json_predicate(expr, false)
4094 } else if self.parse_keywords(&[Keyword::NOT, Keyword::JSON]) {
4095 self.parse_is_json_predicate(expr, true)
4096 } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
4097 Ok(is_normalized)
4098 } else {
4099 self.expected_ref(
4100 "[NOT] NULL | TRUE | FALSE | DISTINCT | [NOT] JSON [VALUE | SCALAR | ARRAY | OBJECT] [WITH | WITHOUT UNIQUE [KEYS]] | [form] NORMALIZED FROM after IS",
4101 self.peek_token_ref(),
4102 )
4103 }
4104 }
4105 Keyword::AT => {
4106 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
4107 Ok(Expr::AtTimeZone {
4108 timestamp: Box::new(expr),
4109 time_zone: Box::new(self.parse_subexpr(precedence)?),
4110 })
4111 }
4112 Keyword::NOT
4113 | Keyword::IN
4114 | Keyword::BETWEEN
4115 | Keyword::LIKE
4116 | Keyword::ILIKE
4117 | Keyword::SIMILAR
4118 | Keyword::REGEXP
4119 | Keyword::RLIKE => {
4120 self.prev_token();
4121 let negated = self.parse_keyword(Keyword::NOT);
4122 let regexp = self.parse_keyword(Keyword::REGEXP);
4123 let rlike = self.parse_keyword(Keyword::RLIKE);
4124 let null = if !self.in_column_definition_state() {
4125 self.parse_keyword(Keyword::NULL)
4126 } else {
4127 false
4128 };
4129 if regexp || rlike {
4130 Ok(Expr::RLike {
4131 negated,
4132 expr: Box::new(expr),
4133 pattern: Box::new(
4134 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4135 ),
4136 regexp,
4137 })
4138 } else if negated && null {
4139 Ok(Expr::IsNotNull(Box::new(expr)))
4140 } else if self.parse_keyword(Keyword::IN) {
4141 self.parse_in(expr, negated)
4142 } else if self.parse_keyword(Keyword::BETWEEN) {
4143 self.parse_between(expr, negated)
4144 } else if self.parse_keyword(Keyword::LIKE) {
4145 Ok(Expr::Like {
4146 negated,
4147 any: self.parse_keyword(Keyword::ANY),
4148 expr: Box::new(expr),
4149 pattern: Box::new(
4150 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4151 ),
4152 escape_char: self.parse_escape_char()?,
4153 })
4154 } else if self.parse_keyword(Keyword::ILIKE) {
4155 Ok(Expr::ILike {
4156 negated,
4157 any: self.parse_keyword(Keyword::ANY),
4158 expr: Box::new(expr),
4159 pattern: Box::new(
4160 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4161 ),
4162 escape_char: self.parse_escape_char()?,
4163 })
4164 } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
4165 Ok(Expr::SimilarTo {
4166 negated,
4167 expr: Box::new(expr),
4168 pattern: Box::new(
4169 self.parse_subexpr(self.dialect.prec_value(Precedence::Like))?,
4170 ),
4171 escape_char: self.parse_escape_char()?,
4172 })
4173 } else {
4174 self.expected_ref("IN or BETWEEN after NOT", self.peek_token_ref())
4175 }
4176 }
4177 Keyword::NOTNULL if dialect.supports_notnull_operator() => {
4178 Ok(Expr::IsNotNull(Box::new(expr)))
4179 }
4180 Keyword::MEMBER => {
4181 if self.parse_keyword(Keyword::OF) {
4182 self.expect_token(&Token::LParen)?;
4183 let array = self.parse_expr()?;
4184 self.expect_token(&Token::RParen)?;
4185 Ok(Expr::MemberOf(MemberOf {
4186 value: Box::new(expr),
4187 array: Box::new(array),
4188 }))
4189 } else {
4190 self.expected_ref("OF after MEMBER", self.peek_token_ref())
4191 }
4192 }
4193 _ => parser_err!(
4195 format!("No infix parser for token {:?}", tok.token),
4196 tok.span.start
4197 ),
4198 }
4199 } else if Token::DoubleColon == *tok {
4200 Ok(Expr::Cast {
4201 kind: CastKind::DoubleColon,
4202 expr: Box::new(expr),
4203 data_type: self.parse_data_type()?,
4204 format: None,
4205 })
4206 } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
4207 Ok(Expr::UnaryOp {
4208 op: UnaryOperator::PGPostfixFactorial,
4209 expr: Box::new(expr),
4210 })
4211 } else if Token::LBracket == *tok && self.dialect.supports_partiql()
4212 || (Token::Colon == *tok)
4213 {
4214 self.prev_token();
4215 self.parse_json_access(expr)
4216 } else {
4217 parser_err!(
4219 format!("No infix parser for token {:?}", tok.token),
4220 tok.span.start
4221 )
4222 }
4223 }
4224
4225 pub fn parse_escape_char(&mut self) -> Result<Option<Box<Expr>>, ParserError> {
4227 if self.parse_keyword(Keyword::ESCAPE) {
4228 Ok(Some(Box::new(self.parse_subexpr(
4229 self.dialect.prec_value(Precedence::Like),
4230 )?)))
4231 } else {
4232 Ok(None)
4233 }
4234 }
4235
4236 fn parse_subscript_inner(&mut self) -> Result<Subscript, ParserError> {
4246 let lower_bound = if self.consume_token(&Token::Colon) {
4248 None
4249 } else {
4250 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4252 };
4253
4254 if self.consume_token(&Token::RBracket) {
4256 if let Some(lower_bound) = lower_bound {
4257 return Ok(Subscript::Index { index: lower_bound });
4258 };
4259 return Ok(Subscript::Slice {
4260 lower_bound,
4261 upper_bound: None,
4262 stride: None,
4263 });
4264 }
4265
4266 if lower_bound.is_some() {
4268 self.expect_token(&Token::Colon)?;
4269 }
4270
4271 let upper_bound = if self.consume_token(&Token::RBracket) {
4273 return Ok(Subscript::Slice {
4274 lower_bound,
4275 upper_bound: None,
4276 stride: None,
4277 });
4278 } else {
4279 Some(self.parse_subexpr(self.dialect.prec_value(Precedence::Colon))?)
4281 };
4282
4283 if self.consume_token(&Token::RBracket) {
4285 return Ok(Subscript::Slice {
4286 lower_bound,
4287 upper_bound,
4288 stride: None,
4289 });
4290 }
4291
4292 self.expect_token(&Token::Colon)?;
4294 let stride = if self.consume_token(&Token::RBracket) {
4295 None
4296 } else {
4297 Some(self.parse_expr()?)
4298 };
4299
4300 if stride.is_some() {
4301 self.expect_token(&Token::RBracket)?;
4302 }
4303
4304 Ok(Subscript::Slice {
4305 lower_bound,
4306 upper_bound,
4307 stride,
4308 })
4309 }
4310
4311 pub fn parse_multi_dim_subscript(
4313 &mut self,
4314 chain: &mut Vec<AccessExpr>,
4315 ) -> Result<(), ParserError> {
4316 while self.consume_token(&Token::LBracket) {
4317 self.parse_subscript(chain)?;
4318 }
4319 Ok(())
4320 }
4321
4322 fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
4326 let subscript = self.parse_subscript_inner()?;
4327 chain.push(AccessExpr::Subscript(subscript));
4328 Ok(())
4329 }
4330
4331 fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
4332 let token = self.next_token();
4333 match token.token {
4334 Token::Word(Word {
4335 value,
4336 quote_style: quote_style @ (Some('"') | Some('`') | None),
4339 keyword: _,
4342 }) => Ok(JsonPathElem::Dot {
4343 key: value,
4344 quoted: quote_style.is_some(),
4345 }),
4346
4347 Token::DoubleQuotedString(key) => Ok(JsonPathElem::Dot { key, quoted: true }),
4351
4352 _ => self.expected("variant object key name", token),
4353 }
4354 }
4355
4356 fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4357 let path = self.parse_json_path()?;
4358 Ok(Expr::JsonAccess {
4359 value: Box::new(expr),
4360 path,
4361 })
4362 }
4363
4364 fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
4365 let mut path = Vec::new();
4366 loop {
4367 match self.next_token().token {
4368 Token::Colon if path.is_empty() && self.peek_token_ref() == &Token::LBracket => {
4369 self.next_token();
4370 let key = self.parse_wildcard_expr()?;
4371 self.expect_token(&Token::RBracket)?;
4372 path.push(JsonPathElem::ColonBracket { key });
4373 }
4374 Token::Colon if path.is_empty() => {
4375 path.push(self.parse_json_path_object_key()?);
4376 }
4377 Token::Period if !path.is_empty() => {
4378 path.push(self.parse_json_path_object_key()?);
4379 }
4380 Token::LBracket => {
4381 let key = self.parse_wildcard_expr()?;
4382 self.expect_token(&Token::RBracket)?;
4383
4384 path.push(JsonPathElem::Bracket { key });
4385 }
4386 _ => {
4387 self.prev_token();
4388 break;
4389 }
4390 };
4391 }
4392
4393 debug_assert!(!path.is_empty());
4394 Ok(JsonPath { path })
4395 }
4396
4397 pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4399 if self.parse_keyword(Keyword::UNNEST) {
4402 self.expect_token(&Token::LParen)?;
4403 let array_expr = self.parse_expr()?;
4404 self.expect_token(&Token::RParen)?;
4405 return Ok(Expr::InUnnest {
4406 expr: Box::new(expr),
4407 array_expr: Box::new(array_expr),
4408 negated,
4409 });
4410 }
4411 if self.dialect.supports_in_unparenthesized_expr()
4412 && self.peek_token_ref().token != Token::LParen
4413 {
4414 return Ok(Expr::InList {
4415 expr: Box::new(expr),
4416 list: vec![self.parse_expr()?],
4417 negated,
4418 });
4419 }
4420 self.expect_token(&Token::LParen)?;
4421 let in_op = match self.maybe_parse(|p| p.parse_query())? {
4422 Some(subquery) => Expr::InSubquery {
4423 expr: Box::new(expr),
4424 subquery,
4425 negated,
4426 },
4427 None => Expr::InList {
4428 expr: Box::new(expr),
4429 list: if self.dialect.supports_in_empty_list() {
4430 self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
4431 } else {
4432 self.parse_comma_separated(Parser::parse_expr)?
4433 },
4434 negated,
4435 },
4436 };
4437 self.expect_token(&Token::RParen)?;
4438 Ok(in_op)
4439 }
4440
4441 pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
4443 let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4446 self.expect_keyword_is(Keyword::AND)?;
4447 let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
4448 Ok(Expr::Between {
4449 expr: Box::new(expr),
4450 negated,
4451 low: Box::new(low),
4452 high: Box::new(high),
4453 })
4454 }
4455
4456 pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
4458 Ok(Expr::Cast {
4459 kind: CastKind::DoubleColon,
4460 expr: Box::new(expr),
4461 data_type: self.parse_data_type()?,
4462 format: None,
4463 })
4464 }
4465
4466 pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
4468 self.dialect.get_next_precedence_default(self)
4469 }
4470
4471 pub fn token_at(&self, index: usize) -> &TokenWithSpan {
4474 self.tokens.get(index).unwrap_or(&EOF_TOKEN)
4475 }
4476
4477 pub fn peek_token(&self) -> TokenWithSpan {
4482 self.peek_nth_token(0)
4483 }
4484
4485 pub fn peek_token_ref(&self) -> &TokenWithSpan {
4488 self.peek_nth_token_ref(0)
4489 }
4490
4491 pub fn peek_tokens<const N: usize>(&self) -> [Token; N] {
4514 self.peek_tokens_with_location()
4515 .map(|with_loc| with_loc.token)
4516 }
4517
4518 pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
4523 let mut index = self.index;
4524 core::array::from_fn(|_| loop {
4525 let token = self.tokens.get(index);
4526 index += 1;
4527 if let Some(TokenWithSpan {
4528 token: Token::Whitespace(_),
4529 span: _,
4530 }) = token
4531 {
4532 continue;
4533 }
4534 break token.cloned().unwrap_or(TokenWithSpan {
4535 token: Token::EOF,
4536 span: Span::empty(),
4537 });
4538 })
4539 }
4540
4541 pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
4546 let mut index = self.index;
4547 core::array::from_fn(|_| loop {
4548 let token = self.tokens.get(index);
4549 index += 1;
4550 if let Some(TokenWithSpan {
4551 token: Token::Whitespace(_),
4552 span: _,
4553 }) = token
4554 {
4555 continue;
4556 }
4557 break token.unwrap_or(&EOF_TOKEN);
4558 })
4559 }
4560
4561 pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
4563 self.peek_nth_token_ref(n).clone()
4564 }
4565
4566 pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
4568 let mut index = self.index;
4569 loop {
4570 index += 1;
4571 match self.tokens.get(index - 1) {
4572 Some(TokenWithSpan {
4573 token: Token::Whitespace(_),
4574 span: _,
4575 }) => continue,
4576 non_whitespace => {
4577 if n == 0 {
4578 return non_whitespace.unwrap_or(&EOF_TOKEN);
4579 }
4580 n -= 1;
4581 }
4582 }
4583 }
4584 }
4585
4586 pub fn peek_token_no_skip(&self) -> TokenWithSpan {
4589 self.peek_nth_token_no_skip(0)
4590 }
4591
4592 pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
4594 self.tokens
4595 .get(self.index + n)
4596 .cloned()
4597 .unwrap_or(TokenWithSpan {
4598 token: Token::EOF,
4599 span: Span::empty(),
4600 })
4601 }
4602
4603 fn peek_nth_token_no_skip_ref(&self, n: usize) -> &TokenWithSpan {
4605 self.tokens.get(self.index + n).unwrap_or(&EOF_TOKEN)
4606 }
4607
4608 fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
4612 let index = self.index;
4613 let matched = self.parse_keywords(expected);
4614 self.index = index;
4615 matched
4616 }
4617
4618 pub fn next_token(&mut self) -> TokenWithSpan {
4623 self.advance_token();
4624 self.get_current_token().clone()
4625 }
4626
4627 pub fn get_current_index(&self) -> usize {
4632 self.index.saturating_sub(1)
4633 }
4634
4635 pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
4637 self.index += 1;
4638 self.tokens.get(self.index - 1)
4639 }
4640
4641 pub fn advance_token(&mut self) {
4645 loop {
4646 self.index += 1;
4647 match self.tokens.get(self.index - 1) {
4648 Some(TokenWithSpan {
4649 token: Token::Whitespace(_),
4650 span: _,
4651 }) => continue,
4652 _ => break,
4653 }
4654 }
4655 }
4656
4657 pub fn get_current_token(&self) -> &TokenWithSpan {
4661 self.token_at(self.index.saturating_sub(1))
4662 }
4663
4664 pub fn get_previous_token(&self) -> &TokenWithSpan {
4668 self.token_at(self.index.saturating_sub(2))
4669 }
4670
4671 pub fn get_next_token(&self) -> &TokenWithSpan {
4675 self.token_at(self.index)
4676 }
4677
4678 pub fn prev_token(&mut self) {
4685 loop {
4686 assert!(self.index > 0);
4687 self.index -= 1;
4688 if let Some(TokenWithSpan {
4689 token: Token::Whitespace(_),
4690 span: _,
4691 }) = self.tokens.get(self.index)
4692 {
4693 continue;
4694 }
4695 return;
4696 }
4697 }
4698
4699 pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
4701 parser_err!(
4702 format!("Expected: {expected}, found: {found}"),
4703 found.span.start
4704 )
4705 }
4706
4707 pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
4709 parser_err!(
4710 format!("Expected: {expected}, found: {found}"),
4711 found.span.start
4712 )
4713 }
4714
4715 pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
4717 let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
4718 parser_err!(
4719 format!("Expected: {expected}, found: {found}"),
4720 found.span.start
4721 )
4722 }
4723
4724 #[must_use]
4727 pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
4728 if self.peek_keyword(expected) {
4729 self.advance_token();
4730 true
4731 } else {
4732 false
4733 }
4734 }
4735
4736 #[must_use]
4737 pub fn peek_keyword(&self, expected: Keyword) -> bool {
4741 matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
4742 }
4743
4744 pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4752 self.keyword_with_tokens(expected, tokens, true)
4753 }
4754
4755 pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4760 self.keyword_with_tokens(expected, tokens, false)
4761 }
4762
4763 fn keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token], consume: bool) -> bool {
4764 match &self.peek_token_ref().token {
4765 Token::Word(w) if expected == w.keyword => {
4766 for (idx, token) in tokens.iter().enumerate() {
4767 if self.peek_nth_token_ref(idx + 1).token != *token {
4768 return false;
4769 }
4770 }
4771
4772 if consume {
4773 for _ in 0..(tokens.len() + 1) {
4774 self.advance_token();
4775 }
4776 }
4777
4778 true
4779 }
4780 _ => false,
4781 }
4782 }
4783
4784 #[must_use]
4788 pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
4789 self.parse_keywords_indexed(keywords).is_some()
4790 }
4791
4792 #[must_use]
4795 fn parse_keywords_indexed(&mut self, keywords: &[Keyword]) -> Option<usize> {
4796 let start_index = self.index;
4797 let mut first_keyword_index = None;
4798 for &keyword in keywords {
4799 if !self.parse_keyword(keyword) {
4800 self.index = start_index;
4801 return None;
4802 }
4803 if first_keyword_index.is_none() {
4804 first_keyword_index = Some(self.index.saturating_sub(1));
4805 }
4806 }
4807 first_keyword_index
4808 }
4809
4810 #[must_use]
4813 pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
4814 for keyword in keywords {
4815 if self.peek_keyword(*keyword) {
4816 return Some(*keyword);
4817 }
4818 }
4819 None
4820 }
4821
4822 #[must_use]
4826 pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
4827 match &self.peek_token_ref().token {
4828 Token::Word(w) => {
4829 keywords
4830 .iter()
4831 .find(|keyword| **keyword == w.keyword)
4832 .map(|keyword| {
4833 self.advance_token();
4834 *keyword
4835 })
4836 }
4837 _ => None,
4838 }
4839 }
4840
4841 pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
4844 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
4845 Ok(keyword)
4846 } else {
4847 let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
4848 self.expected_ref(
4849 &format!("one of {}", keywords.join(" or ")),
4850 self.peek_token_ref(),
4851 )
4852 }
4853 }
4854
4855 pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
4860 if self.parse_keyword(expected) {
4861 Ok(self.get_current_token().clone())
4862 } else {
4863 self.expected_ref(format!("{:?}", expected).as_str(), self.peek_token_ref())
4864 }
4865 }
4866
4867 pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
4873 if self.parse_keyword(expected) {
4874 Ok(())
4875 } else {
4876 self.expected_ref(format!("{:?}", expected).as_str(), self.peek_token_ref())
4877 }
4878 }
4879
4880 pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
4883 for &kw in expected {
4884 self.expect_keyword_is(kw)?;
4885 }
4886 Ok(())
4887 }
4888
4889 #[must_use]
4893 pub fn consume_token(&mut self, expected: &Token) -> bool {
4894 if self.peek_token_ref() == expected {
4895 self.advance_token();
4896 true
4897 } else {
4898 false
4899 }
4900 }
4901
4902 #[must_use]
4906 pub fn consume_tokens(&mut self, tokens: &[Token]) -> bool {
4907 let index = self.index;
4908 for token in tokens {
4909 if !self.consume_token(token) {
4910 self.index = index;
4911 return false;
4912 }
4913 }
4914 true
4915 }
4916
4917 pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
4919 if self.peek_token_ref() == expected {
4920 Ok(self.next_token())
4921 } else {
4922 self.expected_ref(&expected.to_string(), self.peek_token_ref())
4923 }
4924 }
4925
4926 fn parse<T: FromStr>(s: String, loc: Location) -> Result<T, ParserError>
4927 where
4928 <T as FromStr>::Err: Display,
4929 {
4930 s.parse::<T>().map_err(|e| {
4931 ParserError::ParserError(format!(
4932 "Could not parse '{s}' as {}: {e}{loc}",
4933 core::any::type_name::<T>()
4934 ))
4935 })
4936 }
4937
4938 pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
4940 let trailing_commas =
4946 self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
4947
4948 self.parse_comma_separated_with_trailing_commas(
4949 |p| p.parse_select_item(),
4950 trailing_commas,
4951 Self::is_reserved_for_column_alias,
4952 )
4953 }
4954
4955 pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
4957 let mut values = vec![];
4958 loop {
4959 values.push(self.parse_grant_permission()?);
4960 if !self.consume_token(&Token::Comma) {
4961 break;
4962 } else if self.options.trailing_commas {
4963 match &self.peek_token_ref().token {
4964 Token::Word(kw) if kw.keyword == Keyword::ON => {
4965 break;
4966 }
4967 Token::RParen
4968 | Token::SemiColon
4969 | Token::EOF
4970 | Token::RBracket
4971 | Token::RBrace => break,
4972 _ => continue,
4973 }
4974 }
4975 }
4976 Ok(values)
4977 }
4978
4979 fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
4981 let trailing_commas = self.dialect.supports_from_trailing_commas();
4982
4983 self.parse_comma_separated_with_trailing_commas(
4984 Parser::parse_table_and_joins,
4985 trailing_commas,
4986 |kw, parser| !self.dialect.is_table_factor(kw, parser),
4987 )
4988 }
4989
4990 fn is_parse_comma_separated_end_with_trailing_commas<R>(
4997 &mut self,
4998 trailing_commas: bool,
4999 is_reserved_keyword: &R,
5000 ) -> bool
5001 where
5002 R: Fn(&Keyword, &mut Parser) -> bool,
5003 {
5004 if !self.consume_token(&Token::Comma) {
5005 true
5006 } else if trailing_commas {
5007 let token = self.next_token().token;
5008 let is_end = match token {
5009 Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
5010 Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
5011 true
5012 }
5013 _ => false,
5014 };
5015 self.prev_token();
5016
5017 is_end
5018 } else {
5019 false
5020 }
5021 }
5022
5023 fn is_parse_comma_separated_end(&mut self) -> bool {
5026 self.is_parse_comma_separated_end_with_trailing_commas(
5027 self.options.trailing_commas,
5028 &Self::is_reserved_for_column_alias,
5029 )
5030 }
5031
5032 pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
5034 where
5035 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5036 {
5037 self.parse_comma_separated_with_trailing_commas(
5038 f,
5039 self.options.trailing_commas,
5040 Self::is_reserved_for_column_alias,
5041 )
5042 }
5043
5044 fn parse_comma_separated_with_trailing_commas<T, F, R>(
5049 &mut self,
5050 mut f: F,
5051 trailing_commas: bool,
5052 is_reserved_keyword: R,
5053 ) -> Result<Vec<T>, ParserError>
5054 where
5055 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5056 R: Fn(&Keyword, &mut Parser) -> bool,
5057 {
5058 let mut values = vec![];
5059 loop {
5060 values.push(f(self)?);
5061 if self.is_parse_comma_separated_end_with_trailing_commas(
5062 trailing_commas,
5063 &is_reserved_keyword,
5064 ) {
5065 break;
5066 }
5067 }
5068 Ok(values)
5069 }
5070
5071 fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
5073 where
5074 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5075 {
5076 let mut values = vec![];
5077 loop {
5078 values.push(f(self)?);
5079 if !self.consume_token(&Token::Period) {
5080 break;
5081 }
5082 }
5083 Ok(values)
5084 }
5085
5086 pub fn parse_keyword_separated<T, F>(
5088 &mut self,
5089 keyword: Keyword,
5090 mut f: F,
5091 ) -> Result<Vec<T>, ParserError>
5092 where
5093 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5094 {
5095 let mut values = vec![];
5096 loop {
5097 values.push(f(self)?);
5098 if !self.parse_keyword(keyword) {
5099 break;
5100 }
5101 }
5102 Ok(values)
5103 }
5104
5105 pub fn parse_parenthesized<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5107 where
5108 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5109 {
5110 self.expect_token(&Token::LParen)?;
5111 let res = f(self)?;
5112 self.expect_token(&Token::RParen)?;
5113 Ok(res)
5114 }
5115
5116 pub fn parse_comma_separated0<T, F>(
5119 &mut self,
5120 f: F,
5121 end_token: Token,
5122 ) -> Result<Vec<T>, ParserError>
5123 where
5124 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
5125 {
5126 if self.peek_token_ref().token == end_token {
5127 return Ok(vec![]);
5128 }
5129
5130 if self.options.trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
5131 let _ = self.consume_token(&Token::Comma);
5132 return Ok(vec![]);
5133 }
5134
5135 self.parse_comma_separated(f)
5136 }
5137
5138 pub(crate) fn parse_statement_list(
5142 &mut self,
5143 terminal_keywords: &[Keyword],
5144 ) -> Result<Vec<Statement>, ParserError> {
5145 let mut values = vec![];
5146 loop {
5147 match &self.peek_nth_token_ref(0).token {
5148 Token::EOF => break,
5149 Token::Word(w)
5150 if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) =>
5151 {
5152 break;
5153 }
5154 _ => {}
5155 }
5156
5157 values.push(self.parse_statement()?);
5158 self.expect_token(&Token::SemiColon)?;
5159 }
5160 Ok(values)
5161 }
5162
5163 fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
5167 !parser.dialect.is_column_alias(kw, parser)
5168 }
5169
5170 pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
5174 where
5175 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5176 {
5177 match self.try_parse(f) {
5178 Ok(t) => Ok(Some(t)),
5179 Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
5180 _ => Ok(None),
5181 }
5182 }
5183
5184 pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
5186 where
5187 F: FnMut(&mut Parser) -> Result<T, ParserError>,
5188 {
5189 let index = self.index;
5190 match f(self) {
5191 Ok(t) => Ok(t),
5192 Err(e) => {
5193 self.index = index;
5195 Err(e)
5196 }
5197 }
5198 }
5199
5200 pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
5203 let loc = self.peek_token_ref().span.start;
5204 let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, Keyword::DISTINCT]) {
5205 Some(Keyword::ALL) => {
5206 if self.peek_keyword(Keyword::DISTINCT) {
5207 return parser_err!("Cannot specify ALL then DISTINCT".to_string(), loc);
5208 }
5209 Some(Distinct::All)
5210 }
5211 Some(Keyword::DISTINCT) => {
5212 if self.peek_keyword(Keyword::ALL) {
5213 return parser_err!("Cannot specify DISTINCT then ALL".to_string(), loc);
5214 }
5215 Some(Distinct::Distinct)
5216 }
5217 None => return Ok(None),
5218 _ => return parser_err!("ALL or DISTINCT", loc),
5219 };
5220
5221 let Some(Distinct::Distinct) = distinct else {
5222 return Ok(distinct);
5223 };
5224 if !self.parse_keyword(Keyword::ON) {
5225 return Ok(Some(Distinct::Distinct));
5226 }
5227
5228 self.expect_token(&Token::LParen)?;
5229 let col_names = if self.consume_token(&Token::RParen) {
5230 self.prev_token();
5231 Vec::new()
5232 } else {
5233 self.parse_comma_separated(Parser::parse_expr)?
5234 };
5235 self.expect_token(&Token::RParen)?;
5236 Ok(Some(Distinct::On(col_names)))
5237 }
5238
5239 pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
5241 let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
5242 let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
5243 let multiset = self.maybe_parse_multiset();
5244 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
5245 let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
5246 let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
5247 let global: Option<bool> = if global {
5248 Some(true)
5249 } else if local {
5250 Some(false)
5251 } else {
5252 None
5253 };
5254 let temporary = self
5255 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
5256 .is_some();
5257 let volatile = self.parse_keyword(Keyword::VOLATILE);
5258 let unlogged = self.peek_keywords(&[Keyword::UNLOGGED, Keyword::TABLE]);
5259 if unlogged {
5260 self.expect_keyword(Keyword::UNLOGGED)?;
5261 }
5262 let persistent = dialect_of!(self is DuckDbDialect)
5263 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
5264 let create_view_params = self.parse_create_view_params()?;
5265 if self.peek_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE]) {
5266 self.parse_create_snapshot_table().map(Into::into)
5267 } else if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
5268 self.parse_create_text_search().map(Into::into)
5269 } else if self.parse_keyword(Keyword::TABLE) {
5270 self.parse_create_table(
5271 or_replace, temporary, unlogged, global, transient, volatile, multiset,
5272 )
5273 .map(Into::into)
5274 } else if self.peek_keyword(Keyword::MATERIALIZED)
5275 || self.peek_keyword(Keyword::VIEW)
5276 || self.peek_keywords(&[Keyword::SECURE, Keyword::MATERIALIZED, Keyword::VIEW])
5277 || self.peek_keywords(&[Keyword::SECURE, Keyword::VIEW])
5278 {
5279 self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
5280 .map(Into::into)
5281 } else if self.parse_keyword(Keyword::POLICY) {
5282 self.parse_create_policy().map(Into::into)
5283 } else if self.parse_keyword(Keyword::EXTERNAL) {
5284 self.parse_create_external_table(or_replace).map(Into::into)
5285 } else if self.parse_keyword(Keyword::FUNCTION) {
5286 self.parse_create_function(or_alter, or_replace, temporary)
5287 } else if self.parse_keyword(Keyword::DOMAIN) {
5288 self.parse_create_domain().map(Into::into)
5289 } else if self.parse_keyword(Keyword::TRIGGER) {
5290 self.parse_create_trigger(temporary, or_alter, or_replace, false)
5291 .map(Into::into)
5292 } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
5293 self.parse_create_trigger(temporary, or_alter, or_replace, true)
5294 .map(Into::into)
5295 } else if self.parse_keyword(Keyword::MACRO) {
5296 self.parse_create_macro(or_replace, temporary)
5297 } else if self.parse_keyword(Keyword::SECRET) {
5298 self.parse_create_secret(or_replace, temporary, persistent)
5299 } else if self.parse_keyword(Keyword::USER) {
5300 self.parse_create_user(or_replace).map(Into::into)
5301 } else if self.parse_keyword(Keyword::SCHEMA) {
5302 self.parse_create_schema(or_replace)
5303 } else if self.parse_keyword(Keyword::WAREHOUSE) {
5304 self.parse_create_warehouse(or_replace).map(Into::into)
5305 } else if or_replace {
5306 self.expected_ref(
5307 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION or SCHEMA or WAREHOUSE after CREATE OR REPLACE",
5308 self.peek_token_ref(),
5309 )
5310 } else if self.parse_keyword(Keyword::EXTENSION) {
5311 self.parse_create_extension().map(Into::into)
5312 } else if self.parse_keyword(Keyword::INDEX) {
5313 self.parse_create_index(false).map(Into::into)
5314 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
5315 self.parse_create_index(true).map(Into::into)
5316 } else if self.parse_keyword(Keyword::VIRTUAL) {
5317 self.parse_create_virtual_table()
5318 } else if self.parse_keyword(Keyword::DATABASE) {
5319 self.parse_create_database()
5320 } else if self.parse_keyword(Keyword::ROLE) {
5321 self.parse_create_role().map(Into::into)
5322 } else if self.parse_keyword(Keyword::SEQUENCE) {
5323 self.parse_create_sequence(temporary)
5324 } else if self.parse_keyword(Keyword::COLLATION) {
5325 self.parse_create_collation().map(Into::into)
5326 } else if self.parse_keyword(Keyword::TYPE) {
5327 self.parse_create_type()
5328 } else if self.parse_keyword(Keyword::PROCEDURE) {
5329 self.parse_create_procedure(or_alter)
5330 } else if self.parse_keyword(Keyword::CONNECTOR) {
5331 self.parse_create_connector().map(Into::into)
5332 } else if self.parse_keyword(Keyword::OPERATOR) {
5333 if self.parse_keyword(Keyword::FAMILY) {
5335 self.parse_create_operator_family().map(Into::into)
5336 } else if self.parse_keyword(Keyword::CLASS) {
5337 self.parse_create_operator_class().map(Into::into)
5338 } else {
5339 self.parse_create_operator().map(Into::into)
5340 }
5341 } else if self.parse_keyword(Keyword::SERVER) {
5342 self.parse_pg_create_server()
5343 } else {
5344 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5345 }
5346 }
5347
5348 fn parse_text_search_object_type(&mut self) -> Result<TextSearchObjectType, ParserError> {
5349 match self.expect_one_of_keywords(&[
5350 Keyword::DICTIONARY,
5351 Keyword::CONFIGURATION,
5352 Keyword::TEMPLATE,
5353 Keyword::PARSER,
5354 ])? {
5355 Keyword::DICTIONARY => Ok(TextSearchObjectType::Dictionary),
5356 Keyword::CONFIGURATION => Ok(TextSearchObjectType::Configuration),
5357 Keyword::TEMPLATE => Ok(TextSearchObjectType::Template),
5358 Keyword::PARSER => Ok(TextSearchObjectType::Parser),
5359 unexpected_keyword => Err(ParserError::ParserError(format!(
5360 "Internal parser error: expected any of {{DICTIONARY, CONFIGURATION, TEMPLATE, PARSER}}, got {unexpected_keyword:?}"
5361 ))),
5362 }
5363 }
5364
5365 pub fn parse_create_text_search(&mut self) -> Result<CreateTextSearch, ParserError> {
5367 self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
5368 let object_type = self.parse_text_search_object_type()?;
5369 let name = self.parse_object_name(false)?;
5370 self.expect_token(&Token::LParen)?;
5371 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
5372 self.expect_token(&Token::RParen)?;
5373 Ok(CreateTextSearch {
5374 object_type,
5375 name,
5376 options,
5377 })
5378 }
5379
5380 fn parse_alter_text_search_option(&mut self) -> Result<AlterTextSearchOption, ParserError> {
5381 let key = self.parse_identifier()?;
5382 let value = if self.consume_token(&Token::Eq) {
5383 Some(self.parse_expr()?)
5384 } else {
5385 None
5386 };
5387 Ok(AlterTextSearchOption { key, value })
5388 }
5389
5390 pub fn parse_alter_text_search(&mut self) -> Result<AlterTextSearch, ParserError> {
5392 self.expect_keywords(&[Keyword::TEXT, Keyword::SEARCH])?;
5393 let object_type = self.parse_text_search_object_type()?;
5394 let name = self.parse_object_name(false)?;
5395
5396 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
5397 AlterTextSearchOperation::RenameTo {
5398 new_name: self.parse_identifier()?,
5399 }
5400 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
5401 AlterTextSearchOperation::OwnerTo(self.parse_owner()?)
5402 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
5403 AlterTextSearchOperation::SetSchema {
5404 schema_name: self.parse_object_name(false)?,
5405 }
5406 } else if self.consume_token(&Token::LParen) {
5407 let options = self.parse_comma_separated(Parser::parse_alter_text_search_option)?;
5408 self.expect_token(&Token::RParen)?;
5409 AlterTextSearchOperation::SetOptions { options }
5410 } else {
5411 let expected = "RENAME TO, OWNER TO, SET SCHEMA, or (...) after ALTER TEXT SEARCH";
5412 return self.expected_ref(expected, self.peek_token_ref());
5413 };
5414
5415 Ok(AlterTextSearch {
5416 object_type,
5417 name,
5418 operation,
5419 })
5420 }
5421
5422 fn parse_create_user(&mut self, or_replace: bool) -> Result<CreateUser, ParserError> {
5423 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5424 let name = self.parse_identifier()?;
5425 let options = self
5426 .parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?
5427 .options;
5428 let with_tags = self.parse_keyword(Keyword::WITH);
5429 let tags = if self.parse_keyword(Keyword::TAG) {
5430 self.parse_key_value_options(true, &[])?.options
5431 } else {
5432 vec![]
5433 };
5434 Ok(CreateUser {
5435 or_replace,
5436 if_not_exists,
5437 name,
5438 options: KeyValueOptions {
5439 options,
5440 delimiter: KeyValueOptionsDelimiter::Space,
5441 },
5442 with_tags,
5443 tags: KeyValueOptions {
5444 options: tags,
5445 delimiter: KeyValueOptionsDelimiter::Comma,
5446 },
5447 })
5448 }
5449
5450 fn parse_create_warehouse(&mut self, or_replace: bool) -> Result<CreateWarehouse, ParserError> {
5454 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5455 let name = self.parse_object_name(false)?;
5456 let _ = self.parse_keyword(Keyword::WITH);
5457 let options = self.parse_key_value_options(false, &[])?;
5458 Ok(CreateWarehouse {
5459 or_replace,
5460 if_not_exists,
5461 name,
5462 options,
5463 })
5464 }
5465
5466 pub fn parse_create_secret(
5468 &mut self,
5469 or_replace: bool,
5470 temporary: bool,
5471 persistent: bool,
5472 ) -> Result<Statement, ParserError> {
5473 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5474
5475 let mut storage_specifier = None;
5476 let mut name = None;
5477 if self.peek_token_ref().token != Token::LParen {
5478 if self.parse_keyword(Keyword::IN) {
5479 storage_specifier = self.parse_identifier().ok()
5480 } else {
5481 name = self.parse_identifier().ok();
5482 }
5483
5484 if storage_specifier.is_none()
5486 && self.peek_token_ref().token != Token::LParen
5487 && self.parse_keyword(Keyword::IN)
5488 {
5489 storage_specifier = self.parse_identifier().ok();
5490 }
5491 }
5492
5493 self.expect_token(&Token::LParen)?;
5494 self.expect_keyword_is(Keyword::TYPE)?;
5495 let secret_type = self.parse_identifier()?;
5496
5497 let mut options = Vec::new();
5498 if self.consume_token(&Token::Comma) {
5499 options.append(&mut self.parse_comma_separated(|p| {
5500 let key = p.parse_identifier()?;
5501 let value = p.parse_identifier()?;
5502 Ok(SecretOption { key, value })
5503 })?);
5504 }
5505 self.expect_token(&Token::RParen)?;
5506
5507 let temp = match (temporary, persistent) {
5508 (true, false) => Some(true),
5509 (false, true) => Some(false),
5510 (false, false) => None,
5511 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
5512 };
5513
5514 Ok(Statement::CreateSecret {
5515 or_replace,
5516 temporary: temp,
5517 if_not_exists,
5518 name,
5519 storage_specifier,
5520 secret_type,
5521 options,
5522 })
5523 }
5524
5525 pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
5527 let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
5528 if self.parse_keyword(Keyword::TABLE) {
5529 let table_name = self.parse_object_name(false)?;
5530 if self.peek_token_ref().token != Token::EOF {
5531 if let Token::Word(word) = &self.peek_token_ref().token {
5532 if word.keyword == Keyword::OPTIONS {
5533 options = self.parse_options(Keyword::OPTIONS)?
5534 }
5535 };
5536
5537 if self.peek_token_ref().token != Token::EOF {
5538 let (a, q) = self.parse_as_query()?;
5539 has_as = a;
5540 query = Some(q);
5541 }
5542
5543 Ok(Statement::Cache {
5544 table_flag,
5545 table_name,
5546 has_as,
5547 options,
5548 query,
5549 })
5550 } else {
5551 Ok(Statement::Cache {
5552 table_flag,
5553 table_name,
5554 has_as,
5555 options,
5556 query,
5557 })
5558 }
5559 } else {
5560 table_flag = Some(self.parse_object_name(false)?);
5561 if self.parse_keyword(Keyword::TABLE) {
5562 let table_name = self.parse_object_name(false)?;
5563 if self.peek_token_ref().token != Token::EOF {
5564 if let Token::Word(word) = &self.peek_token_ref().token {
5565 if word.keyword == Keyword::OPTIONS {
5566 options = self.parse_options(Keyword::OPTIONS)?
5567 }
5568 };
5569
5570 if self.peek_token_ref().token != Token::EOF {
5571 let (a, q) = self.parse_as_query()?;
5572 has_as = a;
5573 query = Some(q);
5574 }
5575
5576 Ok(Statement::Cache {
5577 table_flag,
5578 table_name,
5579 has_as,
5580 options,
5581 query,
5582 })
5583 } else {
5584 Ok(Statement::Cache {
5585 table_flag,
5586 table_name,
5587 has_as,
5588 options,
5589 query,
5590 })
5591 }
5592 } else {
5593 if self.peek_token_ref().token == Token::EOF {
5594 self.prev_token();
5595 }
5596 self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
5597 }
5598 }
5599 }
5600
5601 pub fn parse_as_query(&mut self) -> Result<(bool, Box<Query>), ParserError> {
5603 match &self.peek_token_ref().token {
5604 Token::Word(word) => match word.keyword {
5605 Keyword::AS => {
5606 self.next_token();
5607 Ok((true, self.parse_query()?))
5608 }
5609 _ => Ok((false, self.parse_query()?)),
5610 },
5611 _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
5612 }
5613 }
5614
5615 pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
5617 self.expect_keyword_is(Keyword::TABLE)?;
5618 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5619 let table_name = self.parse_object_name(false)?;
5620 Ok(Statement::UNCache {
5621 table_name,
5622 if_exists,
5623 })
5624 }
5625
5626 pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
5628 self.expect_keyword_is(Keyword::TABLE)?;
5629 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5630 let table_name = self.parse_object_name(false)?;
5631 self.expect_keyword_is(Keyword::USING)?;
5632 let module_name = self.parse_identifier()?;
5633 let module_args = self.parse_parenthesized_column_list(Optional, false)?;
5638 Ok(Statement::CreateVirtualTable {
5639 name: table_name,
5640 if_not_exists,
5641 module_name,
5642 module_args,
5643 })
5644 }
5645
5646 pub fn parse_create_schema(&mut self, or_replace: bool) -> Result<Statement, ParserError> {
5648 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5649
5650 let schema_name = self.parse_schema_name()?;
5651
5652 let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
5653 Some(self.parse_expr()?)
5654 } else {
5655 None
5656 };
5657
5658 let with = if self.peek_keyword(Keyword::WITH) {
5659 Some(self.parse_options(Keyword::WITH)?)
5660 } else {
5661 None
5662 };
5663
5664 let options = if self.peek_keyword(Keyword::OPTIONS) {
5665 Some(self.parse_options(Keyword::OPTIONS)?)
5666 } else {
5667 None
5668 };
5669
5670 let clone = if self.parse_keyword(Keyword::CLONE) {
5671 Some(self.parse_object_name(false)?)
5672 } else {
5673 None
5674 };
5675
5676 Ok(Statement::CreateSchema {
5677 schema_name,
5678 or_replace,
5679 if_not_exists,
5680 with,
5681 options,
5682 default_collate_spec,
5683 clone,
5684 })
5685 }
5686
5687 fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
5688 if self.parse_keyword(Keyword::AUTHORIZATION) {
5689 Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
5690 } else {
5691 let name = self.parse_object_name(false)?;
5692
5693 if self.parse_keyword(Keyword::AUTHORIZATION) {
5694 Ok(SchemaName::NamedAuthorization(
5695 name,
5696 self.parse_identifier()?,
5697 ))
5698 } else {
5699 Ok(SchemaName::Simple(name))
5700 }
5701 }
5702 }
5703
5704 pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
5706 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
5707 let db_name = self.parse_object_name(false)?;
5708 let mut location = None;
5709 let mut managed_location = None;
5710 loop {
5711 match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
5712 Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
5713 Some(Keyword::MANAGEDLOCATION) => {
5714 managed_location = Some(self.parse_literal_string()?)
5715 }
5716 _ => break,
5717 }
5718 }
5719 let clone = if self.parse_keyword(Keyword::CLONE) {
5720 Some(self.parse_object_name(false)?)
5721 } else {
5722 None
5723 };
5724
5725 let mut default_charset = None;
5733 let mut default_collation = None;
5734 loop {
5735 let has_default = self.parse_keyword(Keyword::DEFAULT);
5736 if default_charset.is_none() && self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET])
5737 || self.parse_keyword(Keyword::CHARSET)
5738 {
5739 let _ = self.consume_token(&Token::Eq);
5740 default_charset = Some(self.parse_identifier()?.value);
5741 } else if self.parse_keyword(Keyword::COLLATE) {
5742 let _ = self.consume_token(&Token::Eq);
5743 default_collation = Some(self.parse_identifier()?.value);
5744 } else if has_default {
5745 self.prev_token();
5747 break;
5748 } else {
5749 break;
5750 }
5751 }
5752
5753 Ok(Statement::CreateDatabase {
5754 db_name,
5755 if_not_exists: ine,
5756 location,
5757 managed_location,
5758 or_replace: false,
5759 transient: false,
5760 clone,
5761 data_retention_time_in_days: None,
5762 max_data_extension_time_in_days: None,
5763 external_volume: None,
5764 catalog: None,
5765 replace_invalid_characters: None,
5766 default_ddl_collation: None,
5767 storage_serialization_policy: None,
5768 comment: None,
5769 default_charset,
5770 default_collation,
5771 catalog_sync: None,
5772 catalog_sync_namespace_mode: None,
5773 catalog_sync_namespace_flatten_delimiter: None,
5774 with_tags: None,
5775 with_contacts: None,
5776 })
5777 }
5778
5779 pub fn parse_optional_create_function_using(
5781 &mut self,
5782 ) -> Result<Option<CreateFunctionUsing>, ParserError> {
5783 if !self.parse_keyword(Keyword::USING) {
5784 return Ok(None);
5785 };
5786 let keyword =
5787 self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
5788
5789 let uri = self.parse_literal_string()?;
5790
5791 match keyword {
5792 Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
5793 Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
5794 Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
5795 _ => self.expected(
5796 "JAR, FILE or ARCHIVE, got {:?}",
5797 TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
5798 ),
5799 }
5800 }
5801
5802 pub fn parse_create_function(
5804 &mut self,
5805 or_alter: bool,
5806 or_replace: bool,
5807 temporary: bool,
5808 ) -> Result<Statement, ParserError> {
5809 if dialect_of!(self is HiveDialect) {
5810 self.parse_hive_create_function(or_replace, temporary)
5811 .map(Into::into)
5812 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
5813 self.parse_postgres_create_function(or_replace, temporary)
5814 .map(Into::into)
5815 } else if dialect_of!(self is DuckDbDialect) {
5816 self.parse_create_macro(or_replace, temporary)
5817 } else if dialect_of!(self is BigQueryDialect) {
5818 self.parse_bigquery_create_function(or_replace, temporary)
5819 .map(Into::into)
5820 } else if dialect_of!(self is MsSqlDialect) {
5821 self.parse_mssql_create_function(or_alter, or_replace, temporary)
5822 .map(Into::into)
5823 } else {
5824 self.prev_token();
5825 self.expected_ref("an object type after CREATE", self.peek_token_ref())
5826 }
5827 }
5828
5829 fn parse_postgres_create_function(
5833 &mut self,
5834 or_replace: bool,
5835 temporary: bool,
5836 ) -> Result<CreateFunction, ParserError> {
5837 let name = self.parse_object_name(false)?;
5838
5839 self.expect_token(&Token::LParen)?;
5840 let args = if Token::RParen != self.peek_token_ref().token {
5841 self.parse_comma_separated(Parser::parse_function_arg)?
5842 } else {
5843 vec![]
5844 };
5845 self.expect_token(&Token::RParen)?;
5846
5847 let return_type = if self.parse_keyword(Keyword::RETURNS) {
5848 Some(self.parse_function_return_type()?)
5849 } else {
5850 None
5851 };
5852
5853 #[derive(Default)]
5854 struct Body {
5855 language: Option<Ident>,
5856 behavior: Option<FunctionBehavior>,
5857 function_body: Option<CreateFunctionBody>,
5858 called_on_null: Option<FunctionCalledOnNull>,
5859 parallel: Option<FunctionParallel>,
5860 security: Option<FunctionSecurity>,
5861 }
5862 let mut body = Body::default();
5863 let mut set_params: Vec<FunctionDefinitionSetParam> = Vec::new();
5864 loop {
5865 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
5866 if field.is_some() {
5867 return Err(ParserError::ParserError(format!(
5868 "{name} specified more than once",
5869 )));
5870 }
5871 Ok(())
5872 }
5873 if self.parse_keyword(Keyword::AS) {
5874 ensure_not_set(&body.function_body, "AS")?;
5875 body.function_body = Some(self.parse_create_function_body_string()?);
5876 } else if self.parse_keyword(Keyword::LANGUAGE) {
5877 ensure_not_set(&body.language, "LANGUAGE")?;
5878 body.language = Some(self.parse_identifier()?);
5879 } else if self.parse_keyword(Keyword::IMMUTABLE) {
5880 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5881 body.behavior = Some(FunctionBehavior::Immutable);
5882 } else if self.parse_keyword(Keyword::STABLE) {
5883 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5884 body.behavior = Some(FunctionBehavior::Stable);
5885 } else if self.parse_keyword(Keyword::VOLATILE) {
5886 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
5887 body.behavior = Some(FunctionBehavior::Volatile);
5888 } else if self.parse_keywords(&[
5889 Keyword::CALLED,
5890 Keyword::ON,
5891 Keyword::NULL,
5892 Keyword::INPUT,
5893 ]) {
5894 ensure_not_set(
5895 &body.called_on_null,
5896 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5897 )?;
5898 body.called_on_null = Some(FunctionCalledOnNull::CalledOnNullInput);
5899 } else if self.parse_keywords(&[
5900 Keyword::RETURNS,
5901 Keyword::NULL,
5902 Keyword::ON,
5903 Keyword::NULL,
5904 Keyword::INPUT,
5905 ]) {
5906 ensure_not_set(
5907 &body.called_on_null,
5908 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5909 )?;
5910 body.called_on_null = Some(FunctionCalledOnNull::ReturnsNullOnNullInput);
5911 } else if self.parse_keyword(Keyword::STRICT) {
5912 ensure_not_set(
5913 &body.called_on_null,
5914 "CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT",
5915 )?;
5916 body.called_on_null = Some(FunctionCalledOnNull::Strict);
5917 } else if self.parse_keyword(Keyword::PARALLEL) {
5918 ensure_not_set(&body.parallel, "PARALLEL { UNSAFE | RESTRICTED | SAFE }")?;
5919 if self.parse_keyword(Keyword::UNSAFE) {
5920 body.parallel = Some(FunctionParallel::Unsafe);
5921 } else if self.parse_keyword(Keyword::RESTRICTED) {
5922 body.parallel = Some(FunctionParallel::Restricted);
5923 } else if self.parse_keyword(Keyword::SAFE) {
5924 body.parallel = Some(FunctionParallel::Safe);
5925 } else {
5926 return self
5927 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
5928 }
5929 } else if self.parse_keyword(Keyword::SECURITY) {
5930 ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER }")?;
5931 if self.parse_keyword(Keyword::DEFINER) {
5932 body.security = Some(FunctionSecurity::Definer);
5933 } else if self.parse_keyword(Keyword::INVOKER) {
5934 body.security = Some(FunctionSecurity::Invoker);
5935 } else {
5936 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
5937 }
5938 } else if self.parse_keyword(Keyword::SET) {
5939 let name = self.parse_object_name(false)?;
5940 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
5941 FunctionSetValue::FromCurrent
5942 } else {
5943 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
5944 return self.expected_ref("= or TO", self.peek_token_ref());
5945 }
5946 if self.parse_keyword(Keyword::DEFAULT) {
5947 FunctionSetValue::Default
5948 } else {
5949 let values = self.parse_comma_separated(Parser::parse_expr)?;
5950 FunctionSetValue::Values(values)
5951 }
5952 };
5953 set_params.push(FunctionDefinitionSetParam { name, value });
5954 } else if self.parse_keyword(Keyword::RETURN) {
5955 ensure_not_set(&body.function_body, "RETURN")?;
5956 body.function_body = Some(CreateFunctionBody::Return(self.parse_expr()?));
5957 } else {
5958 break;
5959 }
5960 }
5961
5962 Ok(CreateFunction {
5963 or_alter: false,
5964 or_replace,
5965 temporary,
5966 name,
5967 args: Some(args),
5968 return_type,
5969 behavior: body.behavior,
5970 called_on_null: body.called_on_null,
5971 parallel: body.parallel,
5972 security: body.security,
5973 set_params,
5974 language: body.language,
5975 function_body: body.function_body,
5976 if_not_exists: false,
5977 using: None,
5978 determinism_specifier: None,
5979 options: None,
5980 remote_connection: None,
5981 })
5982 }
5983
5984 fn parse_hive_create_function(
5988 &mut self,
5989 or_replace: bool,
5990 temporary: bool,
5991 ) -> Result<CreateFunction, ParserError> {
5992 let name = self.parse_object_name(false)?;
5993 self.expect_keyword_is(Keyword::AS)?;
5994
5995 let body = self.parse_create_function_body_string()?;
5996 let using = self.parse_optional_create_function_using()?;
5997
5998 Ok(CreateFunction {
5999 or_alter: false,
6000 or_replace,
6001 temporary,
6002 name,
6003 function_body: Some(body),
6004 using,
6005 if_not_exists: false,
6006 args: None,
6007 return_type: None,
6008 behavior: None,
6009 called_on_null: None,
6010 parallel: None,
6011 security: None,
6012 set_params: vec![],
6013 language: None,
6014 determinism_specifier: None,
6015 options: None,
6016 remote_connection: None,
6017 })
6018 }
6019
6020 fn parse_bigquery_create_function(
6024 &mut self,
6025 or_replace: bool,
6026 temporary: bool,
6027 ) -> Result<CreateFunction, ParserError> {
6028 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6029 let (name, args) = self.parse_create_function_name_and_params()?;
6030
6031 let return_type = if self.parse_keyword(Keyword::RETURNS) {
6032 Some(self.parse_function_return_type()?)
6033 } else {
6034 None
6035 };
6036
6037 let determinism_specifier = if self.parse_keyword(Keyword::DETERMINISTIC) {
6038 Some(FunctionDeterminismSpecifier::Deterministic)
6039 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DETERMINISTIC]) {
6040 Some(FunctionDeterminismSpecifier::NotDeterministic)
6041 } else {
6042 None
6043 };
6044
6045 let language = if self.parse_keyword(Keyword::LANGUAGE) {
6046 Some(self.parse_identifier()?)
6047 } else {
6048 None
6049 };
6050
6051 let remote_connection =
6052 if self.parse_keywords(&[Keyword::REMOTE, Keyword::WITH, Keyword::CONNECTION]) {
6053 Some(self.parse_object_name(false)?)
6054 } else {
6055 None
6056 };
6057
6058 let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
6061
6062 let function_body = if remote_connection.is_none() {
6063 self.expect_keyword_is(Keyword::AS)?;
6064 let expr = self.parse_expr()?;
6065 if options.is_none() {
6066 options = self.maybe_parse_options(Keyword::OPTIONS)?;
6067 Some(CreateFunctionBody::AsBeforeOptions {
6068 body: expr,
6069 link_symbol: None,
6070 })
6071 } else {
6072 Some(CreateFunctionBody::AsAfterOptions(expr))
6073 }
6074 } else {
6075 None
6076 };
6077
6078 Ok(CreateFunction {
6079 or_alter: false,
6080 or_replace,
6081 temporary,
6082 if_not_exists,
6083 name,
6084 args: Some(args),
6085 return_type,
6086 function_body,
6087 language,
6088 determinism_specifier,
6089 options,
6090 remote_connection,
6091 using: None,
6092 behavior: None,
6093 called_on_null: None,
6094 parallel: None,
6095 security: None,
6096 set_params: vec![],
6097 })
6098 }
6099
6100 fn parse_mssql_create_function(
6104 &mut self,
6105 or_alter: bool,
6106 or_replace: bool,
6107 temporary: bool,
6108 ) -> Result<CreateFunction, ParserError> {
6109 let (name, args) = self.parse_create_function_name_and_params()?;
6110
6111 self.expect_keyword(Keyword::RETURNS)?;
6112
6113 let return_table = self.maybe_parse(|p| {
6114 let return_table_name = p.parse_identifier()?;
6115
6116 p.expect_keyword_is(Keyword::TABLE)?;
6117 p.prev_token();
6118
6119 let table_column_defs = match p.parse_data_type()? {
6120 DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
6121 table_column_defs
6122 }
6123 _ => parser_err!(
6124 "Expected table column definitions after TABLE keyword",
6125 p.peek_token_ref().span.start
6126 )?,
6127 };
6128
6129 Ok(DataType::NamedTable {
6130 name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
6131 columns: table_column_defs,
6132 })
6133 })?;
6134
6135 let data_type = match return_table {
6136 Some(table_type) => table_type,
6137 None => self.parse_data_type()?,
6138 };
6139 let return_type = Some(FunctionReturnType::DataType(data_type));
6140
6141 let _ = self.parse_keyword(Keyword::AS);
6142
6143 let function_body = if self.peek_keyword(Keyword::BEGIN) {
6144 let begin_token = self.expect_keyword(Keyword::BEGIN)?;
6145 let statements = self.parse_statement_list(&[Keyword::END])?;
6146 let end_token = self.expect_keyword(Keyword::END)?;
6147
6148 Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
6149 begin_token: AttachedToken(begin_token),
6150 statements,
6151 end_token: AttachedToken(end_token),
6152 }))
6153 } else if self.parse_keyword(Keyword::RETURN) {
6154 if self.peek_token_ref().token == Token::LParen {
6155 Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
6156 } else if self.peek_keyword(Keyword::SELECT) {
6157 let select = self.parse_select()?;
6158 Some(CreateFunctionBody::AsReturnSelect(select))
6159 } else {
6160 parser_err!(
6161 "Expected a subquery (or bare SELECT statement) after RETURN",
6162 self.peek_token_ref().span.start
6163 )?
6164 }
6165 } else {
6166 parser_err!("Unparsable function body", self.peek_token_ref().span.start)?
6167 };
6168
6169 Ok(CreateFunction {
6170 or_alter,
6171 or_replace,
6172 temporary,
6173 if_not_exists: false,
6174 name,
6175 args: Some(args),
6176 return_type,
6177 function_body,
6178 language: None,
6179 determinism_specifier: None,
6180 options: None,
6181 remote_connection: None,
6182 using: None,
6183 behavior: None,
6184 called_on_null: None,
6185 parallel: None,
6186 security: None,
6187 set_params: vec![],
6188 })
6189 }
6190
6191 fn parse_function_return_type(&mut self) -> Result<FunctionReturnType, ParserError> {
6192 if self.parse_keyword(Keyword::SETOF) {
6193 Ok(FunctionReturnType::SetOf(self.parse_data_type()?))
6194 } else {
6195 Ok(FunctionReturnType::DataType(self.parse_data_type()?))
6196 }
6197 }
6198
6199 fn parse_create_function_name_and_params(
6200 &mut self,
6201 ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
6202 let name = self.parse_object_name(false)?;
6203 let parse_function_param =
6204 |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
6205 let name = parser.parse_identifier()?;
6206 let data_type = parser.parse_data_type()?;
6207 let default_expr = if parser.consume_token(&Token::Eq) {
6208 Some(parser.parse_expr()?)
6209 } else {
6210 None
6211 };
6212
6213 Ok(OperateFunctionArg {
6214 mode: None,
6215 name: Some(name),
6216 data_type,
6217 default_expr,
6218 })
6219 };
6220 self.expect_token(&Token::LParen)?;
6221 let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
6222 self.expect_token(&Token::RParen)?;
6223 Ok((name, args))
6224 }
6225
6226 fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6227 let mode = if self.parse_keyword(Keyword::IN) {
6228 Some(ArgMode::In)
6229 } else if self.parse_keyword(Keyword::OUT) {
6230 Some(ArgMode::Out)
6231 } else if self.parse_keyword(Keyword::INOUT) {
6232 Some(ArgMode::InOut)
6233 } else if self.parse_keyword(Keyword::VARIADIC) {
6234 Some(ArgMode::Variadic)
6235 } else {
6236 None
6237 };
6238
6239 let mut name = None;
6241 let mut data_type = self.parse_data_type()?;
6242
6243 let data_type_idx = self.get_current_index();
6247
6248 fn parse_data_type_no_default(parser: &mut Parser) -> Result<DataType, ParserError> {
6250 if parser.peek_keyword(Keyword::DEFAULT) {
6251 parser_err!(
6253 "The DEFAULT keyword is not a type",
6254 parser.peek_token_ref().span.start
6255 )
6256 } else {
6257 parser.parse_data_type()
6258 }
6259 }
6260
6261 if let Some(next_data_type) = self.maybe_parse(parse_data_type_no_default)? {
6262 let token = self.token_at(data_type_idx).clone();
6263
6264 match token.token {
6266 Token::Word(word) => name = Some(word.into_ident(token.span)),
6267 _ => return self.expected("a name or type", token),
6268 }
6269
6270 data_type = next_data_type;
6271 }
6272
6273 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
6274 {
6275 Some(self.parse_expr()?)
6276 } else {
6277 None
6278 };
6279 Ok(OperateFunctionArg {
6280 mode,
6281 name,
6282 data_type,
6283 default_expr,
6284 })
6285 }
6286
6287 fn parse_aggregate_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
6288 let mode = if self.parse_keyword(Keyword::IN) {
6289 Some(ArgMode::In)
6290 } else {
6291 if self
6292 .peek_one_of_keywords(&[Keyword::OUT, Keyword::INOUT, Keyword::VARIADIC])
6293 .is_some()
6294 {
6295 return self.expected_ref(
6296 "IN or argument type in aggregate signature",
6297 self.peek_token_ref(),
6298 );
6299 }
6300 None
6301 };
6302
6303 let mut name = None;
6306 let mut data_type = self.parse_data_type()?;
6307 let data_type_idx = self.get_current_index();
6308
6309 fn parse_data_type_for_aggregate_arg(parser: &mut Parser) -> Result<DataType, ParserError> {
6310 if parser.peek_keyword(Keyword::DEFAULT)
6311 || parser.peek_keyword(Keyword::ORDER)
6312 || parser.peek_token_ref().token == Token::Comma
6313 || parser.peek_token_ref().token == Token::RParen
6314 {
6315 parser_err!(
6317 "The current token cannot start an aggregate argument type",
6318 parser.peek_token_ref().span.start
6319 )
6320 } else {
6321 parser.parse_data_type()
6322 }
6323 }
6324
6325 if let Some(next_data_type) = self.maybe_parse(parse_data_type_for_aggregate_arg)? {
6326 let token = self.token_at(data_type_idx).clone();
6327 match token.token {
6328 Token::Word(word) => name = Some(word.into_ident(token.span)),
6329 _ => return self.expected("a name or type", token),
6330 }
6331
6332 data_type = next_data_type;
6333 }
6334
6335 if self.peek_keyword(Keyword::DEFAULT) || self.peek_token_ref().token == Token::Eq {
6336 return self.expected_ref(
6337 "',' or ')' or ORDER BY after aggregate argument type",
6338 self.peek_token_ref(),
6339 );
6340 }
6341
6342 Ok(OperateFunctionArg {
6343 mode,
6344 name,
6345 data_type,
6346 default_expr: None,
6347 })
6348 }
6349
6350 pub fn parse_drop_trigger(&mut self) -> Result<DropTrigger, ParserError> {
6356 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6357 {
6358 self.prev_token();
6359 return self.expected_ref("an object type after DROP", self.peek_token_ref());
6360 }
6361 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
6362 let trigger_name = self.parse_object_name(false)?;
6363 let table_name = if self.parse_keyword(Keyword::ON) {
6364 Some(self.parse_object_name(false)?)
6365 } else {
6366 None
6367 };
6368 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
6369 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
6370 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
6371 Some(unexpected_keyword) => return Err(ParserError::ParserError(
6372 format!("Internal parser error: expected any of {{CASCADE, RESTRICT}}, got {unexpected_keyword:?}"),
6373 )),
6374 None => None,
6375 };
6376 Ok(DropTrigger {
6377 if_exists,
6378 trigger_name,
6379 table_name,
6380 option,
6381 })
6382 }
6383
6384 pub fn parse_create_trigger(
6386 &mut self,
6387 temporary: bool,
6388 or_alter: bool,
6389 or_replace: bool,
6390 is_constraint: bool,
6391 ) -> Result<CreateTrigger, ParserError> {
6392 if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | GenericDialect | MySqlDialect | MsSqlDialect)
6393 {
6394 self.prev_token();
6395 return self.expected_ref("an object type after CREATE", self.peek_token_ref());
6396 }
6397
6398 let name = self.parse_object_name(false)?;
6399 let period = self.maybe_parse(|parser| parser.parse_trigger_period())?;
6400
6401 let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
6402 self.expect_keyword_is(Keyword::ON)?;
6403 let table_name = self.parse_object_name(false)?;
6404
6405 let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
6406 self.parse_object_name(true).ok()
6407 } else {
6408 None
6409 };
6410
6411 let characteristics = self.parse_constraint_characteristics()?;
6412
6413 let mut referencing = vec![];
6414 if self.parse_keyword(Keyword::REFERENCING) {
6415 while let Some(refer) = self.parse_trigger_referencing()? {
6416 referencing.push(refer);
6417 }
6418 }
6419
6420 let trigger_object = if self.parse_keyword(Keyword::FOR) {
6421 let include_each = self.parse_keyword(Keyword::EACH);
6422 let trigger_object =
6423 match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
6424 Keyword::ROW => TriggerObject::Row,
6425 Keyword::STATEMENT => TriggerObject::Statement,
6426 unexpected_keyword => return Err(ParserError::ParserError(
6427 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in ROW/STATEMENT"),
6428 )),
6429 };
6430
6431 Some(if include_each {
6432 TriggerObjectKind::ForEach(trigger_object)
6433 } else {
6434 TriggerObjectKind::For(trigger_object)
6435 })
6436 } else {
6437 let _ = self.parse_keyword(Keyword::FOR);
6438
6439 None
6440 };
6441
6442 let condition = self
6443 .parse_keyword(Keyword::WHEN)
6444 .then(|| self.parse_expr())
6445 .transpose()?;
6446
6447 let mut exec_body = None;
6448 let mut statements = None;
6449 if self.parse_keyword(Keyword::EXECUTE) {
6450 exec_body = Some(self.parse_trigger_exec_body()?);
6451 } else {
6452 statements = Some(self.parse_conditional_statements(&[Keyword::END])?);
6453 }
6454
6455 Ok(CreateTrigger {
6456 or_alter,
6457 temporary,
6458 or_replace,
6459 is_constraint,
6460 name,
6461 period,
6462 period_before_table: true,
6463 events,
6464 table_name,
6465 referenced_table_name,
6466 referencing,
6467 trigger_object,
6468 condition,
6469 exec_body,
6470 statements_as: false,
6471 statements,
6472 characteristics,
6473 })
6474 }
6475
6476 pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
6478 Ok(
6479 match self.expect_one_of_keywords(&[
6480 Keyword::FOR,
6481 Keyword::BEFORE,
6482 Keyword::AFTER,
6483 Keyword::INSTEAD,
6484 ])? {
6485 Keyword::FOR => TriggerPeriod::For,
6486 Keyword::BEFORE => TriggerPeriod::Before,
6487 Keyword::AFTER => TriggerPeriod::After,
6488 Keyword::INSTEAD => self
6489 .expect_keyword_is(Keyword::OF)
6490 .map(|_| TriggerPeriod::InsteadOf)?,
6491 unexpected_keyword => return Err(ParserError::ParserError(
6492 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger period"),
6493 )),
6494 },
6495 )
6496 }
6497
6498 pub fn parse_trigger_event(&mut self) -> Result<TriggerEvent, ParserError> {
6500 Ok(
6501 match self.expect_one_of_keywords(&[
6502 Keyword::INSERT,
6503 Keyword::UPDATE,
6504 Keyword::DELETE,
6505 Keyword::TRUNCATE,
6506 ])? {
6507 Keyword::INSERT => TriggerEvent::Insert,
6508 Keyword::UPDATE => {
6509 if self.parse_keyword(Keyword::OF) {
6510 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
6511 TriggerEvent::Update(cols)
6512 } else {
6513 TriggerEvent::Update(vec![])
6514 }
6515 }
6516 Keyword::DELETE => TriggerEvent::Delete,
6517 Keyword::TRUNCATE => TriggerEvent::Truncate,
6518 unexpected_keyword => return Err(ParserError::ParserError(
6519 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger event"),
6520 )),
6521 },
6522 )
6523 }
6524
6525 pub fn parse_trigger_referencing(&mut self) -> Result<Option<TriggerReferencing>, ParserError> {
6527 let refer_type = match self.parse_one_of_keywords(&[Keyword::OLD, Keyword::NEW]) {
6528 Some(Keyword::OLD) if self.parse_keyword(Keyword::TABLE) => {
6529 TriggerReferencingType::OldTable
6530 }
6531 Some(Keyword::NEW) if self.parse_keyword(Keyword::TABLE) => {
6532 TriggerReferencingType::NewTable
6533 }
6534 _ => {
6535 return Ok(None);
6536 }
6537 };
6538
6539 let is_as = self.parse_keyword(Keyword::AS);
6540 let transition_relation_name = self.parse_object_name(false)?;
6541 Ok(Some(TriggerReferencing {
6542 refer_type,
6543 is_as,
6544 transition_relation_name,
6545 }))
6546 }
6547
6548 pub fn parse_trigger_exec_body(&mut self) -> Result<TriggerExecBody, ParserError> {
6550 Ok(TriggerExecBody {
6551 exec_type: match self
6552 .expect_one_of_keywords(&[Keyword::FUNCTION, Keyword::PROCEDURE])?
6553 {
6554 Keyword::FUNCTION => TriggerExecBodyType::Function,
6555 Keyword::PROCEDURE => TriggerExecBodyType::Procedure,
6556 unexpected_keyword => return Err(ParserError::ParserError(
6557 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in trigger exec body"),
6558 )),
6559 },
6560 func_desc: self.parse_function_desc()?,
6561 })
6562 }
6563
6564 pub fn parse_create_macro(
6566 &mut self,
6567 or_replace: bool,
6568 temporary: bool,
6569 ) -> Result<Statement, ParserError> {
6570 if dialect_of!(self is DuckDbDialect | GenericDialect) {
6571 let name = self.parse_object_name(false)?;
6572 self.expect_token(&Token::LParen)?;
6573 let args = if self.consume_token(&Token::RParen) {
6574 self.prev_token();
6575 None
6576 } else {
6577 Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
6578 };
6579
6580 self.expect_token(&Token::RParen)?;
6581 self.expect_keyword_is(Keyword::AS)?;
6582
6583 Ok(Statement::CreateMacro {
6584 or_replace,
6585 temporary,
6586 name,
6587 args,
6588 definition: if self.parse_keyword(Keyword::TABLE) {
6589 MacroDefinition::Table(self.parse_query()?)
6590 } else {
6591 MacroDefinition::Expr(self.parse_expr()?)
6592 },
6593 })
6594 } else {
6595 self.prev_token();
6596 self.expected_ref("an object type after CREATE", self.peek_token_ref())
6597 }
6598 }
6599
6600 fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
6601 let name = self.parse_identifier()?;
6602
6603 let default_expr =
6604 if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
6605 Some(self.parse_expr()?)
6606 } else {
6607 None
6608 };
6609 Ok(MacroArg { name, default_expr })
6610 }
6611
6612 pub fn parse_create_external_table(
6614 &mut self,
6615 or_replace: bool,
6616 ) -> Result<CreateTable, ParserError> {
6617 self.expect_keyword_is(Keyword::TABLE)?;
6618 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6619 let table_name = self.parse_object_name(false)?;
6620 let (columns, constraints) = self.parse_columns()?;
6621
6622 let hive_distribution = self.parse_hive_distribution()?;
6623 let hive_formats = self.parse_hive_formats()?;
6624
6625 let file_format = if let Some(ref hf) = hive_formats {
6626 if let Some(ref ff) = hf.storage {
6627 match ff {
6628 HiveIOFormat::FileFormat { format } => Some(*format),
6629 _ => None,
6630 }
6631 } else {
6632 None
6633 }
6634 } else {
6635 None
6636 };
6637 let location = hive_formats.as_ref().and_then(|hf| hf.location.clone());
6638
6639 let with_connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
6640 Some(self.parse_object_name(false)?)
6641 } else {
6642 None
6643 };
6644 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
6645 let table_options = if !table_properties.is_empty() {
6646 CreateTableOptions::TableProperties(table_properties)
6647 } else if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6648 CreateTableOptions::Options(options)
6649 } else {
6650 CreateTableOptions::None
6651 };
6652 Ok(CreateTableBuilder::new(table_name)
6653 .columns(columns)
6654 .constraints(constraints)
6655 .hive_distribution(hive_distribution)
6656 .hive_formats(hive_formats)
6657 .table_options(table_options)
6658 .with_connection(with_connection)
6659 .or_replace(or_replace)
6660 .if_not_exists(if_not_exists)
6661 .external(true)
6662 .file_format(file_format)
6663 .location(location)
6664 .build())
6665 }
6666
6667 pub fn parse_create_snapshot_table(&mut self) -> Result<CreateTable, ParserError> {
6671 self.expect_keywords(&[Keyword::SNAPSHOT, Keyword::TABLE])?;
6672 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6673 let table_name = self.parse_object_name(true)?;
6674
6675 self.expect_keyword_is(Keyword::CLONE)?;
6676 let clone = Some(self.parse_object_name(true)?);
6677
6678 let version =
6679 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
6680 {
6681 Some(TableVersion::ForSystemTimeAsOf(self.parse_expr()?))
6682 } else {
6683 None
6684 };
6685
6686 let table_options = if let Some(options) = self.maybe_parse_options(Keyword::OPTIONS)? {
6687 CreateTableOptions::Options(options)
6688 } else {
6689 CreateTableOptions::None
6690 };
6691
6692 Ok(CreateTableBuilder::new(table_name)
6693 .snapshot(true)
6694 .if_not_exists(if_not_exists)
6695 .clone_clause(clone)
6696 .version(version)
6697 .table_options(table_options)
6698 .build())
6699 }
6700
6701 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
6703 let next_token = self.next_token();
6704 match &next_token.token {
6705 Token::Word(w) => match w.keyword {
6706 Keyword::AVRO => Ok(FileFormat::AVRO),
6707 Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
6708 Keyword::ORC => Ok(FileFormat::ORC),
6709 Keyword::PARQUET => Ok(FileFormat::PARQUET),
6710 Keyword::RCFILE => Ok(FileFormat::RCFILE),
6711 Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
6712 Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
6713 _ => self.expected("fileformat", next_token),
6714 },
6715 _ => self.expected("fileformat", next_token),
6716 }
6717 }
6718
6719 fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
6720 if self.consume_token(&Token::Eq) {
6721 Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
6722 } else {
6723 Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
6724 }
6725 }
6726
6727 pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
6729 let next_token = self.next_token();
6730 match &next_token.token {
6731 Token::Word(w) => match w.keyword {
6732 Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
6733 Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
6734 Keyword::JSON => Ok(AnalyzeFormat::JSON),
6735 Keyword::TREE => Ok(AnalyzeFormat::TREE),
6736 _ => self.expected("fileformat", next_token),
6737 },
6738 _ => self.expected("fileformat", next_token),
6739 }
6740 }
6741
6742 pub fn parse_create_view(
6744 &mut self,
6745 or_alter: bool,
6746 or_replace: bool,
6747 temporary: bool,
6748 create_view_params: Option<CreateViewParams>,
6749 ) -> Result<CreateView, ParserError> {
6750 let secure = self.parse_keyword(Keyword::SECURE);
6751 let materialized = self.parse_keyword(Keyword::MATERIALIZED);
6752 self.expect_keyword_is(Keyword::VIEW)?;
6753 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
6754 let if_not_exists_first =
6757 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6758 let name = self.parse_object_name(allow_unquoted_hyphen)?;
6759 let name_before_not_exists = !if_not_exists_first
6760 && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6761 let if_not_exists = if_not_exists_first || name_before_not_exists;
6762 let mut copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6763 let columns = self.parse_view_columns()?;
6766 if !copy_grants {
6770 copy_grants = self.parse_keywords(&[Keyword::COPY, Keyword::GRANTS]);
6771 }
6772 let mut options = CreateTableOptions::None;
6773 let with_options = self.parse_options(Keyword::WITH)?;
6774 if !with_options.is_empty() {
6775 options = CreateTableOptions::With(with_options);
6776 }
6777
6778 let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
6779 self.expect_keyword_is(Keyword::BY)?;
6780 self.parse_parenthesized_column_list(Optional, false)?
6781 } else {
6782 vec![]
6783 };
6784
6785 if dialect_of!(self is BigQueryDialect | GenericDialect) {
6786 if let Some(opts) = self.maybe_parse_options(Keyword::OPTIONS)? {
6787 if !opts.is_empty() {
6788 options = CreateTableOptions::Options(opts);
6789 }
6790 };
6791 }
6792
6793 let to = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6794 && self.parse_keyword(Keyword::TO)
6795 {
6796 Some(self.parse_object_name(false)?)
6797 } else {
6798 None
6799 };
6800
6801 let comment = if self.dialect.supports_create_view_comment_syntax()
6802 && self.parse_keyword(Keyword::COMMENT)
6803 {
6804 self.expect_token(&Token::Eq)?;
6805 Some(self.parse_comment_value()?)
6806 } else {
6807 None
6808 };
6809
6810 self.expect_keyword_is(Keyword::AS)?;
6811 let query = self.parse_query()?;
6812 let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
6815 && self.parse_keywords(&[
6816 Keyword::WITH,
6817 Keyword::NO,
6818 Keyword::SCHEMA,
6819 Keyword::BINDING,
6820 ]);
6821
6822 Ok(CreateView {
6823 or_alter,
6824 name,
6825 columns,
6826 query,
6827 materialized,
6828 secure,
6829 or_replace,
6830 options,
6831 cluster_by,
6832 comment,
6833 with_no_schema_binding,
6834 if_not_exists,
6835 temporary,
6836 copy_grants,
6837 to,
6838 params: create_view_params,
6839 name_before_not_exists,
6840 })
6841 }
6842
6843 fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
6847 let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
6848 self.expect_token(&Token::Eq)?;
6849 Some(
6850 match self.expect_one_of_keywords(&[
6851 Keyword::UNDEFINED,
6852 Keyword::MERGE,
6853 Keyword::TEMPTABLE,
6854 ])? {
6855 Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
6856 Keyword::MERGE => CreateViewAlgorithm::Merge,
6857 Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
6858 _ => {
6859 self.prev_token();
6860 let found = self.next_token();
6861 return self
6862 .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
6863 }
6864 },
6865 )
6866 } else {
6867 None
6868 };
6869 let definer = if self.parse_keyword(Keyword::DEFINER) {
6870 self.expect_token(&Token::Eq)?;
6871 Some(self.parse_grantee_name()?)
6872 } else {
6873 None
6874 };
6875 let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
6876 Some(
6877 match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
6878 Keyword::DEFINER => CreateViewSecurity::Definer,
6879 Keyword::INVOKER => CreateViewSecurity::Invoker,
6880 _ => {
6881 self.prev_token();
6882 let found = self.next_token();
6883 return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
6884 }
6885 },
6886 )
6887 } else {
6888 None
6889 };
6890 if algorithm.is_some() || definer.is_some() || security.is_some() {
6891 Ok(Some(CreateViewParams {
6892 algorithm,
6893 definer,
6894 security,
6895 }))
6896 } else {
6897 Ok(None)
6898 }
6899 }
6900
6901 pub fn parse_create_role(&mut self) -> Result<CreateRole, ParserError> {
6903 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
6904 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6905
6906 let _ = self.parse_keyword(Keyword::WITH); let optional_keywords = if dialect_of!(self is MsSqlDialect) {
6909 vec![Keyword::AUTHORIZATION]
6910 } else if dialect_of!(self is PostgreSqlDialect) {
6911 vec![
6912 Keyword::LOGIN,
6913 Keyword::NOLOGIN,
6914 Keyword::INHERIT,
6915 Keyword::NOINHERIT,
6916 Keyword::BYPASSRLS,
6917 Keyword::NOBYPASSRLS,
6918 Keyword::PASSWORD,
6919 Keyword::CREATEDB,
6920 Keyword::NOCREATEDB,
6921 Keyword::CREATEROLE,
6922 Keyword::NOCREATEROLE,
6923 Keyword::SUPERUSER,
6924 Keyword::NOSUPERUSER,
6925 Keyword::REPLICATION,
6926 Keyword::NOREPLICATION,
6927 Keyword::CONNECTION,
6928 Keyword::VALID,
6929 Keyword::IN,
6930 Keyword::ROLE,
6931 Keyword::ADMIN,
6932 Keyword::USER,
6933 ]
6934 } else {
6935 vec![]
6936 };
6937
6938 let mut authorization_owner = None;
6940 let mut login = None;
6942 let mut inherit = None;
6943 let mut bypassrls = None;
6944 let mut password = None;
6945 let mut create_db = None;
6946 let mut create_role = None;
6947 let mut superuser = None;
6948 let mut replication = None;
6949 let mut connection_limit = None;
6950 let mut valid_until = None;
6951 let mut in_role = vec![];
6952 let mut in_group = vec![];
6953 let mut role = vec![];
6954 let mut user = vec![];
6955 let mut admin = vec![];
6956
6957 while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
6958 let loc = self
6959 .tokens
6960 .get(self.index - 1)
6961 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
6962 match keyword {
6963 Keyword::AUTHORIZATION => {
6964 if authorization_owner.is_some() {
6965 parser_err!("Found multiple AUTHORIZATION", loc)
6966 } else {
6967 authorization_owner = Some(self.parse_object_name(false)?);
6968 Ok(())
6969 }
6970 }
6971 Keyword::LOGIN | Keyword::NOLOGIN => {
6972 if login.is_some() {
6973 parser_err!("Found multiple LOGIN or NOLOGIN", loc)
6974 } else {
6975 login = Some(keyword == Keyword::LOGIN);
6976 Ok(())
6977 }
6978 }
6979 Keyword::INHERIT | Keyword::NOINHERIT => {
6980 if inherit.is_some() {
6981 parser_err!("Found multiple INHERIT or NOINHERIT", loc)
6982 } else {
6983 inherit = Some(keyword == Keyword::INHERIT);
6984 Ok(())
6985 }
6986 }
6987 Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
6988 if bypassrls.is_some() {
6989 parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
6990 } else {
6991 bypassrls = Some(keyword == Keyword::BYPASSRLS);
6992 Ok(())
6993 }
6994 }
6995 Keyword::CREATEDB | Keyword::NOCREATEDB => {
6996 if create_db.is_some() {
6997 parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
6998 } else {
6999 create_db = Some(keyword == Keyword::CREATEDB);
7000 Ok(())
7001 }
7002 }
7003 Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
7004 if create_role.is_some() {
7005 parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
7006 } else {
7007 create_role = Some(keyword == Keyword::CREATEROLE);
7008 Ok(())
7009 }
7010 }
7011 Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
7012 if superuser.is_some() {
7013 parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
7014 } else {
7015 superuser = Some(keyword == Keyword::SUPERUSER);
7016 Ok(())
7017 }
7018 }
7019 Keyword::REPLICATION | Keyword::NOREPLICATION => {
7020 if replication.is_some() {
7021 parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
7022 } else {
7023 replication = Some(keyword == Keyword::REPLICATION);
7024 Ok(())
7025 }
7026 }
7027 Keyword::PASSWORD => {
7028 if password.is_some() {
7029 parser_err!("Found multiple PASSWORD", loc)
7030 } else {
7031 password = if self.parse_keyword(Keyword::NULL) {
7032 Some(Password::NullPassword)
7033 } else {
7034 Some(Password::Password(Expr::Value(self.parse_value()?)))
7035 };
7036 Ok(())
7037 }
7038 }
7039 Keyword::CONNECTION => {
7040 self.expect_keyword_is(Keyword::LIMIT)?;
7041 if connection_limit.is_some() {
7042 parser_err!("Found multiple CONNECTION LIMIT", loc)
7043 } else {
7044 connection_limit = Some(Expr::Value(self.parse_number_value()?));
7045 Ok(())
7046 }
7047 }
7048 Keyword::VALID => {
7049 self.expect_keyword_is(Keyword::UNTIL)?;
7050 if valid_until.is_some() {
7051 parser_err!("Found multiple VALID UNTIL", loc)
7052 } else {
7053 valid_until = Some(Expr::Value(self.parse_value()?));
7054 Ok(())
7055 }
7056 }
7057 Keyword::IN => {
7058 if self.parse_keyword(Keyword::ROLE) {
7059 if !in_role.is_empty() {
7060 parser_err!("Found multiple IN ROLE", loc)
7061 } else {
7062 in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
7063 Ok(())
7064 }
7065 } else if self.parse_keyword(Keyword::GROUP) {
7066 if !in_group.is_empty() {
7067 parser_err!("Found multiple IN GROUP", loc)
7068 } else {
7069 in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
7070 Ok(())
7071 }
7072 } else {
7073 self.expected_ref("ROLE or GROUP after IN", self.peek_token_ref())
7074 }
7075 }
7076 Keyword::ROLE => {
7077 if !role.is_empty() {
7078 parser_err!("Found multiple ROLE", loc)
7079 } else {
7080 role = self.parse_comma_separated(|p| p.parse_identifier())?;
7081 Ok(())
7082 }
7083 }
7084 Keyword::USER => {
7085 if !user.is_empty() {
7086 parser_err!("Found multiple USER", loc)
7087 } else {
7088 user = self.parse_comma_separated(|p| p.parse_identifier())?;
7089 Ok(())
7090 }
7091 }
7092 Keyword::ADMIN => {
7093 if !admin.is_empty() {
7094 parser_err!("Found multiple ADMIN", loc)
7095 } else {
7096 admin = self.parse_comma_separated(|p| p.parse_identifier())?;
7097 Ok(())
7098 }
7099 }
7100 _ => break,
7101 }?
7102 }
7103
7104 Ok(CreateRole {
7105 names,
7106 if_not_exists,
7107 login,
7108 inherit,
7109 bypassrls,
7110 password,
7111 create_db,
7112 create_role,
7113 replication,
7114 superuser,
7115 connection_limit,
7116 valid_until,
7117 in_role,
7118 in_group,
7119 role,
7120 user,
7121 admin,
7122 authorization_owner,
7123 })
7124 }
7125
7126 pub fn parse_owner(&mut self) -> Result<Owner, ParserError> {
7128 let owner = match self.parse_one_of_keywords(&[Keyword::CURRENT_USER, Keyword::CURRENT_ROLE, Keyword::SESSION_USER]) {
7129 Some(Keyword::CURRENT_USER) => Owner::CurrentUser,
7130 Some(Keyword::CURRENT_ROLE) => Owner::CurrentRole,
7131 Some(Keyword::SESSION_USER) => Owner::SessionUser,
7132 Some(unexpected_keyword) => return Err(ParserError::ParserError(
7133 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in owner"),
7134 )),
7135 None => {
7136 match self.parse_identifier() {
7137 Ok(ident) => Owner::Ident(ident),
7138 Err(e) => {
7139 return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
7140 }
7141 }
7142 }
7143 };
7144 Ok(owner)
7145 }
7146
7147 fn parse_create_domain(&mut self) -> Result<CreateDomain, ParserError> {
7149 let name = self.parse_object_name(false)?;
7150 self.expect_keyword_is(Keyword::AS)?;
7151 let data_type = self.parse_data_type()?;
7152 let collation = if self.parse_keyword(Keyword::COLLATE) {
7153 Some(self.parse_identifier()?)
7154 } else {
7155 None
7156 };
7157 let default = if self.parse_keyword(Keyword::DEFAULT) {
7158 Some(self.parse_expr()?)
7159 } else {
7160 None
7161 };
7162 let mut constraints = Vec::new();
7163 while let Some(constraint) = self.parse_optional_table_constraint()? {
7164 constraints.push(constraint);
7165 }
7166
7167 Ok(CreateDomain {
7168 name,
7169 data_type,
7170 collation,
7171 default,
7172 constraints,
7173 })
7174 }
7175
7176 pub fn parse_create_policy(&mut self) -> Result<CreatePolicy, ParserError> {
7186 let name = self.parse_identifier()?;
7187 self.expect_keyword_is(Keyword::ON)?;
7188 let table_name = self.parse_object_name(false)?;
7189
7190 let policy_type = if self.parse_keyword(Keyword::AS) {
7191 let keyword =
7192 self.expect_one_of_keywords(&[Keyword::PERMISSIVE, Keyword::RESTRICTIVE])?;
7193 Some(match keyword {
7194 Keyword::PERMISSIVE => CreatePolicyType::Permissive,
7195 Keyword::RESTRICTIVE => CreatePolicyType::Restrictive,
7196 unexpected_keyword => return Err(ParserError::ParserError(
7197 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy type"),
7198 )),
7199 })
7200 } else {
7201 None
7202 };
7203
7204 let command = if self.parse_keyword(Keyword::FOR) {
7205 let keyword = self.expect_one_of_keywords(&[
7206 Keyword::ALL,
7207 Keyword::SELECT,
7208 Keyword::INSERT,
7209 Keyword::UPDATE,
7210 Keyword::DELETE,
7211 ])?;
7212 Some(match keyword {
7213 Keyword::ALL => CreatePolicyCommand::All,
7214 Keyword::SELECT => CreatePolicyCommand::Select,
7215 Keyword::INSERT => CreatePolicyCommand::Insert,
7216 Keyword::UPDATE => CreatePolicyCommand::Update,
7217 Keyword::DELETE => CreatePolicyCommand::Delete,
7218 unexpected_keyword => return Err(ParserError::ParserError(
7219 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in policy command"),
7220 )),
7221 })
7222 } else {
7223 None
7224 };
7225
7226 let to = if self.parse_keyword(Keyword::TO) {
7227 Some(self.parse_comma_separated(|p| p.parse_owner())?)
7228 } else {
7229 None
7230 };
7231
7232 let using = if self.parse_keyword(Keyword::USING) {
7233 self.expect_token(&Token::LParen)?;
7234 let expr = self.parse_expr()?;
7235 self.expect_token(&Token::RParen)?;
7236 Some(expr)
7237 } else {
7238 None
7239 };
7240
7241 let with_check = if self.parse_keywords(&[Keyword::WITH, Keyword::CHECK]) {
7242 self.expect_token(&Token::LParen)?;
7243 let expr = self.parse_expr()?;
7244 self.expect_token(&Token::RParen)?;
7245 Some(expr)
7246 } else {
7247 None
7248 };
7249
7250 Ok(CreatePolicy {
7251 name,
7252 table_name,
7253 policy_type,
7254 command,
7255 to,
7256 using,
7257 with_check,
7258 })
7259 }
7260
7261 pub fn parse_create_connector(&mut self) -> Result<CreateConnector, ParserError> {
7271 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
7272 let name = self.parse_identifier()?;
7273
7274 let connector_type = if self.parse_keyword(Keyword::TYPE) {
7275 Some(self.parse_literal_string()?)
7276 } else {
7277 None
7278 };
7279
7280 let url = if self.parse_keyword(Keyword::URL) {
7281 Some(self.parse_literal_string()?)
7282 } else {
7283 None
7284 };
7285
7286 let comment = self.parse_optional_inline_comment()?;
7287
7288 let with_dcproperties =
7289 match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
7290 properties if !properties.is_empty() => Some(properties),
7291 _ => None,
7292 };
7293
7294 Ok(CreateConnector {
7295 name,
7296 if_not_exists,
7297 connector_type,
7298 url,
7299 comment,
7300 with_dcproperties,
7301 })
7302 }
7303
7304 fn parse_operator_name(&mut self) -> Result<ObjectName, ParserError> {
7310 let mut parts = vec![];
7311 loop {
7312 parts.push(ObjectNamePart::Identifier(Ident::new(
7313 self.next_token().to_string(),
7314 )));
7315 if !self.consume_token(&Token::Period) {
7316 break;
7317 }
7318 }
7319 Ok(ObjectName(parts))
7320 }
7321
7322 pub fn parse_create_operator(&mut self) -> Result<CreateOperator, ParserError> {
7326 let name = self.parse_operator_name()?;
7327 self.expect_token(&Token::LParen)?;
7328
7329 let mut function: Option<ObjectName> = None;
7330 let mut is_procedure = false;
7331 let mut left_arg: Option<DataType> = None;
7332 let mut right_arg: Option<DataType> = None;
7333 let mut options: Vec<OperatorOption> = Vec::new();
7334
7335 loop {
7336 let keyword = self.expect_one_of_keywords(&[
7337 Keyword::FUNCTION,
7338 Keyword::PROCEDURE,
7339 Keyword::LEFTARG,
7340 Keyword::RIGHTARG,
7341 Keyword::COMMUTATOR,
7342 Keyword::NEGATOR,
7343 Keyword::RESTRICT,
7344 Keyword::JOIN,
7345 Keyword::HASHES,
7346 Keyword::MERGES,
7347 ])?;
7348
7349 match keyword {
7350 Keyword::HASHES if !options.iter().any(|o| matches!(o, OperatorOption::Hashes)) => {
7351 options.push(OperatorOption::Hashes);
7352 }
7353 Keyword::MERGES if !options.iter().any(|o| matches!(o, OperatorOption::Merges)) => {
7354 options.push(OperatorOption::Merges);
7355 }
7356 Keyword::FUNCTION | Keyword::PROCEDURE if function.is_none() => {
7357 self.expect_token(&Token::Eq)?;
7358 function = Some(self.parse_object_name(false)?);
7359 is_procedure = keyword == Keyword::PROCEDURE;
7360 }
7361 Keyword::LEFTARG if left_arg.is_none() => {
7362 self.expect_token(&Token::Eq)?;
7363 left_arg = Some(self.parse_data_type()?);
7364 }
7365 Keyword::RIGHTARG if right_arg.is_none() => {
7366 self.expect_token(&Token::Eq)?;
7367 right_arg = Some(self.parse_data_type()?);
7368 }
7369 Keyword::COMMUTATOR
7370 if !options
7371 .iter()
7372 .any(|o| matches!(o, OperatorOption::Commutator(_))) =>
7373 {
7374 self.expect_token(&Token::Eq)?;
7375 if self.parse_keyword(Keyword::OPERATOR) {
7376 self.expect_token(&Token::LParen)?;
7377 let op = self.parse_operator_name()?;
7378 self.expect_token(&Token::RParen)?;
7379 options.push(OperatorOption::Commutator(op));
7380 } else {
7381 options.push(OperatorOption::Commutator(self.parse_operator_name()?));
7382 }
7383 }
7384 Keyword::NEGATOR
7385 if !options
7386 .iter()
7387 .any(|o| matches!(o, OperatorOption::Negator(_))) =>
7388 {
7389 self.expect_token(&Token::Eq)?;
7390 if self.parse_keyword(Keyword::OPERATOR) {
7391 self.expect_token(&Token::LParen)?;
7392 let op = self.parse_operator_name()?;
7393 self.expect_token(&Token::RParen)?;
7394 options.push(OperatorOption::Negator(op));
7395 } else {
7396 options.push(OperatorOption::Negator(self.parse_operator_name()?));
7397 }
7398 }
7399 Keyword::RESTRICT
7400 if !options
7401 .iter()
7402 .any(|o| matches!(o, OperatorOption::Restrict(_))) =>
7403 {
7404 self.expect_token(&Token::Eq)?;
7405 options.push(OperatorOption::Restrict(Some(
7406 self.parse_object_name(false)?,
7407 )));
7408 }
7409 Keyword::JOIN if !options.iter().any(|o| matches!(o, OperatorOption::Join(_))) => {
7410 self.expect_token(&Token::Eq)?;
7411 options.push(OperatorOption::Join(Some(self.parse_object_name(false)?)));
7412 }
7413 _ => {
7414 return Err(ParserError::ParserError(format!(
7415 "Duplicate or unexpected keyword {:?} in CREATE OPERATOR",
7416 keyword
7417 )))
7418 }
7419 }
7420
7421 if !self.consume_token(&Token::Comma) {
7422 break;
7423 }
7424 }
7425
7426 self.expect_token(&Token::RParen)?;
7428
7429 let function = function.ok_or_else(|| {
7431 ParserError::ParserError("CREATE OPERATOR requires FUNCTION parameter".to_string())
7432 })?;
7433
7434 Ok(CreateOperator {
7435 name,
7436 function,
7437 is_procedure,
7438 left_arg,
7439 right_arg,
7440 options,
7441 })
7442 }
7443
7444 pub fn parse_create_operator_family(&mut self) -> Result<CreateOperatorFamily, ParserError> {
7448 let name = self.parse_object_name(false)?;
7449 self.expect_keyword(Keyword::USING)?;
7450 let using = self.parse_identifier()?;
7451
7452 Ok(CreateOperatorFamily { name, using })
7453 }
7454
7455 pub fn parse_create_operator_class(&mut self) -> Result<CreateOperatorClass, ParserError> {
7459 let name = self.parse_object_name(false)?;
7460 let default = self.parse_keyword(Keyword::DEFAULT);
7461 self.expect_keywords(&[Keyword::FOR, Keyword::TYPE])?;
7462 let for_type = self.parse_data_type()?;
7463 self.expect_keyword(Keyword::USING)?;
7464 let using = self.parse_identifier()?;
7465
7466 let family = if self.parse_keyword(Keyword::FAMILY) {
7467 Some(self.parse_object_name(false)?)
7468 } else {
7469 None
7470 };
7471
7472 self.expect_keyword(Keyword::AS)?;
7473
7474 let mut items = vec![];
7475 loop {
7476 if self.parse_keyword(Keyword::OPERATOR) {
7477 let strategy_number = self.parse_literal_uint()?;
7478 let operator_name = self.parse_operator_name()?;
7479
7480 let op_types = if self.consume_token(&Token::LParen) {
7482 let left = self.parse_data_type()?;
7483 self.expect_token(&Token::Comma)?;
7484 let right = self.parse_data_type()?;
7485 self.expect_token(&Token::RParen)?;
7486 Some(OperatorArgTypes { left, right })
7487 } else {
7488 None
7489 };
7490
7491 let purpose = if self.parse_keyword(Keyword::FOR) {
7493 if self.parse_keyword(Keyword::SEARCH) {
7494 Some(OperatorPurpose::ForSearch)
7495 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
7496 let sort_family = self.parse_object_name(false)?;
7497 Some(OperatorPurpose::ForOrderBy { sort_family })
7498 } else {
7499 return self
7500 .expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
7501 }
7502 } else {
7503 None
7504 };
7505
7506 items.push(OperatorClassItem::Operator {
7507 strategy_number,
7508 operator_name,
7509 op_types,
7510 purpose,
7511 });
7512 } else if self.parse_keyword(Keyword::FUNCTION) {
7513 let support_number = self.parse_literal_uint()?;
7514
7515 let op_types = if self.consume_token(&Token::LParen)
7517 && self.peek_token_ref().token != Token::RParen
7518 {
7519 let mut types = vec![];
7520 loop {
7521 types.push(self.parse_data_type()?);
7522 if !self.consume_token(&Token::Comma) {
7523 break;
7524 }
7525 }
7526 self.expect_token(&Token::RParen)?;
7527 Some(types)
7528 } else if self.consume_token(&Token::LParen) {
7529 self.expect_token(&Token::RParen)?;
7530 Some(vec![])
7531 } else {
7532 None
7533 };
7534
7535 let function_name = self.parse_object_name(false)?;
7536
7537 let argument_types = if self.consume_token(&Token::LParen) {
7539 let mut types = vec![];
7540 loop {
7541 if self.peek_token_ref().token == Token::RParen {
7542 break;
7543 }
7544 types.push(self.parse_data_type()?);
7545 if !self.consume_token(&Token::Comma) {
7546 break;
7547 }
7548 }
7549 self.expect_token(&Token::RParen)?;
7550 types
7551 } else {
7552 vec![]
7553 };
7554
7555 items.push(OperatorClassItem::Function {
7556 support_number,
7557 op_types,
7558 function_name,
7559 argument_types,
7560 });
7561 } else if self.parse_keyword(Keyword::STORAGE) {
7562 let storage_type = self.parse_data_type()?;
7563 items.push(OperatorClassItem::Storage { storage_type });
7564 } else {
7565 break;
7566 }
7567
7568 if !self.consume_token(&Token::Comma) {
7570 break;
7571 }
7572 }
7573
7574 Ok(CreateOperatorClass {
7575 name,
7576 default,
7577 for_type,
7578 using,
7579 family,
7580 items,
7581 })
7582 }
7583
7584 pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
7586 let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
7588 && self.parse_keyword(Keyword::TEMPORARY);
7589 let persistent = dialect_of!(self is DuckDbDialect)
7590 && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
7591
7592 let object_type = if self.parse_keyword(Keyword::TABLE) {
7593 ObjectType::Table
7594 } else if self.parse_keyword(Keyword::COLLATION) {
7595 ObjectType::Collation
7596 } else if self.parse_keyword(Keyword::VIEW) {
7597 ObjectType::View
7598 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
7599 ObjectType::MaterializedView
7600 } else if self.parse_keyword(Keyword::INDEX) {
7601 ObjectType::Index
7602 } else if self.parse_keyword(Keyword::ROLE) {
7603 ObjectType::Role
7604 } else if self.parse_keyword(Keyword::SCHEMA) {
7605 ObjectType::Schema
7606 } else if self.parse_keyword(Keyword::DATABASE) {
7607 ObjectType::Database
7608 } else if self.parse_keyword(Keyword::SEQUENCE) {
7609 ObjectType::Sequence
7610 } else if self.parse_keyword(Keyword::STAGE) {
7611 ObjectType::Stage
7612 } else if self.parse_keyword(Keyword::TYPE) {
7613 ObjectType::Type
7614 } else if self.parse_keyword(Keyword::USER) {
7615 ObjectType::User
7616 } else if self.parse_keyword(Keyword::STREAM) {
7617 ObjectType::Stream
7618 } else if self.parse_keyword(Keyword::WAREHOUSE) {
7619 ObjectType::Warehouse
7620 } else if self.parse_keyword(Keyword::FUNCTION) {
7621 return self.parse_drop_function().map(Into::into);
7622 } else if self.parse_keyword(Keyword::POLICY) {
7623 return self.parse_drop_policy().map(Into::into);
7624 } else if self.parse_keyword(Keyword::CONNECTOR) {
7625 return self.parse_drop_connector();
7626 } else if self.parse_keyword(Keyword::DOMAIN) {
7627 return self.parse_drop_domain().map(Into::into);
7628 } else if self.parse_keyword(Keyword::PROCEDURE) {
7629 return self.parse_drop_procedure();
7630 } else if self.parse_keyword(Keyword::SECRET) {
7631 return self.parse_drop_secret(temporary, persistent);
7632 } else if self.parse_keyword(Keyword::TRIGGER) {
7633 return self.parse_drop_trigger().map(Into::into);
7634 } else if self.parse_keyword(Keyword::EXTENSION) {
7635 return self.parse_drop_extension();
7636 } else if self.parse_keyword(Keyword::OPERATOR) {
7637 return if self.parse_keyword(Keyword::FAMILY) {
7639 self.parse_drop_operator_family()
7640 } else if self.parse_keyword(Keyword::CLASS) {
7641 self.parse_drop_operator_class()
7642 } else {
7643 self.parse_drop_operator()
7644 };
7645 } else {
7646 return self.expected_ref(
7647 "COLLATION, CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW, USER or WAREHOUSE after DROP",
7648 self.peek_token_ref(),
7649 );
7650 };
7651 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7654 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
7655
7656 let loc = self.peek_token_ref().span.start;
7657 let cascade = self.parse_keyword(Keyword::CASCADE);
7658 let restrict = self.parse_keyword(Keyword::RESTRICT);
7659 let purge = self.parse_keyword(Keyword::PURGE);
7660 if cascade && restrict {
7661 return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
7662 }
7663 if object_type == ObjectType::Role && (cascade || restrict || purge) {
7664 return parser_err!(
7665 "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
7666 loc
7667 );
7668 }
7669 let table = if self.parse_keyword(Keyword::ON) {
7670 Some(self.parse_object_name(false)?)
7671 } else {
7672 None
7673 };
7674 Ok(Statement::Drop {
7675 object_type,
7676 if_exists,
7677 names,
7678 cascade,
7679 restrict,
7680 purge,
7681 temporary,
7682 table,
7683 })
7684 }
7685
7686 fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
7687 match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
7688 Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
7689 Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
7690 _ => None,
7691 }
7692 }
7693
7694 fn parse_drop_function(&mut self) -> Result<DropFunction, ParserError> {
7699 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7700 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7701 let drop_behavior = self.parse_optional_drop_behavior();
7702 Ok(DropFunction {
7703 if_exists,
7704 func_desc,
7705 drop_behavior,
7706 })
7707 }
7708
7709 fn parse_drop_policy(&mut self) -> Result<DropPolicy, ParserError> {
7715 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7716 let name = self.parse_identifier()?;
7717 self.expect_keyword_is(Keyword::ON)?;
7718 let table_name = self.parse_object_name(false)?;
7719 let drop_behavior = self.parse_optional_drop_behavior();
7720 Ok(DropPolicy {
7721 if_exists,
7722 name,
7723 table_name,
7724 drop_behavior,
7725 })
7726 }
7727 fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
7733 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7734 let name = self.parse_identifier()?;
7735 Ok(Statement::DropConnector { if_exists, name })
7736 }
7737
7738 fn parse_drop_domain(&mut self) -> Result<DropDomain, ParserError> {
7742 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7743 let name = self.parse_object_name(false)?;
7744 let drop_behavior = self.parse_optional_drop_behavior();
7745 Ok(DropDomain {
7746 if_exists,
7747 name,
7748 drop_behavior,
7749 })
7750 }
7751
7752 fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
7757 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7758 let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
7759 let drop_behavior = self.parse_optional_drop_behavior();
7760 Ok(Statement::DropProcedure {
7761 if_exists,
7762 proc_desc,
7763 drop_behavior,
7764 })
7765 }
7766
7767 fn parse_function_desc(&mut self) -> Result<FunctionDesc, ParserError> {
7768 let name = self.parse_object_name(false)?;
7769
7770 let args = if self.consume_token(&Token::LParen) {
7771 if self.consume_token(&Token::RParen) {
7772 Some(vec![])
7773 } else {
7774 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
7775 self.expect_token(&Token::RParen)?;
7776 Some(args)
7777 }
7778 } else {
7779 None
7780 };
7781
7782 Ok(FunctionDesc { name, args })
7783 }
7784
7785 fn parse_drop_secret(
7787 &mut self,
7788 temporary: bool,
7789 persistent: bool,
7790 ) -> Result<Statement, ParserError> {
7791 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
7792 let name = self.parse_identifier()?;
7793 let storage_specifier = if self.parse_keyword(Keyword::FROM) {
7794 self.parse_identifier().ok()
7795 } else {
7796 None
7797 };
7798 let temp = match (temporary, persistent) {
7799 (true, false) => Some(true),
7800 (false, true) => Some(false),
7801 (false, false) => None,
7802 _ => self.expected_ref("TEMPORARY or PERSISTENT", self.peek_token_ref())?,
7803 };
7804
7805 Ok(Statement::DropSecret {
7806 if_exists,
7807 temporary: temp,
7808 name,
7809 storage_specifier,
7810 })
7811 }
7812
7813 pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
7823 if dialect_of!(self is BigQueryDialect) {
7824 return self.parse_big_query_declare();
7825 }
7826 if dialect_of!(self is SnowflakeDialect) {
7827 return self.parse_snowflake_declare();
7828 }
7829 if dialect_of!(self is MsSqlDialect) {
7830 return self.parse_mssql_declare();
7831 }
7832
7833 let name = self.parse_identifier()?;
7834
7835 let binary = Some(self.parse_keyword(Keyword::BINARY));
7836 let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
7837 Some(true)
7838 } else if self.parse_keyword(Keyword::ASENSITIVE) {
7839 Some(false)
7840 } else {
7841 None
7842 };
7843 let scroll = if self.parse_keyword(Keyword::SCROLL) {
7844 Some(true)
7845 } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
7846 Some(false)
7847 } else {
7848 None
7849 };
7850
7851 self.expect_keyword_is(Keyword::CURSOR)?;
7852 let declare_type = Some(DeclareType::Cursor);
7853
7854 let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
7855 Some(keyword) => {
7856 self.expect_keyword_is(Keyword::HOLD)?;
7857
7858 match keyword {
7859 Keyword::WITH => Some(true),
7860 Keyword::WITHOUT => Some(false),
7861 unexpected_keyword => return Err(ParserError::ParserError(
7862 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in cursor hold"),
7863 )),
7864 }
7865 }
7866 None => None,
7867 };
7868
7869 self.expect_keyword_is(Keyword::FOR)?;
7870
7871 let query = Some(self.parse_query()?);
7872
7873 Ok(Statement::Declare {
7874 stmts: vec![Declare {
7875 names: vec![name],
7876 data_type: None,
7877 assignment: None,
7878 declare_type,
7879 binary,
7880 sensitive,
7881 scroll,
7882 hold,
7883 for_query: query,
7884 }],
7885 })
7886 }
7887
7888 pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
7896 let names = self.parse_comma_separated(Parser::parse_identifier)?;
7897
7898 let data_type = match &self.peek_token_ref().token {
7899 Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
7900 _ => Some(self.parse_data_type()?),
7901 };
7902
7903 let expr = if data_type.is_some() {
7904 if self.parse_keyword(Keyword::DEFAULT) {
7905 Some(self.parse_expr()?)
7906 } else {
7907 None
7908 }
7909 } else {
7910 self.expect_keyword_is(Keyword::DEFAULT)?;
7913 Some(self.parse_expr()?)
7914 };
7915
7916 Ok(Statement::Declare {
7917 stmts: vec![Declare {
7918 names,
7919 data_type,
7920 assignment: expr.map(|expr| DeclareAssignment::Default(Box::new(expr))),
7921 declare_type: None,
7922 binary: None,
7923 sensitive: None,
7924 scroll: None,
7925 hold: None,
7926 for_query: None,
7927 }],
7928 })
7929 }
7930
7931 pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
7956 let mut stmts = vec![];
7957 loop {
7958 let name = self.parse_identifier()?;
7959 let (declare_type, for_query, assigned_expr, data_type) =
7960 if self.parse_keyword(Keyword::CURSOR) {
7961 self.expect_keyword_is(Keyword::FOR)?;
7962 match &self.peek_token_ref().token {
7963 Token::Word(w) if w.keyword == Keyword::SELECT => (
7964 Some(DeclareType::Cursor),
7965 Some(self.parse_query()?),
7966 None,
7967 None,
7968 ),
7969 _ => (
7970 Some(DeclareType::Cursor),
7971 None,
7972 Some(DeclareAssignment::For(Box::new(self.parse_expr()?))),
7973 None,
7974 ),
7975 }
7976 } else if self.parse_keyword(Keyword::RESULTSET) {
7977 let assigned_expr = if self.peek_token_ref().token != Token::SemiColon {
7978 self.parse_snowflake_variable_declaration_expression()?
7979 } else {
7980 None
7982 };
7983
7984 (Some(DeclareType::ResultSet), None, assigned_expr, None)
7985 } else if self.parse_keyword(Keyword::EXCEPTION) {
7986 let assigned_expr = if self.peek_token_ref().token == Token::LParen {
7987 Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
7988 } else {
7989 None
7991 };
7992
7993 (Some(DeclareType::Exception), None, assigned_expr, None)
7994 } else {
7995 let (assigned_expr, data_type) = if let Some(assigned_expr) =
7997 self.parse_snowflake_variable_declaration_expression()?
7998 {
7999 (Some(assigned_expr), None)
8000 } else if let Token::Word(_) = &self.peek_token_ref().token {
8001 let data_type = self.parse_data_type()?;
8002 (
8003 self.parse_snowflake_variable_declaration_expression()?,
8004 Some(data_type),
8005 )
8006 } else {
8007 (None, None)
8008 };
8009 (None, None, assigned_expr, data_type)
8010 };
8011 let stmt = Declare {
8012 names: vec![name],
8013 data_type,
8014 assignment: assigned_expr,
8015 declare_type,
8016 binary: None,
8017 sensitive: None,
8018 scroll: None,
8019 hold: None,
8020 for_query,
8021 };
8022
8023 stmts.push(stmt);
8024 if self.consume_token(&Token::SemiColon) {
8025 match &self.peek_token_ref().token {
8026 Token::Word(w)
8027 if ALL_KEYWORDS
8028 .binary_search(&w.value.to_uppercase().as_str())
8029 .is_err() =>
8030 {
8031 continue;
8033 }
8034 _ => {
8035 self.prev_token();
8037 }
8038 }
8039 }
8040
8041 break;
8042 }
8043
8044 Ok(Statement::Declare { stmts })
8045 }
8046
8047 pub fn parse_mssql_declare(&mut self) -> Result<Statement, ParserError> {
8059 let stmts = self.parse_comma_separated(Parser::parse_mssql_declare_stmt)?;
8060
8061 Ok(Statement::Declare { stmts })
8062 }
8063
8064 pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
8075 let name = {
8076 let ident = self.parse_identifier()?;
8077 if !ident.value.starts_with('@')
8078 && !matches!(
8079 &self.peek_token_ref().token,
8080 Token::Word(w) if w.keyword == Keyword::CURSOR
8081 )
8082 {
8083 Err(ParserError::TokenizerError(
8084 "Invalid MsSql variable declaration.".to_string(),
8085 ))
8086 } else {
8087 Ok(ident)
8088 }
8089 }?;
8090
8091 let (declare_type, data_type) = match &self.peek_token_ref().token {
8092 Token::Word(w) => match w.keyword {
8093 Keyword::CURSOR => {
8094 self.next_token();
8095 (Some(DeclareType::Cursor), None)
8096 }
8097 Keyword::AS => {
8098 self.next_token();
8099 (None, Some(self.parse_data_type()?))
8100 }
8101 _ => (None, Some(self.parse_data_type()?)),
8102 },
8103 _ => (None, Some(self.parse_data_type()?)),
8104 };
8105
8106 let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
8107 self.next_token();
8108 let query = Some(self.parse_query()?);
8109 (query, None)
8110 } else {
8111 let assignment = self.parse_mssql_variable_declaration_expression()?;
8112 (None, assignment)
8113 };
8114
8115 Ok(Declare {
8116 names: vec![name],
8117 data_type,
8118 assignment,
8119 declare_type,
8120 binary: None,
8121 sensitive: None,
8122 scroll: None,
8123 hold: None,
8124 for_query,
8125 })
8126 }
8127
8128 pub fn parse_snowflake_variable_declaration_expression(
8136 &mut self,
8137 ) -> Result<Option<DeclareAssignment>, ParserError> {
8138 Ok(match &self.peek_token_ref().token {
8139 Token::Word(w) if w.keyword == Keyword::DEFAULT => {
8140 self.next_token(); Some(DeclareAssignment::Default(Box::new(self.parse_expr()?)))
8142 }
8143 Token::Assignment => {
8144 self.next_token(); Some(DeclareAssignment::DuckAssignment(Box::new(
8146 self.parse_expr()?,
8147 )))
8148 }
8149 _ => None,
8150 })
8151 }
8152
8153 pub fn parse_mssql_variable_declaration_expression(
8160 &mut self,
8161 ) -> Result<Option<DeclareAssignment>, ParserError> {
8162 Ok(match &self.peek_token_ref().token {
8163 Token::Eq => {
8164 self.next_token(); Some(DeclareAssignment::MsSqlAssignment(Box::new(
8166 self.parse_expr()?,
8167 )))
8168 }
8169 _ => None,
8170 })
8171 }
8172
8173 pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
8175 let direction = if self.parse_keyword(Keyword::NEXT) {
8176 FetchDirection::Next
8177 } else if self.parse_keyword(Keyword::PRIOR) {
8178 FetchDirection::Prior
8179 } else if self.parse_keyword(Keyword::FIRST) {
8180 FetchDirection::First
8181 } else if self.parse_keyword(Keyword::LAST) {
8182 FetchDirection::Last
8183 } else if self.parse_keyword(Keyword::ABSOLUTE) {
8184 FetchDirection::Absolute {
8185 limit: self.parse_number_value()?,
8186 }
8187 } else if self.parse_keyword(Keyword::RELATIVE) {
8188 FetchDirection::Relative {
8189 limit: self.parse_number_value()?,
8190 }
8191 } else if self.parse_keyword(Keyword::FORWARD) {
8192 if self.parse_keyword(Keyword::ALL) {
8193 FetchDirection::ForwardAll
8194 } else {
8195 FetchDirection::Forward {
8196 limit: Some(self.parse_number_value()?),
8198 }
8199 }
8200 } else if self.parse_keyword(Keyword::BACKWARD) {
8201 if self.parse_keyword(Keyword::ALL) {
8202 FetchDirection::BackwardAll
8203 } else {
8204 FetchDirection::Backward {
8205 limit: Some(self.parse_number_value()?),
8207 }
8208 }
8209 } else if self.parse_keyword(Keyword::ALL) {
8210 FetchDirection::All
8211 } else {
8212 FetchDirection::Count {
8213 limit: self.parse_number_value()?,
8214 }
8215 };
8216
8217 let position = if self.peek_keyword(Keyword::FROM) {
8218 self.expect_keyword(Keyword::FROM)?;
8219 FetchPosition::From
8220 } else if self.peek_keyword(Keyword::IN) {
8221 self.expect_keyword(Keyword::IN)?;
8222 FetchPosition::In
8223 } else {
8224 return parser_err!("Expected FROM or IN", self.peek_token_ref().span.start);
8225 };
8226
8227 let name = self.parse_identifier()?;
8228
8229 let into = if self.parse_keyword(Keyword::INTO) {
8230 Some(self.parse_object_name(false)?)
8231 } else {
8232 None
8233 };
8234
8235 Ok(Statement::Fetch {
8236 name,
8237 direction,
8238 position,
8239 into,
8240 })
8241 }
8242
8243 pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
8245 let object_type = if self.parse_keyword(Keyword::ALL) {
8246 DiscardObject::ALL
8247 } else if self.parse_keyword(Keyword::PLANS) {
8248 DiscardObject::PLANS
8249 } else if self.parse_keyword(Keyword::SEQUENCES) {
8250 DiscardObject::SEQUENCES
8251 } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
8252 DiscardObject::TEMP
8253 } else {
8254 return self.expected_ref(
8255 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
8256 self.peek_token_ref(),
8257 );
8258 };
8259 Ok(Statement::Discard { object_type })
8260 }
8261
8262 pub fn parse_create_index(&mut self, unique: bool) -> Result<CreateIndex, ParserError> {
8264 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
8265 let r#async = self.parse_keyword(Keyword::ASYNC);
8266 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8267
8268 let mut using = None;
8269
8270 let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
8271 let index_name = self.parse_object_name(false)?;
8272 using = self.parse_optional_using_then_index_type()?;
8274 self.expect_keyword_is(Keyword::ON)?;
8275 Some(index_name)
8276 } else {
8277 None
8278 };
8279
8280 let table_name = self.parse_object_name(false)?;
8281
8282 using = self.parse_optional_using_then_index_type()?.or(using);
8285
8286 let columns = self.parse_parenthesized_index_column_list()?;
8287
8288 let include = if self.parse_keyword(Keyword::INCLUDE) {
8289 self.expect_token(&Token::LParen)?;
8290 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
8291 self.expect_token(&Token::RParen)?;
8292 columns
8293 } else {
8294 vec![]
8295 };
8296
8297 let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
8298 let not = self.parse_keyword(Keyword::NOT);
8299 self.expect_keyword_is(Keyword::DISTINCT)?;
8300 Some(!not)
8301 } else {
8302 None
8303 };
8304
8305 let with = if self.dialect.supports_create_index_with_clause()
8306 && self.parse_keyword(Keyword::WITH)
8307 {
8308 self.expect_token(&Token::LParen)?;
8309 let with_params = self.parse_comma_separated(Parser::parse_expr)?;
8310 self.expect_token(&Token::RParen)?;
8311 with_params
8312 } else {
8313 Vec::new()
8314 };
8315
8316 let predicate = if self.parse_keyword(Keyword::WHERE) {
8317 Some(self.parse_expr()?)
8318 } else {
8319 None
8320 };
8321
8322 let index_options = self.parse_index_options()?;
8328
8329 let mut alter_options = Vec::new();
8331 while self
8332 .peek_one_of_keywords(&[Keyword::ALGORITHM, Keyword::LOCK])
8333 .is_some()
8334 {
8335 alter_options.push(self.parse_alter_table_operation()?)
8336 }
8337
8338 Ok(CreateIndex {
8339 name: index_name,
8340 table_name,
8341 using,
8342 columns,
8343 unique,
8344 concurrently,
8345 r#async,
8346 if_not_exists,
8347 include,
8348 nulls_distinct,
8349 with,
8350 predicate,
8351 index_options,
8352 alter_options,
8353 })
8354 }
8355
8356 pub fn parse_create_extension(&mut self) -> Result<CreateExtension, ParserError> {
8358 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8359 let name = self.parse_identifier()?;
8360
8361 let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
8362 let schema = if self.parse_keyword(Keyword::SCHEMA) {
8363 Some(self.parse_identifier()?)
8364 } else {
8365 None
8366 };
8367
8368 let version = if self.parse_keyword(Keyword::VERSION) {
8369 Some(self.parse_identifier()?)
8370 } else {
8371 None
8372 };
8373
8374 let cascade = self.parse_keyword(Keyword::CASCADE);
8375
8376 (schema, version, cascade)
8377 } else {
8378 (None, None, false)
8379 };
8380
8381 Ok(CreateExtension {
8382 name,
8383 if_not_exists,
8384 schema,
8385 version,
8386 cascade,
8387 })
8388 }
8389
8390 pub fn parse_create_collation(&mut self) -> Result<CreateCollation, ParserError> {
8392 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8393 let name = self.parse_object_name(false)?;
8394
8395 let definition = if self.parse_keyword(Keyword::FROM) {
8396 CreateCollationDefinition::From(self.parse_object_name(false)?)
8397 } else if self.consume_token(&Token::LParen) {
8398 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
8399 self.expect_token(&Token::RParen)?;
8400 CreateCollationDefinition::Options(options)
8401 } else {
8402 return self.expected_ref(
8403 "FROM or parenthesized option list after CREATE COLLATION name",
8404 self.peek_token_ref(),
8405 );
8406 };
8407
8408 Ok(CreateCollation {
8409 if_not_exists,
8410 name,
8411 definition,
8412 })
8413 }
8414
8415 pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
8417 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8418 let names = self.parse_comma_separated(|p| p.parse_identifier())?;
8419 let cascade_or_restrict =
8420 self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
8421 Ok(Statement::DropExtension(DropExtension {
8422 names,
8423 if_exists,
8424 cascade_or_restrict: cascade_or_restrict
8425 .map(|k| match k {
8426 Keyword::CASCADE => Ok(ReferentialAction::Cascade),
8427 Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
8428 _ => self.expected_ref("CASCADE or RESTRICT", self.peek_token_ref()),
8429 })
8430 .transpose()?,
8431 }))
8432 }
8433
8434 pub fn parse_drop_operator(&mut self) -> Result<Statement, ParserError> {
8437 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8438 let operators = self.parse_comma_separated(|p| p.parse_drop_operator_signature())?;
8439 let drop_behavior = self.parse_optional_drop_behavior();
8440 Ok(Statement::DropOperator(DropOperator {
8441 if_exists,
8442 operators,
8443 drop_behavior,
8444 }))
8445 }
8446
8447 fn parse_drop_operator_signature(&mut self) -> Result<DropOperatorSignature, ParserError> {
8450 let name = self.parse_operator_name()?;
8451 self.expect_token(&Token::LParen)?;
8452
8453 let left_type = if self.parse_keyword(Keyword::NONE) {
8455 None
8456 } else {
8457 Some(self.parse_data_type()?)
8458 };
8459
8460 self.expect_token(&Token::Comma)?;
8461
8462 let right_type = self.parse_data_type()?;
8464
8465 self.expect_token(&Token::RParen)?;
8466
8467 Ok(DropOperatorSignature {
8468 name,
8469 left_type,
8470 right_type,
8471 })
8472 }
8473
8474 pub fn parse_drop_operator_family(&mut self) -> Result<Statement, ParserError> {
8478 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8479 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8480 self.expect_keyword(Keyword::USING)?;
8481 let using = self.parse_identifier()?;
8482 let drop_behavior = self.parse_optional_drop_behavior();
8483 Ok(Statement::DropOperatorFamily(DropOperatorFamily {
8484 if_exists,
8485 names,
8486 using,
8487 drop_behavior,
8488 }))
8489 }
8490
8491 pub fn parse_drop_operator_class(&mut self) -> Result<Statement, ParserError> {
8495 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
8496 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
8497 self.expect_keyword(Keyword::USING)?;
8498 let using = self.parse_identifier()?;
8499 let drop_behavior = self.parse_optional_drop_behavior();
8500 Ok(Statement::DropOperatorClass(DropOperatorClass {
8501 if_exists,
8502 names,
8503 using,
8504 drop_behavior,
8505 }))
8506 }
8507
8508 pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
8512 if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
8513 self.expect_token(&Token::LParen)?;
8514 let columns =
8515 self.parse_comma_separated(|parser| parser.parse_column_def_inner(true))?;
8516 self.expect_token(&Token::RParen)?;
8517 Ok(HiveDistributionStyle::PARTITIONED { columns })
8518 } else {
8519 Ok(HiveDistributionStyle::NONE)
8520 }
8521 }
8522
8523 fn parse_dist_style(&mut self) -> Result<DistStyle, ParserError> {
8527 let token = self.next_token();
8528 match &token.token {
8529 Token::Word(w) => match w.keyword {
8530 Keyword::AUTO => Ok(DistStyle::Auto),
8531 Keyword::EVEN => Ok(DistStyle::Even),
8532 Keyword::KEY => Ok(DistStyle::Key),
8533 Keyword::ALL => Ok(DistStyle::All),
8534 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8535 },
8536 _ => self.expected("AUTO, EVEN, KEY, or ALL", token),
8537 }
8538 }
8539
8540 pub fn parse_hive_formats(&mut self) -> Result<Option<HiveFormat>, ParserError> {
8542 let mut hive_format: Option<HiveFormat> = None;
8543 loop {
8544 match self.parse_one_of_keywords(&[
8545 Keyword::ROW,
8546 Keyword::STORED,
8547 Keyword::LOCATION,
8548 Keyword::WITH,
8549 Keyword::USING,
8550 ]) {
8551 Some(Keyword::ROW) => {
8552 hive_format
8553 .get_or_insert_with(HiveFormat::default)
8554 .row_format = Some(self.parse_row_format()?);
8555 }
8556 Some(Keyword::STORED) => {
8557 self.expect_keyword_is(Keyword::AS)?;
8558 if self.parse_keyword(Keyword::INPUTFORMAT) {
8559 let input_format = self.parse_expr()?;
8560 self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
8561 let output_format = self.parse_expr()?;
8562 hive_format.get_or_insert_with(HiveFormat::default).storage =
8563 Some(HiveIOFormat::IOF {
8564 input_format,
8565 output_format,
8566 });
8567 } else {
8568 let format = self.parse_file_format()?;
8569 hive_format.get_or_insert_with(HiveFormat::default).storage =
8570 Some(HiveIOFormat::FileFormat { format });
8571 }
8572 }
8573 Some(Keyword::LOCATION) => {
8574 hive_format.get_or_insert_with(HiveFormat::default).location =
8575 Some(self.parse_literal_string()?);
8576 }
8577 Some(Keyword::WITH) => {
8578 self.prev_token();
8579 let properties = self
8580 .parse_options_with_keywords(&[Keyword::WITH, Keyword::SERDEPROPERTIES])?;
8581 if !properties.is_empty() {
8582 hive_format
8583 .get_or_insert_with(HiveFormat::default)
8584 .serde_properties = Some(properties);
8585 } else {
8586 break;
8587 }
8588 }
8589 Some(Keyword::USING) if self.dialect.supports_create_table_using() => {
8590 let format = self.parse_identifier()?;
8591 hive_format.get_or_insert_with(HiveFormat::default).storage =
8592 Some(HiveIOFormat::Using { format });
8593 }
8594 Some(Keyword::USING) => {
8595 self.prev_token();
8597 break;
8598 }
8599 None => break,
8600 _ => break,
8601 }
8602 }
8603
8604 Ok(hive_format)
8605 }
8606
8607 pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
8609 self.expect_keyword_is(Keyword::FORMAT)?;
8610 match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
8611 Some(Keyword::SERDE) => {
8612 let class = self.parse_literal_string()?;
8613 Ok(HiveRowFormat::SERDE { class })
8614 }
8615 _ => {
8616 let mut row_delimiters = vec![];
8617
8618 loop {
8619 match self.parse_one_of_keywords(&[
8620 Keyword::FIELDS,
8621 Keyword::COLLECTION,
8622 Keyword::MAP,
8623 Keyword::LINES,
8624 Keyword::NULL,
8625 ]) {
8626 Some(Keyword::FIELDS)
8627 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8628 {
8629 row_delimiters.push(HiveRowDelimiter {
8630 delimiter: HiveDelimiter::FieldsTerminatedBy,
8631 char: self.parse_identifier()?,
8632 });
8633
8634 if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
8635 row_delimiters.push(HiveRowDelimiter {
8636 delimiter: HiveDelimiter::FieldsEscapedBy,
8637 char: self.parse_identifier()?,
8638 });
8639 }
8640 }
8641 Some(Keyword::COLLECTION)
8642 if self.parse_keywords(&[
8643 Keyword::ITEMS,
8644 Keyword::TERMINATED,
8645 Keyword::BY,
8646 ]) =>
8647 {
8648 row_delimiters.push(HiveRowDelimiter {
8649 delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
8650 char: self.parse_identifier()?,
8651 });
8652 }
8653 Some(Keyword::MAP)
8654 if self.parse_keywords(&[
8655 Keyword::KEYS,
8656 Keyword::TERMINATED,
8657 Keyword::BY,
8658 ]) =>
8659 {
8660 row_delimiters.push(HiveRowDelimiter {
8661 delimiter: HiveDelimiter::MapKeysTerminatedBy,
8662 char: self.parse_identifier()?,
8663 });
8664 }
8665 Some(Keyword::LINES)
8666 if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) =>
8667 {
8668 row_delimiters.push(HiveRowDelimiter {
8669 delimiter: HiveDelimiter::LinesTerminatedBy,
8670 char: self.parse_identifier()?,
8671 });
8672 }
8673 Some(Keyword::NULL)
8674 if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) =>
8675 {
8676 row_delimiters.push(HiveRowDelimiter {
8677 delimiter: HiveDelimiter::NullDefinedAs,
8678 char: self.parse_identifier()?,
8679 });
8680 }
8681 Some(Keyword::NULL) => break,
8682 _ => {
8683 break;
8684 }
8685 }
8686 }
8687
8688 Ok(HiveRowFormat::DELIMITED {
8689 delimiters: row_delimiters,
8690 })
8691 }
8692 }
8693 }
8694
8695 fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
8696 if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
8697 Ok(Some(self.parse_identifier()?))
8698 } else {
8699 Ok(None)
8700 }
8701 }
8702
8703 #[allow(clippy::too_many_arguments)]
8705 pub fn parse_create_table(
8706 &mut self,
8707 or_replace: bool,
8708 temporary: bool,
8709 unlogged: bool,
8710 global: Option<bool>,
8711 transient: bool,
8712 volatile: bool,
8713 multiset: Option<bool>,
8714 ) -> Result<CreateTable, ParserError> {
8715 let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
8716 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8717 let table_name = self.parse_object_name(allow_unquoted_hyphen)?;
8718
8719 let fallback = if self.dialect.supports_leading_comma_before_table_options()
8720 && self.consume_token(&Token::Comma)
8721 {
8722 let fallback = self.maybe_parse_fallback()?;
8723 if fallback.is_none() {
8724 self.prev_token(); }
8726 fallback
8727 } else {
8728 None
8729 };
8730
8731 let partition_of = if self.parse_keywords(&[Keyword::PARTITION, Keyword::OF]) {
8742 Some(self.parse_object_name(allow_unquoted_hyphen)?)
8743 } else {
8744 None
8745 };
8746
8747 let on_cluster = self.parse_optional_on_cluster()?;
8749
8750 let like = self.maybe_parse_create_table_like(allow_unquoted_hyphen)?;
8751
8752 let clone = if self.parse_keyword(Keyword::CLONE) {
8753 self.parse_object_name(allow_unquoted_hyphen).ok()
8754 } else {
8755 None
8756 };
8757
8758 let (columns, constraints) = self.parse_columns()?;
8760 let comment_after_column_def =
8761 if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
8762 let next_token = self.next_token();
8763 match next_token.token {
8764 Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
8765 _ => self.expected("comment", next_token)?,
8766 }
8767 } else {
8768 None
8769 };
8770
8771 let for_values = if partition_of.is_some() {
8773 if self.peek_keyword(Keyword::FOR) || self.peek_keyword(Keyword::DEFAULT) {
8774 Some(self.parse_partition_for_values()?)
8775 } else {
8776 return self.expected_ref(
8777 "FOR VALUES or DEFAULT after PARTITION OF",
8778 self.peek_token_ref(),
8779 );
8780 }
8781 } else {
8782 None
8783 };
8784
8785 let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
8787
8788 let hive_distribution = self.parse_hive_distribution()?;
8789 let clustered_by = self.parse_optional_clustered_by()?;
8790 let hive_formats = self.parse_hive_formats()?;
8791
8792 let create_table_config = self.parse_optional_create_table_config()?;
8793
8794 let primary_key = if dialect_of!(self is ClickHouseDialect | GenericDialect)
8797 && self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
8798 {
8799 Some(Box::new(self.parse_expr()?))
8800 } else {
8801 None
8802 };
8803
8804 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8805 if self.consume_token(&Token::LParen) {
8806 let columns = if self.peek_token_ref().token != Token::RParen {
8807 self.parse_comma_separated(|p| p.parse_expr())?
8808 } else {
8809 vec![]
8810 };
8811 self.expect_token(&Token::RParen)?;
8812 Some(OneOrManyWithParens::Many(columns))
8813 } else {
8814 Some(OneOrManyWithParens::One(self.parse_expr()?))
8815 }
8816 } else {
8817 None
8818 };
8819
8820 let partition_by = if create_table_config.partition_by.is_none()
8823 && self.dialect.supports_partition_by_after_order_by()
8824 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
8825 {
8826 Some(Box::new(self.parse_expr()?))
8827 } else {
8828 create_table_config.partition_by
8829 };
8830
8831 let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
8832 Some(self.parse_create_table_on_commit()?)
8833 } else {
8834 None
8835 };
8836
8837 let strict = self.parse_keyword(Keyword::STRICT);
8838
8839 let backup = if self.parse_keyword(Keyword::BACKUP) {
8841 let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8842 Some(keyword == Keyword::YES)
8843 } else {
8844 None
8845 };
8846
8847 let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
8849 Some(self.parse_dist_style()?)
8850 } else {
8851 None
8852 };
8853 let distkey = if self.parse_keyword(Keyword::DISTKEY) {
8854 self.expect_token(&Token::LParen)?;
8855 let expr = self.parse_expr()?;
8856 self.expect_token(&Token::RParen)?;
8857 Some(expr)
8858 } else {
8859 None
8860 };
8861 let sortkey = if self.parse_keyword(Keyword::SORTKEY) {
8862 self.expect_token(&Token::LParen)?;
8863 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
8864 self.expect_token(&Token::RParen)?;
8865 Some(columns)
8866 } else {
8867 None
8868 };
8869
8870 let query = if self.parse_keyword(Keyword::AS) {
8872 Some(self.parse_query()?)
8873 } else if self.dialect.supports_create_table_select() && self.parse_keyword(Keyword::SELECT)
8874 {
8875 self.prev_token();
8877 Some(self.parse_query()?)
8878 } else {
8879 None
8880 };
8881
8882 let with_data = if query.is_some() {
8884 self.maybe_parse_with_data()?
8885 } else {
8886 None
8887 };
8888
8889 Ok(CreateTableBuilder::new(table_name)
8890 .temporary(temporary)
8891 .unlogged(unlogged)
8892 .columns(columns)
8893 .constraints(constraints)
8894 .or_replace(or_replace)
8895 .if_not_exists(if_not_exists)
8896 .transient(transient)
8897 .volatile(volatile)
8898 .multiset(multiset)
8899 .fallback(fallback)
8900 .hive_distribution(hive_distribution)
8901 .hive_formats(hive_formats)
8902 .global(global)
8903 .query(query)
8904 .without_rowid(without_rowid)
8905 .like(like)
8906 .clone_clause(clone)
8907 .comment_after_column_def(comment_after_column_def)
8908 .order_by(order_by)
8909 .on_commit(on_commit)
8910 .on_cluster(on_cluster)
8911 .clustered_by(clustered_by)
8912 .partition_by(partition_by)
8913 .cluster_by(create_table_config.cluster_by)
8914 .inherits(create_table_config.inherits)
8915 .partition_of(partition_of)
8916 .for_values(for_values)
8917 .table_options(create_table_config.table_options)
8918 .primary_key(primary_key)
8919 .with_data(with_data)
8920 .strict(strict)
8921 .backup(backup)
8922 .diststyle(diststyle)
8923 .distkey(distkey)
8924 .sortkey(sortkey)
8925 .build())
8926 }
8927
8928 fn maybe_parse_multiset(&mut self) -> Option<bool> {
8930 match self.parse_one_of_keywords(&[Keyword::SET, Keyword::MULTISET]) {
8931 Some(Keyword::MULTISET) => Some(true),
8932 Some(Keyword::SET) => Some(false),
8933 _ => None,
8934 }
8935 }
8936
8937 fn maybe_parse_fallback(&mut self) -> Result<Option<bool>, ParserError> {
8939 if self.parse_keywords(&[Keyword::NO, Keyword::FALLBACK]) {
8940 Ok(Some(false))
8941 } else if self.parse_keyword(Keyword::FALLBACK) {
8942 Ok(Some(true))
8943 } else {
8944 Ok(None)
8945 }
8946 }
8947
8948 fn maybe_parse_with_data(&mut self) -> Result<Option<WithData>, ParserError> {
8950 let data = if self.parse_keywords(&[Keyword::WITH, Keyword::DATA]) {
8951 true
8952 } else if self.parse_keywords(&[Keyword::WITH, Keyword::NO, Keyword::DATA]) {
8953 false
8954 } else {
8955 return Ok(None);
8956 };
8957
8958 let statistics = if self.parse_keywords(&[Keyword::AND, Keyword::STATISTICS]) {
8959 Some(true)
8960 } else if self.parse_keywords(&[Keyword::AND, Keyword::NO, Keyword::STATISTICS]) {
8961 Some(false)
8962 } else {
8963 None
8964 };
8965
8966 Ok(Some(WithData { data, statistics }))
8967 }
8968
8969 fn maybe_parse_create_table_like(
8970 &mut self,
8971 allow_unquoted_hyphen: bool,
8972 ) -> Result<Option<CreateTableLikeKind>, ParserError> {
8973 let like = if self.dialect.supports_create_table_like_parenthesized()
8974 && self.consume_token(&Token::LParen)
8975 {
8976 if self.parse_keyword(Keyword::LIKE) {
8977 let name = self.parse_object_name(allow_unquoted_hyphen)?;
8978 let defaults = if self.parse_keywords(&[Keyword::INCLUDING, Keyword::DEFAULTS]) {
8979 Some(CreateTableLikeDefaults::Including)
8980 } else if self.parse_keywords(&[Keyword::EXCLUDING, Keyword::DEFAULTS]) {
8981 Some(CreateTableLikeDefaults::Excluding)
8982 } else {
8983 None
8984 };
8985 self.expect_token(&Token::RParen)?;
8986 Some(CreateTableLikeKind::Parenthesized(CreateTableLike {
8987 name,
8988 defaults,
8989 }))
8990 } else {
8991 self.prev_token();
8993 None
8994 }
8995 } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
8996 let name = self.parse_object_name(allow_unquoted_hyphen)?;
8997 Some(CreateTableLikeKind::Plain(CreateTableLike {
8998 name,
8999 defaults: None,
9000 }))
9001 } else {
9002 None
9003 };
9004 Ok(like)
9005 }
9006
9007 pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
9008 if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
9009 Ok(OnCommit::DeleteRows)
9010 } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
9011 Ok(OnCommit::PreserveRows)
9012 } else if self.parse_keywords(&[Keyword::DROP]) {
9013 Ok(OnCommit::Drop)
9014 } else {
9015 parser_err!(
9016 "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
9017 self.peek_token_ref()
9018 )
9019 }
9020 }
9021
9022 fn parse_partition_for_values(&mut self) -> Result<ForValues, ParserError> {
9028 if self.parse_keyword(Keyword::DEFAULT) {
9029 return Ok(ForValues::Default);
9030 }
9031
9032 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
9033
9034 if self.parse_keyword(Keyword::IN) {
9035 self.expect_token(&Token::LParen)?;
9037 if self.peek_token_ref().token == Token::RParen {
9038 return self.expected_ref("at least one value", self.peek_token_ref());
9039 }
9040 let values = self.parse_comma_separated(Parser::parse_expr)?;
9041 self.expect_token(&Token::RParen)?;
9042 Ok(ForValues::In(values))
9043 } else if self.parse_keyword(Keyword::FROM) {
9044 self.expect_token(&Token::LParen)?;
9046 if self.peek_token_ref().token == Token::RParen {
9047 return self.expected_ref("at least one value", self.peek_token_ref());
9048 }
9049 let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9050 self.expect_token(&Token::RParen)?;
9051 self.expect_keyword(Keyword::TO)?;
9052 self.expect_token(&Token::LParen)?;
9053 if self.peek_token_ref().token == Token::RParen {
9054 return self.expected_ref("at least one value", self.peek_token_ref());
9055 }
9056 let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
9057 self.expect_token(&Token::RParen)?;
9058 Ok(ForValues::From { from, to })
9059 } else if self.parse_keyword(Keyword::WITH) {
9060 self.expect_token(&Token::LParen)?;
9062 self.expect_keyword(Keyword::MODULUS)?;
9063 let modulus = self.parse_literal_uint()?;
9064 self.expect_token(&Token::Comma)?;
9065 self.expect_keyword(Keyword::REMAINDER)?;
9066 let remainder = self.parse_literal_uint()?;
9067 self.expect_token(&Token::RParen)?;
9068 Ok(ForValues::With { modulus, remainder })
9069 } else {
9070 self.expected_ref("IN, FROM, or WITH after FOR VALUES", self.peek_token_ref())
9071 }
9072 }
9073
9074 fn parse_partition_bound_value(&mut self) -> Result<PartitionBoundValue, ParserError> {
9076 if self.parse_keyword(Keyword::MINVALUE) {
9077 Ok(PartitionBoundValue::MinValue)
9078 } else if self.parse_keyword(Keyword::MAXVALUE) {
9079 Ok(PartitionBoundValue::MaxValue)
9080 } else {
9081 Ok(PartitionBoundValue::Expr(self.parse_expr()?))
9082 }
9083 }
9084
9085 fn parse_optional_create_table_config(
9091 &mut self,
9092 ) -> Result<CreateTableConfiguration, ParserError> {
9093 let mut table_options = CreateTableOptions::None;
9094
9095 let inherits = if self.parse_keyword(Keyword::INHERITS) {
9096 Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
9097 } else {
9098 None
9099 };
9100
9101 let with_options = self.parse_options(Keyword::WITH)?;
9103 if !with_options.is_empty() {
9104 table_options = CreateTableOptions::With(with_options)
9105 }
9106
9107 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
9108 if !table_properties.is_empty() {
9109 table_options = CreateTableOptions::TableProperties(table_properties);
9110 }
9111 let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
9112 && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
9113 {
9114 Some(Box::new(self.parse_expr()?))
9115 } else {
9116 None
9117 };
9118
9119 let mut cluster_by = None;
9120 if dialect_of!(self is BigQueryDialect | GenericDialect) {
9121 if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
9122 cluster_by = Some(WrappedCollection::NoWrapping(
9123 self.parse_comma_separated(|p| p.parse_expr())?,
9124 ));
9125 };
9126
9127 if let Token::Word(word) = &self.peek_token_ref().token {
9128 if word.keyword == Keyword::OPTIONS {
9129 table_options =
9130 CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
9131 }
9132 };
9133 }
9134
9135 if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
9136 let plain_options = self.parse_plain_options()?;
9137 if !plain_options.is_empty() {
9138 table_options = CreateTableOptions::Plain(plain_options)
9139 }
9140 };
9141
9142 Ok(CreateTableConfiguration {
9143 partition_by,
9144 cluster_by,
9145 inherits,
9146 table_options,
9147 })
9148 }
9149
9150 fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
9151 if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
9154 return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
9155 }
9156
9157 if self.parse_keywords(&[Keyword::COMMENT]) {
9160 let has_eq = self.consume_token(&Token::Eq);
9161 let value = self.next_token();
9162
9163 let comment = match (has_eq, value.token) {
9164 (true, Token::SingleQuotedString(s)) => {
9165 Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
9166 }
9167 (false, Token::SingleQuotedString(s)) => {
9168 Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
9169 }
9170 (_, token) => {
9171 self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
9172 }
9173 };
9174 return comment;
9175 }
9176
9177 if self.parse_keywords(&[Keyword::ENGINE]) {
9180 let _ = self.consume_token(&Token::Eq);
9181 let value = self.next_token();
9182
9183 let engine = match value.token {
9184 Token::Word(w) => {
9185 let parameters = if self.peek_token_ref().token == Token::LParen {
9186 self.parse_parenthesized_identifiers()?
9187 } else {
9188 vec![]
9189 };
9190
9191 Ok(Some(SqlOption::NamedParenthesizedList(
9192 NamedParenthesizedList {
9193 key: Ident::new("ENGINE"),
9194 name: Some(Ident::new(w.value)),
9195 values: parameters,
9196 },
9197 )))
9198 }
9199 _ => {
9200 return self.expected("Token::Word", value)?;
9201 }
9202 };
9203
9204 return engine;
9205 }
9206
9207 if self.parse_keywords(&[Keyword::TABLESPACE]) {
9209 let _ = self.consume_token(&Token::Eq);
9210 let value = self.next_token();
9211
9212 let tablespace = match value.token {
9213 Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
9214 let storage = match self.parse_keyword(Keyword::STORAGE) {
9215 true => {
9216 let _ = self.consume_token(&Token::Eq);
9217 let storage_token = self.next_token();
9218 match &storage_token.token {
9219 Token::Word(w) => match w.value.to_uppercase().as_str() {
9220 "DISK" => Some(StorageType::Disk),
9221 "MEMORY" => Some(StorageType::Memory),
9222 _ => self
9223 .expected("Storage type (DISK or MEMORY)", storage_token)?,
9224 },
9225 _ => self.expected("Token::Word", storage_token)?,
9226 }
9227 }
9228 false => None,
9229 };
9230
9231 Ok(Some(SqlOption::TableSpace(TablespaceOption {
9232 name,
9233 storage,
9234 })))
9235 }
9236 _ => {
9237 return self.expected("Token::Word", value)?;
9238 }
9239 };
9240
9241 return tablespace;
9242 }
9243
9244 if self.parse_keyword(Keyword::UNION) {
9246 let _ = self.consume_token(&Token::Eq);
9247 let value = self.next_token();
9248
9249 match value.token {
9250 Token::LParen => {
9251 let tables: Vec<Ident> =
9252 self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
9253 self.expect_token(&Token::RParen)?;
9254
9255 return Ok(Some(SqlOption::NamedParenthesizedList(
9256 NamedParenthesizedList {
9257 key: Ident::new("UNION"),
9258 name: None,
9259 values: tables,
9260 },
9261 )));
9262 }
9263 _ => {
9264 return self.expected("Token::LParen", value)?;
9265 }
9266 }
9267 }
9268
9269 let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
9271 Ident::new("DEFAULT CHARSET")
9272 } else if self.parse_keyword(Keyword::CHARSET) {
9273 Ident::new("CHARSET")
9274 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
9275 Ident::new("DEFAULT CHARACTER SET")
9276 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9277 Ident::new("CHARACTER SET")
9278 } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
9279 Ident::new("DEFAULT COLLATE")
9280 } else if self.parse_keyword(Keyword::COLLATE) {
9281 Ident::new("COLLATE")
9282 } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
9283 Ident::new("DATA DIRECTORY")
9284 } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
9285 Ident::new("INDEX DIRECTORY")
9286 } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
9287 Ident::new("KEY_BLOCK_SIZE")
9288 } else if self.parse_keyword(Keyword::ROW_FORMAT) {
9289 Ident::new("ROW_FORMAT")
9290 } else if self.parse_keyword(Keyword::PACK_KEYS) {
9291 Ident::new("PACK_KEYS")
9292 } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
9293 Ident::new("STATS_AUTO_RECALC")
9294 } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
9295 Ident::new("STATS_PERSISTENT")
9296 } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
9297 Ident::new("STATS_SAMPLE_PAGES")
9298 } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
9299 Ident::new("DELAY_KEY_WRITE")
9300 } else if self.parse_keyword(Keyword::COMPRESSION) {
9301 Ident::new("COMPRESSION")
9302 } else if self.parse_keyword(Keyword::ENCRYPTION) {
9303 Ident::new("ENCRYPTION")
9304 } else if self.parse_keyword(Keyword::MAX_ROWS) {
9305 Ident::new("MAX_ROWS")
9306 } else if self.parse_keyword(Keyword::MIN_ROWS) {
9307 Ident::new("MIN_ROWS")
9308 } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
9309 Ident::new("AUTOEXTEND_SIZE")
9310 } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
9311 Ident::new("AVG_ROW_LENGTH")
9312 } else if self.parse_keyword(Keyword::CHECKSUM) {
9313 Ident::new("CHECKSUM")
9314 } else if self.parse_keyword(Keyword::CONNECTION) {
9315 Ident::new("CONNECTION")
9316 } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
9317 Ident::new("ENGINE_ATTRIBUTE")
9318 } else if self.parse_keyword(Keyword::PASSWORD) {
9319 Ident::new("PASSWORD")
9320 } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
9321 Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
9322 } else if self.parse_keyword(Keyword::INSERT_METHOD) {
9323 Ident::new("INSERT_METHOD")
9324 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
9325 Ident::new("AUTO_INCREMENT")
9326 } else {
9327 return Ok(None);
9328 };
9329
9330 let _ = self.consume_token(&Token::Eq);
9331
9332 let value = match self
9333 .maybe_parse(|parser| parser.parse_value())?
9334 .map(Expr::Value)
9335 {
9336 Some(expr) => expr,
9337 None => Expr::Identifier(self.parse_identifier()?),
9338 };
9339
9340 Ok(Some(SqlOption::KeyValue { key, value }))
9341 }
9342
9343 pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
9345 let mut options = Vec::new();
9346
9347 while let Some(option) = self.parse_plain_option()? {
9348 options.push(option);
9349 let _ = self.consume_token(&Token::Comma);
9352 }
9353
9354 Ok(options)
9355 }
9356
9357 pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
9359 let comment = if self.parse_keyword(Keyword::COMMENT) {
9360 let has_eq = self.consume_token(&Token::Eq);
9361 let comment = self.parse_comment_value()?;
9362 Some(if has_eq {
9363 CommentDef::WithEq(comment)
9364 } else {
9365 CommentDef::WithoutEq(comment)
9366 })
9367 } else {
9368 None
9369 };
9370 Ok(comment)
9371 }
9372
9373 pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
9375 let next_token = self.next_token();
9376 let value = match next_token.token {
9377 Token::SingleQuotedString(str) => str,
9378 Token::DollarQuotedString(str) => str.value,
9379 _ => self.expected("string literal", next_token)?,
9380 };
9381 Ok(value)
9382 }
9383
9384 pub fn parse_optional_procedure_parameters(
9386 &mut self,
9387 ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
9388 let mut params = vec![];
9389 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9390 return Ok(Some(params));
9391 }
9392 loop {
9393 if let Token::Word(_) = &self.peek_token_ref().token {
9394 params.push(self.parse_procedure_param()?)
9395 }
9396 let comma = self.consume_token(&Token::Comma);
9397 if self.consume_token(&Token::RParen) {
9398 break;
9400 } else if !comma {
9401 return self.expected_ref(
9402 "',' or ')' after parameter definition",
9403 self.peek_token_ref(),
9404 );
9405 }
9406 }
9407 Ok(Some(params))
9408 }
9409
9410 pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
9412 let mut columns = vec![];
9413 let mut constraints = vec![];
9414 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
9415 return Ok((columns, constraints));
9416 }
9417
9418 loop {
9419 if let Some(constraint) = self.parse_optional_table_constraint()? {
9420 constraints.push(constraint);
9421 } else if let Token::Word(_) = &self.peek_token_ref().token {
9422 columns.push(self.parse_column_def()?);
9423 } else {
9424 return self.expected_ref(
9425 "column name or constraint definition",
9426 self.peek_token_ref(),
9427 );
9428 }
9429
9430 let comma = self.consume_token(&Token::Comma);
9431 let rparen = self.peek_token_ref().token == Token::RParen;
9432
9433 if !comma && !rparen {
9434 return self
9435 .expected_ref("',' or ')' after column definition", self.peek_token_ref());
9436 };
9437
9438 if rparen
9439 && (!comma
9440 || self.dialect.supports_column_definition_trailing_commas()
9441 || self.options.trailing_commas)
9442 {
9443 let _ = self.consume_token(&Token::RParen);
9444 break;
9445 }
9446 }
9447
9448 Ok((columns, constraints))
9449 }
9450
9451 pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
9453 let mode = if self.parse_keyword(Keyword::IN) {
9454 Some(ArgMode::In)
9455 } else if self.parse_keyword(Keyword::OUT) {
9456 Some(ArgMode::Out)
9457 } else if self.parse_keyword(Keyword::INOUT) {
9458 Some(ArgMode::InOut)
9459 } else {
9460 None
9461 };
9462 let name = self.parse_identifier()?;
9463 let data_type = self.parse_data_type()?;
9464 let default = if self.consume_token(&Token::Eq) {
9465 Some(self.parse_expr()?)
9466 } else {
9467 None
9468 };
9469
9470 Ok(ProcedureParam {
9471 name,
9472 data_type,
9473 mode,
9474 default,
9475 })
9476 }
9477
9478 pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
9480 self.parse_column_def_inner(false)
9481 }
9482
9483 fn parse_column_def_inner(
9484 &mut self,
9485 optional_data_type: bool,
9486 ) -> Result<ColumnDef, ParserError> {
9487 let col_name = self.parse_identifier()?;
9488 let data_type = if self.is_column_type_sqlite_unspecified() {
9489 DataType::Unspecified
9490 } else if optional_data_type {
9491 self.maybe_parse(|parser| parser.parse_data_type())?
9492 .unwrap_or(DataType::Unspecified)
9493 } else {
9494 self.parse_data_type()?
9495 };
9496 let mut options = vec![];
9497 loop {
9498 if self.parse_keyword(Keyword::CONSTRAINT) {
9499 let name = Some(self.parse_identifier()?);
9500 if let Some(option) = self.parse_optional_column_option()? {
9501 options.push(ColumnOptionDef { name, option });
9502 } else {
9503 return self.expected_ref(
9504 "constraint details after CONSTRAINT <name>",
9505 self.peek_token_ref(),
9506 );
9507 }
9508 } else if let Some(option) = self.parse_optional_column_option()? {
9509 options.push(ColumnOptionDef { name: None, option });
9510 } else {
9511 break;
9512 };
9513 }
9514 Ok(ColumnDef {
9515 name: col_name,
9516 data_type,
9517 options,
9518 })
9519 }
9520
9521 fn is_column_type_sqlite_unspecified(&mut self) -> bool {
9522 if dialect_of!(self is SQLiteDialect) {
9523 match &self.peek_token_ref().token {
9524 Token::Word(word) => matches!(
9525 word.keyword,
9526 Keyword::CONSTRAINT
9527 | Keyword::PRIMARY
9528 | Keyword::NOT
9529 | Keyword::UNIQUE
9530 | Keyword::CHECK
9531 | Keyword::DEFAULT
9532 | Keyword::COLLATE
9533 | Keyword::REFERENCES
9534 | Keyword::GENERATED
9535 | Keyword::AS
9536 ),
9537 _ => true, }
9539 } else {
9540 false
9541 }
9542 }
9543
9544 pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9546 if let Some(option) = self.dialect.parse_column_option(self)? {
9547 return option;
9548 }
9549
9550 self.with_state(
9551 ColumnDefinition,
9552 |parser| -> Result<Option<ColumnOption>, ParserError> {
9553 parser.parse_optional_column_option_inner()
9554 },
9555 )
9556 }
9557
9558 fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9559 if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
9560 Ok(Some(ColumnOption::CharacterSet(
9561 self.parse_object_name(false)?,
9562 )))
9563 } else if self.parse_keywords(&[Keyword::COLLATE]) {
9564 Ok(Some(ColumnOption::Collation(
9565 self.parse_object_name(false)?,
9566 )))
9567 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
9568 Ok(Some(ColumnOption::NotNull))
9569 } else if self.parse_keywords(&[Keyword::COMMENT]) {
9570 Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
9571 } else if self.parse_keyword(Keyword::NULL) {
9572 Ok(Some(ColumnOption::Null))
9573 } else if self.parse_keyword(Keyword::DEFAULT) {
9574 Ok(Some(ColumnOption::Default(self.parse_expr()?)))
9575 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9576 && self.parse_keyword(Keyword::MATERIALIZED)
9577 {
9578 Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
9579 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9580 && self.parse_keyword(Keyword::ALIAS)
9581 {
9582 Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
9583 } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
9584 && self.parse_keyword(Keyword::EPHEMERAL)
9585 {
9586 if matches!(self.peek_token_ref().token, Token::Comma | Token::RParen) {
9589 Ok(Some(ColumnOption::Ephemeral(None)))
9590 } else {
9591 Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
9592 }
9593 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
9594 let characteristics = self.parse_constraint_characteristics()?;
9595 Ok(Some(
9596 PrimaryKeyConstraint {
9597 name: None,
9598 index_name: None,
9599 index_type: None,
9600 columns: vec![],
9601 include: vec![],
9602 index_options: vec![],
9603 characteristics,
9604 }
9605 .into(),
9606 ))
9607 } else if self.parse_keyword(Keyword::UNIQUE) {
9608 let index_type_display =
9609 if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9610 KeyOrIndexDisplay::Key
9611 } else {
9612 KeyOrIndexDisplay::None
9613 };
9614 let characteristics = self.parse_constraint_characteristics()?;
9615 Ok(Some(
9616 UniqueConstraint {
9617 name: None,
9618 index_name: None,
9619 index_type_display,
9620 index_type: None,
9621 columns: vec![],
9622 include: vec![],
9623 index_options: vec![],
9624 characteristics,
9625 nulls_distinct: NullsDistinctOption::None,
9626 }
9627 .into(),
9628 ))
9629 } else if self.dialect.supports_key_column_option() && self.parse_keyword(Keyword::KEY) {
9630 let characteristics = self.parse_constraint_characteristics()?;
9633 Ok(Some(
9634 PrimaryKeyConstraint {
9635 name: None,
9636 index_name: None,
9637 index_type: None,
9638 columns: vec![],
9639 include: vec![],
9640 index_options: vec![],
9641 characteristics,
9642 }
9643 .into(),
9644 ))
9645 } else if self.parse_keyword(Keyword::REFERENCES) {
9646 let foreign_table = self.parse_object_name(false)?;
9647 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
9650 let mut match_kind = None;
9651 let mut on_delete = None;
9652 let mut on_update = None;
9653 loop {
9654 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
9655 match_kind = Some(self.parse_match_kind()?);
9656 } else if on_delete.is_none()
9657 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
9658 {
9659 on_delete = Some(self.parse_referential_action()?);
9660 } else if on_update.is_none()
9661 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9662 {
9663 on_update = Some(self.parse_referential_action()?);
9664 } else {
9665 break;
9666 }
9667 }
9668 let characteristics = self.parse_constraint_characteristics()?;
9669
9670 Ok(Some(
9671 ForeignKeyConstraint {
9672 name: None, index_name: None, columns: vec![], foreign_table,
9676 referred_columns,
9677 on_delete,
9678 on_update,
9679 match_kind,
9680 characteristics,
9681 }
9682 .into(),
9683 ))
9684 } else if self.parse_keyword(Keyword::CHECK) {
9685 self.expect_token(&Token::LParen)?;
9686 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9688 self.expect_token(&Token::RParen)?;
9689 let no_inherit = self.parse_keywords(&[Keyword::NO, Keyword::INHERIT]);
9690
9691 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
9692 Some(true)
9693 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
9694 Some(false)
9695 } else {
9696 None
9697 };
9698
9699 Ok(Some(
9700 CheckConstraint {
9701 name: None, expr: Box::new(expr),
9703 no_inherit,
9704 enforced,
9705 }
9706 .into(),
9707 ))
9708 } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
9709 && dialect_of!(self is MySqlDialect | GenericDialect)
9710 {
9711 Ok(Some(ColumnOption::DialectSpecific(vec![
9713 Token::make_keyword("AUTO_INCREMENT"),
9714 ])))
9715 } else if self.parse_keyword(Keyword::AUTOINCREMENT)
9716 && dialect_of!(self is SQLiteDialect | GenericDialect)
9717 {
9718 Ok(Some(ColumnOption::DialectSpecific(vec![
9720 Token::make_keyword("AUTOINCREMENT"),
9721 ])))
9722 } else if self.parse_keyword(Keyword::ASC)
9723 && self.dialect.supports_asc_desc_in_column_definition()
9724 {
9725 Ok(Some(ColumnOption::DialectSpecific(vec![
9727 Token::make_keyword("ASC"),
9728 ])))
9729 } else if self.parse_keyword(Keyword::DESC)
9730 && self.dialect.supports_asc_desc_in_column_definition()
9731 {
9732 Ok(Some(ColumnOption::DialectSpecific(vec![
9734 Token::make_keyword("DESC"),
9735 ])))
9736 } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
9737 && dialect_of!(self is MySqlDialect | GenericDialect)
9738 {
9739 let expr = self.parse_expr()?;
9740 Ok(Some(ColumnOption::OnUpdate(expr)))
9741 } else if self.parse_keyword(Keyword::GENERATED) {
9742 self.parse_optional_column_option_generated()
9743 } else if dialect_of!(self is BigQueryDialect | GenericDialect)
9744 && self.parse_keyword(Keyword::OPTIONS)
9745 {
9746 self.prev_token();
9747 Ok(Some(ColumnOption::Options(
9748 self.parse_options(Keyword::OPTIONS)?,
9749 )))
9750 } else if self.parse_keyword(Keyword::AS)
9751 && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
9752 {
9753 self.parse_optional_column_option_as()
9754 } else if self.parse_keyword(Keyword::SRID)
9755 && dialect_of!(self is MySqlDialect | GenericDialect)
9756 {
9757 Ok(Some(ColumnOption::Srid(Box::new(self.parse_expr()?))))
9758 } else if self.parse_keyword(Keyword::IDENTITY)
9759 && dialect_of!(self is MsSqlDialect | GenericDialect)
9760 {
9761 let parameters = if self.consume_token(&Token::LParen) {
9762 let seed = self.parse_number()?;
9763 self.expect_token(&Token::Comma)?;
9764 let increment = self.parse_number()?;
9765 self.expect_token(&Token::RParen)?;
9766
9767 Some(IdentityPropertyFormatKind::FunctionCall(
9768 IdentityParameters { seed, increment },
9769 ))
9770 } else {
9771 None
9772 };
9773 Ok(Some(ColumnOption::Identity(
9774 IdentityPropertyKind::Identity(IdentityProperty {
9775 parameters,
9776 order: None,
9777 }),
9778 )))
9779 } else if dialect_of!(self is SQLiteDialect | GenericDialect)
9780 && self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT])
9781 {
9782 Ok(Some(ColumnOption::OnConflict(
9784 self.expect_one_of_keywords(&[
9785 Keyword::ROLLBACK,
9786 Keyword::ABORT,
9787 Keyword::FAIL,
9788 Keyword::IGNORE,
9789 Keyword::REPLACE,
9790 ])?,
9791 )))
9792 } else if self.parse_keyword(Keyword::INVISIBLE) {
9793 Ok(Some(ColumnOption::Invisible))
9794 } else {
9795 Ok(None)
9796 }
9797 }
9798
9799 pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
9800 let name = self.parse_object_name(false)?;
9801 self.expect_token(&Token::Eq)?;
9802 let value = self.parse_literal_string()?;
9803
9804 Ok(Tag::new(name, value))
9805 }
9806
9807 fn parse_optional_column_option_generated(
9808 &mut self,
9809 ) -> Result<Option<ColumnOption>, ParserError> {
9810 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
9811 let mut sequence_options = vec![];
9812 if self.expect_token(&Token::LParen).is_ok() {
9813 sequence_options = self.parse_create_sequence_options()?;
9814 self.expect_token(&Token::RParen)?;
9815 }
9816 Ok(Some(ColumnOption::Generated {
9817 generated_as: GeneratedAs::Always,
9818 sequence_options: Some(sequence_options),
9819 generation_expr: None,
9820 generation_expr_mode: None,
9821 generated_keyword: true,
9822 }))
9823 } else if self.parse_keywords(&[
9824 Keyword::BY,
9825 Keyword::DEFAULT,
9826 Keyword::AS,
9827 Keyword::IDENTITY,
9828 ]) {
9829 let mut sequence_options = vec![];
9830 if self.expect_token(&Token::LParen).is_ok() {
9831 sequence_options = self.parse_create_sequence_options()?;
9832 self.expect_token(&Token::RParen)?;
9833 }
9834 Ok(Some(ColumnOption::Generated {
9835 generated_as: GeneratedAs::ByDefault,
9836 sequence_options: Some(sequence_options),
9837 generation_expr: None,
9838 generation_expr_mode: None,
9839 generated_keyword: true,
9840 }))
9841 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
9842 if self.expect_token(&Token::LParen).is_ok() {
9843 let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
9844 self.expect_token(&Token::RParen)?;
9845 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9846 Ok((
9847 GeneratedAs::ExpStored,
9848 Some(GeneratedExpressionMode::Stored),
9849 ))
9850 } else if dialect_of!(self is PostgreSqlDialect) {
9851 self.expected_ref("STORED", self.peek_token_ref())
9853 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9854 Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
9855 } else {
9856 Ok((GeneratedAs::Always, None))
9857 }?;
9858
9859 Ok(Some(ColumnOption::Generated {
9860 generated_as: gen_as,
9861 sequence_options: None,
9862 generation_expr: Some(expr),
9863 generation_expr_mode: expr_mode,
9864 generated_keyword: true,
9865 }))
9866 } else {
9867 Ok(None)
9868 }
9869 } else {
9870 Ok(None)
9871 }
9872 }
9873
9874 fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
9875 self.expect_token(&Token::LParen)?;
9877 let expr = self.parse_expr()?;
9878 self.expect_token(&Token::RParen)?;
9879
9880 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
9881 (
9882 GeneratedAs::ExpStored,
9883 Some(GeneratedExpressionMode::Stored),
9884 )
9885 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
9886 (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
9887 } else {
9888 (GeneratedAs::Always, None)
9889 };
9890
9891 Ok(Some(ColumnOption::Generated {
9892 generated_as: gen_as,
9893 sequence_options: None,
9894 generation_expr: Some(expr),
9895 generation_expr_mode: expr_mode,
9896 generated_keyword: false,
9897 }))
9898 }
9899
9900 pub fn parse_optional_clustered_by(&mut self) -> Result<Option<ClusteredBy>, ParserError> {
9902 let clustered_by = if dialect_of!(self is HiveDialect|GenericDialect)
9903 && self.parse_keywords(&[Keyword::CLUSTERED, Keyword::BY])
9904 {
9905 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
9906
9907 let sorted_by = if self.parse_keywords(&[Keyword::SORTED, Keyword::BY]) {
9908 self.expect_token(&Token::LParen)?;
9909 let sorted_by_columns = self.parse_comma_separated(|p| p.parse_order_by_expr())?;
9910 self.expect_token(&Token::RParen)?;
9911 Some(sorted_by_columns)
9912 } else {
9913 None
9914 };
9915
9916 self.expect_keyword_is(Keyword::INTO)?;
9917 let num_buckets = self.parse_number_value()?.value;
9918 self.expect_keyword_is(Keyword::BUCKETS)?;
9919 Some(ClusteredBy {
9920 columns,
9921 sorted_by,
9922 num_buckets,
9923 })
9924 } else {
9925 None
9926 };
9927 Ok(clustered_by)
9928 }
9929
9930 pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
9934 if self.parse_keyword(Keyword::RESTRICT) {
9935 Ok(ReferentialAction::Restrict)
9936 } else if self.parse_keyword(Keyword::CASCADE) {
9937 Ok(ReferentialAction::Cascade)
9938 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
9939 Ok(ReferentialAction::SetNull)
9940 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
9941 Ok(ReferentialAction::NoAction)
9942 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
9943 Ok(ReferentialAction::SetDefault)
9944 } else {
9945 self.expected_ref(
9946 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
9947 self.peek_token_ref(),
9948 )
9949 }
9950 }
9951
9952 pub fn parse_match_kind(&mut self) -> Result<ConstraintReferenceMatchKind, ParserError> {
9954 if self.parse_keyword(Keyword::FULL) {
9955 Ok(ConstraintReferenceMatchKind::Full)
9956 } else if self.parse_keyword(Keyword::PARTIAL) {
9957 Ok(ConstraintReferenceMatchKind::Partial)
9958 } else if self.parse_keyword(Keyword::SIMPLE) {
9959 Ok(ConstraintReferenceMatchKind::Simple)
9960 } else {
9961 self.expected_ref("one of FULL, PARTIAL or SIMPLE", self.peek_token_ref())
9962 }
9963 }
9964
9965 fn parse_constraint_using_index(
9968 &mut self,
9969 name: Option<Ident>,
9970 ) -> Result<ConstraintUsingIndex, ParserError> {
9971 let index_name = self.parse_identifier()?;
9972 let characteristics = self.parse_constraint_characteristics()?;
9973 Ok(ConstraintUsingIndex {
9974 name,
9975 index_name,
9976 characteristics,
9977 })
9978 }
9979
9980 pub fn parse_constraint_characteristics(
9982 &mut self,
9983 ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
9984 let mut cc = ConstraintCharacteristics::default();
9985
9986 loop {
9987 if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
9988 {
9989 cc.deferrable = Some(false);
9990 } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
9991 cc.deferrable = Some(true);
9992 } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
9993 if self.parse_keyword(Keyword::DEFERRED) {
9994 cc.initially = Some(DeferrableInitial::Deferred);
9995 } else if self.parse_keyword(Keyword::IMMEDIATE) {
9996 cc.initially = Some(DeferrableInitial::Immediate);
9997 } else {
9998 self.expected_ref("one of DEFERRED or IMMEDIATE", self.peek_token_ref())?;
9999 }
10000 } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
10001 cc.enforced = Some(true);
10002 } else if cc.enforced.is_none()
10003 && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
10004 {
10005 cc.enforced = Some(false);
10006 } else {
10007 break;
10008 }
10009 }
10010
10011 if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
10012 Ok(Some(cc))
10013 } else {
10014 Ok(None)
10015 }
10016 }
10017
10018 pub fn parse_optional_table_constraint(
10020 &mut self,
10021 ) -> Result<Option<TableConstraint>, ParserError> {
10022 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
10023 if self.dialect.supports_constraint_keyword_without_name()
10024 && self
10025 .peek_one_of_keywords(&[
10026 Keyword::CHECK,
10027 Keyword::PRIMARY,
10028 Keyword::UNIQUE,
10029 Keyword::FOREIGN,
10030 ])
10031 .is_some()
10032 {
10033 None
10034 } else {
10035 Some(self.parse_identifier()?)
10036 }
10037 } else {
10038 None
10039 };
10040
10041 let next_token = self.next_token();
10042 match next_token.token {
10043 Token::Word(w) if w.keyword == Keyword::UNIQUE => {
10044 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10047 return Ok(Some(TableConstraint::UniqueUsingIndex(
10048 self.parse_constraint_using_index(name)?,
10049 )));
10050 }
10051
10052 let index_type_display = self.parse_index_type_display();
10053 if !dialect_of!(self is GenericDialect | MySqlDialect)
10054 && !index_type_display.is_none()
10055 {
10056 return self.expected_ref(
10057 "`index_name` or `(column_name [, ...])`",
10058 self.peek_token_ref(),
10059 );
10060 }
10061
10062 let nulls_distinct = self.parse_optional_nulls_distinct()?;
10063
10064 let index_name = self.parse_optional_ident()?;
10066 let index_type = self.parse_optional_using_then_index_type()?;
10067
10068 let columns = self.parse_parenthesized_index_column_list()?;
10069 let include = self.parse_optional_include_columns()?;
10070 let index_options = self.parse_index_options()?;
10071 let characteristics = self.parse_constraint_characteristics()?;
10072 Ok(Some(
10073 UniqueConstraint {
10074 name,
10075 index_name,
10076 index_type_display,
10077 index_type,
10078 columns,
10079 include,
10080 index_options,
10081 characteristics,
10082 nulls_distinct,
10083 }
10084 .into(),
10085 ))
10086 }
10087 Token::Word(w) if w.keyword == Keyword::PRIMARY => {
10088 self.expect_keyword_is(Keyword::KEY)?;
10090
10091 if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
10094 return Ok(Some(TableConstraint::PrimaryKeyUsingIndex(
10095 self.parse_constraint_using_index(name)?,
10096 )));
10097 }
10098
10099 let index_name = self.parse_optional_ident()?;
10101 let index_type = self.parse_optional_using_then_index_type()?;
10102
10103 let columns = self.parse_parenthesized_index_column_list()?;
10104 let include = self.parse_optional_include_columns()?;
10105 let index_options = self.parse_index_options()?;
10106 let characteristics = self.parse_constraint_characteristics()?;
10107 Ok(Some(
10108 PrimaryKeyConstraint {
10109 name,
10110 index_name,
10111 index_type,
10112 columns,
10113 include,
10114 index_options,
10115 characteristics,
10116 }
10117 .into(),
10118 ))
10119 }
10120 Token::Word(w) if w.keyword == Keyword::FOREIGN => {
10121 self.expect_keyword_is(Keyword::KEY)?;
10122 let index_name = self.parse_optional_ident()?;
10123 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
10124 self.expect_keyword_is(Keyword::REFERENCES)?;
10125 let foreign_table = self.parse_object_name(false)?;
10126 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
10127 let mut match_kind = None;
10128 let mut on_delete = None;
10129 let mut on_update = None;
10130 loop {
10131 if match_kind.is_none() && self.parse_keyword(Keyword::MATCH) {
10132 match_kind = Some(self.parse_match_kind()?);
10133 } else if on_delete.is_none()
10134 && self.parse_keywords(&[Keyword::ON, Keyword::DELETE])
10135 {
10136 on_delete = Some(self.parse_referential_action()?);
10137 } else if on_update.is_none()
10138 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
10139 {
10140 on_update = Some(self.parse_referential_action()?);
10141 } else {
10142 break;
10143 }
10144 }
10145
10146 let characteristics = self.parse_constraint_characteristics()?;
10147
10148 Ok(Some(
10149 ForeignKeyConstraint {
10150 name,
10151 index_name,
10152 columns,
10153 foreign_table,
10154 referred_columns,
10155 on_delete,
10156 on_update,
10157 match_kind,
10158 characteristics,
10159 }
10160 .into(),
10161 ))
10162 }
10163 Token::Word(w) if w.keyword == Keyword::CHECK => {
10164 self.expect_token(&Token::LParen)?;
10165 let expr = Box::new(self.parse_expr()?);
10166 self.expect_token(&Token::RParen)?;
10167 let no_inherit = self.parse_keywords(&[Keyword::NO, Keyword::INHERIT]);
10168
10169 let enforced = if self.parse_keyword(Keyword::ENFORCED) {
10170 Some(true)
10171 } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
10172 Some(false)
10173 } else {
10174 None
10175 };
10176
10177 Ok(Some(
10178 CheckConstraint {
10179 name,
10180 expr,
10181 no_inherit,
10182 enforced,
10183 }
10184 .into(),
10185 ))
10186 }
10187 Token::Word(w)
10188 if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
10189 && dialect_of!(self is GenericDialect | MySqlDialect)
10190 && name.is_none() =>
10191 {
10192 let display_as_key = w.keyword == Keyword::KEY;
10193
10194 let name = match &self.peek_token_ref().token {
10195 Token::Word(word) if word.keyword == Keyword::USING => None,
10196 _ => self.parse_optional_ident()?,
10197 };
10198
10199 let index_type = self.parse_optional_using_then_index_type()?;
10200 let columns = self.parse_parenthesized_index_column_list()?;
10201 let index_options = self.parse_index_options()?;
10202
10203 Ok(Some(
10204 IndexConstraint {
10205 display_as_key,
10206 name,
10207 index_type,
10208 columns,
10209 index_options,
10210 }
10211 .into(),
10212 ))
10213 }
10214 Token::Word(w)
10215 if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
10216 && dialect_of!(self is GenericDialect | MySqlDialect) =>
10217 {
10218 if let Some(name) = name {
10219 return self.expected(
10220 "FULLTEXT or SPATIAL option without constraint name",
10221 TokenWithSpan {
10222 token: Token::make_keyword(&name.to_string()),
10223 span: next_token.span,
10224 },
10225 );
10226 }
10227
10228 let fulltext = w.keyword == Keyword::FULLTEXT;
10229
10230 let index_type_display = self.parse_index_type_display();
10231
10232 let opt_index_name = self.parse_optional_ident()?;
10233
10234 let columns = self.parse_parenthesized_index_column_list()?;
10235
10236 Ok(Some(
10237 FullTextOrSpatialConstraint {
10238 fulltext,
10239 index_type_display,
10240 opt_index_name,
10241 columns,
10242 }
10243 .into(),
10244 ))
10245 }
10246 Token::Word(w)
10247 if w.keyword == Keyword::EXCLUDE && self.dialect.supports_exclude_constraint() =>
10248 {
10249 if name.is_some()
10254 || self.peek_keyword(Keyword::USING)
10255 || self.peek_token_ref().token == Token::LParen
10256 {
10257 Ok(Some(self.parse_exclude_constraint(name)?.into()))
10258 } else {
10259 self.prev_token();
10260 Ok(None)
10261 }
10262 }
10263 _ => {
10264 if name.is_some() {
10265 self.expected("PRIMARY, UNIQUE, FOREIGN, CHECK, or EXCLUDE", next_token)
10266 } else {
10267 self.prev_token();
10268 Ok(None)
10269 }
10270 }
10271 }
10272 }
10273
10274 fn parse_exclude_constraint(
10276 &mut self,
10277 name: Option<Ident>,
10278 ) -> Result<ExcludeConstraint, ParserError> {
10279 let index_method = if self.parse_keyword(Keyword::USING) {
10280 Some(self.parse_identifier()?)
10281 } else {
10282 None
10283 };
10284
10285 self.expect_token(&Token::LParen)?;
10286 let elements = self.parse_comma_separated(|p| p.parse_exclude_constraint_element())?;
10287 self.expect_token(&Token::RParen)?;
10288
10289 let include = if self.parse_keyword(Keyword::INCLUDE) {
10290 self.expect_token(&Token::LParen)?;
10291 let cols = self.parse_comma_separated(|p| p.parse_identifier())?;
10292 self.expect_token(&Token::RParen)?;
10293 cols
10294 } else {
10295 vec![]
10296 };
10297
10298 let where_clause = if self.parse_keyword(Keyword::WHERE) {
10299 self.expect_token(&Token::LParen)?;
10300 let predicate = self.parse_expr()?;
10301 self.expect_token(&Token::RParen)?;
10302 Some(Box::new(predicate))
10303 } else {
10304 None
10305 };
10306
10307 let characteristics = self.parse_constraint_characteristics()?;
10308
10309 Ok(ExcludeConstraint {
10310 name,
10311 index_method,
10312 elements,
10313 include,
10314 where_clause,
10315 characteristics,
10316 })
10317 }
10318
10319 fn parse_exclude_constraint_element(
10320 &mut self,
10321 ) -> Result<ExcludeConstraintElement, ParserError> {
10322 let column = self.parse_create_index_expr()?;
10323 self.expect_keyword_is(Keyword::WITH)?;
10324 let operator = self.parse_exclude_constraint_operator()?;
10325 Ok(ExcludeConstraintElement { column, operator })
10326 }
10327
10328 fn parse_exclude_constraint_operator(
10330 &mut self,
10331 ) -> Result<ExcludeConstraintOperator, ParserError> {
10332 if self.parse_keyword(Keyword::OPERATOR) {
10333 return Ok(ExcludeConstraintOperator::PGOperator(
10334 self.parse_pg_operator_ident_parts()?,
10335 ));
10336 }
10337
10338 let operator_token = self.next_token();
10339 Ok(ExcludeConstraintOperator::Token(
10340 operator_token.token.to_string(),
10341 ))
10342 }
10343
10344 fn parse_pg_operator_ident_parts(&mut self) -> Result<Vec<String>, ParserError> {
10349 self.expect_token(&Token::LParen)?;
10350 if self.peek_token_ref().token == Token::RParen {
10351 let token = self.next_token();
10352 return self.expected("operator name", token);
10353 }
10354 let mut idents = vec![];
10355 loop {
10356 self.advance_token();
10357 idents.push(self.get_current_token().to_string());
10358 if !self.consume_token(&Token::Period) {
10359 break;
10360 }
10361 }
10362 self.expect_token(&Token::RParen)?;
10363 Ok(idents)
10364 }
10365
10366 fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
10367 Ok(if self.parse_keyword(Keyword::NULLS) {
10368 let not = self.parse_keyword(Keyword::NOT);
10369 self.expect_keyword_is(Keyword::DISTINCT)?;
10370 if not {
10371 NullsDistinctOption::NotDistinct
10372 } else {
10373 NullsDistinctOption::Distinct
10374 }
10375 } else {
10376 NullsDistinctOption::None
10377 })
10378 }
10379
10380 pub fn maybe_parse_options(
10382 &mut self,
10383 keyword: Keyword,
10384 ) -> Result<Option<Vec<SqlOption>>, ParserError> {
10385 if let Token::Word(word) = &self.peek_token_ref().token {
10386 if word.keyword == keyword {
10387 return Ok(Some(self.parse_options(keyword)?));
10388 }
10389 };
10390 Ok(None)
10391 }
10392
10393 pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
10395 if self.parse_keyword(keyword) {
10396 self.expect_token(&Token::LParen)?;
10397 let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
10398 self.expect_token(&Token::RParen)?;
10399 Ok(options)
10400 } else {
10401 Ok(vec![])
10402 }
10403 }
10404
10405 pub fn parse_options_with_keywords(
10407 &mut self,
10408 keywords: &[Keyword],
10409 ) -> Result<Vec<SqlOption>, ParserError> {
10410 if self.parse_keywords(keywords) {
10411 self.expect_token(&Token::LParen)?;
10412 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
10413 self.expect_token(&Token::RParen)?;
10414 Ok(options)
10415 } else {
10416 Ok(vec![])
10417 }
10418 }
10419
10420 pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
10422 Ok(if self.parse_keyword(Keyword::BTREE) {
10423 IndexType::BTree
10424 } else if self.parse_keyword(Keyword::HASH) {
10425 IndexType::Hash
10426 } else if self.parse_keyword(Keyword::GIN) {
10427 IndexType::GIN
10428 } else if self.parse_keyword(Keyword::GIST) {
10429 IndexType::GiST
10430 } else if self.parse_keyword(Keyword::SPGIST) {
10431 IndexType::SPGiST
10432 } else if self.parse_keyword(Keyword::BRIN) {
10433 IndexType::BRIN
10434 } else if self.parse_keyword(Keyword::BLOOM) {
10435 IndexType::Bloom
10436 } else {
10437 IndexType::Custom(self.parse_identifier()?)
10438 })
10439 }
10440
10441 pub fn parse_optional_using_then_index_type(
10448 &mut self,
10449 ) -> Result<Option<IndexType>, ParserError> {
10450 if self.parse_keyword(Keyword::USING) {
10451 Ok(Some(self.parse_index_type()?))
10452 } else {
10453 Ok(None)
10454 }
10455 }
10456
10457 pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
10461 self.maybe_parse(|parser| parser.parse_identifier())
10462 }
10463
10464 #[must_use]
10465 pub fn parse_index_type_display(&mut self) -> KeyOrIndexDisplay {
10467 if self.parse_keyword(Keyword::KEY) {
10468 KeyOrIndexDisplay::Key
10469 } else if self.parse_keyword(Keyword::INDEX) {
10470 KeyOrIndexDisplay::Index
10471 } else {
10472 KeyOrIndexDisplay::None
10473 }
10474 }
10475
10476 pub fn parse_optional_index_option(&mut self) -> Result<Option<IndexOption>, ParserError> {
10478 if let Some(index_type) = self.parse_optional_using_then_index_type()? {
10479 Ok(Some(IndexOption::Using(index_type)))
10480 } else if self.parse_keyword(Keyword::COMMENT) {
10481 let s = self.parse_literal_string()?;
10482 Ok(Some(IndexOption::Comment(s)))
10483 } else {
10484 Ok(None)
10485 }
10486 }
10487
10488 pub fn parse_index_options(&mut self) -> Result<Vec<IndexOption>, ParserError> {
10490 let mut options = Vec::new();
10491
10492 loop {
10493 match self.parse_optional_index_option()? {
10494 Some(index_option) => options.push(index_option),
10495 None => return Ok(options),
10496 }
10497 }
10498 }
10499
10500 pub fn parse_optional_include_columns(&mut self) -> Result<Vec<Ident>, ParserError> {
10502 if self.parse_keyword(Keyword::INCLUDE) {
10503 self.expect_token(&Token::LParen)?;
10504 let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
10505 self.expect_token(&Token::RParen)?;
10506 Ok(columns)
10507 } else {
10508 Ok(vec![])
10509 }
10510 }
10511
10512 pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
10514 let is_mssql = dialect_of!(self is MsSqlDialect|GenericDialect);
10515
10516 match &self.peek_token_ref().token {
10517 Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
10518 Ok(SqlOption::Ident(self.parse_identifier()?))
10519 }
10520 Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
10521 self.parse_option_partition()
10522 }
10523 Token::Word(w) if w.keyword == Keyword::CLUSTERED && is_mssql => {
10524 self.parse_option_clustered()
10525 }
10526 _ => {
10527 let name = self.parse_identifier()?;
10528 self.expect_token(&Token::Eq)?;
10529 let value = self.parse_expr()?;
10530
10531 Ok(SqlOption::KeyValue { key: name, value })
10532 }
10533 }
10534 }
10535
10536 pub fn parse_option_clustered(&mut self) -> Result<SqlOption, ParserError> {
10538 if self.parse_keywords(&[
10539 Keyword::CLUSTERED,
10540 Keyword::COLUMNSTORE,
10541 Keyword::INDEX,
10542 Keyword::ORDER,
10543 ]) {
10544 Ok(SqlOption::Clustered(
10545 TableOptionsClustered::ColumnstoreIndexOrder(
10546 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
10547 ),
10548 ))
10549 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::COLUMNSTORE, Keyword::INDEX]) {
10550 Ok(SqlOption::Clustered(
10551 TableOptionsClustered::ColumnstoreIndex,
10552 ))
10553 } else if self.parse_keywords(&[Keyword::CLUSTERED, Keyword::INDEX]) {
10554 self.expect_token(&Token::LParen)?;
10555
10556 let columns = self.parse_comma_separated(|p| {
10557 let name = p.parse_identifier()?;
10558 let asc = p.parse_asc_desc();
10559
10560 Ok(ClusteredIndex { name, asc })
10561 })?;
10562
10563 self.expect_token(&Token::RParen)?;
10564
10565 Ok(SqlOption::Clustered(TableOptionsClustered::Index(columns)))
10566 } else {
10567 Err(ParserError::ParserError(
10568 "invalid CLUSTERED sequence".to_string(),
10569 ))
10570 }
10571 }
10572
10573 pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
10575 self.expect_keyword_is(Keyword::PARTITION)?;
10576 self.expect_token(&Token::LParen)?;
10577 let column_name = self.parse_identifier()?;
10578
10579 self.expect_keyword_is(Keyword::RANGE)?;
10580 let range_direction = if self.parse_keyword(Keyword::LEFT) {
10581 Some(PartitionRangeDirection::Left)
10582 } else if self.parse_keyword(Keyword::RIGHT) {
10583 Some(PartitionRangeDirection::Right)
10584 } else {
10585 None
10586 };
10587
10588 self.expect_keywords(&[Keyword::FOR, Keyword::VALUES])?;
10589 self.expect_token(&Token::LParen)?;
10590
10591 let for_values = self.parse_comma_separated(Parser::parse_expr)?;
10592
10593 self.expect_token(&Token::RParen)?;
10594 self.expect_token(&Token::RParen)?;
10595
10596 Ok(SqlOption::Partition {
10597 column_name,
10598 range_direction,
10599 for_values,
10600 })
10601 }
10602
10603 pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
10605 self.expect_token(&Token::LParen)?;
10606 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10607 self.expect_token(&Token::RParen)?;
10608 Ok(Partition::Partitions(partitions))
10609 }
10610
10611 pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
10613 self.expect_token(&Token::LParen)?;
10614 self.expect_keyword_is(Keyword::SELECT)?;
10615 let projection = self.parse_projection()?;
10616 let group_by = self.parse_optional_group_by()?;
10617 let order_by = self.parse_optional_order_by()?;
10618 self.expect_token(&Token::RParen)?;
10619 Ok(ProjectionSelect {
10620 projection,
10621 group_by,
10622 order_by,
10623 })
10624 }
10625 pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
10627 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10628 let name = self.parse_identifier()?;
10629 let query = self.parse_projection_select()?;
10630 Ok(AlterTableOperation::AddProjection {
10631 if_not_exists,
10632 name,
10633 select: query,
10634 })
10635 }
10636
10637 fn parse_alter_sort_key(&mut self) -> Result<AlterTableOperation, ParserError> {
10641 self.expect_keyword_is(Keyword::ALTER)?;
10642 self.expect_keyword_is(Keyword::SORTKEY)?;
10643 self.expect_token(&Token::LParen)?;
10644 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
10645 self.expect_token(&Token::RParen)?;
10646 Ok(AlterTableOperation::AlterSortKey { columns })
10647 }
10648
10649 pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
10651 let operation = if self.parse_keyword(Keyword::ADD) {
10652 if let Some(constraint) = self.parse_optional_table_constraint()? {
10653 let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
10654 AlterTableOperation::AddConstraint {
10655 constraint,
10656 not_valid,
10657 }
10658 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10659 && self.parse_keyword(Keyword::PROJECTION)
10660 {
10661 return self.parse_alter_table_add_projection();
10662 } else {
10663 let if_not_exists =
10664 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
10665 let mut new_partitions = vec![];
10666 loop {
10667 if self.parse_keyword(Keyword::PARTITION) {
10668 new_partitions.push(self.parse_partition()?);
10669 } else {
10670 break;
10671 }
10672 }
10673 if !new_partitions.is_empty() {
10674 AlterTableOperation::AddPartitions {
10675 if_not_exists,
10676 new_partitions,
10677 }
10678 } else {
10679 let column_keyword = self.parse_keyword(Keyword::COLUMN);
10680
10681 let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
10682 {
10683 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
10684 || if_not_exists
10685 } else {
10686 false
10687 };
10688
10689 let column_def = self.parse_column_def()?;
10690
10691 let column_position = self.parse_column_position()?;
10692
10693 AlterTableOperation::AddColumn {
10694 column_keyword,
10695 if_not_exists,
10696 column_def,
10697 column_position,
10698 }
10699 }
10700 }
10701 } else if self.parse_keyword(Keyword::RENAME) {
10702 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
10703 let old_name = self.parse_identifier()?;
10704 self.expect_keyword_is(Keyword::TO)?;
10705 let new_name = self.parse_identifier()?;
10706 AlterTableOperation::RenameConstraint { old_name, new_name }
10707 } else if self.parse_keyword(Keyword::TO) {
10708 let table_name = self.parse_object_name(false)?;
10709 AlterTableOperation::RenameTable {
10710 table_name: RenameTableNameKind::To(table_name),
10711 }
10712 } else if self.parse_keyword(Keyword::AS) {
10713 let table_name = self.parse_object_name(false)?;
10714 AlterTableOperation::RenameTable {
10715 table_name: RenameTableNameKind::As(table_name),
10716 }
10717 } else {
10718 let _ = self.parse_keyword(Keyword::COLUMN); let old_column_name = self.parse_identifier()?;
10720 self.expect_keyword_is(Keyword::TO)?;
10721 let new_column_name = self.parse_identifier()?;
10722 AlterTableOperation::RenameColumn {
10723 old_column_name,
10724 new_column_name,
10725 }
10726 }
10727 } else if self.parse_keyword(Keyword::DISABLE) {
10728 if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10729 AlterTableOperation::DisableRowLevelSecurity {}
10730 } else if self.parse_keyword(Keyword::RULE) {
10731 let name = self.parse_identifier()?;
10732 AlterTableOperation::DisableRule { name }
10733 } else if self.parse_keyword(Keyword::TRIGGER) {
10734 let name = self.parse_identifier()?;
10735 AlterTableOperation::DisableTrigger { name }
10736 } else {
10737 return self.expected_ref(
10738 "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
10739 self.peek_token_ref(),
10740 );
10741 }
10742 } else if self.parse_keyword(Keyword::ENABLE) {
10743 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
10744 let name = self.parse_identifier()?;
10745 AlterTableOperation::EnableAlwaysRule { name }
10746 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
10747 let name = self.parse_identifier()?;
10748 AlterTableOperation::EnableAlwaysTrigger { name }
10749 } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
10750 AlterTableOperation::EnableRowLevelSecurity {}
10751 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
10752 let name = self.parse_identifier()?;
10753 AlterTableOperation::EnableReplicaRule { name }
10754 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
10755 let name = self.parse_identifier()?;
10756 AlterTableOperation::EnableReplicaTrigger { name }
10757 } else if self.parse_keyword(Keyword::RULE) {
10758 let name = self.parse_identifier()?;
10759 AlterTableOperation::EnableRule { name }
10760 } else if self.parse_keyword(Keyword::TRIGGER) {
10761 let name = self.parse_identifier()?;
10762 AlterTableOperation::EnableTrigger { name }
10763 } else {
10764 return self.expected_ref(
10765 "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
10766 self.peek_token_ref(),
10767 );
10768 }
10769 } else if self.parse_keywords(&[
10770 Keyword::FORCE,
10771 Keyword::ROW,
10772 Keyword::LEVEL,
10773 Keyword::SECURITY,
10774 ]) {
10775 AlterTableOperation::ForceRowLevelSecurity
10776 } else if self.parse_keywords(&[
10777 Keyword::NO,
10778 Keyword::FORCE,
10779 Keyword::ROW,
10780 Keyword::LEVEL,
10781 Keyword::SECURITY,
10782 ]) {
10783 AlterTableOperation::NoForceRowLevelSecurity
10784 } else if self.parse_keywords(&[Keyword::CLEAR, Keyword::PROJECTION])
10785 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10786 {
10787 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10788 let name = self.parse_identifier()?;
10789 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10790 Some(self.parse_identifier()?)
10791 } else {
10792 None
10793 };
10794 AlterTableOperation::ClearProjection {
10795 if_exists,
10796 name,
10797 partition,
10798 }
10799 } else if self.parse_keywords(&[Keyword::MATERIALIZE, Keyword::PROJECTION])
10800 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10801 {
10802 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10803 let name = self.parse_identifier()?;
10804 let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
10805 Some(self.parse_identifier()?)
10806 } else {
10807 None
10808 };
10809 AlterTableOperation::MaterializeProjection {
10810 if_exists,
10811 name,
10812 partition,
10813 }
10814 } else if self.parse_keyword(Keyword::DROP) {
10815 if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
10816 self.expect_token(&Token::LParen)?;
10817 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10818 self.expect_token(&Token::RParen)?;
10819 AlterTableOperation::DropPartitions {
10820 partitions,
10821 if_exists: true,
10822 }
10823 } else if self.parse_keyword(Keyword::PARTITION) {
10824 self.expect_token(&Token::LParen)?;
10825 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
10826 self.expect_token(&Token::RParen)?;
10827 AlterTableOperation::DropPartitions {
10828 partitions,
10829 if_exists: false,
10830 }
10831 } else if self.parse_keyword(Keyword::CONSTRAINT) {
10832 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10833 let name = self.parse_identifier()?;
10834 let drop_behavior = self.parse_optional_drop_behavior();
10835 AlterTableOperation::DropConstraint {
10836 if_exists,
10837 name,
10838 drop_behavior,
10839 }
10840 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
10841 let drop_behavior = self.parse_optional_drop_behavior();
10842 AlterTableOperation::DropPrimaryKey { drop_behavior }
10843 } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
10844 let name = self.parse_identifier()?;
10845 let drop_behavior = self.parse_optional_drop_behavior();
10846 AlterTableOperation::DropForeignKey {
10847 name,
10848 drop_behavior,
10849 }
10850 } else if self.parse_keyword(Keyword::INDEX) {
10851 let name = self.parse_identifier()?;
10852 AlterTableOperation::DropIndex { name }
10853 } else if self.parse_keyword(Keyword::PROJECTION)
10854 && dialect_of!(self is ClickHouseDialect|GenericDialect)
10855 {
10856 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10857 let name = self.parse_identifier()?;
10858 AlterTableOperation::DropProjection { if_exists, name }
10859 } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
10860 AlterTableOperation::DropClusteringKey
10861 } else {
10862 let has_column_keyword = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
10864 let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
10865 self.parse_comma_separated(Parser::parse_identifier)?
10866 } else {
10867 vec![self.parse_identifier()?]
10868 };
10869 let drop_behavior = self.parse_optional_drop_behavior();
10870 AlterTableOperation::DropColumn {
10871 has_column_keyword,
10872 column_names,
10873 if_exists,
10874 drop_behavior,
10875 }
10876 }
10877 } else if self.parse_keyword(Keyword::PARTITION) {
10878 self.expect_token(&Token::LParen)?;
10879 let before = self.parse_comma_separated(Parser::parse_expr)?;
10880 self.expect_token(&Token::RParen)?;
10881 self.expect_keyword_is(Keyword::RENAME)?;
10882 self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
10883 self.expect_token(&Token::LParen)?;
10884 let renames = self.parse_comma_separated(Parser::parse_expr)?;
10885 self.expect_token(&Token::RParen)?;
10886 AlterTableOperation::RenamePartitions {
10887 old_partitions: before,
10888 new_partitions: renames,
10889 }
10890 } else if self.parse_keyword(Keyword::CHANGE) {
10891 let _ = self.parse_keyword(Keyword::COLUMN); let old_name = self.parse_identifier()?;
10893 let new_name = self.parse_identifier()?;
10894 let data_type = self.parse_data_type()?;
10895 let mut options = vec![];
10896 while let Some(option) = self.parse_optional_column_option()? {
10897 options.push(option);
10898 }
10899
10900 let column_position = self.parse_column_position()?;
10901
10902 AlterTableOperation::ChangeColumn {
10903 old_name,
10904 new_name,
10905 data_type,
10906 options,
10907 column_position,
10908 }
10909 } else if self.parse_keyword(Keyword::MODIFY) {
10910 let _ = self.parse_keyword(Keyword::COLUMN); let col_name = self.parse_identifier()?;
10912 let data_type = self.parse_data_type()?;
10913 let mut options = vec![];
10914 while let Some(option) = self.parse_optional_column_option()? {
10915 options.push(option);
10916 }
10917
10918 let column_position = self.parse_column_position()?;
10919
10920 AlterTableOperation::ModifyColumn {
10921 col_name,
10922 data_type,
10923 options,
10924 column_position,
10925 }
10926 } else if self.parse_keyword(Keyword::ALTER) {
10927 if self.peek_keyword(Keyword::SORTKEY) {
10928 self.prev_token();
10929 return self.parse_alter_sort_key();
10930 }
10931
10932 let _ = self.parse_keyword(Keyword::COLUMN); let column_name = self.parse_identifier()?;
10934 let is_postgresql = dialect_of!(self is PostgreSqlDialect);
10935
10936 let op: AlterColumnOperation = if self.parse_keywords(&[
10937 Keyword::SET,
10938 Keyword::NOT,
10939 Keyword::NULL,
10940 ]) {
10941 AlterColumnOperation::SetNotNull {}
10942 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
10943 AlterColumnOperation::DropNotNull {}
10944 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
10945 AlterColumnOperation::SetDefault {
10946 value: self.parse_expr()?,
10947 }
10948 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
10949 AlterColumnOperation::DropDefault {}
10950 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
10951 self.parse_set_data_type(true)?
10952 } else if self.parse_keyword(Keyword::TYPE) {
10953 self.parse_set_data_type(false)?
10954 } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
10955 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
10956 Some(GeneratedAs::Always)
10957 } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
10958 Some(GeneratedAs::ByDefault)
10959 } else {
10960 None
10961 };
10962
10963 self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
10964
10965 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
10966
10967 if self.peek_token_ref().token == Token::LParen {
10968 self.expect_token(&Token::LParen)?;
10969 sequence_options = Some(self.parse_create_sequence_options()?);
10970 self.expect_token(&Token::RParen)?;
10971 }
10972
10973 AlterColumnOperation::AddGenerated {
10974 generated_as,
10975 sequence_options,
10976 }
10977 } else {
10978 let message = if is_postgresql {
10979 "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
10980 } else {
10981 "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
10982 };
10983
10984 return self.expected_ref(message, self.peek_token_ref());
10985 };
10986 AlterTableOperation::AlterColumn { column_name, op }
10987 } else if self.parse_keyword(Keyword::SWAP) {
10988 self.expect_keyword_is(Keyword::WITH)?;
10989 let table_name = self.parse_object_name(false)?;
10990 AlterTableOperation::SwapWith { table_name }
10991 } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
10992 && self.parse_keywords(&[Keyword::OWNER, Keyword::TO])
10993 {
10994 let new_owner = self.parse_owner()?;
10995 AlterTableOperation::OwnerTo { new_owner }
10996 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
10997 && self.parse_keyword(Keyword::ATTACH)
10998 {
10999 AlterTableOperation::AttachPartition {
11000 partition: self.parse_part_or_partition()?,
11001 }
11002 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11003 && self.parse_keyword(Keyword::DETACH)
11004 {
11005 AlterTableOperation::DetachPartition {
11006 partition: self.parse_part_or_partition()?,
11007 }
11008 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11009 && self.parse_keyword(Keyword::FREEZE)
11010 {
11011 let partition = self.parse_part_or_partition()?;
11012 let with_name = if self.parse_keyword(Keyword::WITH) {
11013 self.expect_keyword_is(Keyword::NAME)?;
11014 Some(self.parse_identifier()?)
11015 } else {
11016 None
11017 };
11018 AlterTableOperation::FreezePartition {
11019 partition,
11020 with_name,
11021 }
11022 } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
11023 && self.parse_keyword(Keyword::UNFREEZE)
11024 {
11025 let partition = self.parse_part_or_partition()?;
11026 let with_name = if self.parse_keyword(Keyword::WITH) {
11027 self.expect_keyword_is(Keyword::NAME)?;
11028 Some(self.parse_identifier()?)
11029 } else {
11030 None
11031 };
11032 AlterTableOperation::UnfreezePartition {
11033 partition,
11034 with_name,
11035 }
11036 } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
11037 self.expect_token(&Token::LParen)?;
11038 let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
11039 self.expect_token(&Token::RParen)?;
11040 AlterTableOperation::ClusterBy { exprs }
11041 } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
11042 AlterTableOperation::SuspendRecluster
11043 } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
11044 AlterTableOperation::ResumeRecluster
11045 } else if self.parse_keyword(Keyword::LOCK) {
11046 let equals = self.consume_token(&Token::Eq);
11047 let lock = match self.parse_one_of_keywords(&[
11048 Keyword::DEFAULT,
11049 Keyword::EXCLUSIVE,
11050 Keyword::NONE,
11051 Keyword::SHARED,
11052 ]) {
11053 Some(Keyword::DEFAULT) => AlterTableLock::Default,
11054 Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
11055 Some(Keyword::NONE) => AlterTableLock::None,
11056 Some(Keyword::SHARED) => AlterTableLock::Shared,
11057 _ => self.expected_ref(
11058 "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
11059 self.peek_token_ref(),
11060 )?,
11061 };
11062 AlterTableOperation::Lock { equals, lock }
11063 } else if self.parse_keyword(Keyword::ALGORITHM) {
11064 let equals = self.consume_token(&Token::Eq);
11065 let algorithm = match self.parse_one_of_keywords(&[
11066 Keyword::DEFAULT,
11067 Keyword::INSTANT,
11068 Keyword::INPLACE,
11069 Keyword::COPY,
11070 ]) {
11071 Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
11072 Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
11073 Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
11074 Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
11075 _ => self.expected_ref(
11076 "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
11077 self.peek_token_ref(),
11078 )?,
11079 };
11080 AlterTableOperation::Algorithm { equals, algorithm }
11081 } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
11082 let equals = self.consume_token(&Token::Eq);
11083 let value = self.parse_number_value()?;
11084 AlterTableOperation::AutoIncrement { equals, value }
11085 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
11086 let identity = if self.parse_keyword(Keyword::NOTHING) {
11087 ReplicaIdentity::Nothing
11088 } else if self.parse_keyword(Keyword::FULL) {
11089 ReplicaIdentity::Full
11090 } else if self.parse_keyword(Keyword::DEFAULT) {
11091 ReplicaIdentity::Default
11092 } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
11093 ReplicaIdentity::Index(self.parse_identifier()?)
11094 } else {
11095 return self.expected_ref(
11096 "NOTHING, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
11097 self.peek_token_ref(),
11098 );
11099 };
11100
11101 AlterTableOperation::ReplicaIdentity { identity }
11102 } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
11103 let name = self.parse_identifier()?;
11104 AlterTableOperation::ValidateConstraint { name }
11105 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOGGED]) {
11106 AlterTableOperation::SetLogged
11107 } else if self.parse_keywords(&[Keyword::SET, Keyword::UNLOGGED]) {
11108 AlterTableOperation::SetUnlogged
11109 } else {
11110 let mut options =
11111 self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
11112 if !options.is_empty() {
11113 AlterTableOperation::SetTblProperties {
11114 table_properties: options,
11115 }
11116 } else {
11117 options = self.parse_options(Keyword::SET)?;
11118 if !options.is_empty() {
11119 AlterTableOperation::SetOptionsParens { options }
11120 } else {
11121 return self.expected_ref(
11122 "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
11123 self.peek_token_ref(),
11124 );
11125 }
11126 }
11127 };
11128 Ok(operation)
11129 }
11130
11131 fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
11132 let data_type = self.parse_data_type()?;
11133 let using = if self.dialect.supports_alter_column_type_using()
11134 && self.parse_keyword(Keyword::USING)
11135 {
11136 Some(self.parse_expr()?)
11137 } else {
11138 None
11139 };
11140 Ok(AlterColumnOperation::SetDataType {
11141 data_type,
11142 using,
11143 had_set,
11144 })
11145 }
11146
11147 fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
11148 let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
11149 match keyword {
11150 Keyword::PART => Ok(Partition::Part(self.parse_expr()?)),
11151 Keyword::PARTITION => Ok(Partition::Expr(self.parse_expr()?)),
11152 unexpected_keyword => Err(ParserError::ParserError(
11154 format!("Internal parser error: expected any of {{PART, PARTITION}}, got {unexpected_keyword:?}"),
11155 )),
11156 }
11157 }
11158
11159 pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
11161 if self.peek_keywords(&[Keyword::TEXT, Keyword::SEARCH]) {
11162 return self.parse_alter_text_search().map(Into::into);
11163 }
11164
11165 let object_type = self.expect_one_of_keywords(&[
11166 Keyword::VIEW,
11167 Keyword::TYPE,
11168 Keyword::COLLATION,
11169 Keyword::TABLE,
11170 Keyword::INDEX,
11171 Keyword::FUNCTION,
11172 Keyword::AGGREGATE,
11173 Keyword::ROLE,
11174 Keyword::POLICY,
11175 Keyword::CONNECTOR,
11176 Keyword::ICEBERG,
11177 Keyword::SCHEMA,
11178 Keyword::USER,
11179 Keyword::OPERATOR,
11180 ])?;
11181 match object_type {
11182 Keyword::SCHEMA => {
11183 self.prev_token();
11184 self.prev_token();
11185 self.parse_alter_schema()
11186 }
11187 Keyword::VIEW => self.parse_alter_view(),
11188 Keyword::TYPE => self.parse_alter_type(),
11189 Keyword::COLLATION => self.parse_alter_collation().map(Into::into),
11190 Keyword::TABLE => self.parse_alter_table(false),
11191 Keyword::ICEBERG => {
11192 self.expect_keyword(Keyword::TABLE)?;
11193 self.parse_alter_table(true)
11194 }
11195 Keyword::INDEX => {
11196 let index_name = self.parse_object_name(false)?;
11197 let operation = if self.parse_keyword(Keyword::RENAME) {
11198 if self.parse_keyword(Keyword::TO) {
11199 let index_name = self.parse_object_name(false)?;
11200 AlterIndexOperation::RenameIndex { index_name }
11201 } else {
11202 return self.expected_ref("TO after RENAME", self.peek_token_ref());
11203 }
11204 } else {
11205 return self.expected_ref("RENAME after ALTER INDEX", self.peek_token_ref());
11206 };
11207
11208 Ok(Statement::AlterIndex {
11209 name: index_name,
11210 operation,
11211 })
11212 }
11213 Keyword::FUNCTION => self.parse_alter_function(AlterFunctionKind::Function),
11214 Keyword::AGGREGATE => self.parse_alter_function(AlterFunctionKind::Aggregate),
11215 Keyword::OPERATOR => {
11216 if self.parse_keyword(Keyword::FAMILY) {
11217 self.parse_alter_operator_family().map(Into::into)
11218 } else if self.parse_keyword(Keyword::CLASS) {
11219 self.parse_alter_operator_class().map(Into::into)
11220 } else {
11221 self.parse_alter_operator().map(Into::into)
11222 }
11223 }
11224 Keyword::ROLE => self.parse_alter_role(),
11225 Keyword::POLICY => self.parse_alter_policy().map(Into::into),
11226 Keyword::CONNECTOR => self.parse_alter_connector(),
11227 Keyword::USER if self.dialect.supports_alter_user_as_alter_role() => {
11228 self.parse_alter_role()
11229 }
11230 Keyword::USER => self.parse_alter_user().map(Into::into),
11231 unexpected_keyword => Err(ParserError::ParserError(
11233 format!("Internal parser error: expected any of {{TEXT SEARCH, VIEW, TYPE, COLLATION, TABLE, INDEX, FUNCTION, AGGREGATE, ROLE, POLICY, CONNECTOR, ICEBERG, SCHEMA, USER, OPERATOR}}, got {unexpected_keyword:?}"),
11234 )),
11235 }
11236 }
11237
11238 fn parse_alter_aggregate_signature(
11239 &mut self,
11240 ) -> Result<(FunctionDesc, bool, Option<Vec<OperateFunctionArg>>), ParserError> {
11241 let name = self.parse_object_name(false)?;
11242 self.expect_token(&Token::LParen)?;
11243
11244 if self.consume_token(&Token::Mul) {
11245 self.expect_token(&Token::RParen)?;
11246 return Ok((
11247 FunctionDesc {
11248 name,
11249 args: Some(vec![]),
11250 },
11251 true,
11252 None,
11253 ));
11254 }
11255
11256 let args =
11257 if self.peek_keyword(Keyword::ORDER) || self.peek_token_ref().token == Token::RParen {
11258 vec![]
11259 } else {
11260 self.parse_comma_separated(Parser::parse_aggregate_function_arg)?
11261 };
11262
11263 let aggregate_order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11264 Some(self.parse_comma_separated(Parser::parse_aggregate_function_arg)?)
11265 } else {
11266 None
11267 };
11268
11269 self.expect_token(&Token::RParen)?;
11270 Ok((
11271 FunctionDesc {
11272 name,
11273 args: Some(args),
11274 },
11275 false,
11276 aggregate_order_by,
11277 ))
11278 }
11279
11280 fn parse_alter_function_action(&mut self) -> Result<Option<AlterFunctionAction>, ParserError> {
11281 let action = if self.parse_keywords(&[
11282 Keyword::CALLED,
11283 Keyword::ON,
11284 Keyword::NULL,
11285 Keyword::INPUT,
11286 ]) {
11287 Some(AlterFunctionAction::CalledOnNull(
11288 FunctionCalledOnNull::CalledOnNullInput,
11289 ))
11290 } else if self.parse_keywords(&[
11291 Keyword::RETURNS,
11292 Keyword::NULL,
11293 Keyword::ON,
11294 Keyword::NULL,
11295 Keyword::INPUT,
11296 ]) {
11297 Some(AlterFunctionAction::CalledOnNull(
11298 FunctionCalledOnNull::ReturnsNullOnNullInput,
11299 ))
11300 } else if self.parse_keyword(Keyword::STRICT) {
11301 Some(AlterFunctionAction::CalledOnNull(
11302 FunctionCalledOnNull::Strict,
11303 ))
11304 } else if self.parse_keyword(Keyword::IMMUTABLE) {
11305 Some(AlterFunctionAction::Behavior(FunctionBehavior::Immutable))
11306 } else if self.parse_keyword(Keyword::STABLE) {
11307 Some(AlterFunctionAction::Behavior(FunctionBehavior::Stable))
11308 } else if self.parse_keyword(Keyword::VOLATILE) {
11309 Some(AlterFunctionAction::Behavior(FunctionBehavior::Volatile))
11310 } else if self.parse_keyword(Keyword::NOT) {
11311 self.expect_keyword(Keyword::LEAKPROOF)?;
11312 Some(AlterFunctionAction::Leakproof(false))
11313 } else if self.parse_keyword(Keyword::LEAKPROOF) {
11314 Some(AlterFunctionAction::Leakproof(true))
11315 } else if self.parse_keyword(Keyword::EXTERNAL) {
11316 self.expect_keyword(Keyword::SECURITY)?;
11317 let security = if self.parse_keyword(Keyword::DEFINER) {
11318 FunctionSecurity::Definer
11319 } else if self.parse_keyword(Keyword::INVOKER) {
11320 FunctionSecurity::Invoker
11321 } else {
11322 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11323 };
11324 Some(AlterFunctionAction::Security {
11325 external: true,
11326 security,
11327 })
11328 } else if self.parse_keyword(Keyword::SECURITY) {
11329 let security = if self.parse_keyword(Keyword::DEFINER) {
11330 FunctionSecurity::Definer
11331 } else if self.parse_keyword(Keyword::INVOKER) {
11332 FunctionSecurity::Invoker
11333 } else {
11334 return self.expected_ref("DEFINER or INVOKER", self.peek_token_ref());
11335 };
11336 Some(AlterFunctionAction::Security {
11337 external: false,
11338 security,
11339 })
11340 } else if self.parse_keyword(Keyword::PARALLEL) {
11341 let parallel = if self.parse_keyword(Keyword::UNSAFE) {
11342 FunctionParallel::Unsafe
11343 } else if self.parse_keyword(Keyword::RESTRICTED) {
11344 FunctionParallel::Restricted
11345 } else if self.parse_keyword(Keyword::SAFE) {
11346 FunctionParallel::Safe
11347 } else {
11348 return self
11349 .expected_ref("one of UNSAFE | RESTRICTED | SAFE", self.peek_token_ref());
11350 };
11351 Some(AlterFunctionAction::Parallel(parallel))
11352 } else if self.parse_keyword(Keyword::COST) {
11353 Some(AlterFunctionAction::Cost(self.parse_number()?))
11354 } else if self.parse_keyword(Keyword::ROWS) {
11355 Some(AlterFunctionAction::Rows(self.parse_number()?))
11356 } else if self.parse_keyword(Keyword::SUPPORT) {
11357 Some(AlterFunctionAction::Support(self.parse_object_name(false)?))
11358 } else if self.parse_keyword(Keyword::SET) {
11359 let name = self.parse_object_name(false)?;
11360 let value = if self.parse_keywords(&[Keyword::FROM, Keyword::CURRENT]) {
11361 FunctionSetValue::FromCurrent
11362 } else {
11363 if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
11364 return self.expected_ref("= or TO", self.peek_token_ref());
11365 }
11366 if self.parse_keyword(Keyword::DEFAULT) {
11367 FunctionSetValue::Default
11368 } else {
11369 FunctionSetValue::Values(self.parse_comma_separated(Parser::parse_expr)?)
11370 }
11371 };
11372 Some(AlterFunctionAction::Set(FunctionDefinitionSetParam {
11373 name,
11374 value,
11375 }))
11376 } else if self.parse_keyword(Keyword::RESET) {
11377 let reset_config = if self.parse_keyword(Keyword::ALL) {
11378 ResetConfig::ALL
11379 } else {
11380 ResetConfig::ConfigName(self.parse_object_name(false)?)
11381 };
11382 Some(AlterFunctionAction::Reset(reset_config))
11383 } else {
11384 None
11385 };
11386
11387 Ok(action)
11388 }
11389
11390 fn parse_alter_function_actions(
11391 &mut self,
11392 ) -> Result<(Vec<AlterFunctionAction>, bool), ParserError> {
11393 let mut actions = vec![];
11394 while let Some(action) = self.parse_alter_function_action()? {
11395 actions.push(action);
11396 }
11397 if actions.is_empty() {
11398 return self.expected_ref("at least one ALTER FUNCTION action", self.peek_token_ref());
11399 }
11400 let restrict = self.parse_keyword(Keyword::RESTRICT);
11401 Ok((actions, restrict))
11402 }
11403
11404 pub fn parse_alter_function(
11406 &mut self,
11407 kind: AlterFunctionKind,
11408 ) -> Result<Statement, ParserError> {
11409 let (function, aggregate_star, aggregate_order_by) = match kind {
11410 AlterFunctionKind::Function => (self.parse_function_desc()?, false, None),
11411 AlterFunctionKind::Aggregate => self.parse_alter_aggregate_signature()?,
11412 };
11413
11414 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11415 let new_name = self.parse_identifier()?;
11416 AlterFunctionOperation::RenameTo { new_name }
11417 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11418 AlterFunctionOperation::OwnerTo(self.parse_owner()?)
11419 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11420 AlterFunctionOperation::SetSchema {
11421 schema_name: self.parse_object_name(false)?,
11422 }
11423 } else if matches!(kind, AlterFunctionKind::Function) && self.parse_keyword(Keyword::NO) {
11424 if !self.parse_keyword(Keyword::DEPENDS) {
11425 return self.expected_ref("DEPENDS after NO", self.peek_token_ref());
11426 }
11427 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11428 AlterFunctionOperation::DependsOnExtension {
11429 no: true,
11430 extension_name: self.parse_object_name(false)?,
11431 }
11432 } else if matches!(kind, AlterFunctionKind::Function)
11433 && self.parse_keyword(Keyword::DEPENDS)
11434 {
11435 self.expect_keywords(&[Keyword::ON, Keyword::EXTENSION])?;
11436 AlterFunctionOperation::DependsOnExtension {
11437 no: false,
11438 extension_name: self.parse_object_name(false)?,
11439 }
11440 } else if matches!(kind, AlterFunctionKind::Function) {
11441 let (actions, restrict) = self.parse_alter_function_actions()?;
11442 AlterFunctionOperation::Actions { actions, restrict }
11443 } else {
11444 return self.expected_ref(
11445 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER AGGREGATE",
11446 self.peek_token_ref(),
11447 );
11448 };
11449
11450 Ok(Statement::AlterFunction(AlterFunction {
11451 kind,
11452 function,
11453 aggregate_order_by,
11454 aggregate_star,
11455 operation,
11456 }))
11457 }
11458
11459 pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
11461 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11462 let only = self.parse_keyword(Keyword::ONLY); let table_name = self.parse_object_name(false)?;
11464 let on_cluster = self.parse_optional_on_cluster()?;
11465 let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
11466
11467 let mut location = None;
11468 if self.parse_keyword(Keyword::LOCATION) {
11469 location = Some(HiveSetLocation {
11470 has_set: false,
11471 location: self.parse_identifier()?,
11472 });
11473 } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
11474 location = Some(HiveSetLocation {
11475 has_set: true,
11476 location: self.parse_identifier()?,
11477 });
11478 }
11479
11480 let end_token = if self.peek_token_ref().token == Token::SemiColon {
11481 self.peek_token_ref().clone()
11482 } else {
11483 self.get_current_token().clone()
11484 };
11485
11486 Ok(AlterTable {
11487 name: table_name,
11488 if_exists,
11489 only,
11490 operations,
11491 location,
11492 on_cluster,
11493 table_type: if iceberg {
11494 Some(AlterTableType::Iceberg)
11495 } else {
11496 None
11497 },
11498 end_token: AttachedToken(end_token),
11499 }
11500 .into())
11501 }
11502
11503 pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
11505 let name = self.parse_object_name(false)?;
11506 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11507
11508 let with_options = self.parse_options(Keyword::WITH)?;
11509
11510 self.expect_keyword_is(Keyword::AS)?;
11511 let query = self.parse_query()?;
11512
11513 Ok(Statement::AlterView {
11514 name,
11515 columns,
11516 query,
11517 with_options,
11518 })
11519 }
11520
11521 pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
11523 let name = self.parse_object_name(false)?;
11524
11525 if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11526 let new_name = self.parse_identifier()?;
11527 Ok(Statement::AlterType(AlterType {
11528 name,
11529 operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
11530 }))
11531 } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
11532 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
11533 let new_enum_value = self.parse_identifier()?;
11534 let position = if self.parse_keyword(Keyword::BEFORE) {
11535 Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
11536 } else if self.parse_keyword(Keyword::AFTER) {
11537 Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
11538 } else {
11539 None
11540 };
11541
11542 Ok(Statement::AlterType(AlterType {
11543 name,
11544 operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
11545 if_not_exists,
11546 value: new_enum_value,
11547 position,
11548 }),
11549 }))
11550 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
11551 let existing_enum_value = self.parse_identifier()?;
11552 self.expect_keyword(Keyword::TO)?;
11553 let new_enum_value = self.parse_identifier()?;
11554
11555 Ok(Statement::AlterType(AlterType {
11556 name,
11557 operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
11558 from: existing_enum_value,
11559 to: new_enum_value,
11560 }),
11561 }))
11562 } else {
11563 self.expected_ref(
11564 "{RENAME TO | { RENAME | ADD } VALUE}",
11565 self.peek_token_ref(),
11566 )
11567 }
11568 }
11569
11570 pub fn parse_alter_collation(&mut self) -> Result<AlterCollation, ParserError> {
11574 let name = self.parse_object_name(false)?;
11575 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11576 AlterCollationOperation::RenameTo {
11577 new_name: self.parse_identifier()?,
11578 }
11579 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11580 AlterCollationOperation::OwnerTo(self.parse_owner()?)
11581 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11582 AlterCollationOperation::SetSchema {
11583 schema_name: self.parse_object_name(false)?,
11584 }
11585 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::VERSION]) {
11586 AlterCollationOperation::RefreshVersion
11587 } else {
11588 return self.expected_ref(
11589 "RENAME TO, OWNER TO, SET SCHEMA, or REFRESH VERSION after ALTER COLLATION",
11590 self.peek_token_ref(),
11591 );
11592 };
11593
11594 Ok(AlterCollation { name, operation })
11595 }
11596
11597 pub fn parse_alter_operator(&mut self) -> Result<AlterOperator, ParserError> {
11601 let name = self.parse_operator_name()?;
11602
11603 self.expect_token(&Token::LParen)?;
11605
11606 let left_type = if self.parse_keyword(Keyword::NONE) {
11607 None
11608 } else {
11609 Some(self.parse_data_type()?)
11610 };
11611
11612 self.expect_token(&Token::Comma)?;
11613 let right_type = self.parse_data_type()?;
11614 self.expect_token(&Token::RParen)?;
11615
11616 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11618 let owner = if self.parse_keyword(Keyword::CURRENT_ROLE) {
11619 Owner::CurrentRole
11620 } else if self.parse_keyword(Keyword::CURRENT_USER) {
11621 Owner::CurrentUser
11622 } else if self.parse_keyword(Keyword::SESSION_USER) {
11623 Owner::SessionUser
11624 } else {
11625 Owner::Ident(self.parse_identifier()?)
11626 };
11627 AlterOperatorOperation::OwnerTo(owner)
11628 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11629 let schema_name = self.parse_object_name(false)?;
11630 AlterOperatorOperation::SetSchema { schema_name }
11631 } else if self.parse_keyword(Keyword::SET) {
11632 self.expect_token(&Token::LParen)?;
11633
11634 let mut options = Vec::new();
11635 loop {
11636 let keyword = self.expect_one_of_keywords(&[
11637 Keyword::RESTRICT,
11638 Keyword::JOIN,
11639 Keyword::COMMUTATOR,
11640 Keyword::NEGATOR,
11641 Keyword::HASHES,
11642 Keyword::MERGES,
11643 ])?;
11644
11645 match keyword {
11646 Keyword::RESTRICT => {
11647 self.expect_token(&Token::Eq)?;
11648 let proc_name = if self.parse_keyword(Keyword::NONE) {
11649 None
11650 } else {
11651 Some(self.parse_object_name(false)?)
11652 };
11653 options.push(OperatorOption::Restrict(proc_name));
11654 }
11655 Keyword::JOIN => {
11656 self.expect_token(&Token::Eq)?;
11657 let proc_name = if self.parse_keyword(Keyword::NONE) {
11658 None
11659 } else {
11660 Some(self.parse_object_name(false)?)
11661 };
11662 options.push(OperatorOption::Join(proc_name));
11663 }
11664 Keyword::COMMUTATOR => {
11665 self.expect_token(&Token::Eq)?;
11666 let op_name = self.parse_operator_name()?;
11667 options.push(OperatorOption::Commutator(op_name));
11668 }
11669 Keyword::NEGATOR => {
11670 self.expect_token(&Token::Eq)?;
11671 let op_name = self.parse_operator_name()?;
11672 options.push(OperatorOption::Negator(op_name));
11673 }
11674 Keyword::HASHES => {
11675 options.push(OperatorOption::Hashes);
11676 }
11677 Keyword::MERGES => {
11678 options.push(OperatorOption::Merges);
11679 }
11680 unexpected_keyword => return Err(ParserError::ParserError(
11681 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in operator option"),
11682 )),
11683 }
11684
11685 if !self.consume_token(&Token::Comma) {
11686 break;
11687 }
11688 }
11689
11690 self.expect_token(&Token::RParen)?;
11691 AlterOperatorOperation::Set { options }
11692 } else {
11693 return self.expected_ref(
11694 "OWNER TO, SET SCHEMA, or SET after ALTER OPERATOR",
11695 self.peek_token_ref(),
11696 );
11697 };
11698
11699 Ok(AlterOperator {
11700 name,
11701 left_type,
11702 right_type,
11703 operation,
11704 })
11705 }
11706
11707 fn parse_operator_family_add_operator(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11709 let strategy_number = self.parse_literal_uint()?;
11710 let operator_name = self.parse_operator_name()?;
11711
11712 self.expect_token(&Token::LParen)?;
11714 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11715 self.expect_token(&Token::RParen)?;
11716
11717 let purpose = if self.parse_keyword(Keyword::FOR) {
11719 if self.parse_keyword(Keyword::SEARCH) {
11720 Some(OperatorPurpose::ForSearch)
11721 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
11722 let sort_family = self.parse_object_name(false)?;
11723 Some(OperatorPurpose::ForOrderBy { sort_family })
11724 } else {
11725 return self.expected_ref("SEARCH or ORDER BY after FOR", self.peek_token_ref());
11726 }
11727 } else {
11728 None
11729 };
11730
11731 Ok(OperatorFamilyItem::Operator {
11732 strategy_number,
11733 operator_name,
11734 op_types,
11735 purpose,
11736 })
11737 }
11738
11739 fn parse_operator_family_add_function(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11741 let support_number = self.parse_literal_uint()?;
11742
11743 let op_types =
11745 if self.consume_token(&Token::LParen) && self.peek_token_ref().token != Token::RParen {
11746 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11747 self.expect_token(&Token::RParen)?;
11748 Some(types)
11749 } else if self.consume_token(&Token::LParen) {
11750 self.expect_token(&Token::RParen)?;
11751 Some(vec![])
11752 } else {
11753 None
11754 };
11755
11756 let function_name = self.parse_object_name(false)?;
11757
11758 let argument_types = if self.consume_token(&Token::LParen) {
11760 if self.peek_token_ref().token == Token::RParen {
11761 self.expect_token(&Token::RParen)?;
11762 vec![]
11763 } else {
11764 let types = self.parse_comma_separated(Parser::parse_data_type)?;
11765 self.expect_token(&Token::RParen)?;
11766 types
11767 }
11768 } else {
11769 vec![]
11770 };
11771
11772 Ok(OperatorFamilyItem::Function {
11773 support_number,
11774 op_types,
11775 function_name,
11776 argument_types,
11777 })
11778 }
11779
11780 fn parse_operator_family_drop_operator(
11782 &mut self,
11783 ) -> Result<OperatorFamilyDropItem, ParserError> {
11784 let strategy_number = self.parse_literal_uint()?;
11785
11786 self.expect_token(&Token::LParen)?;
11788 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11789 self.expect_token(&Token::RParen)?;
11790
11791 Ok(OperatorFamilyDropItem::Operator {
11792 strategy_number,
11793 op_types,
11794 })
11795 }
11796
11797 fn parse_operator_family_drop_function(
11799 &mut self,
11800 ) -> Result<OperatorFamilyDropItem, ParserError> {
11801 let support_number = self.parse_literal_uint()?;
11802
11803 self.expect_token(&Token::LParen)?;
11805 let op_types = self.parse_comma_separated(Parser::parse_data_type)?;
11806 self.expect_token(&Token::RParen)?;
11807
11808 Ok(OperatorFamilyDropItem::Function {
11809 support_number,
11810 op_types,
11811 })
11812 }
11813
11814 fn parse_operator_family_add_item(&mut self) -> Result<OperatorFamilyItem, ParserError> {
11816 if self.parse_keyword(Keyword::OPERATOR) {
11817 self.parse_operator_family_add_operator()
11818 } else if self.parse_keyword(Keyword::FUNCTION) {
11819 self.parse_operator_family_add_function()
11820 } else {
11821 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11822 }
11823 }
11824
11825 fn parse_operator_family_drop_item(&mut self) -> Result<OperatorFamilyDropItem, ParserError> {
11827 if self.parse_keyword(Keyword::OPERATOR) {
11828 self.parse_operator_family_drop_operator()
11829 } else if self.parse_keyword(Keyword::FUNCTION) {
11830 self.parse_operator_family_drop_function()
11831 } else {
11832 self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
11833 }
11834 }
11835
11836 pub fn parse_alter_operator_family(&mut self) -> Result<AlterOperatorFamily, ParserError> {
11839 let name = self.parse_object_name(false)?;
11840 self.expect_keyword(Keyword::USING)?;
11841 let using = self.parse_identifier()?;
11842
11843 let operation = if self.parse_keyword(Keyword::ADD) {
11844 let items = self.parse_comma_separated(Parser::parse_operator_family_add_item)?;
11845 AlterOperatorFamilyOperation::Add { items }
11846 } else if self.parse_keyword(Keyword::DROP) {
11847 let items = self.parse_comma_separated(Parser::parse_operator_family_drop_item)?;
11848 AlterOperatorFamilyOperation::Drop { items }
11849 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11850 let new_name = self.parse_object_name(false)?;
11851 AlterOperatorFamilyOperation::RenameTo { new_name }
11852 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11853 let owner = self.parse_owner()?;
11854 AlterOperatorFamilyOperation::OwnerTo(owner)
11855 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11856 let schema_name = self.parse_object_name(false)?;
11857 AlterOperatorFamilyOperation::SetSchema { schema_name }
11858 } else {
11859 return self.expected_ref(
11860 "ADD, DROP, RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR FAMILY",
11861 self.peek_token_ref(),
11862 );
11863 };
11864
11865 Ok(AlterOperatorFamily {
11866 name,
11867 using,
11868 operation,
11869 })
11870 }
11871
11872 pub fn parse_alter_operator_class(&mut self) -> Result<AlterOperatorClass, ParserError> {
11876 let name = self.parse_object_name(false)?;
11877 self.expect_keyword(Keyword::USING)?;
11878 let using = self.parse_identifier()?;
11879
11880 let operation = if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11881 let new_name = self.parse_object_name(false)?;
11882 AlterOperatorClassOperation::RenameTo { new_name }
11883 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11884 let owner = self.parse_owner()?;
11885 AlterOperatorClassOperation::OwnerTo(owner)
11886 } else if self.parse_keywords(&[Keyword::SET, Keyword::SCHEMA]) {
11887 let schema_name = self.parse_object_name(false)?;
11888 AlterOperatorClassOperation::SetSchema { schema_name }
11889 } else {
11890 return self.expected_ref(
11891 "RENAME TO, OWNER TO, or SET SCHEMA after ALTER OPERATOR CLASS",
11892 self.peek_token_ref(),
11893 );
11894 };
11895
11896 Ok(AlterOperatorClass {
11897 name,
11898 using,
11899 operation,
11900 })
11901 }
11902
11903 pub fn parse_alter_schema(&mut self) -> Result<Statement, ParserError> {
11907 self.expect_keywords(&[Keyword::ALTER, Keyword::SCHEMA])?;
11908 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
11909 let name = self.parse_object_name(false)?;
11910 let operation = if self.parse_keywords(&[Keyword::SET, Keyword::OPTIONS]) {
11911 self.prev_token();
11912 let options = self.parse_options(Keyword::OPTIONS)?;
11913 AlterSchemaOperation::SetOptionsParens { options }
11914 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT, Keyword::COLLATE]) {
11915 let collate = self.parse_expr()?;
11916 AlterSchemaOperation::SetDefaultCollate { collate }
11917 } else if self.parse_keywords(&[Keyword::ADD, Keyword::REPLICA]) {
11918 let replica = self.parse_identifier()?;
11919 let options = if self.peek_keyword(Keyword::OPTIONS) {
11920 Some(self.parse_options(Keyword::OPTIONS)?)
11921 } else {
11922 None
11923 };
11924 AlterSchemaOperation::AddReplica { replica, options }
11925 } else if self.parse_keywords(&[Keyword::DROP, Keyword::REPLICA]) {
11926 let replica = self.parse_identifier()?;
11927 AlterSchemaOperation::DropReplica { replica }
11928 } else if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
11929 let new_name = self.parse_object_name(false)?;
11930 AlterSchemaOperation::Rename { name: new_name }
11931 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
11932 let owner = self.parse_owner()?;
11933 AlterSchemaOperation::OwnerTo { owner }
11934 } else {
11935 return self.expected_ref("ALTER SCHEMA operation", self.peek_token_ref());
11936 };
11937 Ok(Statement::AlterSchema(AlterSchema {
11938 name,
11939 if_exists,
11940 operations: vec![operation],
11941 }))
11942 }
11943
11944 pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
11947 let object_name = self.parse_object_name(false)?;
11948 if self.peek_token_ref().token == Token::LParen {
11949 match self.parse_function(object_name)? {
11950 Expr::Function(f) => Ok(Statement::Call(f)),
11951 other => parser_err!(
11952 format!("Expected a simple procedure call but found: {other}"),
11953 self.peek_token_ref().span.start
11954 ),
11955 }
11956 } else {
11957 Ok(Statement::Call(Function {
11958 name: object_name,
11959 uses_odbc_syntax: false,
11960 parameters: FunctionArguments::None,
11961 args: FunctionArguments::None,
11962 over: None,
11963 filter: None,
11964 null_treatment: None,
11965 within_group: vec![],
11966 }))
11967 }
11968 }
11969
11970 pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
11972 let source;
11973 if self.consume_token(&Token::LParen) {
11974 source = CopySource::Query(self.parse_query()?);
11975 self.expect_token(&Token::RParen)?;
11976 } else {
11977 let table_name = self.parse_object_name(false)?;
11978 let columns = self.parse_parenthesized_column_list(Optional, false)?;
11979 source = CopySource::Table {
11980 table_name,
11981 columns,
11982 };
11983 }
11984 let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
11985 Some(Keyword::FROM) => false,
11986 Some(Keyword::TO) => true,
11987 _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
11988 };
11989 if !to {
11990 if let CopySource::Query(_) = source {
11993 return Err(ParserError::ParserError(
11994 "COPY ... FROM does not support query as a source".to_string(),
11995 ));
11996 }
11997 }
11998 let target = if self.parse_keyword(Keyword::STDIN) {
11999 CopyTarget::Stdin
12000 } else if self.parse_keyword(Keyword::STDOUT) {
12001 CopyTarget::Stdout
12002 } else if self.parse_keyword(Keyword::PROGRAM) {
12003 CopyTarget::Program {
12004 command: self.parse_literal_string()?,
12005 }
12006 } else {
12007 CopyTarget::File {
12008 filename: self.parse_literal_string()?,
12009 }
12010 };
12011 let _ = self.parse_keyword(Keyword::WITH); let mut options = vec![];
12013 if self.consume_token(&Token::LParen) {
12014 options = self.parse_comma_separated(Parser::parse_copy_option)?;
12015 self.expect_token(&Token::RParen)?;
12016 }
12017 let mut legacy_options = vec![];
12018 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
12019 legacy_options.push(opt);
12020 }
12021 let values =
12022 if matches!(target, CopyTarget::Stdin) && self.peek_token_ref().token != Token::EOF {
12023 self.expect_token(&Token::SemiColon)?;
12024 self.parse_tsv()
12025 } else {
12026 vec![]
12027 };
12028 Ok(Statement::Copy {
12029 source,
12030 to,
12031 target,
12032 options,
12033 legacy_options,
12034 values,
12035 })
12036 }
12037
12038 fn parse_open(&mut self) -> Result<Statement, ParserError> {
12040 self.expect_keyword(Keyword::OPEN)?;
12041 Ok(Statement::Open(OpenStatement {
12042 cursor_name: self.parse_identifier()?,
12043 }))
12044 }
12045
12046 pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
12048 let cursor = if self.parse_keyword(Keyword::ALL) {
12049 CloseCursor::All
12050 } else {
12051 let name = self.parse_identifier()?;
12052
12053 CloseCursor::Specific { name }
12054 };
12055
12056 Ok(Statement::Close { cursor })
12057 }
12058
12059 fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
12060 let ret = match self.parse_one_of_keywords(&[
12061 Keyword::FORMAT,
12062 Keyword::FREEZE,
12063 Keyword::DELIMITER,
12064 Keyword::NULL,
12065 Keyword::HEADER,
12066 Keyword::QUOTE,
12067 Keyword::ESCAPE,
12068 Keyword::FORCE_QUOTE,
12069 Keyword::FORCE_NOT_NULL,
12070 Keyword::FORCE_NULL,
12071 Keyword::ENCODING,
12072 ]) {
12073 Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
12074 Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
12075 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12076 Some(Keyword::FALSE)
12077 )),
12078 Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
12079 Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
12080 Some(Keyword::HEADER) => CopyOption::Header(!matches!(
12081 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
12082 Some(Keyword::FALSE)
12083 )),
12084 Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
12085 Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
12086 Some(Keyword::FORCE_QUOTE) => {
12087 CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
12088 }
12089 Some(Keyword::FORCE_NOT_NULL) => {
12090 CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12091 }
12092 Some(Keyword::FORCE_NULL) => {
12093 CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
12094 }
12095 Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
12096 _ => self.expected_ref("option", self.peek_token_ref())?,
12097 };
12098 Ok(ret)
12099 }
12100
12101 fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
12102 if self.parse_keyword(Keyword::FORMAT) {
12104 let _ = self.parse_keyword(Keyword::AS);
12105 }
12106
12107 let ret = match self.parse_one_of_keywords(&[
12108 Keyword::ACCEPTANYDATE,
12109 Keyword::ACCEPTINVCHARS,
12110 Keyword::ADDQUOTES,
12111 Keyword::ALLOWOVERWRITE,
12112 Keyword::BINARY,
12113 Keyword::BLANKSASNULL,
12114 Keyword::BZIP2,
12115 Keyword::CLEANPATH,
12116 Keyword::COMPUPDATE,
12117 Keyword::CREDENTIALS,
12118 Keyword::CSV,
12119 Keyword::DATEFORMAT,
12120 Keyword::DELIMITER,
12121 Keyword::EMPTYASNULL,
12122 Keyword::ENCRYPTED,
12123 Keyword::ESCAPE,
12124 Keyword::EXTENSION,
12125 Keyword::FIXEDWIDTH,
12126 Keyword::GZIP,
12127 Keyword::HEADER,
12128 Keyword::IAM_ROLE,
12129 Keyword::IGNOREHEADER,
12130 Keyword::JSON,
12131 Keyword::MANIFEST,
12132 Keyword::MAXFILESIZE,
12133 Keyword::NULL,
12134 Keyword::PARALLEL,
12135 Keyword::PARQUET,
12136 Keyword::PARTITION,
12137 Keyword::REGION,
12138 Keyword::REMOVEQUOTES,
12139 Keyword::ROWGROUPSIZE,
12140 Keyword::STATUPDATE,
12141 Keyword::TIMEFORMAT,
12142 Keyword::TRUNCATECOLUMNS,
12143 Keyword::ZSTD,
12144 ]) {
12145 Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
12146 Some(Keyword::ACCEPTINVCHARS) => {
12147 let _ = self.parse_keyword(Keyword::AS); let ch = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12149 Some(self.parse_literal_string()?)
12150 } else {
12151 None
12152 };
12153 CopyLegacyOption::AcceptInvChars(ch)
12154 }
12155 Some(Keyword::ADDQUOTES) => CopyLegacyOption::AddQuotes,
12156 Some(Keyword::ALLOWOVERWRITE) => CopyLegacyOption::AllowOverwrite,
12157 Some(Keyword::BINARY) => CopyLegacyOption::Binary,
12158 Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
12159 Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
12160 Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
12161 Some(Keyword::COMPUPDATE) => {
12162 let preset = self.parse_keyword(Keyword::PRESET);
12163 let enabled = match self.parse_one_of_keywords(&[
12164 Keyword::TRUE,
12165 Keyword::FALSE,
12166 Keyword::ON,
12167 Keyword::OFF,
12168 ]) {
12169 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12170 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12171 _ => None,
12172 };
12173 CopyLegacyOption::CompUpdate { preset, enabled }
12174 }
12175 Some(Keyword::CREDENTIALS) => {
12176 CopyLegacyOption::Credentials(self.parse_literal_string()?)
12177 }
12178 Some(Keyword::CSV) => CopyLegacyOption::Csv({
12179 let mut opts = vec![];
12180 while let Some(opt) =
12181 self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())?
12182 {
12183 opts.push(opt);
12184 }
12185 opts
12186 }),
12187 Some(Keyword::DATEFORMAT) => {
12188 let _ = self.parse_keyword(Keyword::AS);
12189 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12190 Some(self.parse_literal_string()?)
12191 } else {
12192 None
12193 };
12194 CopyLegacyOption::DateFormat(fmt)
12195 }
12196 Some(Keyword::DELIMITER) => {
12197 let _ = self.parse_keyword(Keyword::AS);
12198 CopyLegacyOption::Delimiter(self.parse_literal_char()?)
12199 }
12200 Some(Keyword::EMPTYASNULL) => CopyLegacyOption::EmptyAsNull,
12201 Some(Keyword::ENCRYPTED) => {
12202 let auto = self.parse_keyword(Keyword::AUTO);
12203 CopyLegacyOption::Encrypted { auto }
12204 }
12205 Some(Keyword::ESCAPE) => CopyLegacyOption::Escape,
12206 Some(Keyword::EXTENSION) => {
12207 let ext = self.parse_literal_string()?;
12208 CopyLegacyOption::Extension(ext)
12209 }
12210 Some(Keyword::FIXEDWIDTH) => {
12211 let spec = self.parse_literal_string()?;
12212 CopyLegacyOption::FixedWidth(spec)
12213 }
12214 Some(Keyword::GZIP) => CopyLegacyOption::Gzip,
12215 Some(Keyword::HEADER) => CopyLegacyOption::Header,
12216 Some(Keyword::IAM_ROLE) => CopyLegacyOption::IamRole(self.parse_iam_role_kind()?),
12217 Some(Keyword::IGNOREHEADER) => {
12218 let _ = self.parse_keyword(Keyword::AS);
12219 let num_rows = self.parse_literal_uint()?;
12220 CopyLegacyOption::IgnoreHeader(num_rows)
12221 }
12222 Some(Keyword::JSON) => {
12223 let _ = self.parse_keyword(Keyword::AS);
12224 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12225 Some(self.parse_literal_string()?)
12226 } else {
12227 None
12228 };
12229 CopyLegacyOption::Json(fmt)
12230 }
12231 Some(Keyword::MANIFEST) => {
12232 let verbose = self.parse_keyword(Keyword::VERBOSE);
12233 CopyLegacyOption::Manifest { verbose }
12234 }
12235 Some(Keyword::MAXFILESIZE) => {
12236 let _ = self.parse_keyword(Keyword::AS);
12237 let size = self.parse_number_value()?;
12238 let unit = match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12239 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12240 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12241 _ => None,
12242 };
12243 CopyLegacyOption::MaxFileSize(FileSize { size, unit })
12244 }
12245 Some(Keyword::NULL) => {
12246 let _ = self.parse_keyword(Keyword::AS);
12247 CopyLegacyOption::Null(self.parse_literal_string()?)
12248 }
12249 Some(Keyword::PARALLEL) => {
12250 let enabled = match self.parse_one_of_keywords(&[
12251 Keyword::TRUE,
12252 Keyword::FALSE,
12253 Keyword::ON,
12254 Keyword::OFF,
12255 ]) {
12256 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12257 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12258 _ => None,
12259 };
12260 CopyLegacyOption::Parallel(enabled)
12261 }
12262 Some(Keyword::PARQUET) => CopyLegacyOption::Parquet,
12263 Some(Keyword::PARTITION) => {
12264 self.expect_keyword(Keyword::BY)?;
12265 let columns = self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?;
12266 let include = self.parse_keyword(Keyword::INCLUDE);
12267 CopyLegacyOption::PartitionBy(UnloadPartitionBy { columns, include })
12268 }
12269 Some(Keyword::REGION) => {
12270 let _ = self.parse_keyword(Keyword::AS);
12271 let region = self.parse_literal_string()?;
12272 CopyLegacyOption::Region(region)
12273 }
12274 Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
12275 Some(Keyword::ROWGROUPSIZE) => {
12276 let _ = self.parse_keyword(Keyword::AS);
12277 let file_size = self.parse_file_size()?;
12278 CopyLegacyOption::RowGroupSize(file_size)
12279 }
12280 Some(Keyword::STATUPDATE) => {
12281 let enabled = match self.parse_one_of_keywords(&[
12282 Keyword::TRUE,
12283 Keyword::FALSE,
12284 Keyword::ON,
12285 Keyword::OFF,
12286 ]) {
12287 Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
12288 Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
12289 _ => None,
12290 };
12291 CopyLegacyOption::StatUpdate(enabled)
12292 }
12293 Some(Keyword::TIMEFORMAT) => {
12294 let _ = self.parse_keyword(Keyword::AS);
12295 let fmt = if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
12296 Some(self.parse_literal_string()?)
12297 } else {
12298 None
12299 };
12300 CopyLegacyOption::TimeFormat(fmt)
12301 }
12302 Some(Keyword::TRUNCATECOLUMNS) => CopyLegacyOption::TruncateColumns,
12303 Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
12304 _ => self.expected_ref("option", self.peek_token_ref())?,
12305 };
12306 Ok(ret)
12307 }
12308
12309 fn parse_file_size(&mut self) -> Result<FileSize, ParserError> {
12310 let size = self.parse_number_value()?;
12311 let unit = self.maybe_parse_file_size_unit();
12312 Ok(FileSize { size, unit })
12313 }
12314
12315 fn maybe_parse_file_size_unit(&mut self) -> Option<FileSizeUnit> {
12316 match self.parse_one_of_keywords(&[Keyword::MB, Keyword::GB]) {
12317 Some(Keyword::MB) => Some(FileSizeUnit::MB),
12318 Some(Keyword::GB) => Some(FileSizeUnit::GB),
12319 _ => None,
12320 }
12321 }
12322
12323 fn parse_iam_role_kind(&mut self) -> Result<IamRoleKind, ParserError> {
12324 if self.parse_keyword(Keyword::DEFAULT) {
12325 Ok(IamRoleKind::Default)
12326 } else {
12327 let arn = self.parse_literal_string()?;
12328 Ok(IamRoleKind::Arn(arn))
12329 }
12330 }
12331
12332 fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
12333 let ret = match self.parse_one_of_keywords(&[
12334 Keyword::HEADER,
12335 Keyword::QUOTE,
12336 Keyword::ESCAPE,
12337 Keyword::FORCE,
12338 ]) {
12339 Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
12340 Some(Keyword::QUOTE) => {
12341 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
12343 }
12344 Some(Keyword::ESCAPE) => {
12345 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
12347 }
12348 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
12349 CopyLegacyCsvOption::ForceNotNull(
12350 self.parse_comma_separated(|p| p.parse_identifier())?,
12351 )
12352 }
12353 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
12354 CopyLegacyCsvOption::ForceQuote(
12355 self.parse_comma_separated(|p| p.parse_identifier())?,
12356 )
12357 }
12358 _ => self.expected_ref("csv option", self.peek_token_ref())?,
12359 };
12360 Ok(ret)
12361 }
12362
12363 fn parse_literal_char(&mut self) -> Result<char, ParserError> {
12364 let s = self.parse_literal_string()?;
12365 if s.len() != 1 {
12366 let loc = self
12367 .tokens
12368 .get(self.index - 1)
12369 .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
12370 return parser_err!(format!("Expect a char, found {s:?}"), loc);
12371 }
12372 Ok(s.chars().next().unwrap())
12373 }
12374
12375 pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
12378 self.parse_tab_value()
12379 }
12380
12381 pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
12383 let mut values = vec![];
12384 let mut content = String::new();
12385 while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
12386 match t {
12387 Token::Whitespace(Whitespace::Tab) => {
12388 values.push(Some(core::mem::take(&mut content)));
12389 }
12390 Token::Whitespace(Whitespace::Newline) => {
12391 values.push(Some(core::mem::take(&mut content)));
12392 }
12393 Token::Backslash => {
12394 if self.consume_token(&Token::Period) {
12395 return values;
12396 }
12397 if let Token::Word(w) = self.next_token().token {
12398 if w.value == "N" {
12399 values.push(None);
12400 }
12401 }
12402 }
12403 _ => {
12404 content.push_str(&t.to_string());
12405 }
12406 }
12407 }
12408 values
12409 }
12410
12411 pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12413 let next_token = self.next_token();
12414 let span = next_token.span;
12415 let ok_value = |value: Value| Ok(value.with_span(span));
12416 match next_token.token {
12417 Token::Word(w) => match w.keyword {
12418 Keyword::TRUE if self.dialect.supports_boolean_literals() => {
12419 ok_value(Value::Boolean(true))
12420 }
12421 Keyword::FALSE if self.dialect.supports_boolean_literals() => {
12422 ok_value(Value::Boolean(false))
12423 }
12424 Keyword::NULL => ok_value(Value::Null),
12425 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
12426 Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
12427 Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
12428 _ => self.expected(
12429 "A value?",
12430 TokenWithSpan {
12431 token: Token::Word(w),
12432 span,
12433 },
12434 )?,
12435 },
12436 _ => self.expected(
12437 "a concrete value",
12438 TokenWithSpan {
12439 token: Token::Word(w),
12440 span,
12441 },
12442 ),
12443 },
12444 Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
12448 Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(
12449 self.maybe_concat_string_literal(s.to_string()),
12450 )),
12451 Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(
12452 self.maybe_concat_string_literal(s.to_string()),
12453 )),
12454 Token::TripleSingleQuotedString(ref s) => {
12455 ok_value(Value::TripleSingleQuotedString(s.to_string()))
12456 }
12457 Token::TripleDoubleQuotedString(ref s) => {
12458 ok_value(Value::TripleDoubleQuotedString(s.to_string()))
12459 }
12460 Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
12461 Token::SingleQuotedByteStringLiteral(ref s) => {
12462 ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
12463 }
12464 Token::DoubleQuotedByteStringLiteral(ref s) => {
12465 ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
12466 }
12467 Token::TripleSingleQuotedByteStringLiteral(ref s) => {
12468 ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
12469 }
12470 Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
12471 ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
12472 }
12473 Token::SingleQuotedRawStringLiteral(ref s) => {
12474 ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
12475 }
12476 Token::DoubleQuotedRawStringLiteral(ref s) => {
12477 ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
12478 }
12479 Token::TripleSingleQuotedRawStringLiteral(ref s) => {
12480 ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
12481 }
12482 Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
12483 ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
12484 }
12485 Token::NationalStringLiteral(ref s) => {
12486 ok_value(Value::NationalStringLiteral(s.to_string()))
12487 }
12488 Token::QuoteDelimitedStringLiteral(v) => {
12489 ok_value(Value::QuoteDelimitedStringLiteral(v))
12490 }
12491 Token::NationalQuoteDelimitedStringLiteral(v) => {
12492 ok_value(Value::NationalQuoteDelimitedStringLiteral(v))
12493 }
12494 Token::EscapedStringLiteral(ref s) => {
12495 ok_value(Value::EscapedStringLiteral(s.to_string()))
12496 }
12497 Token::UnicodeStringLiteral(ref s) => {
12498 ok_value(Value::UnicodeStringLiteral(s.to_string()))
12499 }
12500 Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
12501 Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
12502 tok @ Token::Colon | tok @ Token::AtSign => {
12503 let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
12511 let ident = match next_token.token {
12512 Token::Word(w) => Ok(w.into_ident(next_token.span)),
12513 Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
12514 _ => self.expected("placeholder", next_token),
12515 }?;
12516 Ok(Value::Placeholder(format!("{tok}{}", ident.value))
12517 .with_span(Span::new(span.start, ident.span.end)))
12518 }
12519 unexpected => self.expected(
12520 "a value",
12521 TokenWithSpan {
12522 token: unexpected,
12523 span,
12524 },
12525 ),
12526 }
12527 }
12528
12529 fn maybe_concat_string_literal(&mut self, mut str: String) -> String {
12530 if self.dialect.supports_string_literal_concatenation() {
12531 while let Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s) =
12532 self.peek_token_ref().token
12533 {
12534 str.push_str(s);
12535 self.advance_token();
12536 }
12537 } else if self
12538 .dialect
12539 .supports_string_literal_concatenation_with_newline()
12540 {
12541 let mut after_newline = false;
12544 loop {
12545 match self.peek_token_no_skip().token {
12546 Token::Whitespace(Whitespace::Newline) => {
12547 after_newline = true;
12548 self.next_token_no_skip();
12549 }
12550 Token::Whitespace(_) => {
12551 self.next_token_no_skip();
12552 }
12553 Token::SingleQuotedString(ref s) | Token::DoubleQuotedString(ref s)
12554 if after_newline =>
12555 {
12556 str.push_str(s.clone().as_str());
12557 self.next_token_no_skip();
12558 after_newline = false;
12559 }
12560 _ => break,
12561 }
12562 }
12563 }
12564
12565 str
12566 }
12567
12568 pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
12570 let value_wrapper = self.parse_value()?;
12571 match &value_wrapper.value {
12572 Value::Number(_, _) => Ok(value_wrapper),
12573 Value::Placeholder(_) => Ok(value_wrapper),
12574 _ => {
12575 self.prev_token();
12576 self.expected_ref("literal number", self.peek_token_ref())
12577 }
12578 }
12579 }
12580
12581 pub fn parse_number(&mut self) -> Result<Expr, ParserError> {
12584 let next_token = self.next_token();
12585 match next_token.token {
12586 Token::Plus => Ok(Expr::UnaryOp {
12587 op: UnaryOperator::Plus,
12588 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12589 }),
12590 Token::Minus => Ok(Expr::UnaryOp {
12591 op: UnaryOperator::Minus,
12592 expr: Box::new(Expr::Value(self.parse_number_value()?)),
12593 }),
12594 _ => {
12595 self.prev_token();
12596 Ok(Expr::Value(self.parse_number_value()?))
12597 }
12598 }
12599 }
12600
12601 fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
12602 let next_token = self.next_token();
12603 let span = next_token.span;
12604 match next_token.token {
12605 Token::SingleQuotedString(ref s) => Ok(Expr::Value(
12606 Value::SingleQuotedString(s.to_string()).with_span(span),
12607 )),
12608 Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
12609 Value::DoubleQuotedString(s.to_string()).with_span(span),
12610 )),
12611 Token::HexStringLiteral(ref s) => Ok(Expr::Value(
12612 Value::HexStringLiteral(s.to_string()).with_span(span),
12613 )),
12614 unexpected => self.expected(
12615 "a string value",
12616 TokenWithSpan {
12617 token: unexpected,
12618 span,
12619 },
12620 ),
12621 }
12622 }
12623
12624 pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
12626 let next_token = self.next_token();
12627 match next_token.token {
12628 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
12629 _ => self.expected("literal int", next_token),
12630 }
12631 }
12632
12633 fn parse_create_function_body_string(&mut self) -> Result<CreateFunctionBody, ParserError> {
12636 let parse_string_expr = |parser: &mut Parser| -> Result<Expr, ParserError> {
12637 let peek_token = parser.peek_token();
12638 let span = peek_token.span;
12639 match peek_token.token {
12640 Token::DollarQuotedString(s) if dialect_of!(parser is PostgreSqlDialect | GenericDialect) =>
12641 {
12642 parser.next_token();
12643 Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
12644 }
12645 _ => Ok(Expr::Value(
12646 Value::SingleQuotedString(parser.parse_literal_string()?).with_span(span),
12647 )),
12648 }
12649 };
12650
12651 Ok(CreateFunctionBody::AsBeforeOptions {
12652 body: parse_string_expr(self)?,
12653 link_symbol: if self.consume_token(&Token::Comma) {
12654 Some(parse_string_expr(self)?)
12655 } else {
12656 None
12657 },
12658 })
12659 }
12660
12661 pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
12663 let next_token = self.next_token();
12664 match next_token.token {
12665 Token::Word(Word {
12666 value,
12667 keyword: Keyword::NoKeyword,
12668 ..
12669 }) => Ok(value),
12670 Token::SingleQuotedString(s) => Ok(s),
12671 Token::DoubleQuotedString(s) => Ok(s),
12672 Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
12673 Ok(s)
12674 }
12675 Token::UnicodeStringLiteral(s) => Ok(s),
12676 _ => self.expected("literal string", next_token),
12677 }
12678 }
12679
12680 pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
12682 match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
12683 Some(Keyword::TRUE) => Ok(true),
12684 Some(Keyword::FALSE) => Ok(false),
12685 _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
12686 }
12687 }
12688
12689 fn parse_is_json_predicate(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
12691 let kind = match self.parse_one_of_keywords(&[
12692 Keyword::VALUE,
12693 Keyword::SCALAR,
12694 Keyword::ARRAY,
12695 Keyword::OBJECT,
12696 ]) {
12697 Some(Keyword::VALUE) => Some(JsonPredicateType::Value),
12698 Some(Keyword::SCALAR) => Some(JsonPredicateType::Scalar),
12699 Some(Keyword::ARRAY) => Some(JsonPredicateType::Array),
12700 Some(Keyword::OBJECT) => Some(JsonPredicateType::Object),
12701 _ => None,
12702 };
12703
12704 let unique_keys = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
12705 Some(Keyword::WITH) => {
12706 self.expect_keyword_is(Keyword::UNIQUE)?;
12707 let _ = self.parse_keyword(Keyword::KEYS);
12708 Some(JsonKeyUniqueness::WithUniqueKeys)
12709 }
12710 Some(Keyword::WITHOUT) => {
12711 self.expect_keyword_is(Keyword::UNIQUE)?;
12712 let _ = self.parse_keyword(Keyword::KEYS);
12713 Some(JsonKeyUniqueness::WithoutUniqueKeys)
12714 }
12715 _ => None,
12716 };
12717
12718 Ok(Expr::IsJson {
12719 expr: Box::new(expr),
12720 kind,
12721 unique_keys,
12722 negated,
12723 })
12724 }
12725
12726 pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
12728 let neg = self.parse_keyword(Keyword::NOT);
12729 let normalized_form = self.maybe_parse(|parser| {
12730 match parser.parse_one_of_keywords(&[
12731 Keyword::NFC,
12732 Keyword::NFD,
12733 Keyword::NFKC,
12734 Keyword::NFKD,
12735 ]) {
12736 Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
12737 Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
12738 Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
12739 Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
12740 _ => parser.expected_ref("unicode normalization form", parser.peek_token_ref()),
12741 }
12742 })?;
12743 if self.parse_keyword(Keyword::NORMALIZED) {
12744 return Ok(Expr::IsNormalized {
12745 expr: Box::new(expr),
12746 form: normalized_form,
12747 negated: neg,
12748 });
12749 }
12750 self.expected_ref("unicode normalization form", self.peek_token_ref())
12751 }
12752
12753 pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
12755 self.expect_token(&Token::LParen)?;
12756 let values = self.parse_comma_separated(|parser| {
12757 let name = parser.parse_literal_string()?;
12758 let e = if parser.consume_token(&Token::Eq) {
12759 let value = parser.parse_number()?;
12760 EnumMember::NamedValue(name, value)
12761 } else {
12762 EnumMember::Name(name)
12763 };
12764 Ok(e)
12765 })?;
12766 self.expect_token(&Token::RParen)?;
12767
12768 Ok(values)
12769 }
12770
12771 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
12773 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
12774 if trailing_bracket.0 {
12775 return parser_err!(
12776 format!("unmatched > after parsing data type {ty}"),
12777 self.peek_token_ref()
12778 );
12779 }
12780
12781 Ok(ty)
12782 }
12783
12784 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
12785 fn parse_data_type_helper(
12786 &mut self,
12787 ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
12788 let _guard = self.recursion_counter.try_decrease()?;
12789
12790 let dialect = self.dialect;
12791 self.advance_token();
12792 let next_token = self.get_current_token();
12793 let next_token_index = self.get_current_index();
12794
12795 let mut trailing_bracket: MatchedTrailingBracket = false.into();
12796 let mut data = match &next_token.token {
12797 Token::Word(w) => match w.keyword {
12798 Keyword::BOOLEAN => Ok(DataType::Boolean),
12799 Keyword::BOOL => Ok(DataType::Bool),
12800 Keyword::FLOAT => {
12801 let precision = self.parse_exact_number_optional_precision_scale()?;
12802
12803 if self.parse_keyword(Keyword::UNSIGNED) {
12804 Ok(DataType::FloatUnsigned(precision))
12805 } else {
12806 Ok(DataType::Float(precision))
12807 }
12808 }
12809 Keyword::REAL => {
12810 if self.parse_keyword(Keyword::UNSIGNED) {
12811 Ok(DataType::RealUnsigned)
12812 } else {
12813 Ok(DataType::Real)
12814 }
12815 }
12816 Keyword::FLOAT4 => Ok(DataType::Float4),
12817 Keyword::FLOAT32 => Ok(DataType::Float32),
12818 Keyword::FLOAT64 => Ok(DataType::Float64),
12819 Keyword::FLOAT8 => Ok(DataType::Float8),
12820 Keyword::DOUBLE => {
12821 if self.parse_keyword(Keyword::PRECISION) {
12822 if self.parse_keyword(Keyword::UNSIGNED) {
12823 Ok(DataType::DoublePrecisionUnsigned)
12824 } else {
12825 Ok(DataType::DoublePrecision)
12826 }
12827 } else {
12828 let precision = self.parse_exact_number_optional_precision_scale()?;
12829
12830 if self.parse_keyword(Keyword::UNSIGNED) {
12831 Ok(DataType::DoubleUnsigned(precision))
12832 } else {
12833 Ok(DataType::Double(precision))
12834 }
12835 }
12836 }
12837 Keyword::TINYINT => {
12838 let optional_precision = self.parse_optional_precision();
12839 if self.parse_keyword(Keyword::UNSIGNED) {
12840 Ok(DataType::TinyIntUnsigned(optional_precision?))
12841 } else {
12842 if dialect.supports_data_type_signed_suffix() {
12843 let _ = self.parse_keyword(Keyword::SIGNED);
12844 }
12845 Ok(DataType::TinyInt(optional_precision?))
12846 }
12847 }
12848 Keyword::INT2 => {
12849 let optional_precision = self.parse_optional_precision();
12850 if self.parse_keyword(Keyword::UNSIGNED) {
12851 Ok(DataType::Int2Unsigned(optional_precision?))
12852 } else {
12853 Ok(DataType::Int2(optional_precision?))
12854 }
12855 }
12856 Keyword::SMALLINT => {
12857 let optional_precision = self.parse_optional_precision();
12858 if self.parse_keyword(Keyword::UNSIGNED) {
12859 Ok(DataType::SmallIntUnsigned(optional_precision?))
12860 } else {
12861 if dialect.supports_data_type_signed_suffix() {
12862 let _ = self.parse_keyword(Keyword::SIGNED);
12863 }
12864 Ok(DataType::SmallInt(optional_precision?))
12865 }
12866 }
12867 Keyword::MEDIUMINT => {
12868 let optional_precision = self.parse_optional_precision();
12869 if self.parse_keyword(Keyword::UNSIGNED) {
12870 Ok(DataType::MediumIntUnsigned(optional_precision?))
12871 } else {
12872 if dialect.supports_data_type_signed_suffix() {
12873 let _ = self.parse_keyword(Keyword::SIGNED);
12874 }
12875 Ok(DataType::MediumInt(optional_precision?))
12876 }
12877 }
12878 Keyword::INT => {
12879 let optional_precision = self.parse_optional_precision();
12880 if self.parse_keyword(Keyword::UNSIGNED) {
12881 Ok(DataType::IntUnsigned(optional_precision?))
12882 } else {
12883 if dialect.supports_data_type_signed_suffix() {
12884 let _ = self.parse_keyword(Keyword::SIGNED);
12885 }
12886 Ok(DataType::Int(optional_precision?))
12887 }
12888 }
12889 Keyword::INT4 => {
12890 let optional_precision = self.parse_optional_precision();
12891 if self.parse_keyword(Keyword::UNSIGNED) {
12892 Ok(DataType::Int4Unsigned(optional_precision?))
12893 } else {
12894 Ok(DataType::Int4(optional_precision?))
12895 }
12896 }
12897 Keyword::INT8 => {
12898 let optional_precision = self.parse_optional_precision();
12899 if self.parse_keyword(Keyword::UNSIGNED) {
12900 Ok(DataType::Int8Unsigned(optional_precision?))
12901 } else {
12902 Ok(DataType::Int8(optional_precision?))
12903 }
12904 }
12905 Keyword::INT16 => Ok(DataType::Int16),
12906 Keyword::INT32 => Ok(DataType::Int32),
12907 Keyword::INT64 => Ok(DataType::Int64),
12908 Keyword::INT128 => Ok(DataType::Int128),
12909 Keyword::INT256 => Ok(DataType::Int256),
12910 Keyword::INTEGER => {
12911 let optional_precision = self.parse_optional_precision();
12912 if self.parse_keyword(Keyword::UNSIGNED) {
12913 Ok(DataType::IntegerUnsigned(optional_precision?))
12914 } else {
12915 if dialect.supports_data_type_signed_suffix() {
12916 let _ = self.parse_keyword(Keyword::SIGNED);
12917 }
12918 Ok(DataType::Integer(optional_precision?))
12919 }
12920 }
12921 Keyword::BIGINT => {
12922 let optional_precision = self.parse_optional_precision();
12923 if self.parse_keyword(Keyword::UNSIGNED) {
12924 Ok(DataType::BigIntUnsigned(optional_precision?))
12925 } else {
12926 if dialect.supports_data_type_signed_suffix() {
12927 let _ = self.parse_keyword(Keyword::SIGNED);
12928 }
12929 Ok(DataType::BigInt(optional_precision?))
12930 }
12931 }
12932 Keyword::HUGEINT => Ok(DataType::HugeInt),
12933 Keyword::UBIGINT => Ok(DataType::UBigInt),
12934 Keyword::UHUGEINT => Ok(DataType::UHugeInt),
12935 Keyword::USMALLINT => Ok(DataType::USmallInt),
12936 Keyword::UTINYINT => Ok(DataType::UTinyInt),
12937 Keyword::UINT8 => Ok(DataType::UInt8),
12938 Keyword::UINT16 => Ok(DataType::UInt16),
12939 Keyword::UINT32 => Ok(DataType::UInt32),
12940 Keyword::UINT64 => Ok(DataType::UInt64),
12941 Keyword::UINT128 => Ok(DataType::UInt128),
12942 Keyword::UINT256 => Ok(DataType::UInt256),
12943 Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
12944 Keyword::NVARCHAR => {
12945 Ok(DataType::Nvarchar(self.parse_optional_character_length()?))
12946 }
12947 Keyword::CHARACTER => {
12948 if self.parse_keyword(Keyword::VARYING) {
12949 Ok(DataType::CharacterVarying(
12950 self.parse_optional_character_length()?,
12951 ))
12952 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12953 Ok(DataType::CharacterLargeObject(
12954 self.parse_optional_precision()?,
12955 ))
12956 } else {
12957 Ok(DataType::Character(self.parse_optional_character_length()?))
12958 }
12959 }
12960 Keyword::CHAR => {
12961 if self.parse_keyword(Keyword::VARYING) {
12962 Ok(DataType::CharVarying(
12963 self.parse_optional_character_length()?,
12964 ))
12965 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
12966 Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
12967 } else {
12968 Ok(DataType::Char(self.parse_optional_character_length()?))
12969 }
12970 }
12971 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
12972 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
12973 Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
12974 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
12975 Keyword::TINYBLOB => Ok(DataType::TinyBlob),
12976 Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
12977 Keyword::LONGBLOB => Ok(DataType::LongBlob),
12978 Keyword::LONG if self.dialect.supports_long_type_as_bigint() => {
12979 Ok(DataType::BigInt(None))
12980 }
12981 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
12982 Keyword::BIT => {
12983 if self.parse_keyword(Keyword::VARYING) {
12984 Ok(DataType::BitVarying(self.parse_optional_precision()?))
12985 } else {
12986 Ok(DataType::Bit(self.parse_optional_precision()?))
12987 }
12988 }
12989 Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
12990 Keyword::UUID => Ok(DataType::Uuid),
12991 Keyword::DATE => Ok(DataType::Date),
12992 Keyword::DATE32 => Ok(DataType::Date32),
12993 Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
12994 Keyword::DATETIME64 => {
12995 self.prev_token();
12996 let (precision, time_zone) = self.parse_datetime_64()?;
12997 Ok(DataType::Datetime64(precision, time_zone))
12998 }
12999 Keyword::TIMESTAMP => {
13000 let precision = self.parse_optional_precision()?;
13001 let tz = if self.parse_keyword(Keyword::WITH) {
13002 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13003 TimezoneInfo::WithTimeZone
13004 } else if self.parse_keyword(Keyword::WITHOUT) {
13005 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13006 TimezoneInfo::WithoutTimeZone
13007 } else {
13008 TimezoneInfo::None
13009 };
13010 Ok(DataType::Timestamp(precision, tz))
13011 }
13012 Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
13013 self.parse_optional_precision()?,
13014 TimezoneInfo::Tz,
13015 )),
13016 Keyword::TIMESTAMP_NTZ => {
13017 Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
13018 }
13019 Keyword::TIME => {
13020 let precision = self.parse_optional_precision()?;
13021 let tz = if self.parse_keyword(Keyword::WITH) {
13022 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13023 TimezoneInfo::WithTimeZone
13024 } else if self.parse_keyword(Keyword::WITHOUT) {
13025 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
13026 TimezoneInfo::WithoutTimeZone
13027 } else {
13028 TimezoneInfo::None
13029 };
13030 Ok(DataType::Time(precision, tz))
13031 }
13032 Keyword::TIMETZ => Ok(DataType::Time(
13033 self.parse_optional_precision()?,
13034 TimezoneInfo::Tz,
13035 )),
13036 Keyword::INTERVAL => {
13037 if self.dialect.supports_interval_options() {
13038 let fields = self.maybe_parse_optional_interval_fields()?;
13039 let precision = self.parse_optional_precision()?;
13040 Ok(DataType::Interval { fields, precision })
13041 } else {
13042 Ok(DataType::Interval {
13043 fields: None,
13044 precision: None,
13045 })
13046 }
13047 }
13048 Keyword::JSON => Ok(DataType::JSON),
13049 Keyword::JSONB => Ok(DataType::JSONB),
13050 Keyword::REGCLASS => Ok(DataType::Regclass),
13051 Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
13052 Keyword::FIXEDSTRING => {
13053 self.expect_token(&Token::LParen)?;
13054 let character_length = self.parse_literal_uint()?;
13055 self.expect_token(&Token::RParen)?;
13056 Ok(DataType::FixedString(character_length))
13057 }
13058 Keyword::TEXT => {
13059 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13060 Ok(DataType::Custom(
13061 ObjectName::from(vec![Ident::new("TEXT")]),
13062 modifiers,
13063 ))
13064 } else {
13065 Ok(DataType::Text)
13066 }
13067 }
13068 Keyword::TINYTEXT => Ok(DataType::TinyText),
13069 Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
13070 Keyword::LONGTEXT => Ok(DataType::LongText),
13071 Keyword::BYTEA => Ok(DataType::Bytea),
13072 Keyword::NUMERIC => Ok(DataType::Numeric(
13073 self.parse_exact_number_optional_precision_scale()?,
13074 )),
13075 Keyword::DECIMAL => {
13076 let precision = self.parse_exact_number_optional_precision_scale()?;
13077
13078 if self.parse_keyword(Keyword::UNSIGNED) {
13079 Ok(DataType::DecimalUnsigned(precision))
13080 } else {
13081 Ok(DataType::Decimal(precision))
13082 }
13083 }
13084 Keyword::DEC => {
13085 let precision = self.parse_exact_number_optional_precision_scale()?;
13086
13087 if self.parse_keyword(Keyword::UNSIGNED) {
13088 Ok(DataType::DecUnsigned(precision))
13089 } else {
13090 Ok(DataType::Dec(precision))
13091 }
13092 }
13093 Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
13094 self.parse_exact_number_optional_precision_scale()?,
13095 )),
13096 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
13097 self.parse_exact_number_optional_precision_scale()?,
13098 )),
13099 Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
13100 Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
13101 Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
13102 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
13103 Keyword::ARRAY => {
13104 if self.dialect.supports_array_typedef_without_element_type() {
13105 Ok(DataType::Array(ArrayElemTypeDef::None))
13106 } else if dialect_of!(self is ClickHouseDialect) {
13107 Ok(self.parse_sub_type(|internal_type| {
13108 DataType::Array(ArrayElemTypeDef::Parenthesis(internal_type))
13109 })?)
13110 } else {
13111 self.expect_token(&Token::Lt)?;
13112 let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
13113 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13114 Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
13115 inside_type,
13116 ))))
13117 }
13118 }
13119 Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
13120 self.prev_token();
13121 let field_defs = self.parse_duckdb_struct_type_def()?;
13122 Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
13123 }
13124 Keyword::STRUCT if self.dialect.supports_struct_literal() => {
13125 self.prev_token();
13126 let (field_defs, _trailing_bracket) =
13127 self.parse_struct_type_def(Self::parse_struct_field_def)?;
13128 trailing_bracket = _trailing_bracket;
13129 Ok(DataType::Struct(
13130 field_defs,
13131 StructBracketKind::AngleBrackets,
13132 ))
13133 }
13134 Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
13135 self.prev_token();
13136 let fields = self.parse_union_type_def()?;
13137 Ok(DataType::Union(fields))
13138 }
13139 Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13140 Ok(self.parse_sub_type(DataType::Nullable)?)
13141 }
13142 Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13143 Ok(self.parse_sub_type(DataType::LowCardinality)?)
13144 }
13145 Keyword::MAP if self.dialect.supports_map_literal_with_angle_brackets() => {
13146 self.expect_token(&Token::Lt)?;
13147 let key_data_type = self.parse_data_type()?;
13148 self.expect_token(&Token::Comma)?;
13149 let (value_data_type, _trailing_bracket) = self.parse_data_type_helper()?;
13150 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
13151 Ok(DataType::Map(
13152 Box::new(key_data_type),
13153 Box::new(value_data_type),
13154 MapBracketKind::AngleBrackets,
13155 ))
13156 }
13157 Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13158 self.prev_token();
13159 let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
13160 Ok(DataType::Map(
13161 Box::new(key_data_type),
13162 Box::new(value_data_type),
13163 MapBracketKind::Parentheses,
13164 ))
13165 }
13166 Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13167 self.expect_token(&Token::LParen)?;
13168 let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
13169 self.expect_token(&Token::RParen)?;
13170 Ok(DataType::Nested(field_defs))
13171 }
13172 Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
13173 self.prev_token();
13174 let field_defs = self.parse_click_house_tuple_def()?;
13175 Ok(DataType::Tuple(field_defs))
13176 }
13177 Keyword::TRIGGER => Ok(DataType::Trigger),
13178 Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
13179 let _ = self.parse_keyword(Keyword::TYPE);
13180 Ok(DataType::AnyType)
13181 }
13182 Keyword::TABLE => {
13183 if self.peek_token_ref().token == Token::LParen {
13186 let columns = self.parse_returns_table_columns()?;
13187 Ok(DataType::Table(Some(columns)))
13188 } else {
13189 Ok(DataType::Table(None))
13190 }
13191 }
13192 Keyword::SIGNED => {
13193 if self.parse_keyword(Keyword::INTEGER) {
13194 Ok(DataType::SignedInteger)
13195 } else {
13196 Ok(DataType::Signed)
13197 }
13198 }
13199 Keyword::UNSIGNED => {
13200 if self.parse_keyword(Keyword::INTEGER) {
13201 Ok(DataType::UnsignedInteger)
13202 } else {
13203 Ok(DataType::Unsigned)
13204 }
13205 }
13206 Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13207 Ok(DataType::TsVector)
13208 }
13209 Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
13210 Ok(DataType::TsQuery)
13211 }
13212 _ => {
13213 self.prev_token();
13214 let type_name = self.parse_object_name(false)?;
13215 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
13216 Ok(DataType::Custom(type_name, modifiers))
13217 } else {
13218 Ok(DataType::Custom(type_name, vec![]))
13219 }
13220 }
13221 },
13222 _ => self.expected_at("a data type name", next_token_index),
13223 }?;
13224
13225 if self.dialect.supports_array_typedef_with_brackets() {
13226 while self.consume_token(&Token::LBracket) {
13227 let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13229 self.expect_token(&Token::RBracket)?;
13230 data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
13231 }
13232 }
13233
13234 if self.parse_keyword(Keyword::ARRAY) {
13237 let size = if self.consume_token(&Token::LBracket) {
13238 let size = self.maybe_parse(|p| p.parse_literal_uint())?;
13239 self.expect_token(&Token::RBracket)?;
13240 size
13241 } else {
13242 None
13243 };
13244 data = DataType::Array(ArrayElemTypeDef::Qualified(Box::new(data), size));
13245 }
13246
13247 Ok((data, trailing_bracket))
13248 }
13249
13250 fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
13251 self.parse_column_def()
13252 }
13253
13254 fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
13255 self.expect_token(&Token::LParen)?;
13256 let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
13257 self.expect_token(&Token::RParen)?;
13258 Ok(columns)
13259 }
13260
13261 pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
13263 self.expect_token(&Token::LParen)?;
13264 let mut values = Vec::new();
13265 loop {
13266 let next_token = self.next_token();
13267 match next_token.token {
13268 Token::SingleQuotedString(value) => values.push(value),
13269 _ => self.expected("a string", next_token)?,
13270 }
13271 let next_token = self.next_token();
13272 match next_token.token {
13273 Token::Comma => (),
13274 Token::RParen => break,
13275 _ => self.expected(", or }", next_token)?,
13276 }
13277 }
13278 Ok(values)
13279 }
13280
13281 pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13283 let ident = self.parse_identifier()?;
13284 self.expect_keyword_is(Keyword::AS)?;
13285 let alias = self.parse_identifier()?;
13286 Ok(IdentWithAlias { ident, alias })
13287 }
13288
13289 fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
13291 let ident = self.parse_identifier()?;
13292 let _after_as = self.parse_keyword(Keyword::AS);
13293 let alias = self.parse_identifier()?;
13294 Ok(IdentWithAlias { ident, alias })
13295 }
13296
13297 fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
13299 self.parse_comma_separated(|parser| {
13300 parser.expect_token(&Token::LParen)?;
13301 let query = parser.parse_query()?;
13302 parser.expect_token(&Token::RParen)?;
13303 Ok(*query)
13304 })
13305 }
13306
13307 fn parse_distinct_required_set_quantifier(
13309 &mut self,
13310 operator_name: &str,
13311 ) -> Result<SetQuantifier, ParserError> {
13312 let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
13313 match quantifier {
13314 SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
13315 _ => Err(ParserError::ParserError(format!(
13316 "{operator_name} pipe operator requires DISTINCT modifier",
13317 ))),
13318 }
13319 }
13320
13321 fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13323 if self.parse_keyword(Keyword::AS) {
13324 Ok(Some(self.parse_identifier()?))
13325 } else {
13326 self.maybe_parse(|parser| parser.parse_identifier())
13328 }
13329 }
13330
13331 fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
13333 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13334 parser.dialect.is_select_item_alias(explicit, kw, parser)
13335 }
13336 self.parse_optional_alias_inner(None, validator)
13337 }
13338
13339 pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
13343 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
13344 parser.dialect.is_table_factor_alias(explicit, kw, parser)
13345 }
13346 let explicit = self.peek_keyword(Keyword::AS);
13347 match self.parse_optional_alias_inner(None, validator)? {
13348 Some(name) => {
13349 let columns = self.parse_table_alias_column_defs()?;
13350 let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
13351 Some(self.parse_identifier()?)
13352 } else {
13353 None
13354 };
13355 Ok(Some(TableAlias {
13356 explicit,
13357 name,
13358 columns,
13359 at,
13360 }))
13361 }
13362 None => Ok(None),
13363 }
13364 }
13365
13366 fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
13367 let mut hints = vec![];
13368 while let Some(hint_type) =
13369 self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
13370 {
13371 let hint_type = match hint_type {
13372 Keyword::USE => TableIndexHintType::Use,
13373 Keyword::IGNORE => TableIndexHintType::Ignore,
13374 Keyword::FORCE => TableIndexHintType::Force,
13375 _ => {
13376 return self.expected_ref(
13377 "expected to match USE/IGNORE/FORCE keyword",
13378 self.peek_token_ref(),
13379 )
13380 }
13381 };
13382 let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
13383 Some(Keyword::INDEX) => TableIndexType::Index,
13384 Some(Keyword::KEY) => TableIndexType::Key,
13385 _ => {
13386 return self
13387 .expected_ref("expected to match INDEX/KEY keyword", self.peek_token_ref())
13388 }
13389 };
13390 let for_clause = if self.parse_keyword(Keyword::FOR) {
13391 let clause = if self.parse_keyword(Keyword::JOIN) {
13392 TableIndexHintForClause::Join
13393 } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13394 TableIndexHintForClause::OrderBy
13395 } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13396 TableIndexHintForClause::GroupBy
13397 } else {
13398 return self.expected_ref(
13399 "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
13400 self.peek_token_ref(),
13401 );
13402 };
13403 Some(clause)
13404 } else {
13405 None
13406 };
13407
13408 self.expect_token(&Token::LParen)?;
13409 let index_names = if self.peek_token_ref().token != Token::RParen {
13410 self.parse_comma_separated(Parser::parse_identifier)?
13411 } else {
13412 vec![]
13413 };
13414 self.expect_token(&Token::RParen)?;
13415 hints.push(TableIndexHints {
13416 hint_type,
13417 index_type,
13418 for_clause,
13419 index_names,
13420 });
13421 }
13422 Ok(hints)
13423 }
13424
13425 pub fn parse_optional_alias(
13429 &mut self,
13430 reserved_kwds: &[Keyword],
13431 ) -> Result<Option<Ident>, ParserError> {
13432 fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
13433 false
13434 }
13435 self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13436 }
13437
13438 fn parse_optional_alias_inner<F>(
13445 &mut self,
13446 reserved_kwds: Option<&[Keyword]>,
13447 validator: F,
13448 ) -> Result<Option<Ident>, ParserError>
13449 where
13450 F: Fn(bool, &Keyword, &mut Parser) -> bool,
13451 {
13452 let after_as = self.parse_keyword(Keyword::AS);
13453
13454 let next_token = self.next_token();
13455 match next_token.token {
13456 Token::Word(w)
13459 if reserved_kwds.is_some()
13460 && (after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword))) =>
13461 {
13462 Ok(Some(w.into_ident(next_token.span)))
13463 }
13464 Token::Word(w) if validator(after_as, &w.keyword, self) => {
13468 Ok(Some(w.into_ident(next_token.span)))
13469 }
13470 Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
13472 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
13473 _ => {
13474 if after_as {
13475 return self.expected("an identifier after AS", next_token);
13476 }
13477 self.prev_token();
13478 Ok(None) }
13480 }
13481 }
13482
13483 pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
13485 if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
13486 let expressions = if self.parse_keyword(Keyword::ALL) {
13487 None
13488 } else {
13489 Some(self.parse_comma_separated(Parser::parse_group_by_expr)?)
13490 };
13491
13492 let mut modifiers = vec![];
13493 if self.dialect.supports_group_by_with_modifier() {
13494 loop {
13495 if !self.parse_keyword(Keyword::WITH) {
13496 break;
13497 }
13498 let keyword = self.expect_one_of_keywords(&[
13499 Keyword::ROLLUP,
13500 Keyword::CUBE,
13501 Keyword::TOTALS,
13502 ])?;
13503 modifiers.push(match keyword {
13504 Keyword::ROLLUP => GroupByWithModifier::Rollup,
13505 Keyword::CUBE => GroupByWithModifier::Cube,
13506 Keyword::TOTALS => GroupByWithModifier::Totals,
13507 _ => {
13508 return parser_err!(
13509 "BUG: expected to match GroupBy modifier keyword",
13510 self.peek_token_ref().span.start
13511 )
13512 }
13513 });
13514 }
13515 }
13516 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
13517 self.expect_token(&Token::LParen)?;
13518 let result = self.parse_comma_separated(|p| {
13519 if p.peek_token_ref().token == Token::LParen {
13520 p.parse_tuple(true, true)
13521 } else {
13522 Ok(vec![p.parse_expr()?])
13523 }
13524 })?;
13525 self.expect_token(&Token::RParen)?;
13526 modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
13527 result,
13528 )));
13529 };
13530 let group_by = match expressions {
13531 None => GroupByExpr::All(modifiers),
13532 Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
13533 };
13534 Ok(Some(group_by))
13535 } else {
13536 Ok(None)
13537 }
13538 }
13539
13540 pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
13542 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
13543 let order_by =
13544 if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
13545 let order_by_options = self.parse_order_by_options()?;
13546 OrderBy {
13547 kind: OrderByKind::All(order_by_options),
13548 interpolate: None,
13549 }
13550 } else {
13551 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
13552 let interpolate = if self.dialect.supports_interpolate() {
13553 self.parse_interpolations()?
13554 } else {
13555 None
13556 };
13557 OrderBy {
13558 kind: OrderByKind::Expressions(exprs),
13559 interpolate,
13560 }
13561 };
13562 Ok(Some(order_by))
13563 } else {
13564 Ok(None)
13565 }
13566 }
13567
13568 fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
13569 let mut offset = if self.parse_keyword(Keyword::OFFSET) {
13570 Some(self.parse_offset()?)
13571 } else {
13572 None
13573 };
13574
13575 let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
13576 let expr = self.parse_limit()?;
13577
13578 if self.dialect.supports_limit_comma()
13579 && offset.is_none()
13580 && expr.is_some() && self.consume_token(&Token::Comma)
13582 {
13583 let offset = expr.ok_or_else(|| {
13584 ParserError::ParserError(
13585 "Missing offset for LIMIT <offset>, <limit>".to_string(),
13586 )
13587 })?;
13588 return Ok(Some(LimitClause::OffsetCommaLimit {
13589 offset,
13590 limit: self.parse_expr()?,
13591 }));
13592 }
13593
13594 let limit_by = if self.dialect.supports_limit_by() && self.parse_keyword(Keyword::BY) {
13595 Some(self.parse_comma_separated(Parser::parse_expr)?)
13596 } else {
13597 None
13598 };
13599
13600 (Some(expr), limit_by)
13601 } else {
13602 (None, None)
13603 };
13604
13605 if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
13606 offset = Some(self.parse_offset()?);
13607 }
13608
13609 if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
13610 Ok(Some(LimitClause::LimitOffset {
13611 limit: limit.unwrap_or_default(),
13612 offset,
13613 limit_by: limit_by.unwrap_or_default(),
13614 }))
13615 } else {
13616 Ok(None)
13617 }
13618 }
13619
13620 pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
13623 if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
13624 let fn_name = self.parse_object_name(false)?;
13625 self.parse_function_call(fn_name)
13626 .map(TableObject::TableFunction)
13627 } else if self.dialect.supports_insert_table_query() && self.peek_subquery_or_cte_start() {
13628 self.parse_parenthesized(|p| p.parse_query())
13629 .map(TableObject::TableQuery)
13630 } else {
13631 self.parse_object_name(false).map(TableObject::TableName)
13632 }
13633 }
13634
13635 pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
13642 self.parse_object_name_inner(in_table_clause, false)
13643 }
13644
13645 fn parse_object_name_inner(
13655 &mut self,
13656 in_table_clause: bool,
13657 allow_wildcards: bool,
13658 ) -> Result<ObjectName, ParserError> {
13659 let mut parts = vec![];
13660 if dialect_of!(self is BigQueryDialect) && in_table_clause {
13661 loop {
13662 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13663 parts.push(ObjectNamePart::Identifier(ident));
13664 if !self.consume_token(&Token::Period) && !end_with_period {
13665 break;
13666 }
13667 }
13668 } else {
13669 loop {
13670 if allow_wildcards && self.peek_token_ref().token == Token::Mul {
13671 let span = self.next_token().span;
13672 parts.push(ObjectNamePart::Identifier(Ident {
13673 value: Token::Mul.to_string(),
13674 quote_style: None,
13675 span,
13676 }));
13677 } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
13678 let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
13679 parts.push(ObjectNamePart::Identifier(ident));
13680 if !self.consume_token(&Token::Period) && !end_with_period {
13681 break;
13682 }
13683 } else if self.dialect.supports_object_name_double_dot_notation()
13684 && parts.len() == 1
13685 && matches!(self.peek_token_ref().token, Token::Period)
13686 {
13687 parts.push(ObjectNamePart::Identifier(Ident::new("")));
13689 } else {
13690 let ident = self.parse_identifier()?;
13691 let part = if self
13692 .dialect
13693 .is_identifier_generating_function_name(&ident, &parts)
13694 {
13695 self.expect_token(&Token::LParen)?;
13696 let args: Vec<FunctionArg> =
13697 self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
13698 self.expect_token(&Token::RParen)?;
13699 ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
13700 } else {
13701 ObjectNamePart::Identifier(ident)
13702 };
13703 parts.push(part);
13704 }
13705
13706 if !self.consume_token(&Token::Period) {
13707 break;
13708 }
13709 }
13710 }
13711
13712 if dialect_of!(self is BigQueryDialect)
13715 && parts.iter().any(|part| {
13716 part.as_ident()
13717 .is_some_and(|ident| ident.value.contains('.'))
13718 })
13719 {
13720 parts = parts
13721 .into_iter()
13722 .flat_map(|part| match part.as_ident() {
13723 Some(ident) => ident
13724 .value
13725 .split('.')
13726 .map(|value| {
13727 ObjectNamePart::Identifier(Ident {
13728 value: value.into(),
13729 quote_style: ident.quote_style,
13730 span: ident.span,
13731 })
13732 })
13733 .collect::<Vec<_>>(),
13734 None => vec![part],
13735 })
13736 .collect()
13737 }
13738
13739 Ok(ObjectName(parts))
13740 }
13741
13742 pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
13744 let mut idents = vec![];
13745 loop {
13746 let token = self.peek_token_ref();
13747 match &token.token {
13748 Token::Word(w) => {
13749 idents.push(w.to_ident(token.span));
13750 }
13751 Token::EOF | Token::Eq | Token::SemiColon | Token::VerticalBarRightAngleBracket => {
13752 break
13753 }
13754 _ => {}
13755 }
13756 self.advance_token();
13757 }
13758 Ok(idents)
13759 }
13760
13761 pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
13801 let mut idents = vec![];
13802
13803 let next_token = self.next_token();
13805 match next_token.token {
13806 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13807 Token::EOF => {
13808 return Err(ParserError::ParserError(
13809 "Empty input when parsing identifier".to_string(),
13810 ))?
13811 }
13812 token => {
13813 return Err(ParserError::ParserError(format!(
13814 "Unexpected token in identifier: {token}"
13815 )))?
13816 }
13817 };
13818
13819 loop {
13821 match self.next_token().token {
13822 Token::Period => {
13824 let next_token = self.next_token();
13825 match next_token.token {
13826 Token::Word(w) => idents.push(w.into_ident(next_token.span)),
13827 Token::EOF => {
13828 return Err(ParserError::ParserError(
13829 "Trailing period in identifier".to_string(),
13830 ))?
13831 }
13832 token => {
13833 return Err(ParserError::ParserError(format!(
13834 "Unexpected token following period in identifier: {token}"
13835 )))?
13836 }
13837 }
13838 }
13839 Token::EOF => break,
13840 token => {
13841 Err(ParserError::ParserError(format!(
13842 "Unexpected token in identifier: {token}"
13843 )))?;
13844 }
13845 }
13846 }
13847
13848 Ok(idents)
13849 }
13850
13851 pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
13853 let next_token = self.next_token();
13854 match next_token.token {
13855 Token::Word(w) => Ok(w.into_ident(next_token.span)),
13856 Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
13857 Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
13858 _ => self.expected("identifier", next_token),
13859 }
13860 }
13861
13862 fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
13873 match self.peek_token().token {
13874 Token::Word(w) => {
13875 let quote_style_is_none = w.quote_style.is_none();
13876 let mut requires_whitespace = false;
13877 let mut ident = w.into_ident(self.next_token().span);
13878 if quote_style_is_none {
13879 while matches!(self.peek_token_no_skip().token, Token::Minus) {
13880 self.next_token();
13881 ident.value.push('-');
13882
13883 let token = self
13884 .next_token_no_skip()
13885 .cloned()
13886 .unwrap_or(TokenWithSpan::wrap(Token::EOF));
13887 requires_whitespace = match token.token {
13888 Token::Word(next_word) if next_word.quote_style.is_none() => {
13889 ident.value.push_str(&next_word.value);
13890 false
13891 }
13892 Token::Number(s, false) => {
13893 if s.ends_with('.') {
13900 let Some(s) = s.split('.').next().filter(|s| {
13901 !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
13902 }) else {
13903 return self.expected(
13904 "continuation of hyphenated identifier",
13905 TokenWithSpan::new(Token::Number(s, false), token.span),
13906 );
13907 };
13908 ident.value.push_str(s);
13909 return Ok((ident, true));
13910 } else {
13911 ident.value.push_str(&s);
13912 }
13913 !matches!(self.peek_token_ref().token, Token::Period)
13916 }
13917 _ => {
13918 return self
13919 .expected("continuation of hyphenated identifier", token);
13920 }
13921 }
13922 }
13923
13924 if requires_whitespace {
13927 let token = self.next_token();
13928 if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
13929 return self
13930 .expected("whitespace following hyphenated identifier", token);
13931 }
13932 }
13933 }
13934 Ok((ident, false))
13935 }
13936 _ => Ok((self.parse_identifier()?, false)),
13937 }
13938 }
13939
13940 fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
13942 if self.consume_token(&Token::LParen) {
13943 if self.peek_token_ref().token == Token::RParen {
13944 self.next_token();
13945 Ok(vec![])
13946 } else {
13947 let cols = self.parse_comma_separated_with_trailing_commas(
13948 Parser::parse_view_column,
13949 self.dialect.supports_column_definition_trailing_commas(),
13950 Self::is_reserved_for_column_alias,
13951 )?;
13952 self.expect_token(&Token::RParen)?;
13953 Ok(cols)
13954 }
13955 } else {
13956 Ok(vec![])
13957 }
13958 }
13959
13960 fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
13962 let name = self.parse_identifier()?;
13963 let options = self.parse_view_column_options()?;
13964 let data_type = if dialect_of!(self is ClickHouseDialect) {
13965 Some(self.parse_data_type()?)
13966 } else {
13967 None
13968 };
13969 Ok(ViewColumnDef {
13970 name,
13971 data_type,
13972 options,
13973 })
13974 }
13975
13976 fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
13977 let mut options = Vec::new();
13978 loop {
13979 let option = self.parse_optional_column_option()?;
13980 if let Some(option) = option {
13981 options.push(option);
13982 } else {
13983 break;
13984 }
13985 }
13986 if options.is_empty() {
13987 Ok(None)
13988 } else if self.dialect.supports_space_separated_column_options() {
13989 Ok(Some(ColumnOptions::SpaceSeparated(options)))
13990 } else {
13991 Ok(Some(ColumnOptions::CommaSeparated(options)))
13992 }
13993 }
13994
13995 pub fn parse_parenthesized_column_list(
13998 &mut self,
13999 optional: IsOptional,
14000 allow_empty: bool,
14001 ) -> Result<Vec<Ident>, ParserError> {
14002 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
14003 }
14004
14005 pub fn parse_parenthesized_compound_identifier_list(
14007 &mut self,
14008 optional: IsOptional,
14009 allow_empty: bool,
14010 ) -> Result<Vec<Expr>, ParserError> {
14011 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14012 Ok(Expr::CompoundIdentifier(
14013 p.parse_period_separated(|p| p.parse_identifier())?,
14014 ))
14015 })
14016 }
14017
14018 fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
14021 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
14022 p.parse_create_index_expr()
14023 })
14024 }
14025
14026 pub fn parse_parenthesized_qualified_column_list(
14029 &mut self,
14030 optional: IsOptional,
14031 allow_empty: bool,
14032 ) -> Result<Vec<ObjectName>, ParserError> {
14033 self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
14034 p.parse_object_name(true)
14035 })
14036 }
14037
14038 fn parse_parenthesized_column_list_inner<F, T>(
14041 &mut self,
14042 optional: IsOptional,
14043 allow_empty: bool,
14044 mut f: F,
14045 ) -> Result<Vec<T>, ParserError>
14046 where
14047 F: FnMut(&mut Parser) -> Result<T, ParserError>,
14048 {
14049 if self.consume_token(&Token::LParen) {
14050 if allow_empty && self.peek_token_ref().token == Token::RParen {
14051 self.next_token();
14052 Ok(vec![])
14053 } else {
14054 let cols = self.parse_comma_separated(|p| f(p))?;
14055 self.expect_token(&Token::RParen)?;
14056 Ok(cols)
14057 }
14058 } else if optional == Optional {
14059 Ok(vec![])
14060 } else {
14061 self.expected_ref("a list of columns in parentheses", self.peek_token_ref())
14062 }
14063 }
14064
14065 fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
14067 if self.consume_token(&Token::LParen) {
14068 let cols = self.parse_comma_separated(|p| {
14069 let name = p.parse_identifier()?;
14070 let data_type = p.maybe_parse(|p| p.parse_data_type())?;
14071 Ok(TableAliasColumnDef { name, data_type })
14072 })?;
14073 self.expect_token(&Token::RParen)?;
14074 Ok(cols)
14075 } else {
14076 Ok(vec![])
14077 }
14078 }
14079
14080 pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
14082 self.expect_token(&Token::LParen)?;
14083 let n = self.parse_literal_uint()?;
14084 self.expect_token(&Token::RParen)?;
14085 Ok(n)
14086 }
14087
14088 pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
14090 if self.consume_token(&Token::LParen) {
14091 let n = self.parse_literal_uint()?;
14092 self.expect_token(&Token::RParen)?;
14093 Ok(Some(n))
14094 } else {
14095 Ok(None)
14096 }
14097 }
14098
14099 fn maybe_parse_optional_interval_fields(
14100 &mut self,
14101 ) -> Result<Option<IntervalFields>, ParserError> {
14102 match self.parse_one_of_keywords(&[
14103 Keyword::YEAR,
14105 Keyword::DAY,
14106 Keyword::HOUR,
14107 Keyword::MINUTE,
14108 Keyword::MONTH,
14110 Keyword::SECOND,
14111 ]) {
14112 Some(Keyword::YEAR) => {
14113 if self.peek_keyword(Keyword::TO) {
14114 self.expect_keyword(Keyword::TO)?;
14115 self.expect_keyword(Keyword::MONTH)?;
14116 Ok(Some(IntervalFields::YearToMonth))
14117 } else {
14118 Ok(Some(IntervalFields::Year))
14119 }
14120 }
14121 Some(Keyword::DAY) => {
14122 if self.peek_keyword(Keyword::TO) {
14123 self.expect_keyword(Keyword::TO)?;
14124 match self.expect_one_of_keywords(&[
14125 Keyword::HOUR,
14126 Keyword::MINUTE,
14127 Keyword::SECOND,
14128 ])? {
14129 Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
14130 Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
14131 Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
14132 _ => {
14133 self.prev_token();
14134 self.expected_ref("HOUR, MINUTE, or SECOND", self.peek_token_ref())
14135 }
14136 }
14137 } else {
14138 Ok(Some(IntervalFields::Day))
14139 }
14140 }
14141 Some(Keyword::HOUR) => {
14142 if self.peek_keyword(Keyword::TO) {
14143 self.expect_keyword(Keyword::TO)?;
14144 match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
14145 Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
14146 Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
14147 _ => {
14148 self.prev_token();
14149 self.expected_ref("MINUTE or SECOND", self.peek_token_ref())
14150 }
14151 }
14152 } else {
14153 Ok(Some(IntervalFields::Hour))
14154 }
14155 }
14156 Some(Keyword::MINUTE) => {
14157 if self.peek_keyword(Keyword::TO) {
14158 self.expect_keyword(Keyword::TO)?;
14159 self.expect_keyword(Keyword::SECOND)?;
14160 Ok(Some(IntervalFields::MinuteToSecond))
14161 } else {
14162 Ok(Some(IntervalFields::Minute))
14163 }
14164 }
14165 Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
14166 Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
14167 Some(_) => {
14168 self.prev_token();
14169 self.expected_ref(
14170 "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
14171 self.peek_token_ref(),
14172 )
14173 }
14174 None => Ok(None),
14175 }
14176 }
14177
14178 pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
14186 self.expect_keyword_is(Keyword::DATETIME64)?;
14187 self.expect_token(&Token::LParen)?;
14188 let precision = self.parse_literal_uint()?;
14189 let time_zone = if self.consume_token(&Token::Comma) {
14190 Some(self.parse_literal_string()?)
14191 } else {
14192 None
14193 };
14194 self.expect_token(&Token::RParen)?;
14195 Ok((precision, time_zone))
14196 }
14197
14198 pub fn parse_optional_character_length(
14200 &mut self,
14201 ) -> Result<Option<CharacterLength>, ParserError> {
14202 if self.consume_token(&Token::LParen) {
14203 let character_length = self.parse_character_length()?;
14204 self.expect_token(&Token::RParen)?;
14205 Ok(Some(character_length))
14206 } else {
14207 Ok(None)
14208 }
14209 }
14210
14211 pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
14213 if self.consume_token(&Token::LParen) {
14214 let binary_length = self.parse_binary_length()?;
14215 self.expect_token(&Token::RParen)?;
14216 Ok(Some(binary_length))
14217 } else {
14218 Ok(None)
14219 }
14220 }
14221
14222 pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
14224 if self.parse_keyword(Keyword::MAX) {
14225 return Ok(CharacterLength::Max);
14226 }
14227 let length = self.parse_literal_uint()?;
14228 let unit = if self.parse_keyword(Keyword::CHARACTERS) {
14229 Some(CharLengthUnits::Characters)
14230 } else if self.parse_keyword(Keyword::OCTETS) {
14231 Some(CharLengthUnits::Octets)
14232 } else {
14233 None
14234 };
14235 Ok(CharacterLength::IntegerLength { length, unit })
14236 }
14237
14238 pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
14240 if self.parse_keyword(Keyword::MAX) {
14241 return Ok(BinaryLength::Max);
14242 }
14243 let length = self.parse_literal_uint()?;
14244 Ok(BinaryLength::IntegerLength { length })
14245 }
14246
14247 pub fn parse_optional_precision_scale(
14249 &mut self,
14250 ) -> Result<(Option<u64>, Option<u64>), ParserError> {
14251 if self.consume_token(&Token::LParen) {
14252 let n = self.parse_literal_uint()?;
14253 let scale = if self.consume_token(&Token::Comma) {
14254 Some(self.parse_literal_uint()?)
14255 } else {
14256 None
14257 };
14258 self.expect_token(&Token::RParen)?;
14259 Ok((Some(n), scale))
14260 } else {
14261 Ok((None, None))
14262 }
14263 }
14264
14265 pub fn parse_exact_number_optional_precision_scale(
14267 &mut self,
14268 ) -> Result<ExactNumberInfo, ParserError> {
14269 if self.consume_token(&Token::LParen) {
14270 let precision = self.parse_literal_uint()?;
14271 let scale = if self.consume_token(&Token::Comma) {
14272 Some(self.parse_signed_integer()?)
14273 } else {
14274 None
14275 };
14276
14277 self.expect_token(&Token::RParen)?;
14278
14279 match scale {
14280 None => Ok(ExactNumberInfo::Precision(precision)),
14281 Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
14282 }
14283 } else {
14284 Ok(ExactNumberInfo::None)
14285 }
14286 }
14287
14288 fn parse_signed_integer(&mut self) -> Result<i64, ParserError> {
14290 let is_negative = self.consume_token(&Token::Minus);
14291
14292 if !is_negative {
14293 let _ = self.consume_token(&Token::Plus);
14294 }
14295
14296 let current_token = self.peek_token_ref();
14297 match ¤t_token.token {
14298 Token::Number(s, _) => {
14299 let s = s.clone();
14300 let span_start = current_token.span.start;
14301 self.advance_token();
14302 let value = Self::parse::<i64>(s, span_start)?;
14303 Ok(if is_negative { -value } else { value })
14304 }
14305 _ => self.expected_ref("number", current_token),
14306 }
14307 }
14308
14309 pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
14311 if self.consume_token(&Token::LParen) {
14312 let mut modifiers = Vec::new();
14313 loop {
14314 let next_token = self.next_token();
14315 match next_token.token {
14316 Token::Word(w) => modifiers.push(w.to_string()),
14317 Token::Number(n, _) => modifiers.push(n),
14318 Token::SingleQuotedString(s) => modifiers.push(s),
14319
14320 Token::Comma => {
14321 continue;
14322 }
14323 Token::RParen => {
14324 break;
14325 }
14326 _ => self.expected("type modifiers", next_token)?,
14327 }
14328 }
14329
14330 Ok(Some(modifiers))
14331 } else {
14332 Ok(None)
14333 }
14334 }
14335
14336 fn parse_sub_type<F>(&mut self, parent_type: F) -> Result<DataType, ParserError>
14338 where
14339 F: FnOnce(Box<DataType>) -> DataType,
14340 {
14341 self.expect_token(&Token::LParen)?;
14342 let inside_type = self.parse_data_type()?;
14343 self.expect_token(&Token::RParen)?;
14344 Ok(parent_type(inside_type.into()))
14345 }
14346
14347 fn parse_delete_setexpr_boxed(
14351 &mut self,
14352 delete_token: TokenWithSpan,
14353 ) -> Result<Box<SetExpr>, ParserError> {
14354 Ok(Box::new(SetExpr::Delete(self.parse_delete(delete_token)?)))
14355 }
14356
14357 pub fn parse_delete(&mut self, delete_token: TokenWithSpan) -> Result<Statement, ParserError> {
14359 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
14360 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
14361 if dialect_of!(self is BigQueryDialect | OracleDialect | GenericDialect) {
14364 (vec![], false)
14365 } else {
14366 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
14367 self.expect_keyword_is(Keyword::FROM)?;
14368 (tables, true)
14369 }
14370 } else {
14371 (vec![], true)
14372 };
14373
14374 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
14375
14376 let output = self.maybe_parse_output_clause()?;
14377
14378 let using = if self.parse_keyword(Keyword::USING) {
14379 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
14380 } else {
14381 None
14382 };
14383 let selection = if self.parse_keyword(Keyword::WHERE) {
14384 Some(self.parse_expr()?)
14385 } else {
14386 None
14387 };
14388 let returning = if self.parse_keyword(Keyword::RETURNING) {
14389 Some(self.parse_comma_separated(Parser::parse_select_item)?)
14390 } else {
14391 None
14392 };
14393 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14394 self.parse_comma_separated(Parser::parse_order_by_expr)?
14395 } else {
14396 vec![]
14397 };
14398 let limit = if self.parse_keyword(Keyword::LIMIT) {
14399 self.parse_limit()?
14400 } else {
14401 None
14402 };
14403
14404 Ok(Statement::Delete(Delete {
14405 delete_token: delete_token.into(),
14406 optimizer_hints,
14407 tables,
14408 from: if with_from_keyword {
14409 FromTable::WithFromKeyword(from)
14410 } else {
14411 FromTable::WithoutKeyword(from)
14412 },
14413 using,
14414 selection,
14415 returning,
14416 output,
14417 order_by,
14418 limit,
14419 }))
14420 }
14421
14422 pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
14425 let modifier_keyword =
14426 self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
14427
14428 let id = self.parse_literal_uint()?;
14429
14430 let modifier = match modifier_keyword {
14431 Some(Keyword::CONNECTION) => Some(KillType::Connection),
14432 Some(Keyword::QUERY) => Some(KillType::Query),
14433 Some(Keyword::MUTATION) => {
14434 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
14435 Some(KillType::Mutation)
14436 } else {
14437 self.expected_ref(
14438 "Unsupported type for KILL, allowed: CONNECTION | QUERY",
14439 self.peek_token_ref(),
14440 )?
14441 }
14442 }
14443 _ => None,
14444 };
14445
14446 Ok(Statement::Kill { modifier, id })
14447 }
14448
14449 pub fn parse_explain(
14451 &mut self,
14452 describe_alias: DescribeAlias,
14453 ) -> Result<Statement, ParserError> {
14454 let mut analyze = false;
14455 let mut verbose = false;
14456 let mut query_plan = false;
14457 let mut estimate = false;
14458 let mut format = None;
14459 let mut options = None;
14460
14461 if describe_alias == DescribeAlias::Explain
14464 && self.dialect.supports_explain_with_utility_options()
14465 && self.peek_token_ref().token == Token::LParen
14466 {
14467 options = Some(self.parse_utility_options()?)
14468 } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
14469 query_plan = true;
14470 } else if self.parse_keyword(Keyword::ESTIMATE) {
14471 estimate = true;
14472 } else {
14473 analyze = self.parse_keyword(Keyword::ANALYZE);
14474 verbose = self.parse_keyword(Keyword::VERBOSE);
14475 if self.parse_keyword(Keyword::FORMAT) {
14476 format = Some(self.parse_analyze_format_kind()?);
14477 }
14478 }
14479
14480 match self.maybe_parse(|parser| parser.parse_statement())? {
14481 Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
14482 ParserError::ParserError("Explain must be root of the plan".to_string()),
14483 ),
14484 Some(statement) => Ok(Statement::Explain {
14485 describe_alias,
14486 analyze,
14487 verbose,
14488 query_plan,
14489 estimate,
14490 statement: Box::new(statement),
14491 format,
14492 options,
14493 }),
14494 _ => {
14495 let hive_format =
14496 match self.parse_one_of_keywords(&[Keyword::EXTENDED, Keyword::FORMATTED]) {
14497 Some(Keyword::EXTENDED) => Some(HiveDescribeFormat::Extended),
14498 Some(Keyword::FORMATTED) => Some(HiveDescribeFormat::Formatted),
14499 _ => None,
14500 };
14501
14502 let has_table_keyword = if self.dialect.describe_requires_table_keyword() {
14503 self.parse_keyword(Keyword::TABLE)
14505 } else {
14506 false
14507 };
14508
14509 let table_name = self.parse_object_name(false)?;
14510 Ok(Statement::ExplainTable {
14511 describe_alias,
14512 hive_format,
14513 has_table_keyword,
14514 table_name,
14515 })
14516 }
14517 }
14518 }
14519
14520 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
14525 pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
14526 let _guard = self.recursion_counter.try_decrease()?;
14527 let with = if self.parse_keyword(Keyword::WITH) {
14528 let with_token = self.get_current_token();
14529 Some(With {
14530 with_token: with_token.clone().into(),
14531 recursive: self.parse_keyword(Keyword::RECURSIVE),
14532 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
14533 })
14534 } else {
14535 None
14536 };
14537 if self.parse_keyword(Keyword::INSERT) {
14538 Ok(Query {
14539 with,
14540 body: self.parse_insert_setexpr_boxed(self.get_current_token().clone())?,
14541 order_by: None,
14542 limit_clause: None,
14543 fetch: None,
14544 locks: vec![],
14545 for_clause: None,
14546 settings: None,
14547 format_clause: None,
14548 pipe_operators: vec![],
14549 }
14550 .into())
14551 } else if self.parse_keyword(Keyword::UPDATE) {
14552 Ok(Query {
14553 with,
14554 body: self.parse_update_setexpr_boxed(self.get_current_token().clone())?,
14555 order_by: None,
14556 limit_clause: None,
14557 fetch: None,
14558 locks: vec![],
14559 for_clause: None,
14560 settings: None,
14561 format_clause: None,
14562 pipe_operators: vec![],
14563 }
14564 .into())
14565 } else if self.parse_keyword(Keyword::DELETE) {
14566 Ok(Query {
14567 with,
14568 body: self.parse_delete_setexpr_boxed(self.get_current_token().clone())?,
14569 limit_clause: None,
14570 order_by: None,
14571 fetch: None,
14572 locks: vec![],
14573 for_clause: None,
14574 settings: None,
14575 format_clause: None,
14576 pipe_operators: vec![],
14577 }
14578 .into())
14579 } else if self.parse_keyword(Keyword::MERGE) {
14580 Ok(Query {
14581 with,
14582 body: self.parse_merge_setexpr_boxed(self.get_current_token().clone())?,
14583 limit_clause: None,
14584 order_by: None,
14585 fetch: None,
14586 locks: vec![],
14587 for_clause: None,
14588 settings: None,
14589 format_clause: None,
14590 pipe_operators: vec![],
14591 }
14592 .into())
14593 } else {
14594 let body = self.parse_query_body(self.dialect.prec_unknown())?;
14595
14596 let order_by = self.parse_optional_order_by()?;
14597
14598 let mut limit_clause = self.parse_optional_limit_clause()?;
14599
14600 let settings = self.parse_settings()?;
14601
14602 let fetch = if self.parse_keyword(Keyword::FETCH) {
14603 Some(self.parse_fetch()?)
14604 } else {
14605 None
14606 };
14607
14608 let mut for_clause = None;
14609 let mut locks = Vec::new();
14610 while self.parse_keyword(Keyword::FOR) {
14611 if let Some(parsed_for_clause) = self.parse_for_clause()? {
14612 for_clause = Some(parsed_for_clause);
14613 break;
14614 } else {
14615 locks.push(self.parse_lock()?);
14616 }
14617 }
14618
14619 if limit_clause.is_none() {
14625 limit_clause = self.parse_optional_limit_clause()?;
14626 }
14627
14628 let format_clause =
14629 if self.dialect.supports_select_format() && self.parse_keyword(Keyword::FORMAT) {
14630 if self.parse_keyword(Keyword::NULL) {
14631 Some(FormatClause::Null)
14632 } else {
14633 let ident = self.parse_identifier()?;
14634 Some(FormatClause::Identifier(ident))
14635 }
14636 } else {
14637 None
14638 };
14639
14640 let pipe_operators = if self.dialect.supports_pipe_operator() {
14641 self.parse_pipe_operators()?
14642 } else {
14643 Vec::new()
14644 };
14645
14646 Ok(Query {
14647 with,
14648 body,
14649 order_by,
14650 limit_clause,
14651 fetch,
14652 locks,
14653 for_clause,
14654 settings,
14655 format_clause,
14656 pipe_operators,
14657 }
14658 .into())
14659 }
14660 }
14661
14662 fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
14663 let mut pipe_operators = Vec::new();
14664
14665 while self.consume_token(&Token::VerticalBarRightAngleBracket) {
14666 let kw = self.expect_one_of_keywords(&[
14667 Keyword::SELECT,
14668 Keyword::EXTEND,
14669 Keyword::SET,
14670 Keyword::DROP,
14671 Keyword::AS,
14672 Keyword::WHERE,
14673 Keyword::LIMIT,
14674 Keyword::AGGREGATE,
14675 Keyword::ORDER,
14676 Keyword::TABLESAMPLE,
14677 Keyword::RENAME,
14678 Keyword::UNION,
14679 Keyword::INTERSECT,
14680 Keyword::EXCEPT,
14681 Keyword::CALL,
14682 Keyword::PIVOT,
14683 Keyword::UNPIVOT,
14684 Keyword::JOIN,
14685 Keyword::INNER,
14686 Keyword::LEFT,
14687 Keyword::RIGHT,
14688 Keyword::FULL,
14689 Keyword::CROSS,
14690 ])?;
14691 match kw {
14692 Keyword::SELECT => {
14693 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14694 pipe_operators.push(PipeOperator::Select { exprs })
14695 }
14696 Keyword::EXTEND => {
14697 let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
14698 pipe_operators.push(PipeOperator::Extend { exprs })
14699 }
14700 Keyword::SET => {
14701 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
14702 pipe_operators.push(PipeOperator::Set { assignments })
14703 }
14704 Keyword::DROP => {
14705 let columns = self.parse_identifiers()?;
14706 pipe_operators.push(PipeOperator::Drop { columns })
14707 }
14708 Keyword::AS => {
14709 let alias = self.parse_identifier()?;
14710 pipe_operators.push(PipeOperator::As { alias })
14711 }
14712 Keyword::WHERE => {
14713 let expr = self.parse_expr()?;
14714 pipe_operators.push(PipeOperator::Where { expr })
14715 }
14716 Keyword::LIMIT => {
14717 let expr = self.parse_expr()?;
14718 let offset = if self.parse_keyword(Keyword::OFFSET) {
14719 Some(self.parse_expr()?)
14720 } else {
14721 None
14722 };
14723 pipe_operators.push(PipeOperator::Limit { expr, offset })
14724 }
14725 Keyword::AGGREGATE => {
14726 let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
14727 vec![]
14728 } else {
14729 self.parse_comma_separated(|parser| {
14730 parser.parse_expr_with_alias_and_order_by()
14731 })?
14732 };
14733
14734 let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
14735 self.parse_comma_separated(|parser| {
14736 parser.parse_expr_with_alias_and_order_by()
14737 })?
14738 } else {
14739 vec![]
14740 };
14741
14742 pipe_operators.push(PipeOperator::Aggregate {
14743 full_table_exprs,
14744 group_by_expr,
14745 })
14746 }
14747 Keyword::ORDER => {
14748 self.expect_one_of_keywords(&[Keyword::BY])?;
14749 let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
14750 pipe_operators.push(PipeOperator::OrderBy { exprs })
14751 }
14752 Keyword::TABLESAMPLE => {
14753 let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
14754 pipe_operators.push(PipeOperator::TableSample { sample });
14755 }
14756 Keyword::RENAME => {
14757 let mappings =
14758 self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
14759 pipe_operators.push(PipeOperator::Rename { mappings });
14760 }
14761 Keyword::UNION => {
14762 let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
14763 let queries = self.parse_pipe_operator_queries()?;
14764 pipe_operators.push(PipeOperator::Union {
14765 set_quantifier,
14766 queries,
14767 });
14768 }
14769 Keyword::INTERSECT => {
14770 let set_quantifier =
14771 self.parse_distinct_required_set_quantifier("INTERSECT")?;
14772 let queries = self.parse_pipe_operator_queries()?;
14773 pipe_operators.push(PipeOperator::Intersect {
14774 set_quantifier,
14775 queries,
14776 });
14777 }
14778 Keyword::EXCEPT => {
14779 let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
14780 let queries = self.parse_pipe_operator_queries()?;
14781 pipe_operators.push(PipeOperator::Except {
14782 set_quantifier,
14783 queries,
14784 });
14785 }
14786 Keyword::CALL => {
14787 let function_name = self.parse_object_name(false)?;
14788 let function_expr = self.parse_function(function_name)?;
14789 if let Expr::Function(function) = function_expr {
14790 let alias = self.parse_identifier_optional_alias()?;
14791 pipe_operators.push(PipeOperator::Call { function, alias });
14792 } else {
14793 return Err(ParserError::ParserError(
14794 "Expected function call after CALL".to_string(),
14795 ));
14796 }
14797 }
14798 Keyword::PIVOT => {
14799 self.expect_token(&Token::LParen)?;
14800 let aggregate_functions =
14801 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
14802 self.expect_keyword_is(Keyword::FOR)?;
14803 let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
14804 self.expect_keyword_is(Keyword::IN)?;
14805
14806 self.expect_token(&Token::LParen)?;
14807 let value_source = if self.parse_keyword(Keyword::ANY) {
14808 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
14809 self.parse_comma_separated(Parser::parse_order_by_expr)?
14810 } else {
14811 vec![]
14812 };
14813 PivotValueSource::Any(order_by)
14814 } else if self.peek_sub_query() {
14815 PivotValueSource::Subquery(self.parse_query()?)
14816 } else {
14817 PivotValueSource::List(
14818 self.parse_comma_separated(Self::parse_expr_with_alias)?,
14819 )
14820 };
14821 self.expect_token(&Token::RParen)?;
14822 self.expect_token(&Token::RParen)?;
14823
14824 let alias = self.parse_identifier_optional_alias()?;
14825
14826 pipe_operators.push(PipeOperator::Pivot {
14827 aggregate_functions,
14828 value_column,
14829 value_source,
14830 alias,
14831 });
14832 }
14833 Keyword::UNPIVOT => {
14834 self.expect_token(&Token::LParen)?;
14835 let value_column = self.parse_identifier()?;
14836 self.expect_keyword(Keyword::FOR)?;
14837 let name_column = self.parse_identifier()?;
14838 self.expect_keyword(Keyword::IN)?;
14839
14840 self.expect_token(&Token::LParen)?;
14841 let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
14842 self.expect_token(&Token::RParen)?;
14843
14844 self.expect_token(&Token::RParen)?;
14845
14846 let alias = self.parse_identifier_optional_alias()?;
14847
14848 pipe_operators.push(PipeOperator::Unpivot {
14849 value_column,
14850 name_column,
14851 unpivot_columns,
14852 alias,
14853 });
14854 }
14855 Keyword::JOIN
14856 | Keyword::INNER
14857 | Keyword::LEFT
14858 | Keyword::RIGHT
14859 | Keyword::FULL
14860 | Keyword::CROSS => {
14861 self.prev_token();
14862 let mut joins = self.parse_joins()?;
14863 if joins.len() != 1 {
14864 return Err(ParserError::ParserError(
14865 "Join pipe operator must have a single join".to_string(),
14866 ));
14867 }
14868 let join = joins.swap_remove(0);
14869 pipe_operators.push(PipeOperator::Join(join))
14870 }
14871 unhandled => {
14872 return Err(ParserError::ParserError(format!(
14873 "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
14874 )))
14875 }
14876 }
14877 }
14878 Ok(pipe_operators)
14879 }
14880
14881 fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
14882 let settings = if self.dialect.supports_settings() && self.parse_keyword(Keyword::SETTINGS)
14883 {
14884 let key_values = self.parse_comma_separated(|p| {
14885 let key = p.parse_identifier()?;
14886 p.expect_token(&Token::Eq)?;
14887 let value = p.parse_expr()?;
14888 Ok(Setting { key, value })
14889 })?;
14890 Some(key_values)
14891 } else {
14892 None
14893 };
14894 Ok(settings)
14895 }
14896
14897 pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
14899 if self.parse_keyword(Keyword::XML) {
14900 Ok(Some(self.parse_for_xml()?))
14901 } else if self.parse_keyword(Keyword::JSON) {
14902 Ok(Some(self.parse_for_json()?))
14903 } else if self.parse_keyword(Keyword::BROWSE) {
14904 Ok(Some(ForClause::Browse))
14905 } else {
14906 Ok(None)
14907 }
14908 }
14909
14910 pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
14912 let for_xml = if self.parse_keyword(Keyword::RAW) {
14913 let mut element_name = None;
14914 if self.peek_token_ref().token == Token::LParen {
14915 self.expect_token(&Token::LParen)?;
14916 element_name = Some(self.parse_literal_string()?);
14917 self.expect_token(&Token::RParen)?;
14918 }
14919 ForXml::Raw(element_name)
14920 } else if self.parse_keyword(Keyword::AUTO) {
14921 ForXml::Auto
14922 } else if self.parse_keyword(Keyword::EXPLICIT) {
14923 ForXml::Explicit
14924 } else if self.parse_keyword(Keyword::PATH) {
14925 let mut element_name = None;
14926 if self.peek_token_ref().token == Token::LParen {
14927 self.expect_token(&Token::LParen)?;
14928 element_name = Some(self.parse_literal_string()?);
14929 self.expect_token(&Token::RParen)?;
14930 }
14931 ForXml::Path(element_name)
14932 } else {
14933 return Err(ParserError::ParserError(
14934 "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
14935 ));
14936 };
14937 let mut elements = false;
14938 let mut binary_base64 = false;
14939 let mut root = None;
14940 let mut r#type = false;
14941 while self.peek_token_ref().token == Token::Comma {
14942 self.next_token();
14943 if self.parse_keyword(Keyword::ELEMENTS) {
14944 elements = true;
14945 } else if self.parse_keyword(Keyword::BINARY) {
14946 self.expect_keyword_is(Keyword::BASE64)?;
14947 binary_base64 = true;
14948 } else if self.parse_keyword(Keyword::ROOT) {
14949 self.expect_token(&Token::LParen)?;
14950 root = Some(self.parse_literal_string()?);
14951 self.expect_token(&Token::RParen)?;
14952 } else if self.parse_keyword(Keyword::TYPE) {
14953 r#type = true;
14954 }
14955 }
14956 Ok(ForClause::Xml {
14957 for_xml,
14958 elements,
14959 binary_base64,
14960 root,
14961 r#type,
14962 })
14963 }
14964
14965 pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
14967 let for_json = if self.parse_keyword(Keyword::AUTO) {
14968 ForJson::Auto
14969 } else if self.parse_keyword(Keyword::PATH) {
14970 ForJson::Path
14971 } else {
14972 return Err(ParserError::ParserError(
14973 "Expected FOR JSON [AUTO | PATH ]".to_string(),
14974 ));
14975 };
14976 let mut root = None;
14977 let mut include_null_values = false;
14978 let mut without_array_wrapper = false;
14979 while self.peek_token_ref().token == Token::Comma {
14980 self.next_token();
14981 if self.parse_keyword(Keyword::ROOT) {
14982 self.expect_token(&Token::LParen)?;
14983 root = Some(self.parse_literal_string()?);
14984 self.expect_token(&Token::RParen)?;
14985 } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
14986 include_null_values = true;
14987 } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
14988 without_array_wrapper = true;
14989 }
14990 }
14991 Ok(ForClause::Json {
14992 for_json,
14993 root,
14994 include_null_values,
14995 without_array_wrapper,
14996 })
14997 }
14998
14999 pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
15001 let name = self.parse_identifier()?;
15002
15003 let as_optional = self.dialect.supports_cte_without_as();
15004
15005 if as_optional && !self.peek_keyword(Keyword::AS) {
15007 if let Some((query, closing_paren_token)) = self.maybe_parse(|p| {
15008 p.expect_token(&Token::LParen)?;
15009 let query = p.parse_query()?;
15010 let closing_paren_token = p.expect_token(&Token::RParen)?;
15011 Ok((query, closing_paren_token))
15012 })? {
15013 let mut cte = Cte {
15014 alias: TableAlias {
15015 explicit: false,
15016 name,
15017 columns: vec![],
15018 at: None,
15019 },
15020 query,
15021 from: None,
15022 materialized: None,
15023 closing_paren_token: closing_paren_token.into(),
15024 };
15025 if self.parse_keyword(Keyword::FROM) {
15026 cte.from = Some(self.parse_identifier()?);
15027 }
15028 return Ok(cte);
15029 }
15030 }
15031
15032 let columns = if self.parse_keyword(Keyword::AS) {
15034 vec![]
15035 } else {
15036 let columns = self.parse_table_alias_column_defs()?;
15037 if as_optional {
15038 let _ = self.parse_keyword(Keyword::AS);
15039 } else {
15040 self.expect_keyword_is(Keyword::AS)?;
15041 }
15042 columns
15043 };
15044
15045 let mut is_materialized = None;
15046 if dialect_of!(self is PostgreSqlDialect) {
15047 if self.parse_keyword(Keyword::MATERIALIZED) {
15048 is_materialized = Some(CteAsMaterialized::Materialized);
15049 } else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
15050 is_materialized = Some(CteAsMaterialized::NotMaterialized);
15051 }
15052 }
15053
15054 self.expect_token(&Token::LParen)?;
15055 let query = self.parse_query()?;
15056 let closing_paren_token = self.expect_token(&Token::RParen)?;
15057
15058 let mut cte = Cte {
15059 alias: TableAlias {
15060 explicit: false,
15061 name,
15062 columns,
15063 at: None,
15064 },
15065 query,
15066 from: None,
15067 materialized: is_materialized,
15068 closing_paren_token: closing_paren_token.into(),
15069 };
15070 if self.dialect.supports_from_first_insert() && self.parse_keyword(Keyword::FROM) {
15071 cte.from = Some(self.parse_identifier()?);
15072 }
15073 Ok(cte)
15074 }
15075
15076 pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
15085 let expr = if self.peek_keyword(Keyword::SELECT)
15088 || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
15089 {
15090 SetExpr::Select(self.parse_select().map(Box::new)?)
15091 } else if self.consume_token(&Token::LParen) {
15092 let subquery = self.parse_query()?;
15094 self.expect_token(&Token::RParen)?;
15095 SetExpr::Query(subquery)
15096 } else if self.parse_keyword(Keyword::VALUES) {
15097 let is_mysql = dialect_of!(self is MySqlDialect);
15098 SetExpr::Values(self.parse_values(is_mysql, false)?)
15099 } else if self.parse_keyword(Keyword::VALUE) {
15100 let is_mysql = dialect_of!(self is MySqlDialect);
15101 SetExpr::Values(self.parse_values(is_mysql, true)?)
15102 } else if self.parse_keyword(Keyword::TABLE) {
15103 SetExpr::Table(Box::new(self.parse_as_table()?))
15104 } else {
15105 return self.expected_ref(
15106 "SELECT, VALUES, or a subquery in the query body",
15107 self.peek_token_ref(),
15108 );
15109 };
15110
15111 self.parse_remaining_set_exprs(expr, precedence)
15112 }
15113
15114 fn parse_remaining_set_exprs(
15118 &mut self,
15119 mut expr: SetExpr,
15120 precedence: u8,
15121 ) -> Result<Box<SetExpr>, ParserError> {
15122 loop {
15123 let op = self.parse_set_operator(&self.peek_token().token);
15125 let next_precedence = match op {
15126 Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
15128 10
15129 }
15130 Some(SetOperator::Intersect) => 20,
15132 None => break,
15134 };
15135 if precedence >= next_precedence {
15136 break;
15137 }
15138 self.next_token(); let set_quantifier = self.parse_set_quantifier(&op);
15140 expr = SetExpr::SetOperation {
15141 left: Box::new(expr),
15142 op: op.unwrap(),
15143 set_quantifier,
15144 right: self.parse_query_body(next_precedence)?,
15145 };
15146 }
15147
15148 Ok(expr.into())
15149 }
15150
15151 pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
15153 match token {
15154 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
15155 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
15156 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
15157 Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
15158 _ => None,
15159 }
15160 }
15161
15162 pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
15164 match op {
15165 Some(
15166 SetOperator::Except
15167 | SetOperator::Intersect
15168 | SetOperator::Union
15169 | SetOperator::Minus,
15170 ) => {
15171 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
15172 SetQuantifier::DistinctByName
15173 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15174 SetQuantifier::ByName
15175 } else if self.parse_keyword(Keyword::ALL) {
15176 if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
15177 SetQuantifier::AllByName
15178 } else {
15179 SetQuantifier::All
15180 }
15181 } else if self.parse_keyword(Keyword::DISTINCT) {
15182 SetQuantifier::Distinct
15183 } else {
15184 SetQuantifier::None
15185 }
15186 }
15187 _ => SetQuantifier::None,
15188 }
15189 }
15190
15191 pub fn parse_select(&mut self) -> Result<Select, ParserError> {
15193 let mut from_first = None;
15194
15195 if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
15196 let from_token = self.expect_keyword(Keyword::FROM)?;
15197 let from = self.parse_table_with_joins()?;
15198 if !self.peek_keyword(Keyword::SELECT) {
15199 return Ok(Select {
15200 select_token: AttachedToken(from_token),
15201 optimizer_hints: vec![],
15202 distinct: None,
15203 select_modifiers: None,
15204 top: None,
15205 top_before_distinct: false,
15206 projection: vec![],
15207 exclude: None,
15208 into: None,
15209 from,
15210 lateral_views: vec![],
15211 prewhere: None,
15212 selection: None,
15213 group_by: GroupByExpr::Expressions(vec![], vec![]),
15214 cluster_by: vec![],
15215 distribute_by: vec![],
15216 sort_by: vec![],
15217 having: None,
15218 named_window: vec![],
15219 window_before_qualify: false,
15220 qualify: None,
15221 value_table_mode: None,
15222 connect_by: vec![],
15223 flavor: SelectFlavor::FromFirstNoSelect,
15224 });
15225 }
15226 from_first = Some(from);
15227 }
15228
15229 let select_token = self.expect_keyword(Keyword::SELECT)?;
15230 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
15231 let value_table_mode = self.parse_value_table_mode()?;
15232
15233 let (select_modifiers, distinct_select_modifier) =
15234 if self.dialect.supports_select_modifiers() {
15235 self.parse_select_modifiers()?
15236 } else {
15237 (None, None)
15238 };
15239
15240 let mut top_before_distinct = false;
15241 let mut top = None;
15242 if self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15243 top = Some(self.parse_top()?);
15244 top_before_distinct = true;
15245 }
15246
15247 let distinct = if distinct_select_modifier.is_some() {
15248 distinct_select_modifier
15249 } else {
15250 self.parse_all_or_distinct()?
15251 };
15252
15253 if !self.dialect.supports_top_before_distinct() && self.parse_keyword(Keyword::TOP) {
15254 top = Some(self.parse_top()?);
15255 }
15256
15257 let projection =
15258 if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
15259 vec![]
15260 } else {
15261 self.parse_projection()?
15262 };
15263
15264 let exclude = if self.dialect.supports_select_exclude() {
15265 self.parse_optional_select_item_exclude()?
15266 } else {
15267 None
15268 };
15269
15270 let into = if self.parse_keyword(Keyword::INTO) {
15271 Some(self.parse_select_into()?)
15272 } else {
15273 None
15274 };
15275
15276 let (from, from_first) = if let Some(from) = from_first.take() {
15282 (from, true)
15283 } else if self.parse_keyword(Keyword::FROM) {
15284 (self.parse_table_with_joins()?, false)
15285 } else {
15286 (vec![], false)
15287 };
15288
15289 let mut lateral_views = vec![];
15290 loop {
15291 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
15292 let outer = self.parse_keyword(Keyword::OUTER);
15293 let lateral_view = self.parse_expr()?;
15294 let lateral_view_name = self.parse_object_name(false)?;
15295 let lateral_col_alias = self
15296 .parse_comma_separated(|parser| {
15297 parser.parse_optional_alias(&[
15298 Keyword::WHERE,
15299 Keyword::GROUP,
15300 Keyword::CLUSTER,
15301 Keyword::HAVING,
15302 Keyword::LATERAL,
15303 ]) })?
15305 .into_iter()
15306 .flatten()
15307 .collect();
15308
15309 lateral_views.push(LateralView {
15310 lateral_view,
15311 lateral_view_name,
15312 lateral_col_alias,
15313 outer,
15314 });
15315 } else {
15316 break;
15317 }
15318 }
15319
15320 let prewhere = if self.dialect.supports_prewhere() && self.parse_keyword(Keyword::PREWHERE)
15321 {
15322 Some(self.parse_expr()?)
15323 } else {
15324 None
15325 };
15326
15327 let selection = if self.parse_keyword(Keyword::WHERE) {
15328 Some(self.parse_expr()?)
15329 } else {
15330 None
15331 };
15332
15333 let connect_by = self.maybe_parse_connect_by()?;
15334
15335 let group_by = self
15336 .parse_optional_group_by()?
15337 .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
15338
15339 let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
15340 self.parse_comma_separated(Parser::parse_expr)?
15341 } else {
15342 vec![]
15343 };
15344
15345 let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
15346 self.parse_comma_separated(Parser::parse_expr)?
15347 } else {
15348 vec![]
15349 };
15350
15351 let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
15352 self.parse_comma_separated(Parser::parse_order_by_expr)?
15353 } else {
15354 vec![]
15355 };
15356
15357 let having = if self.parse_keyword(Keyword::HAVING) {
15358 Some(self.parse_expr()?)
15359 } else {
15360 None
15361 };
15362
15363 let (named_windows, qualify, window_before_qualify) = if self.parse_keyword(Keyword::WINDOW)
15365 {
15366 let named_windows = self.parse_comma_separated(Parser::parse_named_window)?;
15367 if self.parse_keyword(Keyword::QUALIFY) {
15368 (named_windows, Some(self.parse_expr()?), true)
15369 } else {
15370 (named_windows, None, true)
15371 }
15372 } else if self.parse_keyword(Keyword::QUALIFY) {
15373 let qualify = Some(self.parse_expr()?);
15374 if self.parse_keyword(Keyword::WINDOW) {
15375 (
15376 self.parse_comma_separated(Parser::parse_named_window)?,
15377 qualify,
15378 false,
15379 )
15380 } else {
15381 (Default::default(), qualify, false)
15382 }
15383 } else {
15384 Default::default()
15385 };
15386
15387 Ok(Select {
15388 select_token: AttachedToken(select_token),
15389 optimizer_hints,
15390 distinct,
15391 select_modifiers,
15392 top,
15393 top_before_distinct,
15394 projection,
15395 exclude,
15396 into,
15397 from,
15398 lateral_views,
15399 prewhere,
15400 selection,
15401 group_by,
15402 cluster_by,
15403 distribute_by,
15404 sort_by,
15405 having,
15406 named_window: named_windows,
15407 window_before_qualify,
15408 qualify,
15409 value_table_mode,
15410 connect_by,
15411 flavor: if from_first {
15412 SelectFlavor::FromFirst
15413 } else {
15414 SelectFlavor::Standard
15415 },
15416 })
15417 }
15418
15419 fn maybe_parse_optimizer_hints(&mut self) -> Result<Vec<OptimizerHint>, ParserError> {
15428 let supports_hints = self.dialect.supports_comment_optimizer_hint();
15429 if !supports_hints {
15430 return Ok(vec![]);
15431 }
15432 let mut hints = vec![];
15433 loop {
15434 let t = self.peek_nth_token_no_skip_ref(0);
15435 let Token::Whitespace(ws) = &t.token else {
15436 break;
15437 };
15438 match ws {
15439 Whitespace::SingleLineComment { comment, prefix } => {
15440 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15441 hints.push(OptimizerHint {
15442 prefix: hint_prefix,
15443 text,
15444 style: OptimizerHintStyle::SingleLine {
15445 prefix: prefix.clone(),
15446 },
15447 });
15448 }
15449 self.next_token_no_skip();
15450 }
15451 Whitespace::MultiLineComment(comment) => {
15452 if let Some((hint_prefix, text)) = Self::extract_hint_prefix_and_text(comment) {
15453 hints.push(OptimizerHint {
15454 prefix: hint_prefix,
15455 text,
15456 style: OptimizerHintStyle::MultiLine,
15457 });
15458 }
15459 self.next_token_no_skip();
15460 }
15461 Whitespace::Space | Whitespace::Tab | Whitespace::Newline => {
15462 self.next_token_no_skip();
15463 }
15464 }
15465 }
15466 Ok(hints)
15467 }
15468
15469 fn extract_hint_prefix_and_text(comment: &str) -> Option<(String, String)> {
15472 let (before_plus, text) = comment.split_once('+')?;
15473 if before_plus.chars().all(|c| c.is_ascii_alphanumeric()) {
15474 Some((before_plus.to_string(), text.to_string()))
15475 } else {
15476 None
15477 }
15478 }
15479
15480 fn parse_select_modifiers(
15487 &mut self,
15488 ) -> Result<(Option<SelectModifiers>, Option<Distinct>), ParserError> {
15489 let mut modifiers = SelectModifiers::default();
15490 let mut distinct = None;
15491
15492 let keywords = &[
15493 Keyword::ALL,
15494 Keyword::DISTINCT,
15495 Keyword::DISTINCTROW,
15496 Keyword::HIGH_PRIORITY,
15497 Keyword::STRAIGHT_JOIN,
15498 Keyword::SQL_SMALL_RESULT,
15499 Keyword::SQL_BIG_RESULT,
15500 Keyword::SQL_BUFFER_RESULT,
15501 Keyword::SQL_NO_CACHE,
15502 Keyword::SQL_CALC_FOUND_ROWS,
15503 ];
15504
15505 while let Some(keyword) = self.parse_one_of_keywords(keywords) {
15506 match keyword {
15507 Keyword::ALL | Keyword::DISTINCT if distinct.is_none() => {
15508 self.prev_token();
15509 distinct = self.parse_all_or_distinct()?;
15510 }
15511 Keyword::DISTINCTROW if distinct.is_none() => {
15513 distinct = Some(Distinct::Distinct);
15514 }
15515 Keyword::HIGH_PRIORITY => modifiers.high_priority = true,
15516 Keyword::STRAIGHT_JOIN => modifiers.straight_join = true,
15517 Keyword::SQL_SMALL_RESULT => modifiers.sql_small_result = true,
15518 Keyword::SQL_BIG_RESULT => modifiers.sql_big_result = true,
15519 Keyword::SQL_BUFFER_RESULT => modifiers.sql_buffer_result = true,
15520 Keyword::SQL_NO_CACHE => modifiers.sql_no_cache = true,
15521 Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows = true,
15522 _ => {
15523 self.prev_token();
15524 return self.expected_ref(
15525 "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select modifier",
15526 self.peek_token_ref(),
15527 );
15528 }
15529 }
15530 }
15531
15532 let select_modifiers = if modifiers.is_any_set() {
15535 Some(modifiers)
15536 } else {
15537 None
15538 };
15539 Ok((select_modifiers, distinct))
15540 }
15541
15542 fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
15543 if !dialect_of!(self is BigQueryDialect) {
15544 return Ok(None);
15545 }
15546
15547 let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
15548 Some(ValueTableMode::DistinctAsValue)
15549 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
15550 Some(ValueTableMode::DistinctAsStruct)
15551 } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
15552 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
15553 {
15554 Some(ValueTableMode::AsValue)
15555 } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
15556 || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
15557 {
15558 Some(ValueTableMode::AsStruct)
15559 } else if self.parse_keyword(Keyword::AS) {
15560 self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
15561 } else {
15562 None
15563 };
15564
15565 Ok(mode)
15566 }
15567
15568 fn with_state<T, F>(&mut self, state: ParserState, mut f: F) -> Result<T, ParserError>
15572 where
15573 F: FnMut(&mut Parser) -> Result<T, ParserError>,
15574 {
15575 let current_state = self.state;
15576 self.state = state;
15577 let res = f(self);
15578 self.state = current_state;
15579 res
15580 }
15581
15582 pub fn maybe_parse_connect_by(&mut self) -> Result<Vec<ConnectByKind>, ParserError> {
15584 let mut clauses = Vec::with_capacity(2);
15585 loop {
15586 if let Some(idx) = self.parse_keywords_indexed(&[Keyword::START, Keyword::WITH]) {
15587 clauses.push(ConnectByKind::StartWith {
15588 start_token: self.token_at(idx).clone().into(),
15589 condition: self.parse_expr()?.into(),
15590 });
15591 } else if let Some(idx) = self.parse_keywords_indexed(&[Keyword::CONNECT, Keyword::BY])
15592 {
15593 clauses.push(ConnectByKind::ConnectBy {
15594 connect_token: self.token_at(idx).clone().into(),
15595 nocycle: self.parse_keyword(Keyword::NOCYCLE),
15596 relationships: self.with_state(ParserState::ConnectBy, |parser| {
15597 parser.parse_comma_separated(Parser::parse_expr)
15598 })?,
15599 });
15600 } else {
15601 break;
15602 }
15603 }
15604 Ok(clauses)
15605 }
15606
15607 pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
15609 let token1 = self.next_token();
15610 let token2 = self.next_token();
15611 let token3 = self.next_token();
15612
15613 let table_name;
15614 let schema_name;
15615 if token2 == Token::Period {
15616 match token1.token {
15617 Token::Word(w) => {
15618 schema_name = w.value;
15619 }
15620 _ => {
15621 return self.expected("Schema name", token1);
15622 }
15623 }
15624 match token3.token {
15625 Token::Word(w) => {
15626 table_name = w.value;
15627 }
15628 _ => {
15629 return self.expected("Table name", token3);
15630 }
15631 }
15632 Ok(Table {
15633 table_name: Some(table_name),
15634 schema_name: Some(schema_name),
15635 })
15636 } else {
15637 match token1.token {
15638 Token::Word(w) => {
15639 table_name = w.value;
15640 }
15641 _ => {
15642 return self.expected("Table name", token1);
15643 }
15644 }
15645 Ok(Table {
15646 table_name: Some(table_name),
15647 schema_name: None,
15648 })
15649 }
15650 }
15651
15652 fn parse_set_role(
15654 &mut self,
15655 modifier: Option<ContextModifier>,
15656 ) -> Result<Statement, ParserError> {
15657 self.expect_keyword_is(Keyword::ROLE)?;
15658
15659 let role_name = if self.parse_keyword(Keyword::NONE) {
15660 None
15661 } else {
15662 Some(self.parse_identifier()?)
15663 };
15664 Ok(Statement::Set(Set::SetRole {
15665 context_modifier: modifier,
15666 role_name,
15667 }))
15668 }
15669
15670 fn parse_set_values(
15671 &mut self,
15672 parenthesized_assignment: bool,
15673 ) -> Result<Vec<Expr>, ParserError> {
15674 let mut values = vec![];
15675
15676 if parenthesized_assignment {
15677 self.expect_token(&Token::LParen)?;
15678 }
15679
15680 loop {
15681 let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
15682 expr
15683 } else if let Ok(expr) = self.parse_expr() {
15684 expr
15685 } else {
15686 self.expected_ref("variable value", self.peek_token_ref())?
15687 };
15688
15689 values.push(value);
15690 if self.consume_token(&Token::Comma) {
15691 continue;
15692 }
15693
15694 if parenthesized_assignment {
15695 self.expect_token(&Token::RParen)?;
15696 }
15697 return Ok(values);
15698 }
15699 }
15700
15701 fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
15702 let modifier =
15703 self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
15704
15705 Self::keyword_to_modifier(modifier)
15706 }
15707
15708 fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
15710 let scope = self.parse_context_modifier();
15711
15712 let name = if self.dialect.supports_parenthesized_set_variables()
15713 && self.consume_token(&Token::LParen)
15714 {
15715 self.expected_ref("Unparenthesized assignment", self.peek_token_ref())?
15719 } else {
15720 self.parse_object_name(false)?
15721 };
15722
15723 if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
15724 return self.expected_ref("assignment operator", self.peek_token_ref());
15725 }
15726
15727 let value = self.parse_expr()?;
15728
15729 Ok(SetAssignment { scope, name, value })
15730 }
15731
15732 fn parse_set(&mut self) -> Result<Statement, ParserError> {
15733 let hivevar = self.parse_keyword(Keyword::HIVEVAR);
15734
15735 let scope = if !hivevar {
15737 self.parse_context_modifier()
15738 } else {
15739 None
15740 };
15741
15742 if hivevar {
15743 self.expect_token(&Token::Colon)?;
15744 }
15745
15746 if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
15747 return Ok(set_role_stmt);
15748 }
15749
15750 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
15752 || self.parse_keyword(Keyword::TIMEZONE)
15753 {
15754 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15755 return Ok(Set::SingleAssignment {
15756 scope,
15757 hivevar,
15758 variable: ObjectName::from(vec!["TIMEZONE".into()]),
15759 values: self.parse_set_values(false)?,
15760 }
15761 .into());
15762 } else {
15763 return Ok(Set::SetTimeZone {
15767 local: scope == Some(ContextModifier::Local),
15768 value: self.parse_expr()?,
15769 }
15770 .into());
15771 }
15772 } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
15773 if self.parse_keyword(Keyword::DEFAULT) {
15774 return Ok(Set::SetNamesDefault {}.into());
15775 }
15776 let charset_name = self.parse_identifier()?;
15777 let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
15778 Some(self.parse_literal_string()?)
15779 } else {
15780 None
15781 };
15782
15783 return Ok(Set::SetNames {
15784 charset_name,
15785 collation_name,
15786 }
15787 .into());
15788 } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
15789 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
15790 return Ok(Set::SetTransaction {
15791 modes: self.parse_transaction_modes()?,
15792 snapshot: None,
15793 session: true,
15794 }
15795 .into());
15796 } else if self.parse_keyword(Keyword::TRANSACTION) {
15797 if self.parse_keyword(Keyword::SNAPSHOT) {
15798 let snapshot_id = self.parse_value()?;
15799 return Ok(Set::SetTransaction {
15800 modes: vec![],
15801 snapshot: Some(snapshot_id),
15802 session: false,
15803 }
15804 .into());
15805 }
15806 return Ok(Set::SetTransaction {
15807 modes: self.parse_transaction_modes()?,
15808 snapshot: None,
15809 session: false,
15810 }
15811 .into());
15812 } else if self.parse_keyword(Keyword::AUTHORIZATION) {
15813 let scope = match scope {
15814 Some(s) => s,
15815 None => {
15816 return self.expected_at(
15817 "SESSION, LOCAL, or other scope modifier before AUTHORIZATION",
15818 self.get_current_index(),
15819 )
15820 }
15821 };
15822 let auth_value = if self.parse_keyword(Keyword::DEFAULT) {
15823 SetSessionAuthorizationParamKind::Default
15824 } else {
15825 let value = self.parse_identifier()?;
15826 SetSessionAuthorizationParamKind::User(value)
15827 };
15828 return Ok(Set::SetSessionAuthorization(SetSessionAuthorizationParam {
15829 scope,
15830 kind: auth_value,
15831 })
15832 .into());
15833 }
15834
15835 if self.dialect.supports_comma_separated_set_assignments() {
15836 if scope.is_some() {
15837 self.prev_token();
15838 }
15839
15840 if let Some(assignments) = self
15841 .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
15842 {
15843 return if assignments.len() > 1 {
15844 Ok(Set::MultipleAssignments { assignments }.into())
15845 } else {
15846 let SetAssignment { scope, name, value } =
15847 assignments.into_iter().next().ok_or_else(|| {
15848 ParserError::ParserError("Expected at least one assignment".to_string())
15849 })?;
15850
15851 Ok(Set::SingleAssignment {
15852 scope,
15853 hivevar,
15854 variable: name,
15855 values: vec![value],
15856 }
15857 .into())
15858 };
15859 }
15860 }
15861
15862 let variables = if self.dialect.supports_parenthesized_set_variables()
15863 && self.consume_token(&Token::LParen)
15864 {
15865 let vars = OneOrManyWithParens::Many(
15866 self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
15867 .into_iter()
15868 .map(|ident| ObjectName::from(vec![ident]))
15869 .collect(),
15870 );
15871 self.expect_token(&Token::RParen)?;
15872 vars
15873 } else {
15874 OneOrManyWithParens::One(self.parse_object_name(false)?)
15875 };
15876
15877 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
15878 let stmt = match variables {
15879 OneOrManyWithParens::One(var) => Set::SingleAssignment {
15880 scope,
15881 hivevar,
15882 variable: var,
15883 values: self.parse_set_values(false)?,
15884 },
15885 OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
15886 variables: vars,
15887 values: self.parse_set_values(true)?,
15888 },
15889 };
15890
15891 return Ok(stmt.into());
15892 }
15893
15894 if self.dialect.supports_set_stmt_without_operator() {
15895 self.prev_token();
15896 return self.parse_set_session_params();
15897 };
15898
15899 self.expected_ref("equals sign or TO", self.peek_token_ref())
15900 }
15901
15902 pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
15904 if self.parse_keyword(Keyword::STATISTICS) {
15905 let topic = match self.parse_one_of_keywords(&[
15906 Keyword::IO,
15907 Keyword::PROFILE,
15908 Keyword::TIME,
15909 Keyword::XML,
15910 ]) {
15911 Some(Keyword::IO) => SessionParamStatsTopic::IO,
15912 Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
15913 Some(Keyword::TIME) => SessionParamStatsTopic::Time,
15914 Some(Keyword::XML) => SessionParamStatsTopic::Xml,
15915 _ => return self.expected_ref("IO, PROFILE, TIME or XML", self.peek_token_ref()),
15916 };
15917 let value = self.parse_session_param_value()?;
15918 Ok(
15919 Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
15920 topic,
15921 value,
15922 }))
15923 .into(),
15924 )
15925 } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
15926 let obj = self.parse_object_name(false)?;
15927 let value = self.parse_session_param_value()?;
15928 Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
15929 SetSessionParamIdentityInsert { obj, value },
15930 ))
15931 .into())
15932 } else if self.parse_keyword(Keyword::OFFSETS) {
15933 let keywords = self.parse_comma_separated(|parser| {
15934 let next_token = parser.next_token();
15935 match &next_token.token {
15936 Token::Word(w) => Ok(w.to_string()),
15937 _ => parser.expected("SQL keyword", next_token),
15938 }
15939 })?;
15940 let value = self.parse_session_param_value()?;
15941 Ok(
15942 Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
15943 keywords,
15944 value,
15945 }))
15946 .into(),
15947 )
15948 } else {
15949 let names = self.parse_comma_separated(|parser| {
15950 let next_token = parser.next_token();
15951 match next_token.token {
15952 Token::Word(w) => Ok(w.to_string()),
15953 _ => parser.expected("Session param name", next_token),
15954 }
15955 })?;
15956 let value = self.parse_expr()?.to_string();
15957 Ok(
15958 Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
15959 names,
15960 value,
15961 }))
15962 .into(),
15963 )
15964 }
15965 }
15966
15967 fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
15968 if self.parse_keyword(Keyword::ON) {
15969 Ok(SessionParamValue::On)
15970 } else if self.parse_keyword(Keyword::OFF) {
15971 Ok(SessionParamValue::Off)
15972 } else {
15973 self.expected_ref("ON or OFF", self.peek_token_ref())
15974 }
15975 }
15976
15977 pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
15979 let terse = self.parse_keyword(Keyword::TERSE);
15980 let extended = self.parse_keyword(Keyword::EXTENDED);
15981 let full = self.parse_keyword(Keyword::FULL);
15982 let session = self.parse_keyword(Keyword::SESSION);
15983 let global = self.parse_keyword(Keyword::GLOBAL);
15984 let external = self.parse_keyword(Keyword::EXTERNAL);
15985 if self
15986 .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
15987 .is_some()
15988 {
15989 Ok(self.parse_show_columns(extended, full)?)
15990 } else if self.parse_keyword(Keyword::TABLES) {
15991 Ok(self.parse_show_tables(terse, extended, full, external)?)
15992 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
15993 Ok(self.parse_show_views(terse, true)?)
15994 } else if self.parse_keyword(Keyword::VIEWS) {
15995 Ok(self.parse_show_views(terse, false)?)
15996 } else if self.parse_keyword(Keyword::FUNCTIONS) {
15997 Ok(self.parse_show_functions()?)
15998 } else if self.parse_keyword(Keyword::PROCESSLIST) {
15999 Ok(Statement::ShowProcessList { full })
16000 } else if extended || full {
16001 Err(ParserError::ParserError(
16002 "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
16003 ))
16004 } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
16005 Ok(self.parse_show_create()?)
16006 } else if self.parse_keyword(Keyword::COLLATION) {
16007 Ok(self.parse_show_collation()?)
16008 } else if self.parse_keyword(Keyword::VARIABLES)
16009 && dialect_of!(self is MySqlDialect | GenericDialect)
16010 {
16011 Ok(Statement::ShowVariables {
16012 filter: self.parse_show_statement_filter()?,
16013 session,
16014 global,
16015 })
16016 } else if self.parse_keyword(Keyword::STATUS)
16017 && dialect_of!(self is MySqlDialect | GenericDialect)
16018 {
16019 Ok(Statement::ShowStatus {
16020 filter: self.parse_show_statement_filter()?,
16021 session,
16022 global,
16023 })
16024 } else if self.parse_keyword(Keyword::CATALOGS) {
16025 self.parse_show_catalogs(terse)
16026 } else if self.parse_keyword(Keyword::DATABASES) {
16027 self.parse_show_databases(terse)
16028 } else if self.parse_keyword(Keyword::SCHEMAS) {
16029 self.parse_show_schemas(terse)
16030 } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
16031 self.parse_show_charset(false)
16032 } else if self.parse_keyword(Keyword::CHARSET) {
16033 self.parse_show_charset(true)
16034 } else {
16035 Ok(Statement::ShowVariable {
16036 variable: self.parse_identifiers()?,
16037 })
16038 }
16039 }
16040
16041 fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
16042 Ok(Statement::ShowCharset(ShowCharset {
16044 is_shorthand,
16045 filter: self.parse_show_statement_filter()?,
16046 }))
16047 }
16048
16049 fn parse_show_catalogs(&mut self, terse: bool) -> Result<Statement, ParserError> {
16050 let history = self.parse_keyword(Keyword::HISTORY);
16051 let show_options = self.parse_show_stmt_options()?;
16052 Ok(Statement::ShowCatalogs {
16053 terse,
16054 history,
16055 show_options,
16056 })
16057 }
16058
16059 fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
16060 let history = self.parse_keyword(Keyword::HISTORY);
16061 let show_options = self.parse_show_stmt_options()?;
16062 Ok(Statement::ShowDatabases {
16063 terse,
16064 history,
16065 show_options,
16066 })
16067 }
16068
16069 fn parse_show_schemas(&mut self, terse: bool) -> Result<Statement, ParserError> {
16070 let history = self.parse_keyword(Keyword::HISTORY);
16071 let show_options = self.parse_show_stmt_options()?;
16072 Ok(Statement::ShowSchemas {
16073 terse,
16074 history,
16075 show_options,
16076 })
16077 }
16078
16079 pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
16081 let obj_type = match self.expect_one_of_keywords(&[
16082 Keyword::TABLE,
16083 Keyword::TRIGGER,
16084 Keyword::FUNCTION,
16085 Keyword::PROCEDURE,
16086 Keyword::EVENT,
16087 Keyword::VIEW,
16088 ])? {
16089 Keyword::TABLE => Ok(ShowCreateObject::Table),
16090 Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
16091 Keyword::FUNCTION => Ok(ShowCreateObject::Function),
16092 Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
16093 Keyword::EVENT => Ok(ShowCreateObject::Event),
16094 Keyword::VIEW => Ok(ShowCreateObject::View),
16095 keyword => Err(ParserError::ParserError(format!(
16096 "Unable to map keyword to ShowCreateObject: {keyword:?}"
16097 ))),
16098 }?;
16099
16100 let obj_name = self.parse_object_name(false)?;
16101
16102 Ok(Statement::ShowCreate { obj_type, obj_name })
16103 }
16104
16105 pub fn parse_show_columns(
16107 &mut self,
16108 extended: bool,
16109 full: bool,
16110 ) -> Result<Statement, ParserError> {
16111 let show_options = self.parse_show_stmt_options()?;
16112 Ok(Statement::ShowColumns {
16113 extended,
16114 full,
16115 show_options,
16116 })
16117 }
16118
16119 fn parse_show_tables(
16120 &mut self,
16121 terse: bool,
16122 extended: bool,
16123 full: bool,
16124 external: bool,
16125 ) -> Result<Statement, ParserError> {
16126 let history = !external && self.parse_keyword(Keyword::HISTORY);
16127 let show_options = self.parse_show_stmt_options()?;
16128 Ok(Statement::ShowTables {
16129 terse,
16130 history,
16131 extended,
16132 full,
16133 external,
16134 show_options,
16135 })
16136 }
16137
16138 fn parse_show_views(
16139 &mut self,
16140 terse: bool,
16141 materialized: bool,
16142 ) -> Result<Statement, ParserError> {
16143 let show_options = self.parse_show_stmt_options()?;
16144 Ok(Statement::ShowViews {
16145 materialized,
16146 terse,
16147 show_options,
16148 })
16149 }
16150
16151 pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
16153 let filter = self.parse_show_statement_filter()?;
16154 Ok(Statement::ShowFunctions { filter })
16155 }
16156
16157 pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
16159 let filter = self.parse_show_statement_filter()?;
16160 Ok(Statement::ShowCollation { filter })
16161 }
16162
16163 pub fn parse_show_statement_filter(
16165 &mut self,
16166 ) -> Result<Option<ShowStatementFilter>, ParserError> {
16167 if self.parse_keyword(Keyword::LIKE) {
16168 Ok(Some(ShowStatementFilter::Like(
16169 self.parse_literal_string()?,
16170 )))
16171 } else if self.parse_keyword(Keyword::ILIKE) {
16172 Ok(Some(ShowStatementFilter::ILike(
16173 self.parse_literal_string()?,
16174 )))
16175 } else if self.parse_keyword(Keyword::WHERE) {
16176 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
16177 } else {
16178 self.maybe_parse(|parser| -> Result<String, ParserError> {
16179 parser.parse_literal_string()
16180 })?
16181 .map_or(Ok(None), |filter| {
16182 Ok(Some(ShowStatementFilter::NoKeyword(filter)))
16183 })
16184 }
16185 }
16186
16187 pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
16189 let parsed_keyword = if dialect_of!(self is HiveDialect) {
16191 if self.parse_keyword(Keyword::DEFAULT) {
16193 return Ok(Statement::Use(Use::Default));
16194 }
16195 None } else if dialect_of!(self is DatabricksDialect) {
16197 self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
16198 } else if dialect_of!(self is SnowflakeDialect) {
16199 self.parse_one_of_keywords(&[
16200 Keyword::DATABASE,
16201 Keyword::SCHEMA,
16202 Keyword::WAREHOUSE,
16203 Keyword::ROLE,
16204 Keyword::SECONDARY,
16205 ])
16206 } else {
16207 None };
16209
16210 let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
16211 self.parse_secondary_roles()?
16212 } else {
16213 let obj_name = self.parse_object_name(false)?;
16214 match parsed_keyword {
16215 Some(Keyword::CATALOG) => Use::Catalog(obj_name),
16216 Some(Keyword::DATABASE) => Use::Database(obj_name),
16217 Some(Keyword::SCHEMA) => Use::Schema(obj_name),
16218 Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
16219 Some(Keyword::ROLE) => Use::Role(obj_name),
16220 _ => Use::Object(obj_name),
16221 }
16222 };
16223
16224 Ok(Statement::Use(result))
16225 }
16226
16227 fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
16228 self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
16229 if self.parse_keyword(Keyword::NONE) {
16230 Ok(Use::SecondaryRoles(SecondaryRoles::None))
16231 } else if self.parse_keyword(Keyword::ALL) {
16232 Ok(Use::SecondaryRoles(SecondaryRoles::All))
16233 } else {
16234 let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
16235 Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
16236 }
16237 }
16238
16239 pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
16241 let relation = self.parse_table_factor()?;
16242 let joins = self.parse_joins()?;
16246 Ok(TableWithJoins { relation, joins })
16247 }
16248
16249 fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
16250 let mut joins = vec![];
16251 loop {
16252 let global = self.parse_keyword(Keyword::GLOBAL);
16253 let join = if self.parse_keyword(Keyword::CROSS) {
16254 let join_operator = if self.parse_keyword(Keyword::JOIN) {
16255 JoinOperator::CrossJoin(JoinConstraint::None)
16256 } else if self.parse_keyword(Keyword::APPLY) {
16257 JoinOperator::CrossApply
16259 } else {
16260 return self.expected_ref("JOIN or APPLY after CROSS", self.peek_token_ref());
16261 };
16262 let relation = self.parse_table_factor()?;
16263 let join_operator = if matches!(join_operator, JoinOperator::CrossJoin(_))
16264 && self.dialect.supports_cross_join_constraint()
16265 {
16266 let constraint = self.parse_join_constraint(false)?;
16267 JoinOperator::CrossJoin(constraint)
16268 } else {
16269 join_operator
16270 };
16271 Join {
16272 relation,
16273 global,
16274 join_operator,
16275 }
16276 } else if self.parse_keyword(Keyword::OUTER) {
16277 self.expect_keyword_is(Keyword::APPLY)?;
16279 Join {
16280 relation: self.parse_table_factor()?,
16281 global,
16282 join_operator: JoinOperator::OuterApply,
16283 }
16284 } else if self.parse_keyword(Keyword::ASOF) {
16285 self.expect_keyword_is(Keyword::JOIN)?;
16286 let relation = self.parse_table_factor()?;
16287 self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
16288 let match_condition = self.parse_parenthesized(Self::parse_expr)?;
16289 Join {
16290 relation,
16291 global,
16292 join_operator: JoinOperator::AsOf {
16293 match_condition,
16294 constraint: self.parse_join_constraint(false)?,
16295 },
16296 }
16297 } else if self.dialect.supports_array_join_syntax()
16298 && self.parse_keywords(&[Keyword::INNER, Keyword::ARRAY, Keyword::JOIN])
16299 {
16300 Join {
16302 relation: self.parse_table_factor()?,
16303 global,
16304 join_operator: JoinOperator::InnerArrayJoin,
16305 }
16306 } else if self.dialect.supports_array_join_syntax()
16307 && self.parse_keywords(&[Keyword::LEFT, Keyword::ARRAY, Keyword::JOIN])
16308 {
16309 Join {
16311 relation: self.parse_table_factor()?,
16312 global,
16313 join_operator: JoinOperator::LeftArrayJoin,
16314 }
16315 } else if self.dialect.supports_array_join_syntax()
16316 && self.parse_keywords(&[Keyword::ARRAY, Keyword::JOIN])
16317 {
16318 Join {
16320 relation: self.parse_table_factor()?,
16321 global,
16322 join_operator: JoinOperator::ArrayJoin,
16323 }
16324 } else {
16325 let natural = self.parse_keyword(Keyword::NATURAL);
16326 let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
16327 w.keyword
16328 } else {
16329 Keyword::NoKeyword
16330 };
16331
16332 let join_operator_type = match peek_keyword {
16333 Keyword::INNER | Keyword::JOIN => {
16334 let inner = self.parse_keyword(Keyword::INNER); self.expect_keyword_is(Keyword::JOIN)?;
16336 if inner {
16337 JoinOperator::Inner
16338 } else {
16339 JoinOperator::Join
16340 }
16341 }
16342 kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
16343 let _ = self.next_token(); let is_left = kw == Keyword::LEFT;
16345 let join_type = self.parse_one_of_keywords(&[
16346 Keyword::OUTER,
16347 Keyword::SEMI,
16348 Keyword::ANTI,
16349 Keyword::JOIN,
16350 ]);
16351 match join_type {
16352 Some(Keyword::OUTER) => {
16353 self.expect_keyword_is(Keyword::JOIN)?;
16354 if is_left {
16355 JoinOperator::LeftOuter
16356 } else {
16357 JoinOperator::RightOuter
16358 }
16359 }
16360 Some(Keyword::SEMI) => {
16361 self.expect_keyword_is(Keyword::JOIN)?;
16362 if is_left {
16363 JoinOperator::LeftSemi
16364 } else {
16365 JoinOperator::RightSemi
16366 }
16367 }
16368 Some(Keyword::ANTI) => {
16369 self.expect_keyword_is(Keyword::JOIN)?;
16370 if is_left {
16371 JoinOperator::LeftAnti
16372 } else {
16373 JoinOperator::RightAnti
16374 }
16375 }
16376 Some(Keyword::JOIN) => {
16377 if is_left {
16378 JoinOperator::Left
16379 } else {
16380 JoinOperator::Right
16381 }
16382 }
16383 _ => {
16384 return Err(ParserError::ParserError(format!(
16385 "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
16386 )))
16387 }
16388 }
16389 }
16390 Keyword::ANTI => {
16391 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16393 JoinOperator::Anti
16394 }
16395 Keyword::SEMI => {
16396 let _ = self.next_token(); self.expect_keyword_is(Keyword::JOIN)?;
16398 JoinOperator::Semi
16399 }
16400 Keyword::FULL => {
16401 let _ = self.next_token(); let _ = self.parse_keyword(Keyword::OUTER); self.expect_keyword_is(Keyword::JOIN)?;
16404 JoinOperator::FullOuter
16405 }
16406 Keyword::OUTER => {
16407 return self.expected_ref("LEFT, RIGHT, or FULL", self.peek_token_ref());
16408 }
16409 Keyword::STRAIGHT_JOIN => {
16410 let _ = self.next_token(); JoinOperator::StraightJoin
16412 }
16413 _ if natural => {
16414 return self
16415 .expected_ref("a join type after NATURAL", self.peek_token_ref());
16416 }
16417 _ => break,
16418 };
16419 let mut relation = self.parse_table_factor()?;
16420
16421 if !self
16422 .dialect
16423 .supports_left_associative_joins_without_parens()
16424 && !natural
16425 && self.peek_parens_less_nested_join()
16426 {
16427 let joins = self.parse_joins()?;
16428 relation = TableFactor::NestedJoin {
16429 table_with_joins: Box::new(TableWithJoins { relation, joins }),
16430 alias: None,
16431 };
16432 }
16433
16434 let join_constraint = self.parse_join_constraint(natural)?;
16435 Join {
16436 relation,
16437 global,
16438 join_operator: join_operator_type(join_constraint),
16439 }
16440 };
16441 joins.push(join);
16442 }
16443 Ok(joins)
16444 }
16445
16446 fn peek_parens_less_nested_join(&self) -> bool {
16447 matches!(
16448 self.peek_token_ref().token,
16449 Token::Word(Word {
16450 keyword: Keyword::JOIN
16451 | Keyword::INNER
16452 | Keyword::LEFT
16453 | Keyword::RIGHT
16454 | Keyword::FULL,
16455 ..
16456 })
16457 )
16458 }
16459
16460 #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
16462 pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16463 let _guard = self.recursion_counter.try_decrease()?;
16464 if self.parse_keyword(Keyword::LATERAL) {
16465 if self.consume_token(&Token::LParen) {
16467 self.parse_derived_table_factor(Lateral)
16468 } else {
16469 let name = self.parse_object_name(false)?;
16470 self.expect_token(&Token::LParen)?;
16471 let args = self.parse_optional_args()?;
16472 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16473 let alias = self.maybe_parse_table_alias()?;
16474 Ok(TableFactor::Function {
16475 lateral: true,
16476 name,
16477 args,
16478 with_ordinality,
16479 alias,
16480 })
16481 }
16482 } else if self.parse_keyword(Keyword::TABLE) {
16483 self.expect_token(&Token::LParen)?;
16485 let expr = self.parse_expr()?;
16486 self.expect_token(&Token::RParen)?;
16487 let alias = self.maybe_parse_table_alias()?;
16488 Ok(TableFactor::TableFunction { expr, alias })
16489 } else if self.consume_token(&Token::LParen) {
16490 let derived_pos = self.index;
16516 let derived = if self
16517 .failed_derived_table_factor_positions
16518 .contains(&derived_pos)
16519 {
16520 None
16521 } else {
16522 match self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))? {
16523 Some(t) => Some(t),
16524 None => {
16525 self.failed_derived_table_factor_positions
16526 .insert(derived_pos);
16527 None
16528 }
16529 }
16530 };
16531 if let Some(mut table) = derived {
16532 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
16533 {
16534 table = match kw {
16535 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16536 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16537 unexpected_keyword => return Err(ParserError::ParserError(
16538 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16539 )),
16540 }
16541 }
16542 return Ok(table);
16543 }
16544
16545 let mut table_and_joins = self.parse_table_and_joins()?;
16552
16553 #[allow(clippy::if_same_then_else)]
16554 if !table_and_joins.joins.is_empty() {
16555 self.expect_token(&Token::RParen)?;
16556 let alias = self.maybe_parse_table_alias()?;
16557 Ok(TableFactor::NestedJoin {
16558 table_with_joins: Box::new(table_and_joins),
16559 alias,
16560 }) } else if let TableFactor::NestedJoin {
16562 table_with_joins: _,
16563 alias: _,
16564 } = &table_and_joins.relation
16565 {
16566 self.expect_token(&Token::RParen)?;
16569 let alias = self.maybe_parse_table_alias()?;
16570 Ok(TableFactor::NestedJoin {
16571 table_with_joins: Box::new(table_and_joins),
16572 alias,
16573 })
16574 } else if self.dialect.supports_parens_around_table_factor() {
16575 self.expect_token(&Token::RParen)?;
16582
16583 if let Some(outer_alias) = self.maybe_parse_table_alias()? {
16584 match &mut table_and_joins.relation {
16587 TableFactor::Derived { alias, .. }
16588 | TableFactor::Table { alias, .. }
16589 | TableFactor::Function { alias, .. }
16590 | TableFactor::UNNEST { alias, .. }
16591 | TableFactor::JsonTable { alias, .. }
16592 | TableFactor::XmlTable { alias, .. }
16593 | TableFactor::OpenJsonTable { alias, .. }
16594 | TableFactor::TableFunction { alias, .. }
16595 | TableFactor::Pivot { alias, .. }
16596 | TableFactor::Unpivot { alias, .. }
16597 | TableFactor::MatchRecognize { alias, .. }
16598 | TableFactor::SemanticView { alias, .. }
16599 | TableFactor::NestedJoin { alias, .. } => {
16600 if let Some(inner_alias) = alias {
16602 return Err(ParserError::ParserError(format!(
16603 "duplicate alias {inner_alias}"
16604 )));
16605 }
16606 alias.replace(outer_alias);
16610 }
16611 TableFactor::UnpivotExpr { .. } => {
16612 return Err(ParserError::ParserError(
16613 "alias after parenthesized UNPIVOT expression is not supported"
16614 .to_string(),
16615 ))
16616 }
16617 };
16618 }
16619 Ok(table_and_joins.relation)
16621 } else {
16622 self.expected_ref("joined table", self.peek_token_ref())
16625 }
16626 } else if self.dialect.supports_values_as_table_factor()
16627 && matches!(
16628 self.peek_tokens(),
16629 [
16630 Token::Word(Word {
16631 keyword: Keyword::VALUES,
16632 ..
16633 }),
16634 Token::LParen
16635 ]
16636 )
16637 {
16638 self.expect_keyword_is(Keyword::VALUES)?;
16639
16640 let values = SetExpr::Values(self.parse_values(false, false)?);
16644 let alias = self.maybe_parse_table_alias()?;
16645 Ok(TableFactor::Derived {
16646 lateral: false,
16647 subquery: Box::new(Query {
16648 with: None,
16649 body: Box::new(values),
16650 order_by: None,
16651 limit_clause: None,
16652 fetch: None,
16653 locks: vec![],
16654 for_clause: None,
16655 settings: None,
16656 format_clause: None,
16657 pipe_operators: vec![],
16658 }),
16659 alias,
16660 sample: None,
16661 })
16662 } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
16663 && self.parse_keyword(Keyword::UNNEST)
16664 {
16665 self.expect_token(&Token::LParen)?;
16666 let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
16667 self.expect_token(&Token::RParen)?;
16668
16669 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16670 let alias = match self.maybe_parse_table_alias() {
16671 Ok(Some(alias)) => Some(alias),
16672 Ok(None) => None,
16673 Err(e) => return Err(e),
16674 };
16675
16676 let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
16677 Ok(()) => true,
16678 Err(_) => false,
16679 };
16680
16681 let with_offset_alias = if with_offset {
16682 match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
16683 Ok(Some(alias)) => Some(alias),
16684 Ok(None) => None,
16685 Err(e) => return Err(e),
16686 }
16687 } else {
16688 None
16689 };
16690
16691 Ok(TableFactor::UNNEST {
16692 alias,
16693 array_exprs,
16694 with_offset,
16695 with_offset_alias,
16696 with_ordinality,
16697 })
16698 } else if self.dialect.supports_unpivot_expr() && self.peek_keyword(Keyword::UNPIVOT) {
16699 self.parse_unpivot_expr_table_factor()
16700 } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
16701 let json_expr = self.parse_expr()?;
16702 self.expect_token(&Token::Comma)?;
16703 let json_path = self.parse_value()?;
16704 self.expect_keyword_is(Keyword::COLUMNS)?;
16705 self.expect_token(&Token::LParen)?;
16706 let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
16707 self.expect_token(&Token::RParen)?;
16708 self.expect_token(&Token::RParen)?;
16709 let alias = self.maybe_parse_table_alias()?;
16710 Ok(TableFactor::JsonTable {
16711 json_expr,
16712 json_path,
16713 columns,
16714 alias,
16715 })
16716 } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
16717 self.prev_token();
16718 self.parse_open_json_table_factor()
16719 } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
16720 self.prev_token();
16721 self.parse_xml_table_factor()
16722 } else if self.dialect.supports_semantic_view_table_factor()
16723 && self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
16724 {
16725 self.parse_semantic_view_table_factor()
16726 } else if self.peek_token_ref().token == Token::AtSign {
16727 self.parse_snowflake_stage_table_factor()
16729 } else {
16730 let name = self.parse_object_name(true)?;
16731
16732 let json_path = match &self.peek_token_ref().token {
16733 Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
16734 _ => None,
16735 };
16736
16737 let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
16738 && self.parse_keyword(Keyword::PARTITION)
16739 {
16740 self.parse_parenthesized_identifiers()?
16741 } else {
16742 vec![]
16743 };
16744
16745 let version = self.maybe_parse_table_version()?;
16747
16748 let args = if self.consume_token(&Token::LParen) {
16750 Some(self.parse_table_function_args()?)
16751 } else {
16752 None
16753 };
16754
16755 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
16756
16757 let mut sample = None;
16758 if self.dialect.supports_table_sample_before_alias() {
16759 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16760 sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
16761 }
16762 }
16763
16764 let alias = self.maybe_parse_table_alias()?;
16765
16766 let index_hints = if self.dialect.supports_table_hints() {
16768 self.maybe_parse(|p| p.parse_table_index_hints())?
16769 .unwrap_or(vec![])
16770 } else {
16771 vec![]
16772 };
16773
16774 let mut with_hints = vec![];
16776 if self.parse_keyword(Keyword::WITH) {
16777 if self.consume_token(&Token::LParen) {
16778 with_hints = self.parse_comma_separated(Parser::parse_expr)?;
16779 self.expect_token(&Token::RParen)?;
16780 } else {
16781 self.prev_token();
16783 }
16784 };
16785
16786 if !self.dialect.supports_table_sample_before_alias() {
16787 if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
16788 sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
16789 }
16790 }
16791
16792 let mut table = TableFactor::Table {
16793 name,
16794 alias,
16795 args,
16796 with_hints,
16797 version,
16798 partitions,
16799 with_ordinality,
16800 json_path,
16801 sample,
16802 index_hints,
16803 };
16804
16805 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
16806 table = match kw {
16807 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
16808 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
16809 unexpected_keyword => return Err(ParserError::ParserError(
16810 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in pivot/unpivot"),
16811 )),
16812 }
16813 }
16814
16815 if self.dialect.supports_match_recognize()
16816 && self.parse_keyword(Keyword::MATCH_RECOGNIZE)
16817 {
16818 table = self.parse_match_recognize(table)?;
16819 }
16820
16821 Ok(table)
16822 }
16823 }
16824
16825 fn parse_snowflake_stage_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16830 let name = crate::dialect::parse_snowflake_stage_name(self)?;
16832
16833 let args = if self.consume_token(&Token::LParen) {
16835 Some(self.parse_table_function_args()?)
16836 } else {
16837 None
16838 };
16839
16840 let alias = self.maybe_parse_table_alias()?;
16841
16842 Ok(TableFactor::Table {
16843 name,
16844 alias,
16845 args,
16846 with_hints: vec![],
16847 version: None,
16848 partitions: vec![],
16849 with_ordinality: false,
16850 json_path: None,
16851 sample: None,
16852 index_hints: vec![],
16853 })
16854 }
16855
16856 fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
16857 let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
16858 TableSampleModifier::TableSample
16859 } else if self.parse_keyword(Keyword::SAMPLE) {
16860 TableSampleModifier::Sample
16861 } else {
16862 return Ok(None);
16863 };
16864 self.parse_table_sample(modifier).map(Some)
16865 }
16866
16867 fn parse_table_sample(
16868 &mut self,
16869 modifier: TableSampleModifier,
16870 ) -> Result<Box<TableSample>, ParserError> {
16871 let name = match self.parse_one_of_keywords(&[
16872 Keyword::BERNOULLI,
16873 Keyword::ROW,
16874 Keyword::SYSTEM,
16875 Keyword::BLOCK,
16876 ]) {
16877 Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
16878 Some(Keyword::ROW) => Some(TableSampleMethod::Row),
16879 Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
16880 Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
16881 _ => None,
16882 };
16883
16884 let parenthesized = self.consume_token(&Token::LParen);
16885
16886 let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
16887 let selected_bucket = self.parse_number_value()?;
16888 self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
16889 let total = self.parse_number_value()?;
16890 let on = if self.parse_keyword(Keyword::ON) {
16891 Some(self.parse_expr()?)
16892 } else {
16893 None
16894 };
16895 (
16896 None,
16897 Some(TableSampleBucket {
16898 bucket: selected_bucket,
16899 total,
16900 on,
16901 }),
16902 )
16903 } else {
16904 let value = match self.maybe_parse(|p| p.parse_expr())? {
16905 Some(num) => num,
16906 None => {
16907 let next_token = self.next_token();
16908 if let Token::Word(w) = next_token.token {
16909 Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
16910 } else {
16911 return parser_err!(
16912 "Expecting number or byte length e.g. 100M",
16913 self.peek_token_ref().span.start
16914 );
16915 }
16916 }
16917 };
16918 let unit = if self.parse_keyword(Keyword::ROWS) {
16919 Some(TableSampleUnit::Rows)
16920 } else if self.parse_keyword(Keyword::PERCENT) {
16921 Some(TableSampleUnit::Percent)
16922 } else {
16923 None
16924 };
16925 (
16926 Some(TableSampleQuantity {
16927 parenthesized,
16928 value,
16929 unit,
16930 }),
16931 None,
16932 )
16933 };
16934 if parenthesized {
16935 self.expect_token(&Token::RParen)?;
16936 }
16937
16938 let seed = if self.parse_keyword(Keyword::REPEATABLE) {
16939 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
16940 } else if self.parse_keyword(Keyword::SEED) {
16941 Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
16942 } else {
16943 None
16944 };
16945
16946 let offset = if self.parse_keyword(Keyword::OFFSET) {
16947 Some(self.parse_expr()?)
16948 } else {
16949 None
16950 };
16951
16952 Ok(Box::new(TableSample {
16953 modifier,
16954 name,
16955 quantity,
16956 seed,
16957 bucket,
16958 offset,
16959 }))
16960 }
16961
16962 fn parse_table_sample_seed(
16963 &mut self,
16964 modifier: TableSampleSeedModifier,
16965 ) -> Result<TableSampleSeed, ParserError> {
16966 self.expect_token(&Token::LParen)?;
16967 let value = self.parse_number_value()?;
16968 self.expect_token(&Token::RParen)?;
16969 Ok(TableSampleSeed { modifier, value })
16970 }
16971
16972 fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
16975 self.expect_token(&Token::LParen)?;
16976 let json_expr = self.parse_expr()?;
16977 let json_path = if self.consume_token(&Token::Comma) {
16978 Some(self.parse_value()?)
16979 } else {
16980 None
16981 };
16982 self.expect_token(&Token::RParen)?;
16983 let columns = if self.parse_keyword(Keyword::WITH) {
16984 self.expect_token(&Token::LParen)?;
16985 let columns = self.parse_comma_separated(Parser::parse_openjson_table_column_def)?;
16986 self.expect_token(&Token::RParen)?;
16987 columns
16988 } else {
16989 Vec::new()
16990 };
16991 let alias = self.maybe_parse_table_alias()?;
16992 Ok(TableFactor::OpenJsonTable {
16993 json_expr,
16994 json_path,
16995 columns,
16996 alias,
16997 })
16998 }
16999
17000 fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17001 self.expect_token(&Token::LParen)?;
17002 let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
17003 self.expect_token(&Token::LParen)?;
17004 let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
17005 self.expect_token(&Token::RParen)?;
17006 self.expect_token(&Token::Comma)?;
17007 namespaces
17008 } else {
17009 vec![]
17010 };
17011 let row_expression = self.parse_expr()?;
17012 let passing = self.parse_xml_passing_clause()?;
17013 self.expect_keyword_is(Keyword::COLUMNS)?;
17014 let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
17015 self.expect_token(&Token::RParen)?;
17016 let alias = self.maybe_parse_table_alias()?;
17017 Ok(TableFactor::XmlTable {
17018 namespaces,
17019 row_expression,
17020 passing,
17021 columns,
17022 alias,
17023 })
17024 }
17025
17026 fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
17027 let uri = self.parse_expr()?;
17028 self.expect_keyword_is(Keyword::AS)?;
17029 let name = self.parse_identifier()?;
17030 Ok(XmlNamespaceDefinition { uri, name })
17031 }
17032
17033 fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
17034 let name = self.parse_identifier()?;
17035
17036 let option = if self.parse_keyword(Keyword::FOR) {
17037 self.expect_keyword(Keyword::ORDINALITY)?;
17038 XmlTableColumnOption::ForOrdinality
17039 } else {
17040 let r#type = self.parse_data_type()?;
17041 let mut path = None;
17042 let mut default = None;
17043
17044 if self.parse_keyword(Keyword::PATH) {
17045 path = Some(self.parse_expr()?);
17046 }
17047
17048 if self.parse_keyword(Keyword::DEFAULT) {
17049 default = Some(self.parse_expr()?);
17050 }
17051
17052 let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
17053 if !not_null {
17054 let _ = self.parse_keyword(Keyword::NULL);
17056 }
17057
17058 XmlTableColumnOption::NamedInfo {
17059 r#type,
17060 path,
17061 default,
17062 nullable: !not_null,
17063 }
17064 };
17065 Ok(XmlTableColumn { name, option })
17066 }
17067
17068 fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
17069 let mut arguments = vec![];
17070 if self.parse_keyword(Keyword::PASSING) {
17071 loop {
17072 let by_value =
17073 self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
17074 let expr = self.parse_expr()?;
17075 let alias = if self.parse_keyword(Keyword::AS) {
17076 Some(self.parse_identifier()?)
17077 } else {
17078 None
17079 };
17080 arguments.push(XmlPassingArgument {
17081 expr,
17082 alias,
17083 by_value,
17084 });
17085 if !self.consume_token(&Token::Comma) {
17086 break;
17087 }
17088 }
17089 }
17090 Ok(XmlPassingClause { arguments })
17091 }
17092
17093 fn parse_semantic_view_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17095 self.expect_keyword(Keyword::SEMANTIC_VIEW)?;
17096 self.expect_token(&Token::LParen)?;
17097
17098 let name = self.parse_object_name(true)?;
17099
17100 let mut dimensions = Vec::new();
17102 let mut metrics = Vec::new();
17103 let mut facts = Vec::new();
17104 let mut where_clause = None;
17105
17106 while self.peek_token_ref().token != Token::RParen {
17107 if self.parse_keyword(Keyword::DIMENSIONS) {
17108 if !dimensions.is_empty() {
17109 return Err(ParserError::ParserError(
17110 "DIMENSIONS clause can only be specified once".to_string(),
17111 ));
17112 }
17113 dimensions = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17114 } else if self.parse_keyword(Keyword::METRICS) {
17115 if !metrics.is_empty() {
17116 return Err(ParserError::ParserError(
17117 "METRICS clause can only be specified once".to_string(),
17118 ));
17119 }
17120 metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17121 } else if self.parse_keyword(Keyword::FACTS) {
17122 if !facts.is_empty() {
17123 return Err(ParserError::ParserError(
17124 "FACTS clause can only be specified once".to_string(),
17125 ));
17126 }
17127 facts = self.parse_comma_separated(Parser::parse_wildcard_expr)?;
17128 } else if self.parse_keyword(Keyword::WHERE) {
17129 if where_clause.is_some() {
17130 return Err(ParserError::ParserError(
17131 "WHERE clause can only be specified once".to_string(),
17132 ));
17133 }
17134 where_clause = Some(self.parse_expr()?);
17135 } else {
17136 let tok = self.peek_token_ref();
17137 parser_err!(
17138 format!(
17139 "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}",
17140 tok.token
17141 ),
17142 tok.span.start
17143 )?;
17144 }
17145 }
17146
17147 self.expect_token(&Token::RParen)?;
17148
17149 let alias = self.maybe_parse_table_alias()?;
17150
17151 Ok(TableFactor::SemanticView {
17152 name,
17153 dimensions,
17154 metrics,
17155 facts,
17156 where_clause,
17157 alias,
17158 })
17159 }
17160
17161 fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
17162 self.expect_token(&Token::LParen)?;
17163
17164 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
17165 self.parse_comma_separated(Parser::parse_expr)?
17166 } else {
17167 vec![]
17168 };
17169
17170 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17171 self.parse_comma_separated(Parser::parse_order_by_expr)?
17172 } else {
17173 vec![]
17174 };
17175
17176 let measures = if self.parse_keyword(Keyword::MEASURES) {
17177 self.parse_comma_separated(|p| {
17178 let expr = p.parse_expr()?;
17179 let _ = p.parse_keyword(Keyword::AS);
17180 let alias = p.parse_identifier()?;
17181 Ok(Measure { expr, alias })
17182 })?
17183 } else {
17184 vec![]
17185 };
17186
17187 let rows_per_match =
17188 if self.parse_keywords(&[Keyword::ONE, Keyword::ROW, Keyword::PER, Keyword::MATCH]) {
17189 Some(RowsPerMatch::OneRow)
17190 } else if self.parse_keywords(&[
17191 Keyword::ALL,
17192 Keyword::ROWS,
17193 Keyword::PER,
17194 Keyword::MATCH,
17195 ]) {
17196 Some(RowsPerMatch::AllRows(
17197 if self.parse_keywords(&[Keyword::SHOW, Keyword::EMPTY, Keyword::MATCHES]) {
17198 Some(EmptyMatchesMode::Show)
17199 } else if self.parse_keywords(&[
17200 Keyword::OMIT,
17201 Keyword::EMPTY,
17202 Keyword::MATCHES,
17203 ]) {
17204 Some(EmptyMatchesMode::Omit)
17205 } else if self.parse_keywords(&[
17206 Keyword::WITH,
17207 Keyword::UNMATCHED,
17208 Keyword::ROWS,
17209 ]) {
17210 Some(EmptyMatchesMode::WithUnmatched)
17211 } else {
17212 None
17213 },
17214 ))
17215 } else {
17216 None
17217 };
17218
17219 let after_match_skip =
17220 if self.parse_keywords(&[Keyword::AFTER, Keyword::MATCH, Keyword::SKIP]) {
17221 if self.parse_keywords(&[Keyword::PAST, Keyword::LAST, Keyword::ROW]) {
17222 Some(AfterMatchSkip::PastLastRow)
17223 } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
17224 Some(AfterMatchSkip::ToNextRow)
17225 } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
17226 Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
17227 } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
17228 Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
17229 } else {
17230 let found = self.next_token();
17231 return self.expected("after match skip option", found);
17232 }
17233 } else {
17234 None
17235 };
17236
17237 self.expect_keyword_is(Keyword::PATTERN)?;
17238 let pattern = self.parse_parenthesized(Self::parse_pattern)?;
17239
17240 self.expect_keyword_is(Keyword::DEFINE)?;
17241
17242 let symbols = self.parse_comma_separated(|p| {
17243 let symbol = p.parse_identifier()?;
17244 p.expect_keyword_is(Keyword::AS)?;
17245 let definition = p.parse_expr()?;
17246 Ok(SymbolDefinition { symbol, definition })
17247 })?;
17248
17249 self.expect_token(&Token::RParen)?;
17250
17251 let alias = self.maybe_parse_table_alias()?;
17252
17253 Ok(TableFactor::MatchRecognize {
17254 table: Box::new(table),
17255 partition_by,
17256 order_by,
17257 measures,
17258 rows_per_match,
17259 after_match_skip,
17260 pattern,
17261 symbols,
17262 alias,
17263 })
17264 }
17265
17266 fn parse_base_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17267 match self.next_token().token {
17268 Token::Caret => Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::Start)),
17269 Token::Placeholder(s) if s == "$" => {
17270 Ok(MatchRecognizePattern::Symbol(MatchRecognizeSymbol::End))
17271 }
17272 Token::LBrace => {
17273 self.expect_token(&Token::Minus)?;
17274 let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
17275 self.expect_token(&Token::Minus)?;
17276 self.expect_token(&Token::RBrace)?;
17277 Ok(MatchRecognizePattern::Exclude(symbol))
17278 }
17279 Token::Word(Word {
17280 value,
17281 quote_style: None,
17282 ..
17283 }) if value == "PERMUTE" => {
17284 self.expect_token(&Token::LParen)?;
17285 let symbols = self.parse_comma_separated(|p| {
17286 p.parse_identifier().map(MatchRecognizeSymbol::Named)
17287 })?;
17288 self.expect_token(&Token::RParen)?;
17289 Ok(MatchRecognizePattern::Permute(symbols))
17290 }
17291 Token::LParen => {
17292 let pattern = self.parse_pattern()?;
17293 self.expect_token(&Token::RParen)?;
17294 Ok(MatchRecognizePattern::Group(Box::new(pattern)))
17295 }
17296 _ => {
17297 self.prev_token();
17298 self.parse_identifier()
17299 .map(MatchRecognizeSymbol::Named)
17300 .map(MatchRecognizePattern::Symbol)
17301 }
17302 }
17303 }
17304
17305 fn parse_repetition_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17306 let mut pattern = self.parse_base_pattern()?;
17307 loop {
17308 let token = self.next_token();
17309 let quantifier = match token.token {
17310 Token::Mul => RepetitionQuantifier::ZeroOrMore,
17311 Token::Plus => RepetitionQuantifier::OneOrMore,
17312 Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne,
17313 Token::LBrace => {
17314 let token = self.next_token();
17316 match token.token {
17317 Token::Comma => {
17318 let next_token = self.next_token();
17319 let Token::Number(n, _) = next_token.token else {
17320 return self.expected("literal number", next_token);
17321 };
17322 self.expect_token(&Token::RBrace)?;
17323 RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
17324 }
17325 Token::Number(n, _) if self.consume_token(&Token::Comma) => {
17326 let next_token = self.next_token();
17327 match next_token.token {
17328 Token::Number(m, _) => {
17329 self.expect_token(&Token::RBrace)?;
17330 RepetitionQuantifier::Range(
17331 Self::parse(n, token.span.start)?,
17332 Self::parse(m, token.span.start)?,
17333 )
17334 }
17335 Token::RBrace => {
17336 RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
17337 }
17338 _ => {
17339 return self.expected("} or upper bound", next_token);
17340 }
17341 }
17342 }
17343 Token::Number(n, _) => {
17344 self.expect_token(&Token::RBrace)?;
17345 RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
17346 }
17347 _ => return self.expected("quantifier range", token),
17348 }
17349 }
17350 _ => {
17351 self.prev_token();
17352 break;
17353 }
17354 };
17355 pattern = MatchRecognizePattern::Repetition(Box::new(pattern), quantifier);
17356 }
17357 Ok(pattern)
17358 }
17359
17360 fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17361 let mut patterns = vec![self.parse_repetition_pattern()?];
17362 while !matches!(self.peek_token_ref().token, Token::RParen | Token::Pipe) {
17363 patterns.push(self.parse_repetition_pattern()?);
17364 }
17365 match <[MatchRecognizePattern; 1]>::try_from(patterns) {
17366 Ok([pattern]) => Ok(pattern),
17367 Err(patterns) => Ok(MatchRecognizePattern::Concat(patterns)),
17368 }
17369 }
17370
17371 fn parse_pattern(&mut self) -> Result<MatchRecognizePattern, ParserError> {
17372 let pattern = self.parse_concat_pattern()?;
17373 if self.consume_token(&Token::Pipe) {
17374 match self.parse_pattern()? {
17375 MatchRecognizePattern::Alternation(mut patterns) => {
17377 patterns.insert(0, pattern);
17378 Ok(MatchRecognizePattern::Alternation(patterns))
17379 }
17380 next => Ok(MatchRecognizePattern::Alternation(vec![pattern, next])),
17381 }
17382 } else {
17383 Ok(pattern)
17384 }
17385 }
17386
17387 pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
17389 if self.dialect.supports_table_versioning() {
17390 if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
17391 {
17392 let expr = self.parse_expr()?;
17393 return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
17394 } else if self.peek_keyword(Keyword::CHANGES) {
17395 return self.parse_table_version_changes().map(Some);
17396 } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
17397 let func_name = self.parse_object_name(true)?;
17398 let func = self.parse_function(func_name)?;
17399 return Ok(Some(TableVersion::Function(func)));
17400 } else if self.parse_keywords(&[Keyword::TIMESTAMP, Keyword::AS, Keyword::OF]) {
17401 let expr = self.parse_expr()?;
17402 return Ok(Some(TableVersion::TimestampAsOf(expr)));
17403 } else if self.parse_keywords(&[Keyword::VERSION, Keyword::AS, Keyword::OF]) {
17404 let expr = Expr::Value(self.parse_number_value()?);
17405 return Ok(Some(TableVersion::VersionAsOf(expr)));
17406 }
17407 }
17408 Ok(None)
17409 }
17410
17411 fn parse_table_version_changes(&mut self) -> Result<TableVersion, ParserError> {
17422 let changes_name = self.parse_object_name(true)?;
17423 let changes = self.parse_function(changes_name)?;
17424 let at_name = self.parse_object_name(true)?;
17425 let at = self.parse_function(at_name)?;
17426 let end = if self.peek_keyword(Keyword::END) {
17427 let end_name = self.parse_object_name(true)?;
17428 Some(self.parse_function(end_name)?)
17429 } else {
17430 None
17431 };
17432 Ok(TableVersion::Changes { changes, at, end })
17433 }
17434
17435 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
17438 if self.parse_keyword(Keyword::NESTED) {
17439 let _has_path_keyword = self.parse_keyword(Keyword::PATH);
17440 let path = self.parse_value()?;
17441 self.expect_keyword_is(Keyword::COLUMNS)?;
17442 let columns = self.parse_parenthesized(|p| {
17443 p.parse_comma_separated(Self::parse_json_table_column_def)
17444 })?;
17445 return Ok(JsonTableColumn::Nested(JsonTableNestedColumn {
17446 path,
17447 columns,
17448 }));
17449 }
17450 let name = self.parse_identifier()?;
17451 if self.parse_keyword(Keyword::FOR) {
17452 self.expect_keyword_is(Keyword::ORDINALITY)?;
17453 return Ok(JsonTableColumn::ForOrdinality(name));
17454 }
17455 let r#type = self.parse_data_type()?;
17456 let exists = self.parse_keyword(Keyword::EXISTS);
17457 self.expect_keyword_is(Keyword::PATH)?;
17458 let path = self.parse_value()?;
17459 let mut on_empty = None;
17460 let mut on_error = None;
17461 while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
17462 if self.parse_keyword(Keyword::EMPTY) {
17463 on_empty = Some(error_handling);
17464 } else {
17465 self.expect_keyword_is(Keyword::ERROR)?;
17466 on_error = Some(error_handling);
17467 }
17468 }
17469 Ok(JsonTableColumn::Named(JsonTableNamedColumn {
17470 name,
17471 r#type,
17472 path,
17473 exists,
17474 on_empty,
17475 on_error,
17476 }))
17477 }
17478
17479 pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
17487 let name = self.parse_identifier()?;
17488 let r#type = self.parse_data_type()?;
17489 let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
17490 self.next_token();
17491 Some(path)
17492 } else {
17493 None
17494 };
17495 let as_json = self.parse_keyword(Keyword::AS);
17496 if as_json {
17497 self.expect_keyword_is(Keyword::JSON)?;
17498 }
17499 Ok(OpenJsonTableColumn {
17500 name,
17501 r#type,
17502 path,
17503 as_json,
17504 })
17505 }
17506
17507 fn parse_json_table_column_error_handling(
17508 &mut self,
17509 ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
17510 let res = if self.parse_keyword(Keyword::NULL) {
17511 JsonTableColumnErrorHandling::Null
17512 } else if self.parse_keyword(Keyword::ERROR) {
17513 JsonTableColumnErrorHandling::Error
17514 } else if self.parse_keyword(Keyword::DEFAULT) {
17515 JsonTableColumnErrorHandling::Default(self.parse_value()?)
17516 } else {
17517 return Ok(None);
17518 };
17519 self.expect_keyword_is(Keyword::ON)?;
17520 Ok(Some(res))
17521 }
17522
17523 pub fn parse_derived_table_factor(
17525 &mut self,
17526 lateral: IsLateral,
17527 ) -> Result<TableFactor, ParserError> {
17528 let subquery = self.parse_query()?;
17529 self.expect_token(&Token::RParen)?;
17530 let alias = self.maybe_parse_table_alias()?;
17531
17532 let sample = self
17534 .maybe_parse_table_sample()?
17535 .map(TableSampleKind::AfterTableAlias);
17536
17537 Ok(TableFactor::Derived {
17538 lateral: match lateral {
17539 Lateral => true,
17540 NotLateral => false,
17541 },
17542 subquery,
17543 alias,
17544 sample,
17545 })
17546 }
17547
17548 pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
17571 let expr = self.parse_expr()?;
17572 let alias = if self.parse_keyword(Keyword::AS) {
17573 Some(self.parse_identifier()?)
17574 } else {
17575 None
17576 };
17577
17578 Ok(ExprWithAlias { expr, alias })
17579 }
17580
17581 fn parse_expr_with_alias_optional_as_keyword(&mut self) -> Result<ExprWithAlias, ParserError> {
17585 let expr = self.parse_expr()?;
17586 let alias = self.parse_identifier_optional_alias()?;
17587 Ok(ExprWithAlias { expr, alias })
17588 }
17589
17590 fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, ParserError> {
17592 let function_name = match self.next_token().token {
17593 Token::Word(w) => Ok(w.value),
17594 _ => self.expected_ref("a function identifier", self.peek_token_ref()),
17595 }?;
17596 let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
17597 let alias = {
17598 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
17599 kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
17601 }
17602 self.parse_optional_alias_inner(None, validator)?
17603 };
17604 Ok(ExprWithAlias { expr, alias })
17605 }
17606
17607 pub fn parse_pivot_table_factor(
17609 &mut self,
17610 table: TableFactor,
17611 ) -> Result<TableFactor, ParserError> {
17612 self.expect_token(&Token::LParen)?;
17613 let aggregate_functions =
17614 self.parse_comma_separated(Self::parse_pivot_aggregate_function)?;
17615 self.expect_keyword_is(Keyword::FOR)?;
17616 let value_column = if self.peek_token_ref().token == Token::LParen {
17617 self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17618 p.parse_subexpr(self.dialect.prec_value(Precedence::Between))
17619 })?
17620 } else {
17621 vec![self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?]
17622 };
17623 self.expect_keyword_is(Keyword::IN)?;
17624
17625 self.expect_token(&Token::LParen)?;
17626 let value_source = if self.parse_keyword(Keyword::ANY) {
17627 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
17628 self.parse_comma_separated(Parser::parse_order_by_expr)?
17629 } else {
17630 vec![]
17631 };
17632 PivotValueSource::Any(order_by)
17633 } else if self.peek_sub_query() {
17634 PivotValueSource::Subquery(self.parse_query()?)
17635 } else {
17636 PivotValueSource::List(
17637 self.parse_comma_separated(Self::parse_expr_with_alias_optional_as_keyword)?,
17638 )
17639 };
17640 self.expect_token(&Token::RParen)?;
17641
17642 let default_on_null =
17643 if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
17644 self.expect_token(&Token::LParen)?;
17645 let expr = self.parse_expr()?;
17646 self.expect_token(&Token::RParen)?;
17647 Some(expr)
17648 } else {
17649 None
17650 };
17651
17652 self.expect_token(&Token::RParen)?;
17653 let alias = self.maybe_parse_table_alias()?;
17654 Ok(TableFactor::Pivot {
17655 table: Box::new(table),
17656 aggregate_functions,
17657 value_column,
17658 value_source,
17659 default_on_null,
17660 alias,
17661 })
17662 }
17663
17664 pub fn parse_unpivot_table_factor(
17666 &mut self,
17667 table: TableFactor,
17668 ) -> Result<TableFactor, ParserError> {
17669 let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
17670 self.expect_keyword_is(Keyword::NULLS)?;
17671 Some(NullInclusion::IncludeNulls)
17672 } else if self.parse_keyword(Keyword::EXCLUDE) {
17673 self.expect_keyword_is(Keyword::NULLS)?;
17674 Some(NullInclusion::ExcludeNulls)
17675 } else {
17676 None
17677 };
17678 self.expect_token(&Token::LParen)?;
17679 let value = self.parse_expr()?;
17680 self.expect_keyword_is(Keyword::FOR)?;
17681 let name = self.parse_identifier()?;
17682 self.expect_keyword_is(Keyword::IN)?;
17683 let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
17684 p.parse_expr_with_alias()
17685 })?;
17686 self.expect_token(&Token::RParen)?;
17687 let alias = self.maybe_parse_table_alias()?;
17688 Ok(TableFactor::Unpivot {
17689 table: Box::new(table),
17690 value,
17691 null_inclusion,
17692 name,
17693 columns,
17694 alias,
17695 })
17696 }
17697
17698 pub fn parse_unpivot_expr_table_factor(&mut self) -> Result<TableFactor, ParserError> {
17703 self.expect_keyword_is(Keyword::UNPIVOT)?;
17704 let expression = self.parse_expr()?;
17705 self.expect_keyword_is(Keyword::AS)?;
17706 let value_alias = self.parse_identifier()?;
17707 let attribute_alias = if self.parse_keyword(Keyword::AT) {
17708 Some(self.parse_identifier()?)
17709 } else {
17710 None
17711 };
17712
17713 Ok(TableFactor::UnpivotExpr {
17714 expression,
17715 value_alias,
17716 attribute_alias,
17717 })
17718 }
17719
17720 pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
17722 if natural {
17723 Ok(JoinConstraint::Natural)
17724 } else if self.parse_keyword(Keyword::ON) {
17725 let constraint = self.parse_expr()?;
17726 Ok(JoinConstraint::On(constraint))
17727 } else if self.parse_keyword(Keyword::USING) {
17728 let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
17729 Ok(JoinConstraint::Using(columns))
17730 } else {
17731 Ok(JoinConstraint::None)
17732 }
17734 }
17735
17736 pub fn parse_grant(&mut self) -> Result<Grant, ParserError> {
17738 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
17739
17740 self.expect_keyword_is(Keyword::TO)?;
17741 let grantees = self.parse_grantees()?;
17742
17743 let with_grant_option =
17744 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
17745
17746 let current_grants =
17747 if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
17748 Some(CurrentGrantsKind::CopyCurrentGrants)
17749 } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
17750 Some(CurrentGrantsKind::RevokeCurrentGrants)
17751 } else {
17752 None
17753 };
17754
17755 let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
17756 Some(self.parse_identifier()?)
17757 } else {
17758 None
17759 };
17760
17761 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
17762 Some(self.parse_identifier()?)
17763 } else {
17764 None
17765 };
17766
17767 Ok(Grant {
17768 privileges,
17769 objects,
17770 grantees,
17771 with_grant_option,
17772 as_grantor,
17773 granted_by,
17774 current_grants,
17775 })
17776 }
17777
17778 fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
17779 let mut values = vec![];
17780 let mut grantee_type = GranteesType::None;
17781 loop {
17782 let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
17783 GranteesType::Role
17784 } else if self.parse_keyword(Keyword::USER) {
17785 GranteesType::User
17786 } else if self.parse_keyword(Keyword::SHARE) {
17787 GranteesType::Share
17788 } else if self.parse_keyword(Keyword::GROUP) {
17789 GranteesType::Group
17790 } else if self.parse_keyword(Keyword::PUBLIC) {
17791 GranteesType::Public
17792 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
17793 GranteesType::DatabaseRole
17794 } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
17795 GranteesType::ApplicationRole
17796 } else if self.parse_keyword(Keyword::APPLICATION) {
17797 GranteesType::Application
17798 } else {
17799 grantee_type.clone() };
17801
17802 if self
17803 .dialect
17804 .get_reserved_grantees_types()
17805 .contains(&new_grantee_type)
17806 {
17807 self.prev_token();
17808 } else {
17809 grantee_type = new_grantee_type;
17810 }
17811
17812 let grantee = if grantee_type == GranteesType::Public {
17813 Grantee {
17814 grantee_type: grantee_type.clone(),
17815 name: None,
17816 }
17817 } else {
17818 let mut name = self.parse_grantee_name()?;
17819 if self.consume_token(&Token::Colon) {
17820 let ident = self.parse_identifier()?;
17824 if let GranteeName::ObjectName(namespace) = name {
17825 name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
17826 format!("{namespace}:{ident}"),
17827 )]));
17828 };
17829 }
17830 Grantee {
17831 grantee_type: grantee_type.clone(),
17832 name: Some(name),
17833 }
17834 };
17835
17836 values.push(grantee);
17837
17838 if !self.consume_token(&Token::Comma) {
17839 break;
17840 }
17841 }
17842
17843 Ok(values)
17844 }
17845
17846 pub fn parse_grant_deny_revoke_privileges_objects(
17848 &mut self,
17849 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
17850 let privileges = if self.parse_keyword(Keyword::ALL) {
17851 Privileges::All {
17852 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
17853 }
17854 } else {
17855 let actions = self.parse_actions_list()?;
17856 Privileges::Actions(actions)
17857 };
17858
17859 let objects = if self.parse_keyword(Keyword::ON) {
17860 if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
17861 Some(GrantObjects::AllTablesInSchema {
17862 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17863 })
17864 } else if self.parse_keywords(&[
17865 Keyword::ALL,
17866 Keyword::EXTERNAL,
17867 Keyword::TABLES,
17868 Keyword::IN,
17869 Keyword::SCHEMA,
17870 ]) {
17871 Some(GrantObjects::AllExternalTablesInSchema {
17872 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17873 })
17874 } else if self.parse_keywords(&[
17875 Keyword::ALL,
17876 Keyword::VIEWS,
17877 Keyword::IN,
17878 Keyword::SCHEMA,
17879 ]) {
17880 Some(GrantObjects::AllViewsInSchema {
17881 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17882 })
17883 } else if self.parse_keywords(&[
17884 Keyword::ALL,
17885 Keyword::MATERIALIZED,
17886 Keyword::VIEWS,
17887 Keyword::IN,
17888 Keyword::SCHEMA,
17889 ]) {
17890 Some(GrantObjects::AllMaterializedViewsInSchema {
17891 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17892 })
17893 } else if self.parse_keywords(&[
17894 Keyword::ALL,
17895 Keyword::FUNCTIONS,
17896 Keyword::IN,
17897 Keyword::SCHEMA,
17898 ]) {
17899 Some(GrantObjects::AllFunctionsInSchema {
17900 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17901 })
17902 } else if self.parse_keywords(&[
17903 Keyword::FUTURE,
17904 Keyword::SCHEMAS,
17905 Keyword::IN,
17906 Keyword::DATABASE,
17907 ]) {
17908 Some(GrantObjects::FutureSchemasInDatabase {
17909 databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17910 })
17911 } else if self.parse_keywords(&[
17912 Keyword::FUTURE,
17913 Keyword::TABLES,
17914 Keyword::IN,
17915 Keyword::SCHEMA,
17916 ]) {
17917 Some(GrantObjects::FutureTablesInSchema {
17918 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17919 })
17920 } else if self.parse_keywords(&[
17921 Keyword::FUTURE,
17922 Keyword::EXTERNAL,
17923 Keyword::TABLES,
17924 Keyword::IN,
17925 Keyword::SCHEMA,
17926 ]) {
17927 Some(GrantObjects::FutureExternalTablesInSchema {
17928 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17929 })
17930 } else if self.parse_keywords(&[
17931 Keyword::FUTURE,
17932 Keyword::VIEWS,
17933 Keyword::IN,
17934 Keyword::SCHEMA,
17935 ]) {
17936 Some(GrantObjects::FutureViewsInSchema {
17937 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17938 })
17939 } else if self.parse_keywords(&[
17940 Keyword::FUTURE,
17941 Keyword::MATERIALIZED,
17942 Keyword::VIEWS,
17943 Keyword::IN,
17944 Keyword::SCHEMA,
17945 ]) {
17946 Some(GrantObjects::FutureMaterializedViewsInSchema {
17947 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17948 })
17949 } else if self.parse_keywords(&[
17950 Keyword::ALL,
17951 Keyword::SEQUENCES,
17952 Keyword::IN,
17953 Keyword::SCHEMA,
17954 ]) {
17955 Some(GrantObjects::AllSequencesInSchema {
17956 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17957 })
17958 } else if self.parse_keywords(&[
17959 Keyword::FUTURE,
17960 Keyword::SEQUENCES,
17961 Keyword::IN,
17962 Keyword::SCHEMA,
17963 ]) {
17964 Some(GrantObjects::FutureSequencesInSchema {
17965 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
17966 })
17967 } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
17968 Some(GrantObjects::ResourceMonitors(
17969 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17970 ))
17971 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
17972 Some(GrantObjects::ComputePools(
17973 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17974 ))
17975 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
17976 Some(GrantObjects::FailoverGroup(
17977 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17978 ))
17979 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
17980 Some(GrantObjects::ReplicationGroup(
17981 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17982 ))
17983 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
17984 Some(GrantObjects::ExternalVolumes(
17985 self.parse_comma_separated(|p| p.parse_object_name(false))?,
17986 ))
17987 } else {
17988 let object_type = self.parse_one_of_keywords(&[
17989 Keyword::SEQUENCE,
17990 Keyword::DATABASE,
17991 Keyword::SCHEMA,
17992 Keyword::TABLE,
17993 Keyword::VIEW,
17994 Keyword::WAREHOUSE,
17995 Keyword::INTEGRATION,
17996 Keyword::VIEW,
17997 Keyword::WAREHOUSE,
17998 Keyword::INTEGRATION,
17999 Keyword::USER,
18000 Keyword::CONNECTION,
18001 Keyword::PROCEDURE,
18002 Keyword::FUNCTION,
18003 ]);
18004 let objects =
18005 self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
18006 match object_type {
18007 Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
18008 Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
18009 Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
18010 Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
18011 Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
18012 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
18013 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
18014 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
18015 kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
18016 if let Some(name) = objects?.first() {
18017 self.parse_grant_procedure_or_function(name, &kw)?
18018 } else {
18019 self.expected_ref("procedure or function name", self.peek_token_ref())?
18020 }
18021 }
18022 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
18023 Some(unexpected_keyword) => return Err(ParserError::ParserError(
18024 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in grant objects"),
18025 )),
18026 }
18027 }
18028 } else {
18029 None
18030 };
18031
18032 Ok((privileges, objects))
18033 }
18034
18035 fn parse_grant_procedure_or_function(
18036 &mut self,
18037 name: &ObjectName,
18038 kw: &Option<Keyword>,
18039 ) -> Result<Option<GrantObjects>, ParserError> {
18040 let arg_types = if self.consume_token(&Token::LParen) {
18041 let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
18042 self.expect_token(&Token::RParen)?;
18043 list
18044 } else {
18045 vec![]
18046 };
18047 match kw {
18048 Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
18049 name: name.clone(),
18050 arg_types,
18051 })),
18052 Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
18053 name: name.clone(),
18054 arg_types,
18055 })),
18056 _ => self.expected_ref("procedure or function keywords", self.peek_token_ref())?,
18057 }
18058 }
18059
18060 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
18062 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
18063 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
18064 if columns.is_empty() {
18065 Ok(None)
18066 } else {
18067 Ok(Some(columns))
18068 }
18069 }
18070
18071 if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
18073 Ok(Action::ImportedPrivileges)
18074 } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
18075 Ok(Action::AddSearchOptimization)
18076 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
18077 Ok(Action::AttachListing)
18078 } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
18079 Ok(Action::AttachPolicy)
18080 } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
18081 Ok(Action::BindServiceEndpoint)
18082 } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
18083 let role = self.parse_object_name(false)?;
18084 Ok(Action::DatabaseRole { role })
18085 } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
18086 Ok(Action::EvolveSchema)
18087 } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
18088 Ok(Action::ImportShare)
18089 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
18090 Ok(Action::ManageVersions)
18091 } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
18092 Ok(Action::ManageReleases)
18093 } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
18094 Ok(Action::OverrideShareRestrictions)
18095 } else if self.parse_keywords(&[
18096 Keyword::PURCHASE,
18097 Keyword::DATA,
18098 Keyword::EXCHANGE,
18099 Keyword::LISTING,
18100 ]) {
18101 Ok(Action::PurchaseDataExchangeListing)
18102 } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
18103 Ok(Action::ResolveAll)
18104 } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
18105 Ok(Action::ReadSession)
18106
18107 } else if self.parse_keyword(Keyword::APPLY) {
18109 let apply_type = self.parse_action_apply_type()?;
18110 Ok(Action::Apply { apply_type })
18111 } else if self.parse_keyword(Keyword::APPLYBUDGET) {
18112 Ok(Action::ApplyBudget)
18113 } else if self.parse_keyword(Keyword::AUDIT) {
18114 Ok(Action::Audit)
18115 } else if self.parse_keyword(Keyword::CONNECT) {
18116 Ok(Action::Connect)
18117 } else if self.parse_keyword(Keyword::CREATE) {
18118 let obj_type = self.maybe_parse_action_create_object_type();
18119 Ok(Action::Create { obj_type })
18120 } else if self.parse_keyword(Keyword::DELETE) {
18121 Ok(Action::Delete)
18122 } else if self.parse_keyword(Keyword::EXEC) {
18123 let obj_type = self.maybe_parse_action_execute_obj_type();
18124 Ok(Action::Exec { obj_type })
18125 } else if self.parse_keyword(Keyword::EXECUTE) {
18126 let obj_type = self.maybe_parse_action_execute_obj_type();
18127 Ok(Action::Execute { obj_type })
18128 } else if self.parse_keyword(Keyword::FAILOVER) {
18129 Ok(Action::Failover)
18130 } else if self.parse_keyword(Keyword::INSERT) {
18131 Ok(Action::Insert {
18132 columns: parse_columns(self)?,
18133 })
18134 } else if self.parse_keyword(Keyword::MANAGE) {
18135 let manage_type = self.parse_action_manage_type()?;
18136 Ok(Action::Manage { manage_type })
18137 } else if self.parse_keyword(Keyword::MODIFY) {
18138 let modify_type = self.parse_action_modify_type();
18139 Ok(Action::Modify { modify_type })
18140 } else if self.parse_keyword(Keyword::MONITOR) {
18141 let monitor_type = self.parse_action_monitor_type();
18142 Ok(Action::Monitor { monitor_type })
18143 } else if self.parse_keyword(Keyword::OPERATE) {
18144 Ok(Action::Operate)
18145 } else if self.parse_keyword(Keyword::REFERENCES) {
18146 Ok(Action::References {
18147 columns: parse_columns(self)?,
18148 })
18149 } else if self.parse_keyword(Keyword::READ) {
18150 Ok(Action::Read)
18151 } else if self.parse_keyword(Keyword::REPLICATE) {
18152 Ok(Action::Replicate)
18153 } else if self.parse_keyword(Keyword::ROLE) {
18154 let role = self.parse_object_name(false)?;
18155 Ok(Action::Role { role })
18156 } else if self.parse_keyword(Keyword::SELECT) {
18157 Ok(Action::Select {
18158 columns: parse_columns(self)?,
18159 })
18160 } else if self.parse_keyword(Keyword::TEMPORARY) {
18161 Ok(Action::Temporary)
18162 } else if self.parse_keyword(Keyword::TRIGGER) {
18163 Ok(Action::Trigger)
18164 } else if self.parse_keyword(Keyword::TRUNCATE) {
18165 Ok(Action::Truncate)
18166 } else if self.parse_keyword(Keyword::UPDATE) {
18167 Ok(Action::Update {
18168 columns: parse_columns(self)?,
18169 })
18170 } else if self.parse_keyword(Keyword::USAGE) {
18171 Ok(Action::Usage)
18172 } else if self.parse_keyword(Keyword::OWNERSHIP) {
18173 Ok(Action::Ownership)
18174 } else if self.parse_keyword(Keyword::DROP) {
18175 Ok(Action::Drop)
18176 } else {
18177 self.expected_ref("a privilege keyword", self.peek_token_ref())?
18178 }
18179 }
18180
18181 fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
18182 if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
18184 Some(ActionCreateObjectType::ApplicationPackage)
18185 } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
18186 Some(ActionCreateObjectType::ComputePool)
18187 } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
18188 Some(ActionCreateObjectType::DataExchangeListing)
18189 } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
18190 Some(ActionCreateObjectType::ExternalVolume)
18191 } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
18192 Some(ActionCreateObjectType::FailoverGroup)
18193 } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
18194 Some(ActionCreateObjectType::NetworkPolicy)
18195 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
18196 Some(ActionCreateObjectType::OrganiationListing)
18197 } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
18198 Some(ActionCreateObjectType::ReplicationGroup)
18199 }
18200 else if self.parse_keyword(Keyword::ACCOUNT) {
18202 Some(ActionCreateObjectType::Account)
18203 } else if self.parse_keyword(Keyword::APPLICATION) {
18204 Some(ActionCreateObjectType::Application)
18205 } else if self.parse_keyword(Keyword::DATABASE) {
18206 Some(ActionCreateObjectType::Database)
18207 } else if self.parse_keyword(Keyword::INTEGRATION) {
18208 Some(ActionCreateObjectType::Integration)
18209 } else if self.parse_keyword(Keyword::ROLE) {
18210 Some(ActionCreateObjectType::Role)
18211 } else if self.parse_keyword(Keyword::SCHEMA) {
18212 Some(ActionCreateObjectType::Schema)
18213 } else if self.parse_keyword(Keyword::SHARE) {
18214 Some(ActionCreateObjectType::Share)
18215 } else if self.parse_keyword(Keyword::USER) {
18216 Some(ActionCreateObjectType::User)
18217 } else if self.parse_keyword(Keyword::WAREHOUSE) {
18218 Some(ActionCreateObjectType::Warehouse)
18219 } else {
18220 None
18221 }
18222 }
18223
18224 fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
18225 if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
18226 Ok(ActionApplyType::AggregationPolicy)
18227 } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
18228 Ok(ActionApplyType::AuthenticationPolicy)
18229 } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
18230 Ok(ActionApplyType::JoinPolicy)
18231 } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
18232 Ok(ActionApplyType::MaskingPolicy)
18233 } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
18234 Ok(ActionApplyType::PackagesPolicy)
18235 } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
18236 Ok(ActionApplyType::PasswordPolicy)
18237 } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
18238 Ok(ActionApplyType::ProjectionPolicy)
18239 } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
18240 Ok(ActionApplyType::RowAccessPolicy)
18241 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
18242 Ok(ActionApplyType::SessionPolicy)
18243 } else if self.parse_keyword(Keyword::TAG) {
18244 Ok(ActionApplyType::Tag)
18245 } else {
18246 self.expected_ref("GRANT APPLY type", self.peek_token_ref())
18247 }
18248 }
18249
18250 fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
18251 if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
18252 Some(ActionExecuteObjectType::DataMetricFunction)
18253 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
18254 Some(ActionExecuteObjectType::ManagedAlert)
18255 } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
18256 Some(ActionExecuteObjectType::ManagedTask)
18257 } else if self.parse_keyword(Keyword::ALERT) {
18258 Some(ActionExecuteObjectType::Alert)
18259 } else if self.parse_keyword(Keyword::TASK) {
18260 Some(ActionExecuteObjectType::Task)
18261 } else {
18262 None
18263 }
18264 }
18265
18266 fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
18267 if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
18268 Ok(ActionManageType::AccountSupportCases)
18269 } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
18270 Ok(ActionManageType::EventSharing)
18271 } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
18272 Ok(ActionManageType::ListingAutoFulfillment)
18273 } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
18274 Ok(ActionManageType::OrganizationSupportCases)
18275 } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
18276 Ok(ActionManageType::UserSupportCases)
18277 } else if self.parse_keyword(Keyword::GRANTS) {
18278 Ok(ActionManageType::Grants)
18279 } else if self.parse_keyword(Keyword::WAREHOUSES) {
18280 Ok(ActionManageType::Warehouses)
18281 } else {
18282 self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
18283 }
18284 }
18285
18286 fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
18287 if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
18288 Some(ActionModifyType::LogLevel)
18289 } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
18290 Some(ActionModifyType::TraceLevel)
18291 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
18292 Some(ActionModifyType::SessionLogLevel)
18293 } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
18294 Some(ActionModifyType::SessionTraceLevel)
18295 } else {
18296 None
18297 }
18298 }
18299
18300 fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
18301 if self.parse_keyword(Keyword::EXECUTION) {
18302 Some(ActionMonitorType::Execution)
18303 } else if self.parse_keyword(Keyword::SECURITY) {
18304 Some(ActionMonitorType::Security)
18305 } else if self.parse_keyword(Keyword::USAGE) {
18306 Some(ActionMonitorType::Usage)
18307 } else {
18308 None
18309 }
18310 }
18311
18312 pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
18314 let mut name = self.parse_object_name(false)?;
18315 if self.dialect.supports_user_host_grantee()
18316 && name.0.len() == 1
18317 && name.0[0].as_ident().is_some()
18318 && self.consume_token(&Token::AtSign)
18319 {
18320 let user = name.0.pop().unwrap().as_ident().unwrap().clone();
18321 let host = self.parse_identifier()?;
18322 Ok(GranteeName::UserHost { user, host })
18323 } else {
18324 Ok(GranteeName::ObjectName(name))
18325 }
18326 }
18327
18328 pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
18330 self.expect_keyword(Keyword::DENY)?;
18331
18332 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18333 let objects = match objects {
18334 Some(o) => o,
18335 None => {
18336 return parser_err!(
18337 "DENY statements must specify an object",
18338 self.peek_token_ref().span.start
18339 )
18340 }
18341 };
18342
18343 self.expect_keyword_is(Keyword::TO)?;
18344 let grantees = self.parse_grantees()?;
18345 let cascade = self.parse_cascade_option();
18346 let granted_by = if self.parse_keywords(&[Keyword::AS]) {
18347 Some(self.parse_identifier()?)
18348 } else {
18349 None
18350 };
18351
18352 Ok(Statement::Deny(DenyStatement {
18353 privileges,
18354 objects,
18355 grantees,
18356 cascade,
18357 granted_by,
18358 }))
18359 }
18360
18361 pub fn parse_revoke(&mut self) -> Result<Revoke, ParserError> {
18363 let grant_option_for =
18364 self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
18365
18366 let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
18367
18368 self.expect_keyword_is(Keyword::FROM)?;
18369 let grantees = self.parse_grantees()?;
18370
18371 let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
18372 Some(self.parse_identifier()?)
18373 } else {
18374 None
18375 };
18376
18377 let cascade = self.parse_cascade_option();
18378
18379 Ok(Revoke {
18380 grant_option_for,
18381 privileges,
18382 objects,
18383 grantees,
18384 granted_by,
18385 cascade,
18386 })
18387 }
18388
18389 pub fn parse_replace(
18391 &mut self,
18392 replace_token: TokenWithSpan,
18393 ) -> Result<Statement, ParserError> {
18394 if !dialect_of!(self is MySqlDialect | GenericDialect) {
18395 return parser_err!(
18396 "Unsupported statement REPLACE",
18397 self.peek_token_ref().span.start
18398 );
18399 }
18400
18401 let mut insert = self.parse_insert(replace_token)?;
18402 if let Statement::Insert(Insert { replace_into, .. }) = &mut insert {
18403 *replace_into = true;
18404 }
18405
18406 Ok(insert)
18407 }
18408
18409 fn parse_insert_setexpr_boxed(
18413 &mut self,
18414 insert_token: TokenWithSpan,
18415 ) -> Result<Box<SetExpr>, ParserError> {
18416 Ok(Box::new(SetExpr::Insert(self.parse_insert(insert_token)?)))
18417 }
18418
18419 pub fn parse_insert(&mut self, insert_token: TokenWithSpan) -> Result<Statement, ParserError> {
18421 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18422 let or = self.parse_conflict_clause();
18423 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
18424 None
18425 } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
18426 Some(MysqlInsertPriority::LowPriority)
18427 } else if self.parse_keyword(Keyword::DELAYED) {
18428 Some(MysqlInsertPriority::Delayed)
18429 } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
18430 Some(MysqlInsertPriority::HighPriority)
18431 } else {
18432 None
18433 };
18434
18435 let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
18436 && self.parse_keyword(Keyword::IGNORE);
18437
18438 let replace_into = false;
18439
18440 let overwrite = self.parse_keyword(Keyword::OVERWRITE);
18441 let into = self.parse_keyword(Keyword::INTO);
18442
18443 let local = self.parse_keyword(Keyword::LOCAL);
18444
18445 if self.parse_keyword(Keyword::DIRECTORY) {
18446 let path = self.parse_literal_string()?;
18447 let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
18448 Some(self.parse_file_format()?)
18449 } else {
18450 None
18451 };
18452 let source = self.parse_query()?;
18453 Ok(Statement::Directory {
18454 local,
18455 path,
18456 overwrite,
18457 file_format,
18458 source,
18459 })
18460 } else {
18461 let table = self.parse_keyword(Keyword::TABLE);
18463 let table_object = self.parse_table_object()?;
18464
18465 let table_alias = if self.dialect.supports_insert_table_alias()
18466 && !self.peek_sub_query()
18467 && self
18468 .peek_one_of_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18469 .is_none()
18470 {
18471 if self.parse_keyword(Keyword::AS) {
18472 Some(TableAliasWithoutColumns {
18473 explicit: true,
18474 alias: self.parse_identifier()?,
18475 })
18476 } else {
18477 self.maybe_parse(|parser| parser.parse_identifier())?
18478 .map(|alias| TableAliasWithoutColumns {
18479 explicit: false,
18480 alias,
18481 })
18482 }
18483 } else {
18484 None
18485 };
18486
18487 let is_mysql = dialect_of!(self is MySqlDialect);
18488
18489 let (columns, partitioned, after_columns, output, source, assignments) = if self
18490 .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
18491 {
18492 (vec![], None, vec![], None, None, vec![])
18493 } else {
18494 let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
18495 let columns =
18496 self.parse_parenthesized_qualified_column_list(Optional, is_mysql)?;
18497
18498 let partitioned = self.parse_insert_partition()?;
18499 let after_columns = if dialect_of!(self is HiveDialect) {
18501 self.parse_parenthesized_column_list(Optional, false)?
18502 } else {
18503 vec![]
18504 };
18505 (columns, partitioned, after_columns)
18506 } else {
18507 Default::default()
18508 };
18509
18510 let output = self.maybe_parse_output_clause()?;
18511
18512 let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
18513 || self.peek_keyword(Keyword::SETTINGS)
18514 {
18515 (None, vec![])
18516 } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
18517 (None, self.parse_comma_separated(Parser::parse_assignment)?)
18518 } else {
18519 (Some(self.parse_query()?), vec![])
18520 };
18521
18522 (
18523 columns,
18524 partitioned,
18525 after_columns,
18526 output,
18527 source,
18528 assignments,
18529 )
18530 };
18531
18532 let (format_clause, settings) = if self.dialect.supports_insert_format() {
18533 let settings = self.parse_settings()?;
18536
18537 let format = if self.parse_keyword(Keyword::FORMAT) {
18538 Some(self.parse_input_format_clause()?)
18539 } else {
18540 None
18541 };
18542
18543 (format, settings)
18544 } else {
18545 Default::default()
18546 };
18547
18548 let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
18549 && self.parse_keyword(Keyword::AS)
18550 {
18551 let row_alias = self.parse_object_name(false)?;
18552 let col_aliases = Some(self.parse_parenthesized_column_list(Optional, false)?);
18553 Some(InsertAliases {
18554 row_alias,
18555 col_aliases,
18556 })
18557 } else {
18558 None
18559 };
18560
18561 let on = if self.parse_keyword(Keyword::ON) {
18562 if self.parse_keyword(Keyword::CONFLICT) {
18563 let conflict_target =
18564 if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
18565 Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
18566 } else if self.peek_token_ref().token == Token::LParen {
18567 Some(ConflictTarget::Columns(
18568 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
18569 ))
18570 } else {
18571 None
18572 };
18573
18574 self.expect_keyword_is(Keyword::DO)?;
18575 let action = if self.parse_keyword(Keyword::NOTHING) {
18576 OnConflictAction::DoNothing
18577 } else {
18578 self.expect_keyword_is(Keyword::UPDATE)?;
18579 self.expect_keyword_is(Keyword::SET)?;
18580 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18581 let selection = if self.parse_keyword(Keyword::WHERE) {
18582 Some(self.parse_expr()?)
18583 } else {
18584 None
18585 };
18586 OnConflictAction::DoUpdate(DoUpdate {
18587 assignments,
18588 selection,
18589 })
18590 };
18591
18592 Some(OnInsert::OnConflict(OnConflict {
18593 conflict_target,
18594 action,
18595 }))
18596 } else {
18597 self.expect_keyword_is(Keyword::DUPLICATE)?;
18598 self.expect_keyword_is(Keyword::KEY)?;
18599 self.expect_keyword_is(Keyword::UPDATE)?;
18600 let l = self.parse_comma_separated(Parser::parse_assignment)?;
18601
18602 Some(OnInsert::DuplicateKeyUpdate(l))
18603 }
18604 } else {
18605 None
18606 };
18607
18608 let returning = if self.parse_keyword(Keyword::RETURNING) {
18609 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18610 } else {
18611 None
18612 };
18613
18614 Ok(Insert {
18615 insert_token: insert_token.into(),
18616 optimizer_hints,
18617 or,
18618 table: table_object,
18619 table_alias,
18620 ignore,
18621 into,
18622 overwrite,
18623 partitioned,
18624 columns,
18625 after_columns,
18626 source,
18627 assignments,
18628 has_table_keyword: table,
18629 on,
18630 returning,
18631 output,
18632 replace_into,
18633 priority,
18634 insert_alias,
18635 settings,
18636 format_clause,
18637 multi_table_insert_type: None,
18638 multi_table_into_clauses: vec![],
18639 multi_table_when_clauses: vec![],
18640 multi_table_else_clause: None,
18641 }
18642 .into())
18643 }
18644 }
18645
18646 pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
18650 let ident = self.parse_identifier()?;
18651 let values = self
18652 .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
18653 .unwrap_or_default();
18654
18655 Ok(InputFormatClause { ident, values })
18656 }
18657
18658 fn peek_subquery_start(&mut self) -> bool {
18661 let mut i = 0;
18665 loop {
18666 match &self.peek_nth_token_ref(i).token {
18667 Token::LParen => i += 1,
18668 Token::Word(w) if w.keyword == Keyword::SELECT => return i > 0,
18669 _ => return false,
18670 }
18671 }
18672 }
18673
18674 fn peek_subquery_or_cte_start(&mut self) -> bool {
18678 matches!(
18679 self.peek_tokens_ref(),
18680 [
18681 TokenWithSpan {
18682 token: Token::LParen,
18683 ..
18684 },
18685 TokenWithSpan {
18686 token: Token::Word(Word {
18687 keyword: Keyword::SELECT | Keyword::WITH,
18688 ..
18689 }),
18690 ..
18691 },
18692 ]
18693 )
18694 }
18695
18696 fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
18697 if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
18698 Some(SqliteOnConflict::Replace)
18699 } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
18700 Some(SqliteOnConflict::Rollback)
18701 } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
18702 Some(SqliteOnConflict::Abort)
18703 } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
18704 Some(SqliteOnConflict::Fail)
18705 } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
18706 Some(SqliteOnConflict::Ignore)
18707 } else if self.parse_keyword(Keyword::REPLACE) {
18708 Some(SqliteOnConflict::Replace)
18709 } else {
18710 None
18711 }
18712 }
18713
18714 pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
18716 if self.parse_keyword(Keyword::PARTITION) {
18717 self.expect_token(&Token::LParen)?;
18718 let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
18719 self.expect_token(&Token::RParen)?;
18720 Ok(partition_cols)
18721 } else {
18722 Ok(None)
18723 }
18724 }
18725
18726 pub fn parse_load_data_table_format(
18728 &mut self,
18729 ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
18730 if self.parse_keyword(Keyword::INPUTFORMAT) {
18731 let input_format = self.parse_expr()?;
18732 self.expect_keyword_is(Keyword::SERDE)?;
18733 let serde = self.parse_expr()?;
18734 Ok(Some(HiveLoadDataFormat {
18735 input_format,
18736 serde,
18737 }))
18738 } else {
18739 Ok(None)
18740 }
18741 }
18742
18743 fn parse_update_setexpr_boxed(
18747 &mut self,
18748 update_token: TokenWithSpan,
18749 ) -> Result<Box<SetExpr>, ParserError> {
18750 Ok(Box::new(SetExpr::Update(self.parse_update(update_token)?)))
18751 }
18752
18753 pub fn parse_update(&mut self, update_token: TokenWithSpan) -> Result<Statement, ParserError> {
18755 let optimizer_hints = self.maybe_parse_optimizer_hints()?;
18756 let or = self.parse_conflict_clause();
18757 let table = self.parse_table_and_joins()?;
18758 let from_before_set = if self.parse_keyword(Keyword::FROM) {
18759 Some(UpdateTableFromKind::BeforeSet(
18760 self.parse_table_with_joins()?,
18761 ))
18762 } else {
18763 None
18764 };
18765 self.expect_keyword(Keyword::SET)?;
18766 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
18767
18768 let output = self.maybe_parse_output_clause()?;
18769
18770 let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
18771 Some(UpdateTableFromKind::AfterSet(
18772 self.parse_table_with_joins()?,
18773 ))
18774 } else {
18775 from_before_set
18776 };
18777 let selection = if self.parse_keyword(Keyword::WHERE) {
18778 Some(self.parse_expr()?)
18779 } else {
18780 None
18781 };
18782 let returning = if self.parse_keyword(Keyword::RETURNING) {
18783 Some(self.parse_comma_separated(Parser::parse_select_item)?)
18784 } else {
18785 None
18786 };
18787 let order_by = if self.dialect.supports_update_order_by()
18788 && self.parse_keywords(&[Keyword::ORDER, Keyword::BY])
18789 {
18790 self.parse_comma_separated(Parser::parse_order_by_expr)?
18791 } else {
18792 vec![]
18793 };
18794 let limit = if self.parse_keyword(Keyword::LIMIT) {
18795 Some(self.parse_expr()?)
18796 } else {
18797 None
18798 };
18799 Ok(Update {
18800 update_token: update_token.into(),
18801 optimizer_hints,
18802 table,
18803 assignments,
18804 from,
18805 selection,
18806 returning,
18807 output,
18808 or,
18809 order_by,
18810 limit,
18811 }
18812 .into())
18813 }
18814
18815 pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
18817 let target = self.parse_assignment_target()?;
18818 self.expect_token(&Token::Eq)?;
18819 let value = self.parse_expr()?;
18820 Ok(Assignment { target, value })
18821 }
18822
18823 pub fn parse_assignment_target(&mut self) -> Result<AssignmentTarget, ParserError> {
18825 if self.consume_token(&Token::LParen) {
18826 let columns = self.parse_comma_separated(|p| p.parse_object_name(false))?;
18827 self.expect_token(&Token::RParen)?;
18828 Ok(AssignmentTarget::Tuple(columns))
18829 } else {
18830 let column = self.parse_object_name(false)?;
18831 Ok(AssignmentTarget::ColumnName(column))
18832 }
18833 }
18834
18835 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
18837 if self.dialect.supports_named_fn_args_with_expr_name() {
18841 let expr = self.parse_wildcard_expr()?;
18842 if !matches!(expr, Expr::Wildcard(_) | Expr::QualifiedWildcard(..)) {
18844 if let Some(operator) =
18845 self.maybe_parse(|p| p.parse_function_named_arg_operator())?
18846 {
18847 let arg = self.parse_wildcard_expr()?.into();
18848 return Ok(FunctionArg::ExprNamed {
18849 name: expr,
18850 arg,
18851 operator,
18852 });
18853 }
18854 }
18855 let arg_expr = self.function_arg_expr_from_wildcard(expr)?;
18856 return Ok(FunctionArg::Unnamed(
18857 self.maybe_parse_aliased_function_arg(arg_expr)?,
18858 ));
18859 }
18860
18861 let arg = self.maybe_parse(|p| {
18862 let name = p.parse_identifier()?;
18863 let operator = p.parse_function_named_arg_operator()?;
18864 let arg = p.parse_wildcard_expr()?.into();
18865 Ok(FunctionArg::Named {
18866 name,
18867 arg,
18868 operator,
18869 })
18870 })?;
18871 if let Some(arg) = arg {
18872 return Ok(arg);
18873 }
18874 let wildcard_expr = self.parse_wildcard_expr()?;
18875 let arg_expr = self.function_arg_expr_from_wildcard(wildcard_expr)?;
18876 Ok(FunctionArg::Unnamed(
18877 self.maybe_parse_aliased_function_arg(arg_expr)?,
18878 ))
18879 }
18880
18881 fn function_arg_expr_from_wildcard(
18884 &mut self,
18885 wildcard_expr: Expr,
18886 ) -> Result<FunctionArgExpr, ParserError> {
18887 Ok(match wildcard_expr {
18888 Expr::Wildcard(ref token) if self.dialect.supports_select_wildcard_exclude() => {
18889 let opts = self.parse_wildcard_additional_options(token.0.clone())?;
18891 if opts.opt_exclude.is_some()
18892 || opts.opt_except.is_some()
18893 || opts.opt_replace.is_some()
18894 || opts.opt_rename.is_some()
18895 || opts.opt_ilike.is_some()
18896 {
18897 FunctionArgExpr::WildcardWithOptions(opts)
18898 } else {
18899 wildcard_expr.into()
18900 }
18901 }
18902 other => other.into(),
18903 })
18904 }
18905
18906 fn maybe_parse_aliased_function_arg(
18909 &mut self,
18910 arg_expr: FunctionArgExpr,
18911 ) -> Result<FunctionArgExpr, ParserError> {
18912 Ok(match arg_expr {
18913 FunctionArgExpr::Expr(expr)
18914 if self.dialect.supports_aliased_function_args()
18915 && self.parse_keyword(Keyword::AS) =>
18916 {
18917 FunctionArgExpr::Expr(Expr::Named {
18918 expr: expr.into(),
18919 name: self.parse_identifier()?,
18920 })
18921 }
18922 other => other,
18923 })
18924 }
18925
18926 fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
18927 if self.parse_keyword(Keyword::VALUE) {
18928 return Ok(FunctionArgOperator::Value);
18929 }
18930 let tok = self.next_token();
18931 match tok.token {
18932 Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
18933 Ok(FunctionArgOperator::RightArrow)
18934 }
18935 Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
18936 Ok(FunctionArgOperator::Equals)
18937 }
18938 Token::Assignment
18939 if self
18940 .dialect
18941 .supports_named_fn_args_with_assignment_operator() =>
18942 {
18943 Ok(FunctionArgOperator::Assignment)
18944 }
18945 Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
18946 Ok(FunctionArgOperator::Colon)
18947 }
18948 _ => {
18949 self.prev_token();
18950 self.expected("argument operator", tok)
18951 }
18952 }
18953 }
18954
18955 pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
18957 if self.consume_token(&Token::RParen) {
18958 Ok(vec![])
18959 } else {
18960 let args = self.parse_comma_separated(Parser::parse_function_args)?;
18961 self.expect_token(&Token::RParen)?;
18962 Ok(args)
18963 }
18964 }
18965
18966 fn parse_table_function_args(&mut self) -> Result<TableFunctionArgs, ParserError> {
18967 if self.consume_token(&Token::RParen) {
18968 return Ok(TableFunctionArgs {
18969 args: vec![],
18970 settings: None,
18971 });
18972 }
18973 let mut args = vec![];
18974 let settings = loop {
18975 if let Some(settings) = self.parse_settings()? {
18976 break Some(settings);
18977 }
18978 args.push(self.parse_function_args()?);
18979 if self.is_parse_comma_separated_end() {
18980 break None;
18981 }
18982 };
18983 self.expect_token(&Token::RParen)?;
18984 Ok(TableFunctionArgs { args, settings })
18985 }
18986
18987 fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
18996 let mut clauses = vec![];
18997
18998 if let Some(null_clause) = self.parse_json_null_clause() {
19001 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19002 }
19003
19004 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19005 clauses.push(FunctionArgumentClause::JsonReturningClause(
19006 json_returning_clause,
19007 ));
19008 }
19009
19010 if self.consume_token(&Token::RParen) {
19011 return Ok(FunctionArgumentList {
19012 duplicate_treatment: None,
19013 args: vec![],
19014 clauses,
19015 });
19016 }
19017
19018 let duplicate_treatment = self.parse_duplicate_treatment()?;
19019 let args = self.parse_comma_separated(Parser::parse_function_args)?;
19020
19021 if self.parse_keyword(Keyword::WHERE) {
19022 clauses.push(FunctionArgumentClause::Where(self.parse_expr()?));
19023 }
19024
19025 if self.dialect.supports_window_function_null_treatment_arg() {
19026 if let Some(null_treatment) = self.parse_null_treatment()? {
19027 clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
19028 }
19029 }
19030
19031 if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
19032 clauses.push(FunctionArgumentClause::OrderBy(
19033 self.parse_comma_separated(Parser::parse_order_by_expr)?,
19034 ));
19035 }
19036
19037 if self.parse_keyword(Keyword::LIMIT) {
19038 clauses.push(FunctionArgumentClause::Limit(self.parse_expr()?));
19039 }
19040
19041 if dialect_of!(self is GenericDialect | BigQueryDialect)
19042 && self.parse_keyword(Keyword::HAVING)
19043 {
19044 let kind = match self.expect_one_of_keywords(&[Keyword::MIN, Keyword::MAX])? {
19045 Keyword::MIN => HavingBoundKind::Min,
19046 Keyword::MAX => HavingBoundKind::Max,
19047 unexpected_keyword => return Err(ParserError::ParserError(
19048 format!("Internal parser error: unexpected keyword `{unexpected_keyword}` in having bound"),
19049 )),
19050 };
19051 clauses.push(FunctionArgumentClause::Having(HavingBound(
19052 kind,
19053 self.parse_expr()?,
19054 )))
19055 }
19056
19057 if dialect_of!(self is GenericDialect | MySqlDialect)
19058 && self.parse_keyword(Keyword::SEPARATOR)
19059 {
19060 clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
19061 }
19062
19063 if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
19064 clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
19065 }
19066
19067 if let Some(null_clause) = self.parse_json_null_clause() {
19068 clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
19069 }
19070
19071 if let Some(json_returning_clause) = self.maybe_parse_json_returning_clause()? {
19072 clauses.push(FunctionArgumentClause::JsonReturningClause(
19073 json_returning_clause,
19074 ));
19075 }
19076
19077 self.expect_token(&Token::RParen)?;
19078 Ok(FunctionArgumentList {
19079 duplicate_treatment,
19080 args,
19081 clauses,
19082 })
19083 }
19084
19085 fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
19086 if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
19087 Some(JsonNullClause::AbsentOnNull)
19088 } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
19089 Some(JsonNullClause::NullOnNull)
19090 } else {
19091 None
19092 }
19093 }
19094
19095 fn maybe_parse_json_returning_clause(
19096 &mut self,
19097 ) -> Result<Option<JsonReturningClause>, ParserError> {
19098 if self.parse_keyword(Keyword::RETURNING) {
19099 let data_type = self.parse_data_type()?;
19100 Ok(Some(JsonReturningClause { data_type }))
19101 } else {
19102 Ok(None)
19103 }
19104 }
19105
19106 fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
19107 let loc = self.peek_token_ref().span.start;
19108 match (
19109 self.parse_keyword(Keyword::ALL),
19110 self.parse_keyword(Keyword::DISTINCT),
19111 ) {
19112 (true, false) => Ok(Some(DuplicateTreatment::All)),
19113 (false, true) => Ok(Some(DuplicateTreatment::Distinct)),
19114 (false, false) => Ok(None),
19115 (true, true) => parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc),
19116 }
19117 }
19118
19119 pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
19121 let prefix = self
19122 .parse_one_of_keywords(
19123 self.dialect
19124 .get_reserved_keywords_for_select_item_operator(),
19125 )
19126 .map(|keyword| Ident::new(format!("{keyword:?}")));
19127
19128 match self.parse_wildcard_expr()? {
19129 Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
19130 SelectItemQualifiedWildcardKind::ObjectName(prefix),
19131 self.parse_wildcard_additional_options(token.0)?,
19132 )),
19133 Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
19134 self.parse_wildcard_additional_options(token.0)?,
19135 )),
19136 Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
19137 parser_err!(
19138 format!("Expected an expression, found: {}", v),
19139 self.peek_token_ref().span.start
19140 )
19141 }
19142 Expr::BinaryOp {
19143 left,
19144 op: BinaryOperator::Eq,
19145 right,
19146 } if self.dialect.supports_eq_alias_assignment()
19147 && matches!(left.as_ref(), Expr::Identifier(_)) =>
19148 {
19149 let Expr::Identifier(alias) = *left else {
19150 return parser_err!(
19151 "BUG: expected identifier expression as alias",
19152 self.peek_token_ref().span.start
19153 );
19154 };
19155 Ok(SelectItem::ExprWithAlias {
19156 expr: *right,
19157 alias,
19158 })
19159 }
19160 expr if self.dialect.supports_select_expr_star()
19161 && self.consume_tokens(&[Token::Period, Token::Mul]) =>
19162 {
19163 let wildcard_token = self.get_previous_token().clone();
19164 Ok(SelectItem::QualifiedWildcard(
19165 SelectItemQualifiedWildcardKind::Expr(expr),
19166 self.parse_wildcard_additional_options(wildcard_token)?,
19167 ))
19168 }
19169 expr if self.dialect.supports_select_item_multi_column_alias()
19170 && self.peek_keyword(Keyword::AS)
19171 && self.peek_nth_token(1).token == Token::LParen =>
19172 {
19173 self.expect_keyword(Keyword::AS)?;
19174 self.expect_token(&Token::LParen)?;
19175 let aliases = self.parse_comma_separated(|p| p.parse_identifier())?;
19176 self.expect_token(&Token::RParen)?;
19177 Ok(SelectItem::ExprWithAliases {
19178 expr: maybe_prefixed_expr(expr, prefix),
19179 aliases,
19180 })
19181 }
19182 expr => self
19183 .maybe_parse_select_item_alias()
19184 .map(|alias| match alias {
19185 Some(alias) => SelectItem::ExprWithAlias {
19186 expr: maybe_prefixed_expr(expr, prefix),
19187 alias,
19188 },
19189 None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
19190 }),
19191 }
19192 }
19193
19194 pub fn parse_wildcard_additional_options(
19198 &mut self,
19199 wildcard_token: TokenWithSpan,
19200 ) -> Result<WildcardAdditionalOptions, ParserError> {
19201 let opt_ilike = if self.dialect.supports_select_wildcard_ilike() {
19202 self.parse_optional_select_item_ilike()?
19203 } else {
19204 None
19205 };
19206 let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
19207 {
19208 self.parse_optional_select_item_exclude()?
19209 } else {
19210 None
19211 };
19212 let opt_except = if self.dialect.supports_select_wildcard_except() {
19213 self.parse_optional_select_item_except()?
19214 } else {
19215 None
19216 };
19217 let opt_replace = if self.dialect.supports_select_wildcard_replace() {
19218 self.parse_optional_select_item_replace()?
19219 } else {
19220 None
19221 };
19222 let opt_rename = if self.dialect.supports_select_wildcard_rename() {
19223 self.parse_optional_select_item_rename()?
19224 } else {
19225 None
19226 };
19227
19228 let opt_alias = if self.dialect.supports_select_wildcard_with_alias() {
19229 self.maybe_parse_select_item_alias()?
19230 } else {
19231 None
19232 };
19233
19234 Ok(WildcardAdditionalOptions {
19235 wildcard_token: wildcard_token.into(),
19236 opt_ilike,
19237 opt_exclude,
19238 opt_except,
19239 opt_rename,
19240 opt_replace,
19241 opt_alias,
19242 })
19243 }
19244
19245 pub fn parse_optional_select_item_ilike(
19249 &mut self,
19250 ) -> Result<Option<IlikeSelectItem>, ParserError> {
19251 let opt_ilike = if self.parse_keyword(Keyword::ILIKE) {
19252 let next_token = self.next_token();
19253 let pattern = match next_token.token {
19254 Token::SingleQuotedString(s) => s,
19255 _ => return self.expected("ilike pattern", next_token),
19256 };
19257 Some(IlikeSelectItem { pattern })
19258 } else {
19259 None
19260 };
19261 Ok(opt_ilike)
19262 }
19263
19264 pub fn parse_optional_select_item_exclude(
19268 &mut self,
19269 ) -> Result<Option<ExcludeSelectItem>, ParserError> {
19270 let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
19271 if self.consume_token(&Token::LParen) {
19272 let columns =
19273 self.parse_comma_separated(|parser| parser.parse_object_name(false))?;
19274 self.expect_token(&Token::RParen)?;
19275 Some(ExcludeSelectItem::Multiple(columns))
19276 } else {
19277 let column = self.parse_object_name(false)?;
19278 Some(ExcludeSelectItem::Single(column))
19279 }
19280 } else {
19281 None
19282 };
19283
19284 Ok(opt_exclude)
19285 }
19286
19287 pub fn parse_optional_select_item_except(
19291 &mut self,
19292 ) -> Result<Option<ExceptSelectItem>, ParserError> {
19293 let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
19294 if self.peek_token_ref().token == Token::LParen {
19295 let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
19296 match &idents[..] {
19297 [] => {
19298 return self.expected_ref(
19299 "at least one column should be parsed by the expect clause",
19300 self.peek_token_ref(),
19301 )?;
19302 }
19303 [first, idents @ ..] => Some(ExceptSelectItem {
19304 first_element: first.clone(),
19305 additional_elements: idents.to_vec(),
19306 }),
19307 }
19308 } else {
19309 let ident = self.parse_identifier()?;
19311 Some(ExceptSelectItem {
19312 first_element: ident,
19313 additional_elements: vec![],
19314 })
19315 }
19316 } else {
19317 None
19318 };
19319
19320 Ok(opt_except)
19321 }
19322
19323 pub fn parse_optional_select_item_rename(
19325 &mut self,
19326 ) -> Result<Option<RenameSelectItem>, ParserError> {
19327 let opt_rename = if self.parse_keyword(Keyword::RENAME) {
19328 if self.consume_token(&Token::LParen) {
19329 let idents =
19330 self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
19331 self.expect_token(&Token::RParen)?;
19332 Some(RenameSelectItem::Multiple(idents))
19333 } else {
19334 let ident = self.parse_identifier_with_alias()?;
19335 Some(RenameSelectItem::Single(ident))
19336 }
19337 } else {
19338 None
19339 };
19340
19341 Ok(opt_rename)
19342 }
19343
19344 pub fn parse_optional_select_item_replace(
19346 &mut self,
19347 ) -> Result<Option<ReplaceSelectItem>, ParserError> {
19348 let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
19349 if self.consume_token(&Token::LParen) {
19350 let items = self.parse_comma_separated(|parser| {
19351 Ok(Box::new(parser.parse_replace_elements()?))
19352 })?;
19353 self.expect_token(&Token::RParen)?;
19354 Some(ReplaceSelectItem { items })
19355 } else {
19356 let tok = self.next_token();
19357 return self.expected("( after REPLACE but", tok);
19358 }
19359 } else {
19360 None
19361 };
19362
19363 Ok(opt_replace)
19364 }
19365 pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
19367 let expr = self.parse_expr()?;
19368 let as_keyword = self.parse_keyword(Keyword::AS);
19369 let ident = self.parse_identifier()?;
19370 Ok(ReplaceSelectElement {
19371 expr,
19372 column_name: ident,
19373 as_keyword,
19374 })
19375 }
19376
19377 pub fn parse_asc_desc(&mut self) -> Option<bool> {
19380 if self.parse_keyword(Keyword::ASC) {
19381 Some(true)
19382 } else if self.parse_keyword(Keyword::DESC) {
19383 Some(false)
19384 } else {
19385 None
19386 }
19387 }
19388
19389 fn parse_optional_order_by_sort(&mut self) -> Option<OrderBySort> {
19391 match self.parse_asc_desc() {
19392 Some(true) => Some(OrderBySort::Asc),
19393 Some(false) => Some(OrderBySort::Desc),
19394 None => None,
19395 }
19396 }
19397
19398 pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
19400 self.parse_order_by_expr_inner(false)
19401 .map(|(order_by, _)| order_by)
19402 }
19403
19404 pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
19406 self.parse_order_by_expr_inner(true)
19407 .map(|(column, operator_class)| IndexColumn {
19408 column,
19409 operator_class,
19410 })
19411 }
19412
19413 fn parse_order_by_expr_inner(
19414 &mut self,
19415 with_operator_class: bool,
19416 ) -> Result<(OrderByExpr, Option<ObjectName>), ParserError> {
19417 let expr = self.parse_expr()?;
19418
19419 let operator_class: Option<ObjectName> = if with_operator_class {
19420 if self
19423 .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
19424 .is_some()
19425 {
19426 None
19427 } else {
19428 self.maybe_parse(|parser| parser.parse_object_name(false))?
19429 }
19430 } else {
19431 None
19432 };
19433
19434 let options = if !with_operator_class
19435 && self.dialect.supports_order_by_using_operator()
19436 && self.parse_keyword(Keyword::USING)
19437 {
19438 let op = self.parse_order_by_using_operator()?;
19439 OrderByOptions {
19440 sort: Some(OrderBySort::Using(op)),
19441 nulls_first: self.parse_null_ordering_modifier(),
19442 }
19443 } else {
19444 self.parse_order_by_options()?
19445 };
19446
19447 let with_fill = if self.dialect.supports_with_fill()
19448 && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
19449 {
19450 Some(self.parse_with_fill()?)
19451 } else {
19452 None
19453 };
19454
19455 Ok((
19456 OrderByExpr {
19457 expr,
19458 options,
19459 with_fill,
19460 },
19461 operator_class,
19462 ))
19463 }
19464
19465 fn parse_order_by_using_operator(&mut self) -> Result<ObjectName, ParserError> {
19466 if self.parse_keyword(Keyword::OPERATOR) {
19467 self.expect_token(&Token::LParen)?;
19468 let operator_name = self.parse_operator_name()?;
19469 self.expect_token(&Token::RParen)?;
19470 return Ok(operator_name);
19471 }
19472
19473 let token = self.next_token();
19474 Ok(ObjectName::from(vec![Ident::new(token.token.to_string())]))
19475 }
19476
19477 fn parse_null_ordering_modifier(&mut self) -> Option<bool> {
19478 if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
19479 Some(true)
19480 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
19481 Some(false)
19482 } else {
19483 None
19484 }
19485 }
19486
19487 fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
19488 let sort = self.parse_optional_order_by_sort();
19489 let nulls_first = self.parse_null_ordering_modifier();
19490
19491 Ok(OrderByOptions { sort, nulls_first })
19492 }
19493
19494 pub fn parse_with_fill(&mut self) -> Result<WithFill, ParserError> {
19498 let from = if self.parse_keyword(Keyword::FROM) {
19499 Some(self.parse_expr()?)
19500 } else {
19501 None
19502 };
19503
19504 let to = if self.parse_keyword(Keyword::TO) {
19505 Some(self.parse_expr()?)
19506 } else {
19507 None
19508 };
19509
19510 let step = if self.parse_keyword(Keyword::STEP) {
19511 Some(self.parse_expr()?)
19512 } else {
19513 None
19514 };
19515
19516 Ok(WithFill { from, to, step })
19517 }
19518
19519 pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
19522 if !self.parse_keyword(Keyword::INTERPOLATE) {
19523 return Ok(None);
19524 }
19525
19526 if self.consume_token(&Token::LParen) {
19527 let interpolations =
19528 self.parse_comma_separated0(|p| p.parse_interpolation(), Token::RParen)?;
19529 self.expect_token(&Token::RParen)?;
19530 return Ok(Some(Interpolate {
19532 exprs: Some(interpolations),
19533 }));
19534 }
19535
19536 Ok(Some(Interpolate { exprs: None }))
19538 }
19539
19540 pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
19542 let column = self.parse_identifier()?;
19543 let expr = if self.parse_keyword(Keyword::AS) {
19544 Some(self.parse_expr()?)
19545 } else {
19546 None
19547 };
19548 Ok(InterpolateExpr { column, expr })
19549 }
19550
19551 pub fn parse_top(&mut self) -> Result<Top, ParserError> {
19554 let quantity = if self.consume_token(&Token::LParen) {
19555 let quantity = self.parse_expr()?;
19556 self.expect_token(&Token::RParen)?;
19557 Some(TopQuantity::Expr(quantity))
19558 } else {
19559 let next_token = self.next_token();
19560 let quantity = match next_token.token {
19561 Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
19562 _ => self.expected("literal int", next_token)?,
19563 };
19564 Some(TopQuantity::Constant(quantity))
19565 };
19566
19567 let percent = self.parse_keyword(Keyword::PERCENT);
19568
19569 let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
19570
19571 Ok(Top {
19572 with_ties,
19573 percent,
19574 quantity,
19575 })
19576 }
19577
19578 pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
19580 if self.parse_keyword(Keyword::ALL) {
19581 Ok(None)
19582 } else {
19583 Ok(Some(self.parse_expr()?))
19584 }
19585 }
19586
19587 pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
19589 let value = self.parse_expr()?;
19590 let rows = if self.parse_keyword(Keyword::ROW) {
19591 OffsetRows::Row
19592 } else if self.parse_keyword(Keyword::ROWS) {
19593 OffsetRows::Rows
19594 } else {
19595 OffsetRows::None
19596 };
19597 Ok(Offset { value, rows })
19598 }
19599
19600 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
19602 let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
19603
19604 let (quantity, percent) = if self
19605 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
19606 .is_some()
19607 {
19608 (None, false)
19609 } else {
19610 let quantity = Expr::Value(self.parse_value()?);
19611 let percent = self.parse_keyword(Keyword::PERCENT);
19612 let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
19613 (Some(quantity), percent)
19614 };
19615
19616 let with_ties = if self.parse_keyword(Keyword::ONLY) {
19617 false
19618 } else {
19619 self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
19620 };
19621
19622 Ok(Fetch {
19623 with_ties,
19624 percent,
19625 quantity,
19626 })
19627 }
19628
19629 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
19631 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
19632 Keyword::UPDATE => LockType::Update,
19633 Keyword::SHARE => LockType::Share,
19634 unexpected_keyword => return Err(ParserError::ParserError(
19635 format!("Internal parser error: expected any of {{UPDATE, SHARE}}, got {unexpected_keyword:?}"),
19636 )),
19637 };
19638 let of = if self.parse_keyword(Keyword::OF) {
19639 Some(self.parse_object_name(false)?)
19640 } else {
19641 None
19642 };
19643 let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
19644 Some(NonBlock::Nowait)
19645 } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
19646 Some(NonBlock::SkipLocked)
19647 } else {
19648 None
19649 };
19650 Ok(LockClause {
19651 lock_type,
19652 of,
19653 nonblock,
19654 })
19655 }
19656
19657 pub fn parse_lock_statement(&mut self) -> Result<Lock, ParserError> {
19659 self.expect_keyword(Keyword::LOCK)?;
19660
19661 if self.peek_keyword(Keyword::TABLES) {
19662 return self.expected_ref("TABLE or a table name", self.peek_token_ref());
19663 }
19664
19665 let _ = self.parse_keyword(Keyword::TABLE);
19666 let tables = self.parse_comma_separated(Parser::parse_lock_table_target)?;
19667 let lock_mode = if self.parse_keyword(Keyword::IN) {
19668 let lock_mode = self.parse_lock_table_mode()?;
19669 self.expect_keyword(Keyword::MODE)?;
19670 Some(lock_mode)
19671 } else {
19672 None
19673 };
19674 let nowait = self.parse_keyword(Keyword::NOWAIT);
19675
19676 Ok(Lock {
19677 tables,
19678 lock_mode,
19679 nowait,
19680 })
19681 }
19682
19683 fn parse_lock_table_target(&mut self) -> Result<LockTableTarget, ParserError> {
19684 let only = self.parse_keyword(Keyword::ONLY);
19685 let name = self.parse_object_name(false)?;
19686 let has_asterisk = self.consume_token(&Token::Mul);
19687
19688 Ok(LockTableTarget {
19689 name,
19690 only,
19691 has_asterisk,
19692 })
19693 }
19694
19695 fn parse_lock_table_mode(&mut self) -> Result<LockTableMode, ParserError> {
19696 if self.parse_keywords(&[Keyword::ACCESS, Keyword::SHARE]) {
19697 Ok(LockTableMode::AccessShare)
19698 } else if self.parse_keywords(&[Keyword::ACCESS, Keyword::EXCLUSIVE]) {
19699 Ok(LockTableMode::AccessExclusive)
19700 } else if self.parse_keywords(&[Keyword::ROW, Keyword::SHARE]) {
19701 Ok(LockTableMode::RowShare)
19702 } else if self.parse_keywords(&[Keyword::ROW, Keyword::EXCLUSIVE]) {
19703 Ok(LockTableMode::RowExclusive)
19704 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::UPDATE, Keyword::EXCLUSIVE]) {
19705 Ok(LockTableMode::ShareUpdateExclusive)
19706 } else if self.parse_keywords(&[Keyword::SHARE, Keyword::ROW, Keyword::EXCLUSIVE]) {
19707 Ok(LockTableMode::ShareRowExclusive)
19708 } else if self.parse_keyword(Keyword::SHARE) {
19709 Ok(LockTableMode::Share)
19710 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19711 Ok(LockTableMode::Exclusive)
19712 } else {
19713 self.expected_ref("a PostgreSQL LOCK TABLE mode", self.peek_token_ref())
19714 }
19715 }
19716
19717 pub fn parse_values(
19719 &mut self,
19720 allow_empty: bool,
19721 value_keyword: bool,
19722 ) -> Result<Values, ParserError> {
19723 let mut explicit_row = false;
19724
19725 let rows = self.parse_comma_separated(|parser| {
19726 if parser.parse_keyword(Keyword::ROW) {
19727 explicit_row = true;
19728 }
19729 Ok(Parens {
19730 opening_token: parser.expect_token(&Token::LParen)?.into(),
19731 content: if allow_empty && parser.peek_token_ref().token == Token::RParen {
19732 vec![]
19733 } else {
19734 parser.parse_comma_separated(Parser::parse_expr)?
19735 },
19736 closing_token: parser.expect_token(&Token::RParen)?.into(),
19737 })
19738 })?;
19739 Ok(Values {
19740 explicit_row,
19741 rows,
19742 value_keyword,
19743 })
19744 }
19745
19746 pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
19748 self.expect_keyword_is(Keyword::TRANSACTION)?;
19749 Ok(Statement::StartTransaction {
19750 modes: self.parse_transaction_modes()?,
19751 begin: false,
19752 transaction: Some(BeginTransactionKind::Transaction),
19753 modifier: None,
19754 statements: vec![],
19755 exception: None,
19756 has_end_keyword: false,
19757 })
19758 }
19759
19760 pub(crate) fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
19762 if !self.dialect.supports_start_transaction_modifier() {
19763 None
19764 } else if self.parse_keyword(Keyword::DEFERRED) {
19765 Some(TransactionModifier::Deferred)
19766 } else if self.parse_keyword(Keyword::IMMEDIATE) {
19767 Some(TransactionModifier::Immediate)
19768 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
19769 Some(TransactionModifier::Exclusive)
19770 } else if self.parse_keyword(Keyword::TRY) {
19771 Some(TransactionModifier::Try)
19772 } else if self.parse_keyword(Keyword::CATCH) {
19773 Some(TransactionModifier::Catch)
19774 } else {
19775 None
19776 }
19777 }
19778
19779 pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
19781 let modifier = self.parse_transaction_modifier();
19782 let transaction =
19783 match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN])
19784 {
19785 Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
19786 Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
19787 Some(Keyword::TRAN) => Some(BeginTransactionKind::Tran),
19788 _ => None,
19789 };
19790 Ok(Statement::StartTransaction {
19791 modes: self.parse_transaction_modes()?,
19792 begin: true,
19793 transaction,
19794 modifier,
19795 statements: vec![],
19796 exception: None,
19797 has_end_keyword: false,
19798 })
19799 }
19800
19801 pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
19803 let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
19804
19805 let exception = if self.parse_keyword(Keyword::EXCEPTION) {
19806 let mut when = Vec::new();
19807
19808 while !self.peek_keyword(Keyword::END) {
19810 self.expect_keyword(Keyword::WHEN)?;
19811
19812 let mut idents = Vec::new();
19816
19817 while !self.parse_keyword(Keyword::THEN) {
19818 let ident = self.parse_identifier()?;
19819 idents.push(ident);
19820
19821 self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
19822 }
19823
19824 let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
19825
19826 when.push(ExceptionWhen { idents, statements });
19827 }
19828
19829 Some(when)
19830 } else {
19831 None
19832 };
19833
19834 self.expect_keyword(Keyword::END)?;
19835
19836 Ok(Statement::StartTransaction {
19837 begin: true,
19838 statements,
19839 exception,
19840 has_end_keyword: true,
19841 transaction: None,
19842 modifier: None,
19843 modes: Default::default(),
19844 })
19845 }
19846
19847 pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
19849 let modifier = if !self.dialect.supports_end_transaction_modifier() {
19850 None
19851 } else if self.parse_keyword(Keyword::TRY) {
19852 Some(TransactionModifier::Try)
19853 } else if self.parse_keyword(Keyword::CATCH) {
19854 Some(TransactionModifier::Catch)
19855 } else {
19856 None
19857 };
19858 Ok(Statement::Commit {
19859 chain: self.parse_commit_rollback_chain()?,
19860 end: true,
19861 modifier,
19862 })
19863 }
19864
19865 pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
19867 let mut modes = vec![];
19868 let mut required = false;
19869 loop {
19870 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
19871 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
19872 TransactionIsolationLevel::ReadUncommitted
19873 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
19874 TransactionIsolationLevel::ReadCommitted
19875 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
19876 TransactionIsolationLevel::RepeatableRead
19877 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
19878 TransactionIsolationLevel::Serializable
19879 } else if self.parse_keyword(Keyword::SNAPSHOT) {
19880 TransactionIsolationLevel::Snapshot
19881 } else {
19882 self.expected_ref("isolation level", self.peek_token_ref())?
19883 };
19884 TransactionMode::IsolationLevel(iso_level)
19885 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
19886 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
19887 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
19888 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
19889 } else if required {
19890 self.expected_ref("transaction mode", self.peek_token_ref())?
19891 } else {
19892 break;
19893 };
19894 modes.push(mode);
19895 required = self.consume_token(&Token::Comma);
19900 }
19901 Ok(modes)
19902 }
19903
19904 pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
19906 Ok(Statement::Commit {
19907 chain: self.parse_commit_rollback_chain()?,
19908 end: false,
19909 modifier: None,
19910 })
19911 }
19912
19913 pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
19915 let chain = self.parse_commit_rollback_chain()?;
19916 let savepoint = self.parse_rollback_savepoint()?;
19917
19918 Ok(Statement::Rollback { chain, savepoint })
19919 }
19920
19921 pub fn parse_abort(&mut self) -> Result<Statement, ParserError> {
19927 let chain = self.parse_commit_rollback_chain()?;
19928
19929 Ok(Statement::Rollback {
19930 chain,
19931 savepoint: None,
19932 })
19933 }
19934
19935 pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
19937 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK, Keyword::TRAN]);
19938 if self.parse_keyword(Keyword::AND) {
19939 let chain = !self.parse_keyword(Keyword::NO);
19940 self.expect_keyword_is(Keyword::CHAIN)?;
19941 Ok(chain)
19942 } else {
19943 Ok(false)
19944 }
19945 }
19946
19947 pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
19949 if self.parse_keyword(Keyword::TO) {
19950 let _ = self.parse_keyword(Keyword::SAVEPOINT);
19951 let savepoint = self.parse_identifier()?;
19952
19953 Ok(Some(savepoint))
19954 } else {
19955 Ok(None)
19956 }
19957 }
19958
19959 pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
19961 self.expect_token(&Token::LParen)?;
19962 let message = Box::new(self.parse_expr()?);
19963 self.expect_token(&Token::Comma)?;
19964 let severity = Box::new(self.parse_expr()?);
19965 self.expect_token(&Token::Comma)?;
19966 let state = Box::new(self.parse_expr()?);
19967 let arguments = if self.consume_token(&Token::Comma) {
19968 self.parse_comma_separated(Parser::parse_expr)?
19969 } else {
19970 vec![]
19971 };
19972 self.expect_token(&Token::RParen)?;
19973 let options = if self.parse_keyword(Keyword::WITH) {
19974 self.parse_comma_separated(Parser::parse_raiserror_option)?
19975 } else {
19976 vec![]
19977 };
19978 Ok(Statement::RaisError {
19979 message,
19980 severity,
19981 state,
19982 arguments,
19983 options,
19984 })
19985 }
19986
19987 pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
19989 match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
19990 Keyword::LOG => Ok(RaisErrorOption::Log),
19991 Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
19992 Keyword::SETERROR => Ok(RaisErrorOption::SetError),
19993 _ => self.expected_ref(
19994 "LOG, NOWAIT OR SETERROR raiserror option",
19995 self.peek_token_ref(),
19996 ),
19997 }
19998 }
19999
20000 pub fn parse_throw(&mut self) -> Result<ThrowStatement, ParserError> {
20004 self.expect_keyword_is(Keyword::THROW)?;
20005
20006 let error_number = self.maybe_parse(|p| p.parse_expr().map(Box::new))?;
20007 let (message, state) = if error_number.is_some() {
20008 self.expect_token(&Token::Comma)?;
20009 let message = Box::new(self.parse_expr()?);
20010 self.expect_token(&Token::Comma)?;
20011 let state = Box::new(self.parse_expr()?);
20012 (Some(message), Some(state))
20013 } else {
20014 (None, None)
20015 };
20016
20017 Ok(ThrowStatement {
20018 error_number,
20019 message,
20020 state,
20021 })
20022 }
20023
20024 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
20026 let prepare = self.parse_keyword(Keyword::PREPARE);
20027 let name = self.parse_identifier()?;
20028 Ok(Statement::Deallocate { name, prepare })
20029 }
20030
20031 pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
20033 let immediate =
20034 self.dialect.supports_execute_immediate() && self.parse_keyword(Keyword::IMMEDIATE);
20035
20036 let name = if immediate || matches!(self.peek_token_ref().token, Token::LParen) {
20042 None
20043 } else {
20044 Some(self.parse_object_name(false)?)
20045 };
20046
20047 let has_parentheses = self.consume_token(&Token::LParen);
20048
20049 let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
20050 let end_token = match (has_parentheses, self.peek_token().token) {
20051 (true, _) => Token::RParen,
20052 (false, Token::EOF) => Token::EOF,
20053 (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
20054 (false, _) => Token::SemiColon,
20055 };
20056
20057 let parameters = self.parse_comma_separated0(Parser::parse_expr, end_token)?;
20058
20059 if has_parentheses {
20060 self.expect_token(&Token::RParen)?;
20061 }
20062
20063 let into = if self.parse_keyword(Keyword::INTO) {
20064 self.parse_comma_separated(Self::parse_identifier)?
20065 } else {
20066 vec![]
20067 };
20068
20069 let using = if self.parse_keyword(Keyword::USING) {
20070 self.parse_comma_separated(Self::parse_expr_with_alias)?
20071 } else {
20072 vec![]
20073 };
20074
20075 let output = self.parse_keyword(Keyword::OUTPUT);
20076
20077 let default = self.parse_keyword(Keyword::DEFAULT);
20078
20079 Ok(Statement::Execute {
20080 immediate,
20081 name,
20082 parameters,
20083 has_parentheses,
20084 into,
20085 using,
20086 output,
20087 default,
20088 })
20089 }
20090
20091 pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
20093 let name = self.parse_identifier()?;
20094
20095 let mut data_types = vec![];
20096 if self.consume_token(&Token::LParen) {
20097 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
20098 self.expect_token(&Token::RParen)?;
20099 }
20100
20101 self.expect_keyword_is(Keyword::AS)?;
20102 let statement = Box::new(self.parse_statement()?);
20103 Ok(Statement::Prepare {
20104 name,
20105 data_types,
20106 statement,
20107 })
20108 }
20109
20110 pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
20112 self.expect_keyword(Keyword::UNLOAD)?;
20113 self.expect_token(&Token::LParen)?;
20114 let (query, query_text) =
20115 if matches!(self.peek_token_ref().token, Token::SingleQuotedString(_)) {
20116 (None, Some(self.parse_literal_string()?))
20117 } else {
20118 (Some(self.parse_query()?), None)
20119 };
20120 self.expect_token(&Token::RParen)?;
20121
20122 self.expect_keyword_is(Keyword::TO)?;
20123 let to = self.parse_identifier()?;
20124 let auth = if self.parse_keyword(Keyword::IAM_ROLE) {
20125 Some(self.parse_iam_role_kind()?)
20126 } else {
20127 None
20128 };
20129 let with = self.parse_options(Keyword::WITH)?;
20130 let mut options = vec![];
20131 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option())? {
20132 options.push(opt);
20133 }
20134 Ok(Statement::Unload {
20135 query,
20136 query_text,
20137 to,
20138 auth,
20139 with,
20140 options,
20141 })
20142 }
20143
20144 fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
20145 let temporary = self
20146 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
20147 .is_some();
20148 let unlogged = self.parse_keyword(Keyword::UNLOGGED);
20149 let table = self.parse_keyword(Keyword::TABLE);
20150 let targets = self.parse_comma_separated(Parser::parse_expr)?;
20151
20152 Ok(SelectInto {
20153 temporary,
20154 unlogged,
20155 table,
20156 targets,
20157 })
20158 }
20159
20160 fn parse_pragma_value(&mut self) -> Result<ValueWithSpan, ParserError> {
20161 let v = self.parse_value()?;
20162 match &v.value {
20163 Value::SingleQuotedString(_) => Ok(v),
20164 Value::DoubleQuotedString(_) => Ok(v),
20165 Value::Number(_, _) => Ok(v),
20166 Value::Placeholder(_) => Ok(v),
20167 _ => {
20168 self.prev_token();
20169 self.expected_ref("number or string or ? placeholder", self.peek_token_ref())
20170 }
20171 }
20172 }
20173
20174 pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
20176 let name = self.parse_object_name(false)?;
20177 if self.consume_token(&Token::LParen) {
20178 let value = self.parse_pragma_value()?;
20179 self.expect_token(&Token::RParen)?;
20180 Ok(Statement::Pragma {
20181 name,
20182 value: Some(value),
20183 is_eq: false,
20184 })
20185 } else if self.consume_token(&Token::Eq) {
20186 Ok(Statement::Pragma {
20187 name,
20188 value: Some(self.parse_pragma_value()?),
20189 is_eq: true,
20190 })
20191 } else {
20192 Ok(Statement::Pragma {
20193 name,
20194 value: None,
20195 is_eq: false,
20196 })
20197 }
20198 }
20199
20200 pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
20202 let extension_name = self.parse_identifier()?;
20203
20204 Ok(Statement::Install { extension_name })
20205 }
20206
20207 pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
20209 if self.dialect.supports_load_extension() {
20210 let extension_name = self.parse_identifier()?;
20211 Ok(Statement::Load { extension_name })
20212 } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
20213 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
20214 self.expect_keyword_is(Keyword::INPATH)?;
20215 let inpath = self.parse_literal_string()?;
20216 let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
20217 self.expect_keyword_is(Keyword::INTO)?;
20218 self.expect_keyword_is(Keyword::TABLE)?;
20219 let table_name = self.parse_object_name(false)?;
20220 let partitioned = self.parse_insert_partition()?;
20221 let table_format = self.parse_load_data_table_format()?;
20222 Ok(Statement::LoadData {
20223 local,
20224 inpath,
20225 overwrite,
20226 table_name,
20227 partitioned,
20228 table_format,
20229 })
20230 } else {
20231 self.expected_ref(
20232 "`DATA` or an extension name after `LOAD`",
20233 self.peek_token_ref(),
20234 )
20235 }
20236 }
20237
20238 pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
20250 let has_table_keyword = self.parse_keyword(Keyword::TABLE);
20251
20252 let name = self.parse_object_name(false)?;
20253
20254 let on_cluster = self.parse_optional_on_cluster()?;
20256
20257 let partition = if self.parse_keyword(Keyword::PARTITION) {
20258 if self.parse_keyword(Keyword::ID) {
20259 Some(Partition::Identifier(self.parse_identifier()?))
20260 } else {
20261 Some(Partition::Expr(self.parse_expr()?))
20262 }
20263 } else {
20264 None
20265 };
20266
20267 let include_final = self.parse_keyword(Keyword::FINAL);
20268
20269 let deduplicate = if self.parse_keyword(Keyword::DEDUPLICATE) {
20270 if self.parse_keyword(Keyword::BY) {
20271 Some(Deduplicate::ByExpression(self.parse_expr()?))
20272 } else {
20273 Some(Deduplicate::All)
20274 }
20275 } else {
20276 None
20277 };
20278
20279 let predicate = if self.parse_keyword(Keyword::WHERE) {
20281 Some(self.parse_expr()?)
20282 } else {
20283 None
20284 };
20285
20286 let zorder = if self.parse_keywords(&[Keyword::ZORDER, Keyword::BY]) {
20287 self.expect_token(&Token::LParen)?;
20288 let columns = self.parse_comma_separated(|p| p.parse_expr())?;
20289 self.expect_token(&Token::RParen)?;
20290 Some(columns)
20291 } else {
20292 None
20293 };
20294
20295 Ok(Statement::OptimizeTable {
20296 name,
20297 has_table_keyword,
20298 on_cluster,
20299 partition,
20300 include_final,
20301 deduplicate,
20302 predicate,
20303 zorder,
20304 })
20305 }
20306
20307 pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
20313 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20315 let name = self.parse_object_name(false)?;
20317 let mut data_type: Option<DataType> = None;
20319 if self.parse_keywords(&[Keyword::AS]) {
20320 data_type = Some(self.parse_data_type()?)
20321 }
20322 let sequence_options = self.parse_create_sequence_options()?;
20323 let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
20325 if self.parse_keywords(&[Keyword::NONE]) {
20326 Some(ObjectName::from(vec![Ident::new("NONE")]))
20327 } else {
20328 Some(self.parse_object_name(false)?)
20329 }
20330 } else {
20331 None
20332 };
20333 Ok(Statement::CreateSequence {
20334 temporary,
20335 if_not_exists,
20336 name,
20337 data_type,
20338 sequence_options,
20339 owned_by,
20340 })
20341 }
20342
20343 fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
20344 let mut sequence_options = vec![];
20345 if self.parse_keywords(&[Keyword::INCREMENT]) {
20347 if self.parse_keywords(&[Keyword::BY]) {
20348 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, true));
20349 } else {
20350 sequence_options.push(SequenceOptions::IncrementBy(self.parse_number()?, false));
20351 }
20352 }
20353 if self.parse_keyword(Keyword::MINVALUE) {
20355 sequence_options.push(SequenceOptions::MinValue(Some(self.parse_number()?)));
20356 } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
20357 sequence_options.push(SequenceOptions::MinValue(None));
20358 }
20359 if self.parse_keywords(&[Keyword::MAXVALUE]) {
20361 sequence_options.push(SequenceOptions::MaxValue(Some(self.parse_number()?)));
20362 } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
20363 sequence_options.push(SequenceOptions::MaxValue(None));
20364 }
20365
20366 if self.parse_keywords(&[Keyword::START]) {
20368 if self.parse_keywords(&[Keyword::WITH]) {
20369 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, true));
20370 } else {
20371 sequence_options.push(SequenceOptions::StartWith(self.parse_number()?, false));
20372 }
20373 }
20374 if self.parse_keywords(&[Keyword::CACHE]) {
20376 sequence_options.push(SequenceOptions::Cache(self.parse_number()?));
20377 }
20378 if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
20380 sequence_options.push(SequenceOptions::Cycle(true));
20381 } else if self.parse_keywords(&[Keyword::CYCLE]) {
20382 sequence_options.push(SequenceOptions::Cycle(false));
20383 }
20384
20385 Ok(sequence_options)
20386 }
20387
20388 pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
20392 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
20393 let name = self.parse_object_name(false)?;
20394
20395 let server_type = if self.parse_keyword(Keyword::TYPE) {
20396 Some(self.parse_identifier()?)
20397 } else {
20398 None
20399 };
20400
20401 let version = if self.parse_keyword(Keyword::VERSION) {
20402 Some(self.parse_identifier()?)
20403 } else {
20404 None
20405 };
20406
20407 self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
20408 let foreign_data_wrapper = self.parse_object_name(false)?;
20409
20410 let mut options = None;
20411 if self.parse_keyword(Keyword::OPTIONS) {
20412 self.expect_token(&Token::LParen)?;
20413 options = Some(self.parse_comma_separated(|p| {
20414 let key = p.parse_identifier()?;
20415 let value = p.parse_identifier()?;
20416 Ok(CreateServerOption { key, value })
20417 })?);
20418 self.expect_token(&Token::RParen)?;
20419 }
20420
20421 Ok(Statement::CreateServer(CreateServerStatement {
20422 name,
20423 if_not_exists: ine,
20424 server_type,
20425 version,
20426 foreign_data_wrapper,
20427 options,
20428 }))
20429 }
20430
20431 pub fn index(&self) -> usize {
20433 self.index
20434 }
20435
20436 pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
20438 let ident = self.parse_identifier()?;
20439 self.expect_keyword_is(Keyword::AS)?;
20440
20441 let window_expr = if self.consume_token(&Token::LParen) {
20442 NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
20443 } else if self.dialect.supports_window_clause_named_window_reference() {
20444 NamedWindowExpr::NamedWindow(self.parse_identifier()?)
20445 } else {
20446 return self.expected_ref("(", self.peek_token_ref());
20447 };
20448
20449 Ok(NamedWindowDefinition(ident, window_expr))
20450 }
20451
20452 pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
20454 let name = self.parse_object_name(false)?;
20455 let params = self.parse_optional_procedure_parameters()?;
20456
20457 let language = if self.parse_keyword(Keyword::LANGUAGE) {
20458 Some(self.parse_identifier()?)
20459 } else {
20460 None
20461 };
20462
20463 self.expect_keyword_is(Keyword::AS)?;
20464
20465 let body = self.parse_conditional_statements(&[Keyword::END])?;
20466
20467 Ok(Statement::CreateProcedure {
20468 name,
20469 or_alter,
20470 params,
20471 language,
20472 body,
20473 })
20474 }
20475
20476 pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
20478 let window_name = match &self.peek_token_ref().token {
20479 Token::Word(word) if word.keyword == Keyword::NoKeyword => {
20480 self.parse_optional_ident()?
20481 }
20482 _ => None,
20483 };
20484
20485 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
20486 self.parse_comma_separated(Parser::parse_expr)?
20487 } else {
20488 vec![]
20489 };
20490 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
20491 self.parse_comma_separated(Parser::parse_order_by_expr)?
20492 } else {
20493 vec![]
20494 };
20495
20496 let window_frame = if !self.consume_token(&Token::RParen) {
20497 let window_frame = self.parse_window_frame()?;
20498 self.expect_token(&Token::RParen)?;
20499 Some(window_frame)
20500 } else {
20501 None
20502 };
20503 Ok(WindowSpec {
20504 window_name,
20505 partition_by,
20506 order_by,
20507 window_frame,
20508 })
20509 }
20510
20511 pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
20513 let name = self.parse_object_name(false)?;
20514
20515 let has_as = self.parse_keyword(Keyword::AS);
20517
20518 if !has_as {
20519 if self.consume_token(&Token::LParen) {
20521 let options = self.parse_create_type_sql_definition_options()?;
20523 self.expect_token(&Token::RParen)?;
20524 return Ok(Statement::CreateType {
20525 name,
20526 representation: Some(UserDefinedTypeRepresentation::SqlDefinition { options }),
20527 });
20528 }
20529
20530 return Ok(Statement::CreateType {
20532 name,
20533 representation: None,
20534 });
20535 }
20536
20537 if self.parse_keyword(Keyword::ENUM) {
20539 self.parse_create_type_enum(name)
20541 } else if self.parse_keyword(Keyword::RANGE) {
20542 self.parse_create_type_range(name)
20544 } else if self.consume_token(&Token::LParen) {
20545 self.parse_create_type_composite(name)
20547 } else {
20548 self.expected_ref("ENUM, RANGE, or '(' after AS", self.peek_token_ref())
20549 }
20550 }
20551
20552 fn parse_create_type_composite(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20556 if self.consume_token(&Token::RParen) {
20557 return Ok(Statement::CreateType {
20559 name,
20560 representation: Some(UserDefinedTypeRepresentation::Composite {
20561 attributes: vec![],
20562 }),
20563 });
20564 }
20565
20566 let mut attributes = vec![];
20567 loop {
20568 let attr_name = self.parse_identifier()?;
20569 let attr_data_type = self.parse_data_type()?;
20570 let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
20571 Some(self.parse_object_name(false)?)
20572 } else {
20573 None
20574 };
20575 attributes.push(UserDefinedTypeCompositeAttributeDef {
20576 name: attr_name,
20577 data_type: attr_data_type,
20578 collation: attr_collation,
20579 });
20580
20581 if !self.consume_token(&Token::Comma) {
20582 break;
20583 }
20584 }
20585 self.expect_token(&Token::RParen)?;
20586
20587 Ok(Statement::CreateType {
20588 name,
20589 representation: Some(UserDefinedTypeRepresentation::Composite { attributes }),
20590 })
20591 }
20592
20593 pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20597 self.expect_token(&Token::LParen)?;
20598 let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20599 self.expect_token(&Token::RParen)?;
20600
20601 Ok(Statement::CreateType {
20602 name,
20603 representation: Some(UserDefinedTypeRepresentation::Enum { labels }),
20604 })
20605 }
20606
20607 fn parse_create_type_range(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
20611 self.expect_token(&Token::LParen)?;
20612 let options = self.parse_comma_separated0(|p| p.parse_range_option(), Token::RParen)?;
20613 self.expect_token(&Token::RParen)?;
20614
20615 Ok(Statement::CreateType {
20616 name,
20617 representation: Some(UserDefinedTypeRepresentation::Range { options }),
20618 })
20619 }
20620
20621 fn parse_range_option(&mut self) -> Result<UserDefinedTypeRangeOption, ParserError> {
20623 let keyword = self.parse_one_of_keywords(&[
20624 Keyword::SUBTYPE,
20625 Keyword::SUBTYPE_OPCLASS,
20626 Keyword::COLLATION,
20627 Keyword::CANONICAL,
20628 Keyword::SUBTYPE_DIFF,
20629 Keyword::MULTIRANGE_TYPE_NAME,
20630 ]);
20631
20632 match keyword {
20633 Some(Keyword::SUBTYPE) => {
20634 self.expect_token(&Token::Eq)?;
20635 let data_type = self.parse_data_type()?;
20636 Ok(UserDefinedTypeRangeOption::Subtype(data_type))
20637 }
20638 Some(Keyword::SUBTYPE_OPCLASS) => {
20639 self.expect_token(&Token::Eq)?;
20640 let name = self.parse_object_name(false)?;
20641 Ok(UserDefinedTypeRangeOption::SubtypeOpClass(name))
20642 }
20643 Some(Keyword::COLLATION) => {
20644 self.expect_token(&Token::Eq)?;
20645 let name = self.parse_object_name(false)?;
20646 Ok(UserDefinedTypeRangeOption::Collation(name))
20647 }
20648 Some(Keyword::CANONICAL) => {
20649 self.expect_token(&Token::Eq)?;
20650 let name = self.parse_object_name(false)?;
20651 Ok(UserDefinedTypeRangeOption::Canonical(name))
20652 }
20653 Some(Keyword::SUBTYPE_DIFF) => {
20654 self.expect_token(&Token::Eq)?;
20655 let name = self.parse_object_name(false)?;
20656 Ok(UserDefinedTypeRangeOption::SubtypeDiff(name))
20657 }
20658 Some(Keyword::MULTIRANGE_TYPE_NAME) => {
20659 self.expect_token(&Token::Eq)?;
20660 let name = self.parse_object_name(false)?;
20661 Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
20662 }
20663 _ => self.expected_ref("range option keyword", self.peek_token_ref()),
20664 }
20665 }
20666
20667 fn parse_create_type_sql_definition_options(
20669 &mut self,
20670 ) -> Result<Vec<UserDefinedTypeSqlDefinitionOption>, ParserError> {
20671 self.parse_comma_separated0(|p| p.parse_sql_definition_option(), Token::RParen)
20672 }
20673
20674 fn parse_sql_definition_option(
20676 &mut self,
20677 ) -> Result<UserDefinedTypeSqlDefinitionOption, ParserError> {
20678 let keyword = self.parse_one_of_keywords(&[
20679 Keyword::INPUT,
20680 Keyword::OUTPUT,
20681 Keyword::RECEIVE,
20682 Keyword::SEND,
20683 Keyword::TYPMOD_IN,
20684 Keyword::TYPMOD_OUT,
20685 Keyword::ANALYZE,
20686 Keyword::SUBSCRIPT,
20687 Keyword::INTERNALLENGTH,
20688 Keyword::PASSEDBYVALUE,
20689 Keyword::ALIGNMENT,
20690 Keyword::STORAGE,
20691 Keyword::LIKE,
20692 Keyword::CATEGORY,
20693 Keyword::PREFERRED,
20694 Keyword::DEFAULT,
20695 Keyword::ELEMENT,
20696 Keyword::DELIMITER,
20697 Keyword::COLLATABLE,
20698 ]);
20699
20700 match keyword {
20701 Some(Keyword::INPUT) => {
20702 self.expect_token(&Token::Eq)?;
20703 let name = self.parse_object_name(false)?;
20704 Ok(UserDefinedTypeSqlDefinitionOption::Input(name))
20705 }
20706 Some(Keyword::OUTPUT) => {
20707 self.expect_token(&Token::Eq)?;
20708 let name = self.parse_object_name(false)?;
20709 Ok(UserDefinedTypeSqlDefinitionOption::Output(name))
20710 }
20711 Some(Keyword::RECEIVE) => {
20712 self.expect_token(&Token::Eq)?;
20713 let name = self.parse_object_name(false)?;
20714 Ok(UserDefinedTypeSqlDefinitionOption::Receive(name))
20715 }
20716 Some(Keyword::SEND) => {
20717 self.expect_token(&Token::Eq)?;
20718 let name = self.parse_object_name(false)?;
20719 Ok(UserDefinedTypeSqlDefinitionOption::Send(name))
20720 }
20721 Some(Keyword::TYPMOD_IN) => {
20722 self.expect_token(&Token::Eq)?;
20723 let name = self.parse_object_name(false)?;
20724 Ok(UserDefinedTypeSqlDefinitionOption::TypmodIn(name))
20725 }
20726 Some(Keyword::TYPMOD_OUT) => {
20727 self.expect_token(&Token::Eq)?;
20728 let name = self.parse_object_name(false)?;
20729 Ok(UserDefinedTypeSqlDefinitionOption::TypmodOut(name))
20730 }
20731 Some(Keyword::ANALYZE) => {
20732 self.expect_token(&Token::Eq)?;
20733 let name = self.parse_object_name(false)?;
20734 Ok(UserDefinedTypeSqlDefinitionOption::Analyze(name))
20735 }
20736 Some(Keyword::SUBSCRIPT) => {
20737 self.expect_token(&Token::Eq)?;
20738 let name = self.parse_object_name(false)?;
20739 Ok(UserDefinedTypeSqlDefinitionOption::Subscript(name))
20740 }
20741 Some(Keyword::INTERNALLENGTH) => {
20742 self.expect_token(&Token::Eq)?;
20743 if self.parse_keyword(Keyword::VARIABLE) {
20744 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20745 UserDefinedTypeInternalLength::Variable,
20746 ))
20747 } else {
20748 let value = self.parse_literal_uint()?;
20749 Ok(UserDefinedTypeSqlDefinitionOption::InternalLength(
20750 UserDefinedTypeInternalLength::Fixed(value),
20751 ))
20752 }
20753 }
20754 Some(Keyword::PASSEDBYVALUE) => Ok(UserDefinedTypeSqlDefinitionOption::PassedByValue),
20755 Some(Keyword::ALIGNMENT) => {
20756 self.expect_token(&Token::Eq)?;
20757 let align_keyword = self.parse_one_of_keywords(&[
20758 Keyword::CHAR,
20759 Keyword::INT2,
20760 Keyword::INT4,
20761 Keyword::DOUBLE,
20762 ]);
20763 match align_keyword {
20764 Some(Keyword::CHAR) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20765 Alignment::Char,
20766 )),
20767 Some(Keyword::INT2) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20768 Alignment::Int2,
20769 )),
20770 Some(Keyword::INT4) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20771 Alignment::Int4,
20772 )),
20773 Some(Keyword::DOUBLE) => Ok(UserDefinedTypeSqlDefinitionOption::Alignment(
20774 Alignment::Double,
20775 )),
20776 _ => self.expected_ref(
20777 "alignment value (char, int2, int4, or double)",
20778 self.peek_token_ref(),
20779 ),
20780 }
20781 }
20782 Some(Keyword::STORAGE) => {
20783 self.expect_token(&Token::Eq)?;
20784 let storage_keyword = self.parse_one_of_keywords(&[
20785 Keyword::PLAIN,
20786 Keyword::EXTERNAL,
20787 Keyword::EXTENDED,
20788 Keyword::MAIN,
20789 ]);
20790 match storage_keyword {
20791 Some(Keyword::PLAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20792 UserDefinedTypeStorage::Plain,
20793 )),
20794 Some(Keyword::EXTERNAL) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20795 UserDefinedTypeStorage::External,
20796 )),
20797 Some(Keyword::EXTENDED) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20798 UserDefinedTypeStorage::Extended,
20799 )),
20800 Some(Keyword::MAIN) => Ok(UserDefinedTypeSqlDefinitionOption::Storage(
20801 UserDefinedTypeStorage::Main,
20802 )),
20803 _ => self.expected_ref(
20804 "storage value (plain, external, extended, or main)",
20805 self.peek_token_ref(),
20806 ),
20807 }
20808 }
20809 Some(Keyword::LIKE) => {
20810 self.expect_token(&Token::Eq)?;
20811 let name = self.parse_object_name(false)?;
20812 Ok(UserDefinedTypeSqlDefinitionOption::Like(name))
20813 }
20814 Some(Keyword::CATEGORY) => {
20815 self.expect_token(&Token::Eq)?;
20816 let category_str = self.parse_literal_string()?;
20817 let category_char = category_str.chars().next().ok_or_else(|| {
20818 ParserError::ParserError(
20819 "CATEGORY value must be a single character".to_string(),
20820 )
20821 })?;
20822 Ok(UserDefinedTypeSqlDefinitionOption::Category(category_char))
20823 }
20824 Some(Keyword::PREFERRED) => {
20825 self.expect_token(&Token::Eq)?;
20826 let value =
20827 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20828 Ok(UserDefinedTypeSqlDefinitionOption::Preferred(value))
20829 }
20830 Some(Keyword::DEFAULT) => {
20831 self.expect_token(&Token::Eq)?;
20832 let expr = self.parse_expr()?;
20833 Ok(UserDefinedTypeSqlDefinitionOption::Default(expr))
20834 }
20835 Some(Keyword::ELEMENT) => {
20836 self.expect_token(&Token::Eq)?;
20837 let data_type = self.parse_data_type()?;
20838 Ok(UserDefinedTypeSqlDefinitionOption::Element(data_type))
20839 }
20840 Some(Keyword::DELIMITER) => {
20841 self.expect_token(&Token::Eq)?;
20842 let delimiter = self.parse_literal_string()?;
20843 Ok(UserDefinedTypeSqlDefinitionOption::Delimiter(delimiter))
20844 }
20845 Some(Keyword::COLLATABLE) => {
20846 self.expect_token(&Token::Eq)?;
20847 let value =
20848 self.parse_keyword(Keyword::TRUE) || !self.parse_keyword(Keyword::FALSE);
20849 Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
20850 }
20851 _ => self.expected_ref("SQL definition option keyword", self.peek_token_ref()),
20852 }
20853 }
20854
20855 fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
20856 self.expect_token(&Token::LParen)?;
20857 let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
20858 self.expect_token(&Token::RParen)?;
20859 Ok(idents)
20860 }
20861
20862 fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
20863 if dialect_of!(self is MySqlDialect | GenericDialect) {
20864 if self.parse_keyword(Keyword::FIRST) {
20865 Ok(Some(MySQLColumnPosition::First))
20866 } else if self.parse_keyword(Keyword::AFTER) {
20867 let ident = self.parse_identifier()?;
20868 Ok(Some(MySQLColumnPosition::After(ident)))
20869 } else {
20870 Ok(None)
20871 }
20872 } else {
20873 Ok(None)
20874 }
20875 }
20876
20877 fn parse_print(&mut self) -> Result<Statement, ParserError> {
20879 Ok(Statement::Print(PrintStatement {
20880 message: Box::new(self.parse_expr()?),
20881 }))
20882 }
20883
20884 fn parse_waitfor(&mut self) -> Result<Statement, ParserError> {
20888 let wait_type = if self.parse_keyword(Keyword::DELAY) {
20889 WaitForType::Delay
20890 } else if self.parse_keyword(Keyword::TIME) {
20891 WaitForType::Time
20892 } else {
20893 return self.expected_ref("DELAY or TIME", self.peek_token_ref());
20894 };
20895 let expr = self.parse_expr()?;
20896 Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
20897 }
20898
20899 fn parse_return(&mut self) -> Result<Statement, ParserError> {
20901 match self.maybe_parse(|p| p.parse_expr())? {
20902 Some(expr) => Ok(Statement::Return(ReturnStatement {
20903 value: Some(ReturnStatementValue::Expr(expr)),
20904 })),
20905 None => Ok(Statement::Return(ReturnStatement { value: None })),
20906 }
20907 }
20908
20909 fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
20913 self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
20914
20915 let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
20916 Some(self.parse_object_name(false)?)
20917 } else {
20918 None
20919 };
20920 self.expect_keyword(Keyword::OPTIONS)?;
20921 self.expect_token(&Token::LParen)?;
20922 let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
20923 self.expect_token(&Token::RParen)?;
20924 self.expect_keyword(Keyword::AS)?;
20925 let query = self.parse_query()?;
20926 Ok(Statement::ExportData(ExportData {
20927 options,
20928 query,
20929 connection,
20930 }))
20931 }
20932
20933 fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
20934 self.expect_keyword(Keyword::VACUUM)?;
20935 let full = self.parse_keyword(Keyword::FULL);
20936 let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
20937 let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
20938 let reindex = self.parse_keyword(Keyword::REINDEX);
20939 let recluster = self.parse_keyword(Keyword::RECLUSTER);
20940 let (table_name, threshold, boost) =
20941 match self.maybe_parse(|p| p.parse_object_name(false))? {
20942 Some(table_name) => {
20943 let threshold = if self.parse_keyword(Keyword::TO) {
20944 let value = self.parse_value()?;
20945 self.expect_keyword(Keyword::PERCENT)?;
20946 Some(value)
20947 } else {
20948 None
20949 };
20950 let boost = self.parse_keyword(Keyword::BOOST);
20951 (Some(table_name), threshold, boost)
20952 }
20953 _ => (None, None, false),
20954 };
20955 Ok(Statement::Vacuum(VacuumStatement {
20956 full,
20957 sort_only,
20958 delete_only,
20959 reindex,
20960 recluster,
20961 table_name,
20962 threshold,
20963 boost,
20964 }))
20965 }
20966
20967 pub fn into_tokens(self) -> Vec<TokenWithSpan> {
20969 self.tokens
20970 }
20971
20972 fn peek_sub_query(&mut self) -> bool {
20974 self.peek_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
20975 .is_some()
20976 }
20977
20978 pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
20979 let show_in;
20980 let mut filter_position = None;
20981 if self.dialect.supports_show_like_before_in() {
20982 if let Some(filter) = self.parse_show_statement_filter()? {
20983 filter_position = Some(ShowStatementFilterPosition::Infix(filter));
20984 }
20985 show_in = self.maybe_parse_show_stmt_in()?;
20986 } else {
20987 show_in = self.maybe_parse_show_stmt_in()?;
20988 if let Some(filter) = self.parse_show_statement_filter()? {
20989 filter_position = Some(ShowStatementFilterPosition::Suffix(filter));
20990 }
20991 }
20992 let starts_with = self.maybe_parse_show_stmt_starts_with()?;
20993 let limit = self.maybe_parse_show_stmt_limit()?;
20994 let from = self.maybe_parse_show_stmt_from()?;
20995 Ok(ShowStatementOptions {
20996 filter_position,
20997 show_in,
20998 starts_with,
20999 limit,
21000 limit_from: from,
21001 })
21002 }
21003
21004 fn maybe_parse_show_stmt_in(&mut self) -> Result<Option<ShowStatementIn>, ParserError> {
21005 let clause = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
21006 Some(Keyword::FROM) => ShowStatementInClause::FROM,
21007 Some(Keyword::IN) => ShowStatementInClause::IN,
21008 None => return Ok(None),
21009 _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
21010 };
21011
21012 let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
21013 Keyword::ACCOUNT,
21014 Keyword::DATABASE,
21015 Keyword::SCHEMA,
21016 Keyword::TABLE,
21017 Keyword::VIEW,
21018 ]) {
21019 Some(Keyword::DATABASE)
21021 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21022 | self.peek_keyword(Keyword::LIMIT) =>
21023 {
21024 (Some(ShowStatementInParentType::Database), None)
21025 }
21026 Some(Keyword::SCHEMA)
21027 if self.peek_keywords(&[Keyword::STARTS, Keyword::WITH])
21028 | self.peek_keyword(Keyword::LIMIT) =>
21029 {
21030 (Some(ShowStatementInParentType::Schema), None)
21031 }
21032 Some(parent_kw) => {
21033 let parent_name = self.maybe_parse(|p| p.parse_object_name(false))?;
21037 match parent_kw {
21038 Keyword::ACCOUNT => (Some(ShowStatementInParentType::Account), parent_name),
21039 Keyword::DATABASE => (Some(ShowStatementInParentType::Database), parent_name),
21040 Keyword::SCHEMA => (Some(ShowStatementInParentType::Schema), parent_name),
21041 Keyword::TABLE => (Some(ShowStatementInParentType::Table), parent_name),
21042 Keyword::VIEW => (Some(ShowStatementInParentType::View), parent_name),
21043 _ => {
21044 return self.expected_ref(
21045 "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
21046 self.peek_token_ref(),
21047 )
21048 }
21049 }
21050 }
21051 None => {
21052 let mut parent_name = self.parse_object_name(false)?;
21055 if self
21056 .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
21057 .is_some()
21058 {
21059 parent_name
21060 .0
21061 .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
21062 }
21063 (None, Some(parent_name))
21064 }
21065 };
21066
21067 Ok(Some(ShowStatementIn {
21068 clause,
21069 parent_type,
21070 parent_name,
21071 }))
21072 }
21073
21074 fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21075 if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
21076 Ok(Some(self.parse_value()?))
21077 } else {
21078 Ok(None)
21079 }
21080 }
21081
21082 fn maybe_parse_show_stmt_limit(&mut self) -> Result<Option<Expr>, ParserError> {
21083 if self.parse_keyword(Keyword::LIMIT) {
21084 Ok(self.parse_limit()?)
21085 } else {
21086 Ok(None)
21087 }
21088 }
21089
21090 fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<ValueWithSpan>, ParserError> {
21091 if self.parse_keyword(Keyword::FROM) {
21092 Ok(Some(self.parse_value()?))
21093 } else {
21094 Ok(None)
21095 }
21096 }
21097
21098 pub(crate) fn in_column_definition_state(&self) -> bool {
21099 matches!(self.state, ColumnDefinition)
21100 }
21101
21102 pub(crate) fn parse_key_value_options(
21107 &mut self,
21108 parenthesized: bool,
21109 end_words: &[Keyword],
21110 ) -> Result<KeyValueOptions, ParserError> {
21111 let mut options: Vec<KeyValueOption> = Vec::new();
21112 let mut delimiter = KeyValueOptionsDelimiter::Space;
21113 if parenthesized {
21114 self.expect_token(&Token::LParen)?;
21115 }
21116 loop {
21117 match self.next_token().token {
21118 Token::RParen => {
21119 if parenthesized {
21120 break;
21121 } else {
21122 return self.expected_ref(" another option or EOF", self.peek_token_ref());
21123 }
21124 }
21125 Token::EOF => break,
21126 Token::SemiColon => {
21127 self.prev_token();
21128 break;
21129 }
21130 Token::Comma => {
21131 delimiter = KeyValueOptionsDelimiter::Comma;
21132 continue;
21133 }
21134 Token::Word(w) if !end_words.contains(&w.keyword) => {
21135 options.push(self.parse_key_value_option(&w)?)
21136 }
21137 Token::Word(w) if end_words.contains(&w.keyword) => {
21138 self.prev_token();
21139 break;
21140 }
21141 _ => {
21142 return self.expected_ref(
21143 "another option, EOF, SemiColon, Comma or ')'",
21144 self.peek_token_ref(),
21145 )
21146 }
21147 };
21148 }
21149
21150 Ok(KeyValueOptions { delimiter, options })
21151 }
21152
21153 pub(crate) fn parse_key_value_option(
21155 &mut self,
21156 key: &Word,
21157 ) -> Result<KeyValueOption, ParserError> {
21158 self.expect_token(&Token::Eq)?;
21159 let peeked_token = self.peek_token();
21160 match peeked_token.token {
21161 Token::SingleQuotedString(_) => Ok(KeyValueOption {
21162 option_name: key.value.clone(),
21163 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21164 }),
21165 Token::Word(word)
21166 if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
21167 {
21168 Ok(KeyValueOption {
21169 option_name: key.value.clone(),
21170 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21171 })
21172 }
21173 Token::Number(..) => Ok(KeyValueOption {
21174 option_name: key.value.clone(),
21175 option_value: KeyValueOptionKind::Single(self.parse_value()?),
21176 }),
21177 Token::Word(word) => {
21178 self.next_token();
21179 Ok(KeyValueOption {
21180 option_name: key.value.clone(),
21181 option_value: KeyValueOptionKind::Single(
21182 Value::Placeholder(word.value.clone()).with_span(peeked_token.span),
21183 ),
21184 })
21185 }
21186 Token::LParen => {
21187 match self.maybe_parse(|parser| {
21191 parser.expect_token(&Token::LParen)?;
21192 let values = parser.parse_comma_separated0(|p| p.parse_value(), Token::RParen);
21193 parser.expect_token(&Token::RParen)?;
21194 values
21195 })? {
21196 Some(values) => Ok(KeyValueOption {
21197 option_name: key.value.clone(),
21198 option_value: KeyValueOptionKind::Multi(values),
21199 }),
21200 None => Ok(KeyValueOption {
21201 option_name: key.value.clone(),
21202 option_value: KeyValueOptionKind::KeyValueOptions(Box::new(
21203 self.parse_key_value_options(true, &[])?,
21204 )),
21205 }),
21206 }
21207 }
21208 _ => self.expected_ref("expected option value", self.peek_token_ref()),
21209 }
21210 }
21211
21212 fn parse_reset(&mut self) -> Result<ResetStatement, ParserError> {
21214 if self.parse_keyword(Keyword::ALL) {
21215 return Ok(ResetStatement { reset: Reset::ALL });
21216 }
21217
21218 if self.parse_keywords(&[Keyword::SESSION, Keyword::AUTHORIZATION]) {
21219 return Ok(ResetStatement {
21220 reset: Reset::SessionAuthorization,
21221 });
21222 }
21223
21224 let obj = self.parse_object_name(false)?;
21225 Ok(ResetStatement {
21226 reset: Reset::ConfigurationParameter(obj),
21227 })
21228 }
21229}
21230
21231fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
21232 if let Some(prefix) = prefix {
21233 Expr::Prefixed {
21234 prefix,
21235 value: Box::new(expr),
21236 }
21237 } else {
21238 expr
21239 }
21240}
21241
21242impl Word {
21243 #[inline]
21249 pub fn to_ident(&self, span: Span) -> Ident {
21250 Ident {
21251 value: self.value.clone(),
21252 quote_style: self.quote_style,
21253 span,
21254 }
21255 }
21256
21257 pub fn into_ident(self, span: Span) -> Ident {
21262 Ident {
21263 value: self.value,
21264 quote_style: self.quote_style,
21265 span,
21266 }
21267 }
21268}
21269
21270#[cfg(test)]
21271mod tests {
21272 use crate::test_utils::{all_dialects, TestedDialects};
21273
21274 use super::*;
21275
21276 #[test]
21277 fn test_prev_index() {
21278 let sql = "SELECT version";
21279 all_dialects().run_parser_method(sql, |parser| {
21280 assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
21281 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21282 parser.prev_token();
21283 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
21284 assert_eq!(parser.next_token(), Token::make_word("version", None));
21285 parser.prev_token();
21286 assert_eq!(parser.peek_token(), Token::make_word("version", None));
21287 assert_eq!(parser.next_token(), Token::make_word("version", None));
21288 assert_eq!(parser.peek_token(), Token::EOF);
21289 parser.prev_token();
21290 assert_eq!(parser.next_token(), Token::make_word("version", None));
21291 assert_eq!(parser.next_token(), Token::EOF);
21292 assert_eq!(parser.next_token(), Token::EOF);
21293 parser.prev_token();
21294 });
21295 }
21296
21297 #[test]
21298 fn test_peek_tokens() {
21299 all_dialects().run_parser_method("SELECT foo AS bar FROM baz", |parser| {
21300 assert!(matches!(
21301 parser.peek_tokens(),
21302 [Token::Word(Word {
21303 keyword: Keyword::SELECT,
21304 ..
21305 })]
21306 ));
21307
21308 assert!(matches!(
21309 parser.peek_tokens(),
21310 [
21311 Token::Word(Word {
21312 keyword: Keyword::SELECT,
21313 ..
21314 }),
21315 Token::Word(_),
21316 Token::Word(Word {
21317 keyword: Keyword::AS,
21318 ..
21319 }),
21320 ]
21321 ));
21322
21323 for _ in 0..4 {
21324 parser.next_token();
21325 }
21326
21327 assert!(matches!(
21328 parser.peek_tokens(),
21329 [
21330 Token::Word(Word {
21331 keyword: Keyword::FROM,
21332 ..
21333 }),
21334 Token::Word(_),
21335 Token::EOF,
21336 Token::EOF,
21337 ]
21338 ))
21339 })
21340 }
21341
21342 #[cfg(test)]
21343 mod test_parse_data_type {
21344 use crate::ast::{
21345 CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
21346 };
21347 use crate::dialect::{AnsiDialect, GenericDialect, PostgreSqlDialect};
21348 use crate::test_utils::TestedDialects;
21349
21350 macro_rules! test_parse_data_type {
21351 ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
21352 $dialect.run_parser_method(&*$input, |parser| {
21353 let data_type = parser.parse_data_type().unwrap();
21354 assert_eq!($expected_type, data_type);
21355 assert_eq!($input.to_string(), data_type.to_string());
21356 });
21357 }};
21358 }
21359
21360 #[test]
21361 fn test_ansii_character_string_types() {
21362 let dialect =
21364 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21365
21366 test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
21367
21368 test_parse_data_type!(
21369 dialect,
21370 "CHARACTER(20)",
21371 DataType::Character(Some(CharacterLength::IntegerLength {
21372 length: 20,
21373 unit: None
21374 }))
21375 );
21376
21377 test_parse_data_type!(
21378 dialect,
21379 "CHARACTER(20 CHARACTERS)",
21380 DataType::Character(Some(CharacterLength::IntegerLength {
21381 length: 20,
21382 unit: Some(CharLengthUnits::Characters)
21383 }))
21384 );
21385
21386 test_parse_data_type!(
21387 dialect,
21388 "CHARACTER(20 OCTETS)",
21389 DataType::Character(Some(CharacterLength::IntegerLength {
21390 length: 20,
21391 unit: Some(CharLengthUnits::Octets)
21392 }))
21393 );
21394
21395 test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
21396
21397 test_parse_data_type!(
21398 dialect,
21399 "CHAR(20)",
21400 DataType::Char(Some(CharacterLength::IntegerLength {
21401 length: 20,
21402 unit: None
21403 }))
21404 );
21405
21406 test_parse_data_type!(
21407 dialect,
21408 "CHAR(20 CHARACTERS)",
21409 DataType::Char(Some(CharacterLength::IntegerLength {
21410 length: 20,
21411 unit: Some(CharLengthUnits::Characters)
21412 }))
21413 );
21414
21415 test_parse_data_type!(
21416 dialect,
21417 "CHAR(20 OCTETS)",
21418 DataType::Char(Some(CharacterLength::IntegerLength {
21419 length: 20,
21420 unit: Some(CharLengthUnits::Octets)
21421 }))
21422 );
21423
21424 test_parse_data_type!(
21425 dialect,
21426 "CHARACTER VARYING(20)",
21427 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21428 length: 20,
21429 unit: None
21430 }))
21431 );
21432
21433 test_parse_data_type!(
21434 dialect,
21435 "CHARACTER VARYING(20 CHARACTERS)",
21436 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21437 length: 20,
21438 unit: Some(CharLengthUnits::Characters)
21439 }))
21440 );
21441
21442 test_parse_data_type!(
21443 dialect,
21444 "CHARACTER VARYING(20 OCTETS)",
21445 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
21446 length: 20,
21447 unit: Some(CharLengthUnits::Octets)
21448 }))
21449 );
21450
21451 test_parse_data_type!(
21452 dialect,
21453 "CHAR VARYING(20)",
21454 DataType::CharVarying(Some(CharacterLength::IntegerLength {
21455 length: 20,
21456 unit: None
21457 }))
21458 );
21459
21460 test_parse_data_type!(
21461 dialect,
21462 "CHAR VARYING(20 CHARACTERS)",
21463 DataType::CharVarying(Some(CharacterLength::IntegerLength {
21464 length: 20,
21465 unit: Some(CharLengthUnits::Characters)
21466 }))
21467 );
21468
21469 test_parse_data_type!(
21470 dialect,
21471 "CHAR VARYING(20 OCTETS)",
21472 DataType::CharVarying(Some(CharacterLength::IntegerLength {
21473 length: 20,
21474 unit: Some(CharLengthUnits::Octets)
21475 }))
21476 );
21477
21478 test_parse_data_type!(
21479 dialect,
21480 "VARCHAR(20)",
21481 DataType::Varchar(Some(CharacterLength::IntegerLength {
21482 length: 20,
21483 unit: None
21484 }))
21485 );
21486 }
21487
21488 #[test]
21489 fn test_ansii_character_large_object_types() {
21490 let dialect =
21492 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21493
21494 test_parse_data_type!(
21495 dialect,
21496 "CHARACTER LARGE OBJECT",
21497 DataType::CharacterLargeObject(None)
21498 );
21499 test_parse_data_type!(
21500 dialect,
21501 "CHARACTER LARGE OBJECT(20)",
21502 DataType::CharacterLargeObject(Some(20))
21503 );
21504
21505 test_parse_data_type!(
21506 dialect,
21507 "CHAR LARGE OBJECT",
21508 DataType::CharLargeObject(None)
21509 );
21510 test_parse_data_type!(
21511 dialect,
21512 "CHAR LARGE OBJECT(20)",
21513 DataType::CharLargeObject(Some(20))
21514 );
21515
21516 test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
21517 test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
21518 }
21519
21520 #[test]
21521 fn test_parse_custom_types() {
21522 let dialect =
21523 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21524
21525 test_parse_data_type!(
21526 dialect,
21527 "GEOMETRY",
21528 DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
21529 );
21530
21531 test_parse_data_type!(
21532 dialect,
21533 "GEOMETRY(POINT)",
21534 DataType::Custom(
21535 ObjectName::from(vec!["GEOMETRY".into()]),
21536 vec!["POINT".to_string()]
21537 )
21538 );
21539
21540 test_parse_data_type!(
21541 dialect,
21542 "GEOMETRY(POINT, 4326)",
21543 DataType::Custom(
21544 ObjectName::from(vec!["GEOMETRY".into()]),
21545 vec!["POINT".to_string(), "4326".to_string()]
21546 )
21547 );
21548 }
21549
21550 #[test]
21551 fn test_ansii_exact_numeric_types() {
21552 let dialect = TestedDialects::new(vec![
21554 Box::new(GenericDialect {}),
21555 Box::new(AnsiDialect {}),
21556 Box::new(PostgreSqlDialect {}),
21557 ]);
21558
21559 test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
21560
21561 test_parse_data_type!(
21562 dialect,
21563 "NUMERIC(2)",
21564 DataType::Numeric(ExactNumberInfo::Precision(2))
21565 );
21566
21567 test_parse_data_type!(
21568 dialect,
21569 "NUMERIC(2,10)",
21570 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
21571 );
21572
21573 test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
21574
21575 test_parse_data_type!(
21576 dialect,
21577 "DECIMAL(2)",
21578 DataType::Decimal(ExactNumberInfo::Precision(2))
21579 );
21580
21581 test_parse_data_type!(
21582 dialect,
21583 "DECIMAL(2,10)",
21584 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
21585 );
21586
21587 test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
21588
21589 test_parse_data_type!(
21590 dialect,
21591 "DEC(2)",
21592 DataType::Dec(ExactNumberInfo::Precision(2))
21593 );
21594
21595 test_parse_data_type!(
21596 dialect,
21597 "DEC(2,10)",
21598 DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
21599 );
21600
21601 test_parse_data_type!(
21603 dialect,
21604 "NUMERIC(10,-2)",
21605 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -2))
21606 );
21607
21608 test_parse_data_type!(
21609 dialect,
21610 "DECIMAL(1000,-10)",
21611 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(1000, -10))
21612 );
21613
21614 test_parse_data_type!(
21615 dialect,
21616 "DEC(5,-1000)",
21617 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -1000))
21618 );
21619
21620 test_parse_data_type!(
21621 dialect,
21622 "NUMERIC(10,-5)",
21623 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, -5))
21624 );
21625
21626 test_parse_data_type!(
21627 dialect,
21628 "DECIMAL(20,-10)",
21629 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(20, -10))
21630 );
21631
21632 test_parse_data_type!(
21633 dialect,
21634 "DEC(5,-2)",
21635 DataType::Dec(ExactNumberInfo::PrecisionAndScale(5, -2))
21636 );
21637
21638 dialect.run_parser_method("NUMERIC(10,+5)", |parser| {
21639 let data_type = parser.parse_data_type().unwrap();
21640 assert_eq!(
21641 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(10, 5)),
21642 data_type
21643 );
21644 assert_eq!("NUMERIC(10,5)", data_type.to_string());
21646 });
21647 }
21648
21649 #[test]
21650 fn test_ansii_date_type() {
21651 let dialect =
21653 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})]);
21654
21655 test_parse_data_type!(dialect, "DATE", DataType::Date);
21656
21657 test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
21658
21659 test_parse_data_type!(
21660 dialect,
21661 "TIME(6)",
21662 DataType::Time(Some(6), TimezoneInfo::None)
21663 );
21664
21665 test_parse_data_type!(
21666 dialect,
21667 "TIME WITH TIME ZONE",
21668 DataType::Time(None, TimezoneInfo::WithTimeZone)
21669 );
21670
21671 test_parse_data_type!(
21672 dialect,
21673 "TIME(6) WITH TIME ZONE",
21674 DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
21675 );
21676
21677 test_parse_data_type!(
21678 dialect,
21679 "TIME WITHOUT TIME ZONE",
21680 DataType::Time(None, TimezoneInfo::WithoutTimeZone)
21681 );
21682
21683 test_parse_data_type!(
21684 dialect,
21685 "TIME(6) WITHOUT TIME ZONE",
21686 DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
21687 );
21688
21689 test_parse_data_type!(
21690 dialect,
21691 "TIMESTAMP",
21692 DataType::Timestamp(None, TimezoneInfo::None)
21693 );
21694
21695 test_parse_data_type!(
21696 dialect,
21697 "TIMESTAMP(22)",
21698 DataType::Timestamp(Some(22), TimezoneInfo::None)
21699 );
21700
21701 test_parse_data_type!(
21702 dialect,
21703 "TIMESTAMP(22) WITH TIME ZONE",
21704 DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
21705 );
21706
21707 test_parse_data_type!(
21708 dialect,
21709 "TIMESTAMP(33) WITHOUT TIME ZONE",
21710 DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
21711 );
21712 }
21713 }
21714
21715 #[test]
21716 fn test_parse_schema_name() {
21717 macro_rules! test_parse_schema_name {
21719 ($input:expr, $expected_name:expr $(,)?) => {{
21720 all_dialects().run_parser_method(&*$input, |parser| {
21721 let schema_name = parser.parse_schema_name().unwrap();
21722 assert_eq!(schema_name, $expected_name);
21724 assert_eq!(schema_name.to_string(), $input.to_string());
21726 });
21727 }};
21728 }
21729
21730 let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
21731 let dummy_authorization = Ident::new("dummy_authorization");
21732
21733 test_parse_schema_name!(
21734 format!("{dummy_name}"),
21735 SchemaName::Simple(dummy_name.clone())
21736 );
21737
21738 test_parse_schema_name!(
21739 format!("AUTHORIZATION {dummy_authorization}"),
21740 SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
21741 );
21742 test_parse_schema_name!(
21743 format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
21744 SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
21745 );
21746 }
21747
21748 #[test]
21749 fn mysql_parse_index_table_constraint() {
21750 macro_rules! test_parse_table_constraint {
21751 ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
21752 $dialect.run_parser_method(&*$input, |parser| {
21753 let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
21754 assert_eq!(constraint, $expected);
21756 assert_eq!(constraint.to_string(), $input.to_string());
21758 });
21759 }};
21760 }
21761
21762 fn mk_expected_col(name: &str) -> IndexColumn {
21763 IndexColumn {
21764 column: OrderByExpr {
21765 expr: Expr::Identifier(name.into()),
21766 options: OrderByOptions {
21767 sort: None,
21768 nulls_first: None,
21769 },
21770 with_fill: None,
21771 },
21772 operator_class: None,
21773 }
21774 }
21775
21776 let dialect =
21777 TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
21778
21779 test_parse_table_constraint!(
21780 dialect,
21781 "INDEX (c1)",
21782 IndexConstraint {
21783 display_as_key: false,
21784 name: None,
21785 index_type: None,
21786 columns: vec![mk_expected_col("c1")],
21787 index_options: vec![],
21788 }
21789 .into()
21790 );
21791
21792 test_parse_table_constraint!(
21793 dialect,
21794 "KEY (c1)",
21795 IndexConstraint {
21796 display_as_key: true,
21797 name: None,
21798 index_type: None,
21799 columns: vec![mk_expected_col("c1")],
21800 index_options: vec![],
21801 }
21802 .into()
21803 );
21804
21805 test_parse_table_constraint!(
21806 dialect,
21807 "INDEX 'index' (c1, c2)",
21808 TableConstraint::Index(IndexConstraint {
21809 display_as_key: false,
21810 name: Some(Ident::with_quote('\'', "index")),
21811 index_type: None,
21812 columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
21813 index_options: vec![],
21814 })
21815 );
21816
21817 test_parse_table_constraint!(
21818 dialect,
21819 "INDEX USING BTREE (c1)",
21820 IndexConstraint {
21821 display_as_key: false,
21822 name: None,
21823 index_type: Some(IndexType::BTree),
21824 columns: vec![mk_expected_col("c1")],
21825 index_options: vec![],
21826 }
21827 .into()
21828 );
21829
21830 test_parse_table_constraint!(
21831 dialect,
21832 "INDEX USING HASH (c1)",
21833 IndexConstraint {
21834 display_as_key: false,
21835 name: None,
21836 index_type: Some(IndexType::Hash),
21837 columns: vec![mk_expected_col("c1")],
21838 index_options: vec![],
21839 }
21840 .into()
21841 );
21842
21843 test_parse_table_constraint!(
21844 dialect,
21845 "INDEX idx_name USING BTREE (c1)",
21846 IndexConstraint {
21847 display_as_key: false,
21848 name: Some(Ident::new("idx_name")),
21849 index_type: Some(IndexType::BTree),
21850 columns: vec![mk_expected_col("c1")],
21851 index_options: vec![],
21852 }
21853 .into()
21854 );
21855
21856 test_parse_table_constraint!(
21857 dialect,
21858 "INDEX idx_name USING HASH (c1)",
21859 IndexConstraint {
21860 display_as_key: false,
21861 name: Some(Ident::new("idx_name")),
21862 index_type: Some(IndexType::Hash),
21863 columns: vec![mk_expected_col("c1")],
21864 index_options: vec![],
21865 }
21866 .into()
21867 );
21868 }
21869
21870 #[test]
21871 fn test_tokenizer_error_loc() {
21872 let sql = "foo '";
21873 let ast = Parser::parse_sql(&GenericDialect, sql);
21874 assert_eq!(
21875 ast,
21876 Err(ParserError::TokenizerError(
21877 "Unterminated string literal at Line: 1, Column: 5".to_string()
21878 ))
21879 );
21880 }
21881
21882 #[test]
21883 fn test_parser_error_loc() {
21884 let sql = "SELECT this is a syntax error";
21885 let ParserError::ParserError(msg) = Parser::parse_sql(&GenericDialect, sql).unwrap_err()
21886 else {
21887 panic!("expected ParserError::ParserError");
21888 };
21889 assert!(
21890 msg.ends_with("found: a at Line: 1, Column: 16"),
21891 "unexpected error message: {msg}"
21892 );
21893 }
21894
21895 #[test]
21896 fn test_nested_explain_error() {
21897 let sql = "EXPLAIN EXPLAIN SELECT 1";
21898 let ast = Parser::parse_sql(&GenericDialect, sql);
21899 assert_eq!(
21900 ast,
21901 Err(ParserError::ParserError(
21902 "Explain must be root of the plan".to_string()
21903 ))
21904 );
21905 }
21906
21907 #[test]
21908 fn test_parse_multipart_identifier_positive() {
21909 let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
21910
21911 let expected = vec![
21913 Ident {
21914 value: "CATALOG".to_string(),
21915 quote_style: None,
21916 span: Span::empty(),
21917 },
21918 Ident {
21919 value: "F(o)o. \"bar".to_string(),
21920 quote_style: Some('"'),
21921 span: Span::empty(),
21922 },
21923 Ident {
21924 value: "table".to_string(),
21925 quote_style: None,
21926 span: Span::empty(),
21927 },
21928 ];
21929 dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
21930 let actual = parser.parse_multipart_identifier().unwrap();
21931 assert_eq!(expected, actual);
21932 });
21933
21934 let expected = vec![
21936 Ident {
21937 value: "CATALOG".to_string(),
21938 quote_style: None,
21939 span: Span::empty(),
21940 },
21941 Ident {
21942 value: "table".to_string(),
21943 quote_style: None,
21944 span: Span::empty(),
21945 },
21946 ];
21947 dialect.run_parser_method("CATALOG . table", |parser| {
21948 let actual = parser.parse_multipart_identifier().unwrap();
21949 assert_eq!(expected, actual);
21950 });
21951 }
21952
21953 #[test]
21954 fn test_parse_multipart_identifier_negative() {
21955 macro_rules! test_parse_multipart_identifier_error {
21956 ($input:expr, $expected_err:expr $(,)?) => {{
21957 all_dialects().run_parser_method(&*$input, |parser| {
21958 let actual_err = parser.parse_multipart_identifier().unwrap_err();
21959 assert_eq!(actual_err.to_string(), $expected_err);
21960 });
21961 }};
21962 }
21963
21964 test_parse_multipart_identifier_error!(
21965 "",
21966 "sql parser error: Empty input when parsing identifier",
21967 );
21968
21969 test_parse_multipart_identifier_error!(
21970 "*schema.table",
21971 "sql parser error: Unexpected token in identifier: *",
21972 );
21973
21974 test_parse_multipart_identifier_error!(
21975 "schema.table*",
21976 "sql parser error: Unexpected token in identifier: *",
21977 );
21978
21979 test_parse_multipart_identifier_error!(
21980 "schema.table.",
21981 "sql parser error: Trailing period in identifier",
21982 );
21983
21984 test_parse_multipart_identifier_error!(
21985 "schema.*",
21986 "sql parser error: Unexpected token following period in identifier: *",
21987 );
21988 }
21989
21990 #[test]
21991 fn test_mysql_partition_selection() {
21992 let sql = "SELECT * FROM employees PARTITION (p0, p2)";
21993 let expected = vec!["p0", "p2"];
21994
21995 let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
21996 assert_eq!(ast.len(), 1);
21997 if let Statement::Query(v) = &ast[0] {
21998 if let SetExpr::Select(select) = &*v.body {
21999 assert_eq!(select.from.len(), 1);
22000 let from: &TableWithJoins = &select.from[0];
22001 let table_factor = &from.relation;
22002 if let TableFactor::Table { partitions, .. } = table_factor {
22003 let actual: Vec<&str> = partitions
22004 .iter()
22005 .map(|ident| ident.value.as_str())
22006 .collect();
22007 assert_eq!(expected, actual);
22008 }
22009 }
22010 } else {
22011 panic!("fail to parse mysql partition selection");
22012 }
22013 }
22014
22015 #[test]
22016 fn test_replace_into_placeholders() {
22017 let sql = "REPLACE INTO t (a) VALUES (&a)";
22018
22019 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22020 }
22021
22022 #[test]
22023 fn test_replace_into_set_placeholder() {
22024 let sql = "REPLACE INTO t SET ?";
22025
22026 assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
22027 }
22028
22029 #[test]
22030 fn test_replace_incomplete() {
22031 let sql = r#"REPLACE"#;
22032
22033 assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
22034 }
22035
22036 #[test]
22037 fn test_placeholder_invalid_whitespace() {
22038 for w in [" ", "/*invalid*/"] {
22039 let sql = format!("\nSELECT\n :{w}fooBar");
22040 assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
22041 }
22042 }
22043}