1#[cfg(not(feature = "std"))]
16use alloc::{
17 boxed::Box,
18 format,
19 string::{String, ToString},
20 vec,
21 vec::Vec,
22};
23use core::fmt;
24
25use log::debug;
26
27use IsLateral::*;
28use IsOptional::*;
29
30use crate::ast::helpers::stmt_create_table::{BigQueryTableConfiguration, CreateTableBuilder};
31use crate::ast::*;
32use crate::dialect::*;
33use crate::keywords::{self, Keyword, ALL_KEYWORDS};
34use crate::tokenizer::*;
35
36mod alter;
37
38#[derive(Debug, Clone, PartialEq, Eq)]
39pub enum ParserError {
40 TokenizerError(String),
41 ParserError(String),
42 RecursionLimitExceeded,
43}
44
45macro_rules! parser_err {
47 ($MSG:expr, $loc:expr) => {
48 Err(ParserError::ParserError(format!("{}{}", $MSG, $loc)))
49 };
50}
51
52macro_rules! return_ok_if_some {
54 ($e:expr) => {{
55 if let Some(v) = $e {
56 return Ok(v);
57 }
58 }};
59}
60
61#[cfg(feature = "std")]
62mod recursion {
64 use std::cell::Cell;
65 use std::rc::Rc;
66
67 use super::ParserError;
68
69 pub(crate) struct RecursionCounter {
77 remaining_depth: Rc<Cell<usize>>,
78 }
79
80 impl RecursionCounter {
81 pub fn new(remaining_depth: usize) -> Self {
84 Self {
85 remaining_depth: Rc::new(remaining_depth.into()),
86 }
87 }
88
89 pub fn try_decrease(&self) -> Result<DepthGuard, ParserError> {
96 let old_value = self.remaining_depth.get();
97 if old_value == 0 {
99 Err(ParserError::RecursionLimitExceeded)
100 } else {
101 self.remaining_depth.set(old_value - 1);
102 Ok(DepthGuard::new(Rc::clone(&self.remaining_depth)))
103 }
104 }
105 }
106
107 pub struct DepthGuard {
109 remaining_depth: Rc<Cell<usize>>,
110 }
111
112 impl DepthGuard {
113 fn new(remaining_depth: Rc<Cell<usize>>) -> Self {
114 Self { remaining_depth }
115 }
116 }
117 impl Drop for DepthGuard {
118 fn drop(&mut self) {
119 let old_value = self.remaining_depth.get();
120 self.remaining_depth.set(old_value + 1);
121 }
122 }
123}
124
125#[cfg(not(feature = "std"))]
126mod recursion {
127 pub(crate) struct RecursionCounter {}
133
134 impl RecursionCounter {
135 pub fn new(_remaining_depth: usize) -> Self {
136 Self {}
137 }
138 pub fn try_decrease(&self) -> Result<DepthGuard, super::ParserError> {
139 Ok(DepthGuard {})
140 }
141 }
142
143 pub struct DepthGuard {}
144}
145
146use recursion::RecursionCounter;
147
148#[derive(PartialEq, Eq)]
149pub enum IsOptional {
150 Optional,
151 Mandatory,
152}
153
154pub enum IsLateral {
155 Lateral,
156 NotLateral,
157}
158
159pub enum WildcardExpr {
160 Expr(Expr),
161 QualifiedWildcard(ObjectName),
162 Wildcard,
163}
164
165impl From<TokenizerError> for ParserError {
166 fn from(e: TokenizerError) -> Self {
167 ParserError::TokenizerError(e.to_string())
168 }
169}
170
171impl fmt::Display for ParserError {
172 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
173 write!(
174 f,
175 "sql parser error: {}",
176 match self {
177 ParserError::TokenizerError(s) => s,
178 ParserError::ParserError(s) => s,
179 ParserError::RecursionLimitExceeded => "recursion limit exceeded",
180 }
181 )
182 }
183}
184
185#[cfg(feature = "std")]
186impl std::error::Error for ParserError {}
187
188const DEFAULT_REMAINING_DEPTH: usize = 50;
190
191struct MatchedTrailingBracket(bool);
204
205impl From<bool> for MatchedTrailingBracket {
206 fn from(value: bool) -> Self {
207 Self(value)
208 }
209}
210
211#[derive(Debug, Clone, PartialEq, Eq)]
213pub struct ParserOptions {
214 pub trailing_commas: bool,
215 pub unescape: bool,
218}
219
220impl Default for ParserOptions {
221 fn default() -> Self {
222 Self {
223 trailing_commas: false,
224 unescape: true,
225 }
226 }
227}
228
229impl ParserOptions {
230 pub fn new() -> Self {
232 Default::default()
233 }
234
235 pub fn with_trailing_commas(mut self, trailing_commas: bool) -> Self {
247 self.trailing_commas = trailing_commas;
248 self
249 }
250
251 pub fn with_unescape(mut self, unescape: bool) -> Self {
254 self.unescape = unescape;
255 self
256 }
257}
258
259pub struct Parser<'a> {
260 tokens: Vec<TokenWithLocation>,
261 index: usize,
263 dialect: &'a dyn Dialect,
265 options: ParserOptions,
269 recursion_counter: RecursionCounter,
271}
272
273impl<'a> Parser<'a> {
274 pub fn new(dialect: &'a dyn Dialect) -> Self {
290 Self {
291 tokens: vec![],
292 index: 0,
293 dialect,
294 recursion_counter: RecursionCounter::new(DEFAULT_REMAINING_DEPTH),
295 options: ParserOptions::default(),
296 }
297 }
298
299 pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
320 self.recursion_counter = RecursionCounter::new(recursion_limit);
321 self
322 }
323
324 pub fn with_options(mut self, options: ParserOptions) -> Self {
348 self.options = options;
349 self
350 }
351
352 pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithLocation>) -> Self {
354 self.tokens = tokens;
355 self.index = 0;
356 self
357 }
358
359 pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
361 let tokens_with_locations: Vec<TokenWithLocation> = tokens
363 .into_iter()
364 .map(|token| TokenWithLocation {
365 token,
366 location: Location { line: 0, column: 0 },
367 })
368 .collect();
369 self.with_tokens_with_locations(tokens_with_locations)
370 }
371
372 pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
379 debug!("Parsing sql '{}'...", sql);
380 let tokens = Tokenizer::new(self.dialect, sql)
381 .with_unescape(self.options.unescape)
382 .tokenize_with_location()?;
383 Ok(self.with_tokens_with_locations(tokens))
384 }
385
386 pub fn parse_statements(&mut self) -> Result<Vec<Statement>, ParserError> {
402 let mut stmts = Vec::new();
403 let mut expecting_statement_delimiter = false;
404 loop {
405 while self.consume_token(&Token::SemiColon) {
407 expecting_statement_delimiter = false;
408 }
409
410 match self.peek_token().token {
411 Token::EOF => break,
412
413 Token::Word(word) => {
415 if expecting_statement_delimiter && word.keyword == Keyword::END {
416 break;
417 }
418 }
419 _ => {}
420 }
421
422 if expecting_statement_delimiter {
423 return self.expected("end of statement", self.peek_token());
424 }
425
426 let statement = self.parse_statement()?;
427 stmts.push(statement);
428 expecting_statement_delimiter = true;
429 }
430 Ok(stmts)
431 }
432
433 pub fn parse_sql(dialect: &dyn Dialect, sql: &str) -> Result<Vec<Statement>, ParserError> {
449 Parser::new(dialect).try_with_sql(sql)?.parse_statements()
450 }
451
452 pub fn parse_statement(&mut self) -> Result<Statement, ParserError> {
455 let _guard = self.recursion_counter.try_decrease()?;
456
457 if let Some(statement) = self.dialect.parse_statement(self) {
459 return statement;
460 }
461
462 let next_token = self.next_token();
463 match &next_token.token {
464 Token::Word(w) => match w.keyword {
465 Keyword::KILL => Ok(self.parse_kill()?),
466 Keyword::FLUSH => Ok(self.parse_flush()?),
467 Keyword::DESCRIBE => Ok(self.parse_explain(true)?),
468 Keyword::EXPLAIN => Ok(self.parse_explain(false)?),
469 Keyword::ANALYZE => Ok(self.parse_analyze()?),
470 Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
471 self.prev_token();
472 Ok(Statement::Query(Box::new(self.parse_query()?)))
473 }
474 Keyword::TRUNCATE => Ok(self.parse_truncate()?),
475 Keyword::ATTACH => Ok(self.parse_attach_database()?),
476 Keyword::MSCK => Ok(self.parse_msck()?),
477 Keyword::CREATE => Ok(self.parse_create()?),
478 Keyword::CACHE => Ok(self.parse_cache_table()?),
479 Keyword::DROP => Ok(self.parse_drop()?),
480 Keyword::DISCARD => Ok(self.parse_discard()?),
481 Keyword::DECLARE => Ok(self.parse_declare()?),
482 Keyword::FETCH => Ok(self.parse_fetch_statement()?),
483 Keyword::DELETE => Ok(self.parse_delete()?),
484 Keyword::INSERT => Ok(self.parse_insert()?),
485 Keyword::REPLACE => Ok(self.parse_replace()?),
486 Keyword::UNCACHE => Ok(self.parse_uncache_table()?),
487 Keyword::UPDATE => Ok(self.parse_update()?),
488 Keyword::ALTER => Ok(self.parse_alter()?),
489 Keyword::CALL => Ok(self.parse_call()?),
490 Keyword::COPY => Ok(self.parse_copy()?),
491 Keyword::CLOSE => Ok(self.parse_close()?),
492 Keyword::SET => Ok(self.parse_set()?),
493 Keyword::SHOW => Ok(self.parse_show()?),
494 Keyword::USE => Ok(self.parse_use()?),
495 Keyword::GRANT => Ok(self.parse_grant()?),
496 Keyword::REVOKE => Ok(self.parse_revoke()?),
497 Keyword::START => Ok(self.parse_start_transaction()?),
498 Keyword::BEGIN => Ok(self.parse_begin()?),
502 Keyword::END => Ok(self.parse_end()?),
506 Keyword::SAVEPOINT => Ok(self.parse_savepoint()?),
507 Keyword::RELEASE => Ok(self.parse_release()?),
508 Keyword::COMMIT => Ok(self.parse_commit()?),
509 Keyword::ROLLBACK => Ok(self.parse_rollback()?),
510 Keyword::ASSERT => Ok(self.parse_assert()?),
511 Keyword::DEALLOCATE => Ok(self.parse_deallocate()?),
514 Keyword::EXECUTE => Ok(self.parse_execute()?),
515 Keyword::PREPARE => Ok(self.parse_prepare()?),
516 Keyword::MERGE => Ok(self.parse_merge()?),
517 Keyword::PRAGMA => Ok(self.parse_pragma()?),
519 _ => self.expected("an SQL statement", next_token),
520 },
521 Token::LParen => {
522 self.prev_token();
523 Ok(Statement::Query(Box::new(self.parse_query()?)))
524 }
525 _ => self.expected("an SQL statement", next_token),
526 }
527 }
528
529 pub fn parse_flush(&mut self) -> Result<Statement, ParserError> {
530 let mut channel = None;
531 let mut tables: Vec<ObjectName> = vec![];
532 let mut read_lock = false;
533 let mut export = false;
534
535 if !dialect_of!(self is MySqlDialect | GenericDialect) {
536 return parser_err!("Unsupported statement FLUSH", self.peek_token().location);
537 }
538
539 let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
540 Some(FlushLocation::NoWriteToBinlog)
541 } else if self.parse_keyword(Keyword::LOCAL) {
542 Some(FlushLocation::Local)
543 } else {
544 None
545 };
546
547 let object_type = if self.parse_keywords(&[Keyword::BINARY, Keyword::LOGS]) {
548 FlushType::BinaryLogs
549 } else if self.parse_keywords(&[Keyword::ENGINE, Keyword::LOGS]) {
550 FlushType::EngineLogs
551 } else if self.parse_keywords(&[Keyword::ERROR, Keyword::LOGS]) {
552 FlushType::ErrorLogs
553 } else if self.parse_keywords(&[Keyword::GENERAL, Keyword::LOGS]) {
554 FlushType::GeneralLogs
555 } else if self.parse_keywords(&[Keyword::HOSTS]) {
556 FlushType::Hosts
557 } else if self.parse_keyword(Keyword::PRIVILEGES) {
558 FlushType::Privileges
559 } else if self.parse_keyword(Keyword::OPTIMIZER_COSTS) {
560 FlushType::OptimizerCosts
561 } else if self.parse_keywords(&[Keyword::RELAY, Keyword::LOGS]) {
562 if self.parse_keywords(&[Keyword::FOR, Keyword::CHANNEL]) {
563 channel = Some(self.parse_object_name(false).unwrap().to_string());
564 }
565 FlushType::RelayLogs
566 } else if self.parse_keywords(&[Keyword::SLOW, Keyword::LOGS]) {
567 FlushType::SlowLogs
568 } else if self.parse_keyword(Keyword::STATUS) {
569 FlushType::Status
570 } else if self.parse_keyword(Keyword::USER_RESOURCES) {
571 FlushType::UserResources
572 } else if self.parse_keywords(&[Keyword::LOGS]) {
573 FlushType::Logs
574 } else if self.parse_keywords(&[Keyword::TABLES]) {
575 loop {
576 let next_token = self.next_token();
577 match &next_token.token {
578 Token::Word(w) => match w.keyword {
579 Keyword::WITH => {
580 read_lock = self.parse_keywords(&[Keyword::READ, Keyword::LOCK]);
581 }
582 Keyword::FOR => {
583 export = self.parse_keyword(Keyword::EXPORT);
584 }
585 Keyword::NoKeyword => {
586 self.prev_token();
587 tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
588 }
589 _ => {}
590 },
591 _ => {
592 break;
593 }
594 }
595 }
596
597 FlushType::Tables
598 } else {
599 return self.expected(
600 "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
601 RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, USER_RESOURCES",
602 self.peek_token(),
603 );
604 };
605
606 Ok(Statement::Flush {
607 object_type,
608 location,
609 channel,
610 read_lock,
611 export,
612 tables,
613 })
614 }
615
616 pub fn parse_msck(&mut self) -> Result<Statement, ParserError> {
617 let repair = self.parse_keyword(Keyword::REPAIR);
618 self.expect_keyword(Keyword::TABLE)?;
619 let table_name = self.parse_object_name(false)?;
620 let partition_action = self
621 .maybe_parse(|parser| {
622 let pa = match parser.parse_one_of_keywords(&[
623 Keyword::ADD,
624 Keyword::DROP,
625 Keyword::SYNC,
626 ]) {
627 Some(Keyword::ADD) => Some(AddDropSync::ADD),
628 Some(Keyword::DROP) => Some(AddDropSync::DROP),
629 Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
630 _ => None,
631 };
632 parser.expect_keyword(Keyword::PARTITIONS)?;
633 Ok(pa)
634 })
635 .unwrap_or_default();
636 Ok(Statement::Msck {
637 repair,
638 table_name,
639 partition_action,
640 })
641 }
642
643 pub fn parse_truncate(&mut self) -> Result<Statement, ParserError> {
644 let table = self.parse_keyword(Keyword::TABLE);
645 let table_name = self.parse_object_name(false)?;
646 let mut partitions = None;
647 if self.parse_keyword(Keyword::PARTITION) {
648 self.expect_token(&Token::LParen)?;
649 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
650 self.expect_token(&Token::RParen)?;
651 }
652 Ok(Statement::Truncate {
653 table_name,
654 partitions,
655 table,
656 })
657 }
658
659 pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
660 let database = self.parse_keyword(Keyword::DATABASE);
661 let database_file_name = self.parse_expr()?;
662 self.expect_keyword(Keyword::AS)?;
663 let schema_name = self.parse_identifier(false)?;
664 Ok(Statement::AttachDatabase {
665 database,
666 schema_name,
667 database_file_name,
668 })
669 }
670
671 pub fn parse_analyze(&mut self) -> Result<Statement, ParserError> {
672 self.expect_keyword(Keyword::TABLE)?;
673 let table_name = self.parse_object_name(false)?;
674 let mut for_columns = false;
675 let mut cache_metadata = false;
676 let mut noscan = false;
677 let mut partitions = None;
678 let mut compute_statistics = false;
679 let mut columns = vec![];
680 loop {
681 match self.parse_one_of_keywords(&[
682 Keyword::PARTITION,
683 Keyword::FOR,
684 Keyword::CACHE,
685 Keyword::NOSCAN,
686 Keyword::COMPUTE,
687 ]) {
688 Some(Keyword::PARTITION) => {
689 self.expect_token(&Token::LParen)?;
690 partitions = Some(self.parse_comma_separated(Parser::parse_expr)?);
691 self.expect_token(&Token::RParen)?;
692 }
693 Some(Keyword::NOSCAN) => noscan = true,
694 Some(Keyword::FOR) => {
695 self.expect_keyword(Keyword::COLUMNS)?;
696
697 columns = self
698 .maybe_parse(|parser| {
699 parser.parse_comma_separated(|p| p.parse_identifier(false))
700 })
701 .unwrap_or_default();
702 for_columns = true
703 }
704 Some(Keyword::CACHE) => {
705 self.expect_keyword(Keyword::METADATA)?;
706 cache_metadata = true
707 }
708 Some(Keyword::COMPUTE) => {
709 self.expect_keyword(Keyword::STATISTICS)?;
710 compute_statistics = true
711 }
712 _ => break,
713 }
714 }
715
716 Ok(Statement::Analyze {
717 table_name,
718 for_columns,
719 columns,
720 partitions,
721 cache_metadata,
722 noscan,
723 compute_statistics,
724 })
725 }
726
727 pub fn parse_wildcard_expr(&mut self) -> Result<Expr, ParserError> {
729 let index = self.index;
730
731 let next_token = self.next_token();
732 match next_token.token {
733 t @ (Token::Word(_) | Token::SingleQuotedString(_)) => {
734 if self.peek_token().token == Token::Period {
735 let mut id_parts: Vec<Ident> = vec![match t {
736 Token::Word(w) => w.to_ident(),
737 Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
738 _ => unreachable!(), }];
740
741 while self.consume_token(&Token::Period) {
742 let next_token = self.next_token();
743 match next_token.token {
744 Token::Word(w) => id_parts.push(w.to_ident()),
745 Token::SingleQuotedString(s) => {
746 id_parts.push(Ident::with_quote('\'', s))
748 }
749 Token::Mul => {
750 return Ok(Expr::QualifiedWildcard(ObjectName(id_parts)));
751 }
752 _ => {
753 return self
754 .expected("an identifier or a '*' after '.'", next_token);
755 }
756 }
757 }
758 }
759 }
760 Token::Mul => {
761 return Ok(Expr::Wildcard);
762 }
763 _ => (),
764 };
765
766 self.index = index;
767 self.parse_expr()
768 }
769
770 pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
772 let _guard = self.recursion_counter.try_decrease()?;
773 self.parse_subexpr(0)
774 }
775
776 pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
778 debug!("parsing expr");
779 let mut expr = self.parse_prefix()?;
780 debug!("prefix: {:?}", expr);
781 loop {
782 let next_precedence = self.get_next_precedence()?;
783 debug!("next precedence: {:?}", next_precedence);
784
785 if precedence >= next_precedence {
786 break;
787 }
788
789 expr = self.parse_infix(expr, next_precedence)?;
790 }
791 Ok(expr)
792 }
793
794 pub fn parse_interval_expr(&mut self) -> Result<Expr, ParserError> {
795 let precedence = 0;
796 let mut expr = self.parse_prefix()?;
797
798 loop {
799 let next_precedence = self.get_next_interval_precedence()?;
800
801 if precedence >= next_precedence {
802 break;
803 }
804
805 expr = self.parse_infix(expr, next_precedence)?;
806 }
807
808 Ok(expr)
809 }
810
811 pub fn get_next_interval_precedence(&self) -> Result<u8, ParserError> {
814 let token = self.peek_token();
815
816 match token.token {
817 Token::Word(w) if w.keyword == Keyword::AND => Ok(0),
818 Token::Word(w) if w.keyword == Keyword::OR => Ok(0),
819 Token::Word(w) if w.keyword == Keyword::XOR => Ok(0),
820 _ => self.get_next_precedence(),
821 }
822 }
823
824 pub fn parse_assert(&mut self) -> Result<Statement, ParserError> {
825 let condition = self.parse_expr()?;
826 let message = if self.parse_keyword(Keyword::AS) {
827 Some(self.parse_expr()?)
828 } else {
829 None
830 };
831
832 Ok(Statement::Assert { condition, message })
833 }
834
835 pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
836 let name = self.parse_identifier(false)?;
837 Ok(Statement::Savepoint { name })
838 }
839
840 pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
841 let _ = self.parse_keyword(Keyword::SAVEPOINT);
842 let name = self.parse_identifier(false)?;
843
844 Ok(Statement::ReleaseSavepoint { name })
845 }
846
847 pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
849 if let Some(prefix) = self.dialect.parse_prefix(self) {
851 return prefix;
852 }
853
854 let loc = self.peek_token().location;
871 return_ok_if_some!(self.maybe_parse(|parser| {
872 match parser.parse_data_type()? {
873 DataType::Interval => parser.parse_interval(),
874 DataType::Custom(..) => parser_err!("dummy", loc),
882 data_type => Ok(Expr::TypedString {
883 data_type,
884 value: parser.parse_literal_string()?,
885 }),
886 }
887 }));
888
889 let next_token = self.next_token();
890 let expr = match next_token.token {
891 Token::Word(w) => match w.keyword {
892 Keyword::TRUE | Keyword::FALSE | Keyword::NULL => {
893 self.prev_token();
894 Ok(Expr::Value(self.parse_value()?))
895 }
896 Keyword::CURRENT_CATALOG
897 | Keyword::CURRENT_USER
898 | Keyword::SESSION_USER
899 | Keyword::USER
900 if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
901 {
902 Ok(Expr::Function(Function {
903 name: ObjectName(vec![w.to_ident()]),
904 args: vec![],
905 null_treatment: None,
906 filter: None,
907 over: None,
908 distinct: false,
909 special: true,
910 order_by: vec![],
911 }))
912 }
913 Keyword::CURRENT_TIMESTAMP
914 | Keyword::CURRENT_TIME
915 | Keyword::CURRENT_DATE
916 | Keyword::LOCALTIME
917 | Keyword::LOCALTIMESTAMP => {
918 self.parse_time_functions(ObjectName(vec![w.to_ident()]))
919 }
920 Keyword::CASE => self.parse_case_expr(),
921 Keyword::CONVERT => self.parse_convert_expr(),
922 Keyword::CAST => self.parse_cast_expr(),
923 Keyword::TRY_CAST => self.parse_try_cast_expr(),
924 Keyword::SAFE_CAST => self.parse_safe_cast_expr(),
925 Keyword::EXISTS => self.parse_exists_expr(false),
926 Keyword::EXTRACT => self.parse_extract_expr(),
927 Keyword::CEIL => self.parse_ceil_floor_expr(true),
928 Keyword::FLOOR => self.parse_ceil_floor_expr(false),
929 Keyword::POSITION if self.peek_token().token == Token::LParen => {
930 self.parse_position_expr()
931 }
932 Keyword::SUBSTRING => self.parse_substring_expr(),
933 Keyword::OVERLAY => self.parse_overlay_expr(),
934 Keyword::TRIM => self.parse_trim_expr(),
935 Keyword::INTERVAL => self.parse_interval(),
936 Keyword::LISTAGG => self.parse_listagg_expr(),
937 Keyword::ARRAY if self.peek_token() == Token::LBracket => {
939 self.expect_token(&Token::LBracket)?;
940 self.parse_array_expr(true)
941 }
942 Keyword::ARRAY
943 if self.peek_token() == Token::LParen
944 && !dialect_of!(self is ClickHouseDialect) =>
945 {
946 self.expect_token(&Token::LParen)?;
947 self.parse_array_subquery()
948 }
949 Keyword::ARRAY_AGG => self.parse_array_agg_expr(),
950 Keyword::NOT => self.parse_not(),
951 Keyword::MATCH if dialect_of!(self is MySqlDialect | GenericDialect) => {
952 self.parse_match_against()
953 }
954 Keyword::STRUCT if dialect_of!(self is BigQueryDialect | GenericDialect) => {
955 self.prev_token();
956 self.parse_bigquery_struct_literal()
957 }
958 _ => match self.peek_token().token {
961 Token::LParen | Token::Period => {
962 let mut id_parts: Vec<Ident> = vec![w.to_ident()];
963 let mut ends_with_wildcard = false;
964 while self.consume_token(&Token::Period) {
965 let next_token = self.next_token();
966 match next_token.token {
967 Token::Word(w) => id_parts.push(w.to_ident()),
968 Token::Mul => {
969 if dialect_of!(self is PostgreSqlDialect) {
972 ends_with_wildcard = true;
973 break;
974 } else {
975 return self
976 .expected("an identifier after '.'", next_token);
977 }
978 }
979 Token::SingleQuotedString(s) => {
980 id_parts.push(Ident::with_quote('\'', s))
981 }
982 _ => {
983 return self
984 .expected("an identifier or a '*' after '.'", next_token);
985 }
986 }
987 }
988
989 if ends_with_wildcard {
990 Ok(Expr::QualifiedWildcard(ObjectName(id_parts)))
991 } else if self.consume_token(&Token::LParen) {
992 self.prev_token();
993 self.parse_function(ObjectName(id_parts))
994 } else {
995 Ok(Expr::CompoundIdentifier(id_parts))
996 }
997 }
998 Token::SingleQuotedString(_)
1000 | Token::DoubleQuotedString(_)
1001 | Token::HexStringLiteral(_)
1002 if w.value.starts_with('_') =>
1003 {
1004 Ok(Expr::IntroducedString {
1005 introducer: w.value,
1006 value: self.parse_introduced_string_value()?,
1007 })
1008 }
1009 _ => Ok(Expr::Identifier(w.to_ident())),
1010 },
1011 }, Token::LBracket => self.parse_array_expr(false),
1014 tok @ Token::Minus | tok @ Token::Plus => {
1015 let op = if tok == Token::Plus {
1016 UnaryOperator::Plus
1017 } else {
1018 UnaryOperator::Minus
1019 };
1020 Ok(Expr::UnaryOp {
1021 op,
1022 expr: Box::new(self.parse_subexpr(Self::MUL_DIV_MOD_OP_PREC)?),
1023 })
1024 }
1025 tok @ Token::DoubleExclamationMark
1026 | tok @ Token::PGSquareRoot
1027 | tok @ Token::PGCubeRoot
1028 | tok @ Token::AtSign
1029 | tok @ Token::Tilde
1030 if dialect_of!(self is PostgreSqlDialect) =>
1031 {
1032 let op = match tok {
1033 Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
1034 Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
1035 Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
1036 Token::AtSign => UnaryOperator::PGAbs,
1037 Token::Tilde => UnaryOperator::PGBitwiseNot,
1038 _ => unreachable!(),
1039 };
1040 Ok(Expr::UnaryOp {
1041 op,
1042 expr: Box::new(self.parse_subexpr(Self::PLUS_MINUS_PREC)?),
1043 })
1044 }
1045 Token::EscapedStringLiteral(_) if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
1046 {
1047 self.prev_token();
1048 Ok(Expr::Value(self.parse_value()?))
1049 }
1050 Token::Number(_, _)
1051 | Token::SingleQuotedString(_)
1052 | Token::DoubleQuotedString(_)
1053 | Token::DollarQuotedString(_)
1054 | Token::SingleQuotedByteStringLiteral(_)
1055 | Token::DoubleQuotedByteStringLiteral(_)
1056 | Token::RawStringLiteral(_)
1057 | Token::NationalStringLiteral(_)
1058 | Token::HexStringLiteral(_) => {
1059 self.prev_token();
1060 Ok(Expr::Value(self.parse_value()?))
1061 }
1062 Token::LParen => {
1063 let expr =
1064 if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
1065 self.prev_token();
1066 Expr::Subquery(Box::new(self.parse_query()?))
1067 } else {
1068 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1069 match exprs.len() {
1070 0 => unreachable!(), 1 => Expr::Nested(Box::new(exprs.into_iter().next().unwrap())),
1072 _ => Expr::Tuple(exprs),
1073 }
1074 };
1075 self.expect_token(&Token::RParen)?;
1076 if !self.consume_token(&Token::Period) {
1077 Ok(expr)
1078 } else {
1079 let tok = self.next_token();
1080 let key = match tok.token {
1081 Token::Word(word) => word.to_ident(),
1082 _ => {
1083 return parser_err!(
1084 format!("Expected identifier, found: {tok}"),
1085 tok.location
1086 )
1087 }
1088 };
1089 Ok(Expr::CompositeAccess {
1090 expr: Box::new(expr),
1091 key,
1092 })
1093 }
1094 }
1095 Token::Placeholder(_) | Token::Colon | Token::AtSign => {
1096 self.prev_token();
1097 Ok(Expr::Value(self.parse_value()?))
1098 }
1099 _ => self.expected("an expression:", next_token),
1100 }?;
1101
1102 if self.parse_keyword(Keyword::COLLATE) {
1103 Ok(Expr::Collate {
1104 expr: Box::new(expr),
1105 collation: self.parse_object_name(false)?,
1106 })
1107 } else {
1108 Ok(expr)
1109 }
1110 }
1111
1112 pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
1113 self.expect_token(&Token::LParen)?;
1114 let distinct = self.parse_all_or_distinct()?.is_some();
1115 let (args, order_by) = self.parse_optional_args_with_orderby()?;
1116 let filter = if self.dialect.supports_filter_during_aggregation()
1117 && self.parse_keyword(Keyword::FILTER)
1118 && self.consume_token(&Token::LParen)
1119 && self.parse_keyword(Keyword::WHERE)
1120 {
1121 let filter = Some(Box::new(self.parse_expr()?));
1122 self.expect_token(&Token::RParen)?;
1123 filter
1124 } else {
1125 None
1126 };
1127 let null_treatment = match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE])
1128 {
1129 Some(keyword) => {
1130 self.expect_keyword(Keyword::NULLS)?;
1131
1132 match keyword {
1133 Keyword::RESPECT => Some(NullTreatment::RespectNulls),
1134 Keyword::IGNORE => Some(NullTreatment::IgnoreNulls),
1135 _ => None,
1136 }
1137 }
1138 None => None,
1139 };
1140 let over = if self.parse_keyword(Keyword::OVER) {
1141 if self.consume_token(&Token::LParen) {
1142 let window_spec = self.parse_window_spec()?;
1143 Some(WindowType::WindowSpec(window_spec))
1144 } else {
1145 Some(WindowType::NamedWindow(self.parse_identifier(false)?))
1146 }
1147 } else {
1148 None
1149 };
1150 Ok(Expr::Function(Function {
1151 name,
1152 args,
1153 null_treatment,
1154 filter,
1155 over,
1156 distinct,
1157 special: false,
1158 order_by,
1159 }))
1160 }
1161
1162 pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
1163 let (args, order_by, special) = if self.consume_token(&Token::LParen) {
1164 let (args, order_by) = self.parse_optional_args_with_orderby()?;
1165 (args, order_by, false)
1166 } else {
1167 (vec![], vec![], true)
1168 };
1169 Ok(Expr::Function(Function {
1170 name,
1171 args,
1172 null_treatment: None,
1173 filter: None,
1174 over: None,
1175 distinct: false,
1176 special,
1177 order_by,
1178 }))
1179 }
1180
1181 pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
1182 let next_token = self.next_token();
1183 match &next_token.token {
1184 Token::Word(w) => match w.keyword {
1185 Keyword::ROWS => Ok(WindowFrameUnits::Rows),
1186 Keyword::RANGE => Ok(WindowFrameUnits::Range),
1187 Keyword::GROUPS => Ok(WindowFrameUnits::Groups),
1188 _ => self.expected("ROWS, RANGE, GROUPS", next_token)?,
1189 },
1190 _ => self.expected("ROWS, RANGE, GROUPS", next_token),
1191 }
1192 }
1193
1194 pub fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
1195 let units = self.parse_window_frame_units()?;
1196 let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
1197 let start_bound = self.parse_window_frame_bound()?;
1198 self.expect_keyword(Keyword::AND)?;
1199 let end_bound = Some(self.parse_window_frame_bound()?);
1200 (start_bound, end_bound)
1201 } else {
1202 (self.parse_window_frame_bound()?, None)
1203 };
1204 Ok(WindowFrame {
1205 units,
1206 start_bound,
1207 end_bound,
1208 })
1209 }
1210
1211 pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
1213 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
1214 Ok(WindowFrameBound::CurrentRow)
1215 } else {
1216 let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
1217 None
1218 } else {
1219 Some(Box::new(match self.peek_token().token {
1220 Token::SingleQuotedString(_) => self.parse_interval()?,
1221 _ => self.parse_expr()?,
1222 }))
1223 };
1224 if self.parse_keyword(Keyword::PRECEDING) {
1225 Ok(WindowFrameBound::Preceding(rows))
1226 } else if self.parse_keyword(Keyword::FOLLOWING) {
1227 Ok(WindowFrameBound::Following(rows))
1228 } else {
1229 self.expected("PRECEDING or FOLLOWING", self.peek_token())
1230 }
1231 }
1232 }
1233
1234 fn parse_group_by_expr(&mut self) -> Result<Expr, ParserError> {
1237 if self.dialect.supports_group_by_expr() {
1238 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
1239 self.expect_token(&Token::LParen)?;
1240 let result = self.parse_comma_separated(|p| p.parse_tuple(false, true))?;
1241 self.expect_token(&Token::RParen)?;
1242 Ok(Expr::GroupingSets(result))
1243 } else if self.parse_keyword(Keyword::CUBE) {
1244 self.expect_token(&Token::LParen)?;
1245 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
1246 self.expect_token(&Token::RParen)?;
1247 Ok(Expr::Cube(result))
1248 } else if self.parse_keyword(Keyword::ROLLUP) {
1249 self.expect_token(&Token::LParen)?;
1250 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
1251 self.expect_token(&Token::RParen)?;
1252 Ok(Expr::Rollup(result))
1253 } else {
1254 self.parse_expr()
1255 }
1256 } else {
1257 self.parse_expr()
1259 }
1260 }
1261
1262 fn parse_tuple(
1266 &mut self,
1267 lift_singleton: bool,
1268 allow_empty: bool,
1269 ) -> Result<Vec<Expr>, ParserError> {
1270 if lift_singleton {
1271 if self.consume_token(&Token::LParen) {
1272 let result = if allow_empty && self.consume_token(&Token::RParen) {
1273 vec![]
1274 } else {
1275 let result = self.parse_comma_separated(Parser::parse_expr)?;
1276 self.expect_token(&Token::RParen)?;
1277 result
1278 };
1279 Ok(result)
1280 } else {
1281 Ok(vec![self.parse_expr()?])
1282 }
1283 } else {
1284 self.expect_token(&Token::LParen)?;
1285 let result = if allow_empty && self.consume_token(&Token::RParen) {
1286 vec![]
1287 } else {
1288 let result = self.parse_comma_separated(Parser::parse_expr)?;
1289 self.expect_token(&Token::RParen)?;
1290 result
1291 };
1292 Ok(result)
1293 }
1294 }
1295
1296 pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
1297 let mut operand = None;
1298 if !self.parse_keyword(Keyword::WHEN) {
1299 operand = Some(Box::new(self.parse_expr()?));
1300 self.expect_keyword(Keyword::WHEN)?;
1301 }
1302 let mut conditions = vec![];
1303 let mut results = vec![];
1304 loop {
1305 conditions.push(self.parse_expr()?);
1306 self.expect_keyword(Keyword::THEN)?;
1307 results.push(self.parse_expr()?);
1308 if !self.parse_keyword(Keyword::WHEN) {
1309 break;
1310 }
1311 }
1312 let else_result = if self.parse_keyword(Keyword::ELSE) {
1313 Some(Box::new(self.parse_expr()?))
1314 } else {
1315 None
1316 };
1317 self.expect_keyword(Keyword::END)?;
1318 Ok(Expr::Case {
1319 operand,
1320 conditions,
1321 results,
1322 else_result,
1323 })
1324 }
1325
1326 pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
1327 if self.parse_keyword(Keyword::FORMAT) {
1328 let value = self.parse_value()?;
1329 if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
1330 Ok(Some(CastFormat::ValueAtTimeZone(
1331 value,
1332 self.parse_value()?,
1333 )))
1334 } else {
1335 Ok(Some(CastFormat::Value(value)))
1336 }
1337 } else {
1338 Ok(None)
1339 }
1340 }
1341
1342 fn parse_mssql_convert(&mut self) -> Result<Expr, ParserError> {
1344 self.expect_token(&Token::LParen)?;
1345 let data_type = self.parse_data_type()?;
1346 self.expect_token(&Token::Comma)?;
1347 let expr = self.parse_expr()?;
1348 self.expect_token(&Token::RParen)?;
1349 Ok(Expr::Convert {
1350 expr: Box::new(expr),
1351 data_type: Some(data_type),
1352 charset: None,
1353 target_before_value: true,
1354 })
1355 }
1356
1357 pub fn parse_convert_expr(&mut self) -> Result<Expr, ParserError> {
1362 if self.dialect.convert_type_before_value() {
1363 return self.parse_mssql_convert();
1364 }
1365 self.expect_token(&Token::LParen)?;
1366 let expr = self.parse_expr()?;
1367 if self.parse_keyword(Keyword::USING) {
1368 let charset = self.parse_object_name(false)?;
1369 self.expect_token(&Token::RParen)?;
1370 return Ok(Expr::Convert {
1371 expr: Box::new(expr),
1372 data_type: None,
1373 charset: Some(charset),
1374 target_before_value: false,
1375 });
1376 }
1377 self.expect_token(&Token::Comma)?;
1378 let data_type = self.parse_data_type()?;
1379 let charset = if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
1380 Some(self.parse_object_name(false)?)
1381 } else {
1382 None
1383 };
1384 self.expect_token(&Token::RParen)?;
1385 Ok(Expr::Convert {
1386 expr: Box::new(expr),
1387 data_type: Some(data_type),
1388 charset,
1389 target_before_value: false,
1390 })
1391 }
1392
1393 pub fn parse_cast_expr(&mut self) -> Result<Expr, ParserError> {
1395 self.expect_token(&Token::LParen)?;
1396 let expr = self.parse_expr()?;
1397 self.expect_keyword(Keyword::AS)?;
1398 let data_type = self.parse_data_type()?;
1399 let format = self.parse_optional_cast_format()?;
1400 self.expect_token(&Token::RParen)?;
1401 Ok(Expr::Cast {
1402 expr: Box::new(expr),
1403 data_type,
1404 format,
1405 })
1406 }
1407
1408 pub fn parse_try_cast_expr(&mut self) -> Result<Expr, ParserError> {
1410 self.expect_token(&Token::LParen)?;
1411 let expr = self.parse_expr()?;
1412 self.expect_keyword(Keyword::AS)?;
1413 let data_type = self.parse_data_type()?;
1414 let format = self.parse_optional_cast_format()?;
1415 self.expect_token(&Token::RParen)?;
1416 Ok(Expr::TryCast {
1417 expr: Box::new(expr),
1418 data_type,
1419 format,
1420 })
1421 }
1422
1423 pub fn parse_safe_cast_expr(&mut self) -> Result<Expr, ParserError> {
1425 self.expect_token(&Token::LParen)?;
1426 let expr = self.parse_expr()?;
1427 self.expect_keyword(Keyword::AS)?;
1428 let data_type = self.parse_data_type()?;
1429 let format = self.parse_optional_cast_format()?;
1430 self.expect_token(&Token::RParen)?;
1431 Ok(Expr::SafeCast {
1432 expr: Box::new(expr),
1433 data_type,
1434 format,
1435 })
1436 }
1437
1438 pub fn parse_exists_expr(&mut self, negated: bool) -> Result<Expr, ParserError> {
1440 self.expect_token(&Token::LParen)?;
1441 let exists_node = Expr::Exists {
1442 negated,
1443 subquery: Box::new(self.parse_query()?),
1444 };
1445 self.expect_token(&Token::RParen)?;
1446 Ok(exists_node)
1447 }
1448
1449 pub fn parse_extract_expr(&mut self) -> Result<Expr, ParserError> {
1450 self.expect_token(&Token::LParen)?;
1451 let field = self.parse_date_time_field()?;
1452 self.expect_keyword(Keyword::FROM)?;
1453 let expr = self.parse_expr()?;
1454 self.expect_token(&Token::RParen)?;
1455 Ok(Expr::Extract {
1456 field,
1457 expr: Box::new(expr),
1458 })
1459 }
1460
1461 pub fn parse_ceil_floor_expr(&mut self, is_ceil: bool) -> Result<Expr, ParserError> {
1462 self.expect_token(&Token::LParen)?;
1463 let expr = self.parse_expr()?;
1464 let mut field = DateTimeField::NoDateTime;
1466 let keyword_to = self.parse_keyword(Keyword::TO);
1467 if keyword_to {
1468 field = self.parse_date_time_field()?;
1470 }
1471 self.expect_token(&Token::RParen)?;
1472 if is_ceil {
1473 Ok(Expr::Ceil {
1474 expr: Box::new(expr),
1475 field,
1476 })
1477 } else {
1478 Ok(Expr::Floor {
1479 expr: Box::new(expr),
1480 field,
1481 })
1482 }
1483 }
1484
1485 pub fn parse_position_expr(&mut self) -> Result<Expr, ParserError> {
1486 self.expect_token(&Token::LParen)?;
1488
1489 let expr = self.parse_subexpr(Self::BETWEEN_PREC)?;
1491 if self.parse_keyword(Keyword::IN) {
1492 let from = self.parse_expr()?;
1493 self.expect_token(&Token::RParen)?;
1494 Ok(Expr::Position {
1495 expr: Box::new(expr),
1496 r#in: Box::new(from),
1497 })
1498 } else {
1499 parser_err!(
1500 "Position function must include IN keyword".to_string(),
1501 self.peek_token().location
1502 )
1503 }
1504 }
1505
1506 pub fn parse_substring_expr(&mut self) -> Result<Expr, ParserError> {
1507 if self.dialect.supports_substring_from_for_expr() {
1508 self.expect_token(&Token::LParen)?;
1510 let expr = self.parse_expr()?;
1511 let mut from_expr = None;
1512 if self.parse_keyword(Keyword::FROM) || self.consume_token(&Token::Comma) {
1513 from_expr = Some(self.parse_expr()?);
1514 }
1515
1516 let mut to_expr = None;
1517 if self.parse_keyword(Keyword::FOR) || self.consume_token(&Token::Comma) {
1518 to_expr = Some(self.parse_expr()?);
1519 }
1520 self.expect_token(&Token::RParen)?;
1521
1522 Ok(Expr::Substring {
1523 expr: Box::new(expr),
1524 substring_from: from_expr.map(Box::new),
1525 substring_for: to_expr.map(Box::new),
1526 special: false,
1527 })
1528 } else {
1529 self.expect_token(&Token::LParen)?;
1531 let expr = self.parse_expr()?;
1532
1533 self.expect_token(&Token::Comma)?;
1534 let from_expr = Some(self.parse_expr()?);
1535
1536 self.expect_token(&Token::Comma)?;
1537 let to_expr = Some(self.parse_expr()?);
1538
1539 self.expect_token(&Token::RParen)?;
1540
1541 Ok(Expr::Substring {
1542 expr: Box::new(expr),
1543 substring_from: from_expr.map(Box::new),
1544 substring_for: to_expr.map(Box::new),
1545 special: true,
1546 })
1547 }
1548 }
1549
1550 pub fn parse_overlay_expr(&mut self) -> Result<Expr, ParserError> {
1551 self.expect_token(&Token::LParen)?;
1553 let expr = self.parse_expr()?;
1554 self.expect_keyword(Keyword::PLACING)?;
1555 let what_expr = self.parse_expr()?;
1556 self.expect_keyword(Keyword::FROM)?;
1557 let from_expr = self.parse_expr()?;
1558 let mut for_expr = None;
1559 if self.parse_keyword(Keyword::FOR) {
1560 for_expr = Some(self.parse_expr()?);
1561 }
1562 self.expect_token(&Token::RParen)?;
1563
1564 Ok(Expr::Overlay {
1565 expr: Box::new(expr),
1566 overlay_what: Box::new(what_expr),
1567 overlay_from: Box::new(from_expr),
1568 overlay_for: for_expr.map(Box::new),
1569 })
1570 }
1571
1572 pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
1578 self.expect_token(&Token::LParen)?;
1579 let mut trim_where = None;
1580 if let Token::Word(word) = self.peek_token().token {
1581 if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING]
1582 .iter()
1583 .any(|d| word.keyword == *d)
1584 {
1585 trim_where = Some(self.parse_trim_where()?);
1586 }
1587 }
1588 let expr = self.parse_expr()?;
1589 if self.parse_keyword(Keyword::FROM) {
1590 let trim_what = Box::new(expr);
1591 let expr = self.parse_expr()?;
1592 self.expect_token(&Token::RParen)?;
1593 Ok(Expr::Trim {
1594 expr: Box::new(expr),
1595 trim_where,
1596 trim_what: Some(trim_what),
1597 trim_characters: None,
1598 })
1599 } else if self.consume_token(&Token::Comma)
1600 && dialect_of!(self is SnowflakeDialect | BigQueryDialect | GenericDialect)
1601 {
1602 let characters = self.parse_comma_separated(Parser::parse_expr)?;
1603 self.expect_token(&Token::RParen)?;
1604 Ok(Expr::Trim {
1605 expr: Box::new(expr),
1606 trim_where: None,
1607 trim_what: None,
1608 trim_characters: Some(characters),
1609 })
1610 } else {
1611 self.expect_token(&Token::RParen)?;
1612 Ok(Expr::Trim {
1613 expr: Box::new(expr),
1614 trim_where,
1615 trim_what: None,
1616 trim_characters: None,
1617 })
1618 }
1619 }
1620
1621 pub fn parse_trim_where(&mut self) -> Result<TrimWhereField, ParserError> {
1622 let next_token = self.next_token();
1623 match &next_token.token {
1624 Token::Word(w) => match w.keyword {
1625 Keyword::BOTH => Ok(TrimWhereField::Both),
1626 Keyword::LEADING => Ok(TrimWhereField::Leading),
1627 Keyword::TRAILING => Ok(TrimWhereField::Trailing),
1628 _ => self.expected("trim_where field", next_token)?,
1629 },
1630 _ => self.expected("trim_where field", next_token),
1631 }
1632 }
1633
1634 pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
1637 if self.peek_token().token == Token::RBracket {
1638 let _ = self.next_token(); Ok(Expr::Array(Array {
1640 elem: vec![],
1641 named,
1642 }))
1643 } else {
1644 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1645 self.expect_token(&Token::RBracket)?;
1646 Ok(Expr::Array(Array { elem: exprs, named }))
1647 }
1648 }
1649
1650 pub fn parse_array_subquery(&mut self) -> Result<Expr, ParserError> {
1652 let query = self.parse_query()?;
1653 self.expect_token(&Token::RParen)?;
1654 Ok(Expr::ArraySubquery(Box::new(query)))
1655 }
1656
1657 pub fn parse_listagg_expr(&mut self) -> Result<Expr, ParserError> {
1659 self.expect_token(&Token::LParen)?;
1660 let distinct = self.parse_all_or_distinct()?.is_some();
1661 let expr = Box::new(self.parse_expr()?);
1662 let separator = if self.consume_token(&Token::Comma) {
1665 Some(Box::new(self.parse_expr()?))
1666 } else {
1667 None
1668 };
1669 let on_overflow = if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
1670 if self.parse_keyword(Keyword::ERROR) {
1671 Some(ListAggOnOverflow::Error)
1672 } else {
1673 self.expect_keyword(Keyword::TRUNCATE)?;
1674 let filler = match self.peek_token().token {
1675 Token::Word(w)
1676 if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
1677 {
1678 None
1679 }
1680 Token::SingleQuotedString(_)
1681 | Token::EscapedStringLiteral(_)
1682 | Token::NationalStringLiteral(_)
1683 | Token::HexStringLiteral(_) => Some(Box::new(self.parse_expr()?)),
1684 _ => self.expected(
1685 "either filler, WITH, or WITHOUT in LISTAGG",
1686 self.peek_token(),
1687 )?,
1688 };
1689 let with_count = self.parse_keyword(Keyword::WITH);
1690 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
1691 self.expected("either WITH or WITHOUT in LISTAGG", self.peek_token())?;
1692 }
1693 self.expect_keyword(Keyword::COUNT)?;
1694 Some(ListAggOnOverflow::Truncate { filler, with_count })
1695 }
1696 } else {
1697 None
1698 };
1699 self.expect_token(&Token::RParen)?;
1700 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
1703 self.expect_token(&Token::LParen)?;
1704 self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
1705 let order_by_expr = self.parse_comma_separated(Parser::parse_order_by_expr)?;
1706 self.expect_token(&Token::RParen)?;
1707 order_by_expr
1708 } else {
1709 vec![]
1710 };
1711 Ok(Expr::ListAgg(ListAgg {
1712 distinct,
1713 expr,
1714 separator,
1715 on_overflow,
1716 within_group,
1717 }))
1718 }
1719
1720 pub fn parse_array_agg_expr(&mut self) -> Result<Expr, ParserError> {
1721 self.expect_token(&Token::LParen)?;
1722 let distinct = self.parse_keyword(Keyword::DISTINCT);
1723 let expr = Box::new(self.parse_expr()?);
1724 if !self.dialect.supports_within_after_array_aggregation() {
1726 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
1727 Some(self.parse_comma_separated(Parser::parse_order_by_expr)?)
1728 } else {
1729 None
1730 };
1731 let limit = if self.parse_keyword(Keyword::LIMIT) {
1732 self.parse_limit()?.map(Box::new)
1733 } else {
1734 None
1735 };
1736 self.expect_token(&Token::RParen)?;
1737 return Ok(Expr::ArrayAgg(ArrayAgg {
1738 distinct,
1739 expr,
1740 order_by,
1741 limit,
1742 within_group: false,
1743 }));
1744 }
1745 self.expect_token(&Token::RParen)?;
1748 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
1749 self.expect_token(&Token::LParen)?;
1750 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
1751 Some(self.parse_comma_separated(Parser::parse_order_by_expr)?)
1752 } else {
1753 None
1754 };
1755 self.expect_token(&Token::RParen)?;
1756 order_by
1757 } else {
1758 None
1759 };
1760
1761 Ok(Expr::ArrayAgg(ArrayAgg {
1762 distinct,
1763 expr,
1764 order_by: within_group,
1765 limit: None,
1766 within_group: true,
1767 }))
1768 }
1769
1770 pub fn parse_date_time_field(&mut self) -> Result<DateTimeField, ParserError> {
1775 let next_token = self.next_token();
1776 match &next_token.token {
1777 Token::Word(w) => match w.keyword {
1778 Keyword::YEAR => Ok(DateTimeField::Year),
1779 Keyword::MONTH => Ok(DateTimeField::Month),
1780 Keyword::WEEK => Ok(DateTimeField::Week),
1781 Keyword::DAY => Ok(DateTimeField::Day),
1782 Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
1783 Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
1784 Keyword::DATE => Ok(DateTimeField::Date),
1785 Keyword::HOUR => Ok(DateTimeField::Hour),
1786 Keyword::MINUTE => Ok(DateTimeField::Minute),
1787 Keyword::SECOND => Ok(DateTimeField::Second),
1788 Keyword::CENTURY => Ok(DateTimeField::Century),
1789 Keyword::DECADE => Ok(DateTimeField::Decade),
1790 Keyword::DOY => Ok(DateTimeField::Doy),
1791 Keyword::DOW => Ok(DateTimeField::Dow),
1792 Keyword::EPOCH => Ok(DateTimeField::Epoch),
1793 Keyword::ISODOW => Ok(DateTimeField::Isodow),
1794 Keyword::ISOYEAR => Ok(DateTimeField::Isoyear),
1795 Keyword::ISOWEEK => Ok(DateTimeField::IsoWeek),
1796 Keyword::JULIAN => Ok(DateTimeField::Julian),
1797 Keyword::MICROSECOND => Ok(DateTimeField::Microsecond),
1798 Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds),
1799 Keyword::MILLENIUM => Ok(DateTimeField::Millenium),
1800 Keyword::MILLENNIUM => Ok(DateTimeField::Millennium),
1801 Keyword::MILLISECOND => Ok(DateTimeField::Millisecond),
1802 Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds),
1803 Keyword::NANOSECOND => Ok(DateTimeField::Nanosecond),
1804 Keyword::NANOSECONDS => Ok(DateTimeField::Nanoseconds),
1805 Keyword::QUARTER => Ok(DateTimeField::Quarter),
1806 Keyword::TIME => Ok(DateTimeField::Time),
1807 Keyword::TIMEZONE => Ok(DateTimeField::Timezone),
1808 Keyword::TIMEZONE_ABBR => Ok(DateTimeField::TimezoneAbbr),
1809 Keyword::TIMEZONE_HOUR => Ok(DateTimeField::TimezoneHour),
1810 Keyword::TIMEZONE_MINUTE => Ok(DateTimeField::TimezoneMinute),
1811 Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
1812 _ => self.expected("date/time field", next_token),
1813 },
1814 _ => self.expected("date/time field", next_token),
1815 }
1816 }
1817
1818 pub fn parse_not(&mut self) -> Result<Expr, ParserError> {
1819 match self.peek_token().token {
1820 Token::Word(w) => match w.keyword {
1821 Keyword::EXISTS => {
1822 let negated = true;
1823 let _ = self.parse_keyword(Keyword::EXISTS);
1824 self.parse_exists_expr(negated)
1825 }
1826 _ => Ok(Expr::UnaryOp {
1827 op: UnaryOperator::Not,
1828 expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
1829 }),
1830 },
1831 _ => Ok(Expr::UnaryOp {
1832 op: UnaryOperator::Not,
1833 expr: Box::new(self.parse_subexpr(Self::UNARY_NOT_PREC)?),
1834 }),
1835 }
1836 }
1837
1838 pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
1846 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
1847
1848 self.expect_keyword(Keyword::AGAINST)?;
1849
1850 self.expect_token(&Token::LParen)?;
1851
1852 let match_value = self.parse_value()?;
1854
1855 let in_natural_language_mode_keywords = &[
1856 Keyword::IN,
1857 Keyword::NATURAL,
1858 Keyword::LANGUAGE,
1859 Keyword::MODE,
1860 ];
1861
1862 let with_query_expansion_keywords = &[Keyword::WITH, Keyword::QUERY, Keyword::EXPANSION];
1863
1864 let in_boolean_mode_keywords = &[Keyword::IN, Keyword::BOOLEAN, Keyword::MODE];
1865
1866 let opt_search_modifier = if self.parse_keywords(in_natural_language_mode_keywords) {
1867 if self.parse_keywords(with_query_expansion_keywords) {
1868 Some(SearchModifier::InNaturalLanguageModeWithQueryExpansion)
1869 } else {
1870 Some(SearchModifier::InNaturalLanguageMode)
1871 }
1872 } else if self.parse_keywords(in_boolean_mode_keywords) {
1873 Some(SearchModifier::InBooleanMode)
1874 } else if self.parse_keywords(with_query_expansion_keywords) {
1875 Some(SearchModifier::WithQueryExpansion)
1876 } else {
1877 None
1878 };
1879
1880 self.expect_token(&Token::RParen)?;
1881
1882 Ok(Expr::MatchAgainst {
1883 columns,
1884 match_value,
1885 opt_search_modifier,
1886 })
1887 }
1888
1889 pub fn parse_interval(&mut self) -> Result<Expr, ParserError> {
1903 let value = self.parse_interval_expr()?;
1911
1912 let leading_field = match self.peek_token().token {
1918 Token::Word(kw)
1919 if [
1920 Keyword::YEAR,
1921 Keyword::MONTH,
1922 Keyword::WEEK,
1923 Keyword::DAY,
1924 Keyword::HOUR,
1925 Keyword::MINUTE,
1926 Keyword::SECOND,
1927 Keyword::CENTURY,
1928 Keyword::DECADE,
1929 Keyword::DOW,
1930 Keyword::DOY,
1931 Keyword::EPOCH,
1932 Keyword::ISODOW,
1933 Keyword::ISOYEAR,
1934 Keyword::JULIAN,
1935 Keyword::MICROSECOND,
1936 Keyword::MICROSECONDS,
1937 Keyword::MILLENIUM,
1938 Keyword::MILLENNIUM,
1939 Keyword::MILLISECOND,
1940 Keyword::MILLISECONDS,
1941 Keyword::NANOSECOND,
1942 Keyword::NANOSECONDS,
1943 Keyword::QUARTER,
1944 Keyword::TIMEZONE,
1945 Keyword::TIMEZONE_HOUR,
1946 Keyword::TIMEZONE_MINUTE,
1947 ]
1948 .iter()
1949 .any(|d| kw.keyword == *d) =>
1950 {
1951 Some(self.parse_date_time_field()?)
1952 }
1953 _ => None,
1954 };
1955
1956 let (leading_precision, last_field, fsec_precision) =
1957 if leading_field == Some(DateTimeField::Second) {
1958 let last_field = None;
1964 let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
1965 (leading_precision, last_field, fsec_precision)
1966 } else {
1967 let leading_precision = self.parse_optional_precision()?;
1968 if self.parse_keyword(Keyword::TO) {
1969 let last_field = Some(self.parse_date_time_field()?);
1970 let fsec_precision = if last_field == Some(DateTimeField::Second) {
1971 self.parse_optional_precision()?
1972 } else {
1973 None
1974 };
1975 (leading_precision, last_field, fsec_precision)
1976 } else {
1977 (leading_precision, None, None)
1978 }
1979 };
1980
1981 Ok(Expr::Interval(Interval {
1982 value: Box::new(value),
1983 leading_field,
1984 leading_precision,
1985 last_field,
1986 fractional_seconds_precision: fsec_precision,
1987 }))
1988 }
1989
1990 fn parse_bigquery_struct_literal(&mut self) -> Result<Expr, ParserError> {
1999 let (fields, trailing_bracket) =
2000 self.parse_struct_type_def(Self::parse_big_query_struct_field_def)?;
2001 if trailing_bracket.0 {
2002 return parser_err!("unmatched > in STRUCT literal", self.peek_token().location);
2003 }
2004
2005 self.expect_token(&Token::LParen)?;
2006 let values = self
2007 .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
2008 self.expect_token(&Token::RParen)?;
2009
2010 Ok(Expr::Struct { values, fields })
2011 }
2012
2013 fn parse_struct_field_expr(&mut self, typed_syntax: bool) -> Result<Expr, ParserError> {
2027 let expr = self.parse_expr()?;
2028 if self.parse_keyword(Keyword::AS) {
2029 if typed_syntax {
2030 return parser_err!("Typed syntax does not allow AS", {
2031 self.prev_token();
2032 self.peek_token().location
2033 });
2034 }
2035 let field_name = self.parse_identifier(false)?;
2036 Ok(Expr::Named {
2037 expr: expr.into(),
2038 name: field_name,
2039 })
2040 } else {
2041 Ok(expr)
2042 }
2043 }
2044
2045 fn parse_struct_type_def<F>(
2058 &mut self,
2059 mut elem_parser: F,
2060 ) -> Result<(Vec<StructField>, MatchedTrailingBracket), ParserError>
2061 where
2062 F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
2063 {
2064 let start_token = self.peek_token();
2065 self.expect_keyword(Keyword::STRUCT)?;
2066
2067 if Token::Lt != self.peek_token() {
2069 return Ok((Default::default(), false.into()));
2070 }
2071 self.next_token();
2072
2073 let mut field_defs = vec![];
2074 let trailing_bracket = loop {
2075 let (def, trailing_bracket) = elem_parser(self)?;
2076 field_defs.push(def);
2077 if !self.consume_token(&Token::Comma) {
2078 break trailing_bracket;
2079 }
2080
2081 if trailing_bracket.0 {
2085 return parser_err!("unmatched > in STRUCT definition", start_token.location);
2086 }
2087 };
2088
2089 Ok((
2090 field_defs,
2091 self.expect_closing_angle_bracket(trailing_bracket)?,
2092 ))
2093 }
2094
2095 fn parse_big_query_struct_field_def(
2102 &mut self,
2103 ) -> Result<(StructField, MatchedTrailingBracket), ParserError> {
2104 let is_anonymous_field = if let Token::Word(w) = self.peek_token().token {
2105 ALL_KEYWORDS
2106 .binary_search(&w.value.to_uppercase().as_str())
2107 .is_ok()
2108 } else {
2109 false
2110 };
2111
2112 let field_name = if is_anonymous_field {
2113 None
2114 } else {
2115 Some(self.parse_identifier(false)?)
2116 };
2117
2118 let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
2119
2120 Ok((
2121 StructField {
2122 field_name,
2123 field_type,
2124 },
2125 trailing_bracket,
2126 ))
2127 }
2128
2129 fn expect_closing_angle_bracket(
2134 &mut self,
2135 trailing_bracket: MatchedTrailingBracket,
2136 ) -> Result<MatchedTrailingBracket, ParserError> {
2137 let trailing_bracket = if !trailing_bracket.0 {
2138 match self.peek_token().token {
2139 Token::Gt => {
2140 self.next_token();
2141 false.into()
2142 }
2143 Token::ShiftRight => {
2144 self.next_token();
2145 true.into()
2146 }
2147 _ => return self.expected(">", self.peek_token()),
2148 }
2149 } else {
2150 false.into()
2151 };
2152
2153 Ok(trailing_bracket)
2154 }
2155
2156 pub fn parse_infix(&mut self, expr: Expr, precedence: u8) -> Result<Expr, ParserError> {
2158 if let Some(infix) = self.dialect.parse_infix(self, &expr, precedence) {
2160 return infix;
2161 }
2162
2163 let tok = self.next_token();
2164
2165 let regular_binary_operator = match &tok.token {
2166 Token::Spaceship => Some(BinaryOperator::Spaceship),
2167 Token::DoubleEq => Some(BinaryOperator::Eq),
2168 Token::Eq => Some(BinaryOperator::Eq),
2169 Token::Neq => Some(BinaryOperator::NotEq),
2170 Token::Gt => Some(BinaryOperator::Gt),
2171 Token::GtEq => Some(BinaryOperator::GtEq),
2172 Token::Lt => Some(BinaryOperator::Lt),
2173 Token::LtEq => Some(BinaryOperator::LtEq),
2174 Token::Plus => Some(BinaryOperator::Plus),
2175 Token::Minus => Some(BinaryOperator::Minus),
2176 Token::Mul => Some(BinaryOperator::Multiply),
2177 Token::Mod => Some(BinaryOperator::Modulo),
2178 Token::StringConcat => Some(BinaryOperator::StringConcat),
2179 Token::Pipe => Some(BinaryOperator::BitwiseOr),
2180 Token::Caret => {
2181 if dialect_of!(self is PostgreSqlDialect) {
2184 Some(BinaryOperator::PGExp)
2185 } else {
2186 Some(BinaryOperator::BitwiseXor)
2187 }
2188 }
2189 Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
2190 Token::Div => Some(BinaryOperator::Divide),
2191 Token::DuckIntDiv if dialect_of!(self is DuckDbDialect | GenericDialect) => {
2192 Some(BinaryOperator::DuckIntegerDivide)
2193 }
2194 Token::ShiftLeft if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) => {
2195 Some(BinaryOperator::PGBitwiseShiftLeft)
2196 }
2197 Token::ShiftRight if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) => {
2198 Some(BinaryOperator::PGBitwiseShiftRight)
2199 }
2200 Token::Sharp if dialect_of!(self is PostgreSqlDialect) => {
2201 Some(BinaryOperator::PGBitwiseXor)
2202 }
2203 Token::Overlap if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
2204 Some(BinaryOperator::PGOverlap)
2205 }
2206 Token::CaretAt if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
2207 Some(BinaryOperator::PGStartsWith)
2208 }
2209 Token::Tilde => Some(BinaryOperator::PGRegexMatch),
2210 Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
2211 Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
2212 Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
2213 Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
2214 Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
2215 Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
2216 Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
2217 Token::Word(w) => match w.keyword {
2218 Keyword::AND => Some(BinaryOperator::And),
2219 Keyword::OR => Some(BinaryOperator::Or),
2220 Keyword::XOR => Some(BinaryOperator::Xor),
2221 Keyword::OPERATOR if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
2222 self.expect_token(&Token::LParen)?;
2223 let mut idents = vec![];
2228 loop {
2229 idents.push(self.next_token().to_string());
2230 if !self.consume_token(&Token::Period) {
2231 break;
2232 }
2233 }
2234 self.expect_token(&Token::RParen)?;
2235 Some(BinaryOperator::PGCustomBinaryOperator(idents))
2236 }
2237 _ => None,
2238 },
2239 _ => None,
2240 };
2241
2242 if let Some(op) = regular_binary_operator {
2243 if let Some(keyword) = self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL]) {
2244 self.expect_token(&Token::LParen)?;
2245 let right = self.parse_subexpr(precedence)?;
2246 self.expect_token(&Token::RParen)?;
2247
2248 if !matches!(
2249 op,
2250 BinaryOperator::Gt
2251 | BinaryOperator::Lt
2252 | BinaryOperator::GtEq
2253 | BinaryOperator::LtEq
2254 | BinaryOperator::Eq
2255 | BinaryOperator::NotEq
2256 ) {
2257 return parser_err!(
2258 format!(
2259 "Expected one of [=, >, <, =>, =<, !=] as comparison operator, found: {op}"
2260 ),
2261 tok.location
2262 );
2263 };
2264
2265 Ok(match keyword {
2266 Keyword::ALL => Expr::AllOp {
2267 left: Box::new(expr),
2268 compare_op: op,
2269 right: Box::new(right),
2270 },
2271 Keyword::ANY => Expr::AnyOp {
2272 left: Box::new(expr),
2273 compare_op: op,
2274 right: Box::new(right),
2275 },
2276 _ => unreachable!(),
2277 })
2278 } else {
2279 Ok(Expr::BinaryOp {
2280 left: Box::new(expr),
2281 op,
2282 right: Box::new(self.parse_subexpr(precedence)?),
2283 })
2284 }
2285 } else if let Token::Word(w) = &tok.token {
2286 match w.keyword {
2287 Keyword::IS => {
2288 if self.parse_keyword(Keyword::NULL) {
2289 Ok(Expr::IsNull(Box::new(expr)))
2290 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
2291 Ok(Expr::IsNotNull(Box::new(expr)))
2292 } else if self.parse_keywords(&[Keyword::TRUE]) {
2293 Ok(Expr::IsTrue(Box::new(expr)))
2294 } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
2295 Ok(Expr::IsNotTrue(Box::new(expr)))
2296 } else if self.parse_keywords(&[Keyword::FALSE]) {
2297 Ok(Expr::IsFalse(Box::new(expr)))
2298 } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
2299 Ok(Expr::IsNotFalse(Box::new(expr)))
2300 } else if self.parse_keywords(&[Keyword::UNKNOWN]) {
2301 Ok(Expr::IsUnknown(Box::new(expr)))
2302 } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
2303 Ok(Expr::IsNotUnknown(Box::new(expr)))
2304 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
2305 let expr2 = self.parse_expr()?;
2306 Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
2307 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
2308 {
2309 let expr2 = self.parse_expr()?;
2310 Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
2311 } else {
2312 self.expected(
2313 "[NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS",
2314 self.peek_token(),
2315 )
2316 }
2317 }
2318 Keyword::AT => {
2319 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
2322 let time_zone = self.next_token();
2323 match time_zone.token {
2324 Token::SingleQuotedString(time_zone) => {
2325 log::trace!("Peek token: {:?}", self.peek_token());
2326 Ok(Expr::AtTimeZone {
2327 timestamp: Box::new(expr),
2328 time_zone,
2329 })
2330 }
2331 _ => self.expected(
2332 "Expected Token::SingleQuotedString after AT TIME ZONE",
2333 time_zone,
2334 ),
2335 }
2336 } else {
2337 self.expected("Expected Token::Word after AT", tok)
2338 }
2339 }
2340 Keyword::NOT
2341 | Keyword::IN
2342 | Keyword::BETWEEN
2343 | Keyword::LIKE
2344 | Keyword::ILIKE
2345 | Keyword::SIMILAR
2346 | Keyword::REGEXP
2347 | Keyword::RLIKE => {
2348 self.prev_token();
2349 let negated = self.parse_keyword(Keyword::NOT);
2350 let regexp = self.parse_keyword(Keyword::REGEXP);
2351 let rlike = self.parse_keyword(Keyword::RLIKE);
2352 if regexp || rlike {
2353 Ok(Expr::RLike {
2354 negated,
2355 expr: Box::new(expr),
2356 pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2357 regexp,
2358 })
2359 } else if self.parse_keyword(Keyword::IN) {
2360 self.parse_in(expr, negated)
2361 } else if self.parse_keyword(Keyword::BETWEEN) {
2362 self.parse_between(expr, negated)
2363 } else if self.parse_keyword(Keyword::LIKE) {
2364 Ok(Expr::Like {
2365 negated,
2366 expr: Box::new(expr),
2367 pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2368 escape_char: self.parse_escape_char()?,
2369 })
2370 } else if self.parse_keyword(Keyword::ILIKE) {
2371 Ok(Expr::ILike {
2372 negated,
2373 expr: Box::new(expr),
2374 pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2375 escape_char: self.parse_escape_char()?,
2376 })
2377 } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
2378 Ok(Expr::SimilarTo {
2379 negated,
2380 expr: Box::new(expr),
2381 pattern: Box::new(self.parse_subexpr(Self::LIKE_PREC)?),
2382 escape_char: self.parse_escape_char()?,
2383 })
2384 } else {
2385 self.expected("IN or BETWEEN after NOT", self.peek_token())
2386 }
2387 }
2388 _ => parser_err!(
2390 format!("No infix parser for token {:?}", tok.token),
2391 tok.location
2392 ),
2393 }
2394 } else if Token::DoubleColon == tok {
2395 self.parse_pg_cast(expr)
2396 } else if Token::ExclamationMark == tok {
2397 Ok(Expr::UnaryOp {
2399 op: UnaryOperator::PGPostfixFactorial,
2400 expr: Box::new(expr),
2401 })
2402 } else if Token::LBracket == tok {
2403 if dialect_of!(self is PostgreSqlDialect | GenericDialect) {
2404 return self.parse_array_index(expr);
2406 }
2407 self.parse_map_access(expr)
2408 } else if Token::Colon == tok {
2409 Ok(Expr::JsonAccess {
2410 left: Box::new(expr),
2411 operator: JsonOperator::Colon,
2412 right: Box::new(Expr::Value(self.parse_value()?)),
2413 })
2414 } else if Token::Arrow == tok
2415 || Token::LongArrow == tok
2416 || Token::HashArrow == tok
2417 || Token::HashLongArrow == tok
2418 || Token::AtArrow == tok
2419 || Token::ArrowAt == tok
2420 || Token::HashMinus == tok
2421 || Token::AtQuestion == tok
2422 || Token::AtAt == tok
2423 {
2424 let operator = match tok.token {
2425 Token::Arrow => JsonOperator::Arrow,
2426 Token::LongArrow => JsonOperator::LongArrow,
2427 Token::HashArrow => JsonOperator::HashArrow,
2428 Token::HashLongArrow => JsonOperator::HashLongArrow,
2429 Token::AtArrow => JsonOperator::AtArrow,
2430 Token::ArrowAt => JsonOperator::ArrowAt,
2431 Token::HashMinus => JsonOperator::HashMinus,
2432 Token::AtQuestion => JsonOperator::AtQuestion,
2433 Token::AtAt => JsonOperator::AtAt,
2434 _ => unreachable!(),
2435 };
2436 Ok(Expr::JsonAccess {
2437 left: Box::new(expr),
2438 operator,
2439 right: Box::new(self.parse_expr()?),
2440 })
2441 } else {
2442 parser_err!(
2444 format!("No infix parser for token {:?}", tok.token),
2445 tok.location
2446 )
2447 }
2448 }
2449
2450 pub fn parse_escape_char(&mut self) -> Result<Option<char>, ParserError> {
2452 if self.parse_keyword(Keyword::ESCAPE) {
2453 Ok(Some(self.parse_literal_char()?))
2454 } else {
2455 Ok(None)
2456 }
2457 }
2458
2459 pub fn parse_array_index(&mut self, expr: Expr) -> Result<Expr, ParserError> {
2460 let index = self.parse_expr()?;
2461 self.expect_token(&Token::RBracket)?;
2462 let mut indexes: Vec<Expr> = vec![index];
2463 while self.consume_token(&Token::LBracket) {
2464 let index = self.parse_expr()?;
2465 self.expect_token(&Token::RBracket)?;
2466 indexes.push(index);
2467 }
2468 Ok(Expr::ArrayIndex {
2469 obj: Box::new(expr),
2470 indexes,
2471 })
2472 }
2473
2474 pub fn parse_map_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
2475 let key = self.parse_map_key()?;
2476 let tok = self.consume_token(&Token::RBracket);
2477 debug!("Tok: {}", tok);
2478 let mut key_parts: Vec<Expr> = vec![key];
2479 while self.consume_token(&Token::LBracket) {
2480 let key = self.parse_map_key()?;
2481 let tok = self.consume_token(&Token::RBracket);
2482 debug!("Tok: {}", tok);
2483 key_parts.push(key);
2484 }
2485 match expr {
2486 e @ Expr::Identifier(_) | e @ Expr::CompoundIdentifier(_) => Ok(Expr::MapAccess {
2487 column: Box::new(e),
2488 keys: key_parts,
2489 }),
2490 _ => Ok(expr),
2491 }
2492 }
2493
2494 pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
2496 if self.parse_keyword(Keyword::UNNEST) {
2499 self.expect_token(&Token::LParen)?;
2500 let array_expr = self.parse_expr()?;
2501 self.expect_token(&Token::RParen)?;
2502 return Ok(Expr::InUnnest {
2503 expr: Box::new(expr),
2504 array_expr: Box::new(array_expr),
2505 negated,
2506 });
2507 }
2508 self.expect_token(&Token::LParen)?;
2509 let in_op = if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
2510 self.prev_token();
2511 Expr::InSubquery {
2512 expr: Box::new(expr),
2513 subquery: Box::new(self.parse_query()?),
2514 negated,
2515 }
2516 } else {
2517 Expr::InList {
2518 expr: Box::new(expr),
2519 list: if self.dialect.supports_in_empty_list() {
2520 self.parse_comma_separated0(Parser::parse_expr)?
2521 } else {
2522 self.parse_comma_separated(Parser::parse_expr)?
2523 },
2524 negated,
2525 }
2526 };
2527 self.expect_token(&Token::RParen)?;
2528 Ok(in_op)
2529 }
2530
2531 pub fn parse_between(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
2533 let low = self.parse_subexpr(Self::BETWEEN_PREC)?;
2536 self.expect_keyword(Keyword::AND)?;
2537 let high = self.parse_subexpr(Self::BETWEEN_PREC)?;
2538 Ok(Expr::Between {
2539 expr: Box::new(expr),
2540 negated,
2541 low: Box::new(low),
2542 high: Box::new(high),
2543 })
2544 }
2545
2546 pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
2548 Ok(Expr::Cast {
2549 expr: Box::new(expr),
2550 data_type: self.parse_data_type()?,
2551 format: None,
2552 })
2553 }
2554
2555 const MUL_DIV_MOD_OP_PREC: u8 = 40;
2557 const PLUS_MINUS_PREC: u8 = 30;
2558 const XOR_PREC: u8 = 24;
2559 const TIME_ZONE_PREC: u8 = 20;
2560 const BETWEEN_PREC: u8 = 20;
2561 const LIKE_PREC: u8 = 19;
2562 const IS_PREC: u8 = 17;
2563 const UNARY_NOT_PREC: u8 = 15;
2564 const AND_PREC: u8 = 10;
2565 const OR_PREC: u8 = 5;
2566
2567 pub fn get_next_precedence(&self) -> Result<u8, ParserError> {
2569 if let Some(precedence) = self.dialect.get_next_precedence(self) {
2571 return precedence;
2572 }
2573
2574 let token = self.peek_token();
2575 debug!("get_next_precedence() {:?}", token);
2576 let token_0 = self.peek_nth_token(0);
2577 let token_1 = self.peek_nth_token(1);
2578 let token_2 = self.peek_nth_token(2);
2579 debug!("0: {token_0} 1: {token_1} 2: {token_2}");
2580 match token.token {
2581 Token::Word(w) if w.keyword == Keyword::OR => Ok(Self::OR_PREC),
2582 Token::Word(w) if w.keyword == Keyword::AND => Ok(Self::AND_PREC),
2583 Token::Word(w) if w.keyword == Keyword::XOR => Ok(Self::XOR_PREC),
2584
2585 Token::Word(w) if w.keyword == Keyword::AT => {
2586 match (self.peek_nth_token(1).token, self.peek_nth_token(2).token) {
2587 (Token::Word(w), Token::Word(w2))
2588 if w.keyword == Keyword::TIME && w2.keyword == Keyword::ZONE =>
2589 {
2590 Ok(Self::TIME_ZONE_PREC)
2591 }
2592 _ => Ok(0),
2593 }
2594 }
2595
2596 Token::Word(w) if w.keyword == Keyword::NOT => match self.peek_nth_token(1).token {
2597 Token::Word(w) if w.keyword == Keyword::IN => Ok(Self::BETWEEN_PREC),
2603 Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(Self::BETWEEN_PREC),
2604 Token::Word(w) if w.keyword == Keyword::LIKE => Ok(Self::LIKE_PREC),
2605 Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(Self::LIKE_PREC),
2606 Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(Self::LIKE_PREC),
2607 Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(Self::LIKE_PREC),
2608 Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(Self::LIKE_PREC),
2609 _ => Ok(0),
2610 },
2611 Token::Word(w) if w.keyword == Keyword::IS => Ok(Self::IS_PREC),
2612 Token::Word(w) if w.keyword == Keyword::IN => Ok(Self::BETWEEN_PREC),
2613 Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(Self::BETWEEN_PREC),
2614 Token::Word(w) if w.keyword == Keyword::LIKE => Ok(Self::LIKE_PREC),
2615 Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(Self::LIKE_PREC),
2616 Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(Self::LIKE_PREC),
2617 Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(Self::LIKE_PREC),
2618 Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(Self::LIKE_PREC),
2619 Token::Word(w) if w.keyword == Keyword::OPERATOR => Ok(Self::BETWEEN_PREC),
2620 Token::Word(w) if w.keyword == Keyword::DIV => Ok(Self::MUL_DIV_MOD_OP_PREC),
2621 Token::Eq
2622 | Token::Lt
2623 | Token::LtEq
2624 | Token::Neq
2625 | Token::Gt
2626 | Token::GtEq
2627 | Token::DoubleEq
2628 | Token::Tilde
2629 | Token::TildeAsterisk
2630 | Token::ExclamationMarkTilde
2631 | Token::ExclamationMarkTildeAsterisk
2632 | Token::DoubleTilde
2633 | Token::DoubleTildeAsterisk
2634 | Token::ExclamationMarkDoubleTilde
2635 | Token::ExclamationMarkDoubleTildeAsterisk
2636 | Token::Spaceship => Ok(20),
2637 Token::Pipe => Ok(21),
2638 Token::Caret | Token::Sharp | Token::ShiftRight | Token::ShiftLeft => Ok(22),
2639 Token::Ampersand => Ok(23),
2640 Token::Plus | Token::Minus => Ok(Self::PLUS_MINUS_PREC),
2641 Token::Mul | Token::Div | Token::DuckIntDiv | Token::Mod | Token::StringConcat => {
2642 Ok(Self::MUL_DIV_MOD_OP_PREC)
2643 }
2644 Token::DoubleColon => Ok(50),
2645 Token::Colon => Ok(50),
2646 Token::ExclamationMark => Ok(50),
2647 Token::LBracket
2648 | Token::LongArrow
2649 | Token::Arrow
2650 | Token::Overlap
2651 | Token::CaretAt
2652 | Token::HashArrow
2653 | Token::HashLongArrow
2654 | Token::AtArrow
2655 | Token::ArrowAt
2656 | Token::HashMinus
2657 | Token::AtQuestion
2658 | Token::AtAt => Ok(50),
2659 _ => Ok(0),
2660 }
2661 }
2662
2663 pub fn peek_token(&self) -> TokenWithLocation {
2666 self.peek_nth_token(0)
2667 }
2668
2669 pub fn peek_nth_token(&self, mut n: usize) -> TokenWithLocation {
2671 let mut index = self.index;
2672 loop {
2673 index += 1;
2674 match self.tokens.get(index - 1) {
2675 Some(TokenWithLocation {
2676 token: Token::Whitespace(_),
2677 location: _,
2678 }) => continue,
2679 non_whitespace => {
2680 if n == 0 {
2681 return non_whitespace.cloned().unwrap_or(TokenWithLocation {
2682 token: Token::EOF,
2683 location: Location { line: 0, column: 0 },
2684 });
2685 }
2686 n -= 1;
2687 }
2688 }
2689 }
2690 }
2691
2692 pub fn peek_token_no_skip(&self) -> TokenWithLocation {
2695 self.peek_nth_token_no_skip(0)
2696 }
2697
2698 pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithLocation {
2700 self.tokens
2701 .get(self.index + n)
2702 .cloned()
2703 .unwrap_or(TokenWithLocation {
2704 token: Token::EOF,
2705 location: Location { line: 0, column: 0 },
2706 })
2707 }
2708
2709 pub fn next_token(&mut self) -> TokenWithLocation {
2713 loop {
2714 self.index += 1;
2715 match self.tokens.get(self.index - 1) {
2716 Some(TokenWithLocation {
2717 token: Token::Whitespace(_),
2718 location: _,
2719 }) => continue,
2720 token => {
2721 return token
2722 .cloned()
2723 .unwrap_or_else(|| TokenWithLocation::wrap(Token::EOF))
2724 }
2725 }
2726 }
2727 }
2728
2729 pub fn next_token_no_skip(&mut self) -> Option<&TokenWithLocation> {
2731 self.index += 1;
2732 self.tokens.get(self.index - 1)
2733 }
2734
2735 pub fn prev_token(&mut self) {
2739 loop {
2740 assert!(self.index > 0);
2741 self.index -= 1;
2742 if let Some(TokenWithLocation {
2743 token: Token::Whitespace(_),
2744 location: _,
2745 }) = self.tokens.get(self.index)
2746 {
2747 continue;
2748 }
2749 return;
2750 }
2751 }
2752
2753 pub fn expected<T>(&self, expected: &str, found: TokenWithLocation) -> Result<T, ParserError> {
2755 parser_err!(
2756 format!("Expected {expected}, found: {found}"),
2757 found.location
2758 )
2759 }
2760
2761 #[must_use]
2764 pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
2765 match self.peek_token().token {
2766 Token::Word(w) if expected == w.keyword => {
2767 self.next_token();
2768 true
2769 }
2770 _ => false,
2771 }
2772 }
2773
2774 #[must_use]
2778 pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
2779 let index = self.index;
2780 for &keyword in keywords {
2781 if !self.parse_keyword(keyword) {
2782 self.index = index;
2785 return false;
2786 }
2787 }
2788 true
2789 }
2790
2791 #[must_use]
2795 pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
2796 match self.peek_token().token {
2797 Token::Word(w) => {
2798 keywords
2799 .iter()
2800 .find(|keyword| **keyword == w.keyword)
2801 .map(|keyword| {
2802 self.next_token();
2803 *keyword
2804 })
2805 }
2806 _ => None,
2807 }
2808 }
2809
2810 pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
2813 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
2814 Ok(keyword)
2815 } else {
2816 let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
2817 self.expected(
2818 &format!("one of {}", keywords.join(" or ")),
2819 self.peek_token(),
2820 )
2821 }
2822 }
2823
2824 pub fn expect_keyword(&mut self, expected: Keyword) -> Result<(), ParserError> {
2827 if self.parse_keyword(expected) {
2828 Ok(())
2829 } else {
2830 self.expected(format!("{:?}", &expected).as_str(), self.peek_token())
2831 }
2832 }
2833
2834 pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
2837 for &kw in expected {
2838 self.expect_keyword(kw)?;
2839 }
2840 Ok(())
2841 }
2842
2843 #[must_use]
2845 pub fn consume_token(&mut self, expected: &Token) -> bool {
2846 if self.peek_token() == *expected {
2847 self.next_token();
2848 true
2849 } else {
2850 false
2851 }
2852 }
2853
2854 pub fn expect_token(&mut self, expected: &Token) -> Result<(), ParserError> {
2856 if self.consume_token(expected) {
2857 Ok(())
2858 } else {
2859 self.expected(&expected.to_string(), self.peek_token())
2860 }
2861 }
2862
2863 pub fn parse_projection(&mut self) -> Result<Vec<SelectItem>, ParserError> {
2865 let old_value = self.options.trailing_commas;
2872 self.options.trailing_commas |= dialect_of!(self is BigQueryDialect);
2873
2874 let ret = self.parse_comma_separated(|p| p.parse_select_item());
2875 self.options.trailing_commas = old_value;
2876
2877 ret
2878 }
2879
2880 pub fn parse_comma_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
2882 where
2883 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
2884 {
2885 let mut values = vec![];
2886 loop {
2887 values.push(f(self)?);
2888 if !self.consume_token(&Token::Comma) {
2889 break;
2890 } else if self.options.trailing_commas {
2891 match self.peek_token().token {
2892 Token::Word(kw)
2893 if keywords::RESERVED_FOR_COLUMN_ALIAS
2894 .iter()
2895 .any(|d| kw.keyword == *d) =>
2896 {
2897 break;
2898 }
2899 Token::RParen
2900 | Token::SemiColon
2901 | Token::EOF
2902 | Token::RBracket
2903 | Token::RBrace => break,
2904 _ => continue,
2905 }
2906 }
2907 }
2908 Ok(values)
2909 }
2910
2911 pub fn parse_comma_separated0<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
2913 where
2914 F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
2915 {
2916 if matches!(self.peek_token().token, Token::RParen) {
2918 return Ok(vec![]);
2919 }
2920 if self.options.trailing_commas
2922 && matches!(self.peek_nth_token(0).token, Token::Comma)
2923 && matches!(self.peek_nth_token(1).token, Token::RParen)
2924 {
2925 let _ = self.consume_token(&Token::Comma);
2926 return Ok(vec![]);
2927 }
2928
2929 self.parse_comma_separated(f)
2930 }
2931
2932 #[must_use]
2935 fn maybe_parse<T, F>(&mut self, mut f: F) -> Option<T>
2936 where
2937 F: FnMut(&mut Parser) -> Result<T, ParserError>,
2938 {
2939 let index = self.index;
2940 if let Ok(t) = f(self) {
2941 Some(t)
2942 } else {
2943 self.index = index;
2944 None
2945 }
2946 }
2947
2948 pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
2951 let loc = self.peek_token().location;
2952 let all = self.parse_keyword(Keyword::ALL);
2953 let distinct = self.parse_keyword(Keyword::DISTINCT);
2954 if !distinct {
2955 return Ok(None);
2956 }
2957 if all {
2958 return parser_err!("Cannot specify both ALL and DISTINCT".to_string(), loc);
2959 }
2960 let on = self.parse_keyword(Keyword::ON);
2961 if !on {
2962 return Ok(Some(Distinct::Distinct));
2963 }
2964
2965 self.expect_token(&Token::LParen)?;
2966 let col_names = if self.consume_token(&Token::RParen) {
2967 self.prev_token();
2968 Vec::new()
2969 } else {
2970 self.parse_comma_separated(Parser::parse_expr)?
2971 };
2972 self.expect_token(&Token::RParen)?;
2973 Ok(Some(Distinct::On(col_names)))
2974 }
2975
2976 pub fn parse_create(&mut self) -> Result<Statement, ParserError> {
2978 let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
2979 let or_alter = self.parse_keywords(&[Keyword::OR, Keyword::ALTER]);
2980 let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
2981 let global = self.parse_one_of_keywords(&[Keyword::GLOBAL]).is_some();
2982 let transient = self.parse_one_of_keywords(&[Keyword::TRANSIENT]).is_some();
2983 let global: Option<bool> = if global {
2984 Some(true)
2985 } else if local {
2986 Some(false)
2987 } else {
2988 None
2989 };
2990 let temporary = self
2991 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
2992 .is_some();
2993 if self.parse_keyword(Keyword::TABLE) {
2994 self.parse_create_table(or_replace, temporary, global, transient)
2995 } else if self.parse_keyword(Keyword::MATERIALIZED) || self.parse_keyword(Keyword::VIEW) {
2996 self.prev_token();
2997 self.parse_create_view(or_replace, temporary)
2998 } else if self.parse_keyword(Keyword::EXTERNAL) {
2999 self.parse_create_external_table(or_replace)
3000 } else if self.parse_keyword(Keyword::FUNCTION) {
3001 self.parse_create_function(or_replace, temporary)
3002 } else if self.parse_keyword(Keyword::MACRO) {
3003 self.parse_create_macro(or_replace, temporary)
3004 } else if or_replace {
3005 self.expected(
3006 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
3007 self.peek_token(),
3008 )
3009 } else if self.parse_keyword(Keyword::EXTENSION) {
3010 self.parse_create_extension()
3011 } else if self.parse_keyword(Keyword::INDEX) {
3012 self.parse_create_index(false)
3013 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
3014 self.parse_create_index(true)
3015 } else if self.parse_keyword(Keyword::VIRTUAL) {
3016 self.parse_create_virtual_table()
3017 } else if self.parse_keyword(Keyword::SCHEMA) {
3018 self.parse_create_schema()
3019 } else if self.parse_keyword(Keyword::DATABASE) {
3020 self.parse_create_database()
3021 } else if self.parse_keyword(Keyword::ROLE) {
3022 self.parse_create_role()
3023 } else if self.parse_keyword(Keyword::SEQUENCE) {
3024 self.parse_create_sequence(temporary)
3025 } else if self.parse_keyword(Keyword::TYPE) {
3026 self.parse_create_type()
3027 } else if self.parse_keyword(Keyword::PROCEDURE) {
3028 self.parse_create_procedure(or_alter)
3029 } else {
3030 self.expected("an object type after CREATE", self.peek_token())
3031 }
3032 }
3033
3034 pub fn parse_cache_table(&mut self) -> Result<Statement, ParserError> {
3036 let (mut table_flag, mut options, mut has_as, mut query) = (None, vec![], false, None);
3037 if self.parse_keyword(Keyword::TABLE) {
3038 let table_name = self.parse_object_name(false)?;
3039 if self.peek_token().token != Token::EOF {
3040 if let Token::Word(word) = self.peek_token().token {
3041 if word.keyword == Keyword::OPTIONS {
3042 options = self.parse_options(Keyword::OPTIONS)?
3043 }
3044 };
3045
3046 if self.peek_token().token != Token::EOF {
3047 let (a, q) = self.parse_as_query()?;
3048 has_as = a;
3049 query = Some(q);
3050 }
3051
3052 Ok(Statement::Cache {
3053 table_flag,
3054 table_name,
3055 has_as,
3056 options,
3057 query,
3058 })
3059 } else {
3060 Ok(Statement::Cache {
3061 table_flag,
3062 table_name,
3063 has_as,
3064 options,
3065 query,
3066 })
3067 }
3068 } else {
3069 table_flag = Some(self.parse_object_name(false)?);
3070 if self.parse_keyword(Keyword::TABLE) {
3071 let table_name = self.parse_object_name(false)?;
3072 if self.peek_token() != Token::EOF {
3073 if let Token::Word(word) = self.peek_token().token {
3074 if word.keyword == Keyword::OPTIONS {
3075 options = self.parse_options(Keyword::OPTIONS)?
3076 }
3077 };
3078
3079 if self.peek_token() != Token::EOF {
3080 let (a, q) = self.parse_as_query()?;
3081 has_as = a;
3082 query = Some(q);
3083 }
3084
3085 Ok(Statement::Cache {
3086 table_flag,
3087 table_name,
3088 has_as,
3089 options,
3090 query,
3091 })
3092 } else {
3093 Ok(Statement::Cache {
3094 table_flag,
3095 table_name,
3096 has_as,
3097 options,
3098 query,
3099 })
3100 }
3101 } else {
3102 if self.peek_token() == Token::EOF {
3103 self.prev_token();
3104 }
3105 self.expected("a `TABLE` keyword", self.peek_token())
3106 }
3107 }
3108 }
3109
3110 pub fn parse_as_query(&mut self) -> Result<(bool, Query), ParserError> {
3112 match self.peek_token().token {
3113 Token::Word(word) => match word.keyword {
3114 Keyword::AS => {
3115 self.next_token();
3116 Ok((true, self.parse_query()?))
3117 }
3118 _ => Ok((false, self.parse_query()?)),
3119 },
3120 _ => self.expected("a QUERY statement", self.peek_token()),
3121 }
3122 }
3123
3124 pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
3126 let has_table = self.parse_keyword(Keyword::TABLE);
3127 if has_table {
3128 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3129 let table_name = self.parse_object_name(false)?;
3130 if self.peek_token().token == Token::EOF {
3131 Ok(Statement::UNCache {
3132 table_name,
3133 if_exists,
3134 })
3135 } else {
3136 self.expected("an `EOF`", self.peek_token())
3137 }
3138 } else {
3139 self.expected("a `TABLE` keyword", self.peek_token())
3140 }
3141 }
3142
3143 pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
3145 self.expect_keyword(Keyword::TABLE)?;
3146 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3147 let table_name = self.parse_object_name(false)?;
3148 self.expect_keyword(Keyword::USING)?;
3149 let module_name = self.parse_identifier(false)?;
3150 let module_args = self.parse_parenthesized_column_list(Optional, false)?;
3155 Ok(Statement::CreateVirtualTable {
3156 name: table_name,
3157 if_not_exists,
3158 module_name,
3159 module_args,
3160 })
3161 }
3162
3163 pub fn parse_create_schema(&mut self) -> Result<Statement, ParserError> {
3164 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3165
3166 let schema_name = self.parse_schema_name()?;
3167
3168 Ok(Statement::CreateSchema {
3169 schema_name,
3170 if_not_exists,
3171 })
3172 }
3173
3174 fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
3175 if self.parse_keyword(Keyword::AUTHORIZATION) {
3176 Ok(SchemaName::UnnamedAuthorization(
3177 self.parse_identifier(false)?,
3178 ))
3179 } else {
3180 let name = self.parse_object_name(false)?;
3181
3182 if self.parse_keyword(Keyword::AUTHORIZATION) {
3183 Ok(SchemaName::NamedAuthorization(
3184 name,
3185 self.parse_identifier(false)?,
3186 ))
3187 } else {
3188 Ok(SchemaName::Simple(name))
3189 }
3190 }
3191 }
3192
3193 pub fn parse_create_database(&mut self) -> Result<Statement, ParserError> {
3194 let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3195 let db_name = self.parse_object_name(false)?;
3196 let mut location = None;
3197 let mut managed_location = None;
3198 loop {
3199 match self.parse_one_of_keywords(&[Keyword::LOCATION, Keyword::MANAGEDLOCATION]) {
3200 Some(Keyword::LOCATION) => location = Some(self.parse_literal_string()?),
3201 Some(Keyword::MANAGEDLOCATION) => {
3202 managed_location = Some(self.parse_literal_string()?)
3203 }
3204 _ => break,
3205 }
3206 }
3207 Ok(Statement::CreateDatabase {
3208 db_name,
3209 if_not_exists: ine,
3210 location,
3211 managed_location,
3212 })
3213 }
3214
3215 pub fn parse_optional_create_function_using(
3216 &mut self,
3217 ) -> Result<Option<CreateFunctionUsing>, ParserError> {
3218 if !self.parse_keyword(Keyword::USING) {
3219 return Ok(None);
3220 };
3221 let keyword =
3222 self.expect_one_of_keywords(&[Keyword::JAR, Keyword::FILE, Keyword::ARCHIVE])?;
3223
3224 let uri = self.parse_literal_string()?;
3225
3226 match keyword {
3227 Keyword::JAR => Ok(Some(CreateFunctionUsing::Jar(uri))),
3228 Keyword::FILE => Ok(Some(CreateFunctionUsing::File(uri))),
3229 Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
3230 _ => self.expected(
3231 "JAR, FILE or ARCHIVE, got {:?}",
3232 TokenWithLocation::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
3233 ),
3234 }
3235 }
3236
3237 pub fn parse_create_function(
3238 &mut self,
3239 or_replace: bool,
3240 temporary: bool,
3241 ) -> Result<Statement, ParserError> {
3242 if dialect_of!(self is HiveDialect) {
3243 let name = self.parse_object_name(false)?;
3244 self.expect_keyword(Keyword::AS)?;
3245 let class_name = self.parse_function_definition()?;
3246 let params = CreateFunctionBody {
3247 as_: Some(class_name),
3248 using: self.parse_optional_create_function_using()?,
3249 ..Default::default()
3250 };
3251
3252 Ok(Statement::CreateFunction {
3253 or_replace,
3254 temporary,
3255 name,
3256 args: None,
3257 return_type: None,
3258 params,
3259 })
3260 } else if dialect_of!(self is PostgreSqlDialect) {
3261 let name = self.parse_object_name(false)?;
3262 self.expect_token(&Token::LParen)?;
3263 let args = if self.consume_token(&Token::RParen) {
3264 self.prev_token();
3265 None
3266 } else {
3267 Some(self.parse_comma_separated(Parser::parse_function_arg)?)
3268 };
3269
3270 self.expect_token(&Token::RParen)?;
3271
3272 let return_type = if self.parse_keyword(Keyword::RETURNS) {
3273 Some(self.parse_data_type()?)
3274 } else {
3275 None
3276 };
3277
3278 let params = self.parse_create_function_body()?;
3279
3280 Ok(Statement::CreateFunction {
3281 or_replace,
3282 temporary,
3283 name,
3284 args,
3285 return_type,
3286 params,
3287 })
3288 } else if dialect_of!(self is DuckDbDialect) {
3289 self.parse_create_macro(or_replace, temporary)
3290 } else {
3291 self.prev_token();
3292 self.expected("an object type after CREATE", self.peek_token())
3293 }
3294 }
3295
3296 fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
3297 let mode = if self.parse_keyword(Keyword::IN) {
3298 Some(ArgMode::In)
3299 } else if self.parse_keyword(Keyword::OUT) {
3300 Some(ArgMode::Out)
3301 } else if self.parse_keyword(Keyword::INOUT) {
3302 Some(ArgMode::InOut)
3303 } else {
3304 None
3305 };
3306
3307 let mut name = None;
3309 let mut data_type = self.parse_data_type()?;
3310 if let DataType::Custom(n, _) = &data_type {
3311 name = Some(n.0[0].clone());
3313 data_type = self.parse_data_type()?;
3314 }
3315
3316 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
3317 {
3318 Some(self.parse_expr()?)
3319 } else {
3320 None
3321 };
3322 Ok(OperateFunctionArg {
3323 mode,
3324 name,
3325 data_type,
3326 default_expr,
3327 })
3328 }
3329
3330 fn parse_create_function_body(&mut self) -> Result<CreateFunctionBody, ParserError> {
3331 let mut body = CreateFunctionBody::default();
3332 loop {
3333 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> Result<(), ParserError> {
3334 if field.is_some() {
3335 return Err(ParserError::ParserError(format!(
3336 "{name} specified more than once",
3337 )));
3338 }
3339 Ok(())
3340 }
3341 if self.parse_keyword(Keyword::AS) {
3342 ensure_not_set(&body.as_, "AS")?;
3343 body.as_ = Some(self.parse_function_definition()?);
3344 } else if self.parse_keyword(Keyword::LANGUAGE) {
3345 ensure_not_set(&body.language, "LANGUAGE")?;
3346 body.language = Some(self.parse_identifier(false)?);
3347 } else if self.parse_keyword(Keyword::IMMUTABLE) {
3348 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
3349 body.behavior = Some(FunctionBehavior::Immutable);
3350 } else if self.parse_keyword(Keyword::STABLE) {
3351 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
3352 body.behavior = Some(FunctionBehavior::Stable);
3353 } else if self.parse_keyword(Keyword::VOLATILE) {
3354 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
3355 body.behavior = Some(FunctionBehavior::Volatile);
3356 } else if self.parse_keyword(Keyword::RETURN) {
3357 ensure_not_set(&body.return_, "RETURN")?;
3358 body.return_ = Some(self.parse_expr()?);
3359 } else {
3360 return Ok(body);
3361 }
3362 }
3363 }
3364
3365 pub fn parse_create_macro(
3366 &mut self,
3367 or_replace: bool,
3368 temporary: bool,
3369 ) -> Result<Statement, ParserError> {
3370 if dialect_of!(self is DuckDbDialect | GenericDialect) {
3371 let name = self.parse_object_name(false)?;
3372 self.expect_token(&Token::LParen)?;
3373 let args = if self.consume_token(&Token::RParen) {
3374 self.prev_token();
3375 None
3376 } else {
3377 Some(self.parse_comma_separated(Parser::parse_macro_arg)?)
3378 };
3379
3380 self.expect_token(&Token::RParen)?;
3381 self.expect_keyword(Keyword::AS)?;
3382
3383 Ok(Statement::CreateMacro {
3384 or_replace,
3385 temporary,
3386 name,
3387 args,
3388 definition: if self.parse_keyword(Keyword::TABLE) {
3389 MacroDefinition::Table(self.parse_query()?)
3390 } else {
3391 MacroDefinition::Expr(self.parse_expr()?)
3392 },
3393 })
3394 } else {
3395 self.prev_token();
3396 self.expected("an object type after CREATE", self.peek_token())
3397 }
3398 }
3399
3400 fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
3401 let name = self.parse_identifier(false)?;
3402
3403 let default_expr =
3404 if self.consume_token(&Token::DuckAssignment) || self.consume_token(&Token::RArrow) {
3405 Some(self.parse_expr()?)
3406 } else {
3407 None
3408 };
3409 Ok(MacroArg { name, default_expr })
3410 }
3411
3412 pub fn parse_create_external_table(
3413 &mut self,
3414 or_replace: bool,
3415 ) -> Result<Statement, ParserError> {
3416 self.expect_keyword(Keyword::TABLE)?;
3417 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3418 let table_name = self.parse_object_name(false)?;
3419 let (columns, constraints) = self.parse_columns()?;
3420
3421 let hive_distribution = self.parse_hive_distribution()?;
3422 let hive_formats = self.parse_hive_formats()?;
3423
3424 let file_format = if let Some(ff) = &hive_formats.storage {
3425 match ff {
3426 HiveIOFormat::FileFormat { format } => Some(*format),
3427 _ => None,
3428 }
3429 } else {
3430 None
3431 };
3432 let location = hive_formats.location.clone();
3433 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
3434 Ok(CreateTableBuilder::new(table_name)
3435 .columns(columns)
3436 .constraints(constraints)
3437 .hive_distribution(hive_distribution)
3438 .hive_formats(Some(hive_formats))
3439 .table_properties(table_properties)
3440 .or_replace(or_replace)
3441 .if_not_exists(if_not_exists)
3442 .external(true)
3443 .file_format(file_format)
3444 .location(location)
3445 .build())
3446 }
3447
3448 pub fn parse_file_format(&mut self) -> Result<FileFormat, ParserError> {
3449 let next_token = self.next_token();
3450 match &next_token.token {
3451 Token::Word(w) => match w.keyword {
3452 Keyword::AVRO => Ok(FileFormat::AVRO),
3453 Keyword::JSONFILE => Ok(FileFormat::JSONFILE),
3454 Keyword::ORC => Ok(FileFormat::ORC),
3455 Keyword::PARQUET => Ok(FileFormat::PARQUET),
3456 Keyword::RCFILE => Ok(FileFormat::RCFILE),
3457 Keyword::SEQUENCEFILE => Ok(FileFormat::SEQUENCEFILE),
3458 Keyword::TEXTFILE => Ok(FileFormat::TEXTFILE),
3459 _ => self.expected("fileformat", next_token),
3460 },
3461 _ => self.expected("fileformat", next_token),
3462 }
3463 }
3464
3465 pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
3466 let next_token = self.next_token();
3467 match &next_token.token {
3468 Token::Word(w) => match w.keyword {
3469 Keyword::TEXT => Ok(AnalyzeFormat::TEXT),
3470 Keyword::GRAPHVIZ => Ok(AnalyzeFormat::GRAPHVIZ),
3471 Keyword::JSON => Ok(AnalyzeFormat::JSON),
3472 _ => self.expected("fileformat", next_token),
3473 },
3474 _ => self.expected("fileformat", next_token),
3475 }
3476 }
3477
3478 pub fn parse_create_view(
3479 &mut self,
3480 or_replace: bool,
3481 temporary: bool,
3482 ) -> Result<Statement, ParserError> {
3483 let materialized = self.parse_keyword(Keyword::MATERIALIZED);
3484 self.expect_keyword(Keyword::VIEW)?;
3485 let if_not_exists = dialect_of!(self is SQLiteDialect|GenericDialect)
3486 && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3487 let name = self.parse_object_name(false)?;
3490 let columns = self.parse_view_columns()?;
3491 let mut options = CreateTableOptions::None;
3492 let with_options = self.parse_options(Keyword::WITH)?;
3493 if !with_options.is_empty() {
3494 options = CreateTableOptions::With(with_options);
3495 }
3496
3497 let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
3498 self.expect_keyword(Keyword::BY)?;
3499 self.parse_parenthesized_column_list(Optional, false)?
3500 } else {
3501 vec![]
3502 };
3503
3504 if dialect_of!(self is BigQueryDialect | GenericDialect) {
3505 if let Token::Word(word) = self.peek_token().token {
3506 if word.keyword == Keyword::OPTIONS {
3507 let opts = self.parse_options(Keyword::OPTIONS)?;
3508 if !opts.is_empty() {
3509 options = CreateTableOptions::Options(opts);
3510 }
3511 }
3512 };
3513 }
3514
3515 self.expect_keyword(Keyword::AS)?;
3516 let query = Box::new(self.parse_query()?);
3517 let with_no_schema_binding = dialect_of!(self is RedshiftSqlDialect | GenericDialect)
3520 && self.parse_keywords(&[
3521 Keyword::WITH,
3522 Keyword::NO,
3523 Keyword::SCHEMA,
3524 Keyword::BINDING,
3525 ]);
3526
3527 Ok(Statement::CreateView {
3528 name,
3529 columns,
3530 query,
3531 materialized,
3532 or_replace,
3533 options,
3534 cluster_by,
3535 with_no_schema_binding,
3536 if_not_exists,
3537 temporary,
3538 })
3539 }
3540
3541 pub fn parse_create_role(&mut self) -> Result<Statement, ParserError> {
3542 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3543 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
3544
3545 let _ = self.parse_keyword(Keyword::WITH); let optional_keywords = if dialect_of!(self is MsSqlDialect) {
3548 vec![Keyword::AUTHORIZATION]
3549 } else if dialect_of!(self is PostgreSqlDialect) {
3550 vec![
3551 Keyword::LOGIN,
3552 Keyword::NOLOGIN,
3553 Keyword::INHERIT,
3554 Keyword::NOINHERIT,
3555 Keyword::BYPASSRLS,
3556 Keyword::NOBYPASSRLS,
3557 Keyword::PASSWORD,
3558 Keyword::CREATEDB,
3559 Keyword::NOCREATEDB,
3560 Keyword::CREATEROLE,
3561 Keyword::NOCREATEROLE,
3562 Keyword::SUPERUSER,
3563 Keyword::NOSUPERUSER,
3564 Keyword::REPLICATION,
3565 Keyword::NOREPLICATION,
3566 Keyword::CONNECTION,
3567 Keyword::VALID,
3568 Keyword::IN,
3569 Keyword::ROLE,
3570 Keyword::ADMIN,
3571 Keyword::USER,
3572 ]
3573 } else {
3574 vec![]
3575 };
3576
3577 let mut authorization_owner = None;
3579 let mut login = None;
3581 let mut inherit = None;
3582 let mut bypassrls = None;
3583 let mut password = None;
3584 let mut create_db = None;
3585 let mut create_role = None;
3586 let mut superuser = None;
3587 let mut replication = None;
3588 let mut connection_limit = None;
3589 let mut valid_until = None;
3590 let mut in_role = vec![];
3591 let mut in_group = vec![];
3592 let mut role = vec![];
3593 let mut user = vec![];
3594 let mut admin = vec![];
3595
3596 while let Some(keyword) = self.parse_one_of_keywords(&optional_keywords) {
3597 let loc = self
3598 .tokens
3599 .get(self.index - 1)
3600 .map_or(Location { line: 0, column: 0 }, |t| t.location);
3601 match keyword {
3602 Keyword::AUTHORIZATION => {
3603 if authorization_owner.is_some() {
3604 parser_err!("Found multiple AUTHORIZATION", loc)
3605 } else {
3606 authorization_owner = Some(self.parse_object_name(false)?);
3607 Ok(())
3608 }
3609 }
3610 Keyword::LOGIN | Keyword::NOLOGIN => {
3611 if login.is_some() {
3612 parser_err!("Found multiple LOGIN or NOLOGIN", loc)
3613 } else {
3614 login = Some(keyword == Keyword::LOGIN);
3615 Ok(())
3616 }
3617 }
3618 Keyword::INHERIT | Keyword::NOINHERIT => {
3619 if inherit.is_some() {
3620 parser_err!("Found multiple INHERIT or NOINHERIT", loc)
3621 } else {
3622 inherit = Some(keyword == Keyword::INHERIT);
3623 Ok(())
3624 }
3625 }
3626 Keyword::BYPASSRLS | Keyword::NOBYPASSRLS => {
3627 if bypassrls.is_some() {
3628 parser_err!("Found multiple BYPASSRLS or NOBYPASSRLS", loc)
3629 } else {
3630 bypassrls = Some(keyword == Keyword::BYPASSRLS);
3631 Ok(())
3632 }
3633 }
3634 Keyword::CREATEDB | Keyword::NOCREATEDB => {
3635 if create_db.is_some() {
3636 parser_err!("Found multiple CREATEDB or NOCREATEDB", loc)
3637 } else {
3638 create_db = Some(keyword == Keyword::CREATEDB);
3639 Ok(())
3640 }
3641 }
3642 Keyword::CREATEROLE | Keyword::NOCREATEROLE => {
3643 if create_role.is_some() {
3644 parser_err!("Found multiple CREATEROLE or NOCREATEROLE", loc)
3645 } else {
3646 create_role = Some(keyword == Keyword::CREATEROLE);
3647 Ok(())
3648 }
3649 }
3650 Keyword::SUPERUSER | Keyword::NOSUPERUSER => {
3651 if superuser.is_some() {
3652 parser_err!("Found multiple SUPERUSER or NOSUPERUSER", loc)
3653 } else {
3654 superuser = Some(keyword == Keyword::SUPERUSER);
3655 Ok(())
3656 }
3657 }
3658 Keyword::REPLICATION | Keyword::NOREPLICATION => {
3659 if replication.is_some() {
3660 parser_err!("Found multiple REPLICATION or NOREPLICATION", loc)
3661 } else {
3662 replication = Some(keyword == Keyword::REPLICATION);
3663 Ok(())
3664 }
3665 }
3666 Keyword::PASSWORD => {
3667 if password.is_some() {
3668 parser_err!("Found multiple PASSWORD", loc)
3669 } else {
3670 password = if self.parse_keyword(Keyword::NULL) {
3671 Some(Password::NullPassword)
3672 } else {
3673 Some(Password::Password(Expr::Value(self.parse_value()?)))
3674 };
3675 Ok(())
3676 }
3677 }
3678 Keyword::CONNECTION => {
3679 self.expect_keyword(Keyword::LIMIT)?;
3680 if connection_limit.is_some() {
3681 parser_err!("Found multiple CONNECTION LIMIT", loc)
3682 } else {
3683 connection_limit = Some(Expr::Value(self.parse_number_value()?));
3684 Ok(())
3685 }
3686 }
3687 Keyword::VALID => {
3688 self.expect_keyword(Keyword::UNTIL)?;
3689 if valid_until.is_some() {
3690 parser_err!("Found multiple VALID UNTIL", loc)
3691 } else {
3692 valid_until = Some(Expr::Value(self.parse_value()?));
3693 Ok(())
3694 }
3695 }
3696 Keyword::IN => {
3697 if self.parse_keyword(Keyword::ROLE) {
3698 if !in_role.is_empty() {
3699 parser_err!("Found multiple IN ROLE", loc)
3700 } else {
3701 in_role = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3702 Ok(())
3703 }
3704 } else if self.parse_keyword(Keyword::GROUP) {
3705 if !in_group.is_empty() {
3706 parser_err!("Found multiple IN GROUP", loc)
3707 } else {
3708 in_group = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3709 Ok(())
3710 }
3711 } else {
3712 self.expected("ROLE or GROUP after IN", self.peek_token())
3713 }
3714 }
3715 Keyword::ROLE => {
3716 if !role.is_empty() {
3717 parser_err!("Found multiple ROLE", loc)
3718 } else {
3719 role = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3720 Ok(())
3721 }
3722 }
3723 Keyword::USER => {
3724 if !user.is_empty() {
3725 parser_err!("Found multiple USER", loc)
3726 } else {
3727 user = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3728 Ok(())
3729 }
3730 }
3731 Keyword::ADMIN => {
3732 if !admin.is_empty() {
3733 parser_err!("Found multiple ADMIN", loc)
3734 } else {
3735 admin = self.parse_comma_separated(|p| p.parse_identifier(false))?;
3736 Ok(())
3737 }
3738 }
3739 _ => break,
3740 }?
3741 }
3742
3743 Ok(Statement::CreateRole {
3744 names,
3745 if_not_exists,
3746 login,
3747 inherit,
3748 bypassrls,
3749 password,
3750 create_db,
3751 create_role,
3752 replication,
3753 superuser,
3754 connection_limit,
3755 valid_until,
3756 in_role,
3757 in_group,
3758 role,
3759 user,
3760 admin,
3761 authorization_owner,
3762 })
3763 }
3764
3765 pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
3766 let temporary = dialect_of!(self is MySqlDialect | GenericDialect)
3768 && self.parse_keyword(Keyword::TEMPORARY);
3769
3770 let object_type = if self.parse_keyword(Keyword::TABLE) {
3771 ObjectType::Table
3772 } else if self.parse_keyword(Keyword::VIEW) {
3773 ObjectType::View
3774 } else if self.parse_keyword(Keyword::INDEX) {
3775 ObjectType::Index
3776 } else if self.parse_keyword(Keyword::ROLE) {
3777 ObjectType::Role
3778 } else if self.parse_keyword(Keyword::SCHEMA) {
3779 ObjectType::Schema
3780 } else if self.parse_keyword(Keyword::SEQUENCE) {
3781 ObjectType::Sequence
3782 } else if self.parse_keyword(Keyword::STAGE) {
3783 ObjectType::Stage
3784 } else if self.parse_keyword(Keyword::FUNCTION) {
3785 return self.parse_drop_function();
3786 } else {
3787 return self.expected(
3788 "TABLE, VIEW, INDEX, ROLE, SCHEMA, FUNCTION, STAGE or SEQUENCE after DROP",
3789 self.peek_token(),
3790 );
3791 };
3792 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3795 let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
3796
3797 let loc = self.peek_token().location;
3798 let cascade = self.parse_keyword(Keyword::CASCADE);
3799 let restrict = self.parse_keyword(Keyword::RESTRICT);
3800 let purge = self.parse_keyword(Keyword::PURGE);
3801 if cascade && restrict {
3802 return parser_err!("Cannot specify both CASCADE and RESTRICT in DROP", loc);
3803 }
3804 if object_type == ObjectType::Role && (cascade || restrict || purge) {
3805 return parser_err!(
3806 "Cannot specify CASCADE, RESTRICT, or PURGE in DROP ROLE",
3807 loc
3808 );
3809 }
3810 Ok(Statement::Drop {
3811 object_type,
3812 if_exists,
3813 names,
3814 cascade,
3815 restrict,
3816 purge,
3817 temporary,
3818 })
3819 }
3820
3821 fn parse_drop_function(&mut self) -> Result<Statement, ParserError> {
3826 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3827 let func_desc = self.parse_comma_separated(Parser::parse_drop_function_desc)?;
3828 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
3829 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
3830 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
3831 _ => None,
3832 };
3833 Ok(Statement::DropFunction {
3834 if_exists,
3835 func_desc,
3836 option,
3837 })
3838 }
3839
3840 fn parse_drop_function_desc(&mut self) -> Result<DropFunctionDesc, ParserError> {
3841 let name = self.parse_object_name(false)?;
3842
3843 let args = if self.consume_token(&Token::LParen) {
3844 if self.consume_token(&Token::RParen) {
3845 None
3846 } else {
3847 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
3848 self.expect_token(&Token::RParen)?;
3849 Some(args)
3850 }
3851 } else {
3852 None
3853 };
3854
3855 Ok(DropFunctionDesc { name, args })
3856 }
3857
3858 pub fn parse_declare(&mut self) -> Result<Statement, ParserError> {
3863 let name = self.parse_identifier(false)?;
3864
3865 let binary = self.parse_keyword(Keyword::BINARY);
3866 let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
3867 Some(true)
3868 } else if self.parse_keyword(Keyword::ASENSITIVE) {
3869 Some(false)
3870 } else {
3871 None
3872 };
3873 let scroll = if self.parse_keyword(Keyword::SCROLL) {
3874 Some(true)
3875 } else if self.parse_keywords(&[Keyword::NO, Keyword::SCROLL]) {
3876 Some(false)
3877 } else {
3878 None
3879 };
3880
3881 self.expect_keyword(Keyword::CURSOR)?;
3882
3883 let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
3884 Some(keyword) => {
3885 self.expect_keyword(Keyword::HOLD)?;
3886
3887 match keyword {
3888 Keyword::WITH => Some(true),
3889 Keyword::WITHOUT => Some(false),
3890 _ => unreachable!(),
3891 }
3892 }
3893 None => None,
3894 };
3895
3896 self.expect_keyword(Keyword::FOR)?;
3897
3898 let query = self.parse_query()?;
3899
3900 Ok(Statement::Declare {
3901 name,
3902 binary,
3903 sensitive,
3904 scroll,
3905 hold,
3906 query: Box::new(query),
3907 })
3908 }
3909
3910 pub fn parse_fetch_statement(&mut self) -> Result<Statement, ParserError> {
3912 let direction = if self.parse_keyword(Keyword::NEXT) {
3913 FetchDirection::Next
3914 } else if self.parse_keyword(Keyword::PRIOR) {
3915 FetchDirection::Prior
3916 } else if self.parse_keyword(Keyword::FIRST) {
3917 FetchDirection::First
3918 } else if self.parse_keyword(Keyword::LAST) {
3919 FetchDirection::Last
3920 } else if self.parse_keyword(Keyword::ABSOLUTE) {
3921 FetchDirection::Absolute {
3922 limit: self.parse_number_value()?,
3923 }
3924 } else if self.parse_keyword(Keyword::RELATIVE) {
3925 FetchDirection::Relative {
3926 limit: self.parse_number_value()?,
3927 }
3928 } else if self.parse_keyword(Keyword::FORWARD) {
3929 if self.parse_keyword(Keyword::ALL) {
3930 FetchDirection::ForwardAll
3931 } else {
3932 FetchDirection::Forward {
3933 limit: Some(self.parse_number_value()?),
3935 }
3936 }
3937 } else if self.parse_keyword(Keyword::BACKWARD) {
3938 if self.parse_keyword(Keyword::ALL) {
3939 FetchDirection::BackwardAll
3940 } else {
3941 FetchDirection::Backward {
3942 limit: Some(self.parse_number_value()?),
3944 }
3945 }
3946 } else if self.parse_keyword(Keyword::ALL) {
3947 FetchDirection::All
3948 } else {
3949 FetchDirection::Count {
3950 limit: self.parse_number_value()?,
3951 }
3952 };
3953
3954 self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
3955
3956 let name = self.parse_identifier(false)?;
3957
3958 let into = if self.parse_keyword(Keyword::INTO) {
3959 Some(self.parse_object_name(false)?)
3960 } else {
3961 None
3962 };
3963
3964 Ok(Statement::Fetch {
3965 name,
3966 direction,
3967 into,
3968 })
3969 }
3970
3971 pub fn parse_discard(&mut self) -> Result<Statement, ParserError> {
3972 let object_type = if self.parse_keyword(Keyword::ALL) {
3973 DiscardObject::ALL
3974 } else if self.parse_keyword(Keyword::PLANS) {
3975 DiscardObject::PLANS
3976 } else if self.parse_keyword(Keyword::SEQUENCES) {
3977 DiscardObject::SEQUENCES
3978 } else if self.parse_keyword(Keyword::TEMP) || self.parse_keyword(Keyword::TEMPORARY) {
3979 DiscardObject::TEMP
3980 } else {
3981 return self.expected(
3982 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
3983 self.peek_token(),
3984 );
3985 };
3986 Ok(Statement::Discard { object_type })
3987 }
3988
3989 pub fn parse_create_index(&mut self, unique: bool) -> Result<Statement, ParserError> {
3990 let concurrently = self.parse_keyword(Keyword::CONCURRENTLY);
3991 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3992 let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
3993 let index_name = self.parse_object_name(false)?;
3994 self.expect_keyword(Keyword::ON)?;
3995 Some(index_name)
3996 } else {
3997 None
3998 };
3999 let table_name = self.parse_object_name(false)?;
4000 let using = if self.parse_keyword(Keyword::USING) {
4001 Some(self.parse_identifier(false)?)
4002 } else {
4003 None
4004 };
4005 self.expect_token(&Token::LParen)?;
4006 let columns = self.parse_comma_separated(Parser::parse_order_by_expr)?;
4007 self.expect_token(&Token::RParen)?;
4008
4009 let include = if self.parse_keyword(Keyword::INCLUDE) {
4010 self.expect_token(&Token::LParen)?;
4011 let columns = self.parse_comma_separated(|p| p.parse_identifier(false))?;
4012 self.expect_token(&Token::RParen)?;
4013 columns
4014 } else {
4015 vec![]
4016 };
4017
4018 let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
4019 let not = self.parse_keyword(Keyword::NOT);
4020 self.expect_keyword(Keyword::DISTINCT)?;
4021 Some(!not)
4022 } else {
4023 None
4024 };
4025
4026 let predicate = if self.parse_keyword(Keyword::WHERE) {
4027 Some(self.parse_expr()?)
4028 } else {
4029 None
4030 };
4031
4032 Ok(Statement::CreateIndex {
4033 name: index_name,
4034 table_name,
4035 using,
4036 columns,
4037 unique,
4038 concurrently,
4039 if_not_exists,
4040 include,
4041 nulls_distinct,
4042 predicate,
4043 })
4044 }
4045
4046 pub fn parse_create_extension(&mut self) -> Result<Statement, ParserError> {
4047 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
4048 let name = self.parse_identifier(false)?;
4049
4050 let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
4051 let schema = if self.parse_keyword(Keyword::SCHEMA) {
4052 Some(self.parse_identifier(false)?)
4053 } else {
4054 None
4055 };
4056
4057 let version = if self.parse_keyword(Keyword::VERSION) {
4058 Some(self.parse_identifier(false)?)
4059 } else {
4060 None
4061 };
4062
4063 let cascade = self.parse_keyword(Keyword::CASCADE);
4064
4065 (schema, version, cascade)
4066 } else {
4067 (None, None, false)
4068 };
4069
4070 Ok(Statement::CreateExtension {
4071 name,
4072 if_not_exists,
4073 schema,
4074 version,
4075 cascade,
4076 })
4077 }
4078
4079 pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
4081 if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
4082 self.expect_token(&Token::LParen)?;
4083 let columns = self.parse_comma_separated(Parser::parse_column_def)?;
4084 self.expect_token(&Token::RParen)?;
4085 Ok(HiveDistributionStyle::PARTITIONED { columns })
4086 } else {
4087 Ok(HiveDistributionStyle::NONE)
4088 }
4089 }
4090
4091 pub fn parse_hive_formats(&mut self) -> Result<HiveFormat, ParserError> {
4092 let mut hive_format = HiveFormat::default();
4093 loop {
4094 match self.parse_one_of_keywords(&[Keyword::ROW, Keyword::STORED, Keyword::LOCATION]) {
4095 Some(Keyword::ROW) => {
4096 hive_format.row_format = Some(self.parse_row_format()?);
4097 }
4098 Some(Keyword::STORED) => {
4099 self.expect_keyword(Keyword::AS)?;
4100 if self.parse_keyword(Keyword::INPUTFORMAT) {
4101 let input_format = self.parse_expr()?;
4102 self.expect_keyword(Keyword::OUTPUTFORMAT)?;
4103 let output_format = self.parse_expr()?;
4104 hive_format.storage = Some(HiveIOFormat::IOF {
4105 input_format,
4106 output_format,
4107 });
4108 } else {
4109 let format = self.parse_file_format()?;
4110 hive_format.storage = Some(HiveIOFormat::FileFormat { format });
4111 }
4112 }
4113 Some(Keyword::LOCATION) => {
4114 hive_format.location = Some(self.parse_literal_string()?);
4115 }
4116 None => break,
4117 _ => break,
4118 }
4119 }
4120
4121 Ok(hive_format)
4122 }
4123
4124 pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
4125 self.expect_keyword(Keyword::FORMAT)?;
4126 match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
4127 Some(Keyword::SERDE) => {
4128 let class = self.parse_literal_string()?;
4129 Ok(HiveRowFormat::SERDE { class })
4130 }
4131 _ => Ok(HiveRowFormat::DELIMITED),
4132 }
4133 }
4134
4135 pub fn parse_create_table(
4136 &mut self,
4137 or_replace: bool,
4138 temporary: bool,
4139 global: Option<bool>,
4140 transient: bool,
4141 ) -> Result<Statement, ParserError> {
4142 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
4143 let table_name = self.parse_object_name(false)?;
4144
4145 let on_cluster = if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
4147 let next_token = self.next_token();
4148 match next_token.token {
4149 Token::SingleQuotedString(s) => Some(s),
4150 Token::Word(s) => Some(s.to_string()),
4151 _ => self.expected("identifier or cluster literal", next_token)?,
4152 }
4153 } else {
4154 None
4155 };
4156
4157 let like = if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
4158 self.parse_object_name(false).ok()
4159 } else {
4160 None
4161 };
4162
4163 let clone = if self.parse_keyword(Keyword::CLONE) {
4164 self.parse_object_name(false).ok()
4165 } else {
4166 None
4167 };
4168
4169 let (columns, constraints) = self.parse_columns()?;
4171
4172 let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
4174
4175 let hive_distribution = self.parse_hive_distribution()?;
4176 let hive_formats = self.parse_hive_formats()?;
4177 let with_options = self.parse_options(Keyword::WITH)?;
4179 let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
4180
4181 let engine = if self.parse_keyword(Keyword::ENGINE) {
4182 self.expect_token(&Token::Eq)?;
4183 let next_token = self.next_token();
4184 match next_token.token {
4185 Token::Word(w) => Some(w.value),
4186 _ => self.expected("identifier", next_token)?,
4187 }
4188 } else {
4189 None
4190 };
4191
4192 let auto_increment_offset = if self.parse_keyword(Keyword::AUTO_INCREMENT) {
4193 let _ = self.consume_token(&Token::Eq);
4194 let next_token = self.next_token();
4195 match next_token.token {
4196 Token::Number(s, _) => Some(s.parse::<u32>().expect("literal int")),
4197 _ => self.expected("literal int", next_token)?,
4198 }
4199 } else {
4200 None
4201 };
4202
4203 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
4204 if self.consume_token(&Token::LParen) {
4205 let columns = if self.peek_token() != Token::RParen {
4206 self.parse_comma_separated(|p| p.parse_identifier(false))?
4207 } else {
4208 vec![]
4209 };
4210 self.expect_token(&Token::RParen)?;
4211 Some(columns)
4212 } else {
4213 Some(vec![self.parse_identifier(false)?])
4214 }
4215 } else {
4216 None
4217 };
4218
4219 let big_query_config = if dialect_of!(self is BigQueryDialect | GenericDialect) {
4220 self.parse_optional_big_query_create_table_config()?
4221 } else {
4222 Default::default()
4223 };
4224
4225 let query = if self.parse_keyword(Keyword::AS) {
4227 Some(Box::new(self.parse_query()?))
4228 } else {
4229 None
4230 };
4231
4232 let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
4233 self.expect_token(&Token::Eq)?;
4234 let next_token = self.next_token();
4235 match next_token.token {
4236 Token::Word(w) => Some(w.value),
4237 _ => self.expected("identifier", next_token)?,
4238 }
4239 } else {
4240 None
4241 };
4242
4243 let collation = if self.parse_keywords(&[Keyword::COLLATE]) {
4244 self.expect_token(&Token::Eq)?;
4245 let next_token = self.next_token();
4246 match next_token.token {
4247 Token::Word(w) => Some(w.value),
4248 _ => self.expected("identifier", next_token)?,
4249 }
4250 } else {
4251 None
4252 };
4253
4254 let on_commit: Option<OnCommit> =
4255 if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, Keyword::DELETE, Keyword::ROWS])
4256 {
4257 Some(OnCommit::DeleteRows)
4258 } else if self.parse_keywords(&[
4259 Keyword::ON,
4260 Keyword::COMMIT,
4261 Keyword::PRESERVE,
4262 Keyword::ROWS,
4263 ]) {
4264 Some(OnCommit::PreserveRows)
4265 } else if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, Keyword::DROP]) {
4266 Some(OnCommit::Drop)
4267 } else {
4268 None
4269 };
4270
4271 let strict = self.parse_keyword(Keyword::STRICT);
4272
4273 let comment = if self.parse_keyword(Keyword::COMMENT) {
4274 let _ = self.consume_token(&Token::Eq);
4275 let next_token = self.next_token();
4276 match next_token.token {
4277 Token::SingleQuotedString(str) => Some(str),
4278 _ => self.expected("comment", next_token)?,
4279 }
4280 } else {
4281 None
4282 };
4283
4284 Ok(CreateTableBuilder::new(table_name)
4285 .temporary(temporary)
4286 .columns(columns)
4287 .constraints(constraints)
4288 .with_options(with_options)
4289 .table_properties(table_properties)
4290 .or_replace(or_replace)
4291 .if_not_exists(if_not_exists)
4292 .transient(transient)
4293 .hive_distribution(hive_distribution)
4294 .hive_formats(Some(hive_formats))
4295 .global(global)
4296 .query(query)
4297 .without_rowid(without_rowid)
4298 .like(like)
4299 .clone_clause(clone)
4300 .engine(engine)
4301 .comment(comment)
4302 .auto_increment_offset(auto_increment_offset)
4303 .order_by(order_by)
4304 .default_charset(default_charset)
4305 .collation(collation)
4306 .on_commit(on_commit)
4307 .on_cluster(on_cluster)
4308 .partition_by(big_query_config.partition_by)
4309 .cluster_by(big_query_config.cluster_by)
4310 .options(big_query_config.options)
4311 .strict(strict)
4312 .build())
4313 }
4314
4315 fn parse_optional_big_query_create_table_config(
4318 &mut self,
4319 ) -> Result<BigQueryTableConfiguration, ParserError> {
4320 let mut partition_by = None;
4321 if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
4322 partition_by = Some(Box::new(self.parse_expr()?));
4323 };
4324
4325 let mut cluster_by = None;
4326 if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
4327 cluster_by = Some(self.parse_comma_separated(|p| p.parse_identifier(false))?);
4328 };
4329
4330 let mut options = None;
4331 if let Token::Word(word) = self.peek_token().token {
4332 if word.keyword == Keyword::OPTIONS {
4333 options = Some(self.parse_options(Keyword::OPTIONS)?);
4334 }
4335 };
4336
4337 Ok(BigQueryTableConfiguration {
4338 partition_by,
4339 cluster_by,
4340 options,
4341 })
4342 }
4343
4344 pub fn parse_optional_procedure_parameters(
4345 &mut self,
4346 ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
4347 let mut params = vec![];
4348 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
4349 return Ok(Some(params));
4350 }
4351 loop {
4352 if let Token::Word(_) = self.peek_token().token {
4353 params.push(self.parse_procedure_param()?)
4354 }
4355 let comma = self.consume_token(&Token::Comma);
4356 if self.consume_token(&Token::RParen) {
4357 break;
4359 } else if !comma {
4360 return self.expected("',' or ')' after parameter definition", self.peek_token());
4361 }
4362 }
4363 Ok(Some(params))
4364 }
4365
4366 pub fn parse_columns(&mut self) -> Result<(Vec<ColumnDef>, Vec<TableConstraint>), ParserError> {
4367 let mut columns = vec![];
4368 let mut constraints = vec![];
4369 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
4370 return Ok((columns, constraints));
4371 }
4372
4373 loop {
4374 if let Some(constraint) = self.parse_optional_table_constraint()? {
4375 constraints.push(constraint);
4376 } else if let Token::Word(_) = self.peek_token().token {
4377 columns.push(self.parse_column_def()?);
4378 } else {
4379 return self.expected("column name or constraint definition", self.peek_token());
4380 }
4381 let comma = self.consume_token(&Token::Comma);
4382 if self.consume_token(&Token::RParen) {
4383 break;
4385 } else if !comma {
4386 return self.expected("',' or ')' after column definition", self.peek_token());
4387 }
4388 }
4389
4390 Ok((columns, constraints))
4391 }
4392
4393 pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
4394 let name = self.parse_identifier(false)?;
4395 let data_type = self.parse_data_type()?;
4396 Ok(ProcedureParam { name, data_type })
4397 }
4398
4399 pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
4400 let name = self.parse_identifier(false)?;
4401 let data_type = if self.is_column_type_sqlite_unspecified() {
4402 DataType::Unspecified
4403 } else {
4404 self.parse_data_type()?
4405 };
4406 let mut collation = if self.parse_keyword(Keyword::COLLATE) {
4407 Some(self.parse_object_name(false)?)
4408 } else {
4409 None
4410 };
4411 let mut options = vec![];
4412 loop {
4413 if self.parse_keyword(Keyword::CONSTRAINT) {
4414 let name = Some(self.parse_identifier(false)?);
4415 if let Some(option) = self.parse_optional_column_option()? {
4416 options.push(ColumnOptionDef { name, option });
4417 } else {
4418 return self.expected(
4419 "constraint details after CONSTRAINT <name>",
4420 self.peek_token(),
4421 );
4422 }
4423 } else if let Some(option) = self.parse_optional_column_option()? {
4424 options.push(ColumnOptionDef { name: None, option });
4425 } else if dialect_of!(self is MySqlDialect | GenericDialect)
4426 && self.parse_keyword(Keyword::COLLATE)
4427 {
4428 collation = Some(self.parse_object_name(false)?);
4429 } else {
4430 break;
4431 };
4432 }
4433 Ok(ColumnDef {
4434 name,
4435 data_type,
4436 collation,
4437 options,
4438 })
4439 }
4440
4441 fn is_column_type_sqlite_unspecified(&mut self) -> bool {
4442 if dialect_of!(self is SQLiteDialect) {
4443 match self.peek_token().token {
4444 Token::Word(word) => matches!(
4445 word.keyword,
4446 Keyword::CONSTRAINT
4447 | Keyword::PRIMARY
4448 | Keyword::NOT
4449 | Keyword::UNIQUE
4450 | Keyword::CHECK
4451 | Keyword::DEFAULT
4452 | Keyword::COLLATE
4453 | Keyword::REFERENCES
4454 | Keyword::GENERATED
4455 | Keyword::AS
4456 ),
4457 _ => true, }
4459 } else {
4460 false
4461 }
4462 }
4463
4464 pub fn parse_optional_column_option(&mut self) -> Result<Option<ColumnOption>, ParserError> {
4465 if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
4466 Ok(Some(ColumnOption::CharacterSet(
4467 self.parse_object_name(false)?,
4468 )))
4469 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
4470 Ok(Some(ColumnOption::NotNull))
4471 } else if self.parse_keywords(&[Keyword::COMMENT]) {
4472 let next_token = self.next_token();
4473 match next_token.token {
4474 Token::SingleQuotedString(value, ..) => Ok(Some(ColumnOption::Comment(value))),
4475 _ => self.expected("string", next_token),
4476 }
4477 } else if self.parse_keyword(Keyword::NULL) {
4478 Ok(Some(ColumnOption::Null))
4479 } else if self.parse_keyword(Keyword::DEFAULT) {
4480 Ok(Some(ColumnOption::Default(self.parse_expr()?)))
4481 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
4482 let characteristics = self.parse_constraint_characteristics()?;
4483 Ok(Some(ColumnOption::Unique {
4484 is_primary: true,
4485 characteristics,
4486 }))
4487 } else if self.parse_keyword(Keyword::UNIQUE) {
4488 let characteristics = self.parse_constraint_characteristics()?;
4489 Ok(Some(ColumnOption::Unique {
4490 is_primary: false,
4491 characteristics,
4492 }))
4493 } else if self.parse_keyword(Keyword::REFERENCES) {
4494 let foreign_table = self.parse_object_name(false)?;
4495 let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
4498 let mut on_delete = None;
4499 let mut on_update = None;
4500 loop {
4501 if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
4502 on_delete = Some(self.parse_referential_action()?);
4503 } else if on_update.is_none()
4504 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
4505 {
4506 on_update = Some(self.parse_referential_action()?);
4507 } else {
4508 break;
4509 }
4510 }
4511 let characteristics = self.parse_constraint_characteristics()?;
4512
4513 Ok(Some(ColumnOption::ForeignKey {
4514 foreign_table,
4515 referred_columns,
4516 on_delete,
4517 on_update,
4518 characteristics,
4519 }))
4520 } else if self.parse_keyword(Keyword::CHECK) {
4521 self.expect_token(&Token::LParen)?;
4522 let expr = self.parse_expr()?;
4523 self.expect_token(&Token::RParen)?;
4524 Ok(Some(ColumnOption::Check(expr)))
4525 } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
4526 && dialect_of!(self is MySqlDialect | GenericDialect)
4527 {
4528 Ok(Some(ColumnOption::DialectSpecific(vec![
4530 Token::make_keyword("AUTO_INCREMENT"),
4531 ])))
4532 } else if self.parse_keyword(Keyword::AUTOINCREMENT)
4533 && dialect_of!(self is SQLiteDialect | GenericDialect)
4534 {
4535 Ok(Some(ColumnOption::DialectSpecific(vec![
4537 Token::make_keyword("AUTOINCREMENT"),
4538 ])))
4539 } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
4540 && dialect_of!(self is MySqlDialect | GenericDialect)
4541 {
4542 let expr = self.parse_expr()?;
4543 Ok(Some(ColumnOption::OnUpdate(expr)))
4544 } else if self.parse_keyword(Keyword::GENERATED) {
4545 self.parse_optional_column_option_generated()
4546 } else if dialect_of!(self is BigQueryDialect | GenericDialect)
4547 && self.parse_keyword(Keyword::OPTIONS)
4548 {
4549 self.prev_token();
4550 Ok(Some(ColumnOption::Options(
4551 self.parse_options(Keyword::OPTIONS)?,
4552 )))
4553 } else if self.parse_keyword(Keyword::AS)
4554 && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
4555 {
4556 self.parse_optional_column_option_as()
4557 } else {
4558 Ok(None)
4559 }
4560 }
4561 fn parse_optional_column_option_generated(
4562 &mut self,
4563 ) -> Result<Option<ColumnOption>, ParserError> {
4564 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS, Keyword::IDENTITY]) {
4565 let mut sequence_options = vec![];
4566 if self.expect_token(&Token::LParen).is_ok() {
4567 sequence_options = self.parse_create_sequence_options()?;
4568 self.expect_token(&Token::RParen)?;
4569 }
4570 Ok(Some(ColumnOption::Generated {
4571 generated_as: GeneratedAs::Always,
4572 sequence_options: Some(sequence_options),
4573 generation_expr: None,
4574 generation_expr_mode: None,
4575 generated_keyword: true,
4576 }))
4577 } else if self.parse_keywords(&[
4578 Keyword::BY,
4579 Keyword::DEFAULT,
4580 Keyword::AS,
4581 Keyword::IDENTITY,
4582 ]) {
4583 let mut sequence_options = vec![];
4584 if self.expect_token(&Token::LParen).is_ok() {
4585 sequence_options = self.parse_create_sequence_options()?;
4586 self.expect_token(&Token::RParen)?;
4587 }
4588 Ok(Some(ColumnOption::Generated {
4589 generated_as: GeneratedAs::ByDefault,
4590 sequence_options: Some(sequence_options),
4591 generation_expr: None,
4592 generation_expr_mode: None,
4593 generated_keyword: true,
4594 }))
4595 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
4596 if self.expect_token(&Token::LParen).is_ok() {
4597 let expr = self.parse_expr()?;
4598 self.expect_token(&Token::RParen)?;
4599 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
4600 Ok((
4601 GeneratedAs::ExpStored,
4602 Some(GeneratedExpressionMode::Stored),
4603 ))
4604 } else if dialect_of!(self is PostgreSqlDialect) {
4605 self.expected("STORED", self.peek_token())
4607 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
4608 Ok((GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual)))
4609 } else {
4610 Ok((GeneratedAs::Always, None))
4611 }?;
4612
4613 Ok(Some(ColumnOption::Generated {
4614 generated_as: gen_as,
4615 sequence_options: None,
4616 generation_expr: Some(expr),
4617 generation_expr_mode: expr_mode,
4618 generated_keyword: true,
4619 }))
4620 } else {
4621 Ok(None)
4622 }
4623 } else {
4624 Ok(None)
4625 }
4626 }
4627
4628 fn parse_optional_column_option_as(&mut self) -> Result<Option<ColumnOption>, ParserError> {
4629 self.expect_token(&Token::LParen)?;
4631 let expr = self.parse_expr()?;
4632 self.expect_token(&Token::RParen)?;
4633
4634 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
4635 (
4636 GeneratedAs::ExpStored,
4637 Some(GeneratedExpressionMode::Stored),
4638 )
4639 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
4640 (GeneratedAs::Always, Some(GeneratedExpressionMode::Virtual))
4641 } else {
4642 (GeneratedAs::Always, None)
4643 };
4644
4645 Ok(Some(ColumnOption::Generated {
4646 generated_as: gen_as,
4647 sequence_options: None,
4648 generation_expr: Some(expr),
4649 generation_expr_mode: expr_mode,
4650 generated_keyword: false,
4651 }))
4652 }
4653
4654 pub fn parse_referential_action(&mut self) -> Result<ReferentialAction, ParserError> {
4655 if self.parse_keyword(Keyword::RESTRICT) {
4656 Ok(ReferentialAction::Restrict)
4657 } else if self.parse_keyword(Keyword::CASCADE) {
4658 Ok(ReferentialAction::Cascade)
4659 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
4660 Ok(ReferentialAction::SetNull)
4661 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
4662 Ok(ReferentialAction::NoAction)
4663 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
4664 Ok(ReferentialAction::SetDefault)
4665 } else {
4666 self.expected(
4667 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
4668 self.peek_token(),
4669 )
4670 }
4671 }
4672
4673 pub fn parse_constraint_characteristics(
4674 &mut self,
4675 ) -> Result<Option<ConstraintCharacteristics>, ParserError> {
4676 let mut cc = ConstraintCharacteristics {
4677 deferrable: None,
4678 initially: None,
4679 enforced: None,
4680 };
4681
4682 loop {
4683 if cc.deferrable.is_none() && self.parse_keywords(&[Keyword::NOT, Keyword::DEFERRABLE])
4684 {
4685 cc.deferrable = Some(false);
4686 } else if cc.deferrable.is_none() && self.parse_keyword(Keyword::DEFERRABLE) {
4687 cc.deferrable = Some(true);
4688 } else if cc.initially.is_none() && self.parse_keyword(Keyword::INITIALLY) {
4689 if self.parse_keyword(Keyword::DEFERRED) {
4690 cc.initially = Some(DeferrableInitial::Deferred);
4691 } else if self.parse_keyword(Keyword::IMMEDIATE) {
4692 cc.initially = Some(DeferrableInitial::Immediate);
4693 } else {
4694 self.expected("one of DEFERRED or IMMEDIATE", self.peek_token())?;
4695 }
4696 } else if cc.enforced.is_none() && self.parse_keyword(Keyword::ENFORCED) {
4697 cc.enforced = Some(true);
4698 } else if cc.enforced.is_none()
4699 && self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED])
4700 {
4701 cc.enforced = Some(false);
4702 } else {
4703 break;
4704 }
4705 }
4706
4707 if cc.deferrable.is_some() || cc.initially.is_some() || cc.enforced.is_some() {
4708 Ok(Some(cc))
4709 } else {
4710 Ok(None)
4711 }
4712 }
4713
4714 pub fn parse_optional_table_constraint(
4715 &mut self,
4716 ) -> Result<Option<TableConstraint>, ParserError> {
4717 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
4718 Some(self.parse_identifier(false)?)
4719 } else {
4720 None
4721 };
4722
4723 let next_token = self.next_token();
4724 match next_token.token {
4725 Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
4726 let is_primary = w.keyword == Keyword::PRIMARY;
4727
4728 let _ = self.parse_keyword(Keyword::KEY);
4730
4731 let name = self
4733 .maybe_parse(|parser| parser.parse_identifier(false))
4734 .or(name);
4735
4736 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4737 let characteristics = self.parse_constraint_characteristics()?;
4738 Ok(Some(TableConstraint::Unique {
4739 name,
4740 columns,
4741 is_primary,
4742 characteristics,
4743 }))
4744 }
4745 Token::Word(w) if w.keyword == Keyword::FOREIGN => {
4746 self.expect_keyword(Keyword::KEY)?;
4747 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4748 self.expect_keyword(Keyword::REFERENCES)?;
4749 let foreign_table = self.parse_object_name(false)?;
4750 let referred_columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4751 let mut on_delete = None;
4752 let mut on_update = None;
4753 loop {
4754 if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
4755 on_delete = Some(self.parse_referential_action()?);
4756 } else if on_update.is_none()
4757 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
4758 {
4759 on_update = Some(self.parse_referential_action()?);
4760 } else {
4761 break;
4762 }
4763 }
4764
4765 let characteristics = self.parse_constraint_characteristics()?;
4766
4767 Ok(Some(TableConstraint::ForeignKey {
4768 name,
4769 columns,
4770 foreign_table,
4771 referred_columns,
4772 on_delete,
4773 on_update,
4774 characteristics,
4775 }))
4776 }
4777 Token::Word(w) if w.keyword == Keyword::CHECK => {
4778 self.expect_token(&Token::LParen)?;
4779 let expr = Box::new(self.parse_expr()?);
4780 self.expect_token(&Token::RParen)?;
4781 Ok(Some(TableConstraint::Check { name, expr }))
4782 }
4783 Token::Word(w)
4784 if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
4785 && dialect_of!(self is GenericDialect | MySqlDialect) =>
4786 {
4787 let display_as_key = w.keyword == Keyword::KEY;
4788
4789 let name = match self.peek_token().token {
4790 Token::Word(word) if word.keyword == Keyword::USING => None,
4791 _ => self.maybe_parse(|parser| parser.parse_identifier(false)),
4792 };
4793
4794 let index_type = if self.parse_keyword(Keyword::USING) {
4795 Some(self.parse_index_type()?)
4796 } else {
4797 None
4798 };
4799 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4800
4801 Ok(Some(TableConstraint::Index {
4802 display_as_key,
4803 name,
4804 index_type,
4805 columns,
4806 }))
4807 }
4808 Token::Word(w)
4809 if (w.keyword == Keyword::FULLTEXT || w.keyword == Keyword::SPATIAL)
4810 && dialect_of!(self is GenericDialect | MySqlDialect) =>
4811 {
4812 if let Some(name) = name {
4813 return self.expected(
4814 "FULLTEXT or SPATIAL option without constraint name",
4815 TokenWithLocation {
4816 token: Token::make_keyword(&name.to_string()),
4817 location: next_token.location,
4818 },
4819 );
4820 }
4821
4822 let fulltext = w.keyword == Keyword::FULLTEXT;
4823
4824 let index_type_display = if self.parse_keyword(Keyword::KEY) {
4825 KeyOrIndexDisplay::Key
4826 } else if self.parse_keyword(Keyword::INDEX) {
4827 KeyOrIndexDisplay::Index
4828 } else {
4829 KeyOrIndexDisplay::None
4830 };
4831
4832 let opt_index_name = self.maybe_parse(|parser| parser.parse_identifier(false));
4833
4834 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
4835
4836 Ok(Some(TableConstraint::FulltextOrSpatial {
4837 fulltext,
4838 index_type_display,
4839 opt_index_name,
4840 columns,
4841 }))
4842 }
4843 _ => {
4844 if name.is_some() {
4845 self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK", next_token)
4846 } else {
4847 self.prev_token();
4848 Ok(None)
4849 }
4850 }
4851 }
4852 }
4853
4854 pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
4855 if self.parse_keyword(keyword) {
4856 self.expect_token(&Token::LParen)?;
4857 let options = self.parse_comma_separated(Parser::parse_sql_option)?;
4858 self.expect_token(&Token::RParen)?;
4859 Ok(options)
4860 } else {
4861 Ok(vec![])
4862 }
4863 }
4864
4865 pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
4866 if self.parse_keyword(Keyword::BTREE) {
4867 Ok(IndexType::BTree)
4868 } else if self.parse_keyword(Keyword::HASH) {
4869 Ok(IndexType::Hash)
4870 } else {
4871 self.expected("index type {BTREE | HASH}", self.peek_token())
4872 }
4873 }
4874
4875 pub fn parse_sql_option(&mut self) -> Result<SqlOption, ParserError> {
4876 let name = self.parse_identifier(false)?;
4877 self.expect_token(&Token::Eq)?;
4878 let value = self.parse_expr()?;
4879 Ok(SqlOption { name, value })
4880 }
4881
4882 pub fn parse_partition(&mut self) -> Result<Partition, ParserError> {
4883 self.expect_token(&Token::LParen)?;
4884 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
4885 self.expect_token(&Token::RParen)?;
4886 Ok(Partition { partitions })
4887 }
4888
4889 pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
4890 let operation = if self.parse_keyword(Keyword::ADD) {
4891 if let Some(constraint) = self.parse_optional_table_constraint()? {
4892 AlterTableOperation::AddConstraint(constraint)
4893 } else {
4894 let if_not_exists =
4895 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
4896 let mut new_partitions = vec![];
4897 loop {
4898 if self.parse_keyword(Keyword::PARTITION) {
4899 new_partitions.push(self.parse_partition()?);
4900 } else {
4901 break;
4902 }
4903 }
4904 if !new_partitions.is_empty() {
4905 AlterTableOperation::AddPartitions {
4906 if_not_exists,
4907 new_partitions,
4908 }
4909 } else {
4910 let column_keyword = self.parse_keyword(Keyword::COLUMN);
4911
4912 let if_not_exists = if dialect_of!(self is PostgreSqlDialect | BigQueryDialect | DuckDbDialect | GenericDialect)
4913 {
4914 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS])
4915 || if_not_exists
4916 } else {
4917 false
4918 };
4919
4920 let column_def = self.parse_column_def()?;
4921 AlterTableOperation::AddColumn {
4922 column_keyword,
4923 if_not_exists,
4924 column_def,
4925 }
4926 }
4927 }
4928 } else if self.parse_keyword(Keyword::RENAME) {
4929 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
4930 let old_name = self.parse_identifier(false)?;
4931 self.expect_keyword(Keyword::TO)?;
4932 let new_name = self.parse_identifier(false)?;
4933 AlterTableOperation::RenameConstraint { old_name, new_name }
4934 } else if self.parse_keyword(Keyword::TO) {
4935 let table_name = self.parse_object_name(false)?;
4936 AlterTableOperation::RenameTable { table_name }
4937 } else {
4938 let _ = self.parse_keyword(Keyword::COLUMN); let old_column_name = self.parse_identifier(false)?;
4940 self.expect_keyword(Keyword::TO)?;
4941 let new_column_name = self.parse_identifier(false)?;
4942 AlterTableOperation::RenameColumn {
4943 old_column_name,
4944 new_column_name,
4945 }
4946 }
4947 } else if self.parse_keyword(Keyword::DISABLE) {
4948 if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
4949 AlterTableOperation::DisableRowLevelSecurity {}
4950 } else if self.parse_keyword(Keyword::RULE) {
4951 let name = self.parse_identifier(false)?;
4952 AlterTableOperation::DisableRule { name }
4953 } else if self.parse_keyword(Keyword::TRIGGER) {
4954 let name = self.parse_identifier(false)?;
4955 AlterTableOperation::DisableTrigger { name }
4956 } else {
4957 return self.expected(
4958 "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
4959 self.peek_token(),
4960 );
4961 }
4962 } else if self.parse_keyword(Keyword::ENABLE) {
4963 if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
4964 let name = self.parse_identifier(false)?;
4965 AlterTableOperation::EnableAlwaysRule { name }
4966 } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
4967 let name = self.parse_identifier(false)?;
4968 AlterTableOperation::EnableAlwaysTrigger { name }
4969 } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
4970 AlterTableOperation::EnableRowLevelSecurity {}
4971 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
4972 let name = self.parse_identifier(false)?;
4973 AlterTableOperation::EnableReplicaRule { name }
4974 } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
4975 let name = self.parse_identifier(false)?;
4976 AlterTableOperation::EnableReplicaTrigger { name }
4977 } else if self.parse_keyword(Keyword::RULE) {
4978 let name = self.parse_identifier(false)?;
4979 AlterTableOperation::EnableRule { name }
4980 } else if self.parse_keyword(Keyword::TRIGGER) {
4981 let name = self.parse_identifier(false)?;
4982 AlterTableOperation::EnableTrigger { name }
4983 } else {
4984 return self.expected(
4985 "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER after ENABLE",
4986 self.peek_token(),
4987 );
4988 }
4989 } else if self.parse_keyword(Keyword::DROP) {
4990 if self.parse_keywords(&[Keyword::IF, Keyword::EXISTS, Keyword::PARTITION]) {
4991 self.expect_token(&Token::LParen)?;
4992 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
4993 self.expect_token(&Token::RParen)?;
4994 AlterTableOperation::DropPartitions {
4995 partitions,
4996 if_exists: true,
4997 }
4998 } else if self.parse_keyword(Keyword::PARTITION) {
4999 self.expect_token(&Token::LParen)?;
5000 let partitions = self.parse_comma_separated(Parser::parse_expr)?;
5001 self.expect_token(&Token::RParen)?;
5002 AlterTableOperation::DropPartitions {
5003 partitions,
5004 if_exists: false,
5005 }
5006 } else if self.parse_keyword(Keyword::CONSTRAINT) {
5007 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5008 let name = self.parse_identifier(false)?;
5009 let cascade = self.parse_keyword(Keyword::CASCADE);
5010 AlterTableOperation::DropConstraint {
5011 if_exists,
5012 name,
5013 cascade,
5014 }
5015 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
5016 && dialect_of!(self is MySqlDialect | GenericDialect)
5017 {
5018 AlterTableOperation::DropPrimaryKey
5019 } else {
5020 let _ = self.parse_keyword(Keyword::COLUMN); let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5022 let column_name = self.parse_identifier(false)?;
5023 let cascade = self.parse_keyword(Keyword::CASCADE);
5024 AlterTableOperation::DropColumn {
5025 column_name,
5026 if_exists,
5027 cascade,
5028 }
5029 }
5030 } else if self.parse_keyword(Keyword::PARTITION) {
5031 self.expect_token(&Token::LParen)?;
5032 let before = self.parse_comma_separated(Parser::parse_expr)?;
5033 self.expect_token(&Token::RParen)?;
5034 self.expect_keyword(Keyword::RENAME)?;
5035 self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
5036 self.expect_token(&Token::LParen)?;
5037 let renames = self.parse_comma_separated(Parser::parse_expr)?;
5038 self.expect_token(&Token::RParen)?;
5039 AlterTableOperation::RenamePartitions {
5040 old_partitions: before,
5041 new_partitions: renames,
5042 }
5043 } else if self.parse_keyword(Keyword::CHANGE) {
5044 let _ = self.parse_keyword(Keyword::COLUMN); let old_name = self.parse_identifier(false)?;
5046 let new_name = self.parse_identifier(false)?;
5047 let data_type = self.parse_data_type()?;
5048 let mut options = vec![];
5049 while let Some(option) = self.parse_optional_column_option()? {
5050 options.push(option);
5051 }
5052
5053 AlterTableOperation::ChangeColumn {
5054 old_name,
5055 new_name,
5056 data_type,
5057 options,
5058 }
5059 } else if self.parse_keyword(Keyword::ALTER) {
5060 let _ = self.parse_keyword(Keyword::COLUMN); let column_name = self.parse_identifier(false)?;
5062 let is_postgresql = dialect_of!(self is PostgreSqlDialect);
5063
5064 let op: AlterColumnOperation = if self.parse_keywords(&[
5065 Keyword::SET,
5066 Keyword::NOT,
5067 Keyword::NULL,
5068 ]) {
5069 AlterColumnOperation::SetNotNull {}
5070 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
5071 AlterColumnOperation::DropNotNull {}
5072 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
5073 AlterColumnOperation::SetDefault {
5074 value: self.parse_expr()?,
5075 }
5076 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
5077 AlterColumnOperation::DropDefault {}
5078 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
5079 || (is_postgresql && self.parse_keyword(Keyword::TYPE))
5080 {
5081 let data_type = self.parse_data_type()?;
5082 let using = if is_postgresql && self.parse_keyword(Keyword::USING) {
5083 Some(self.parse_expr()?)
5084 } else {
5085 None
5086 };
5087 AlterColumnOperation::SetDataType { data_type, using }
5088 } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
5089 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
5090 Some(GeneratedAs::Always)
5091 } else if self.parse_keywords(&[Keyword::BY, Keyword::DEFAULT]) {
5092 Some(GeneratedAs::ByDefault)
5093 } else {
5094 None
5095 };
5096
5097 self.expect_keywords(&[Keyword::AS, Keyword::IDENTITY])?;
5098
5099 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
5100
5101 if self.peek_token().token == Token::LParen {
5102 self.expect_token(&Token::LParen)?;
5103 sequence_options = Some(self.parse_create_sequence_options()?);
5104 self.expect_token(&Token::RParen)?;
5105 }
5106
5107 AlterColumnOperation::AddGenerated {
5108 generated_as,
5109 sequence_options,
5110 }
5111 } else {
5112 let message = if is_postgresql {
5113 "SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE, or ADD GENERATED after ALTER COLUMN"
5114 } else {
5115 "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN"
5116 };
5117
5118 return self.expected(message, self.peek_token());
5119 };
5120 AlterTableOperation::AlterColumn { column_name, op }
5121 } else if self.parse_keyword(Keyword::SWAP) {
5122 self.expect_keyword(Keyword::WITH)?;
5123 let table_name = self.parse_object_name(false)?;
5124 AlterTableOperation::SwapWith { table_name }
5125 } else {
5126 return self.expected(
5127 "ADD, RENAME, PARTITION, SWAP or DROP after ALTER TABLE",
5128 self.peek_token(),
5129 );
5130 };
5131 Ok(operation)
5132 }
5133
5134 pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
5135 let object_type = self.expect_one_of_keywords(&[
5136 Keyword::VIEW,
5137 Keyword::TABLE,
5138 Keyword::INDEX,
5139 Keyword::ROLE,
5140 ])?;
5141 match object_type {
5142 Keyword::VIEW => self.parse_alter_view(),
5143 Keyword::TABLE => {
5144 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
5145 let only = self.parse_keyword(Keyword::ONLY); let table_name = self.parse_object_name(false)?;
5147 let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
5148 Ok(Statement::AlterTable {
5149 name: table_name,
5150 if_exists,
5151 only,
5152 operations,
5153 })
5154 }
5155 Keyword::INDEX => {
5156 let index_name = self.parse_object_name(false)?;
5157 let operation = if self.parse_keyword(Keyword::RENAME) {
5158 if self.parse_keyword(Keyword::TO) {
5159 let index_name = self.parse_object_name(false)?;
5160 AlterIndexOperation::RenameIndex { index_name }
5161 } else {
5162 return self.expected("TO after RENAME", self.peek_token());
5163 }
5164 } else {
5165 return self.expected("RENAME after ALTER INDEX", self.peek_token());
5166 };
5167
5168 Ok(Statement::AlterIndex {
5169 name: index_name,
5170 operation,
5171 })
5172 }
5173 Keyword::ROLE => self.parse_alter_role(),
5174 _ => unreachable!(),
5176 }
5177 }
5178
5179 pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
5180 let name = self.parse_object_name(false)?;
5181 let columns = self.parse_parenthesized_column_list(Optional, false)?;
5182
5183 let with_options = self.parse_options(Keyword::WITH)?;
5184
5185 self.expect_keyword(Keyword::AS)?;
5186 let query = Box::new(self.parse_query()?);
5187
5188 Ok(Statement::AlterView {
5189 name,
5190 columns,
5191 query,
5192 with_options,
5193 })
5194 }
5195
5196 pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
5199 let object_name = self.parse_object_name(false)?;
5200 if self.peek_token().token == Token::LParen {
5201 match self.parse_function(object_name)? {
5202 Expr::Function(f) => Ok(Statement::Call(f)),
5203 other => parser_err!(
5204 format!("Expected a simple procedure call but found: {other}"),
5205 self.peek_token().location
5206 ),
5207 }
5208 } else {
5209 Ok(Statement::Call(Function {
5210 name: object_name,
5211 args: vec![],
5212 over: None,
5213 distinct: false,
5214 filter: None,
5215 null_treatment: None,
5216 special: true,
5217 order_by: vec![],
5218 }))
5219 }
5220 }
5221
5222 pub fn parse_copy(&mut self) -> Result<Statement, ParserError> {
5224 let source;
5225 if self.consume_token(&Token::LParen) {
5226 source = CopySource::Query(Box::new(self.parse_query()?));
5227 self.expect_token(&Token::RParen)?;
5228 } else {
5229 let table_name = self.parse_object_name(false)?;
5230 let columns = self.parse_parenthesized_column_list(Optional, false)?;
5231 source = CopySource::Table {
5232 table_name,
5233 columns,
5234 };
5235 }
5236 let to = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::TO]) {
5237 Some(Keyword::FROM) => false,
5238 Some(Keyword::TO) => true,
5239 _ => self.expected("FROM or TO", self.peek_token())?,
5240 };
5241 if !to {
5242 if let CopySource::Query(_) = source {
5245 return Err(ParserError::ParserError(
5246 "COPY ... FROM does not support query as a source".to_string(),
5247 ));
5248 }
5249 }
5250 let target = if self.parse_keyword(Keyword::STDIN) {
5251 CopyTarget::Stdin
5252 } else if self.parse_keyword(Keyword::STDOUT) {
5253 CopyTarget::Stdout
5254 } else if self.parse_keyword(Keyword::PROGRAM) {
5255 CopyTarget::Program {
5256 command: self.parse_literal_string()?,
5257 }
5258 } else {
5259 CopyTarget::File {
5260 filename: self.parse_literal_string()?,
5261 }
5262 };
5263 let _ = self.parse_keyword(Keyword::WITH); let mut options = vec![];
5265 if self.consume_token(&Token::LParen) {
5266 options = self.parse_comma_separated(Parser::parse_copy_option)?;
5267 self.expect_token(&Token::RParen)?;
5268 }
5269 let mut legacy_options = vec![];
5270 while let Some(opt) = self.maybe_parse(|parser| parser.parse_copy_legacy_option()) {
5271 legacy_options.push(opt);
5272 }
5273 let values = if let CopyTarget::Stdin = target {
5274 self.expect_token(&Token::SemiColon)?;
5275 self.parse_tsv()
5276 } else {
5277 vec![]
5278 };
5279 Ok(Statement::Copy {
5280 source,
5281 to,
5282 target,
5283 options,
5284 legacy_options,
5285 values,
5286 })
5287 }
5288
5289 pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
5290 let cursor = if self.parse_keyword(Keyword::ALL) {
5291 CloseCursor::All
5292 } else {
5293 let name = self.parse_identifier(false)?;
5294
5295 CloseCursor::Specific { name }
5296 };
5297
5298 Ok(Statement::Close { cursor })
5299 }
5300
5301 fn parse_copy_option(&mut self) -> Result<CopyOption, ParserError> {
5302 let ret = match self.parse_one_of_keywords(&[
5303 Keyword::FORMAT,
5304 Keyword::FREEZE,
5305 Keyword::DELIMITER,
5306 Keyword::NULL,
5307 Keyword::HEADER,
5308 Keyword::QUOTE,
5309 Keyword::ESCAPE,
5310 Keyword::FORCE_QUOTE,
5311 Keyword::FORCE_NOT_NULL,
5312 Keyword::FORCE_NULL,
5313 Keyword::ENCODING,
5314 ]) {
5315 Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier(false)?),
5316 Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
5317 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
5318 Some(Keyword::FALSE)
5319 )),
5320 Some(Keyword::DELIMITER) => CopyOption::Delimiter(self.parse_literal_char()?),
5321 Some(Keyword::NULL) => CopyOption::Null(self.parse_literal_string()?),
5322 Some(Keyword::HEADER) => CopyOption::Header(!matches!(
5323 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
5324 Some(Keyword::FALSE)
5325 )),
5326 Some(Keyword::QUOTE) => CopyOption::Quote(self.parse_literal_char()?),
5327 Some(Keyword::ESCAPE) => CopyOption::Escape(self.parse_literal_char()?),
5328 Some(Keyword::FORCE_QUOTE) => {
5329 CopyOption::ForceQuote(self.parse_parenthesized_column_list(Mandatory, false)?)
5330 }
5331 Some(Keyword::FORCE_NOT_NULL) => {
5332 CopyOption::ForceNotNull(self.parse_parenthesized_column_list(Mandatory, false)?)
5333 }
5334 Some(Keyword::FORCE_NULL) => {
5335 CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
5336 }
5337 Some(Keyword::ENCODING) => CopyOption::Encoding(self.parse_literal_string()?),
5338 _ => self.expected("option", self.peek_token())?,
5339 };
5340 Ok(ret)
5341 }
5342
5343 fn parse_copy_legacy_option(&mut self) -> Result<CopyLegacyOption, ParserError> {
5344 let ret = match self.parse_one_of_keywords(&[
5345 Keyword::BINARY,
5346 Keyword::DELIMITER,
5347 Keyword::NULL,
5348 Keyword::CSV,
5349 ]) {
5350 Some(Keyword::BINARY) => CopyLegacyOption::Binary,
5351 Some(Keyword::DELIMITER) => {
5352 let _ = self.parse_keyword(Keyword::AS); CopyLegacyOption::Delimiter(self.parse_literal_char()?)
5354 }
5355 Some(Keyword::NULL) => {
5356 let _ = self.parse_keyword(Keyword::AS); CopyLegacyOption::Null(self.parse_literal_string()?)
5358 }
5359 Some(Keyword::CSV) => CopyLegacyOption::Csv({
5360 let mut opts = vec![];
5361 while let Some(opt) =
5362 self.maybe_parse(|parser| parser.parse_copy_legacy_csv_option())
5363 {
5364 opts.push(opt);
5365 }
5366 opts
5367 }),
5368 _ => self.expected("option", self.peek_token())?,
5369 };
5370 Ok(ret)
5371 }
5372
5373 fn parse_copy_legacy_csv_option(&mut self) -> Result<CopyLegacyCsvOption, ParserError> {
5374 let ret = match self.parse_one_of_keywords(&[
5375 Keyword::HEADER,
5376 Keyword::QUOTE,
5377 Keyword::ESCAPE,
5378 Keyword::FORCE,
5379 ]) {
5380 Some(Keyword::HEADER) => CopyLegacyCsvOption::Header,
5381 Some(Keyword::QUOTE) => {
5382 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Quote(self.parse_literal_char()?)
5384 }
5385 Some(Keyword::ESCAPE) => {
5386 let _ = self.parse_keyword(Keyword::AS); CopyLegacyCsvOption::Escape(self.parse_literal_char()?)
5388 }
5389 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
5390 CopyLegacyCsvOption::ForceNotNull(
5391 self.parse_comma_separated(|p| p.parse_identifier(false))?,
5392 )
5393 }
5394 Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
5395 CopyLegacyCsvOption::ForceQuote(
5396 self.parse_comma_separated(|p| p.parse_identifier(false))?,
5397 )
5398 }
5399 _ => self.expected("csv option", self.peek_token())?,
5400 };
5401 Ok(ret)
5402 }
5403
5404 fn parse_literal_char(&mut self) -> Result<char, ParserError> {
5405 let s = self.parse_literal_string()?;
5406 if s.len() != 1 {
5407 let loc = self
5408 .tokens
5409 .get(self.index - 1)
5410 .map_or(Location { line: 0, column: 0 }, |t| t.location);
5411 return parser_err!(format!("Expect a char, found {s:?}"), loc);
5412 }
5413 Ok(s.chars().next().unwrap())
5414 }
5415
5416 pub fn parse_tsv(&mut self) -> Vec<Option<String>> {
5419 self.parse_tab_value()
5420 }
5421
5422 pub fn parse_tab_value(&mut self) -> Vec<Option<String>> {
5423 let mut values = vec![];
5424 let mut content = String::from("");
5425 while let Some(t) = self.next_token_no_skip().map(|t| &t.token) {
5426 match t {
5427 Token::Whitespace(Whitespace::Tab) => {
5428 values.push(Some(content.to_string()));
5429 content.clear();
5430 }
5431 Token::Whitespace(Whitespace::Newline) => {
5432 values.push(Some(content.to_string()));
5433 content.clear();
5434 }
5435 Token::Backslash => {
5436 if self.consume_token(&Token::Period) {
5437 return values;
5438 }
5439 if let Token::Word(w) = self.next_token().token {
5440 if w.value == "N" {
5441 values.push(None);
5442 }
5443 }
5444 }
5445 _ => {
5446 content.push_str(&t.to_string());
5447 }
5448 }
5449 }
5450 values
5451 }
5452
5453 pub fn parse_value(&mut self) -> Result<Value, ParserError> {
5455 let next_token = self.next_token();
5456 let location = next_token.location;
5457 match next_token.token {
5458 Token::Word(w) => match w.keyword {
5459 Keyword::TRUE => Ok(Value::Boolean(true)),
5460 Keyword::FALSE => Ok(Value::Boolean(false)),
5461 Keyword::NULL => Ok(Value::Null),
5462 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
5463 Some('"') => Ok(Value::DoubleQuotedString(w.value)),
5464 Some('\'') => Ok(Value::SingleQuotedString(w.value)),
5465 _ => self.expected(
5466 "A value?",
5467 TokenWithLocation {
5468 token: Token::Word(w),
5469 location,
5470 },
5471 )?,
5472 },
5473 Keyword::NoKeyword
5475 | Keyword::LOCATION
5476 | Keyword::TYPE
5477 | Keyword::DATE
5478 | Keyword::START
5479 | Keyword::END
5480 if dialect_of!(self is SnowflakeDialect | GenericDialect) =>
5481 {
5482 Ok(Value::UnQuotedString(w.value))
5483 }
5484 _ => self.expected(
5485 "a concrete value",
5486 TokenWithLocation {
5487 token: Token::Word(w),
5488 location,
5489 },
5490 ),
5491 },
5492 Token::Number(ref n, l) => match n.parse() {
5496 Ok(n) => Ok(Value::Number(n, l)),
5497 Err(e) => parser_err!(format!("Could not parse '{n}' as number: {e}"), location),
5498 },
5499 Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
5500 Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
5501 Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone())),
5502 Token::SingleQuotedByteStringLiteral(ref s) => {
5503 Ok(Value::SingleQuotedByteStringLiteral(s.clone()))
5504 }
5505 Token::DoubleQuotedByteStringLiteral(ref s) => {
5506 Ok(Value::DoubleQuotedByteStringLiteral(s.clone()))
5507 }
5508 Token::RawStringLiteral(ref s) => Ok(Value::RawStringLiteral(s.clone())),
5509 Token::NationalStringLiteral(ref s) => Ok(Value::NationalStringLiteral(s.to_string())),
5510 Token::EscapedStringLiteral(ref s) => Ok(Value::EscapedStringLiteral(s.to_string())),
5511 Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
5512 Token::Placeholder(ref s) => Ok(Value::Placeholder(s.to_string())),
5513 tok @ Token::Colon | tok @ Token::AtSign => {
5514 let next_token = self.next_token();
5517 let ident = match next_token.token {
5518 Token::Word(w) => Ok(w.to_ident()),
5519 Token::Number(w, false) => Ok(Ident::new(w)),
5520 _ => self.expected("placeholder", next_token),
5521 }?;
5522 let placeholder = tok.to_string() + &ident.value;
5523 Ok(Value::Placeholder(placeholder))
5524 }
5525 unexpected => self.expected(
5526 "a value",
5527 TokenWithLocation {
5528 token: unexpected,
5529 location,
5530 },
5531 ),
5532 }
5533 }
5534
5535 pub fn parse_number_value(&mut self) -> Result<Value, ParserError> {
5536 match self.parse_value()? {
5537 v @ Value::Number(_, _) => Ok(v),
5538 v @ Value::Placeholder(_) => Ok(v),
5539 _ => {
5540 self.prev_token();
5541 self.expected("literal number", self.peek_token())
5542 }
5543 }
5544 }
5545
5546 fn parse_introduced_string_value(&mut self) -> Result<Value, ParserError> {
5547 let next_token = self.next_token();
5548 let location = next_token.location;
5549 match next_token.token {
5550 Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
5551 Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
5552 Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
5553 unexpected => self.expected(
5554 "a string value",
5555 TokenWithLocation {
5556 token: unexpected,
5557 location,
5558 },
5559 ),
5560 }
5561 }
5562
5563 pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
5565 let next_token = self.next_token();
5566 match next_token.token {
5567 Token::Number(s, _) => s.parse::<u64>().map_err(|e| {
5568 ParserError::ParserError(format!("Could not parse '{s}' as u64: {e}"))
5569 }),
5570 _ => self.expected("literal int", next_token),
5571 }
5572 }
5573
5574 pub fn parse_function_definition(&mut self) -> Result<FunctionDefinition, ParserError> {
5575 let peek_token = self.peek_token();
5576 match peek_token.token {
5577 Token::DollarQuotedString(value) if dialect_of!(self is PostgreSqlDialect) => {
5578 self.next_token();
5579 Ok(FunctionDefinition::DoubleDollarDef(value.value))
5580 }
5581 _ => Ok(FunctionDefinition::SingleQuotedDef(
5582 self.parse_literal_string()?,
5583 )),
5584 }
5585 }
5586 pub fn parse_literal_string(&mut self) -> Result<String, ParserError> {
5588 let next_token = self.next_token();
5589 match next_token.token {
5590 Token::Word(Word {
5591 value,
5592 keyword: Keyword::NoKeyword,
5593 ..
5594 }) => Ok(value),
5595 Token::SingleQuotedString(s) => Ok(s),
5596 Token::DoubleQuotedString(s) => Ok(s),
5597 Token::EscapedStringLiteral(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
5598 Ok(s)
5599 }
5600 _ => self.expected("literal string", next_token),
5601 }
5602 }
5603
5604 pub fn parse_map_key(&mut self) -> Result<Expr, ParserError> {
5606 let next_token = self.next_token();
5607 match next_token.token {
5608 Token::Word(Word { value, keyword, .. })
5610 if (dialect_of!(self is BigQueryDialect) && keyword == Keyword::OFFSET) =>
5611 {
5612 self.parse_function(ObjectName(vec![Ident::new(value)]))
5613 }
5614 Token::Word(Word { value, keyword, .. }) if (keyword == Keyword::NoKeyword) => {
5615 if self.peek_token() == Token::LParen {
5616 return self.parse_function(ObjectName(vec![Ident::new(value)]));
5617 }
5618 Ok(Expr::Value(Value::SingleQuotedString(value)))
5619 }
5620 Token::SingleQuotedString(s) => Ok(Expr::Value(Value::SingleQuotedString(s))),
5621 #[cfg(not(feature = "bigdecimal"))]
5622 Token::Number(s, _) => Ok(Expr::Value(Value::Number(s, false))),
5623 #[cfg(feature = "bigdecimal")]
5624 Token::Number(s, _) => Ok(Expr::Value(Value::Number(s.parse().unwrap(), false))),
5625 _ => self.expected("literal string, number or function", next_token),
5626 }
5627 }
5628
5629 pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
5631 let (ty, trailing_bracket) = self.parse_data_type_helper()?;
5632 if trailing_bracket.0 {
5633 return parser_err!(
5634 format!("unmatched > after parsing data type {ty}"),
5635 self.peek_token()
5636 );
5637 }
5638
5639 Ok(ty)
5640 }
5641
5642 fn parse_data_type_helper(
5643 &mut self,
5644 ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
5645 let next_token = self.next_token();
5646 let mut trailing_bracket = false.into();
5647 let mut data = match next_token.token {
5648 Token::Word(w) => match w.keyword {
5649 Keyword::BOOLEAN => Ok(DataType::Boolean),
5650 Keyword::BOOL => Ok(DataType::Bool),
5651 Keyword::FLOAT => Ok(DataType::Float(self.parse_optional_precision()?)),
5652 Keyword::REAL => Ok(DataType::Real),
5653 Keyword::FLOAT4 => Ok(DataType::Float4),
5654 Keyword::FLOAT64 => Ok(DataType::Float64),
5655 Keyword::FLOAT8 => Ok(DataType::Float8),
5656 Keyword::DOUBLE => {
5657 if self.parse_keyword(Keyword::PRECISION) {
5658 Ok(DataType::DoublePrecision)
5659 } else {
5660 Ok(DataType::Double)
5661 }
5662 }
5663 Keyword::TINYINT => {
5664 let optional_precision = self.parse_optional_precision();
5665 if self.parse_keyword(Keyword::UNSIGNED) {
5666 Ok(DataType::UnsignedTinyInt(optional_precision?))
5667 } else {
5668 Ok(DataType::TinyInt(optional_precision?))
5669 }
5670 }
5671 Keyword::INT2 => {
5672 let optional_precision = self.parse_optional_precision();
5673 if self.parse_keyword(Keyword::UNSIGNED) {
5674 Ok(DataType::UnsignedInt2(optional_precision?))
5675 } else {
5676 Ok(DataType::Int2(optional_precision?))
5677 }
5678 }
5679 Keyword::SMALLINT => {
5680 let optional_precision = self.parse_optional_precision();
5681 if self.parse_keyword(Keyword::UNSIGNED) {
5682 Ok(DataType::UnsignedSmallInt(optional_precision?))
5683 } else {
5684 Ok(DataType::SmallInt(optional_precision?))
5685 }
5686 }
5687 Keyword::MEDIUMINT => {
5688 let optional_precision = self.parse_optional_precision();
5689 if self.parse_keyword(Keyword::UNSIGNED) {
5690 Ok(DataType::UnsignedMediumInt(optional_precision?))
5691 } else {
5692 Ok(DataType::MediumInt(optional_precision?))
5693 }
5694 }
5695 Keyword::INT => {
5696 let optional_precision = self.parse_optional_precision();
5697 if self.parse_keyword(Keyword::UNSIGNED) {
5698 Ok(DataType::UnsignedInt(optional_precision?))
5699 } else {
5700 Ok(DataType::Int(optional_precision?))
5701 }
5702 }
5703 Keyword::INT4 => {
5704 let optional_precision = self.parse_optional_precision();
5705 if self.parse_keyword(Keyword::UNSIGNED) {
5706 Ok(DataType::UnsignedInt4(optional_precision?))
5707 } else {
5708 Ok(DataType::Int4(optional_precision?))
5709 }
5710 }
5711 Keyword::INT64 => Ok(DataType::Int64),
5712 Keyword::INTEGER => {
5713 let optional_precision = self.parse_optional_precision();
5714 if self.parse_keyword(Keyword::UNSIGNED) {
5715 Ok(DataType::UnsignedInteger(optional_precision?))
5716 } else {
5717 Ok(DataType::Integer(optional_precision?))
5718 }
5719 }
5720 Keyword::BIGINT => {
5721 let optional_precision = self.parse_optional_precision();
5722 if self.parse_keyword(Keyword::UNSIGNED) {
5723 Ok(DataType::UnsignedBigInt(optional_precision?))
5724 } else {
5725 Ok(DataType::BigInt(optional_precision?))
5726 }
5727 }
5728 Keyword::INT8 => {
5729 let optional_precision = self.parse_optional_precision();
5730 if self.parse_keyword(Keyword::UNSIGNED) {
5731 Ok(DataType::UnsignedInt8(optional_precision?))
5732 } else {
5733 Ok(DataType::Int8(optional_precision?))
5734 }
5735 }
5736 Keyword::VARCHAR => Ok(DataType::Varchar(self.parse_optional_character_length()?)),
5737 Keyword::NVARCHAR => Ok(DataType::Nvarchar(self.parse_optional_precision()?)),
5738 Keyword::CHARACTER => {
5739 if self.parse_keyword(Keyword::VARYING) {
5740 Ok(DataType::CharacterVarying(
5741 self.parse_optional_character_length()?,
5742 ))
5743 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
5744 Ok(DataType::CharacterLargeObject(
5745 self.parse_optional_precision()?,
5746 ))
5747 } else {
5748 Ok(DataType::Character(self.parse_optional_character_length()?))
5749 }
5750 }
5751 Keyword::CHAR => {
5752 if self.parse_keyword(Keyword::VARYING) {
5753 Ok(DataType::CharVarying(
5754 self.parse_optional_character_length()?,
5755 ))
5756 } else if self.parse_keywords(&[Keyword::LARGE, Keyword::OBJECT]) {
5757 Ok(DataType::CharLargeObject(self.parse_optional_precision()?))
5758 } else {
5759 Ok(DataType::Char(self.parse_optional_character_length()?))
5760 }
5761 }
5762 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
5763 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
5764 Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_precision()?)),
5765 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
5766 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
5767 Keyword::UUID => Ok(DataType::Uuid),
5768 Keyword::DATE => Ok(DataType::Date),
5769 Keyword::DATETIME => Ok(DataType::Datetime(self.parse_optional_precision()?)),
5770 Keyword::TIMESTAMP => {
5771 let precision = self.parse_optional_precision()?;
5772 let tz = if self.parse_keyword(Keyword::WITH) {
5773 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5774 TimezoneInfo::WithTimeZone
5775 } else if self.parse_keyword(Keyword::WITHOUT) {
5776 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5777 TimezoneInfo::WithoutTimeZone
5778 } else {
5779 TimezoneInfo::None
5780 };
5781 Ok(DataType::Timestamp(precision, tz))
5782 }
5783 Keyword::TIMESTAMPTZ => Ok(DataType::Timestamp(
5784 self.parse_optional_precision()?,
5785 TimezoneInfo::Tz,
5786 )),
5787 Keyword::TIME => {
5788 let precision = self.parse_optional_precision()?;
5789 let tz = if self.parse_keyword(Keyword::WITH) {
5790 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5791 TimezoneInfo::WithTimeZone
5792 } else if self.parse_keyword(Keyword::WITHOUT) {
5793 self.expect_keywords(&[Keyword::TIME, Keyword::ZONE])?;
5794 TimezoneInfo::WithoutTimeZone
5795 } else {
5796 TimezoneInfo::None
5797 };
5798 Ok(DataType::Time(precision, tz))
5799 }
5800 Keyword::TIMETZ => Ok(DataType::Time(
5801 self.parse_optional_precision()?,
5802 TimezoneInfo::Tz,
5803 )),
5804 Keyword::INTERVAL => Ok(DataType::Interval),
5808 Keyword::JSON => Ok(DataType::JSON),
5809 Keyword::JSONB => Ok(DataType::JSONB),
5810 Keyword::REGCLASS => Ok(DataType::Regclass),
5811 Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)),
5812 Keyword::TEXT => Ok(DataType::Text),
5813 Keyword::BYTEA => Ok(DataType::Bytea),
5814 Keyword::NUMERIC => Ok(DataType::Numeric(
5815 self.parse_exact_number_optional_precision_scale()?,
5816 )),
5817 Keyword::DECIMAL => Ok(DataType::Decimal(
5818 self.parse_exact_number_optional_precision_scale()?,
5819 )),
5820 Keyword::DEC => Ok(DataType::Dec(
5821 self.parse_exact_number_optional_precision_scale()?,
5822 )),
5823 Keyword::BIGNUMERIC => Ok(DataType::BigNumeric(
5824 self.parse_exact_number_optional_precision_scale()?,
5825 )),
5826 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
5827 self.parse_exact_number_optional_precision_scale()?,
5828 )),
5829 Keyword::ENUM => Ok(DataType::Enum(self.parse_string_values()?)),
5830 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
5831 Keyword::ARRAY => {
5832 if dialect_of!(self is SnowflakeDialect) {
5833 Ok(DataType::Array(ArrayElemTypeDef::None))
5834 } else {
5835 self.expect_token(&Token::Lt)?;
5836 let (inside_type, _trailing_bracket) = self.parse_data_type_helper()?;
5837 trailing_bracket = self.expect_closing_angle_bracket(_trailing_bracket)?;
5838 Ok(DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
5839 inside_type,
5840 ))))
5841 }
5842 }
5843 Keyword::STRUCT if dialect_of!(self is BigQueryDialect) => {
5844 self.prev_token();
5845 let (field_defs, _trailing_bracket) =
5846 self.parse_struct_type_def(Self::parse_big_query_struct_field_def)?;
5847 trailing_bracket = _trailing_bracket;
5848 Ok(DataType::Struct(field_defs))
5849 }
5850 _ => {
5851 self.prev_token();
5852 let type_name = self.parse_object_name(false)?;
5853 if let Some(modifiers) = self.parse_optional_type_modifiers()? {
5854 Ok(DataType::Custom(type_name, modifiers))
5855 } else {
5856 Ok(DataType::Custom(type_name, vec![]))
5857 }
5858 }
5859 },
5860 _ => self.expected("a data type name", next_token),
5861 }?;
5862
5863 while self.consume_token(&Token::LBracket) {
5866 self.expect_token(&Token::RBracket)?;
5867 data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data)))
5868 }
5869 Ok((data, trailing_bracket))
5870 }
5871
5872 pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
5873 self.expect_token(&Token::LParen)?;
5874 let mut values = Vec::new();
5875 loop {
5876 let next_token = self.next_token();
5877 match next_token.token {
5878 Token::SingleQuotedString(value) => values.push(value),
5879 _ => self.expected("a string", next_token)?,
5880 }
5881 let next_token = self.next_token();
5882 match next_token.token {
5883 Token::Comma => (),
5884 Token::RParen => break,
5885 _ => self.expected(", or }", next_token)?,
5886 }
5887 }
5888 Ok(values)
5889 }
5890
5891 pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
5893 let ident = self.parse_identifier(false)?;
5894 self.expect_keyword(Keyword::AS)?;
5895 let alias = self.parse_identifier(false)?;
5896 Ok(IdentWithAlias { ident, alias })
5897 }
5898
5899 pub fn parse_optional_alias(
5903 &mut self,
5904 reserved_kwds: &[Keyword],
5905 ) -> Result<Option<Ident>, ParserError> {
5906 let after_as = self.parse_keyword(Keyword::AS);
5907 let next_token = self.next_token();
5908 match next_token.token {
5909 Token::Word(w) if after_as || !reserved_kwds.contains(&w.keyword) => {
5915 Ok(Some(w.to_ident()))
5916 }
5917 Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
5930 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
5932 _ => {
5933 if after_as {
5934 return self.expected("an identifier after AS", next_token);
5935 }
5936 self.prev_token();
5937 Ok(None) }
5939 }
5940 }
5941
5942 pub fn parse_optional_table_alias(
5947 &mut self,
5948 reserved_kwds: &[Keyword],
5949 ) -> Result<Option<TableAlias>, ParserError> {
5950 match self.parse_optional_alias(reserved_kwds)? {
5951 Some(name) => {
5952 let columns = self.parse_parenthesized_column_list(Optional, false)?;
5953 Ok(Some(TableAlias { name, columns }))
5954 }
5955 None => Ok(None),
5956 }
5957 }
5958
5959 pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
5966 let mut idents = vec![];
5967 loop {
5968 idents.push(self.parse_identifier(in_table_clause)?);
5969 if !self.consume_token(&Token::Period) {
5970 break;
5971 }
5972 }
5973
5974 if dialect_of!(self is BigQueryDialect)
5977 && idents.iter().any(|ident| ident.value.contains('.'))
5978 {
5979 idents = idents
5980 .into_iter()
5981 .flat_map(|ident| {
5982 ident
5983 .value
5984 .split('.')
5985 .map(|value| Ident {
5986 value: value.into(),
5987 quote_style: ident.quote_style,
5988 })
5989 .collect::<Vec<_>>()
5990 })
5991 .collect()
5992 }
5993
5994 Ok(ObjectName(idents))
5995 }
5996
5997 pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
5999 let mut idents = vec![];
6000 loop {
6001 match self.peek_token().token {
6002 Token::Word(w) => {
6003 idents.push(w.to_ident());
6004 }
6005 Token::EOF | Token::Eq => break,
6006 _ => {}
6007 }
6008 self.next_token();
6009 }
6010 Ok(idents)
6011 }
6012
6013 pub fn parse_multipart_identifier(&mut self) -> Result<Vec<Ident>, ParserError> {
6053 let mut idents = vec![];
6054
6055 match self.next_token().token {
6057 Token::Word(w) => idents.push(w.to_ident()),
6058 Token::EOF => {
6059 return Err(ParserError::ParserError(
6060 "Empty input when parsing identifier".to_string(),
6061 ))?
6062 }
6063 token => {
6064 return Err(ParserError::ParserError(format!(
6065 "Unexpected token in identifier: {token}"
6066 )))?
6067 }
6068 };
6069
6070 loop {
6072 match self.next_token().token {
6073 Token::Period => match self.next_token().token {
6075 Token::Word(w) => idents.push(w.to_ident()),
6076 Token::EOF => {
6077 return Err(ParserError::ParserError(
6078 "Trailing period in identifier".to_string(),
6079 ))?
6080 }
6081 token => {
6082 return Err(ParserError::ParserError(format!(
6083 "Unexpected token following period in identifier: {token}"
6084 )))?
6085 }
6086 },
6087 Token::EOF => break,
6088 token => {
6089 return Err(ParserError::ParserError(format!(
6090 "Unexpected token in identifier: {token}"
6091 )))?
6092 }
6093 }
6094 }
6095
6096 Ok(idents)
6097 }
6098
6099 pub fn parse_identifier(&mut self, in_table_clause: bool) -> Result<Ident, ParserError> {
6105 let next_token = self.next_token();
6106 match next_token.token {
6107 Token::Word(w) => {
6108 let mut ident = w.to_ident();
6109
6110 if dialect_of!(self is BigQueryDialect)
6119 && w.quote_style.is_none()
6120 && in_table_clause
6121 {
6122 let mut requires_whitespace = false;
6123 while matches!(self.peek_token_no_skip().token, Token::Minus) {
6124 self.next_token();
6125 ident.value.push('-');
6126
6127 let token = self
6128 .next_token_no_skip()
6129 .cloned()
6130 .unwrap_or(TokenWithLocation::wrap(Token::EOF));
6131 requires_whitespace = match token.token {
6132 Token::Word(next_word) if next_word.quote_style.is_none() => {
6133 ident.value.push_str(&next_word.value);
6134 false
6135 }
6136 Token::Number(s, false) if s.chars().all(|c| c.is_ascii_digit()) => {
6137 ident.value.push_str(&s);
6138 true
6139 }
6140 _ => {
6141 return self
6142 .expected("continuation of hyphenated identifier", token);
6143 }
6144 }
6145 }
6146
6147 if requires_whitespace {
6150 let token = self.next_token();
6151 if !matches!(token.token, Token::EOF | Token::Whitespace(_)) {
6152 return self
6153 .expected("whitespace following hyphenated identifier", token);
6154 }
6155 }
6156 }
6157 Ok(ident)
6158 }
6159 Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
6160 Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
6161 _ => self.expected("identifier", next_token),
6162 }
6163 }
6164
6165 fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, ParserError> {
6167 if self.consume_token(&Token::LParen) {
6168 if self.peek_token().token == Token::RParen {
6169 self.next_token();
6170 Ok(vec![])
6171 } else {
6172 let cols = self.parse_comma_separated(Parser::parse_view_column)?;
6173 self.expect_token(&Token::RParen)?;
6174 Ok(cols)
6175 }
6176 } else {
6177 Ok(vec![])
6178 }
6179 }
6180
6181 fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
6183 let name = self.parse_identifier(false)?;
6184 let options = if dialect_of!(self is BigQueryDialect | GenericDialect)
6185 && self.parse_keyword(Keyword::OPTIONS)
6186 {
6187 self.prev_token();
6188 Some(self.parse_options(Keyword::OPTIONS)?)
6189 } else {
6190 None
6191 };
6192 Ok(ViewColumnDef { name, options })
6193 }
6194
6195 pub fn parse_parenthesized_column_list(
6197 &mut self,
6198 optional: IsOptional,
6199 allow_empty: bool,
6200 ) -> Result<Vec<Ident>, ParserError> {
6201 if self.consume_token(&Token::LParen) {
6202 if allow_empty && self.peek_token().token == Token::RParen {
6203 self.next_token();
6204 Ok(vec![])
6205 } else {
6206 let cols = self.parse_comma_separated(|p| p.parse_identifier(false))?;
6207 self.expect_token(&Token::RParen)?;
6208 Ok(cols)
6209 }
6210 } else if optional == Optional {
6211 Ok(vec![])
6212 } else {
6213 self.expected("a list of columns in parentheses", self.peek_token())
6214 }
6215 }
6216
6217 pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
6218 self.expect_token(&Token::LParen)?;
6219 let n = self.parse_literal_uint()?;
6220 self.expect_token(&Token::RParen)?;
6221 Ok(n)
6222 }
6223
6224 pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
6225 if self.consume_token(&Token::LParen) {
6226 let n = self.parse_literal_uint()?;
6227 self.expect_token(&Token::RParen)?;
6228 Ok(Some(n))
6229 } else {
6230 Ok(None)
6231 }
6232 }
6233
6234 pub fn parse_optional_character_length(
6235 &mut self,
6236 ) -> Result<Option<CharacterLength>, ParserError> {
6237 if self.consume_token(&Token::LParen) {
6238 let character_length = self.parse_character_length()?;
6239 self.expect_token(&Token::RParen)?;
6240 Ok(Some(character_length))
6241 } else {
6242 Ok(None)
6243 }
6244 }
6245
6246 pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
6247 if self.parse_keyword(Keyword::MAX) {
6248 return Ok(CharacterLength::Max);
6249 }
6250 let length = self.parse_literal_uint()?;
6251 let unit = if self.parse_keyword(Keyword::CHARACTERS) {
6252 Some(CharLengthUnits::Characters)
6253 } else if self.parse_keyword(Keyword::OCTETS) {
6254 Some(CharLengthUnits::Octets)
6255 } else {
6256 None
6257 };
6258 Ok(CharacterLength::IntegerLength { length, unit })
6259 }
6260
6261 pub fn parse_optional_precision_scale(
6262 &mut self,
6263 ) -> Result<(Option<u64>, Option<u64>), ParserError> {
6264 if self.consume_token(&Token::LParen) {
6265 let n = self.parse_literal_uint()?;
6266 let scale = if self.consume_token(&Token::Comma) {
6267 Some(self.parse_literal_uint()?)
6268 } else {
6269 None
6270 };
6271 self.expect_token(&Token::RParen)?;
6272 Ok((Some(n), scale))
6273 } else {
6274 Ok((None, None))
6275 }
6276 }
6277
6278 pub fn parse_exact_number_optional_precision_scale(
6279 &mut self,
6280 ) -> Result<ExactNumberInfo, ParserError> {
6281 if self.consume_token(&Token::LParen) {
6282 let precision = self.parse_literal_uint()?;
6283 let scale = if self.consume_token(&Token::Comma) {
6284 Some(self.parse_literal_uint()?)
6285 } else {
6286 None
6287 };
6288
6289 self.expect_token(&Token::RParen)?;
6290
6291 match scale {
6292 None => Ok(ExactNumberInfo::Precision(precision)),
6293 Some(scale) => Ok(ExactNumberInfo::PrecisionAndScale(precision, scale)),
6294 }
6295 } else {
6296 Ok(ExactNumberInfo::None)
6297 }
6298 }
6299
6300 pub fn parse_optional_type_modifiers(&mut self) -> Result<Option<Vec<String>>, ParserError> {
6301 if self.consume_token(&Token::LParen) {
6302 let mut modifiers = Vec::new();
6303 loop {
6304 let next_token = self.next_token();
6305 match next_token.token {
6306 Token::Word(w) => modifiers.push(w.to_string()),
6307 Token::Number(n, _) => modifiers.push(n),
6308 Token::SingleQuotedString(s) => modifiers.push(s),
6309
6310 Token::Comma => {
6311 continue;
6312 }
6313 Token::RParen => {
6314 break;
6315 }
6316 _ => self.expected("type modifiers", next_token)?,
6317 }
6318 }
6319
6320 Ok(Some(modifiers))
6321 } else {
6322 Ok(None)
6323 }
6324 }
6325
6326 pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
6327 let tables = if !self.parse_keyword(Keyword::FROM) {
6328 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
6329 self.expect_keyword(Keyword::FROM)?;
6330 tables
6331 } else {
6332 vec![]
6333 };
6334
6335 let from = self.parse_comma_separated(Parser::parse_table_and_joins)?;
6336 let using = if self.parse_keyword(Keyword::USING) {
6337 Some(self.parse_comma_separated(Parser::parse_table_and_joins)?)
6338 } else {
6339 None
6340 };
6341 let selection = if self.parse_keyword(Keyword::WHERE) {
6342 Some(self.parse_expr()?)
6343 } else {
6344 None
6345 };
6346 let returning = if self.parse_keyword(Keyword::RETURNING) {
6347 Some(self.parse_comma_separated(Parser::parse_select_item)?)
6348 } else {
6349 None
6350 };
6351 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6352 self.parse_comma_separated(Parser::parse_order_by_expr)?
6353 } else {
6354 vec![]
6355 };
6356 let limit = if self.parse_keyword(Keyword::LIMIT) {
6357 self.parse_limit()?
6358 } else {
6359 None
6360 };
6361
6362 Ok(Statement::Delete {
6363 tables,
6364 from,
6365 using,
6366 selection,
6367 returning,
6368 order_by,
6369 limit,
6370 })
6371 }
6372
6373 pub fn parse_kill(&mut self) -> Result<Statement, ParserError> {
6375 let modifier_keyword =
6376 self.parse_one_of_keywords(&[Keyword::CONNECTION, Keyword::QUERY, Keyword::MUTATION]);
6377
6378 let id = self.parse_literal_uint()?;
6379
6380 let modifier = match modifier_keyword {
6381 Some(Keyword::CONNECTION) => Some(KillType::Connection),
6382 Some(Keyword::QUERY) => Some(KillType::Query),
6383 Some(Keyword::MUTATION) => {
6384 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
6385 Some(KillType::Mutation)
6386 } else {
6387 self.expected(
6388 "Unsupported type for KILL, allowed: CONNECTION | QUERY",
6389 self.peek_token(),
6390 )?
6391 }
6392 }
6393 _ => None,
6394 };
6395
6396 Ok(Statement::Kill { modifier, id })
6397 }
6398
6399 pub fn parse_explain(&mut self, describe_alias: bool) -> Result<Statement, ParserError> {
6400 let analyze = self.parse_keyword(Keyword::ANALYZE);
6401 let verbose = self.parse_keyword(Keyword::VERBOSE);
6402 let mut format = None;
6403 if self.parse_keyword(Keyword::FORMAT) {
6404 format = Some(self.parse_analyze_format()?);
6405 }
6406
6407 match self.maybe_parse(|parser| parser.parse_statement()) {
6408 Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
6409 ParserError::ParserError("Explain must be root of the plan".to_string()),
6410 ),
6411 Some(statement) => Ok(Statement::Explain {
6412 describe_alias,
6413 analyze,
6414 verbose,
6415 statement: Box::new(statement),
6416 format,
6417 }),
6418 _ => {
6419 let table_name = self.parse_object_name(false)?;
6420 Ok(Statement::ExplainTable {
6421 describe_alias,
6422 table_name,
6423 })
6424 }
6425 }
6426 }
6427
6428 pub fn parse_query(&mut self) -> Result<Query, ParserError> {
6433 let _guard = self.recursion_counter.try_decrease()?;
6434 let with = if self.parse_keyword(Keyword::WITH) {
6435 Some(With {
6436 recursive: self.parse_keyword(Keyword::RECURSIVE),
6437 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
6438 })
6439 } else {
6440 None
6441 };
6442
6443 if self.parse_keyword(Keyword::INSERT) {
6444 let insert = self.parse_insert()?;
6445
6446 Ok(Query {
6447 with,
6448 body: Box::new(SetExpr::Insert(insert)),
6449 limit: None,
6450 limit_by: vec![],
6451 order_by: vec![],
6452 offset: None,
6453 fetch: None,
6454 locks: vec![],
6455 for_clause: None,
6456 })
6457 } else if self.parse_keyword(Keyword::UPDATE) {
6458 let update = self.parse_update()?;
6459 Ok(Query {
6460 with,
6461 body: Box::new(SetExpr::Update(update)),
6462 limit: None,
6463 limit_by: vec![],
6464 order_by: vec![],
6465 offset: None,
6466 fetch: None,
6467 locks: vec![],
6468 for_clause: None,
6469 })
6470 } else {
6471 let body = Box::new(self.parse_query_body(0)?);
6472
6473 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6474 self.parse_comma_separated(Parser::parse_order_by_expr)?
6475 } else {
6476 vec![]
6477 };
6478
6479 let mut limit = None;
6480 let mut offset = None;
6481
6482 for _x in 0..2 {
6483 if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
6484 limit = self.parse_limit()?
6485 }
6486
6487 if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
6488 offset = Some(self.parse_offset()?)
6489 }
6490
6491 if dialect_of!(self is GenericDialect | MySqlDialect | ClickHouseDialect)
6492 && limit.is_some()
6493 && offset.is_none()
6494 && self.consume_token(&Token::Comma)
6495 {
6496 offset = Some(Offset {
6499 value: limit.unwrap(),
6500 rows: OffsetRows::None,
6501 });
6502 limit = Some(self.parse_expr()?);
6503 }
6504 }
6505
6506 let limit_by = if dialect_of!(self is ClickHouseDialect | GenericDialect)
6507 && self.parse_keyword(Keyword::BY)
6508 {
6509 self.parse_comma_separated(Parser::parse_expr)?
6510 } else {
6511 vec![]
6512 };
6513
6514 let fetch = if self.parse_keyword(Keyword::FETCH) {
6515 Some(self.parse_fetch()?)
6516 } else {
6517 None
6518 };
6519
6520 let mut for_clause = None;
6521 let mut locks = Vec::new();
6522 while self.parse_keyword(Keyword::FOR) {
6523 if let Some(parsed_for_clause) = self.parse_for_clause()? {
6524 for_clause = Some(parsed_for_clause);
6525 break;
6526 } else {
6527 locks.push(self.parse_lock()?);
6528 }
6529 }
6530
6531 Ok(Query {
6532 with,
6533 body,
6534 order_by,
6535 limit,
6536 limit_by,
6537 offset,
6538 fetch,
6539 locks,
6540 for_clause,
6541 })
6542 }
6543 }
6544
6545 pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
6547 if self.parse_keyword(Keyword::XML) {
6548 Ok(Some(self.parse_for_xml()?))
6549 } else if self.parse_keyword(Keyword::JSON) {
6550 Ok(Some(self.parse_for_json()?))
6551 } else if self.parse_keyword(Keyword::BROWSE) {
6552 Ok(Some(ForClause::Browse))
6553 } else {
6554 Ok(None)
6555 }
6556 }
6557
6558 pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
6560 let for_xml = if self.parse_keyword(Keyword::RAW) {
6561 let mut element_name = None;
6562 if self.peek_token().token == Token::LParen {
6563 self.expect_token(&Token::LParen)?;
6564 element_name = Some(self.parse_literal_string()?);
6565 self.expect_token(&Token::RParen)?;
6566 }
6567 ForXml::Raw(element_name)
6568 } else if self.parse_keyword(Keyword::AUTO) {
6569 ForXml::Auto
6570 } else if self.parse_keyword(Keyword::EXPLICIT) {
6571 ForXml::Explicit
6572 } else if self.parse_keyword(Keyword::PATH) {
6573 let mut element_name = None;
6574 if self.peek_token().token == Token::LParen {
6575 self.expect_token(&Token::LParen)?;
6576 element_name = Some(self.parse_literal_string()?);
6577 self.expect_token(&Token::RParen)?;
6578 }
6579 ForXml::Path(element_name)
6580 } else {
6581 return Err(ParserError::ParserError(
6582 "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
6583 ));
6584 };
6585 let mut elements = false;
6586 let mut binary_base64 = false;
6587 let mut root = None;
6588 let mut r#type = false;
6589 while self.peek_token().token == Token::Comma {
6590 self.next_token();
6591 if self.parse_keyword(Keyword::ELEMENTS) {
6592 elements = true;
6593 } else if self.parse_keyword(Keyword::BINARY) {
6594 self.expect_keyword(Keyword::BASE64)?;
6595 binary_base64 = true;
6596 } else if self.parse_keyword(Keyword::ROOT) {
6597 self.expect_token(&Token::LParen)?;
6598 root = Some(self.parse_literal_string()?);
6599 self.expect_token(&Token::RParen)?;
6600 } else if self.parse_keyword(Keyword::TYPE) {
6601 r#type = true;
6602 }
6603 }
6604 Ok(ForClause::Xml {
6605 for_xml,
6606 elements,
6607 binary_base64,
6608 root,
6609 r#type,
6610 })
6611 }
6612
6613 pub fn parse_for_json(&mut self) -> Result<ForClause, ParserError> {
6615 let for_json = if self.parse_keyword(Keyword::AUTO) {
6616 ForJson::Auto
6617 } else if self.parse_keyword(Keyword::PATH) {
6618 ForJson::Path
6619 } else {
6620 return Err(ParserError::ParserError(
6621 "Expected FOR JSON [AUTO | PATH ]".to_string(),
6622 ));
6623 };
6624 let mut root = None;
6625 let mut include_null_values = false;
6626 let mut without_array_wrapper = false;
6627 while self.peek_token().token == Token::Comma {
6628 self.next_token();
6629 if self.parse_keyword(Keyword::ROOT) {
6630 self.expect_token(&Token::LParen)?;
6631 root = Some(self.parse_literal_string()?);
6632 self.expect_token(&Token::RParen)?;
6633 } else if self.parse_keyword(Keyword::INCLUDE_NULL_VALUES) {
6634 include_null_values = true;
6635 } else if self.parse_keyword(Keyword::WITHOUT_ARRAY_WRAPPER) {
6636 without_array_wrapper = true;
6637 }
6638 }
6639 Ok(ForClause::Json {
6640 for_json,
6641 root,
6642 include_null_values,
6643 without_array_wrapper,
6644 })
6645 }
6646
6647 pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
6649 let name = self.parse_identifier(false)?;
6650
6651 let mut cte = if self.parse_keyword(Keyword::AS) {
6652 self.expect_token(&Token::LParen)?;
6653 let query = Box::new(self.parse_query()?);
6654 self.expect_token(&Token::RParen)?;
6655 let alias = TableAlias {
6656 name,
6657 columns: vec![],
6658 };
6659 Cte {
6660 alias,
6661 query,
6662 from: None,
6663 }
6664 } else {
6665 let columns = self.parse_parenthesized_column_list(Optional, false)?;
6666 self.expect_keyword(Keyword::AS)?;
6667 self.expect_token(&Token::LParen)?;
6668 let query = Box::new(self.parse_query()?);
6669 self.expect_token(&Token::RParen)?;
6670 let alias = TableAlias { name, columns };
6671 Cte {
6672 alias,
6673 query,
6674 from: None,
6675 }
6676 };
6677 if self.parse_keyword(Keyword::FROM) {
6678 cte.from = Some(self.parse_identifier(false)?);
6679 }
6680 Ok(cte)
6681 }
6682
6683 pub fn parse_query_body(&mut self, precedence: u8) -> Result<SetExpr, ParserError> {
6692 let mut expr = if self.parse_keyword(Keyword::SELECT) {
6695 SetExpr::Select(Box::new(self.parse_select()?))
6696 } else if self.consume_token(&Token::LParen) {
6697 let subquery = self.parse_query()?;
6699 self.expect_token(&Token::RParen)?;
6700 SetExpr::Query(Box::new(subquery))
6701 } else if self.parse_keyword(Keyword::VALUES) {
6702 let is_mysql = dialect_of!(self is MySqlDialect);
6703 SetExpr::Values(self.parse_values(is_mysql)?)
6704 } else if self.parse_keyword(Keyword::TABLE) {
6705 SetExpr::Table(Box::new(self.parse_as_table()?))
6706 } else {
6707 return self.expected(
6708 "SELECT, VALUES, or a subquery in the query body",
6709 self.peek_token(),
6710 );
6711 };
6712
6713 loop {
6714 let op = self.parse_set_operator(&self.peek_token().token);
6716 let next_precedence = match op {
6717 Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
6719 Some(SetOperator::Intersect) => 20,
6721 None => break,
6723 };
6724 if precedence >= next_precedence {
6725 break;
6726 }
6727 self.next_token(); let set_quantifier = self.parse_set_quantifier(&op);
6729 expr = SetExpr::SetOperation {
6730 left: Box::new(expr),
6731 op: op.unwrap(),
6732 set_quantifier,
6733 right: Box::new(self.parse_query_body(next_precedence)?),
6734 };
6735 }
6736
6737 Ok(expr)
6738 }
6739
6740 pub fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
6741 match token {
6742 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
6743 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
6744 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
6745 _ => None,
6746 }
6747 }
6748
6749 pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
6750 match op {
6751 Some(SetOperator::Union) => {
6752 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
6753 SetQuantifier::DistinctByName
6754 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
6755 SetQuantifier::ByName
6756 } else if self.parse_keyword(Keyword::ALL) {
6757 if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
6758 SetQuantifier::AllByName
6759 } else {
6760 SetQuantifier::All
6761 }
6762 } else if self.parse_keyword(Keyword::DISTINCT) {
6763 SetQuantifier::Distinct
6764 } else {
6765 SetQuantifier::None
6766 }
6767 }
6768 Some(SetOperator::Except) | Some(SetOperator::Intersect) => {
6769 if self.parse_keyword(Keyword::ALL) {
6770 SetQuantifier::All
6771 } else if self.parse_keyword(Keyword::DISTINCT) {
6772 SetQuantifier::Distinct
6773 } else {
6774 SetQuantifier::None
6775 }
6776 }
6777 _ => SetQuantifier::None,
6778 }
6779 }
6780
6781 pub fn parse_select(&mut self) -> Result<Select, ParserError> {
6784 let distinct = self.parse_all_or_distinct()?;
6785
6786 let top = if self.parse_keyword(Keyword::TOP) {
6787 Some(self.parse_top()?)
6788 } else {
6789 None
6790 };
6791
6792 let projection = self.parse_projection()?;
6793
6794 let into = if self.parse_keyword(Keyword::INTO) {
6795 let temporary = self
6796 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
6797 .is_some();
6798 let unlogged = self.parse_keyword(Keyword::UNLOGGED);
6799 let table = self.parse_keyword(Keyword::TABLE);
6800 let name = self.parse_object_name(false)?;
6801 Some(SelectInto {
6802 temporary,
6803 unlogged,
6804 table,
6805 name,
6806 })
6807 } else {
6808 None
6809 };
6810
6811 let from = if self.parse_keyword(Keyword::FROM) {
6817 self.parse_comma_separated(Parser::parse_table_and_joins)?
6818 } else {
6819 vec![]
6820 };
6821
6822 let mut lateral_views = vec![];
6823 loop {
6824 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
6825 let outer = self.parse_keyword(Keyword::OUTER);
6826 let lateral_view = self.parse_expr()?;
6827 let lateral_view_name = self.parse_object_name(false)?;
6828 let lateral_col_alias = self
6829 .parse_comma_separated(|parser| {
6830 parser.parse_optional_alias(&[
6831 Keyword::WHERE,
6832 Keyword::GROUP,
6833 Keyword::CLUSTER,
6834 Keyword::HAVING,
6835 Keyword::LATERAL,
6836 ]) })?
6838 .into_iter()
6839 .flatten()
6840 .collect();
6841
6842 lateral_views.push(LateralView {
6843 lateral_view,
6844 lateral_view_name,
6845 lateral_col_alias,
6846 outer,
6847 });
6848 } else {
6849 break;
6850 }
6851 }
6852
6853 let selection = if self.parse_keyword(Keyword::WHERE) {
6854 Some(self.parse_expr()?)
6855 } else {
6856 None
6857 };
6858
6859 let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
6860 if self.parse_keyword(Keyword::ALL) {
6861 GroupByExpr::All
6862 } else {
6863 GroupByExpr::Expressions(self.parse_comma_separated(Parser::parse_group_by_expr)?)
6864 }
6865 } else {
6866 GroupByExpr::Expressions(vec![])
6867 };
6868
6869 let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
6870 self.parse_comma_separated(Parser::parse_expr)?
6871 } else {
6872 vec![]
6873 };
6874
6875 let distribute_by = if self.parse_keywords(&[Keyword::DISTRIBUTE, Keyword::BY]) {
6876 self.parse_comma_separated(Parser::parse_expr)?
6877 } else {
6878 vec![]
6879 };
6880
6881 let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
6882 self.parse_comma_separated(Parser::parse_expr)?
6883 } else {
6884 vec![]
6885 };
6886
6887 let having = if self.parse_keyword(Keyword::HAVING) {
6888 Some(self.parse_expr()?)
6889 } else {
6890 None
6891 };
6892
6893 let named_windows = if self.parse_keyword(Keyword::WINDOW) {
6894 self.parse_comma_separated(Parser::parse_named_window)?
6895 } else {
6896 vec![]
6897 };
6898
6899 let qualify = if self.parse_keyword(Keyword::QUALIFY) {
6900 Some(self.parse_expr()?)
6901 } else {
6902 None
6903 };
6904
6905 Ok(Select {
6906 distinct,
6907 top,
6908 projection,
6909 into,
6910 from,
6911 lateral_views,
6912 selection,
6913 group_by,
6914 cluster_by,
6915 distribute_by,
6916 sort_by,
6917 having,
6918 named_window: named_windows,
6919 qualify,
6920 })
6921 }
6922
6923 pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
6925 let token1 = self.next_token();
6926 let token2 = self.next_token();
6927 let token3 = self.next_token();
6928
6929 let table_name;
6930 let schema_name;
6931 if token2 == Token::Period {
6932 match token1.token {
6933 Token::Word(w) => {
6934 schema_name = w.value;
6935 }
6936 _ => {
6937 return self.expected("Schema name", token1);
6938 }
6939 }
6940 match token3.token {
6941 Token::Word(w) => {
6942 table_name = w.value;
6943 }
6944 _ => {
6945 return self.expected("Table name", token3);
6946 }
6947 }
6948 Ok(Table {
6949 table_name: Some(table_name),
6950 schema_name: Some(schema_name),
6951 })
6952 } else {
6953 match token1.token {
6954 Token::Word(w) => {
6955 table_name = w.value;
6956 }
6957 _ => {
6958 return self.expected("Table name", token1);
6959 }
6960 }
6961 Ok(Table {
6962 table_name: Some(table_name),
6963 schema_name: None,
6964 })
6965 }
6966 }
6967
6968 pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
6969 let modifier =
6970 self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
6971 if let Some(Keyword::HIVEVAR) = modifier {
6972 self.expect_token(&Token::Colon)?;
6973 } else if self.parse_keyword(Keyword::ROLE) {
6974 let context_modifier = match modifier {
6975 Some(Keyword::LOCAL) => ContextModifier::Local,
6976 Some(Keyword::SESSION) => ContextModifier::Session,
6977 _ => ContextModifier::None,
6978 };
6979
6980 let role_name = if self.parse_keyword(Keyword::NONE) {
6981 None
6982 } else {
6983 Some(self.parse_identifier(false)?)
6984 };
6985 return Ok(Statement::SetRole {
6986 context_modifier,
6987 role_name,
6988 });
6989 }
6990
6991 let variable = if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
6992 ObjectName(vec!["TIMEZONE".into()])
6993 } else {
6994 self.parse_object_name(false)?
6995 };
6996
6997 if variable.to_string().eq_ignore_ascii_case("NAMES")
6998 && dialect_of!(self is MySqlDialect | GenericDialect)
6999 {
7000 if self.parse_keyword(Keyword::DEFAULT) {
7001 return Ok(Statement::SetNamesDefault {});
7002 }
7003
7004 let charset_name = self.parse_literal_string()?;
7005 let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
7006 Some(self.parse_literal_string()?)
7007 } else {
7008 None
7009 };
7010
7011 Ok(Statement::SetNames {
7012 charset_name,
7013 collation_name,
7014 })
7015 } else if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
7016 let mut values = vec![];
7017 loop {
7018 let value = if let Ok(expr) = self.parse_expr() {
7019 expr
7020 } else {
7021 self.expected("variable value", self.peek_token())?
7022 };
7023
7024 values.push(value);
7025 if self.consume_token(&Token::Comma) {
7026 continue;
7027 }
7028 return Ok(Statement::SetVariable {
7029 local: modifier == Some(Keyword::LOCAL),
7030 hivevar: Some(Keyword::HIVEVAR) == modifier,
7031 variable,
7032 value: values,
7033 });
7034 }
7035 } else if variable.to_string().eq_ignore_ascii_case("TIMEZONE") {
7036 match self.parse_expr() {
7038 Ok(expr) => Ok(Statement::SetTimeZone {
7039 local: modifier == Some(Keyword::LOCAL),
7040 value: expr,
7041 }),
7042 _ => self.expected("timezone value", self.peek_token())?,
7043 }
7044 } else if variable.to_string() == "CHARACTERISTICS" {
7045 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
7046 Ok(Statement::SetTransaction {
7047 modes: self.parse_transaction_modes()?,
7048 snapshot: None,
7049 session: true,
7050 })
7051 } else if variable.to_string() == "TRANSACTION" && modifier.is_none() {
7052 if self.parse_keyword(Keyword::SNAPSHOT) {
7053 let snaphot_id = self.parse_value()?;
7054 return Ok(Statement::SetTransaction {
7055 modes: vec![],
7056 snapshot: Some(snaphot_id),
7057 session: false,
7058 });
7059 }
7060 Ok(Statement::SetTransaction {
7061 modes: self.parse_transaction_modes()?,
7062 snapshot: None,
7063 session: false,
7064 })
7065 } else {
7066 self.expected("equals sign or TO", self.peek_token())
7067 }
7068 }
7069
7070 pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
7071 let extended = self.parse_keyword(Keyword::EXTENDED);
7072 let full = self.parse_keyword(Keyword::FULL);
7073 let session = self.parse_keyword(Keyword::SESSION);
7074 let global = self.parse_keyword(Keyword::GLOBAL);
7075 if self
7076 .parse_one_of_keywords(&[Keyword::COLUMNS, Keyword::FIELDS])
7077 .is_some()
7078 {
7079 Ok(self.parse_show_columns(extended, full)?)
7080 } else if self.parse_keyword(Keyword::TABLES) {
7081 Ok(self.parse_show_tables(extended, full)?)
7082 } else if self.parse_keyword(Keyword::FUNCTIONS) {
7083 Ok(self.parse_show_functions()?)
7084 } else if extended || full {
7085 Err(ParserError::ParserError(
7086 "EXTENDED/FULL are not supported with this type of SHOW query".to_string(),
7087 ))
7088 } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
7089 Ok(self.parse_show_create()?)
7090 } else if self.parse_keyword(Keyword::COLLATION) {
7091 Ok(self.parse_show_collation()?)
7092 } else if self.parse_keyword(Keyword::VARIABLES)
7093 && dialect_of!(self is MySqlDialect | GenericDialect)
7094 {
7095 Ok(Statement::ShowVariables {
7096 filter: self.parse_show_statement_filter()?,
7097 session,
7098 global,
7099 })
7100 } else {
7101 Ok(Statement::ShowVariable {
7102 variable: self.parse_identifiers()?,
7103 })
7104 }
7105 }
7106
7107 pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
7108 let obj_type = match self.expect_one_of_keywords(&[
7109 Keyword::TABLE,
7110 Keyword::TRIGGER,
7111 Keyword::FUNCTION,
7112 Keyword::PROCEDURE,
7113 Keyword::EVENT,
7114 Keyword::VIEW,
7115 ])? {
7116 Keyword::TABLE => Ok(ShowCreateObject::Table),
7117 Keyword::TRIGGER => Ok(ShowCreateObject::Trigger),
7118 Keyword::FUNCTION => Ok(ShowCreateObject::Function),
7119 Keyword::PROCEDURE => Ok(ShowCreateObject::Procedure),
7120 Keyword::EVENT => Ok(ShowCreateObject::Event),
7121 Keyword::VIEW => Ok(ShowCreateObject::View),
7122 keyword => Err(ParserError::ParserError(format!(
7123 "Unable to map keyword to ShowCreateObject: {keyword:?}"
7124 ))),
7125 }?;
7126
7127 let obj_name = self.parse_object_name(false)?;
7128
7129 Ok(Statement::ShowCreate { obj_type, obj_name })
7130 }
7131
7132 pub fn parse_show_columns(
7133 &mut self,
7134 extended: bool,
7135 full: bool,
7136 ) -> Result<Statement, ParserError> {
7137 self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
7138 let object_name = self.parse_object_name(false)?;
7139 let table_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
7140 Some(_) => {
7141 let db_name = vec![self.parse_identifier(false)?];
7142 let ObjectName(table_name) = object_name;
7143 let object_name = db_name.into_iter().chain(table_name).collect();
7144 ObjectName(object_name)
7145 }
7146 None => object_name,
7147 };
7148 let filter = self.parse_show_statement_filter()?;
7149 Ok(Statement::ShowColumns {
7150 extended,
7151 full,
7152 table_name,
7153 filter,
7154 })
7155 }
7156
7157 pub fn parse_show_tables(
7158 &mut self,
7159 extended: bool,
7160 full: bool,
7161 ) -> Result<Statement, ParserError> {
7162 let db_name = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
7163 Some(_) => Some(self.parse_identifier(false)?),
7164 None => None,
7165 };
7166 let filter = self.parse_show_statement_filter()?;
7167 Ok(Statement::ShowTables {
7168 extended,
7169 full,
7170 db_name,
7171 filter,
7172 })
7173 }
7174
7175 pub fn parse_show_functions(&mut self) -> Result<Statement, ParserError> {
7176 let filter = self.parse_show_statement_filter()?;
7177 Ok(Statement::ShowFunctions { filter })
7178 }
7179
7180 pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
7181 let filter = self.parse_show_statement_filter()?;
7182 Ok(Statement::ShowCollation { filter })
7183 }
7184
7185 pub fn parse_show_statement_filter(
7186 &mut self,
7187 ) -> Result<Option<ShowStatementFilter>, ParserError> {
7188 if self.parse_keyword(Keyword::LIKE) {
7189 Ok(Some(ShowStatementFilter::Like(
7190 self.parse_literal_string()?,
7191 )))
7192 } else if self.parse_keyword(Keyword::ILIKE) {
7193 Ok(Some(ShowStatementFilter::ILike(
7194 self.parse_literal_string()?,
7195 )))
7196 } else if self.parse_keyword(Keyword::WHERE) {
7197 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
7198 } else {
7199 Ok(None)
7200 }
7201 }
7202
7203 pub fn parse_use(&mut self) -> Result<Statement, ParserError> {
7204 let db_name = self.parse_identifier(false)?;
7205 Ok(Statement::Use { db_name })
7206 }
7207
7208 pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
7209 let relation = self.parse_table_factor()?;
7210 let mut joins = vec![];
7214 loop {
7215 let join = if self.parse_keyword(Keyword::CROSS) {
7216 let join_operator = if self.parse_keyword(Keyword::JOIN) {
7217 JoinOperator::CrossJoin
7218 } else if self.parse_keyword(Keyword::APPLY) {
7219 JoinOperator::CrossApply
7221 } else {
7222 return self.expected("JOIN or APPLY after CROSS", self.peek_token());
7223 };
7224 Join {
7225 relation: self.parse_table_factor()?,
7226 join_operator,
7227 }
7228 } else if self.parse_keyword(Keyword::OUTER) {
7229 self.expect_keyword(Keyword::APPLY)?;
7231 Join {
7232 relation: self.parse_table_factor()?,
7233 join_operator: JoinOperator::OuterApply,
7234 }
7235 } else {
7236 let natural = self.parse_keyword(Keyword::NATURAL);
7237 let peek_keyword = if let Token::Word(w) = self.peek_token().token {
7238 w.keyword
7239 } else {
7240 Keyword::NoKeyword
7241 };
7242
7243 let join_operator_type = match peek_keyword {
7244 Keyword::INNER | Keyword::JOIN => {
7245 let _ = self.parse_keyword(Keyword::INNER); self.expect_keyword(Keyword::JOIN)?;
7247 JoinOperator::Inner
7248 }
7249 kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
7250 let _ = self.next_token(); let is_left = kw == Keyword::LEFT;
7252 let join_type = self.parse_one_of_keywords(&[
7253 Keyword::OUTER,
7254 Keyword::SEMI,
7255 Keyword::ANTI,
7256 Keyword::JOIN,
7257 ]);
7258 match join_type {
7259 Some(Keyword::OUTER) => {
7260 self.expect_keyword(Keyword::JOIN)?;
7261 if is_left {
7262 JoinOperator::LeftOuter
7263 } else {
7264 JoinOperator::RightOuter
7265 }
7266 }
7267 Some(Keyword::SEMI) => {
7268 self.expect_keyword(Keyword::JOIN)?;
7269 if is_left {
7270 JoinOperator::LeftSemi
7271 } else {
7272 JoinOperator::RightSemi
7273 }
7274 }
7275 Some(Keyword::ANTI) => {
7276 self.expect_keyword(Keyword::JOIN)?;
7277 if is_left {
7278 JoinOperator::LeftAnti
7279 } else {
7280 JoinOperator::RightAnti
7281 }
7282 }
7283 Some(Keyword::JOIN) => {
7284 if is_left {
7285 JoinOperator::LeftOuter
7286 } else {
7287 JoinOperator::RightOuter
7288 }
7289 }
7290 _ => {
7291 return Err(ParserError::ParserError(format!(
7292 "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
7293 )))
7294 }
7295 }
7296 }
7297 Keyword::FULL => {
7298 let _ = self.next_token(); let _ = self.parse_keyword(Keyword::OUTER); self.expect_keyword(Keyword::JOIN)?;
7301 JoinOperator::FullOuter
7302 }
7303 Keyword::OUTER => {
7304 return self.expected("LEFT, RIGHT, or FULL", self.peek_token());
7305 }
7306 _ if natural => {
7307 return self.expected("a join type after NATURAL", self.peek_token());
7308 }
7309 _ => break,
7310 };
7311 let relation = self.parse_table_factor()?;
7312 let join_constraint = self.parse_join_constraint(natural)?;
7313 Join {
7314 relation,
7315 join_operator: join_operator_type(join_constraint),
7316 }
7317 };
7318 joins.push(join);
7319 }
7320 Ok(TableWithJoins { relation, joins })
7321 }
7322
7323 pub fn parse_table_factor(&mut self) -> Result<TableFactor, ParserError> {
7325 if self.parse_keyword(Keyword::LATERAL) {
7326 if self.consume_token(&Token::LParen) {
7328 self.parse_derived_table_factor(Lateral)
7329 } else {
7330 let name = self.parse_object_name(false)?;
7331 self.expect_token(&Token::LParen)?;
7332 let args = self.parse_optional_args()?;
7333 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7334 Ok(TableFactor::Function {
7335 lateral: true,
7336 name,
7337 args,
7338 alias,
7339 })
7340 }
7341 } else if self.parse_keyword(Keyword::TABLE) {
7342 self.expect_token(&Token::LParen)?;
7344 let expr = self.parse_expr()?;
7345 self.expect_token(&Token::RParen)?;
7346 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7347 Ok(TableFactor::TableFunction { expr, alias })
7348 } else if self.consume_token(&Token::LParen) {
7349 if let Some(mut table) =
7371 self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))
7372 {
7373 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT])
7374 {
7375 table = match kw {
7376 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
7377 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
7378 _ => unreachable!(),
7379 }
7380 }
7381 return Ok(table);
7382 }
7383
7384 let mut table_and_joins = self.parse_table_and_joins()?;
7391
7392 #[allow(clippy::if_same_then_else)]
7393 if !table_and_joins.joins.is_empty() {
7394 self.expect_token(&Token::RParen)?;
7395 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7396 Ok(TableFactor::NestedJoin {
7397 table_with_joins: Box::new(table_and_joins),
7398 alias,
7399 }) } else if let TableFactor::NestedJoin {
7401 table_with_joins: _,
7402 alias: _,
7403 } = &table_and_joins.relation
7404 {
7405 self.expect_token(&Token::RParen)?;
7408 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7409 Ok(TableFactor::NestedJoin {
7410 table_with_joins: Box::new(table_and_joins),
7411 alias,
7412 })
7413 } else if dialect_of!(self is SnowflakeDialect | GenericDialect) {
7414 self.expect_token(&Token::RParen)?;
7421
7422 if let Some(outer_alias) =
7423 self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?
7424 {
7425 match &mut table_and_joins.relation {
7428 TableFactor::Derived { alias, .. }
7429 | TableFactor::Table { alias, .. }
7430 | TableFactor::Function { alias, .. }
7431 | TableFactor::UNNEST { alias, .. }
7432 | TableFactor::JsonTable { alias, .. }
7433 | TableFactor::TableFunction { alias, .. }
7434 | TableFactor::Pivot { alias, .. }
7435 | TableFactor::Unpivot { alias, .. }
7436 | TableFactor::NestedJoin { alias, .. } => {
7437 if let Some(inner_alias) = alias {
7439 return Err(ParserError::ParserError(format!(
7440 "duplicate alias {inner_alias}"
7441 )));
7442 }
7443 alias.replace(outer_alias);
7447 }
7448 };
7449 }
7450 Ok(table_and_joins.relation)
7452 } else {
7453 self.expected("joined table", self.peek_token())
7456 }
7457 } else if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
7458 && self.parse_keyword(Keyword::UNNEST)
7459 {
7460 self.expect_token(&Token::LParen)?;
7461 let array_exprs = self.parse_comma_separated(Parser::parse_expr)?;
7462 self.expect_token(&Token::RParen)?;
7463
7464 let alias = match self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS) {
7465 Ok(Some(alias)) => Some(alias),
7466 Ok(None) => None,
7467 Err(e) => return Err(e),
7468 };
7469
7470 let with_offset = match self.expect_keywords(&[Keyword::WITH, Keyword::OFFSET]) {
7471 Ok(()) => true,
7472 Err(_) => false,
7473 };
7474
7475 let with_offset_alias = if with_offset {
7476 match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) {
7477 Ok(Some(alias)) => Some(alias),
7478 Ok(None) => None,
7479 Err(e) => return Err(e),
7480 }
7481 } else {
7482 None
7483 };
7484
7485 Ok(TableFactor::UNNEST {
7486 alias,
7487 array_exprs,
7488 with_offset,
7489 with_offset_alias,
7490 })
7491 } else if self.parse_keyword(Keyword::JSON_TABLE) {
7492 self.expect_token(&Token::LParen)?;
7493 let json_expr = self.parse_expr()?;
7494 self.expect_token(&Token::Comma)?;
7495 let json_path = self.parse_value()?;
7496 self.expect_keyword(Keyword::COLUMNS)?;
7497 self.expect_token(&Token::LParen)?;
7498 let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
7499 self.expect_token(&Token::RParen)?;
7500 self.expect_token(&Token::RParen)?;
7501 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7502 Ok(TableFactor::JsonTable {
7503 json_expr,
7504 json_path,
7505 columns,
7506 alias,
7507 })
7508 } else {
7509 let name = self.parse_object_name(true)?;
7510
7511 let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
7512 && self.parse_keyword(Keyword::PARTITION)
7513 {
7514 self.parse_partitions()?
7515 } else {
7516 vec![]
7517 };
7518
7519 let version = self.parse_table_version()?;
7521
7522 let args = if self.consume_token(&Token::LParen) {
7524 Some(self.parse_optional_args()?)
7525 } else {
7526 None
7527 };
7528
7529 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7530
7531 let mut with_hints = vec![];
7533 if self.parse_keyword(Keyword::WITH) {
7534 if self.consume_token(&Token::LParen) {
7535 with_hints = self.parse_comma_separated(Parser::parse_expr)?;
7536 self.expect_token(&Token::RParen)?;
7537 } else {
7538 self.prev_token();
7540 }
7541 };
7542
7543 let mut table = TableFactor::Table {
7544 name,
7545 alias,
7546 args,
7547 with_hints,
7548 version,
7549 partitions,
7550 };
7551
7552 while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
7553 table = match kw {
7554 Keyword::PIVOT => self.parse_pivot_table_factor(table)?,
7555 Keyword::UNPIVOT => self.parse_unpivot_table_factor(table)?,
7556 _ => unreachable!(),
7557 }
7558 }
7559
7560 Ok(table)
7561 }
7562 }
7563
7564 pub fn parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
7568 if dialect_of!(self is BigQueryDialect | MsSqlDialect)
7569 && self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
7570 {
7571 let expr = self.parse_expr()?;
7572 Ok(Some(TableVersion::ForSystemTimeAsOf(expr)))
7573 } else {
7574 Ok(None)
7575 }
7576 }
7577
7578 pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
7581 let name = self.parse_identifier(false)?;
7582 let r#type = self.parse_data_type()?;
7583 let exists = self.parse_keyword(Keyword::EXISTS);
7584 self.expect_keyword(Keyword::PATH)?;
7585 let path = self.parse_value()?;
7586 let mut on_empty = None;
7587 let mut on_error = None;
7588 while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
7589 if self.parse_keyword(Keyword::EMPTY) {
7590 on_empty = Some(error_handling);
7591 } else {
7592 self.expect_keyword(Keyword::ERROR)?;
7593 on_error = Some(error_handling);
7594 }
7595 }
7596 Ok(JsonTableColumn {
7597 name,
7598 r#type,
7599 path,
7600 exists,
7601 on_empty,
7602 on_error,
7603 })
7604 }
7605
7606 fn parse_json_table_column_error_handling(
7607 &mut self,
7608 ) -> Result<Option<JsonTableColumnErrorHandling>, ParserError> {
7609 let res = if self.parse_keyword(Keyword::NULL) {
7610 JsonTableColumnErrorHandling::Null
7611 } else if self.parse_keyword(Keyword::ERROR) {
7612 JsonTableColumnErrorHandling::Error
7613 } else if self.parse_keyword(Keyword::DEFAULT) {
7614 JsonTableColumnErrorHandling::Default(self.parse_value()?)
7615 } else {
7616 return Ok(None);
7617 };
7618 self.expect_keyword(Keyword::ON)?;
7619 Ok(Some(res))
7620 }
7621
7622 pub fn parse_derived_table_factor(
7623 &mut self,
7624 lateral: IsLateral,
7625 ) -> Result<TableFactor, ParserError> {
7626 let subquery = Box::new(self.parse_query()?);
7627 self.expect_token(&Token::RParen)?;
7628 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7629 Ok(TableFactor::Derived {
7630 lateral: match lateral {
7631 Lateral => true,
7632 NotLateral => false,
7633 },
7634 subquery,
7635 alias,
7636 })
7637 }
7638
7639 pub fn parse_pivot_table_factor(
7640 &mut self,
7641 table: TableFactor,
7642 ) -> Result<TableFactor, ParserError> {
7643 self.expect_token(&Token::LParen)?;
7644 let function_name = match self.next_token().token {
7645 Token::Word(w) => Ok(w.value),
7646 _ => self.expected("an aggregate function name", self.peek_token()),
7647 }?;
7648 let function = self.parse_function(ObjectName(vec![Ident::new(function_name)]))?;
7649 self.expect_keyword(Keyword::FOR)?;
7650 let value_column = self.parse_object_name(false)?.0;
7651 self.expect_keyword(Keyword::IN)?;
7652 self.expect_token(&Token::LParen)?;
7653 let pivot_values = self.parse_comma_separated(Parser::parse_value)?;
7654 self.expect_token(&Token::RParen)?;
7655 self.expect_token(&Token::RParen)?;
7656 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7657 Ok(TableFactor::Pivot {
7658 table: Box::new(table),
7659 aggregate_function: function,
7660 value_column,
7661 pivot_values,
7662 alias,
7663 })
7664 }
7665
7666 pub fn parse_unpivot_table_factor(
7667 &mut self,
7668 table: TableFactor,
7669 ) -> Result<TableFactor, ParserError> {
7670 self.expect_token(&Token::LParen)?;
7671 let value = self.parse_identifier(false)?;
7672 self.expect_keyword(Keyword::FOR)?;
7673 let name = self.parse_identifier(false)?;
7674 self.expect_keyword(Keyword::IN)?;
7675 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
7676 self.expect_token(&Token::RParen)?;
7677 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
7678 Ok(TableFactor::Unpivot {
7679 table: Box::new(table),
7680 value,
7681 name,
7682 columns,
7683 alias,
7684 })
7685 }
7686
7687 pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
7688 if natural {
7689 Ok(JoinConstraint::Natural)
7690 } else if self.parse_keyword(Keyword::ON) {
7691 let constraint = self.parse_expr()?;
7692 Ok(JoinConstraint::On(constraint))
7693 } else if self.parse_keyword(Keyword::USING) {
7694 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
7695 Ok(JoinConstraint::Using(columns))
7696 } else {
7697 Ok(JoinConstraint::None)
7698 }
7700 }
7701
7702 pub fn parse_grant(&mut self) -> Result<Statement, ParserError> {
7704 let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
7705
7706 self.expect_keyword(Keyword::TO)?;
7707 let grantees = self.parse_comma_separated(|p| p.parse_identifier(false))?;
7708
7709 let with_grant_option =
7710 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
7711
7712 let granted_by = self
7713 .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
7714 .then(|| self.parse_identifier(false).unwrap());
7715
7716 Ok(Statement::Grant {
7717 privileges,
7718 objects,
7719 grantees,
7720 with_grant_option,
7721 granted_by,
7722 })
7723 }
7724
7725 pub fn parse_grant_revoke_privileges_objects(
7726 &mut self,
7727 ) -> Result<(Privileges, GrantObjects), ParserError> {
7728 let privileges = if self.parse_keyword(Keyword::ALL) {
7729 Privileges::All {
7730 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
7731 }
7732 } else {
7733 let (actions, err): (Vec<_>, Vec<_>) = self
7734 .parse_comma_separated(Parser::parse_grant_permission)?
7735 .into_iter()
7736 .map(|(kw, columns)| match kw {
7737 Keyword::DELETE => Ok(Action::Delete),
7738 Keyword::INSERT => Ok(Action::Insert { columns }),
7739 Keyword::REFERENCES => Ok(Action::References { columns }),
7740 Keyword::SELECT => Ok(Action::Select { columns }),
7741 Keyword::TRIGGER => Ok(Action::Trigger),
7742 Keyword::TRUNCATE => Ok(Action::Truncate),
7743 Keyword::UPDATE => Ok(Action::Update { columns }),
7744 Keyword::USAGE => Ok(Action::Usage),
7745 Keyword::CONNECT => Ok(Action::Connect),
7746 Keyword::CREATE => Ok(Action::Create),
7747 Keyword::EXECUTE => Ok(Action::Execute),
7748 Keyword::TEMPORARY => Ok(Action::Temporary),
7749 _ => Err(kw),
7753 })
7754 .partition(Result::is_ok);
7755
7756 if !err.is_empty() {
7757 let errors: Vec<Keyword> = err.into_iter().filter_map(|x| x.err()).collect();
7758 return Err(ParserError::ParserError(format!(
7759 "INTERNAL ERROR: GRANT/REVOKE unexpected keyword(s) - {errors:?}"
7760 )));
7761 }
7762 let act = actions.into_iter().filter_map(|x| x.ok()).collect();
7763 Privileges::Actions(act)
7764 };
7765
7766 self.expect_keyword(Keyword::ON)?;
7767
7768 let objects = if self.parse_keywords(&[
7769 Keyword::ALL,
7770 Keyword::TABLES,
7771 Keyword::IN,
7772 Keyword::SCHEMA,
7773 ]) {
7774 GrantObjects::AllTablesInSchema {
7775 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
7776 }
7777 } else if self.parse_keywords(&[
7778 Keyword::ALL,
7779 Keyword::SEQUENCES,
7780 Keyword::IN,
7781 Keyword::SCHEMA,
7782 ]) {
7783 GrantObjects::AllSequencesInSchema {
7784 schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
7785 }
7786 } else {
7787 let object_type =
7788 self.parse_one_of_keywords(&[Keyword::SEQUENCE, Keyword::SCHEMA, Keyword::TABLE]);
7789 let objects = self.parse_comma_separated(|p| p.parse_object_name(false));
7790 match object_type {
7791 Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
7792 Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
7793 Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
7794 _ => unreachable!(),
7795 }
7796 };
7797
7798 Ok((privileges, objects))
7799 }
7800
7801 pub fn parse_grant_permission(&mut self) -> Result<(Keyword, Option<Vec<Ident>>), ParserError> {
7802 if let Some(kw) = self.parse_one_of_keywords(&[
7803 Keyword::CONNECT,
7804 Keyword::CREATE,
7805 Keyword::DELETE,
7806 Keyword::EXECUTE,
7807 Keyword::INSERT,
7808 Keyword::REFERENCES,
7809 Keyword::SELECT,
7810 Keyword::TEMPORARY,
7811 Keyword::TRIGGER,
7812 Keyword::TRUNCATE,
7813 Keyword::UPDATE,
7814 Keyword::USAGE,
7815 ]) {
7816 let columns = match kw {
7817 Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
7818 let columns = self.parse_parenthesized_column_list(Optional, false)?;
7819 if columns.is_empty() {
7820 None
7821 } else {
7822 Some(columns)
7823 }
7824 }
7825 _ => None,
7826 };
7827 Ok((kw, columns))
7828 } else {
7829 self.expected("a privilege keyword", self.peek_token())?
7830 }
7831 }
7832
7833 pub fn parse_revoke(&mut self) -> Result<Statement, ParserError> {
7835 let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
7836
7837 self.expect_keyword(Keyword::FROM)?;
7838 let grantees = self.parse_comma_separated(|p| p.parse_identifier(false))?;
7839
7840 let granted_by = self
7841 .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
7842 .then(|| self.parse_identifier(false).unwrap());
7843
7844 let loc = self.peek_token().location;
7845 let cascade = self.parse_keyword(Keyword::CASCADE);
7846 let restrict = self.parse_keyword(Keyword::RESTRICT);
7847 if cascade && restrict {
7848 return parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE", loc);
7849 }
7850
7851 Ok(Statement::Revoke {
7852 privileges,
7853 objects,
7854 grantees,
7855 granted_by,
7856 cascade,
7857 })
7858 }
7859
7860 pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
7862 if !dialect_of!(self is MySqlDialect | GenericDialect) {
7863 return parser_err!("Unsupported statement REPLACE", self.peek_token().location);
7864 }
7865
7866 let insert = &mut self.parse_insert().unwrap();
7867 if let Statement::Insert { replace_into, .. } = insert {
7868 *replace_into = true;
7869 }
7870
7871 Ok(insert.clone())
7872 }
7873
7874 pub fn parse_insert(&mut self) -> Result<Statement, ParserError> {
7876 let or = if !dialect_of!(self is SQLiteDialect) {
7877 None
7878 } else if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
7879 Some(SqliteOnConflict::Replace)
7880 } else if self.parse_keywords(&[Keyword::OR, Keyword::ROLLBACK]) {
7881 Some(SqliteOnConflict::Rollback)
7882 } else if self.parse_keywords(&[Keyword::OR, Keyword::ABORT]) {
7883 Some(SqliteOnConflict::Abort)
7884 } else if self.parse_keywords(&[Keyword::OR, Keyword::FAIL]) {
7885 Some(SqliteOnConflict::Fail)
7886 } else if self.parse_keywords(&[Keyword::OR, Keyword::IGNORE]) {
7887 Some(SqliteOnConflict::Ignore)
7888 } else if self.parse_keyword(Keyword::REPLACE) {
7889 Some(SqliteOnConflict::Replace)
7890 } else {
7891 None
7892 };
7893
7894 let priority = if !dialect_of!(self is MySqlDialect | GenericDialect) {
7895 None
7896 } else if self.parse_keyword(Keyword::LOW_PRIORITY) {
7897 Some(MysqlInsertPriority::LowPriority)
7898 } else if self.parse_keyword(Keyword::DELAYED) {
7899 Some(MysqlInsertPriority::Delayed)
7900 } else if self.parse_keyword(Keyword::HIGH_PRIORITY) {
7901 Some(MysqlInsertPriority::HighPriority)
7902 } else {
7903 None
7904 };
7905
7906 let ignore = dialect_of!(self is MySqlDialect | GenericDialect)
7907 && self.parse_keyword(Keyword::IGNORE);
7908
7909 let replace_into = false;
7910
7911 let action = self.parse_one_of_keywords(&[Keyword::INTO, Keyword::OVERWRITE]);
7912 let into = action == Some(Keyword::INTO);
7913 let overwrite = action == Some(Keyword::OVERWRITE);
7914
7915 let local = self.parse_keyword(Keyword::LOCAL);
7916
7917 if self.parse_keyword(Keyword::DIRECTORY) {
7918 let path = self.parse_literal_string()?;
7919 let file_format = if self.parse_keywords(&[Keyword::STORED, Keyword::AS]) {
7920 Some(self.parse_file_format()?)
7921 } else {
7922 None
7923 };
7924 let source = Box::new(self.parse_query()?);
7925 Ok(Statement::Directory {
7926 local,
7927 path,
7928 overwrite,
7929 file_format,
7930 source,
7931 })
7932 } else {
7933 let table = self.parse_keyword(Keyword::TABLE);
7935 let table_name = self.parse_object_name(false)?;
7936
7937 let table_alias =
7938 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::AS) {
7939 Some(self.parse_identifier(false)?)
7940 } else {
7941 None
7942 };
7943
7944 let is_mysql = dialect_of!(self is MySqlDialect);
7945
7946 let (columns, partitioned, after_columns, source) =
7947 if self.parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES]) {
7948 (vec![], None, vec![], None)
7949 } else {
7950 let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
7951
7952 let partitioned = self.parse_insert_partition()?;
7953
7954 let after_columns = self.parse_parenthesized_column_list(Optional, false)?;
7956
7957 let source = Some(Box::new(self.parse_query()?));
7958
7959 (columns, partitioned, after_columns, source)
7960 };
7961
7962 let (as_table, as_table_after_columns) = if dialect_of!(self is MySqlDialect | GenericDialect)
7963 && self.parse_keyword(Keyword::AS)
7964 {
7965 let as_table = Some(self.parse_object_name(false)?);
7966 let as_table_after_columns =
7967 self.parse_parenthesized_column_list(Optional, false)?;
7968 (as_table, as_table_after_columns)
7969 } else {
7970 (None, vec![])
7971 };
7972
7973 let on = if self.parse_keyword(Keyword::ON) {
7974 if self.parse_keyword(Keyword::CONFLICT) {
7975 let conflict_target =
7976 if self.parse_keywords(&[Keyword::ON, Keyword::CONSTRAINT]) {
7977 Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
7978 } else if self.peek_token() == Token::LParen {
7979 Some(ConflictTarget::Columns(
7980 self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
7981 ))
7982 } else {
7983 None
7984 };
7985
7986 self.expect_keyword(Keyword::DO)?;
7987 let action = if self.parse_keyword(Keyword::NOTHING) {
7988 OnConflictAction::DoNothing
7989 } else {
7990 self.expect_keyword(Keyword::UPDATE)?;
7991 self.expect_keyword(Keyword::SET)?;
7992 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
7993 let selection = if self.parse_keyword(Keyword::WHERE) {
7994 Some(self.parse_expr()?)
7995 } else {
7996 None
7997 };
7998 OnConflictAction::DoUpdate(DoUpdate {
7999 assignments,
8000 selection,
8001 })
8002 };
8003
8004 Some(OnInsert::OnConflict(OnConflict {
8005 conflict_target,
8006 action,
8007 }))
8008 } else {
8009 self.expect_keyword(Keyword::DUPLICATE)?;
8010 self.expect_keyword(Keyword::KEY)?;
8011 self.expect_keyword(Keyword::UPDATE)?;
8012 let l = self.parse_comma_separated(Parser::parse_assignment)?;
8013
8014 Some(OnInsert::DuplicateKeyUpdate(l))
8015 }
8016 } else {
8017 None
8018 };
8019
8020 let returning = if self.parse_keyword(Keyword::RETURNING) {
8021 Some(self.parse_comma_separated(Parser::parse_select_item)?)
8022 } else {
8023 None
8024 };
8025
8026 Ok(Statement::Insert {
8027 or,
8028 table_name,
8029 table_alias,
8030 ignore,
8031 into,
8032 overwrite,
8033 partitioned,
8034 columns,
8035 after_columns,
8036 source,
8037 table,
8038 as_table,
8039 as_table_after_columns,
8040 on,
8041 returning,
8042 replace_into,
8043 priority,
8044 })
8045 }
8046 }
8047
8048 pub fn parse_insert_partition(&mut self) -> Result<Option<Vec<Expr>>, ParserError> {
8049 if self.parse_keyword(Keyword::PARTITION) {
8050 self.expect_token(&Token::LParen)?;
8051 let partition_cols = Some(self.parse_comma_separated(Parser::parse_expr)?);
8052 self.expect_token(&Token::RParen)?;
8053 Ok(partition_cols)
8054 } else {
8055 Ok(None)
8056 }
8057 }
8058
8059 pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
8060 let table = self.parse_table_and_joins()?;
8061 self.expect_keyword(Keyword::SET)?;
8062 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8063 let from = if self.parse_keyword(Keyword::FROM)
8064 && dialect_of!(self is GenericDialect | PostgreSqlDialect | DuckDbDialect | BigQueryDialect | SnowflakeDialect | RedshiftSqlDialect | MsSqlDialect)
8065 {
8066 Some(self.parse_table_and_joins()?)
8067 } else {
8068 None
8069 };
8070 let selection = if self.parse_keyword(Keyword::WHERE) {
8071 Some(self.parse_expr()?)
8072 } else {
8073 None
8074 };
8075 let returning = if self.parse_keyword(Keyword::RETURNING) {
8076 Some(self.parse_comma_separated(Parser::parse_select_item)?)
8077 } else {
8078 None
8079 };
8080 Ok(Statement::Update {
8081 table,
8082 assignments,
8083 from,
8084 selection,
8085 returning,
8086 })
8087 }
8088
8089 pub fn parse_assignment(&mut self) -> Result<Assignment, ParserError> {
8091 let id = self.parse_identifiers()?;
8092 self.expect_token(&Token::Eq)?;
8093 let value = self.parse_expr()?;
8094 Ok(Assignment { id, value })
8095 }
8096
8097 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
8098 if self.peek_nth_token(1) == Token::RArrow {
8099 let name = self.parse_identifier(false)?;
8100
8101 self.expect_token(&Token::RArrow)?;
8102 let arg = self.parse_wildcard_expr()?.into();
8103
8104 Ok(FunctionArg::Named { name, arg })
8105 } else {
8106 Ok(FunctionArg::Unnamed(self.parse_wildcard_expr()?.into()))
8107 }
8108 }
8109
8110 pub fn parse_optional_args(&mut self) -> Result<Vec<FunctionArg>, ParserError> {
8111 if self.consume_token(&Token::RParen) {
8112 Ok(vec![])
8113 } else {
8114 let args = self.parse_comma_separated(Parser::parse_function_args)?;
8115 self.expect_token(&Token::RParen)?;
8116 Ok(args)
8117 }
8118 }
8119
8120 pub fn parse_optional_args_with_orderby(
8121 &mut self,
8122 ) -> Result<(Vec<FunctionArg>, Vec<OrderByExpr>), ParserError> {
8123 if self.consume_token(&Token::RParen) {
8124 Ok((vec![], vec![]))
8125 } else {
8126 if dialect_of!(self is SnowflakeDialect)
8129 && self
8130 .parse_one_of_keywords(&[Keyword::WITH, Keyword::SELECT])
8131 .is_some()
8132 {
8133 self.prev_token();
8134 let subquery = self.parse_query()?;
8135 self.expect_token(&Token::RParen)?;
8136 return Ok((
8137 vec![FunctionArg::Unnamed(FunctionArgExpr::from(Expr::Subquery(
8138 Box::new(subquery),
8139 )))],
8140 vec![],
8141 ));
8142 }
8143
8144 let args = self.parse_comma_separated(Parser::parse_function_args)?;
8145 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8146 self.parse_comma_separated(Parser::parse_order_by_expr)?
8147 } else {
8148 vec![]
8149 };
8150 self.expect_token(&Token::RParen)?;
8151 Ok((args, order_by))
8152 }
8153 }
8154
8155 pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
8157 match self.parse_wildcard_expr()? {
8158 Expr::QualifiedWildcard(prefix) => Ok(SelectItem::QualifiedWildcard(
8159 prefix,
8160 self.parse_wildcard_additional_options()?,
8161 )),
8162 Expr::Wildcard => Ok(SelectItem::Wildcard(
8163 self.parse_wildcard_additional_options()?,
8164 )),
8165 expr => {
8166 let expr: Expr = if self.dialect.supports_filter_during_aggregation()
8167 && self.parse_keyword(Keyword::FILTER)
8168 {
8169 let i = self.index - 1;
8170 if self.consume_token(&Token::LParen) && self.parse_keyword(Keyword::WHERE) {
8171 let filter = self.parse_expr()?;
8172 self.expect_token(&Token::RParen)?;
8173 Expr::AggregateExpressionWithFilter {
8174 expr: Box::new(expr),
8175 filter: Box::new(filter),
8176 }
8177 } else {
8178 self.index = i;
8179 expr
8180 }
8181 } else {
8182 expr
8183 };
8184 self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
8185 .map(|alias| match alias {
8186 Some(alias) => SelectItem::ExprWithAlias { expr, alias },
8187 None => SelectItem::UnnamedExpr(expr),
8188 })
8189 }
8190 }
8191 }
8192
8193 pub fn parse_wildcard_additional_options(
8197 &mut self,
8198 ) -> Result<WildcardAdditionalOptions, ParserError> {
8199 let opt_exclude = if dialect_of!(self is GenericDialect | DuckDbDialect | SnowflakeDialect)
8200 {
8201 self.parse_optional_select_item_exclude()?
8202 } else {
8203 None
8204 };
8205 let opt_except = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect)
8206 {
8207 self.parse_optional_select_item_except()?
8208 } else {
8209 None
8210 };
8211 let opt_rename = if dialect_of!(self is GenericDialect | SnowflakeDialect) {
8212 self.parse_optional_select_item_rename()?
8213 } else {
8214 None
8215 };
8216
8217 let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect)
8218 {
8219 self.parse_optional_select_item_replace()?
8220 } else {
8221 None
8222 };
8223
8224 Ok(WildcardAdditionalOptions {
8225 opt_exclude,
8226 opt_except,
8227 opt_rename,
8228 opt_replace,
8229 })
8230 }
8231
8232 pub fn parse_optional_select_item_exclude(
8236 &mut self,
8237 ) -> Result<Option<ExcludeSelectItem>, ParserError> {
8238 let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
8239 if self.consume_token(&Token::LParen) {
8240 let columns =
8241 self.parse_comma_separated(|parser| parser.parse_identifier(false))?;
8242 self.expect_token(&Token::RParen)?;
8243 Some(ExcludeSelectItem::Multiple(columns))
8244 } else {
8245 let column = self.parse_identifier(false)?;
8246 Some(ExcludeSelectItem::Single(column))
8247 }
8248 } else {
8249 None
8250 };
8251
8252 Ok(opt_exclude)
8253 }
8254
8255 pub fn parse_optional_select_item_except(
8259 &mut self,
8260 ) -> Result<Option<ExceptSelectItem>, ParserError> {
8261 let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
8262 if self.peek_token().token == Token::LParen {
8263 let idents = self.parse_parenthesized_column_list(Mandatory, false)?;
8264 match &idents[..] {
8265 [] => {
8266 return self.expected(
8267 "at least one column should be parsed by the expect clause",
8268 self.peek_token(),
8269 )?;
8270 }
8271 [first, idents @ ..] => Some(ExceptSelectItem {
8272 first_element: first.clone(),
8273 additional_elements: idents.to_vec(),
8274 }),
8275 }
8276 } else {
8277 let ident = self.parse_identifier(false)?;
8279 Some(ExceptSelectItem {
8280 first_element: ident,
8281 additional_elements: vec![],
8282 })
8283 }
8284 } else {
8285 None
8286 };
8287
8288 Ok(opt_except)
8289 }
8290
8291 pub fn parse_optional_select_item_rename(
8293 &mut self,
8294 ) -> Result<Option<RenameSelectItem>, ParserError> {
8295 let opt_rename = if self.parse_keyword(Keyword::RENAME) {
8296 if self.consume_token(&Token::LParen) {
8297 let idents =
8298 self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
8299 self.expect_token(&Token::RParen)?;
8300 Some(RenameSelectItem::Multiple(idents))
8301 } else {
8302 let ident = self.parse_identifier_with_alias()?;
8303 Some(RenameSelectItem::Single(ident))
8304 }
8305 } else {
8306 None
8307 };
8308
8309 Ok(opt_rename)
8310 }
8311
8312 pub fn parse_optional_select_item_replace(
8314 &mut self,
8315 ) -> Result<Option<ReplaceSelectItem>, ParserError> {
8316 let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
8317 if self.consume_token(&Token::LParen) {
8318 let items = self.parse_comma_separated(|parser| {
8319 Ok(Box::new(parser.parse_replace_elements()?))
8320 })?;
8321 self.expect_token(&Token::RParen)?;
8322 Some(ReplaceSelectItem { items })
8323 } else {
8324 let tok = self.next_token();
8325 return self.expected("( after REPLACE but", tok);
8326 }
8327 } else {
8328 None
8329 };
8330
8331 Ok(opt_replace)
8332 }
8333 pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
8334 let expr = self.parse_expr()?;
8335 let as_keyword = self.parse_keyword(Keyword::AS);
8336 let ident = self.parse_identifier(false)?;
8337 Ok(ReplaceSelectElement {
8338 expr,
8339 column_name: ident,
8340 as_keyword,
8341 })
8342 }
8343
8344 pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
8346 let expr = self.parse_expr()?;
8347
8348 let asc = if self.parse_keyword(Keyword::ASC) {
8349 Some(true)
8350 } else if self.parse_keyword(Keyword::DESC) {
8351 Some(false)
8352 } else {
8353 None
8354 };
8355
8356 let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
8357 Some(true)
8358 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
8359 Some(false)
8360 } else {
8361 None
8362 };
8363
8364 Ok(OrderByExpr {
8365 expr,
8366 asc,
8367 nulls_first,
8368 })
8369 }
8370
8371 pub fn parse_top(&mut self) -> Result<Top, ParserError> {
8374 let quantity = if self.consume_token(&Token::LParen) {
8375 let quantity = self.parse_expr()?;
8376 self.expect_token(&Token::RParen)?;
8377 Some(TopQuantity::Expr(quantity))
8378 } else {
8379 let next_token = self.next_token();
8380 let quantity = match next_token.token {
8381 Token::Number(s, _) => s.parse::<u64>().expect("literal int"),
8382 _ => self.expected("literal int", next_token)?,
8383 };
8384 Some(TopQuantity::Constant(quantity))
8385 };
8386
8387 let percent = self.parse_keyword(Keyword::PERCENT);
8388
8389 let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
8390
8391 Ok(Top {
8392 with_ties,
8393 percent,
8394 quantity,
8395 })
8396 }
8397
8398 pub fn parse_limit(&mut self) -> Result<Option<Expr>, ParserError> {
8400 if self.parse_keyword(Keyword::ALL) {
8401 Ok(None)
8402 } else {
8403 Ok(Some(self.parse_expr()?))
8404 }
8405 }
8406
8407 pub fn parse_offset(&mut self) -> Result<Offset, ParserError> {
8409 let value = self.parse_expr()?;
8410 let rows = if self.parse_keyword(Keyword::ROW) {
8411 OffsetRows::Row
8412 } else if self.parse_keyword(Keyword::ROWS) {
8413 OffsetRows::Rows
8414 } else {
8415 OffsetRows::None
8416 };
8417 Ok(Offset { value, rows })
8418 }
8419
8420 pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
8422 self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
8423 let (quantity, percent) = if self
8424 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
8425 .is_some()
8426 {
8427 (None, false)
8428 } else {
8429 let quantity = Expr::Value(self.parse_value()?);
8430 let percent = self.parse_keyword(Keyword::PERCENT);
8431 self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
8432 (Some(quantity), percent)
8433 };
8434 let with_ties = if self.parse_keyword(Keyword::ONLY) {
8435 false
8436 } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
8437 true
8438 } else {
8439 return self.expected("one of ONLY or WITH TIES", self.peek_token());
8440 };
8441 Ok(Fetch {
8442 with_ties,
8443 percent,
8444 quantity,
8445 })
8446 }
8447
8448 pub fn parse_lock(&mut self) -> Result<LockClause, ParserError> {
8450 let lock_type = match self.expect_one_of_keywords(&[Keyword::UPDATE, Keyword::SHARE])? {
8451 Keyword::UPDATE => LockType::Update,
8452 Keyword::SHARE => LockType::Share,
8453 _ => unreachable!(),
8454 };
8455 let of = if self.parse_keyword(Keyword::OF) {
8456 Some(self.parse_object_name(false)?)
8457 } else {
8458 None
8459 };
8460 let nonblock = if self.parse_keyword(Keyword::NOWAIT) {
8461 Some(NonBlock::Nowait)
8462 } else if self.parse_keywords(&[Keyword::SKIP, Keyword::LOCKED]) {
8463 Some(NonBlock::SkipLocked)
8464 } else {
8465 None
8466 };
8467 Ok(LockClause {
8468 lock_type,
8469 of,
8470 nonblock,
8471 })
8472 }
8473
8474 pub fn parse_values(&mut self, allow_empty: bool) -> Result<Values, ParserError> {
8475 let mut explicit_row = false;
8476
8477 let rows = self.parse_comma_separated(|parser| {
8478 if parser.parse_keyword(Keyword::ROW) {
8479 explicit_row = true;
8480 }
8481
8482 parser.expect_token(&Token::LParen)?;
8483 if allow_empty && parser.peek_token().token == Token::RParen {
8484 parser.next_token();
8485 Ok(vec![])
8486 } else {
8487 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8488 parser.expect_token(&Token::RParen)?;
8489 Ok(exprs)
8490 }
8491 })?;
8492 Ok(Values { explicit_row, rows })
8493 }
8494
8495 pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
8496 self.expect_keyword(Keyword::TRANSACTION)?;
8497 Ok(Statement::StartTransaction {
8498 modes: self.parse_transaction_modes()?,
8499 begin: false,
8500 modifier: None,
8501 })
8502 }
8503
8504 pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
8505 let modifier = if !self.dialect.supports_start_transaction_modifier() {
8506 None
8507 } else if self.parse_keyword(Keyword::DEFERRED) {
8508 Some(TransactionModifier::Deferred)
8509 } else if self.parse_keyword(Keyword::IMMEDIATE) {
8510 Some(TransactionModifier::Immediate)
8511 } else if self.parse_keyword(Keyword::EXCLUSIVE) {
8512 Some(TransactionModifier::Exclusive)
8513 } else {
8514 None
8515 };
8516 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
8517 Ok(Statement::StartTransaction {
8518 modes: self.parse_transaction_modes()?,
8519 begin: true,
8520 modifier,
8521 })
8522 }
8523
8524 pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
8525 Ok(Statement::Commit {
8526 chain: self.parse_commit_rollback_chain()?,
8527 })
8528 }
8529
8530 pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
8531 let mut modes = vec![];
8532 let mut required = false;
8533 loop {
8534 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
8535 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
8536 TransactionIsolationLevel::ReadUncommitted
8537 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
8538 TransactionIsolationLevel::ReadCommitted
8539 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
8540 TransactionIsolationLevel::RepeatableRead
8541 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
8542 TransactionIsolationLevel::Serializable
8543 } else {
8544 self.expected("isolation level", self.peek_token())?
8545 };
8546 TransactionMode::IsolationLevel(iso_level)
8547 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
8548 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8549 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
8550 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8551 } else if required {
8552 self.expected("transaction mode", self.peek_token())?
8553 } else {
8554 break;
8555 };
8556 modes.push(mode);
8557 required = self.consume_token(&Token::Comma);
8562 }
8563 Ok(modes)
8564 }
8565
8566 pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
8567 Ok(Statement::Commit {
8568 chain: self.parse_commit_rollback_chain()?,
8569 })
8570 }
8571
8572 pub fn parse_rollback(&mut self) -> Result<Statement, ParserError> {
8573 let chain = self.parse_commit_rollback_chain()?;
8574 let savepoint = self.parse_rollback_savepoint()?;
8575
8576 Ok(Statement::Rollback { chain, savepoint })
8577 }
8578
8579 pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8580 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
8581 if self.parse_keyword(Keyword::AND) {
8582 let chain = !self.parse_keyword(Keyword::NO);
8583 self.expect_keyword(Keyword::CHAIN)?;
8584 Ok(chain)
8585 } else {
8586 Ok(false)
8587 }
8588 }
8589
8590 pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
8591 if self.parse_keyword(Keyword::TO) {
8592 let _ = self.parse_keyword(Keyword::SAVEPOINT);
8593 let savepoint = self.parse_identifier(false)?;
8594
8595 Ok(Some(savepoint))
8596 } else {
8597 Ok(None)
8598 }
8599 }
8600
8601 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
8602 let prepare = self.parse_keyword(Keyword::PREPARE);
8603 let name = self.parse_identifier(false)?;
8604 Ok(Statement::Deallocate { name, prepare })
8605 }
8606
8607 pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
8608 let name = self.parse_identifier(false)?;
8609
8610 let mut parameters = vec![];
8611 if self.consume_token(&Token::LParen) {
8612 parameters = self.parse_comma_separated(Parser::parse_expr)?;
8613 self.expect_token(&Token::RParen)?;
8614 }
8615
8616 Ok(Statement::Execute { name, parameters })
8617 }
8618
8619 pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
8620 let name = self.parse_identifier(false)?;
8621
8622 let mut data_types = vec![];
8623 if self.consume_token(&Token::LParen) {
8624 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
8625 self.expect_token(&Token::RParen)?;
8626 }
8627
8628 self.expect_keyword(Keyword::AS)?;
8629 let statement = Box::new(self.parse_statement()?);
8630 Ok(Statement::Prepare {
8631 name,
8632 data_types,
8633 statement,
8634 })
8635 }
8636
8637 pub fn parse_merge_clauses(&mut self) -> Result<Vec<MergeClause>, ParserError> {
8638 let mut clauses: Vec<MergeClause> = vec![];
8639 loop {
8640 if self.peek_token() == Token::EOF || self.peek_token() == Token::SemiColon {
8641 break;
8642 }
8643 self.expect_keyword(Keyword::WHEN)?;
8644
8645 let is_not_matched = self.parse_keyword(Keyword::NOT);
8646 self.expect_keyword(Keyword::MATCHED)?;
8647
8648 let predicate = if self.parse_keyword(Keyword::AND) {
8649 Some(self.parse_expr()?)
8650 } else {
8651 None
8652 };
8653
8654 self.expect_keyword(Keyword::THEN)?;
8655
8656 clauses.push(
8657 match self.parse_one_of_keywords(&[
8658 Keyword::UPDATE,
8659 Keyword::INSERT,
8660 Keyword::DELETE,
8661 ]) {
8662 Some(Keyword::UPDATE) => {
8663 if is_not_matched {
8664 return Err(ParserError::ParserError(
8665 "UPDATE in NOT MATCHED merge clause".to_string(),
8666 ));
8667 }
8668 self.expect_keyword(Keyword::SET)?;
8669 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8670 MergeClause::MatchedUpdate {
8671 predicate,
8672 assignments,
8673 }
8674 }
8675 Some(Keyword::DELETE) => {
8676 if is_not_matched {
8677 return Err(ParserError::ParserError(
8678 "DELETE in NOT MATCHED merge clause".to_string(),
8679 ));
8680 }
8681 MergeClause::MatchedDelete(predicate)
8682 }
8683 Some(Keyword::INSERT) => {
8684 if !is_not_matched {
8685 return Err(ParserError::ParserError(
8686 "INSERT in MATCHED merge clause".to_string(),
8687 ));
8688 }
8689 let is_mysql = dialect_of!(self is MySqlDialect);
8690 let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
8691 self.expect_keyword(Keyword::VALUES)?;
8692 let values = self.parse_values(is_mysql)?;
8693 MergeClause::NotMatched {
8694 predicate,
8695 columns,
8696 values,
8697 }
8698 }
8699 Some(_) => {
8700 return Err(ParserError::ParserError(
8701 "expected UPDATE, DELETE or INSERT in merge clause".to_string(),
8702 ));
8703 }
8704 None => {
8705 return Err(ParserError::ParserError(
8706 "expected UPDATE, DELETE or INSERT in merge clause".to_string(),
8707 ));
8708 }
8709 },
8710 );
8711 }
8712 Ok(clauses)
8713 }
8714
8715 pub fn parse_merge(&mut self) -> Result<Statement, ParserError> {
8716 let into = self.parse_keyword(Keyword::INTO);
8717
8718 let table = self.parse_table_factor()?;
8719
8720 self.expect_keyword(Keyword::USING)?;
8721 let source = self.parse_table_factor()?;
8722 self.expect_keyword(Keyword::ON)?;
8723 let on = self.parse_expr()?;
8724 let clauses = self.parse_merge_clauses()?;
8725
8726 Ok(Statement::Merge {
8727 into,
8728 table,
8729 source,
8730 on: Box::new(on),
8731 clauses,
8732 })
8733 }
8734
8735 fn parse_pragma_value(&mut self) -> Result<Value, ParserError> {
8736 match self.parse_value()? {
8737 v @ Value::SingleQuotedString(_) => Ok(v),
8738 v @ Value::DoubleQuotedString(_) => Ok(v),
8739 v @ Value::Number(_, _) => Ok(v),
8740 v @ Value::Placeholder(_) => Ok(v),
8741 _ => {
8742 self.prev_token();
8743 self.expected("number or string or ? placeholder", self.peek_token())
8744 }
8745 }
8746 }
8747
8748 pub fn parse_pragma(&mut self) -> Result<Statement, ParserError> {
8750 let name = self.parse_object_name(false)?;
8751 if self.consume_token(&Token::LParen) {
8752 let value = self.parse_pragma_value()?;
8753 self.expect_token(&Token::RParen)?;
8754 Ok(Statement::Pragma {
8755 name,
8756 value: Some(value),
8757 is_eq: false,
8758 })
8759 } else if self.consume_token(&Token::Eq) {
8760 Ok(Statement::Pragma {
8761 name,
8762 value: Some(self.parse_pragma_value()?),
8763 is_eq: true,
8764 })
8765 } else {
8766 Ok(Statement::Pragma {
8767 name,
8768 value: None,
8769 is_eq: false,
8770 })
8771 }
8772 }
8773
8774 pub fn parse_create_sequence(&mut self, temporary: bool) -> Result<Statement, ParserError> {
8780 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
8782 let name = self.parse_object_name(false)?;
8784 let mut data_type: Option<DataType> = None;
8786 if self.parse_keywords(&[Keyword::AS]) {
8787 data_type = Some(self.parse_data_type()?)
8788 }
8789 let sequence_options = self.parse_create_sequence_options()?;
8790 let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
8792 if self.parse_keywords(&[Keyword::NONE]) {
8793 Some(ObjectName(vec![Ident::new("NONE")]))
8794 } else {
8795 Some(self.parse_object_name(false)?)
8796 }
8797 } else {
8798 None
8799 };
8800 Ok(Statement::CreateSequence {
8801 temporary,
8802 if_not_exists,
8803 name,
8804 data_type,
8805 sequence_options,
8806 owned_by,
8807 })
8808 }
8809
8810 fn parse_create_sequence_options(&mut self) -> Result<Vec<SequenceOptions>, ParserError> {
8811 let mut sequence_options = vec![];
8812 if self.parse_keywords(&[Keyword::INCREMENT]) {
8814 if self.parse_keywords(&[Keyword::BY]) {
8815 sequence_options.push(SequenceOptions::IncrementBy(
8816 Expr::Value(self.parse_number_value()?),
8817 true,
8818 ));
8819 } else {
8820 sequence_options.push(SequenceOptions::IncrementBy(
8821 Expr::Value(self.parse_number_value()?),
8822 false,
8823 ));
8824 }
8825 }
8826 if self.parse_keyword(Keyword::MINVALUE) {
8828 sequence_options.push(SequenceOptions::MinValue(Some(Expr::Value(
8829 self.parse_number_value()?,
8830 ))));
8831 } else if self.parse_keywords(&[Keyword::NO, Keyword::MINVALUE]) {
8832 sequence_options.push(SequenceOptions::MinValue(None));
8833 }
8834 if self.parse_keywords(&[Keyword::MAXVALUE]) {
8836 sequence_options.push(SequenceOptions::MaxValue(Some(Expr::Value(
8837 self.parse_number_value()?,
8838 ))));
8839 } else if self.parse_keywords(&[Keyword::NO, Keyword::MAXVALUE]) {
8840 sequence_options.push(SequenceOptions::MaxValue(None));
8841 }
8842
8843 if self.parse_keywords(&[Keyword::START]) {
8845 if self.parse_keywords(&[Keyword::WITH]) {
8846 sequence_options.push(SequenceOptions::StartWith(
8847 Expr::Value(self.parse_number_value()?),
8848 true,
8849 ));
8850 } else {
8851 sequence_options.push(SequenceOptions::StartWith(
8852 Expr::Value(self.parse_number_value()?),
8853 false,
8854 ));
8855 }
8856 }
8857 if self.parse_keywords(&[Keyword::CACHE]) {
8859 sequence_options.push(SequenceOptions::Cache(Expr::Value(
8860 self.parse_number_value()?,
8861 )));
8862 }
8863 if self.parse_keywords(&[Keyword::NO, Keyword::CYCLE]) {
8865 sequence_options.push(SequenceOptions::Cycle(true));
8866 } else if self.parse_keywords(&[Keyword::CYCLE]) {
8867 sequence_options.push(SequenceOptions::Cycle(false));
8868 }
8869
8870 Ok(sequence_options)
8871 }
8872
8873 pub fn index(&self) -> usize {
8875 self.index
8876 }
8877
8878 pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
8879 let ident = self.parse_identifier(false)?;
8880 self.expect_keyword(Keyword::AS)?;
8881 self.expect_token(&Token::LParen)?;
8882 let window_spec = self.parse_window_spec()?;
8883 Ok(NamedWindowDefinition(ident, window_spec))
8884 }
8885
8886 pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
8887 let name = self.parse_object_name(false)?;
8888 let params = self.parse_optional_procedure_parameters()?;
8889 self.expect_keyword(Keyword::AS)?;
8890 self.expect_keyword(Keyword::BEGIN)?;
8891 let statements = self.parse_statements()?;
8892 self.expect_keyword(Keyword::END)?;
8893 Ok(Statement::CreateProcedure {
8894 name,
8895 or_alter,
8896 params,
8897 body: statements,
8898 })
8899 }
8900
8901 pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
8902 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
8903 self.parse_comma_separated(Parser::parse_expr)?
8904 } else {
8905 vec![]
8906 };
8907 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
8908 self.parse_comma_separated(Parser::parse_order_by_expr)?
8909 } else {
8910 vec![]
8911 };
8912 let window_frame = if !self.consume_token(&Token::RParen) {
8913 let window_frame = self.parse_window_frame()?;
8914 self.expect_token(&Token::RParen)?;
8915 Some(window_frame)
8916 } else {
8917 None
8918 };
8919 Ok(WindowSpec {
8920 partition_by,
8921 order_by,
8922 window_frame,
8923 })
8924 }
8925
8926 pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
8927 let name = self.parse_object_name(false)?;
8928 self.expect_keyword(Keyword::AS)?;
8929
8930 let mut attributes = vec![];
8931 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
8932 return Ok(Statement::CreateType {
8933 name,
8934 representation: UserDefinedTypeRepresentation::Composite { attributes },
8935 });
8936 }
8937
8938 loop {
8939 let attr_name = self.parse_identifier(false)?;
8940 let attr_data_type = self.parse_data_type()?;
8941 let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
8942 Some(self.parse_object_name(false)?)
8943 } else {
8944 None
8945 };
8946 attributes.push(UserDefinedTypeCompositeAttributeDef {
8947 name: attr_name,
8948 data_type: attr_data_type,
8949 collation: attr_collation,
8950 });
8951 let comma = self.consume_token(&Token::Comma);
8952 if self.consume_token(&Token::RParen) {
8953 break;
8955 } else if !comma {
8956 return self.expected("',' or ')' after attribute definition", self.peek_token());
8957 }
8958 }
8959
8960 Ok(Statement::CreateType {
8961 name,
8962 representation: UserDefinedTypeRepresentation::Composite { attributes },
8963 })
8964 }
8965
8966 fn parse_partitions(&mut self) -> Result<Vec<Ident>, ParserError> {
8967 self.expect_token(&Token::LParen)?;
8968 let partitions = self.parse_comma_separated(|p| p.parse_identifier(false))?;
8969 self.expect_token(&Token::RParen)?;
8970 Ok(partitions)
8971 }
8972
8973 pub fn into_tokens(self) -> Vec<TokenWithLocation> {
8975 self.tokens
8976 }
8977}
8978
8979impl Word {
8980 pub fn to_ident(&self) -> Ident {
8981 Ident {
8982 value: self.value.clone(),
8983 quote_style: self.quote_style,
8984 }
8985 }
8986}
8987
8988#[cfg(test)]
8989mod tests {
8990 use crate::test_utils::{all_dialects, TestedDialects};
8991
8992 use super::*;
8993
8994 #[test]
8995 fn test_prev_index() {
8996 let sql = "SELECT version";
8997 all_dialects().run_parser_method(sql, |parser| {
8998 assert_eq!(parser.peek_token(), Token::make_keyword("SELECT"));
8999 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
9000 parser.prev_token();
9001 assert_eq!(parser.next_token(), Token::make_keyword("SELECT"));
9002 assert_eq!(parser.next_token(), Token::make_word("version", None));
9003 parser.prev_token();
9004 assert_eq!(parser.peek_token(), Token::make_word("version", None));
9005 assert_eq!(parser.next_token(), Token::make_word("version", None));
9006 assert_eq!(parser.peek_token(), Token::EOF);
9007 parser.prev_token();
9008 assert_eq!(parser.next_token(), Token::make_word("version", None));
9009 assert_eq!(parser.next_token(), Token::EOF);
9010 assert_eq!(parser.next_token(), Token::EOF);
9011 parser.prev_token();
9012 });
9013 }
9014
9015 #[cfg(test)]
9016 mod test_parse_data_type {
9017 use crate::ast::{
9018 CharLengthUnits, CharacterLength, DataType, ExactNumberInfo, ObjectName, TimezoneInfo,
9019 };
9020 use crate::dialect::{AnsiDialect, GenericDialect};
9021 use crate::test_utils::TestedDialects;
9022
9023 macro_rules! test_parse_data_type {
9024 ($dialect:expr, $input:expr, $expected_type:expr $(,)?) => {{
9025 $dialect.run_parser_method(&*$input, |parser| {
9026 let data_type = parser.parse_data_type().unwrap();
9027 assert_eq!($expected_type, data_type);
9028 assert_eq!($input.to_string(), data_type.to_string());
9029 });
9030 }};
9031 }
9032
9033 #[test]
9034 fn test_ansii_character_string_types() {
9035 let dialect = TestedDialects {
9037 dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9038 options: None,
9039 };
9040
9041 test_parse_data_type!(dialect, "CHARACTER", DataType::Character(None));
9042
9043 test_parse_data_type!(
9044 dialect,
9045 "CHARACTER(20)",
9046 DataType::Character(Some(CharacterLength::IntegerLength {
9047 length: 20,
9048 unit: None
9049 }))
9050 );
9051
9052 test_parse_data_type!(
9053 dialect,
9054 "CHARACTER(20 CHARACTERS)",
9055 DataType::Character(Some(CharacterLength::IntegerLength {
9056 length: 20,
9057 unit: Some(CharLengthUnits::Characters)
9058 }))
9059 );
9060
9061 test_parse_data_type!(
9062 dialect,
9063 "CHARACTER(20 OCTETS)",
9064 DataType::Character(Some(CharacterLength::IntegerLength {
9065 length: 20,
9066 unit: Some(CharLengthUnits::Octets)
9067 }))
9068 );
9069
9070 test_parse_data_type!(dialect, "CHAR", DataType::Char(None));
9071
9072 test_parse_data_type!(
9073 dialect,
9074 "CHAR(20)",
9075 DataType::Char(Some(CharacterLength::IntegerLength {
9076 length: 20,
9077 unit: None
9078 }))
9079 );
9080
9081 test_parse_data_type!(
9082 dialect,
9083 "CHAR(20 CHARACTERS)",
9084 DataType::Char(Some(CharacterLength::IntegerLength {
9085 length: 20,
9086 unit: Some(CharLengthUnits::Characters)
9087 }))
9088 );
9089
9090 test_parse_data_type!(
9091 dialect,
9092 "CHAR(20 OCTETS)",
9093 DataType::Char(Some(CharacterLength::IntegerLength {
9094 length: 20,
9095 unit: Some(CharLengthUnits::Octets)
9096 }))
9097 );
9098
9099 test_parse_data_type!(
9100 dialect,
9101 "CHARACTER VARYING(20)",
9102 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
9103 length: 20,
9104 unit: None
9105 }))
9106 );
9107
9108 test_parse_data_type!(
9109 dialect,
9110 "CHARACTER VARYING(20 CHARACTERS)",
9111 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
9112 length: 20,
9113 unit: Some(CharLengthUnits::Characters)
9114 }))
9115 );
9116
9117 test_parse_data_type!(
9118 dialect,
9119 "CHARACTER VARYING(20 OCTETS)",
9120 DataType::CharacterVarying(Some(CharacterLength::IntegerLength {
9121 length: 20,
9122 unit: Some(CharLengthUnits::Octets)
9123 }))
9124 );
9125
9126 test_parse_data_type!(
9127 dialect,
9128 "CHAR VARYING(20)",
9129 DataType::CharVarying(Some(CharacterLength::IntegerLength {
9130 length: 20,
9131 unit: None
9132 }))
9133 );
9134
9135 test_parse_data_type!(
9136 dialect,
9137 "CHAR VARYING(20 CHARACTERS)",
9138 DataType::CharVarying(Some(CharacterLength::IntegerLength {
9139 length: 20,
9140 unit: Some(CharLengthUnits::Characters)
9141 }))
9142 );
9143
9144 test_parse_data_type!(
9145 dialect,
9146 "CHAR VARYING(20 OCTETS)",
9147 DataType::CharVarying(Some(CharacterLength::IntegerLength {
9148 length: 20,
9149 unit: Some(CharLengthUnits::Octets)
9150 }))
9151 );
9152
9153 test_parse_data_type!(
9154 dialect,
9155 "VARCHAR(20)",
9156 DataType::Varchar(Some(CharacterLength::IntegerLength {
9157 length: 20,
9158 unit: None
9159 }))
9160 );
9161 }
9162
9163 #[test]
9164 fn test_ansii_character_large_object_types() {
9165 let dialect = TestedDialects {
9167 dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9168 options: None,
9169 };
9170
9171 test_parse_data_type!(
9172 dialect,
9173 "CHARACTER LARGE OBJECT",
9174 DataType::CharacterLargeObject(None)
9175 );
9176 test_parse_data_type!(
9177 dialect,
9178 "CHARACTER LARGE OBJECT(20)",
9179 DataType::CharacterLargeObject(Some(20))
9180 );
9181
9182 test_parse_data_type!(
9183 dialect,
9184 "CHAR LARGE OBJECT",
9185 DataType::CharLargeObject(None)
9186 );
9187 test_parse_data_type!(
9188 dialect,
9189 "CHAR LARGE OBJECT(20)",
9190 DataType::CharLargeObject(Some(20))
9191 );
9192
9193 test_parse_data_type!(dialect, "CLOB", DataType::Clob(None));
9194 test_parse_data_type!(dialect, "CLOB(20)", DataType::Clob(Some(20)));
9195 }
9196
9197 #[test]
9198 fn test_parse_custom_types() {
9199 let dialect = TestedDialects {
9200 dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9201 options: None,
9202 };
9203 test_parse_data_type!(
9204 dialect,
9205 "GEOMETRY",
9206 DataType::Custom(ObjectName(vec!["GEOMETRY".into()]), vec![])
9207 );
9208
9209 test_parse_data_type!(
9210 dialect,
9211 "GEOMETRY(POINT)",
9212 DataType::Custom(
9213 ObjectName(vec!["GEOMETRY".into()]),
9214 vec!["POINT".to_string()]
9215 )
9216 );
9217
9218 test_parse_data_type!(
9219 dialect,
9220 "GEOMETRY(POINT, 4326)",
9221 DataType::Custom(
9222 ObjectName(vec!["GEOMETRY".into()]),
9223 vec!["POINT".to_string(), "4326".to_string()]
9224 )
9225 );
9226 }
9227
9228 #[test]
9229 fn test_ansii_exact_numeric_types() {
9230 let dialect = TestedDialects {
9232 dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9233 options: None,
9234 };
9235
9236 test_parse_data_type!(dialect, "NUMERIC", DataType::Numeric(ExactNumberInfo::None));
9237
9238 test_parse_data_type!(
9239 dialect,
9240 "NUMERIC(2)",
9241 DataType::Numeric(ExactNumberInfo::Precision(2))
9242 );
9243
9244 test_parse_data_type!(
9245 dialect,
9246 "NUMERIC(2,10)",
9247 DataType::Numeric(ExactNumberInfo::PrecisionAndScale(2, 10))
9248 );
9249
9250 test_parse_data_type!(dialect, "DECIMAL", DataType::Decimal(ExactNumberInfo::None));
9251
9252 test_parse_data_type!(
9253 dialect,
9254 "DECIMAL(2)",
9255 DataType::Decimal(ExactNumberInfo::Precision(2))
9256 );
9257
9258 test_parse_data_type!(
9259 dialect,
9260 "DECIMAL(2,10)",
9261 DataType::Decimal(ExactNumberInfo::PrecisionAndScale(2, 10))
9262 );
9263
9264 test_parse_data_type!(dialect, "DEC", DataType::Dec(ExactNumberInfo::None));
9265
9266 test_parse_data_type!(
9267 dialect,
9268 "DEC(2)",
9269 DataType::Dec(ExactNumberInfo::Precision(2))
9270 );
9271
9272 test_parse_data_type!(
9273 dialect,
9274 "DEC(2,10)",
9275 DataType::Dec(ExactNumberInfo::PrecisionAndScale(2, 10))
9276 );
9277 }
9278
9279 #[test]
9280 fn test_ansii_date_type() {
9281 let dialect = TestedDialects {
9283 dialects: vec![Box::new(GenericDialect {}), Box::new(AnsiDialect {})],
9284 options: None,
9285 };
9286
9287 test_parse_data_type!(dialect, "DATE", DataType::Date);
9288
9289 test_parse_data_type!(dialect, "TIME", DataType::Time(None, TimezoneInfo::None));
9290
9291 test_parse_data_type!(
9292 dialect,
9293 "TIME(6)",
9294 DataType::Time(Some(6), TimezoneInfo::None)
9295 );
9296
9297 test_parse_data_type!(
9298 dialect,
9299 "TIME WITH TIME ZONE",
9300 DataType::Time(None, TimezoneInfo::WithTimeZone)
9301 );
9302
9303 test_parse_data_type!(
9304 dialect,
9305 "TIME(6) WITH TIME ZONE",
9306 DataType::Time(Some(6), TimezoneInfo::WithTimeZone)
9307 );
9308
9309 test_parse_data_type!(
9310 dialect,
9311 "TIME WITHOUT TIME ZONE",
9312 DataType::Time(None, TimezoneInfo::WithoutTimeZone)
9313 );
9314
9315 test_parse_data_type!(
9316 dialect,
9317 "TIME(6) WITHOUT TIME ZONE",
9318 DataType::Time(Some(6), TimezoneInfo::WithoutTimeZone)
9319 );
9320
9321 test_parse_data_type!(
9322 dialect,
9323 "TIMESTAMP",
9324 DataType::Timestamp(None, TimezoneInfo::None)
9325 );
9326
9327 test_parse_data_type!(
9328 dialect,
9329 "TIMESTAMP(22)",
9330 DataType::Timestamp(Some(22), TimezoneInfo::None)
9331 );
9332
9333 test_parse_data_type!(
9334 dialect,
9335 "TIMESTAMP(22) WITH TIME ZONE",
9336 DataType::Timestamp(Some(22), TimezoneInfo::WithTimeZone)
9337 );
9338
9339 test_parse_data_type!(
9340 dialect,
9341 "TIMESTAMP(33) WITHOUT TIME ZONE",
9342 DataType::Timestamp(Some(33), TimezoneInfo::WithoutTimeZone)
9343 );
9344 }
9345 }
9346
9347 #[test]
9348 fn test_parse_schema_name() {
9349 macro_rules! test_parse_schema_name {
9351 ($input:expr, $expected_name:expr $(,)?) => {{
9352 all_dialects().run_parser_method(&*$input, |parser| {
9353 let schema_name = parser.parse_schema_name().unwrap();
9354 assert_eq!(schema_name, $expected_name);
9356 assert_eq!(schema_name.to_string(), $input.to_string());
9358 });
9359 }};
9360 }
9361
9362 let dummy_name = ObjectName(vec![Ident::new("dummy_name")]);
9363 let dummy_authorization = Ident::new("dummy_authorization");
9364
9365 test_parse_schema_name!(
9366 format!("{dummy_name}"),
9367 SchemaName::Simple(dummy_name.clone())
9368 );
9369
9370 test_parse_schema_name!(
9371 format!("AUTHORIZATION {dummy_authorization}"),
9372 SchemaName::UnnamedAuthorization(dummy_authorization.clone()),
9373 );
9374 test_parse_schema_name!(
9375 format!("{dummy_name} AUTHORIZATION {dummy_authorization}"),
9376 SchemaName::NamedAuthorization(dummy_name.clone(), dummy_authorization.clone()),
9377 );
9378 }
9379
9380 #[test]
9381 fn mysql_parse_index_table_constraint() {
9382 macro_rules! test_parse_table_constraint {
9383 ($dialect:expr, $input:expr, $expected:expr $(,)?) => {{
9384 $dialect.run_parser_method(&*$input, |parser| {
9385 let constraint = parser.parse_optional_table_constraint().unwrap().unwrap();
9386 assert_eq!(constraint, $expected);
9388 assert_eq!(constraint.to_string(), $input.to_string());
9390 });
9391 }};
9392 }
9393
9394 let dialect = TestedDialects {
9395 dialects: vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})],
9396 options: None,
9397 };
9398
9399 test_parse_table_constraint!(
9400 dialect,
9401 "INDEX (c1)",
9402 TableConstraint::Index {
9403 display_as_key: false,
9404 name: None,
9405 index_type: None,
9406 columns: vec![Ident::new("c1")],
9407 }
9408 );
9409
9410 test_parse_table_constraint!(
9411 dialect,
9412 "KEY (c1)",
9413 TableConstraint::Index {
9414 display_as_key: true,
9415 name: None,
9416 index_type: None,
9417 columns: vec![Ident::new("c1")],
9418 }
9419 );
9420
9421 test_parse_table_constraint!(
9422 dialect,
9423 "INDEX 'index' (c1, c2)",
9424 TableConstraint::Index {
9425 display_as_key: false,
9426 name: Some(Ident::with_quote('\'', "index")),
9427 index_type: None,
9428 columns: vec![Ident::new("c1"), Ident::new("c2")],
9429 }
9430 );
9431
9432 test_parse_table_constraint!(
9433 dialect,
9434 "INDEX USING BTREE (c1)",
9435 TableConstraint::Index {
9436 display_as_key: false,
9437 name: None,
9438 index_type: Some(IndexType::BTree),
9439 columns: vec![Ident::new("c1")],
9440 }
9441 );
9442
9443 test_parse_table_constraint!(
9444 dialect,
9445 "INDEX USING HASH (c1)",
9446 TableConstraint::Index {
9447 display_as_key: false,
9448 name: None,
9449 index_type: Some(IndexType::Hash),
9450 columns: vec![Ident::new("c1")],
9451 }
9452 );
9453
9454 test_parse_table_constraint!(
9455 dialect,
9456 "INDEX idx_name USING BTREE (c1)",
9457 TableConstraint::Index {
9458 display_as_key: false,
9459 name: Some(Ident::new("idx_name")),
9460 index_type: Some(IndexType::BTree),
9461 columns: vec![Ident::new("c1")],
9462 }
9463 );
9464
9465 test_parse_table_constraint!(
9466 dialect,
9467 "INDEX idx_name USING HASH (c1)",
9468 TableConstraint::Index {
9469 display_as_key: false,
9470 name: Some(Ident::new("idx_name")),
9471 index_type: Some(IndexType::Hash),
9472 columns: vec![Ident::new("c1")],
9473 }
9474 );
9475 }
9476
9477 #[test]
9478 fn test_tokenizer_error_loc() {
9479 let sql = "foo '";
9480 let ast = Parser::parse_sql(&GenericDialect, sql);
9481 assert_eq!(
9482 ast,
9483 Err(ParserError::TokenizerError(
9484 "Unterminated string literal at Line: 1, Column 5".to_string()
9485 ))
9486 );
9487 }
9488
9489 #[test]
9490 fn test_parser_error_loc() {
9491 let sql = "SELECT this is a syntax error";
9492 let ast = Parser::parse_sql(&GenericDialect, sql);
9493 assert_eq!(
9494 ast,
9495 Err(ParserError::ParserError(
9496 "Expected [NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS, found: a at Line: 1, Column 16"
9497 .to_string()
9498 ))
9499 );
9500 }
9501
9502 #[test]
9503 fn test_nested_explain_error() {
9504 let sql = "EXPLAIN EXPLAIN SELECT 1";
9505 let ast = Parser::parse_sql(&GenericDialect, sql);
9506 assert_eq!(
9507 ast,
9508 Err(ParserError::ParserError(
9509 "Explain must be root of the plan".to_string()
9510 ))
9511 );
9512 }
9513
9514 #[test]
9515 fn test_parse_multipart_identifier_positive() {
9516 let dialect = TestedDialects {
9517 dialects: vec![Box::new(GenericDialect {})],
9518 options: None,
9519 };
9520
9521 let expected = vec![
9523 Ident {
9524 value: "CATALOG".to_string(),
9525 quote_style: None,
9526 },
9527 Ident {
9528 value: "F(o)o. \"bar".to_string(),
9529 quote_style: Some('"'),
9530 },
9531 Ident {
9532 value: "table".to_string(),
9533 quote_style: None,
9534 },
9535 ];
9536 dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
9537 let actual = parser.parse_multipart_identifier().unwrap();
9538 assert_eq!(expected, actual);
9539 });
9540
9541 let expected = vec![
9543 Ident {
9544 value: "CATALOG".to_string(),
9545 quote_style: None,
9546 },
9547 Ident {
9548 value: "table".to_string(),
9549 quote_style: None,
9550 },
9551 ];
9552 dialect.run_parser_method("CATALOG . table", |parser| {
9553 let actual = parser.parse_multipart_identifier().unwrap();
9554 assert_eq!(expected, actual);
9555 });
9556 }
9557
9558 #[test]
9559 fn test_parse_multipart_identifier_negative() {
9560 macro_rules! test_parse_multipart_identifier_error {
9561 ($input:expr, $expected_err:expr $(,)?) => {{
9562 all_dialects().run_parser_method(&*$input, |parser| {
9563 let actual_err = parser.parse_multipart_identifier().unwrap_err();
9564 assert_eq!(actual_err.to_string(), $expected_err);
9565 });
9566 }};
9567 }
9568
9569 test_parse_multipart_identifier_error!(
9570 "",
9571 "sql parser error: Empty input when parsing identifier",
9572 );
9573
9574 test_parse_multipart_identifier_error!(
9575 "*schema.table",
9576 "sql parser error: Unexpected token in identifier: *",
9577 );
9578
9579 test_parse_multipart_identifier_error!(
9580 "schema.table*",
9581 "sql parser error: Unexpected token in identifier: *",
9582 );
9583
9584 test_parse_multipart_identifier_error!(
9585 "schema.table.",
9586 "sql parser error: Trailing period in identifier",
9587 );
9588
9589 test_parse_multipart_identifier_error!(
9590 "schema.*",
9591 "sql parser error: Unexpected token following period in identifier: *",
9592 );
9593 }
9594
9595 #[test]
9596 fn test_mysql_partition_selection() {
9597 let sql = "SELECT * FROM employees PARTITION (p0, p2)";
9598 let expected = vec!["p0", "p2"];
9599
9600 let ast: Vec<Statement> = Parser::parse_sql(&MySqlDialect {}, sql).unwrap();
9601 assert_eq!(ast.len(), 1);
9602 if let Statement::Query(v) = &ast[0] {
9603 if let SetExpr::Select(select) = &*v.body {
9604 assert_eq!(select.from.len(), 1);
9605 let from: &TableWithJoins = &select.from[0];
9606 let table_factor = &from.relation;
9607 if let TableFactor::Table { partitions, .. } = table_factor {
9608 let actual: Vec<&str> = partitions
9609 .iter()
9610 .map(|ident| ident.value.as_str())
9611 .collect();
9612 assert_eq!(expected, actual);
9613 }
9614 }
9615 } else {
9616 panic!("fail to parse mysql partition selection");
9617 }
9618 }
9619}