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 ddl::WebhookSourceInfo;
26use itertools::Itertools;
27use tracing::{debug, instrument};
28use winnow::combinator::{
29 alt, cut_err, dispatch, fail, opt, peek, preceded, repeat, separated, separated_pair,
30};
31use winnow::{ModalResult, Parser as _};
32
33use crate::ast::*;
34use crate::keywords::{self, Keyword};
35use crate::parser_v2::{
36 ParserExt as _, dollar_quoted_string, keyword, literal_i64, literal_uint, single_quoted_string,
37 token_number,
38};
39use crate::tokenizer::*;
40use crate::{impl_parse_to, parser_v2};
41
42pub(crate) const UPSTREAM_SOURCE_KEY: &str = "connector";
43pub(crate) const WEBHOOK_CONNECTOR: &str = "webhook";
44
45const WEBHOOK_WAIT_FOR_PERSISTENCE: &str = "webhook.wait_for_persistence";
46
47#[derive(Debug, Clone, PartialEq)]
48pub enum ParserError {
49 TokenizerError(String),
50 ParserError(String),
51}
52
53impl ParserError {
54 pub fn inner_msg(self) -> String {
55 match self {
56 ParserError::TokenizerError(s) | ParserError::ParserError(s) => s,
57 }
58 }
59}
60
61#[derive(Debug, thiserror::Error)]
62#[error("{0}")]
63pub struct StrError(pub String);
64
65#[macro_export]
67macro_rules! parser_err {
68 ($($arg:tt)*) => {
69 return Err(winnow::error::ErrMode::Backtrack(<winnow::error::ContextError as winnow::error::FromExternalError<_, _>>::from_external_error(
70 &Parser::default(),
71 $crate::parser::StrError(format!($($arg)*)),
72 )))
73 };
74}
75
76impl From<StrError> for winnow::error::ErrMode<winnow::error::ContextError> {
77 fn from(e: StrError) -> Self {
78 winnow::error::ErrMode::Backtrack(<winnow::error::ContextError as winnow::error::FromExternalError<_, _>>::from_external_error(
79 &Parser::default(),
80 e,
81 ))
82 }
83}
84
85macro_rules! return_ok_if_some {
87 ($e:expr) => {{
88 if let Some(v) = $e {
89 return Ok(v);
90 }
91 }};
92}
93
94#[derive(PartialEq)]
95pub enum IsOptional {
96 Optional,
97 Mandatory,
98}
99
100use IsOptional::*;
101
102pub enum IsLateral {
103 Lateral,
104 NotLateral,
105}
106
107use IsLateral::*;
108
109use crate::ast::ddl::AlterFragmentOperation;
110
111pub type IncludeOption = Vec<IncludeOptionItem>;
112
113#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
114#[derive(Eq, Clone, Debug, PartialEq, Hash)]
115pub struct IncludeOptionItem {
116 pub column_type: Ident,
117 pub column_alias: Option<Ident>,
118 pub inner_field: Option<String>,
119 pub header_inner_expect_type: Option<DataType>,
120}
121
122#[derive(Debug)]
123pub enum WildcardOrExpr {
124 Expr(Expr),
125 ExprQualifiedWildcard(Expr, Vec<Ident>),
131 QualifiedWildcard(ObjectName, Option<Vec<Expr>>),
133 Wildcard(Option<Vec<Expr>>),
134}
135
136impl From<WildcardOrExpr> for FunctionArgExpr {
137 fn from(wildcard_expr: WildcardOrExpr) -> Self {
138 match wildcard_expr {
139 WildcardOrExpr::Expr(expr) => Self::Expr(expr),
140 WildcardOrExpr::ExprQualifiedWildcard(expr, prefix) => {
141 Self::ExprQualifiedWildcard(expr, prefix)
142 }
143 WildcardOrExpr::QualifiedWildcard(prefix, except) => {
144 Self::QualifiedWildcard(prefix, except)
145 }
146 WildcardOrExpr::Wildcard(except) => Self::Wildcard(except),
147 }
148 }
149}
150
151impl From<TokenizerError> for ParserError {
152 fn from(e: TokenizerError) -> Self {
153 ParserError::TokenizerError(e.to_string())
154 }
155}
156
157impl fmt::Display for ParserError {
158 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
159 write!(
160 f,
161 "sql parser error: {}",
162 match self {
163 ParserError::TokenizerError(s) => s,
164 ParserError::ParserError(s) => s,
165 }
166 )
167 }
168}
169
170#[cfg(feature = "std")]
171impl std::error::Error for ParserError {}
172
173type ColumnsDefTuple = (
174 Vec<ColumnDef>,
175 Vec<TableConstraint>,
176 Vec<SourceWatermark>,
177 Option<usize>,
178);
179
180#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
183pub enum Precedence {
184 Zero = 0,
185 LogicalOr, LogicalXor,
187 LogicalAnd, UnaryNot, Is, Cmp,
191 Like, Between, Other,
194 PlusMinus, MulDiv, Exp,
197 At,
198 Collate,
199 UnaryPosNeg,
200 PostfixFactorial,
201 Array,
202 DoubleColon, }
204
205#[derive(Clone, Copy, Default)]
206pub struct Parser<'a>(pub(crate) &'a [TokenWithLocation]);
207
208impl Parser<'_> {
209 #[instrument(level = "debug")]
211 pub fn parse_sql(sql: &str) -> Result<Vec<Statement>, ParserError> {
212 let mut tokenizer = Tokenizer::new(sql);
213 let tokens = tokenizer.tokenize_with_location()?;
214 let parser = Parser(&tokens);
215 let stmts = Parser::parse_statements.parse(parser).map_err(|e| {
216 let loc = match tokens.get(e.offset()) {
219 Some(token) => token.location.clone(),
220 None => {
221 Location {
223 line: sql.lines().count() as u64,
224 column: sql.lines().last().map_or(0, |l| l.len() as u64) + 1,
225 }
226 }
227 };
228 let prefix = format!("LINE {}: ", loc.line);
229 let sql_line = sql.split('\n').nth(loc.line as usize - 1).unwrap();
230 let cursor = " ".repeat(prefix.len() + loc.column as usize - 1);
231 ParserError::ParserError(format!(
232 "{}\n{}{}\n{}^",
233 e.inner().to_string().replace('\n', ": "),
234 prefix,
235 sql_line,
236 cursor
237 ))
238 })?;
239 Ok(stmts)
240 }
241
242 pub fn parse_exactly_one(sql: &str) -> Result<Statement, ParserError> {
244 Parser::parse_sql(sql)
245 .map_err(|e| {
246 ParserError::ParserError(format!("failed to parse definition sql: {}", e))
247 })?
248 .into_iter()
249 .exactly_one()
250 .map_err(|e| {
251 ParserError::ParserError(format!(
252 "expecting exactly one statement in definition: {}",
253 e
254 ))
255 })
256 }
257
258 pub fn parse_object_name_str(s: &str) -> Result<ObjectName, ParserError> {
260 let mut tokenizer = Tokenizer::new(s);
261 let tokens = tokenizer.tokenize_with_location()?;
262 let parser = Parser(&tokens);
263 Parser::parse_object_name
264 .parse(parser)
265 .map_err(|e| ParserError::ParserError(e.inner().to_string()))
266 }
267
268 pub fn parse_function_desc_str(func: &str) -> Result<FunctionDesc, ParserError> {
270 let mut tokenizer = Tokenizer::new(func);
271 let tokens = tokenizer.tokenize_with_location()?;
272 let parser = Parser(&tokens);
273 Parser::parse_function_desc
274 .parse(parser)
275 .map_err(|e| ParserError::ParserError(e.inner().to_string()))
276 }
277
278 fn parse_statements(&mut self) -> ModalResult<Vec<Statement>> {
280 let mut stmts = Vec::new();
281 let mut expecting_statement_delimiter = false;
282 loop {
283 while self.consume_token(&Token::SemiColon) {
285 expecting_statement_delimiter = false;
286 }
287
288 if self.peek_token() == Token::EOF {
289 break;
290 }
291 if expecting_statement_delimiter {
292 return self.expected("end of statement");
293 }
294
295 let statement = self.parse_statement()?;
296 stmts.push(statement);
297 expecting_statement_delimiter = true;
298 }
299 debug!("parsed statements:\n{:#?}", stmts);
300 Ok(stmts)
301 }
302
303 pub fn parse_statement(&mut self) -> ModalResult<Statement> {
306 let checkpoint = *self;
307 let token = self.next_token();
308 match token.token {
309 Token::Word(w) => match w.keyword {
310 Keyword::EXPLAIN => Ok(self.parse_explain()?),
311 Keyword::ANALYZE => Ok(self.parse_analyze()?),
312 Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
313 *self = checkpoint;
314 Ok(Statement::Query(Box::new(self.parse_query()?)))
315 }
316 Keyword::DECLARE => Ok(self.parse_declare()?),
317 Keyword::FETCH => Ok(self.parse_fetch_cursor()?),
318 Keyword::CLOSE => Ok(self.parse_close_cursor()?),
319 Keyword::TRUNCATE => Ok(self.parse_truncate()?),
320 Keyword::CREATE => Ok(self.parse_create()?),
321 Keyword::DISCARD => Ok(self.parse_discard()?),
322 Keyword::DROP => Ok(self.parse_drop()?),
323 Keyword::DELETE => Ok(self.parse_delete()?),
324 Keyword::INSERT => Ok(self.parse_insert()?),
325 Keyword::UPDATE => Ok(self.parse_update()?),
326 Keyword::ALTER => Ok(self.parse_alter()?),
327 Keyword::COPY => Ok(self.parse_copy()?),
328 Keyword::SET => Ok(self.parse_set()?),
329 Keyword::SHOW => {
330 if self.parse_keyword(Keyword::CREATE) {
331 Ok(self.parse_show_create()?)
332 } else {
333 Ok(self.parse_show()?)
334 }
335 }
336 Keyword::CANCEL => Ok(self.parse_cancel_job()?),
337 Keyword::KILL => Ok(self.parse_kill_process()?),
338 Keyword::DESCRIBE => Ok(self.parse_describe()?),
339 Keyword::GRANT => Ok(self.parse_grant()?),
340 Keyword::REVOKE => Ok(self.parse_revoke()?),
341 Keyword::START => Ok(self.parse_start_transaction()?),
342 Keyword::ABORT => Ok(Statement::Abort),
343 Keyword::BEGIN => Ok(self.parse_begin()?),
347 Keyword::COMMIT => Ok(self.parse_commit()?),
348 Keyword::ROLLBACK => Ok(self.parse_rollback()?),
349 Keyword::DEALLOCATE => Ok(self.parse_deallocate()?),
352 Keyword::EXECUTE => Ok(self.parse_execute()?),
353 Keyword::PREPARE => Ok(self.parse_prepare()?),
354 Keyword::COMMENT => Ok(self.parse_comment()?),
355 Keyword::FLUSH => Ok(Statement::Flush),
356 Keyword::WAIT => Ok(Statement::Wait),
357 Keyword::RECOVER => Ok(Statement::Recover),
358 Keyword::USE => Ok(self.parse_use()?),
359 _ => self.expected_at(checkpoint, "statement"),
360 },
361 Token::LParen => {
362 *self = checkpoint;
363 Ok(Statement::Query(Box::new(self.parse_query()?)))
364 }
365 _ => self.expected_at(checkpoint, "statement"),
366 }
367 }
368
369 pub fn parse_truncate(&mut self) -> ModalResult<Statement> {
370 let _ = self.parse_keyword(Keyword::TABLE);
371 let table_name = self.parse_object_name()?;
372 Ok(Statement::Truncate { table_name })
373 }
374
375 pub fn parse_analyze(&mut self) -> ModalResult<Statement> {
376 let table_name = self.parse_object_name()?;
377
378 Ok(Statement::Analyze { table_name })
379 }
380
381 pub fn parse_wildcard_or_expr(&mut self) -> ModalResult<WildcardOrExpr> {
390 let checkpoint = *self;
391
392 match self.next_token().token {
393 Token::Word(w) if self.peek_token() == Token::Period => {
394 let wildcard_expr = self.parse_simple_wildcard_expr(checkpoint)?;
397 return self.word_concat_wildcard_expr(w.to_ident()?, wildcard_expr);
398 }
399 Token::Mul => {
400 return Ok(WildcardOrExpr::Wildcard(self.parse_except()?));
401 }
402 Token::LParen => {
405 let mut expr = self.parse_expr()?;
406 if self.consume_token(&Token::RParen) {
407 while let Expr::Nested(inner) = expr {
409 expr = *inner;
410 }
411 let wildcard_expr = self.parse_simple_wildcard_expr(checkpoint)?;
414 return self.expr_concat_wildcard_expr(expr, wildcard_expr);
415 }
416 }
417 _ => (),
418 };
419
420 *self = checkpoint;
421 self.parse_expr().map(WildcardOrExpr::Expr)
422 }
423
424 pub fn word_concat_wildcard_expr(
426 &mut self,
427 ident: Ident,
428 simple_wildcard_expr: WildcardOrExpr,
429 ) -> ModalResult<WildcardOrExpr> {
430 let mut idents = vec![ident];
431 let mut except_cols = vec![];
432 match simple_wildcard_expr {
433 WildcardOrExpr::QualifiedWildcard(ids, except) => {
434 idents.extend(ids.0);
435 if let Some(cols) = except {
436 except_cols = cols;
437 }
438 }
439 WildcardOrExpr::Wildcard(except) => {
440 if let Some(cols) = except {
441 except_cols = cols;
442 }
443 }
444 WildcardOrExpr::ExprQualifiedWildcard(_, _) => unreachable!(),
445 WildcardOrExpr::Expr(e) => return Ok(WildcardOrExpr::Expr(e)),
446 }
447 Ok(WildcardOrExpr::QualifiedWildcard(
448 ObjectName(idents),
449 if except_cols.is_empty() {
450 None
451 } else {
452 Some(except_cols)
453 },
454 ))
455 }
456
457 pub fn expr_concat_wildcard_expr(
459 &mut self,
460 expr: Expr,
461 simple_wildcard_expr: WildcardOrExpr,
462 ) -> ModalResult<WildcardOrExpr> {
463 if let WildcardOrExpr::Expr(e) = simple_wildcard_expr {
464 return Ok(WildcardOrExpr::Expr(e));
465 }
466
467 let mut idents = vec![];
469 let expr = match expr {
470 Expr::Identifier(_) => expr,
472 Expr::CompoundIdentifier(_) => expr,
474 Expr::Cast { .. } => expr,
476 Expr::Function(_) => expr,
478 Expr::FieldIdentifier(expr, ids) => {
480 idents.extend(ids);
482 *expr
483 }
484 _ => return Ok(WildcardOrExpr::Expr(expr)),
487 };
488
489 match simple_wildcard_expr {
490 WildcardOrExpr::QualifiedWildcard(ids, except) => {
491 if except.is_some() {
492 return self.expected("Expr quantified wildcard does not support except");
493 }
494 idents.extend(ids.0);
495 }
496 WildcardOrExpr::Wildcard(except) => {
497 if except.is_some() {
498 return self.expected("Expr quantified wildcard does not support except");
499 }
500 }
501 WildcardOrExpr::ExprQualifiedWildcard(_, _) => unreachable!(),
502 WildcardOrExpr::Expr(_) => unreachable!(),
503 }
504 Ok(WildcardOrExpr::ExprQualifiedWildcard(expr, idents))
505 }
506
507 pub fn parse_simple_wildcard_expr(&mut self, checkpoint: Self) -> ModalResult<WildcardOrExpr> {
511 let mut id_parts = vec![];
512 while self.consume_token(&Token::Period) {
513 let ckpt = *self;
514 let token = self.next_token();
515 match token.token {
516 Token::Word(w) => id_parts.push(w.to_ident()?),
517 Token::Mul => {
518 return if id_parts.is_empty() {
519 Ok(WildcardOrExpr::Wildcard(self.parse_except()?))
520 } else {
521 Ok(WildcardOrExpr::QualifiedWildcard(
522 ObjectName(id_parts),
523 self.parse_except()?,
524 ))
525 };
526 }
527 _ => {
528 *self = ckpt;
529 return self.expected("an identifier or a '*' after '.'");
530 }
531 }
532 }
533 *self = checkpoint;
534 self.parse_expr().map(WildcardOrExpr::Expr)
535 }
536
537 pub fn parse_except(&mut self) -> ModalResult<Option<Vec<Expr>>> {
538 if !self.parse_keyword(Keyword::EXCEPT) {
539 return Ok(None);
540 }
541 if !self.consume_token(&Token::LParen) {
542 return self.expected("EXCEPT should be followed by (");
543 }
544 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
545 if self.consume_token(&Token::RParen) {
546 Ok(Some(exprs))
547 } else {
548 self.expected("( should be followed by ) after column names")
549 }
550 }
551
552 pub fn parse_expr(&mut self) -> ModalResult<Expr> {
554 self.parse_subexpr(Precedence::Zero)
555 }
556
557 pub fn parse_subexpr(&mut self, precedence: Precedence) -> ModalResult<Expr> {
559 debug!("parsing expr, current token: {:?}", self.peek_token().token);
560 let mut expr = self.parse_prefix()?;
561 debug!("prefix: {:?}", expr);
562 loop {
563 let next_precedence = self.get_next_precedence()?;
564 debug!("precedence: {precedence:?}, next precedence: {next_precedence:?}");
565
566 if precedence >= next_precedence {
567 break;
568 }
569
570 expr = self.parse_infix(expr, next_precedence)?;
571 }
572 Ok(expr)
573 }
574
575 pub fn parse_prefix(&mut self) -> ModalResult<Expr> {
577 return_ok_if_some!(self.maybe_parse(|parser| {
594 match parser.parse_data_type()? {
595 DataType::Interval => parser.parse_literal_interval(),
596 DataType::Custom(..) => parser_err!("dummy"),
604 data_type => Ok(Expr::TypedString {
605 data_type,
606 value: parser.parse_literal_string()?,
607 }),
608 }
609 }));
610
611 let checkpoint = *self;
612 let token = self.next_token();
613 let expr = match token.token.clone() {
614 Token::Word(w) => match w.keyword {
615 Keyword::TRUE | Keyword::FALSE | Keyword::NULL => {
616 *self = checkpoint;
617 Ok(Expr::Value(self.ensure_parse_value()?))
618 }
619 Keyword::CASE => self.parse_case_expr(),
620 Keyword::CAST => self.parse_cast_expr(),
621 Keyword::TRY_CAST => self.parse_try_cast_expr(),
622 Keyword::EXISTS => self.parse_exists_expr(),
623 Keyword::EXTRACT => self.parse_extract_expr(),
624 Keyword::SUBSTRING => self.parse_substring_expr(),
625 Keyword::POSITION => self.parse_position_expr(),
626 Keyword::OVERLAY => self.parse_overlay_expr(),
627 Keyword::TRIM => self.parse_trim_expr(),
628 Keyword::INTERVAL => self.parse_literal_interval(),
629 Keyword::NOT => Ok(Expr::UnaryOp {
630 op: UnaryOperator::Not,
631 expr: Box::new(self.parse_subexpr(Precedence::UnaryNot)?),
632 }),
633 Keyword::ROW => self.parse_row_expr(),
634 Keyword::ARRAY if self.peek_token() == Token::LParen => {
635 self.expect_token(&Token::LParen)?;
637 let exists_node = Expr::ArraySubquery(Box::new(self.parse_query()?));
638 self.expect_token(&Token::RParen)?;
639 Ok(exists_node)
640 }
641 Keyword::ARRAY if self.peek_token() == Token::LBracket => self.parse_array_expr(),
642 Keyword::MAP if self.peek_token() == Token::LBrace => self.parse_map_expr(),
643 Keyword::LEFT | Keyword::RIGHT => {
645 *self = checkpoint;
646 self.parse_function()
647 }
648 Keyword::OPERATOR if self.peek_token().token == Token::LParen => {
649 let op = UnaryOperator::PGQualified(Box::new(self.parse_qualified_operator()?));
650 Ok(Expr::UnaryOp {
651 op,
652 expr: Box::new(self.parse_subexpr(Precedence::Other)?),
653 })
654 }
655 keyword @ (Keyword::ALL | Keyword::ANY | Keyword::SOME) => {
656 self.expect_token(&Token::LParen)?;
657 let sub = self.parse_expr()?;
660 self.expect_token(&Token::RParen)?;
661
662 if let Expr::Subquery(_) = &sub {
664 parser_err!("ANY/SOME/ALL(Subquery) is not implemented");
665 }
666
667 Ok(match keyword {
668 Keyword::ALL => Expr::AllOp(Box::new(sub)),
669 Keyword::ANY | Keyword::SOME => Expr::SomeOp(Box::new(sub)),
671 _ => unreachable!(),
672 })
673 }
674 k if keywords::RESERVED_FOR_COLUMN_OR_TABLE_NAME.contains(&k) => {
675 parser_err!("syntax error at or near {token}")
676 }
677 _ => match self.peek_token().token {
680 Token::LParen | Token::Period | Token::Colon => {
681 *self = checkpoint;
682 if let Ok(object_name) = self.parse_object_name()
683 && !matches!(self.peek_token().token, Token::LParen | Token::Colon)
684 {
685 Ok(Expr::CompoundIdentifier(object_name.0))
686 } else {
687 *self = checkpoint;
688 self.parse_function()
689 }
690 }
691 _ => Ok(Expr::Identifier(w.to_ident()?)),
692 },
693 }, tok @ Token::Minus | tok @ Token::Plus => {
696 let op = if tok == Token::Plus {
697 UnaryOperator::Plus
698 } else {
699 UnaryOperator::Minus
700 };
701 let mut sub_expr = self.parse_subexpr(Precedence::UnaryPosNeg)?;
702 if let Expr::Value(Value::Number(ref mut s)) = sub_expr {
703 if tok == Token::Minus {
704 *s = format!("-{}", s);
705 }
706 return Ok(sub_expr);
707 }
708 Ok(Expr::UnaryOp {
709 op,
710 expr: Box::new(sub_expr),
711 })
712 }
713 tok @ Token::DoubleExclamationMark
714 | tok @ Token::PGSquareRoot
715 | tok @ Token::PGCubeRoot
716 | tok @ Token::AtSign
717 | tok @ Token::Tilde => {
718 let op = match tok {
719 Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
720 Token::PGSquareRoot => UnaryOperator::PGSquareRoot,
721 Token::PGCubeRoot => UnaryOperator::PGCubeRoot,
722 Token::AtSign => UnaryOperator::PGAbs,
723 Token::Tilde => UnaryOperator::PGBitwiseNot,
724 _ => unreachable!(),
725 };
726 Ok(Expr::UnaryOp {
729 op,
730 expr: Box::new(self.parse_subexpr(Precedence::Other)?),
731 })
732 }
733 Token::Number(_)
734 | Token::SingleQuotedString(_)
735 | Token::DollarQuotedString(_)
736 | Token::NationalStringLiteral(_)
737 | Token::HexStringLiteral(_)
738 | Token::CstyleEscapesString(_) => {
739 *self = checkpoint;
740 Ok(Expr::Value(self.ensure_parse_value()?))
741 }
742 Token::Parameter(number) => self.parse_param(number),
743 Token::Pipe => {
744 let args = self.parse_comma_separated(Parser::parse_identifier)?;
745 self.expect_token(&Token::Pipe)?;
746 let body = self.parse_expr()?;
747 Ok(Expr::LambdaFunction {
748 args,
749 body: Box::new(body),
750 })
751 }
752 Token::LParen => {
753 let expr = if matches!(self.peek_token().token, Token::Word(w) if w.keyword == Keyword::SELECT || w.keyword == Keyword::WITH)
754 {
755 Expr::Subquery(Box::new(self.parse_query()?))
756 } else {
757 let mut exprs = self.parse_comma_separated(Parser::parse_expr)?;
758 if exprs.len() == 1 {
759 Expr::Nested(Box::new(exprs.pop().unwrap()))
760 } else {
761 Expr::Row(exprs)
762 }
763 };
764 self.expect_token(&Token::RParen)?;
765 if self.peek_token() == Token::Period && matches!(expr, Expr::Nested(_)) {
766 self.parse_struct_selection(expr)
767 } else {
768 Ok(expr)
769 }
770 }
771 _ => self.expected_at(checkpoint, "an expression"),
772 }?;
773
774 if self.parse_keyword(Keyword::COLLATE) {
775 Ok(Expr::Collate {
776 expr: Box::new(expr),
777 collation: self.parse_object_name()?,
778 })
779 } else {
780 Ok(expr)
781 }
782 }
783
784 fn parse_param(&mut self, param: String) -> ModalResult<Expr> {
785 let Ok(index) = param.parse() else {
786 parser_err!("Parameter symbol has a invalid index {}.", param);
787 };
788 Ok(Expr::Parameter { index })
789 }
790
791 pub fn parse_struct_selection(&mut self, expr: Expr) -> ModalResult<Expr> {
793 let mut nested_expr = expr;
794 while let Expr::Nested(inner) = nested_expr {
796 nested_expr = *inner;
797 }
798 let fields = self.parse_fields()?;
799 Ok(Expr::FieldIdentifier(Box::new(nested_expr), fields))
800 }
801
802 pub fn parse_fields(&mut self) -> ModalResult<Vec<Ident>> {
804 repeat(.., preceded(Token::Period, cut_err(Self::parse_identifier))).parse_next(self)
805 }
806
807 pub fn parse_qualified_operator(&mut self) -> ModalResult<QualifiedOperator> {
808 self.expect_token(&Token::LParen)?;
809
810 let checkpoint = *self;
811 let schema = match self.parse_identifier_non_reserved() {
812 Ok(ident) => {
813 self.expect_token(&Token::Period)?;
814 Some(ident)
815 }
816 Err(_) => {
817 *self = checkpoint;
818 None
819 }
820 };
821
822 const OP_CHARS: &[char] = &[
824 '+', '-', '*', '/', '<', '>', '=', '~', '!', '@', '#', '%', '^', '&', '|', '`', '?',
825 ];
826 let name = {
827 let checkpoint = *self;
834 let token = self.next_token();
835 let name = token.token.to_string();
836 if !name.trim_matches(OP_CHARS).is_empty() {
837 return self
838 .expected_at(checkpoint, &format!("one of {}", OP_CHARS.iter().join(" ")));
839 }
840 name
841 };
842
843 self.expect_token(&Token::RParen)?;
844 Ok(QualifiedOperator { schema, name })
845 }
846
847 pub fn parse_function(&mut self) -> ModalResult<Expr> {
849 let scalar_as_agg = if self.parse_keyword(Keyword::AGGREGATE) {
851 self.expect_token(&Token::Colon)?;
852 true
853 } else {
854 false
855 };
856 let name = self.parse_object_name()?;
857 let arg_list = self.parse_argument_list()?;
858
859 let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
860 self.expect_token(&Token::LParen)?;
861 self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
862 let order_by = self.parse_order_by_expr()?;
863 self.expect_token(&Token::RParen)?;
864 Some(Box::new(order_by.clone()))
865 } else {
866 None
867 };
868
869 let filter = if self.parse_keyword(Keyword::FILTER) {
870 self.expect_token(&Token::LParen)?;
871 self.expect_keyword(Keyword::WHERE)?;
872 let filter_expr = self.parse_expr()?;
873 self.expect_token(&Token::RParen)?;
874 Some(Box::new(filter_expr))
875 } else {
876 None
877 };
878
879 let over = if self.parse_keyword(Keyword::OVER) {
880 self.expect_token(&Token::LParen)?;
882 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
883 self.parse_comma_separated(Parser::parse_expr)?
885 } else {
886 vec![]
887 };
888 let order_by_window = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
889 self.parse_comma_separated(Parser::parse_order_by_expr)?
890 } else {
891 vec![]
892 };
893 let window_frame = if !self.consume_token(&Token::RParen) {
894 let window_frame = self.parse_window_frame()?;
895 self.expect_token(&Token::RParen)?;
896 Some(window_frame)
897 } else {
898 None
899 };
900
901 Some(WindowSpec {
902 partition_by,
903 order_by: order_by_window,
904 window_frame,
905 })
906 } else {
907 None
908 };
909
910 Ok(Expr::Function(Function {
911 scalar_as_agg,
912 name,
913 arg_list,
914 within_group,
915 filter,
916 over,
917 }))
918 }
919
920 pub fn parse_window_frame_units(&mut self) -> ModalResult<WindowFrameUnits> {
921 dispatch! { peek(keyword);
922 Keyword::ROWS => keyword.value(WindowFrameUnits::Rows),
923 Keyword::RANGE => keyword.value(WindowFrameUnits::Range),
924 Keyword::GROUPS => keyword.value(WindowFrameUnits::Groups),
925 Keyword::SESSION => keyword.value(WindowFrameUnits::Session),
926 _ => fail,
927 }
928 .expect("ROWS, RANGE, or GROUPS")
929 .parse_next(self)
930 }
931
932 pub fn parse_window_frame(&mut self) -> ModalResult<WindowFrame> {
933 let units = self.parse_window_frame_units()?;
934 let bounds = if self.parse_keyword(Keyword::BETWEEN) {
935 let start = self.parse_window_frame_bound()?;
937 self.expect_keyword(Keyword::AND)?;
938 let end = Some(self.parse_window_frame_bound()?);
939 WindowFrameBounds::Bounds { start, end }
940 } else if self.parse_keywords(&[Keyword::WITH, Keyword::GAP]) {
941 WindowFrameBounds::Gap(Box::new(self.parse_expr()?))
943 } else {
944 WindowFrameBounds::Bounds {
946 start: self.parse_window_frame_bound()?,
947 end: None,
948 }
949 };
950 let exclusion = if self.parse_keyword(Keyword::EXCLUDE) {
951 Some(self.parse_window_frame_exclusion()?)
952 } else {
953 None
954 };
955 Ok(WindowFrame {
956 units,
957 bounds,
958 exclusion,
959 })
960 }
961
962 pub fn parse_window_frame_bound(&mut self) -> ModalResult<WindowFrameBound> {
964 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
965 Ok(WindowFrameBound::CurrentRow)
966 } else {
967 let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
968 None
969 } else {
970 Some(Box::new(self.parse_expr()?))
971 };
972 if self.parse_keyword(Keyword::PRECEDING) {
973 Ok(WindowFrameBound::Preceding(rows))
974 } else if self.parse_keyword(Keyword::FOLLOWING) {
975 Ok(WindowFrameBound::Following(rows))
976 } else {
977 self.expected("PRECEDING or FOLLOWING")
978 }
979 }
980 }
981
982 pub fn parse_window_frame_exclusion(&mut self) -> ModalResult<WindowFrameExclusion> {
983 if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
984 Ok(WindowFrameExclusion::CurrentRow)
985 } else if self.parse_keyword(Keyword::GROUP) {
986 Ok(WindowFrameExclusion::Group)
987 } else if self.parse_keyword(Keyword::TIES) {
988 Ok(WindowFrameExclusion::Ties)
989 } else if self.parse_keywords(&[Keyword::NO, Keyword::OTHERS]) {
990 Ok(WindowFrameExclusion::NoOthers)
991 } else {
992 self.expected("CURRENT ROW, GROUP, TIES, or NO OTHERS")
993 }
994 }
995
996 fn parse_group_by_expr(&mut self) -> ModalResult<Expr> {
999 if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
1000 self.expect_token(&Token::LParen)?;
1001 let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?;
1002 self.expect_token(&Token::RParen)?;
1003 Ok(Expr::GroupingSets(result))
1004 } else if self.parse_keyword(Keyword::CUBE) {
1005 self.expect_token(&Token::LParen)?;
1006 let result = self.parse_comma_separated(|p| p.parse_tuple(true, false))?;
1007 self.expect_token(&Token::RParen)?;
1008 Ok(Expr::Cube(result))
1009 } else if self.parse_keyword(Keyword::ROLLUP) {
1010 self.expect_token(&Token::LParen)?;
1011 let result = self.parse_comma_separated(|p| p.parse_tuple(true, false))?;
1012 self.expect_token(&Token::RParen)?;
1013 Ok(Expr::Rollup(result))
1014 } else {
1015 self.parse_expr()
1016 }
1017 }
1018
1019 fn parse_tuple(&mut self, lift_singleton: bool, allow_empty: bool) -> ModalResult<Vec<Expr>> {
1023 if lift_singleton {
1024 if self.consume_token(&Token::LParen) {
1025 let result = if allow_empty && self.consume_token(&Token::RParen) {
1026 vec![]
1027 } else {
1028 let result = self.parse_comma_separated(Parser::parse_expr)?;
1029 self.expect_token(&Token::RParen)?;
1030 result
1031 };
1032 Ok(result)
1033 } else {
1034 Ok(vec![self.parse_expr()?])
1035 }
1036 } else {
1037 self.expect_token(&Token::LParen)?;
1038 let result = if allow_empty && self.consume_token(&Token::RParen) {
1039 vec![]
1040 } else {
1041 let result = self.parse_comma_separated(Parser::parse_expr)?;
1042 self.expect_token(&Token::RParen)?;
1043 result
1044 };
1045 Ok(result)
1046 }
1047 }
1048
1049 pub fn parse_case_expr(&mut self) -> ModalResult<Expr> {
1050 parser_v2::expr_case(self)
1051 }
1052
1053 pub fn parse_cast_expr(&mut self) -> ModalResult<Expr> {
1055 parser_v2::expr_cast(self)
1056 }
1057
1058 pub fn parse_try_cast_expr(&mut self) -> ModalResult<Expr> {
1060 parser_v2::expr_try_cast(self)
1061 }
1062
1063 pub fn parse_exists_expr(&mut self) -> ModalResult<Expr> {
1065 self.expect_token(&Token::LParen)?;
1066 let exists_node = Expr::Exists(Box::new(self.parse_query()?));
1067 self.expect_token(&Token::RParen)?;
1068 Ok(exists_node)
1069 }
1070
1071 pub fn parse_extract_expr(&mut self) -> ModalResult<Expr> {
1072 parser_v2::expr_extract(self)
1073 }
1074
1075 pub fn parse_substring_expr(&mut self) -> ModalResult<Expr> {
1076 parser_v2::expr_substring(self)
1077 }
1078
1079 pub fn parse_position_expr(&mut self) -> ModalResult<Expr> {
1081 parser_v2::expr_position(self)
1082 }
1083
1084 pub fn parse_overlay_expr(&mut self) -> ModalResult<Expr> {
1086 parser_v2::expr_overlay(self)
1087 }
1088
1089 pub fn parse_trim_expr(&mut self) -> ModalResult<Expr> {
1092 self.expect_token(&Token::LParen)?;
1093 let mut trim_where = None;
1094 if let Token::Word(word) = self.peek_token().token {
1095 if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
1096 trim_where = Some(self.parse_trim_where()?);
1097 }
1098 }
1099
1100 let (mut trim_what, expr) = if self.parse_keyword(Keyword::FROM) {
1101 (None, self.parse_expr()?)
1102 } else {
1103 let mut expr = self.parse_expr()?;
1104 if self.parse_keyword(Keyword::FROM) {
1105 let trim_what = std::mem::replace(&mut expr, self.parse_expr()?);
1106 (Some(Box::new(trim_what)), expr)
1107 } else {
1108 (None, expr)
1109 }
1110 };
1111
1112 if trim_what.is_none() && self.consume_token(&Token::Comma) {
1113 trim_what = Some(Box::new(self.parse_expr()?));
1114 }
1115 self.expect_token(&Token::RParen)?;
1116
1117 Ok(Expr::Trim {
1118 expr: Box::new(expr),
1119 trim_where,
1120 trim_what,
1121 })
1122 }
1123
1124 pub fn parse_trim_where(&mut self) -> ModalResult<TrimWhereField> {
1125 dispatch! { peek(keyword);
1126 Keyword::BOTH => keyword.value(TrimWhereField::Both),
1127 Keyword::LEADING => keyword.value(TrimWhereField::Leading),
1128 Keyword::TRAILING => keyword.value(TrimWhereField::Trailing),
1129 _ => fail
1130 }
1131 .expect("BOTH, LEADING, or TRAILING")
1132 .parse_next(self)
1133 }
1134
1135 pub fn parse_array_expr(&mut self) -> ModalResult<Expr> {
1137 let mut expected_depth = None;
1138 let exprs = self.parse_array_inner(0, &mut expected_depth)?;
1139 Ok(Expr::Array(Array {
1140 elem: exprs,
1141 named: true,
1143 }))
1144 }
1145
1146 fn parse_array_inner(
1147 &mut self,
1148 depth: usize,
1149 expected_depth: &mut Option<usize>,
1150 ) -> ModalResult<Vec<Expr>> {
1151 self.expect_token(&Token::LBracket)?;
1152 if let Some(expected_depth) = *expected_depth
1153 && depth > expected_depth
1154 {
1155 return self.expected("]");
1156 }
1157 let exprs = if self.peek_token() == Token::LBracket {
1158 self.parse_comma_separated(|parser| {
1159 let exprs = parser.parse_array_inner(depth + 1, expected_depth)?;
1160 Ok(Expr::Array(Array {
1161 elem: exprs,
1162 named: false,
1163 }))
1164 })?
1165 } else {
1166 if let Some(expected_depth) = *expected_depth {
1167 if depth < expected_depth {
1168 return self.expected("[");
1169 }
1170 } else {
1171 *expected_depth = Some(depth);
1172 }
1173 if self.consume_token(&Token::RBracket) {
1174 return Ok(vec![]);
1175 }
1176 self.parse_comma_separated(Self::parse_expr)?
1177 };
1178 self.expect_token(&Token::RBracket)?;
1179 Ok(exprs)
1180 }
1181
1182 pub fn parse_map_expr(&mut self) -> ModalResult<Expr> {
1184 self.expect_token(&Token::LBrace)?;
1185 if self.consume_token(&Token::RBrace) {
1186 return Ok(Expr::Map { entries: vec![] });
1187 }
1188 let entries = self.parse_comma_separated(|parser| {
1189 let key = parser.parse_expr()?;
1190 parser.expect_token(&Token::Colon)?;
1191 let value = parser.parse_expr()?;
1192 Ok((key, value))
1193 })?;
1194 self.expect_token(&Token::RBrace)?;
1195 Ok(Expr::Map { entries })
1196 }
1197
1198 pub fn parse_date_time_field(&mut self) -> ModalResult<DateTimeField> {
1200 dispatch! { peek(keyword);
1201 Keyword::YEAR => keyword.value(DateTimeField::Year),
1202 Keyword::MONTH => keyword.value(DateTimeField::Month),
1203 Keyword::DAY => keyword.value(DateTimeField::Day),
1204 Keyword::HOUR => keyword.value(DateTimeField::Hour),
1205 Keyword::MINUTE => keyword.value(DateTimeField::Minute),
1206 Keyword::SECOND => keyword.value(DateTimeField::Second),
1207 _ => fail,
1208 }
1209 .expect("date/time field")
1210 .parse_next(self)
1211 }
1212
1213 pub fn parse_date_time_field_in_extract(&mut self) -> ModalResult<String> {
1223 let checkpoint = *self;
1224 let token = self.next_token();
1225 match token.token {
1226 Token::Word(w) => Ok(w.value.to_uppercase()),
1227 Token::SingleQuotedString(s) => Ok(s.to_uppercase()),
1228 _ => {
1229 *self = checkpoint;
1230 self.expected("date/time field")
1231 }
1232 }
1233 }
1234
1235 pub fn parse_literal_interval(&mut self) -> ModalResult<Expr> {
1248 let value = self.parse_literal_string()?;
1256
1257 let leading_field = match self.peek_token().token {
1263 Token::Word(kw)
1264 if [
1265 Keyword::YEAR,
1266 Keyword::MONTH,
1267 Keyword::DAY,
1268 Keyword::HOUR,
1269 Keyword::MINUTE,
1270 Keyword::SECOND,
1271 ]
1272 .contains(&kw.keyword) =>
1273 {
1274 Some(self.parse_date_time_field()?)
1275 }
1276 _ => None,
1277 };
1278
1279 let (leading_precision, last_field, fsec_precision) =
1280 if leading_field == Some(DateTimeField::Second) {
1281 let last_field = None;
1287 let (leading_precision, fsec_precision) = self.parse_optional_precision_scale()?;
1288 (leading_precision, last_field, fsec_precision)
1289 } else {
1290 let leading_precision = self.parse_optional_precision()?;
1291 if self.parse_keyword(Keyword::TO) {
1292 let last_field = Some(self.parse_date_time_field()?);
1293 let fsec_precision = if last_field == Some(DateTimeField::Second) {
1294 self.parse_optional_precision()?
1295 } else {
1296 None
1297 };
1298 (leading_precision, last_field, fsec_precision)
1299 } else {
1300 (leading_precision, None, None)
1301 }
1302 };
1303
1304 Ok(Expr::Value(Value::Interval {
1305 value,
1306 leading_field,
1307 leading_precision,
1308 last_field,
1309 fractional_seconds_precision: fsec_precision,
1310 }))
1311 }
1312
1313 pub fn parse_infix(&mut self, expr: Expr, precedence: Precedence) -> ModalResult<Expr> {
1315 let checkpoint = *self;
1316 let tok = self.next_token();
1317 debug!("parsing infix {:?}", tok.token);
1318 let regular_binary_operator = match &tok.token {
1319 Token::Spaceship => Some(BinaryOperator::Spaceship),
1320 Token::DoubleEq => Some(BinaryOperator::Eq),
1321 Token::Eq => Some(BinaryOperator::Eq),
1322 Token::Neq => Some(BinaryOperator::NotEq),
1323 Token::Gt => Some(BinaryOperator::Gt),
1324 Token::GtEq => Some(BinaryOperator::GtEq),
1325 Token::Lt => Some(BinaryOperator::Lt),
1326 Token::LtEq => Some(BinaryOperator::LtEq),
1327 Token::Plus => Some(BinaryOperator::Plus),
1328 Token::Minus => Some(BinaryOperator::Minus),
1329 Token::Mul => Some(BinaryOperator::Multiply),
1330 Token::Mod => Some(BinaryOperator::Modulo),
1331 Token::Concat => Some(BinaryOperator::Concat),
1332 Token::Pipe => Some(BinaryOperator::BitwiseOr),
1333 Token::Caret => Some(BinaryOperator::BitwiseXor),
1334 Token::Prefix => Some(BinaryOperator::Prefix),
1335 Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
1336 Token::Div => Some(BinaryOperator::Divide),
1337 Token::ShiftLeft => Some(BinaryOperator::PGBitwiseShiftLeft),
1338 Token::ShiftRight => Some(BinaryOperator::PGBitwiseShiftRight),
1339 Token::Sharp => Some(BinaryOperator::PGBitwiseXor),
1340 Token::Tilde => Some(BinaryOperator::PGRegexMatch),
1341 Token::TildeAsterisk => Some(BinaryOperator::PGRegexIMatch),
1342 Token::ExclamationMarkTilde => Some(BinaryOperator::PGRegexNotMatch),
1343 Token::ExclamationMarkTildeAsterisk => Some(BinaryOperator::PGRegexNotIMatch),
1344 Token::DoubleTilde => Some(BinaryOperator::PGLikeMatch),
1345 Token::DoubleTildeAsterisk => Some(BinaryOperator::PGILikeMatch),
1346 Token::ExclamationMarkDoubleTilde => Some(BinaryOperator::PGNotLikeMatch),
1347 Token::ExclamationMarkDoubleTildeAsterisk => Some(BinaryOperator::PGNotILikeMatch),
1348 Token::Arrow => Some(BinaryOperator::Arrow),
1349 Token::LongArrow => Some(BinaryOperator::LongArrow),
1350 Token::HashArrow => Some(BinaryOperator::HashArrow),
1351 Token::HashLongArrow => Some(BinaryOperator::HashLongArrow),
1352 Token::HashMinus => Some(BinaryOperator::HashMinus),
1353 Token::AtArrow => Some(BinaryOperator::Contains),
1354 Token::ArrowAt => Some(BinaryOperator::Contained),
1355 Token::QuestionMark => Some(BinaryOperator::Exists),
1356 Token::QuestionMarkPipe => Some(BinaryOperator::ExistsAny),
1357 Token::QuestionMarkAmpersand => Some(BinaryOperator::ExistsAll),
1358 Token::AtQuestionMark => Some(BinaryOperator::PathExists),
1359 Token::AtAt => Some(BinaryOperator::PathMatch),
1360 Token::Word(w) => match w.keyword {
1361 Keyword::AND => Some(BinaryOperator::And),
1362 Keyword::OR => Some(BinaryOperator::Or),
1363 Keyword::XOR => Some(BinaryOperator::Xor),
1364 Keyword::OPERATOR if self.peek_token() == Token::LParen => Some(
1365 BinaryOperator::PGQualified(Box::new(self.parse_qualified_operator()?)),
1366 ),
1367 _ => None,
1368 },
1369 _ => None,
1370 };
1371
1372 if let Some(op) = regular_binary_operator {
1373 Ok(Expr::BinaryOp {
1402 left: Box::new(expr),
1403 op,
1404 right: Box::new(self.parse_subexpr(precedence)?),
1405 })
1406 } else if let Token::Word(w) = &tok.token {
1408 match w.keyword {
1409 Keyword::IS => {
1410 if self.parse_keyword(Keyword::TRUE) {
1411 Ok(Expr::IsTrue(Box::new(expr)))
1412 } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) {
1413 Ok(Expr::IsNotTrue(Box::new(expr)))
1414 } else if self.parse_keyword(Keyword::FALSE) {
1415 Ok(Expr::IsFalse(Box::new(expr)))
1416 } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) {
1417 Ok(Expr::IsNotFalse(Box::new(expr)))
1418 } else if self.parse_keyword(Keyword::UNKNOWN) {
1419 Ok(Expr::IsUnknown(Box::new(expr)))
1420 } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) {
1421 Ok(Expr::IsNotUnknown(Box::new(expr)))
1422 } else if self.parse_keyword(Keyword::NULL) {
1423 Ok(Expr::IsNull(Box::new(expr)))
1424 } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
1425 Ok(Expr::IsNotNull(Box::new(expr)))
1426 } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) {
1427 let expr2 = self.parse_expr()?;
1428 Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2)))
1429 } else if self.parse_keywords(&[Keyword::NOT, Keyword::DISTINCT, Keyword::FROM])
1430 {
1431 let expr2 = self.parse_expr()?;
1432 Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
1433 } else {
1434 let negated = self.parse_keyword(Keyword::NOT);
1435
1436 if self.parse_keyword(Keyword::JSON) {
1437 self.parse_is_json(expr, negated)
1438 } else {
1439 self.expected(
1440 "[NOT] { TRUE | FALSE | UNKNOWN | NULL | DISTINCT FROM | JSON } after IS",
1441 )
1442 }
1443 }
1444 }
1445 Keyword::AT => {
1446 assert_eq!(precedence, Precedence::At);
1447 let time_zone = Box::new(
1448 preceded(
1449 (Keyword::TIME, Keyword::ZONE),
1450 cut_err(|p: &mut Self| p.parse_subexpr(precedence)),
1451 )
1452 .parse_next(self)?,
1453 );
1454 Ok(Expr::AtTimeZone {
1455 timestamp: Box::new(expr),
1456 time_zone,
1457 })
1458 }
1459 keyword @ (Keyword::ALL | Keyword::ANY | Keyword::SOME) => {
1460 self.expect_token(&Token::LParen)?;
1461 let sub = self.parse_expr()?;
1464 self.expect_token(&Token::RParen)?;
1465
1466 if let Expr::Subquery(_) = &sub {
1468 parser_err!("ANY/SOME/ALL(Subquery) is not implemented");
1469 }
1470
1471 Ok(match keyword {
1472 Keyword::ALL => Expr::AllOp(Box::new(sub)),
1473 Keyword::ANY | Keyword::SOME => Expr::SomeOp(Box::new(sub)),
1475 _ => unreachable!(),
1476 })
1477 }
1478 Keyword::NOT
1479 | Keyword::IN
1480 | Keyword::BETWEEN
1481 | Keyword::LIKE
1482 | Keyword::ILIKE
1483 | Keyword::SIMILAR => {
1484 *self = checkpoint;
1485 let negated = self.parse_keyword(Keyword::NOT);
1486 if self.parse_keyword(Keyword::IN) {
1487 self.parse_in(expr, negated)
1488 } else if self.parse_keyword(Keyword::BETWEEN) {
1489 self.parse_between(expr, negated)
1490 } else if self.parse_keyword(Keyword::LIKE) {
1491 Ok(Expr::Like {
1492 negated,
1493 expr: Box::new(expr),
1494 pattern: Box::new(self.parse_subexpr(Precedence::Like)?),
1495 escape_char: self.parse_escape()?,
1496 })
1497 } else if self.parse_keyword(Keyword::ILIKE) {
1498 Ok(Expr::ILike {
1499 negated,
1500 expr: Box::new(expr),
1501 pattern: Box::new(self.parse_subexpr(Precedence::Like)?),
1502 escape_char: self.parse_escape()?,
1503 })
1504 } else if self.parse_keywords(&[Keyword::SIMILAR, Keyword::TO]) {
1505 Ok(Expr::SimilarTo {
1506 negated,
1507 expr: Box::new(expr),
1508 pattern: Box::new(self.parse_subexpr(Precedence::Like)?),
1509 escape_char: self.parse_escape()?,
1510 })
1511 } else {
1512 self.expected("IN, BETWEEN or SIMILAR TO after NOT")
1513 }
1514 }
1515 _ => parser_err!("No infix parser for token {:?}", tok),
1517 }
1518 } else if Token::DoubleColon == tok {
1519 self.parse_pg_cast(expr)
1520 } else if Token::ExclamationMark == tok {
1521 Ok(Expr::UnaryOp {
1523 op: UnaryOperator::PGPostfixFactorial,
1524 expr: Box::new(expr),
1525 })
1526 } else if Token::LBracket == tok {
1527 self.parse_array_index(expr)
1528 } else {
1529 parser_err!("No infix parser for token {:?}", tok)
1531 }
1532 }
1533
1534 pub fn parse_escape(&mut self) -> ModalResult<Option<EscapeChar>> {
1536 if self.parse_keyword(Keyword::ESCAPE) {
1537 let s = self.parse_literal_string()?;
1538 let mut chs = s.chars();
1539 if let Some(ch) = chs.next() {
1540 if chs.next().is_some() {
1541 parser_err!("Escape string must be empty or one character, found {s:?}")
1542 } else {
1543 Ok(Some(EscapeChar::escape(ch)))
1544 }
1545 } else {
1546 Ok(Some(EscapeChar::empty()))
1547 }
1548 } else {
1549 Ok(None)
1550 }
1551 }
1552
1553 pub fn parse_array_index(&mut self, expr: Expr) -> ModalResult<Expr> {
1556 let new_expr = match self.peek_token().token {
1557 Token::Colon => {
1558 assert!(self.consume_token(&Token::Colon));
1560 let end = match self.peek_token().token {
1561 Token::RBracket => None,
1562 _ => {
1563 let end_index = Box::new(self.parse_expr()?);
1564 Some(end_index)
1565 }
1566 };
1567 Expr::ArrayRangeIndex {
1568 obj: Box::new(expr),
1569 start: None,
1570 end,
1571 }
1572 }
1573 _ => {
1574 let index = Box::new(self.parse_expr()?);
1576 match self.peek_token().token {
1577 Token::Colon => {
1578 assert!(self.consume_token(&Token::Colon));
1580 match self.peek_token().token {
1581 Token::RBracket => {
1582 Expr::ArrayRangeIndex {
1584 obj: Box::new(expr),
1585 start: Some(index),
1586 end: None,
1587 }
1588 }
1589 _ => {
1590 let end = Some(Box::new(self.parse_expr()?));
1592 Expr::ArrayRangeIndex {
1593 obj: Box::new(expr),
1594 start: Some(index),
1595 end,
1596 }
1597 }
1598 }
1599 }
1600 _ => {
1601 Expr::Index {
1603 obj: Box::new(expr),
1604 index,
1605 }
1606 }
1607 }
1608 }
1609 };
1610 self.expect_token(&Token::RBracket)?;
1611 if self.consume_token(&Token::LBracket) {
1613 self.parse_array_index(new_expr)
1614 } else {
1615 Ok(new_expr)
1616 }
1617 }
1618
1619 pub fn parse_is_json(&mut self, expr: Expr, negated: bool) -> ModalResult<Expr> {
1621 let item_type = match self.peek_token().token {
1622 Token::Word(w) => match w.keyword {
1623 Keyword::VALUE => Some(JsonPredicateType::Value),
1624 Keyword::ARRAY => Some(JsonPredicateType::Array),
1625 Keyword::OBJECT => Some(JsonPredicateType::Object),
1626 Keyword::SCALAR => Some(JsonPredicateType::Scalar),
1627 _ => None,
1628 },
1629 _ => None,
1630 };
1631 if item_type.is_some() {
1632 self.next_token();
1633 }
1634 let item_type = item_type.unwrap_or_default();
1635
1636 let unique_keys = self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]);
1637 if unique_keys.is_some() {
1638 self.expect_keyword(Keyword::UNIQUE)?;
1639 _ = self.parse_keyword(Keyword::KEYS);
1640 }
1641 let unique_keys = unique_keys.is_some_and(|w| w == Keyword::WITH);
1642
1643 Ok(Expr::IsJson {
1644 expr: Box::new(expr),
1645 negated,
1646 item_type,
1647 unique_keys,
1648 })
1649 }
1650
1651 pub fn parse_in(&mut self, expr: Expr, negated: bool) -> ModalResult<Expr> {
1653 self.expect_token(&Token::LParen)?;
1654 let in_op = if matches!(self.peek_token().token, Token::Word(w) if w.keyword == Keyword::SELECT || w.keyword == Keyword::WITH)
1655 {
1656 Expr::InSubquery {
1657 expr: Box::new(expr),
1658 subquery: Box::new(self.parse_query()?),
1659 negated,
1660 }
1661 } else {
1662 Expr::InList {
1663 expr: Box::new(expr),
1664 list: self.parse_comma_separated(Parser::parse_expr)?,
1665 negated,
1666 }
1667 };
1668 self.expect_token(&Token::RParen)?;
1669 Ok(in_op)
1670 }
1671
1672 pub fn parse_between(&mut self, expr: Expr, negated: bool) -> ModalResult<Expr> {
1674 let low = self.parse_subexpr(Precedence::Between)?;
1677 self.expect_keyword(Keyword::AND)?;
1678 let high = self.parse_subexpr(Precedence::Between)?;
1679 Ok(Expr::Between {
1680 expr: Box::new(expr),
1681 negated,
1682 low: Box::new(low),
1683 high: Box::new(high),
1684 })
1685 }
1686
1687 pub fn parse_pg_cast(&mut self, expr: Expr) -> ModalResult<Expr> {
1689 Ok(Expr::Cast {
1690 expr: Box::new(expr),
1691 data_type: self.parse_data_type()?,
1692 })
1693 }
1694
1695 pub fn get_next_precedence(&self) -> ModalResult<Precedence> {
1697 use Precedence as P;
1698
1699 let token = self.peek_token();
1700 debug!("get_next_precedence() {:?}", token);
1701 match token.token {
1702 Token::Word(w) if w.keyword == Keyword::OR => Ok(P::LogicalOr),
1703 Token::Word(w) if w.keyword == Keyword::XOR => Ok(P::LogicalXor),
1704 Token::Word(w) if w.keyword == Keyword::AND => Ok(P::LogicalAnd),
1705 Token::Word(w) if w.keyword == Keyword::AT => {
1706 match (self.peek_nth_token(1).token, self.peek_nth_token(2).token) {
1707 (Token::Word(w), Token::Word(w2))
1708 if w.keyword == Keyword::TIME && w2.keyword == Keyword::ZONE =>
1709 {
1710 Ok(P::At)
1711 }
1712 _ => Ok(P::Zero),
1713 }
1714 }
1715
1716 Token::Word(w) if w.keyword == Keyword::NOT => match self.peek_nth_token(1).token {
1717 Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(P::Between),
1723 Token::Word(w) if w.keyword == Keyword::IN => Ok(P::Between),
1724 Token::Word(w) if w.keyword == Keyword::LIKE => Ok(P::Like),
1725 Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(P::Like),
1726 Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(P::Like),
1727 _ => Ok(P::Zero),
1728 },
1729
1730 Token::Word(w) if w.keyword == Keyword::IS => Ok(P::Is),
1731 Token::Word(w) if w.keyword == Keyword::ISNULL => Ok(P::Is),
1732 Token::Word(w) if w.keyword == Keyword::NOTNULL => Ok(P::Is),
1733 Token::Eq
1734 | Token::Lt
1735 | Token::LtEq
1736 | Token::Neq
1737 | Token::Gt
1738 | Token::GtEq
1739 | Token::DoubleEq
1740 | Token::Spaceship => Ok(P::Cmp),
1741 Token::Word(w) if w.keyword == Keyword::IN => Ok(P::Between),
1742 Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(P::Between),
1743 Token::Word(w) if w.keyword == Keyword::LIKE => Ok(P::Like),
1744 Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(P::Like),
1745 Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(P::Like),
1746 Token::Word(w) if w.keyword == Keyword::ALL => Ok(P::Other),
1747 Token::Word(w) if w.keyword == Keyword::ANY => Ok(P::Other),
1748 Token::Word(w) if w.keyword == Keyword::SOME => Ok(P::Other),
1749 Token::Tilde
1750 | Token::TildeAsterisk
1751 | Token::ExclamationMarkTilde
1752 | Token::ExclamationMarkTildeAsterisk
1753 | Token::DoubleTilde
1754 | Token::DoubleTildeAsterisk
1755 | Token::ExclamationMarkDoubleTilde
1756 | Token::ExclamationMarkDoubleTildeAsterisk
1757 | Token::Concat
1758 | Token::Prefix
1759 | Token::Arrow
1760 | Token::LongArrow
1761 | Token::HashArrow
1762 | Token::HashLongArrow
1763 | Token::HashMinus
1764 | Token::AtArrow
1765 | Token::ArrowAt
1766 | Token::QuestionMark
1767 | Token::QuestionMarkPipe
1768 | Token::QuestionMarkAmpersand
1769 | Token::AtQuestionMark
1770 | Token::AtAt => Ok(P::Other),
1771 Token::Word(w)
1772 if w.keyword == Keyword::OPERATOR && self.peek_nth_token(1) == Token::LParen =>
1773 {
1774 Ok(P::Other)
1775 }
1776 Token::Pipe => Ok(P::Other),
1780 Token::Sharp => Ok(P::Other),
1781 Token::Ampersand => Ok(P::Other),
1782 Token::ShiftRight | Token::ShiftLeft => Ok(P::Other),
1783 Token::Plus | Token::Minus => Ok(P::PlusMinus),
1784 Token::Mul | Token::Div | Token::Mod => Ok(P::MulDiv),
1785 Token::Caret => Ok(P::Exp),
1786 Token::ExclamationMark => Ok(P::PostfixFactorial),
1787 Token::LBracket => Ok(P::Array),
1788 Token::DoubleColon => Ok(P::DoubleColon),
1789 _ => Ok(P::Zero),
1790 }
1791 }
1792
1793 pub fn peek_token(&self) -> TokenWithLocation {
1796 self.peek_nth_token(0)
1797 }
1798
1799 pub fn peek_nth_token(&self, mut n: usize) -> TokenWithLocation {
1801 let mut index = 0;
1802 loop {
1803 let token = self.0.get(index);
1804 index += 1;
1805 match token.map(|x| &x.token) {
1806 Some(Token::Whitespace(_)) => continue,
1807 _ => {
1808 if n == 0 {
1809 return token.cloned().unwrap_or(TokenWithLocation::eof());
1810 }
1811 n -= 1;
1812 }
1813 }
1814 }
1815 }
1816
1817 pub fn next_token(&mut self) -> TokenWithLocation {
1821 loop {
1822 let Some(token) = self.0.first() else {
1823 return TokenWithLocation::eof();
1824 };
1825 self.0 = &self.0[1..];
1826 match token.token {
1827 Token::Whitespace(_) => continue,
1828 _ => return token.clone(),
1829 }
1830 }
1831 }
1832
1833 pub fn next_token_no_skip(&mut self) -> Option<&TokenWithLocation> {
1835 if self.0.is_empty() {
1836 None
1837 } else {
1838 let (first, rest) = self.0.split_at(1);
1839 self.0 = rest;
1840 Some(&first[0])
1841 }
1842 }
1843
1844 pub fn expected<T>(&self, expected: &str) -> ModalResult<T> {
1846 parser_err!("expected {}, found: {}", expected, self.peek_token().token)
1847 }
1848
1849 pub fn expected_at<T>(&mut self, checkpoint: Self, expected: &str) -> ModalResult<T> {
1851 *self = checkpoint;
1852 self.expected(expected)
1853 }
1854
1855 pub fn parse_word(&mut self, expected: &str) -> bool {
1858 match self.peek_token().token {
1859 Token::Word(w) if w.value.to_uppercase() == expected => {
1860 self.next_token();
1861 true
1862 }
1863 _ => false,
1864 }
1865 }
1866
1867 pub fn expect_word(&mut self, expected: &str) -> ModalResult<()> {
1868 if self.parse_word(expected) {
1869 Ok(())
1870 } else {
1871 self.expected(expected)
1872 }
1873 }
1874
1875 #[must_use]
1877 pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
1878 match self.peek_token().token {
1879 Token::Word(w) if expected == w.keyword => {
1880 self.next_token();
1881 true
1882 }
1883 _ => false,
1884 }
1885 }
1886
1887 #[must_use]
1889 pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
1890 let checkpoint = *self;
1891 for &keyword in keywords {
1892 if !self.parse_keyword(keyword) {
1893 *self = checkpoint;
1896 return false;
1897 }
1898 }
1899 true
1900 }
1901
1902 #[must_use]
1904 pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
1905 match self.peek_token().token {
1906 Token::Word(w) => {
1907 keywords
1908 .iter()
1909 .find(|keyword| **keyword == w.keyword)
1910 .map(|keyword| {
1911 self.next_token();
1912 *keyword
1913 })
1914 }
1915 _ => None,
1916 }
1917 }
1918
1919 pub fn peek_nth_any_of_keywords(&mut self, n: usize, keywords: &[Keyword]) -> bool {
1920 match self.peek_nth_token(n).token {
1921 Token::Word(w) => keywords.contains(&w.keyword),
1922 _ => false,
1923 }
1924 }
1925
1926 pub fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> ModalResult<Keyword> {
1928 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
1929 Ok(keyword)
1930 } else {
1931 let keywords: Vec<String> = keywords.iter().map(|x| format!("{:?}", x)).collect();
1932 self.expected(&format!("one of {}", keywords.join(" or ")))
1933 }
1934 }
1935
1936 pub fn expect_keyword(&mut self, expected: Keyword) -> ModalResult<()> {
1938 if self.parse_keyword(expected) {
1939 Ok(())
1940 } else {
1941 self.expected(format!("{:?}", &expected).as_str())
1942 }
1943 }
1944
1945 pub fn expect_keywords(&mut self, expected: &[Keyword]) -> ModalResult<()> {
1948 for &kw in expected {
1949 self.expect_keyword(kw)?;
1950 }
1951 Ok(())
1952 }
1953
1954 #[must_use]
1956 pub fn consume_token(&mut self, expected: &Token) -> bool {
1957 if self.peek_token() == *expected {
1958 self.next_token();
1959 true
1960 } else {
1961 false
1962 }
1963 }
1964
1965 pub fn expect_token(&mut self, expected: &Token) -> ModalResult<()> {
1967 if self.consume_token(expected) {
1968 Ok(())
1969 } else {
1970 self.expected(&expected.to_string())
1971 }
1972 }
1973
1974 pub fn parse_comma_separated<T, F>(&mut self, mut f: F) -> ModalResult<Vec<T>>
1976 where
1977 F: FnMut(&mut Self) -> ModalResult<T>,
1978 {
1979 let mut values = vec![];
1980 loop {
1981 values.push(f(self)?);
1982 if !self.consume_token(&Token::Comma) {
1983 break;
1984 }
1985 }
1986 Ok(values)
1987 }
1988
1989 #[must_use]
1992 fn maybe_parse<T, F>(&mut self, mut f: F) -> Option<T>
1993 where
1994 F: FnMut(&mut Self) -> ModalResult<T>,
1995 {
1996 let checkpoint = *self;
1997 match f(self) {
1998 Ok(t) => Some(t),
1999 _ => {
2000 *self = checkpoint;
2001 None
2002 }
2003 }
2004 }
2005
2006 pub fn parse_all_or_distinct(&mut self) -> ModalResult<bool> {
2009 let all = self.parse_keyword(Keyword::ALL);
2010 let distinct = self.parse_keyword(Keyword::DISTINCT);
2011 if all && distinct {
2012 parser_err!("Cannot specify both ALL and DISTINCT")
2013 } else {
2014 Ok(distinct)
2015 }
2016 }
2017
2018 pub fn parse_all_or_distinct_on(&mut self) -> ModalResult<Distinct> {
2020 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::ON]) {
2021 self.expect_token(&Token::LParen)?;
2022 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
2023 self.expect_token(&Token::RParen)?;
2024 return Ok(Distinct::DistinctOn(exprs));
2025 } else if self.parse_keyword(Keyword::DISTINCT) {
2026 return Ok(Distinct::Distinct);
2027 };
2028 _ = self.parse_keyword(Keyword::ALL);
2029 Ok(Distinct::All)
2030 }
2031
2032 pub fn parse_create(&mut self) -> ModalResult<Statement> {
2034 let or_replace = self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]);
2035 let temporary = self
2036 .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
2037 .is_some();
2038 if self.parse_keyword(Keyword::TABLE) {
2039 self.parse_create_table(or_replace, temporary)
2040 } else if self.parse_keyword(Keyword::VIEW) {
2041 self.parse_create_view(false, or_replace)
2042 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
2043 self.parse_create_view(true, or_replace)
2044 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::SOURCE]) {
2045 parser_err!("CREATE MATERIALIZED SOURCE has been deprecated, use CREATE TABLE instead")
2046 } else if self.parse_keyword(Keyword::SOURCE) {
2047 self.parse_create_source(or_replace, temporary)
2048 } else if self.parse_keyword(Keyword::SINK) {
2049 self.parse_create_sink(or_replace)
2050 } else if self.parse_keyword(Keyword::SUBSCRIPTION) {
2051 self.parse_create_subscription(or_replace)
2052 } else if self.parse_keyword(Keyword::CONNECTION) {
2053 self.parse_create_connection()
2054 } else if self.parse_keyword(Keyword::FUNCTION) {
2055 self.parse_create_function(or_replace, temporary)
2056 } else if self.parse_keyword(Keyword::AGGREGATE) {
2057 self.parse_create_aggregate(or_replace)
2058 } else if or_replace {
2059 self.expected(
2060 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or [MATERIALIZED] SOURCE or SINK or FUNCTION after CREATE OR REPLACE",
2061 )
2062 } else if self.parse_keyword(Keyword::INDEX) {
2063 self.parse_create_index(false)
2064 } else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
2065 self.parse_create_index(true)
2066 } else if self.parse_keyword(Keyword::SCHEMA) {
2067 self.parse_create_schema()
2068 } else if self.parse_keyword(Keyword::DATABASE) {
2069 self.parse_create_database()
2070 } else if self.parse_keyword(Keyword::USER) {
2071 self.parse_create_user()
2072 } else if self.parse_keyword(Keyword::SECRET) {
2073 self.parse_create_secret()
2074 } else {
2075 self.expected("an object type after CREATE")
2076 }
2077 }
2078
2079 pub fn parse_create_schema(&mut self) -> ModalResult<Statement> {
2080 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2081 let (schema_name, owner) = if self.parse_keyword(Keyword::AUTHORIZATION) {
2082 let owner = self.parse_object_name()?;
2083 (owner.clone(), Some(owner))
2084 } else {
2085 let schema_name = self.parse_object_name()?;
2086 let owner = if self.parse_keyword(Keyword::AUTHORIZATION) {
2087 Some(self.parse_object_name()?)
2088 } else {
2089 None
2090 };
2091 (schema_name, owner)
2092 };
2093 Ok(Statement::CreateSchema {
2094 schema_name,
2095 if_not_exists,
2096 owner,
2097 })
2098 }
2099
2100 pub fn parse_create_database(&mut self) -> ModalResult<Statement> {
2101 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2102 let db_name = self.parse_object_name()?;
2103 let _ = self.parse_keyword(Keyword::WITH);
2104
2105 let mut owner = None;
2106 let mut resource_group = None;
2107
2108 while let Some(keyword) =
2109 self.parse_one_of_keywords(&[Keyword::OWNER, Keyword::RESOURCE_GROUP])
2110 {
2111 match keyword {
2112 Keyword::OWNER => {
2113 if owner.is_some() {
2114 parser_err!("duplicate OWNER clause in CREATE DATABASE");
2115 }
2116
2117 let _ = self.consume_token(&Token::Eq);
2118 owner = Some(self.parse_object_name()?);
2119 }
2120 Keyword::RESOURCE_GROUP => {
2121 if resource_group.is_some() {
2122 parser_err!("duplicate RESOURCE_GROUP clause in CREATE DATABASE");
2123 }
2124
2125 let _ = self.consume_token(&Token::Eq);
2126 resource_group = Some(self.parse_set_variable()?);
2127 }
2128 _ => unreachable!(),
2129 }
2130 }
2131
2132 Ok(Statement::CreateDatabase {
2133 db_name,
2134 if_not_exists,
2135 owner,
2136 resource_group,
2137 })
2138 }
2139
2140 pub fn parse_create_view(
2141 &mut self,
2142 materialized: bool,
2143 or_replace: bool,
2144 ) -> ModalResult<Statement> {
2145 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2146 let name = self.parse_object_name()?;
2149 let columns = self.parse_parenthesized_column_list(Optional)?;
2150 let with_options = self.parse_options_with_preceding_keyword(Keyword::WITH)?;
2151 self.expect_keyword(Keyword::AS)?;
2152 let query = Box::new(self.parse_query()?);
2153 let emit_mode = if materialized {
2154 self.parse_emit_mode()?
2155 } else {
2156 None
2157 };
2158 Ok(Statement::CreateView {
2160 if_not_exists,
2161 name,
2162 columns,
2163 query,
2164 materialized,
2165 or_replace,
2166 with_options,
2167 emit_mode,
2168 })
2169 }
2170
2171 pub fn parse_create_source(
2180 &mut self,
2181 _or_replace: bool,
2182 temporary: bool,
2183 ) -> ModalResult<Statement> {
2184 impl_parse_to!(if_not_exists => [Keyword::IF, Keyword::NOT, Keyword::EXISTS], self);
2185 impl_parse_to!(source_name: ObjectName, self);
2186
2187 let (columns, constraints, source_watermarks, wildcard_idx) =
2189 self.parse_columns_with_watermark()?;
2190 let include_options = self.parse_include_options()?;
2191
2192 let with_options = self.parse_with_properties()?;
2193 let option = with_options
2194 .iter()
2195 .find(|&opt| opt.name.real_value() == UPSTREAM_SOURCE_KEY);
2196 let connector: String = option.map(|opt| opt.value.to_string()).unwrap_or_default();
2197 let cdc_source_job = connector.contains("-cdc");
2198 if cdc_source_job && (!columns.is_empty() || !constraints.is_empty()) {
2199 parser_err!("CDC source cannot define columns and constraints");
2200 }
2201
2202 let format_encode = self.parse_format_encode_with_connector(&connector, cdc_source_job)?;
2205
2206 let stmt = CreateSourceStatement {
2207 temporary,
2208 if_not_exists,
2209 columns,
2210 wildcard_idx,
2211 constraints,
2212 source_name,
2213 with_properties: WithProperties(with_options),
2214 format_encode,
2215 source_watermarks,
2216 include_column_options: include_options,
2217 };
2218
2219 Ok(Statement::CreateSource { stmt })
2220 }
2221
2222 pub fn parse_create_sink(&mut self, _or_replace: bool) -> ModalResult<Statement> {
2230 Ok(Statement::CreateSink {
2231 stmt: CreateSinkStatement::parse_to(self)?,
2232 })
2233 }
2234
2235 pub fn parse_create_subscription(&mut self, _or_replace: bool) -> ModalResult<Statement> {
2243 Ok(Statement::CreateSubscription {
2244 stmt: CreateSubscriptionStatement::parse_to(self)?,
2245 })
2246 }
2247
2248 pub fn parse_create_connection(&mut self) -> ModalResult<Statement> {
2254 Ok(Statement::CreateConnection {
2255 stmt: CreateConnectionStatement::parse_to(self)?,
2256 })
2257 }
2258
2259 pub fn parse_create_function(
2260 &mut self,
2261 or_replace: bool,
2262 temporary: bool,
2263 ) -> ModalResult<Statement> {
2264 impl_parse_to!(if_not_exists => [Keyword::IF, Keyword::NOT, Keyword::EXISTS], self);
2265
2266 let FunctionDesc { name, args } = self.parse_function_desc()?;
2267
2268 let return_type = if self.parse_keyword(Keyword::RETURNS) {
2269 if self.parse_keyword(Keyword::TABLE) {
2270 self.expect_token(&Token::LParen)?;
2271 let mut values = vec![];
2272 loop {
2273 values.push(self.parse_table_column_def()?);
2274 let comma = self.consume_token(&Token::Comma);
2275 if self.consume_token(&Token::RParen) {
2276 break;
2278 } else if !comma {
2279 return self.expected("',' or ')'");
2280 }
2281 }
2282 Some(CreateFunctionReturns::Table(values))
2283 } else {
2284 Some(CreateFunctionReturns::Value(self.parse_data_type()?))
2285 }
2286 } else {
2287 None
2288 };
2289
2290 let params = self.parse_create_function_body()?;
2291 let with_options = self.parse_options_with_preceding_keyword(Keyword::WITH)?;
2292 let with_options = with_options.try_into()?;
2293 Ok(Statement::CreateFunction {
2294 or_replace,
2295 temporary,
2296 if_not_exists,
2297 name,
2298 args,
2299 returns: return_type,
2300 params,
2301 with_options,
2302 })
2303 }
2304
2305 fn parse_create_aggregate(&mut self, or_replace: bool) -> ModalResult<Statement> {
2306 impl_parse_to!(if_not_exists => [Keyword::IF, Keyword::NOT, Keyword::EXISTS], self);
2307
2308 let name = self.parse_object_name()?;
2309 self.expect_token(&Token::LParen)?;
2310 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
2311 self.expect_token(&Token::RParen)?;
2312
2313 self.expect_keyword(Keyword::RETURNS)?;
2314 let returns = self.parse_data_type()?;
2315
2316 let append_only = self.parse_keywords(&[Keyword::APPEND, Keyword::ONLY]);
2317 let params = self.parse_create_function_body()?;
2318
2319 Ok(Statement::CreateAggregate {
2320 or_replace,
2321 if_not_exists,
2322 name,
2323 args,
2324 returns,
2325 append_only,
2326 params,
2327 })
2328 }
2329
2330 pub fn parse_declare(&mut self) -> ModalResult<Statement> {
2331 Ok(Statement::DeclareCursor {
2332 stmt: DeclareCursorStatement::parse_to(self)?,
2333 })
2334 }
2335
2336 pub fn parse_fetch_cursor(&mut self) -> ModalResult<Statement> {
2337 Ok(Statement::FetchCursor {
2338 stmt: FetchCursorStatement::parse_to(self)?,
2339 })
2340 }
2341
2342 pub fn parse_close_cursor(&mut self) -> ModalResult<Statement> {
2343 Ok(Statement::CloseCursor {
2344 stmt: CloseCursorStatement::parse_to(self)?,
2345 })
2346 }
2347
2348 fn parse_table_column_def(&mut self) -> ModalResult<TableColumnDef> {
2349 Ok(TableColumnDef {
2350 name: self.parse_identifier_non_reserved()?,
2351 data_type: self.parse_data_type()?,
2352 })
2353 }
2354
2355 fn parse_function_arg(&mut self) -> ModalResult<OperateFunctionArg> {
2356 let mode = if self.parse_keyword(Keyword::IN) {
2357 Some(ArgMode::In)
2358 } else if self.parse_keyword(Keyword::OUT) {
2359 Some(ArgMode::Out)
2360 } else if self.parse_keyword(Keyword::INOUT) {
2361 Some(ArgMode::InOut)
2362 } else {
2363 None
2364 };
2365
2366 let mut name = None;
2368 let mut data_type = self.parse_data_type()?;
2369 if let DataType::Custom(n) = &data_type
2370 && !matches!(self.peek_token().token, Token::Comma | Token::RParen)
2371 {
2372 name = Some(n.0[0].clone());
2374 data_type = self.parse_data_type()?;
2375 }
2376
2377 let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
2378 {
2379 Some(self.parse_expr()?)
2380 } else {
2381 None
2382 };
2383 Ok(OperateFunctionArg {
2384 mode,
2385 name,
2386 data_type,
2387 default_expr,
2388 })
2389 }
2390
2391 fn parse_create_function_body(&mut self) -> ModalResult<CreateFunctionBody> {
2392 let mut body = CreateFunctionBody::default();
2393 loop {
2394 fn ensure_not_set<T>(field: &Option<T>, name: &str) -> ModalResult<()> {
2395 if field.is_some() {
2396 parser_err!("{name} specified more than once");
2397 }
2398 Ok(())
2399 }
2400 if self.parse_keyword(Keyword::AS) {
2401 ensure_not_set(&body.as_, "AS")?;
2402 body.as_ = Some(self.parse_function_definition()?);
2403 } else if self.parse_keyword(Keyword::LANGUAGE) {
2404 ensure_not_set(&body.language, "LANGUAGE")?;
2405 body.language = Some(self.parse_identifier()?);
2406 } else if self.parse_keyword(Keyword::RUNTIME) {
2407 ensure_not_set(&body.runtime, "RUNTIME")?;
2408 body.runtime = Some(self.parse_identifier()?);
2409 } else if self.parse_keyword(Keyword::IMMUTABLE) {
2410 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
2411 body.behavior = Some(FunctionBehavior::Immutable);
2412 } else if self.parse_keyword(Keyword::STABLE) {
2413 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
2414 body.behavior = Some(FunctionBehavior::Stable);
2415 } else if self.parse_keyword(Keyword::VOLATILE) {
2416 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
2417 body.behavior = Some(FunctionBehavior::Volatile);
2418 } else if self.parse_keyword(Keyword::RETURN) {
2419 ensure_not_set(&body.return_, "RETURN")?;
2420 body.return_ = Some(self.parse_expr()?);
2421 } else if self.parse_keyword(Keyword::USING) {
2422 ensure_not_set(&body.using, "USING")?;
2423 body.using = Some(self.parse_create_function_using()?);
2424 } else {
2425 return Ok(body);
2426 }
2427 }
2428 }
2429
2430 fn parse_create_function_using(&mut self) -> ModalResult<CreateFunctionUsing> {
2431 let keyword = self.expect_one_of_keywords(&[Keyword::LINK, Keyword::BASE64])?;
2432
2433 match keyword {
2434 Keyword::LINK => {
2435 let uri = self.parse_literal_string()?;
2436 Ok(CreateFunctionUsing::Link(uri))
2437 }
2438 Keyword::BASE64 => {
2439 let base64 = self.parse_literal_string()?;
2440 Ok(CreateFunctionUsing::Base64(base64))
2441 }
2442 _ => unreachable!("{}", keyword),
2443 }
2444 }
2445
2446 fn parse_create_user(&mut self) -> ModalResult<Statement> {
2454 Ok(Statement::CreateUser(CreateUserStatement::parse_to(self)?))
2455 }
2456
2457 fn parse_create_secret(&mut self) -> ModalResult<Statement> {
2458 Ok(Statement::CreateSecret {
2459 stmt: CreateSecretStatement::parse_to(self)?,
2460 })
2461 }
2462
2463 pub fn parse_with_properties(&mut self) -> ModalResult<Vec<SqlOption>> {
2464 Ok(self
2465 .parse_options_with_preceding_keyword(Keyword::WITH)?
2466 .to_vec())
2467 }
2468
2469 pub fn parse_discard(&mut self) -> ModalResult<Statement> {
2470 self.expect_keyword(Keyword::ALL)?;
2471 Ok(Statement::Discard(DiscardType::All))
2472 }
2473
2474 pub fn parse_drop(&mut self) -> ModalResult<Statement> {
2475 if self.parse_keyword(Keyword::FUNCTION) {
2476 return self.parse_drop_function();
2477 } else if self.parse_keyword(Keyword::AGGREGATE) {
2478 return self.parse_drop_aggregate();
2479 }
2480 Ok(Statement::Drop(DropStatement::parse_to(self)?))
2481 }
2482
2483 fn parse_drop_function(&mut self) -> ModalResult<Statement> {
2488 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
2489 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
2490 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
2491 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
2492 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
2493 _ => None,
2494 };
2495 Ok(Statement::DropFunction {
2496 if_exists,
2497 func_desc,
2498 option,
2499 })
2500 }
2501
2502 fn parse_drop_aggregate(&mut self) -> ModalResult<Statement> {
2507 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
2508 let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
2509 let option = match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
2510 Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
2511 Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
2512 _ => None,
2513 };
2514 Ok(Statement::DropAggregate {
2515 if_exists,
2516 func_desc,
2517 option,
2518 })
2519 }
2520
2521 fn parse_function_desc(&mut self) -> ModalResult<FunctionDesc> {
2522 let name = self.parse_object_name()?;
2523
2524 let args = if self.consume_token(&Token::LParen) {
2525 if self.consume_token(&Token::RParen) {
2526 Some(vec![])
2527 } else {
2528 let args = self.parse_comma_separated(Parser::parse_function_arg)?;
2529 self.expect_token(&Token::RParen)?;
2530 Some(args)
2531 }
2532 } else {
2533 None
2534 };
2535
2536 Ok(FunctionDesc { name, args })
2537 }
2538
2539 pub fn parse_create_index(&mut self, unique: bool) -> ModalResult<Statement> {
2540 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2541 let index_name = self.parse_object_name()?;
2542 self.expect_keyword(Keyword::ON)?;
2543 let table_name = self.parse_object_name()?;
2544 self.expect_token(&Token::LParen)?;
2545 let columns = self.parse_comma_separated(Parser::parse_order_by_expr)?;
2546 self.expect_token(&Token::RParen)?;
2547 let mut include = vec![];
2548 if self.parse_keyword(Keyword::INCLUDE) {
2549 self.expect_token(&Token::LParen)?;
2550 include = self.parse_comma_separated(Parser::parse_identifier_non_reserved)?;
2551 self.expect_token(&Token::RParen)?;
2552 }
2553 let mut distributed_by = vec![];
2554 if self.parse_keywords(&[Keyword::DISTRIBUTED, Keyword::BY]) {
2555 self.expect_token(&Token::LParen)?;
2556 distributed_by = self.parse_comma_separated(Parser::parse_expr)?;
2557 self.expect_token(&Token::RParen)?;
2558 }
2559 Ok(Statement::CreateIndex {
2560 name: index_name,
2561 table_name,
2562 columns,
2563 include,
2564 distributed_by,
2565 unique,
2566 if_not_exists,
2567 })
2568 }
2569
2570 pub fn parse_with_version_column(&mut self) -> ModalResult<Option<Ident>> {
2571 if self.parse_keywords(&[Keyword::WITH, Keyword::VERSION, Keyword::COLUMN]) {
2572 self.expect_token(&Token::LParen)?;
2573 let name = self.parse_identifier_non_reserved()?;
2574 self.expect_token(&Token::RParen)?;
2575 Ok(Some(name))
2576 } else {
2577 Ok(None)
2578 }
2579 }
2580
2581 pub fn parse_on_conflict(&mut self) -> ModalResult<Option<OnConflict>> {
2582 if self.parse_keywords(&[Keyword::ON, Keyword::CONFLICT]) {
2583 self.parse_handle_conflict_behavior()
2584 } else {
2585 Ok(None)
2586 }
2587 }
2588
2589 pub fn parse_create_table(
2590 &mut self,
2591 or_replace: bool,
2592 temporary: bool,
2593 ) -> ModalResult<Statement> {
2594 let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
2595 let table_name = self.parse_object_name()?;
2596 let (columns, constraints, source_watermarks, wildcard_idx) =
2598 self.parse_columns_with_watermark()?;
2599
2600 let append_only = if self.parse_keyword(Keyword::APPEND) {
2601 self.expect_keyword(Keyword::ONLY)?;
2602 true
2603 } else {
2604 false
2605 };
2606
2607 let on_conflict = self.parse_on_conflict()?;
2608
2609 let with_version_column = self.parse_with_version_column()?;
2610 let include_options = self.parse_include_options()?;
2611
2612 let with_options = self.parse_with_properties()?;
2614
2615 let option = with_options
2616 .iter()
2617 .find(|&opt| opt.name.real_value() == UPSTREAM_SOURCE_KEY);
2618 let connector = option.map(|opt| opt.value.to_string());
2619 let contain_webhook =
2620 connector.is_some() && connector.as_ref().unwrap().contains(WEBHOOK_CONNECTOR);
2621
2622 let format_encode = if let Some(connector) = connector
2624 && !contain_webhook
2625 {
2626 Some(self.parse_format_encode_with_connector(&connector, false)?)
2627 } else {
2628 None };
2630 let query = if self.parse_keyword(Keyword::AS) {
2632 if !source_watermarks.is_empty() {
2633 parser_err!("Watermarks can't be defined on table created by CREATE TABLE AS");
2634 }
2635 Some(Box::new(self.parse_query()?))
2636 } else {
2637 None
2638 };
2639
2640 let cdc_table_info = if self.parse_keyword(Keyword::FROM) {
2641 let source_name = self.parse_object_name()?;
2642 self.expect_keyword(Keyword::TABLE)?;
2643 let external_table_name = self.parse_literal_string()?;
2644 Some(CdcTableInfo {
2645 source_name,
2646 external_table_name,
2647 })
2648 } else {
2649 None
2650 };
2651
2652 let webhook_info = if self.parse_keyword(Keyword::VALIDATE) {
2653 if !contain_webhook {
2654 parser_err!("VALIDATE is only supported for tables created with webhook source");
2655 }
2656
2657 let wait_for_persistence = with_options
2658 .iter()
2659 .find(|&opt| opt.name.real_value() == WEBHOOK_WAIT_FOR_PERSISTENCE)
2660 .map(|opt| opt.value.to_string().eq_ignore_ascii_case("true"))
2661 .unwrap_or(true);
2662 let secret_ref = if self.parse_keyword(Keyword::SECRET) {
2663 let secret_ref = self.parse_secret_ref()?;
2664 if secret_ref.ref_as == SecretRefAsType::File {
2665 parser_err!("Secret for SECURE_COMPARE() does not support AS FILE");
2666 };
2667 Some(secret_ref)
2668 } else {
2669 None
2670 };
2671
2672 self.expect_keyword(Keyword::AS)?;
2673 let signature_expr = self.parse_function()?;
2674
2675 Some(WebhookSourceInfo {
2676 secret_ref,
2677 signature_expr,
2678 wait_for_persistence,
2679 })
2680 } else {
2681 None
2682 };
2683
2684 let engine = if self.parse_keyword(Keyword::ENGINE) {
2685 self.expect_token(&Token::Eq)?;
2686 let engine_name = self.parse_object_name()?;
2687 if "iceberg".eq_ignore_ascii_case(&engine_name.real_value()) {
2688 Engine::Iceberg
2689 } else if "hummock".eq_ignore_ascii_case(&engine_name.real_value()) {
2690 Engine::Hummock
2691 } else {
2692 parser_err!("Unsupported engine: {}", engine_name);
2693 }
2694 } else {
2695 Engine::Hummock
2696 };
2697
2698 Ok(Statement::CreateTable {
2699 name: table_name,
2700 temporary,
2701 columns,
2702 wildcard_idx,
2703 constraints,
2704 with_options,
2705 or_replace,
2706 if_not_exists,
2707 format_encode,
2708 source_watermarks,
2709 append_only,
2710 on_conflict,
2711 with_version_column,
2712 query,
2713 cdc_table_info,
2714 include_column_options: include_options,
2715 webhook_info,
2716 engine,
2717 })
2718 }
2719
2720 pub fn parse_include_options(&mut self) -> ModalResult<IncludeOption> {
2721 let mut options = vec![];
2722 while self.parse_keyword(Keyword::INCLUDE) {
2723 let column_type = self.parse_identifier()?;
2724
2725 let mut column_inner_field = None;
2726 let mut header_inner_expect_type = None;
2727 if let Token::SingleQuotedString(inner_field) = self.peek_token().token {
2728 self.next_token();
2729 column_inner_field = Some(inner_field);
2730
2731 header_inner_expect_type =
2753 opt(parser_v2::data_type.verify(|dt| !matches!(dt, DataType::Custom(_))))
2754 .parse_next(self)?;
2755 }
2756
2757 let mut column_alias = None;
2758 if self.parse_keyword(Keyword::AS) {
2759 column_alias = Some(self.parse_identifier()?);
2760 }
2761
2762 options.push(IncludeOptionItem {
2763 column_type,
2764 inner_field: column_inner_field,
2765 column_alias,
2766 header_inner_expect_type,
2767 });
2768
2769 let _ = self.consume_token(&Token::Comma);
2771 }
2772 Ok(options)
2773 }
2774
2775 pub fn parse_columns_with_watermark(&mut self) -> ModalResult<ColumnsDefTuple> {
2776 let mut columns = vec![];
2777 let mut constraints = vec![];
2778 let mut watermarks = vec![];
2779 let mut wildcard_idx = None;
2780 if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
2781 return Ok((columns, constraints, watermarks, wildcard_idx));
2782 }
2783
2784 loop {
2785 if self.consume_token(&Token::Mul) {
2786 if wildcard_idx.is_none() {
2787 wildcard_idx = Some(columns.len());
2788 } else {
2789 parser_err!("At most 1 wildcard is allowed in source definetion");
2790 }
2791 } else if let Some(constraint) = self.parse_optional_table_constraint()? {
2792 constraints.push(constraint);
2793 } else if let Some(watermark) = self.parse_optional_watermark()? {
2794 watermarks.push(watermark);
2795 if watermarks.len() > 1 {
2796 parser_err!("Only 1 watermark is allowed to be defined on source.");
2798 }
2799 } else if let Token::Word(_) = self.peek_token().token {
2800 columns.push(self.parse_column_def()?);
2801 } else {
2802 return self.expected("column name or constraint definition");
2803 }
2804 let comma = self.consume_token(&Token::Comma);
2805 if self.consume_token(&Token::RParen) {
2806 break;
2808 } else if !comma {
2809 return self.expected("',' or ')' after column definition");
2810 }
2811 }
2812
2813 Ok((columns, constraints, watermarks, wildcard_idx))
2814 }
2815
2816 fn parse_column_def(&mut self) -> ModalResult<ColumnDef> {
2817 let name = self.parse_identifier_non_reserved()?;
2818 let data_type = if let Token::Word(_) = self.peek_token().token {
2819 Some(self.parse_data_type()?)
2820 } else {
2821 None
2822 };
2823
2824 let collation = if self.parse_keyword(Keyword::COLLATE) {
2825 Some(self.parse_object_name()?)
2826 } else {
2827 None
2828 };
2829 let mut options = vec![];
2830 loop {
2831 if self.parse_keyword(Keyword::CONSTRAINT) {
2832 let name = Some(self.parse_identifier_non_reserved()?);
2833 if let Some(option) = self.parse_optional_column_option()? {
2834 options.push(ColumnOptionDef { name, option });
2835 } else {
2836 return self.expected("constraint details after CONSTRAINT <name>");
2837 }
2838 } else if let Some(option) = self.parse_optional_column_option()? {
2839 options.push(ColumnOptionDef { name: None, option });
2840 } else {
2841 break;
2842 };
2843 }
2844 Ok(ColumnDef {
2845 name,
2846 data_type,
2847 collation,
2848 options,
2849 })
2850 }
2851
2852 pub fn parse_optional_column_option(&mut self) -> ModalResult<Option<ColumnOption>> {
2853 if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
2854 Ok(Some(ColumnOption::NotNull))
2855 } else if self.parse_keyword(Keyword::NULL) {
2856 Ok(Some(ColumnOption::Null))
2857 } else if self.parse_keyword(Keyword::DEFAULT) {
2858 if self.parse_keyword(Keyword::INTERNAL) {
2859 Ok(Some(ColumnOption::DefaultValueInternal {
2860 persisted: Default::default(),
2862 expr: None,
2863 }))
2864 } else {
2865 Ok(Some(ColumnOption::DefaultValue(self.parse_expr()?)))
2866 }
2867 } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
2868 Ok(Some(ColumnOption::Unique { is_primary: true }))
2869 } else if self.parse_keyword(Keyword::UNIQUE) {
2870 Ok(Some(ColumnOption::Unique { is_primary: false }))
2871 } else if self.parse_keyword(Keyword::REFERENCES) {
2872 let foreign_table = self.parse_object_name()?;
2873 let referred_columns = self.parse_parenthesized_column_list(Optional)?;
2876 let mut on_delete = None;
2877 let mut on_update = None;
2878 loop {
2879 if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
2880 on_delete = Some(self.parse_referential_action()?);
2881 } else if on_update.is_none()
2882 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
2883 {
2884 on_update = Some(self.parse_referential_action()?);
2885 } else {
2886 break;
2887 }
2888 }
2889 Ok(Some(ColumnOption::ForeignKey {
2890 foreign_table,
2891 referred_columns,
2892 on_delete,
2893 on_update,
2894 }))
2895 } else if self.parse_keyword(Keyword::CHECK) {
2896 self.expect_token(&Token::LParen)?;
2897 let expr = self.parse_expr()?;
2898 self.expect_token(&Token::RParen)?;
2899 Ok(Some(ColumnOption::Check(expr)))
2900 } else if self.parse_keyword(Keyword::AS) {
2901 Ok(Some(ColumnOption::GeneratedColumns(self.parse_expr()?)))
2902 } else {
2903 Ok(None)
2904 }
2905 }
2906
2907 pub fn parse_handle_conflict_behavior(&mut self) -> ModalResult<Option<OnConflict>> {
2908 if self.parse_keyword(Keyword::OVERWRITE) {
2909 Ok(Some(OnConflict::UpdateFull))
2911 } else if self.parse_keyword(Keyword::IGNORE) {
2912 Ok(Some(OnConflict::Nothing))
2914 } else if self.parse_keywords(&[
2915 Keyword::DO,
2916 Keyword::UPDATE,
2917 Keyword::IF,
2918 Keyword::NOT,
2919 Keyword::NULL,
2920 ]) {
2921 Ok(Some(OnConflict::UpdateIfNotNull))
2922 } else if self.parse_keywords(&[Keyword::DO, Keyword::UPDATE, Keyword::FULL]) {
2923 Ok(Some(OnConflict::UpdateFull))
2924 } else if self.parse_keywords(&[Keyword::DO, Keyword::NOTHING]) {
2925 Ok(Some(OnConflict::Nothing))
2926 } else {
2927 Ok(None)
2928 }
2929 }
2930
2931 pub fn parse_referential_action(&mut self) -> ModalResult<ReferentialAction> {
2932 if self.parse_keyword(Keyword::RESTRICT) {
2933 Ok(ReferentialAction::Restrict)
2934 } else if self.parse_keyword(Keyword::CASCADE) {
2935 Ok(ReferentialAction::Cascade)
2936 } else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
2937 Ok(ReferentialAction::SetNull)
2938 } else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
2939 Ok(ReferentialAction::NoAction)
2940 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
2941 Ok(ReferentialAction::SetDefault)
2942 } else {
2943 self.expected("one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT")
2944 }
2945 }
2946
2947 pub fn parse_optional_watermark(&mut self) -> ModalResult<Option<SourceWatermark>> {
2948 if self.parse_keyword(Keyword::WATERMARK) {
2949 self.expect_keyword(Keyword::FOR)?;
2950 let column = self.parse_identifier_non_reserved()?;
2951 self.expect_keyword(Keyword::AS)?;
2952 let expr = self.parse_expr()?;
2953 Ok(Some(SourceWatermark { column, expr }))
2954 } else {
2955 Ok(None)
2956 }
2957 }
2958
2959 pub fn parse_optional_table_constraint(&mut self) -> ModalResult<Option<TableConstraint>> {
2960 let name = if self.parse_keyword(Keyword::CONSTRAINT) {
2961 Some(self.parse_identifier_non_reserved()?)
2962 } else {
2963 None
2964 };
2965 let checkpoint = *self;
2966 let token = self.next_token();
2967 match token.token {
2968 Token::Word(w) if w.keyword == Keyword::PRIMARY || w.keyword == Keyword::UNIQUE => {
2969 let is_primary = w.keyword == Keyword::PRIMARY;
2970 if is_primary {
2971 self.expect_keyword(Keyword::KEY)?;
2972 }
2973 let columns = self.parse_parenthesized_column_list(Mandatory)?;
2974 Ok(Some(TableConstraint::Unique {
2975 name,
2976 columns,
2977 is_primary,
2978 }))
2979 }
2980 Token::Word(w) if w.keyword == Keyword::FOREIGN => {
2981 self.expect_keyword(Keyword::KEY)?;
2982 let columns = self.parse_parenthesized_column_list(Mandatory)?;
2983 self.expect_keyword(Keyword::REFERENCES)?;
2984 let foreign_table = self.parse_object_name()?;
2985 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
2986 let mut on_delete = None;
2987 let mut on_update = None;
2988 loop {
2989 if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
2990 on_delete = Some(self.parse_referential_action()?);
2991 } else if on_update.is_none()
2992 && self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
2993 {
2994 on_update = Some(self.parse_referential_action()?);
2995 } else {
2996 break;
2997 }
2998 }
2999 Ok(Some(TableConstraint::ForeignKey {
3000 name,
3001 columns,
3002 foreign_table,
3003 referred_columns,
3004 on_delete,
3005 on_update,
3006 }))
3007 }
3008 Token::Word(w) if w.keyword == Keyword::CHECK => {
3009 self.expect_token(&Token::LParen)?;
3010 let expr = Box::new(self.parse_expr()?);
3011 self.expect_token(&Token::RParen)?;
3012 Ok(Some(TableConstraint::Check { name, expr }))
3013 }
3014 _ => {
3015 *self = checkpoint;
3016 if name.is_some() {
3017 self.expected("PRIMARY, UNIQUE, FOREIGN, or CHECK")
3018 } else {
3019 Ok(None)
3020 }
3021 }
3022 }
3023 }
3024
3025 pub fn parse_options_with_preceding_keyword(
3026 &mut self,
3027 keyword: Keyword,
3028 ) -> ModalResult<Vec<SqlOption>> {
3029 if self.parse_keyword(keyword) {
3030 self.expect_token(&Token::LParen)?;
3031 self.parse_options_inner()
3032 } else {
3033 Ok(vec![])
3034 }
3035 }
3036
3037 pub fn parse_options(&mut self) -> ModalResult<Vec<SqlOption>> {
3038 if self.peek_token() == Token::LParen {
3039 self.next_token();
3040 self.parse_options_inner()
3041 } else {
3042 Ok(vec![])
3043 }
3044 }
3045
3046 pub fn parse_options_inner(&mut self) -> ModalResult<Vec<SqlOption>> {
3048 let mut values = vec![];
3049 loop {
3050 values.push(Parser::parse_sql_option(self)?);
3051 let comma = self.consume_token(&Token::Comma);
3052 if self.consume_token(&Token::RParen) {
3053 break;
3055 } else if !comma {
3056 return self.expected("',' or ')' after option definition");
3057 }
3058 }
3059 Ok(values)
3060 }
3061
3062 pub fn parse_sql_option(&mut self) -> ModalResult<SqlOption> {
3063 const CONNECTION_REF_KEY: &str = "connection";
3064 const BACKFILL_ORDER: &str = "backfill_order";
3065
3066 let name = self.parse_object_name()?;
3067 self.expect_token(&Token::Eq)?;
3068 let value = {
3069 if name.real_value().eq_ignore_ascii_case(CONNECTION_REF_KEY) {
3070 let connection_name = self.parse_object_name()?;
3071 let connection_name = match connection_name.0.as_slice() {
3073 [ident] if ident.real_value() == CONNECTION_REF_KEY => {
3074 self.parse_object_name()?
3075 }
3076 _ => connection_name,
3077 };
3078 SqlOptionValue::ConnectionRef(ConnectionRefValue { connection_name })
3079 } else if name.real_value().eq_ignore_ascii_case(BACKFILL_ORDER) {
3080 let order = self.parse_backfill_order_strategy()?;
3081 SqlOptionValue::BackfillOrder(order)
3082 } else {
3083 self.parse_value_and_obj_ref::<false>()?
3084 }
3085 };
3086 Ok(SqlOption { name, value })
3087 }
3088
3089 pub fn parse_since(&mut self) -> ModalResult<Since> {
3090 if self.parse_keyword(Keyword::SINCE) {
3091 let checkpoint = *self;
3092 let token = self.next_token();
3093 match token.token {
3094 Token::Word(w) => {
3095 let ident = w.to_ident()?;
3096 if ident.real_value() == "proctime" || ident.real_value() == "now" {
3098 self.expect_token(&Token::LParen)?;
3099 self.expect_token(&Token::RParen)?;
3100 Ok(Since::ProcessTime)
3101 } else if ident.real_value() == "begin" {
3102 self.expect_token(&Token::LParen)?;
3103 self.expect_token(&Token::RParen)?;
3104 Ok(Since::Begin)
3105 } else {
3106 parser_err!(
3107 "Expected proctime(), begin() or now(), found: {}",
3108 ident.real_value()
3109 )
3110 }
3111 }
3112 Token::Number(s) => {
3113 let num = s
3114 .parse::<u64>()
3115 .map_err(|e| StrError(format!("Could not parse '{}' as u64: {}", s, e)))?;
3116 Ok(Since::TimestampMsNum(num))
3117 }
3118 _ => self.expected_at(checkpoint, "proctime(), begin() , now(), Number"),
3119 }
3120 } else if self.parse_word("FULL") {
3121 Ok(Since::Full)
3122 } else {
3123 Ok(Since::ProcessTime)
3124 }
3125 }
3126
3127 pub fn parse_emit_mode(&mut self) -> ModalResult<Option<EmitMode>> {
3128 if self.parse_keyword(Keyword::EMIT) {
3129 match self.parse_one_of_keywords(&[Keyword::IMMEDIATELY, Keyword::ON]) {
3130 Some(Keyword::IMMEDIATELY) => Ok(Some(EmitMode::Immediately)),
3131 Some(Keyword::ON) => {
3132 self.expect_keywords(&[Keyword::WINDOW, Keyword::CLOSE])?;
3133 Ok(Some(EmitMode::OnWindowClose))
3134 }
3135 Some(_) => unreachable!(),
3136 None => self.expected("IMMEDIATELY or ON WINDOW CLOSE after EMIT"),
3137 }
3138 } else {
3139 Ok(None)
3140 }
3141 }
3142
3143 pub fn parse_alter(&mut self) -> ModalResult<Statement> {
3144 if self.parse_keyword(Keyword::DATABASE) {
3145 self.parse_alter_database()
3146 } else if self.parse_keyword(Keyword::SCHEMA) {
3147 self.parse_alter_schema()
3148 } else if self.parse_keyword(Keyword::TABLE) {
3149 self.parse_alter_table()
3150 } else if self.parse_keyword(Keyword::INDEX) {
3151 self.parse_alter_index()
3152 } else if self.parse_keyword(Keyword::VIEW) {
3153 self.parse_alter_view(false)
3154 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
3155 self.parse_alter_view(true)
3156 } else if self.parse_keyword(Keyword::SINK) {
3157 self.parse_alter_sink()
3158 } else if self.parse_keyword(Keyword::SOURCE) {
3159 self.parse_alter_source()
3160 } else if self.parse_keyword(Keyword::FUNCTION) {
3161 self.parse_alter_function()
3162 } else if self.parse_keyword(Keyword::CONNECTION) {
3163 self.parse_alter_connection()
3164 } else if self.parse_keyword(Keyword::USER) {
3165 self.parse_alter_user()
3166 } else if self.parse_keyword(Keyword::SYSTEM) {
3167 self.parse_alter_system()
3168 } else if self.parse_keyword(Keyword::SUBSCRIPTION) {
3169 self.parse_alter_subscription()
3170 } else if self.parse_keyword(Keyword::SECRET) {
3171 self.parse_alter_secret()
3172 } else if self.parse_word("FRAGMENT") {
3173 self.parse_alter_fragment()
3174 } else {
3175 self.expected(
3176 "DATABASE, FRAGMENT, SCHEMA, TABLE, INDEX, MATERIALIZED, VIEW, SINK, SUBSCRIPTION, SOURCE, FUNCTION, USER, SECRET or SYSTEM after ALTER"
3177 )
3178 }
3179 }
3180
3181 pub fn parse_alter_database(&mut self) -> ModalResult<Statement> {
3182 let database_name = self.parse_object_name()?;
3183 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3184 let owner_name: Ident = self.parse_identifier()?;
3185 AlterDatabaseOperation::ChangeOwner {
3186 new_owner_name: owner_name,
3187 }
3188 } else if self.parse_keyword(Keyword::RENAME) {
3189 if self.parse_keyword(Keyword::TO) {
3190 let database_name = self.parse_object_name()?;
3191 AlterDatabaseOperation::RenameDatabase { database_name }
3192 } else {
3193 return self.expected("TO after RENAME");
3194 }
3195 } else {
3196 return self.expected("OWNER TO after ALTER DATABASE");
3197 };
3198
3199 Ok(Statement::AlterDatabase {
3200 name: database_name,
3201 operation,
3202 })
3203 }
3204
3205 pub fn parse_alter_schema(&mut self) -> ModalResult<Statement> {
3206 let schema_name = self.parse_object_name()?;
3207 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3208 let owner_name: Ident = self.parse_identifier()?;
3209 AlterSchemaOperation::ChangeOwner {
3210 new_owner_name: owner_name,
3211 }
3212 } else if self.parse_keyword(Keyword::RENAME) {
3213 self.expect_keyword(Keyword::TO)?;
3214 let schema_name = self.parse_object_name()?;
3215 AlterSchemaOperation::RenameSchema { schema_name }
3216 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3217 let target_schema = self.parse_object_name()?;
3218 AlterSchemaOperation::SwapRenameSchema { target_schema }
3219 } else {
3220 return self.expected("RENAME, OWNER TO, OR SWAP WITH after ALTER SCHEMA");
3221 };
3222
3223 Ok(Statement::AlterSchema {
3224 name: schema_name,
3225 operation,
3226 })
3227 }
3228
3229 pub fn parse_alter_user(&mut self) -> ModalResult<Statement> {
3230 Ok(Statement::AlterUser(AlterUserStatement::parse_to(self)?))
3231 }
3232
3233 pub fn parse_alter_table(&mut self) -> ModalResult<Statement> {
3234 let _ = self.parse_keyword(Keyword::ONLY);
3235 let table_name = self.parse_object_name()?;
3236 let operation = if self.parse_keyword(Keyword::ADD) {
3237 if let Some(constraint) = self.parse_optional_table_constraint()? {
3238 AlterTableOperation::AddConstraint(constraint)
3239 } else {
3240 let _ = self.parse_keyword(Keyword::COLUMN);
3241 let _if_not_exists =
3242 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3243 let column_def = self.parse_column_def()?;
3244 AlterTableOperation::AddColumn { column_def }
3245 }
3246 } else if self.parse_keywords(&[Keyword::DROP, Keyword::CONNECTOR]) {
3247 AlterTableOperation::DropConnector
3248 } else if self.parse_keyword(Keyword::RENAME) {
3249 if self.parse_keyword(Keyword::CONSTRAINT) {
3250 let old_name = self.parse_identifier_non_reserved()?;
3251 self.expect_keyword(Keyword::TO)?;
3252 let new_name = self.parse_identifier_non_reserved()?;
3253 AlterTableOperation::RenameConstraint { old_name, new_name }
3254 } else if self.parse_keyword(Keyword::TO) {
3255 let table_name = self.parse_object_name()?;
3256 AlterTableOperation::RenameTable { table_name }
3257 } else {
3258 let _ = self.parse_keyword(Keyword::COLUMN);
3259 let old_column_name = self.parse_identifier_non_reserved()?;
3260 self.expect_keyword(Keyword::TO)?;
3261 let new_column_name = self.parse_identifier_non_reserved()?;
3262 AlterTableOperation::RenameColumn {
3263 old_column_name,
3264 new_column_name,
3265 }
3266 }
3267 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3268 let owner_name: Ident = self.parse_identifier()?;
3269 AlterTableOperation::ChangeOwner {
3270 new_owner_name: owner_name,
3271 }
3272 } else if self.parse_keyword(Keyword::SET) {
3273 if self.parse_keyword(Keyword::SCHEMA) {
3274 let schema_name = self.parse_object_name()?;
3275 AlterTableOperation::SetSchema {
3276 new_schema_name: schema_name,
3277 }
3278 } else if self.parse_keyword(Keyword::PARALLELISM) {
3279 if self.expect_keyword(Keyword::TO).is_err()
3280 && self.expect_token(&Token::Eq).is_err()
3281 {
3282 return self.expected("TO or = after ALTER TABLE SET PARALLELISM");
3283 }
3284
3285 let value = self.parse_set_variable()?;
3286
3287 let deferred = self.parse_keyword(Keyword::DEFERRED);
3288
3289 AlterTableOperation::SetParallelism {
3290 parallelism: value,
3291 deferred,
3292 }
3293 } else if let Some(rate_limit) = self.parse_alter_source_rate_limit(true)? {
3294 AlterTableOperation::SetSourceRateLimit { rate_limit }
3295 } else if let Some(rate_limit) = self.parse_alter_backfill_rate_limit()? {
3296 AlterTableOperation::SetBackfillRateLimit { rate_limit }
3297 } else if let Some(rate_limit) = self.parse_alter_dml_rate_limit()? {
3298 AlterTableOperation::SetDmlRateLimit { rate_limit }
3299 } else {
3300 return self
3301 .expected("SCHEMA/PARALLELISM/SOURCE_RATE_LIMIT/DML_RATE_LIMIT after SET");
3302 }
3303 } else if self.parse_keyword(Keyword::DROP) {
3304 let _ = self.parse_keyword(Keyword::COLUMN);
3305 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3306 let column_name = self.parse_identifier_non_reserved()?;
3307 let cascade = self.parse_keyword(Keyword::CASCADE);
3308 AlterTableOperation::DropColumn {
3309 column_name,
3310 if_exists,
3311 cascade,
3312 }
3313 } else if self.parse_keyword(Keyword::ALTER) {
3314 let _ = self.parse_keyword(Keyword::COLUMN);
3315 let column_name = self.parse_identifier_non_reserved()?;
3316
3317 let op = if self.parse_keywords(&[Keyword::SET, Keyword::NOT, Keyword::NULL]) {
3318 AlterColumnOperation::SetNotNull {}
3319 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
3320 AlterColumnOperation::DropNotNull {}
3321 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
3322 AlterColumnOperation::SetDefault {
3323 value: self.parse_expr()?,
3324 }
3325 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
3326 AlterColumnOperation::DropDefault {}
3327 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
3328 || (self.parse_keyword(Keyword::TYPE))
3329 {
3330 let data_type = self.parse_data_type()?;
3331 let using = if self.parse_keyword(Keyword::USING) {
3332 Some(self.parse_expr()?)
3333 } else {
3334 None
3335 };
3336 AlterColumnOperation::SetDataType { data_type, using }
3337 } else {
3338 return self
3339 .expected("SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE after ALTER COLUMN");
3340 };
3341 AlterTableOperation::AlterColumn { column_name, op }
3342 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3343 AlterTableOperation::RefreshSchema
3344 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3345 let target_table = self.parse_object_name()?;
3346 AlterTableOperation::SwapRenameTable { target_table }
3347 } else {
3348 return self
3349 .expected("ADD or RENAME or OWNER TO or SET or DROP or SWAP after ALTER TABLE");
3350 };
3351 Ok(Statement::AlterTable {
3352 name: table_name,
3353 operation,
3354 })
3355 }
3356
3357 pub fn parse_alter_backfill_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3360 if !self.parse_word("BACKFILL_RATE_LIMIT") {
3361 return Ok(None);
3362 }
3363 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3364 return self.expected("TO or = after ALTER TABLE SET BACKFILL_RATE_LIMIT");
3365 }
3366 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3367 -1
3368 } else {
3369 let s = self.parse_number_value()?;
3370 if let Ok(n) = s.parse::<i32>() {
3371 n
3372 } else {
3373 return self.expected("number or DEFAULT");
3374 }
3375 };
3376 Ok(Some(rate_limit))
3377 }
3378
3379 pub fn parse_alter_dml_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3382 if !self.parse_word("DML_RATE_LIMIT") {
3383 return Ok(None);
3384 }
3385 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3386 return self.expected("TO or = after ALTER TABLE SET DML_RATE_LIMIT");
3387 }
3388 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3389 -1
3390 } else {
3391 let s = self.parse_number_value()?;
3392 if let Ok(n) = s.parse::<i32>() {
3393 n
3394 } else {
3395 return self.expected("number or DEFAULT");
3396 }
3397 };
3398 Ok(Some(rate_limit))
3399 }
3400
3401 pub fn parse_alter_source_rate_limit(&mut self, is_table: bool) -> ModalResult<Option<i32>> {
3404 if !self.parse_word("SOURCE_RATE_LIMIT") {
3405 return Ok(None);
3406 }
3407 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3408 let ddl = if is_table { "TABLE" } else { "SOURCE" };
3409 return self.expected(&format!("TO or = after ALTER {ddl} SET SOURCE_RATE_LIMIT"));
3410 }
3411 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3412 -1
3413 } else {
3414 let s = self.parse_number_value()?;
3415 if let Ok(n) = s.parse::<i32>() {
3416 n
3417 } else {
3418 return self.expected("number or DEFAULT");
3419 }
3420 };
3421 Ok(Some(rate_limit))
3422 }
3423
3424 pub fn parse_alter_index(&mut self) -> ModalResult<Statement> {
3425 let index_name = self.parse_object_name()?;
3426 let operation = if self.parse_keyword(Keyword::RENAME) {
3427 if self.parse_keyword(Keyword::TO) {
3428 let index_name = self.parse_object_name()?;
3429 AlterIndexOperation::RenameIndex { index_name }
3430 } else {
3431 return self.expected("TO after RENAME");
3432 }
3433 } else if self.parse_keyword(Keyword::SET) {
3434 if self.parse_keyword(Keyword::PARALLELISM) {
3435 if self.expect_keyword(Keyword::TO).is_err()
3436 && self.expect_token(&Token::Eq).is_err()
3437 {
3438 return self.expected("TO or = after ALTER TABLE SET PARALLELISM");
3439 }
3440
3441 let value = self.parse_set_variable()?;
3442
3443 let deferred = self.parse_keyword(Keyword::DEFERRED);
3444
3445 AlterIndexOperation::SetParallelism {
3446 parallelism: value,
3447 deferred,
3448 }
3449 } else {
3450 return self.expected("PARALLELISM after SET");
3451 }
3452 } else {
3453 return self.expected("RENAME after ALTER INDEX");
3454 };
3455
3456 Ok(Statement::AlterIndex {
3457 name: index_name,
3458 operation,
3459 })
3460 }
3461
3462 pub fn parse_alter_view(&mut self, materialized: bool) -> ModalResult<Statement> {
3463 let view_name = self.parse_object_name()?;
3464 let operation = if self.parse_keyword(Keyword::RENAME) {
3465 if self.parse_keyword(Keyword::TO) {
3466 let view_name = self.parse_object_name()?;
3467 AlterViewOperation::RenameView { view_name }
3468 } else {
3469 return self.expected("TO after RENAME");
3470 }
3471 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3472 let owner_name: Ident = self.parse_identifier()?;
3473 AlterViewOperation::ChangeOwner {
3474 new_owner_name: owner_name,
3475 }
3476 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3477 let target_view = self.parse_object_name()?;
3478 AlterViewOperation::SwapRenameView { target_view }
3479 } else if self.parse_keyword(Keyword::SET) {
3480 if self.parse_keyword(Keyword::SCHEMA) {
3481 let schema_name = self.parse_object_name()?;
3482 AlterViewOperation::SetSchema {
3483 new_schema_name: schema_name,
3484 }
3485 } else if self.parse_keyword(Keyword::PARALLELISM) && materialized {
3486 if self.expect_keyword(Keyword::TO).is_err()
3487 && self.expect_token(&Token::Eq).is_err()
3488 {
3489 return self.expected("TO or = after ALTER TABLE SET PARALLELISM");
3490 }
3491
3492 let value = self.parse_set_variable()?;
3493
3494 let deferred = self.parse_keyword(Keyword::DEFERRED);
3495
3496 AlterViewOperation::SetParallelism {
3497 parallelism: value,
3498 deferred,
3499 }
3500 } else if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3501 if self.expect_keyword(Keyword::TO).is_err()
3502 && self.expect_token(&Token::Eq).is_err()
3503 {
3504 return self
3505 .expected("TO or = after ALTER MATERIALIZED VIEW SET RESOURCE_GROUP");
3506 }
3507 let value = self.parse_set_variable()?;
3508 let deferred = self.parse_keyword(Keyword::DEFERRED);
3509
3510 AlterViewOperation::SetResourceGroup {
3511 resource_group: Some(value),
3512 deferred,
3513 }
3514 } else if materialized
3515 && let Some(rate_limit) = self.parse_alter_backfill_rate_limit()?
3516 {
3517 AlterViewOperation::SetBackfillRateLimit { rate_limit }
3518 } else {
3519 return self.expected("SCHEMA/PARALLELISM/BACKFILL_RATE_LIMIT after SET");
3520 }
3521 } else if self.parse_keyword(Keyword::RESET) {
3522 if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3523 let deferred = self.parse_keyword(Keyword::DEFERRED);
3524
3525 AlterViewOperation::SetResourceGroup {
3526 resource_group: None,
3527 deferred,
3528 }
3529 } else {
3530 return self.expected("RESOURCE_GROUP after RESET");
3531 }
3532 } else {
3533 return self.expected(&format!(
3534 "RENAME or OWNER TO or SET or SWAP after ALTER {}VIEW",
3535 if materialized { "MATERIALIZED " } else { "" }
3536 ));
3537 };
3538
3539 Ok(Statement::AlterView {
3540 materialized,
3541 name: view_name,
3542 operation,
3543 })
3544 }
3545
3546 pub fn parse_alter_sink_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3549 if !self.parse_word("SINK_RATE_LIMIT") {
3550 return Ok(None);
3551 }
3552 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3553 return self.expected("TO or = after ALTER SINK SET SINK_RATE_LIMIT");
3554 }
3555 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3556 -1
3557 } else {
3558 let s = self.parse_number_value()?;
3559 if let Ok(n) = s.parse::<i32>() {
3560 n
3561 } else {
3562 return self.expected("number or DEFAULT");
3563 }
3564 };
3565 Ok(Some(rate_limit))
3566 }
3567
3568 pub fn parse_alter_sink(&mut self) -> ModalResult<Statement> {
3569 let sink_name = self.parse_object_name()?;
3570 let operation = if self.parse_keyword(Keyword::RENAME) {
3571 if self.parse_keyword(Keyword::TO) {
3572 let sink_name = self.parse_object_name()?;
3573 AlterSinkOperation::RenameSink { sink_name }
3574 } else {
3575 return self.expected("TO after RENAME");
3576 }
3577 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3578 let owner_name: Ident = self.parse_identifier()?;
3579 AlterSinkOperation::ChangeOwner {
3580 new_owner_name: owner_name,
3581 }
3582 } else if self.parse_keyword(Keyword::SET) {
3583 if self.parse_keyword(Keyword::SCHEMA) {
3584 let schema_name = self.parse_object_name()?;
3585 AlterSinkOperation::SetSchema {
3586 new_schema_name: schema_name,
3587 }
3588 } else if self.parse_keyword(Keyword::PARALLELISM) {
3589 if self.expect_keyword(Keyword::TO).is_err()
3590 && self.expect_token(&Token::Eq).is_err()
3591 {
3592 return self.expected("TO or = after ALTER TABLE SET PARALLELISM");
3593 }
3594
3595 let value = self.parse_set_variable()?;
3596 let deferred = self.parse_keyword(Keyword::DEFERRED);
3597
3598 AlterSinkOperation::SetParallelism {
3599 parallelism: value,
3600 deferred,
3601 }
3602 } else if let Some(rate_limit) = self.parse_alter_sink_rate_limit()? {
3603 AlterSinkOperation::SetSinkRateLimit { rate_limit }
3604 } else {
3605 return self.expected("SCHEMA/PARALLELISM after SET");
3606 }
3607 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3608 let target_sink = self.parse_object_name()?;
3609 AlterSinkOperation::SwapRenameSink { target_sink }
3610 } else if self.parse_keyword(Keyword::CONNECTOR) {
3611 let changed_props = self.parse_with_properties()?;
3612 AlterSinkOperation::SetSinkProps { changed_props }
3613 } else {
3614 return self.expected("RENAME or OWNER TO or SET or CONNECTOR WITH after ALTER SINK");
3615 };
3616
3617 Ok(Statement::AlterSink {
3618 name: sink_name,
3619 operation,
3620 })
3621 }
3622
3623 pub fn parse_alter_subscription(&mut self) -> ModalResult<Statement> {
3624 let subscription_name = self.parse_object_name()?;
3625 let operation = if self.parse_keyword(Keyword::RENAME) {
3626 if self.parse_keyword(Keyword::TO) {
3627 let subscription_name = self.parse_object_name()?;
3628 AlterSubscriptionOperation::RenameSubscription { subscription_name }
3629 } else {
3630 return self.expected("TO after RENAME");
3631 }
3632 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3633 let owner_name: Ident = self.parse_identifier()?;
3634 AlterSubscriptionOperation::ChangeOwner {
3635 new_owner_name: owner_name,
3636 }
3637 } else if self.parse_keyword(Keyword::SET) {
3638 if self.parse_keyword(Keyword::SCHEMA) {
3639 let schema_name = self.parse_object_name()?;
3640 AlterSubscriptionOperation::SetSchema {
3641 new_schema_name: schema_name,
3642 }
3643 } else {
3644 return self.expected("SCHEMA after SET");
3645 }
3646 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3647 let target_subscription = self.parse_object_name()?;
3648 AlterSubscriptionOperation::SwapRenameSubscription {
3649 target_subscription,
3650 }
3651 } else {
3652 return self.expected("RENAME or OWNER TO or SET or SWAP after ALTER SUBSCRIPTION");
3653 };
3654
3655 Ok(Statement::AlterSubscription {
3656 name: subscription_name,
3657 operation,
3658 })
3659 }
3660
3661 pub fn parse_alter_source(&mut self) -> ModalResult<Statement> {
3662 let source_name = self.parse_object_name()?;
3663 let operation = if self.parse_keyword(Keyword::RENAME) {
3664 if self.parse_keyword(Keyword::TO) {
3665 let source_name = self.parse_object_name()?;
3666 AlterSourceOperation::RenameSource { source_name }
3667 } else {
3668 return self.expected("TO after RENAME");
3669 }
3670 } else if self.parse_keyword(Keyword::ADD) {
3671 let _ = self.parse_keyword(Keyword::COLUMN);
3672 let _if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3673 let column_def = self.parse_column_def()?;
3674 AlterSourceOperation::AddColumn { column_def }
3675 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3676 let owner_name: Ident = self.parse_identifier()?;
3677 AlterSourceOperation::ChangeOwner {
3678 new_owner_name: owner_name,
3679 }
3680 } else if self.parse_keyword(Keyword::SET) {
3681 if self.parse_keyword(Keyword::SCHEMA) {
3682 let schema_name = self.parse_object_name()?;
3683 AlterSourceOperation::SetSchema {
3684 new_schema_name: schema_name,
3685 }
3686 } else if let Some(rate_limit) = self.parse_alter_source_rate_limit(false)? {
3687 AlterSourceOperation::SetSourceRateLimit { rate_limit }
3688 } else if self.parse_keyword(Keyword::PARALLELISM) {
3689 if self.expect_keyword(Keyword::TO).is_err()
3690 && self.expect_token(&Token::Eq).is_err()
3691 {
3692 return self.expected("TO or = after ALTER SOURCE SET PARALLELISM");
3693 }
3694
3695 let value = self.parse_set_variable()?;
3696 let deferred = self.parse_keyword(Keyword::DEFERRED);
3697
3698 AlterSourceOperation::SetParallelism {
3699 parallelism: value,
3700 deferred,
3701 }
3702 } else {
3703 return self.expected("SCHEMA, SOURCE_RATE_LIMIT or PARALLELISM after SET");
3704 }
3705 } else if self.peek_nth_any_of_keywords(0, &[Keyword::FORMAT]) {
3706 let format_encode = self.parse_schema()?.unwrap();
3707 if format_encode.key_encode.is_some() {
3708 parser_err!("key encode clause is not supported in source schema");
3709 }
3710 AlterSourceOperation::FormatEncode { format_encode }
3711 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3712 AlterSourceOperation::RefreshSchema
3713 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3714 let target_source = self.parse_object_name()?;
3715 AlterSourceOperation::SwapRenameSource { target_source }
3716 } else {
3717 return self.expected("RENAME, ADD COLUMN, OWNER TO or SET after ALTER SOURCE");
3718 };
3719
3720 Ok(Statement::AlterSource {
3721 name: source_name,
3722 operation,
3723 })
3724 }
3725
3726 pub fn parse_alter_function(&mut self) -> ModalResult<Statement> {
3727 let FunctionDesc { name, args } = self.parse_function_desc()?;
3728
3729 let operation = if self.parse_keyword(Keyword::SET) {
3730 if self.parse_keyword(Keyword::SCHEMA) {
3731 let schema_name = self.parse_object_name()?;
3732 AlterFunctionOperation::SetSchema {
3733 new_schema_name: schema_name,
3734 }
3735 } else {
3736 return self.expected("SCHEMA after SET");
3737 }
3738 } else {
3739 return self.expected("SET after ALTER FUNCTION");
3740 };
3741
3742 Ok(Statement::AlterFunction {
3743 name,
3744 args,
3745 operation,
3746 })
3747 }
3748
3749 pub fn parse_alter_connection(&mut self) -> ModalResult<Statement> {
3750 let connection_name = self.parse_object_name()?;
3751 let operation = if self.parse_keyword(Keyword::SET) {
3752 if self.parse_keyword(Keyword::SCHEMA) {
3753 let schema_name = self.parse_object_name()?;
3754 AlterConnectionOperation::SetSchema {
3755 new_schema_name: schema_name,
3756 }
3757 } else {
3758 return self.expected("SCHEMA after SET");
3759 }
3760 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3761 let owner_name: Ident = self.parse_identifier()?;
3762 AlterConnectionOperation::ChangeOwner {
3763 new_owner_name: owner_name,
3764 }
3765 } else {
3766 return self.expected("SET, or OWNER TO after ALTER CONNECTION");
3767 };
3768
3769 Ok(Statement::AlterConnection {
3770 name: connection_name,
3771 operation,
3772 })
3773 }
3774
3775 pub fn parse_alter_system(&mut self) -> ModalResult<Statement> {
3776 self.expect_keyword(Keyword::SET)?;
3777 let param = self.parse_identifier()?;
3778 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3779 return self.expected("TO or = after ALTER SYSTEM SET");
3780 }
3781 let value = self.parse_set_variable()?;
3782 Ok(Statement::AlterSystem { param, value })
3783 }
3784
3785 pub fn parse_alter_secret(&mut self) -> ModalResult<Statement> {
3786 let secret_name = self.parse_object_name()?;
3787 let with_options = self.parse_with_properties()?;
3788 self.expect_keyword(Keyword::AS)?;
3789 let new_credential = self.ensure_parse_value()?;
3790 let operation = AlterSecretOperation::ChangeCredential { new_credential };
3791 Ok(Statement::AlterSecret {
3792 name: secret_name,
3793 with_options,
3794 operation,
3795 })
3796 }
3797
3798 pub fn parse_alter_fragment(&mut self) -> ModalResult<Statement> {
3799 let fragment_id = self.parse_literal_uint()? as u32;
3800 if !self.parse_keyword(Keyword::SET) {
3801 return self.expected("SET after ALTER FRAGMENT");
3802 }
3803 let rate_limit = self.parse_alter_fragment_rate_limit()?;
3804 let operation = AlterFragmentOperation::AlterBackfillRateLimit { rate_limit };
3805 Ok(Statement::AlterFragment {
3806 fragment_id,
3807 operation,
3808 })
3809 }
3810
3811 fn parse_alter_fragment_rate_limit(&mut self) -> ModalResult<i32> {
3812 if !self.parse_word("RATE_LIMIT") {
3813 return self.expected("expected RATE_LIMIT after SET");
3814 }
3815 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3816 return self.expected("TO or = after RATE_LIMIT");
3817 }
3818 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3819 -1
3820 } else {
3821 let s = self.parse_number_value()?;
3822 if let Ok(n) = s.parse::<i32>() {
3823 n
3824 } else {
3825 return self.expected("number or DEFAULT");
3826 }
3827 };
3828 Ok(rate_limit)
3829 }
3830
3831 pub fn parse_copy(&mut self) -> ModalResult<Statement> {
3833 let table_name = self.parse_object_name()?;
3834 let columns = self.parse_parenthesized_column_list(Optional)?;
3835 self.expect_keywords(&[Keyword::FROM, Keyword::STDIN])?;
3836 self.expect_token(&Token::SemiColon)?;
3837 let values = self.parse_tsv();
3838 Ok(Statement::Copy {
3839 table_name,
3840 columns,
3841 values,
3842 })
3843 }
3844
3845 fn parse_tsv(&mut self) -> Vec<Option<String>> {
3848 self.parse_tab_value()
3849 }
3850
3851 fn parse_tab_value(&mut self) -> Vec<Option<String>> {
3852 let mut values = vec![];
3853 let mut content = String::from("");
3854 while let Some(t) = self.next_token_no_skip() {
3855 match t.token {
3856 Token::Whitespace(Whitespace::Tab) => {
3857 values.push(Some(content.clone()));
3858 content.clear();
3859 }
3860 Token::Whitespace(Whitespace::Newline) => {
3861 values.push(Some(content.clone()));
3862 content.clear();
3863 }
3864 Token::Backslash => {
3865 if self.consume_token(&Token::Period) {
3866 return values;
3867 }
3868 if let Token::Word(w) = self.next_token().token {
3869 if w.value == "N" {
3870 values.push(None);
3871 }
3872 }
3873 }
3874 _ => {
3875 content.push_str(&t.to_string());
3876 }
3877 }
3878 }
3879 values
3880 }
3881
3882 pub fn ensure_parse_value(&mut self) -> ModalResult<Value> {
3883 match self.parse_value_and_obj_ref::<true>()? {
3884 SqlOptionValue::Value(value) => Ok(value),
3885 SqlOptionValue::SecretRef(_)
3886 | SqlOptionValue::ConnectionRef(_)
3887 | SqlOptionValue::BackfillOrder(_) => unreachable!(),
3888 }
3889 }
3890
3891 pub fn parse_value_and_obj_ref<const FORBID_OBJ_REF: bool>(
3893 &mut self,
3894 ) -> ModalResult<SqlOptionValue> {
3895 let checkpoint = *self;
3896 let token = self.next_token();
3897 match token.token {
3898 Token::Word(w) => match w.keyword {
3899 Keyword::TRUE => Ok(Value::Boolean(true).into()),
3900 Keyword::FALSE => Ok(Value::Boolean(false).into()),
3901 Keyword::NULL => Ok(Value::Null.into()),
3902 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
3903 Some('"') => Ok(Value::DoubleQuotedString(w.value).into()),
3904 Some('\'') => Ok(Value::SingleQuotedString(w.value).into()),
3905 _ => self.expected_at(checkpoint, "A value")?,
3906 },
3907 Keyword::SECRET => {
3908 if FORBID_OBJ_REF {
3909 return self.expected_at(
3910 checkpoint,
3911 "a concrete value rather than a secret reference",
3912 );
3913 }
3914 let secret = self.parse_secret_ref()?;
3915 Ok(SqlOptionValue::SecretRef(secret))
3916 }
3917 _ => self.expected_at(checkpoint, "a concrete value"),
3918 },
3919 Token::Number(ref n) => Ok(Value::Number(n.clone()).into()),
3920 Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string()).into()),
3921 Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone()).into()),
3922 Token::CstyleEscapesString(ref s) => Ok(Value::CstyleEscapedString(s.clone()).into()),
3923 Token::NationalStringLiteral(ref s) => {
3924 Ok(Value::NationalStringLiteral(s.to_string()).into())
3925 }
3926 Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string()).into()),
3927 _ => self.expected_at(checkpoint, "a value"),
3928 }
3929 }
3930
3931 fn parse_secret_ref(&mut self) -> ModalResult<SecretRefValue> {
3932 let secret_name = self.parse_object_name()?;
3933 let ref_as = if self.parse_keywords(&[Keyword::AS, Keyword::FILE]) {
3934 SecretRefAsType::File
3935 } else {
3936 SecretRefAsType::Text
3937 };
3938 Ok(SecretRefValue {
3939 secret_name,
3940 ref_as,
3941 })
3942 }
3943
3944 fn parse_set_variable(&mut self) -> ModalResult<SetVariableValue> {
3945 alt((
3946 Keyword::DEFAULT.value(SetVariableValue::Default),
3947 separated(
3948 1..,
3949 alt((
3950 Self::ensure_parse_value.map(SetVariableValueSingle::Literal),
3951 |parser: &mut Self| {
3952 let checkpoint = *parser;
3953 let ident = parser.parse_identifier()?;
3954 if ident.value == "default" {
3955 *parser = checkpoint;
3956 return parser.expected("parameter list value").map_err(|e| e.cut());
3957 }
3958 Ok(SetVariableValueSingle::Ident(ident))
3959 },
3960 fail.expect("parameter value"),
3961 )),
3962 Token::Comma,
3963 )
3964 .map(|list: Vec<SetVariableValueSingle>| {
3965 if list.len() == 1 {
3966 SetVariableValue::Single(list[0].clone())
3967 } else {
3968 SetVariableValue::List(list)
3969 }
3970 }),
3971 ))
3972 .parse_next(self)
3973 }
3974
3975 fn parse_backfill_order_strategy(&mut self) -> ModalResult<BackfillOrderStrategy> {
3976 alt((
3977 Keyword::DEFAULT.value(BackfillOrderStrategy::Default),
3978 Keyword::NONE.value(BackfillOrderStrategy::None),
3979 Keyword::AUTO.value(BackfillOrderStrategy::Auto),
3980 Self::parse_fixed_backfill_order.map(BackfillOrderStrategy::Fixed),
3981 fail.expect("backfill order strategy"),
3982 ))
3983 .parse_next(self)
3984 }
3985
3986 fn parse_fixed_backfill_order(&mut self) -> ModalResult<Vec<(ObjectName, ObjectName)>> {
3987 self.expect_word("FIXED")?;
3988 self.expect_token(&Token::LParen)?;
3989 let edges = separated(
3990 0..,
3991 separated_pair(
3992 Self::parse_object_name,
3993 Token::Arrow,
3994 Self::parse_object_name,
3995 ),
3996 Token::Comma,
3997 )
3998 .parse_next(self)?;
3999 self.expect_token(&Token::RParen)?;
4000 Ok(edges)
4001 }
4002
4003 pub fn parse_number_value(&mut self) -> ModalResult<String> {
4004 let checkpoint = *self;
4005 match self.ensure_parse_value()? {
4006 Value::Number(v) => Ok(v),
4007 _ => self.expected_at(checkpoint, "literal number"),
4008 }
4009 }
4010
4011 pub fn parse_literal_uint(&mut self) -> ModalResult<u64> {
4013 literal_uint(self)
4014 }
4015
4016 pub fn parse_function_definition(&mut self) -> ModalResult<FunctionDefinition> {
4017 alt((
4018 single_quoted_string.map(FunctionDefinition::SingleQuotedDef),
4019 dollar_quoted_string.map(FunctionDefinition::DoubleDollarDef),
4020 Self::parse_identifier.map(|i| FunctionDefinition::Identifier(i.value)),
4021 fail.expect("function definition"),
4022 ))
4023 .parse_next(self)
4024 }
4025
4026 pub fn parse_literal_string(&mut self) -> ModalResult<String> {
4028 let checkpoint = *self;
4029 let token = self.next_token();
4030 match token.token {
4031 Token::SingleQuotedString(s) => Ok(s),
4032 _ => self.expected_at(checkpoint, "literal string"),
4033 }
4034 }
4035
4036 pub fn parse_map_key(&mut self) -> ModalResult<Expr> {
4038 alt((
4039 Self::parse_function,
4040 single_quoted_string.map(|s| Expr::Value(Value::SingleQuotedString(s))),
4041 token_number.map(|s| Expr::Value(Value::Number(s))),
4042 fail.expect("literal string, number or function"),
4043 ))
4044 .parse_next(self)
4045 }
4046
4047 pub fn parse_data_type(&mut self) -> ModalResult<DataType> {
4049 parser_v2::data_type(self)
4050 }
4051
4052 pub fn parse_optional_alias(
4056 &mut self,
4057 reserved_kwds: &[Keyword],
4058 ) -> ModalResult<Option<Ident>> {
4059 let after_as = self.parse_keyword(Keyword::AS);
4060 let checkpoint = *self;
4061 let token = self.next_token();
4062 match token.token {
4063 Token::Word(w) if after_as || (!reserved_kwds.contains(&w.keyword)) => {
4069 Ok(Some(w.to_ident()?))
4070 }
4071 _ => {
4072 *self = checkpoint;
4073 if after_as {
4074 return self.expected("an identifier after AS");
4075 }
4076 Ok(None) }
4078 }
4079 }
4080
4081 pub fn parse_optional_table_alias(
4086 &mut self,
4087 reserved_kwds: &[Keyword],
4088 ) -> ModalResult<Option<TableAlias>> {
4089 match self.parse_optional_alias(reserved_kwds)? {
4090 Some(name) => {
4091 let columns = self.parse_parenthesized_column_list(Optional)?;
4092 Ok(Some(TableAlias { name, columns }))
4093 }
4094 None => Ok(None),
4095 }
4096 }
4097
4098 pub fn parse_as_of(&mut self) -> ModalResult<AsOf> {
4100 Keyword::FOR.parse_next(self)?;
4101 alt((
4102 preceded(
4103 (Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF),
4104 cut_err(
4105 alt((
4106 preceded(
4107 (
4108 Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4109 cut_err(Token::LParen),
4110 cut_err(Token::RParen),
4111 Token::Minus,
4112 ),
4113 Self::parse_literal_interval.try_map(|e| match e {
4114 Expr::Value(v) => match v {
4115 Value::Interval {
4116 value,
4117 leading_field,
4118 ..
4119 } => {
4120 let Some(leading_field) = leading_field else {
4121 return Err(StrError("expect duration unit".into()));
4122 };
4123 Ok(AsOf::ProcessTimeWithInterval((value, leading_field)))
4124 }
4125 _ => Err(StrError("expect Value::Interval".into())),
4126 },
4127 _ => Err(StrError("expect Expr::Value".into())),
4128 }),
4129 ),
4130 (
4131 Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4132 cut_err(Token::LParen),
4133 cut_err(Token::RParen),
4134 )
4135 .value(AsOf::ProcessTimeWithInterval((
4136 "0".to_owned(),
4137 DateTimeField::Second,
4138 ))),
4139 (
4140 Self::parse_identifier.verify(|ident| ident.real_value() == "proctime"),
4141 cut_err(Token::LParen),
4142 cut_err(Token::RParen),
4143 )
4144 .value(AsOf::ProcessTime),
4145 literal_i64.map(AsOf::TimestampNum),
4146 single_quoted_string.map(AsOf::TimestampString),
4147 ))
4148 .expect("proctime(), now(), number or string"),
4149 ),
4150 ),
4151 preceded(
4152 (Keyword::SYSTEM_VERSION, Keyword::AS, Keyword::OF),
4153 cut_err(
4154 alt((
4155 literal_i64.map(AsOf::VersionNum),
4156 single_quoted_string.map(AsOf::VersionString),
4157 ))
4158 .expect("number or string"),
4159 ),
4160 ),
4161 ))
4162 .parse_next(self)
4163 }
4164
4165 pub fn parse_object_name(&mut self) -> ModalResult<ObjectName> {
4168 let mut idents = vec![];
4169 loop {
4170 idents.push(self.parse_identifier()?);
4171 if !self.consume_token(&Token::Period) {
4172 break;
4173 }
4174 }
4175 Ok(ObjectName(idents))
4176 }
4177
4178 pub fn parse_identifiers_non_keywords(&mut self) -> ModalResult<Vec<Ident>> {
4180 let mut idents = vec![];
4181 loop {
4182 match self.peek_token().token {
4183 Token::Word(w) => {
4184 if w.keyword != Keyword::NoKeyword {
4185 break;
4186 }
4187
4188 idents.push(w.to_ident()?);
4189 }
4190 Token::EOF | Token::Eq => break,
4191 _ => {}
4192 }
4193
4194 self.next_token();
4195 }
4196
4197 Ok(idents)
4198 }
4199
4200 pub fn parse_identifiers(&mut self) -> ModalResult<Vec<Ident>> {
4202 let mut idents = vec![];
4203 loop {
4204 let token = self.next_token();
4205 match token.token {
4206 Token::Word(w) => {
4207 idents.push(w.to_ident()?);
4208 }
4209 Token::EOF => break,
4210 _ => {}
4211 }
4212 }
4213
4214 Ok(idents)
4215 }
4216
4217 pub fn parse_identifier(&mut self) -> ModalResult<Ident> {
4219 let checkpoint = *self;
4220 let token = self.next_token();
4221 match token.token {
4222 Token::Word(w) => Ok(w.to_ident()?),
4223 _ => self.expected_at(checkpoint, "identifier"),
4224 }
4225 }
4226
4227 pub fn parse_identifier_non_reserved(&mut self) -> ModalResult<Ident> {
4229 let checkpoint = *self;
4230 let token = self.next_token();
4231 match token.token {
4232 Token::Word(w) => {
4233 match keywords::RESERVED_FOR_COLUMN_OR_TABLE_NAME.contains(&w.keyword) {
4234 true => parser_err!("syntax error at or near {w}"),
4235 false => Ok(w.to_ident()?),
4236 }
4237 }
4238 _ => self.expected_at(checkpoint, "identifier"),
4239 }
4240 }
4241
4242 pub fn parse_parenthesized_column_list(
4244 &mut self,
4245 optional: IsOptional,
4246 ) -> ModalResult<Vec<Ident>> {
4247 if self.consume_token(&Token::LParen) {
4248 let cols = self.parse_comma_separated(Parser::parse_identifier_non_reserved)?;
4249 self.expect_token(&Token::RParen)?;
4250 Ok(cols)
4251 } else if optional == Optional {
4252 Ok(vec![])
4253 } else {
4254 self.expected("a list of columns in parentheses")
4255 }
4256 }
4257
4258 pub fn parse_returning(&mut self, optional: IsOptional) -> ModalResult<Vec<SelectItem>> {
4259 if self.parse_keyword(Keyword::RETURNING) {
4260 let cols = self.parse_comma_separated(Parser::parse_select_item)?;
4261 Ok(cols)
4262 } else if optional == Optional {
4263 Ok(vec![])
4264 } else {
4265 self.expected("a list of columns or * after returning")
4266 }
4267 }
4268
4269 pub fn parse_row_expr(&mut self) -> ModalResult<Expr> {
4270 Ok(Expr::Row(self.parse_token_wrapped_exprs(
4271 &Token::LParen,
4272 &Token::RParen,
4273 )?))
4274 }
4275
4276 pub fn parse_token_wrapped_exprs(
4278 &mut self,
4279 left: &Token,
4280 right: &Token,
4281 ) -> ModalResult<Vec<Expr>> {
4282 if self.consume_token(left) {
4283 let exprs = if self.consume_token(right) {
4284 vec![]
4285 } else {
4286 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
4287 self.expect_token(right)?;
4288 exprs
4289 };
4290 Ok(exprs)
4291 } else {
4292 self.expected(left.to_string().as_str())
4293 }
4294 }
4295
4296 pub fn parse_optional_precision(&mut self) -> ModalResult<Option<u64>> {
4297 if self.consume_token(&Token::LParen) {
4298 let n = self.parse_literal_uint()?;
4299 self.expect_token(&Token::RParen)?;
4300 Ok(Some(n))
4301 } else {
4302 Ok(None)
4303 }
4304 }
4305
4306 pub fn parse_optional_precision_scale(&mut self) -> ModalResult<(Option<u64>, Option<u64>)> {
4307 if self.consume_token(&Token::LParen) {
4308 let n = self.parse_literal_uint()?;
4309 let scale = if self.consume_token(&Token::Comma) {
4310 Some(self.parse_literal_uint()?)
4311 } else {
4312 None
4313 };
4314 self.expect_token(&Token::RParen)?;
4315 Ok((Some(n), scale))
4316 } else {
4317 Ok((None, None))
4318 }
4319 }
4320
4321 pub fn parse_delete(&mut self) -> ModalResult<Statement> {
4322 self.expect_keyword(Keyword::FROM)?;
4323 let table_name = self.parse_object_name()?;
4324 let selection = if self.parse_keyword(Keyword::WHERE) {
4325 Some(self.parse_expr()?)
4326 } else {
4327 None
4328 };
4329 let returning = self.parse_returning(Optional)?;
4330
4331 Ok(Statement::Delete {
4332 table_name,
4333 selection,
4334 returning,
4335 })
4336 }
4337
4338 pub fn parse_optional_boolean(&mut self, default: bool) -> bool {
4339 if let Some(keyword) = self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
4340 match keyword {
4341 Keyword::TRUE => true,
4342 Keyword::FALSE => false,
4343 _ => unreachable!(),
4344 }
4345 } else {
4346 default
4347 }
4348 }
4349
4350 fn parse_explain_options(&mut self) -> ModalResult<(ExplainOptions, Option<u64>)> {
4351 let mut options = ExplainOptions::default();
4352 let mut analyze_duration = None;
4353
4354 let explain_key_words = [
4355 Keyword::BACKFILL,
4356 Keyword::VERBOSE,
4357 Keyword::TRACE,
4358 Keyword::TYPE,
4359 Keyword::LOGICAL,
4360 Keyword::PHYSICAL,
4361 Keyword::DISTSQL,
4362 Keyword::FORMAT,
4363 Keyword::DURATION_SECS,
4364 ];
4365
4366 let parse_explain_option = |parser: &mut Parser<'_>| -> ModalResult<()> {
4367 let keyword = parser.expect_one_of_keywords(&explain_key_words)?;
4368 match keyword {
4369 Keyword::VERBOSE => options.verbose = parser.parse_optional_boolean(true),
4370 Keyword::TRACE => options.trace = parser.parse_optional_boolean(true),
4371 Keyword::BACKFILL => options.backfill = parser.parse_optional_boolean(true),
4372 Keyword::TYPE => {
4373 let explain_type = parser.expect_one_of_keywords(&[
4374 Keyword::LOGICAL,
4375 Keyword::PHYSICAL,
4376 Keyword::DISTSQL,
4377 ])?;
4378 match explain_type {
4379 Keyword::LOGICAL => options.explain_type = ExplainType::Logical,
4380 Keyword::PHYSICAL => options.explain_type = ExplainType::Physical,
4381 Keyword::DISTSQL => options.explain_type = ExplainType::DistSql,
4382 _ => unreachable!("{}", keyword),
4383 }
4384 }
4385 Keyword::LOGICAL => options.explain_type = ExplainType::Logical,
4386 Keyword::PHYSICAL => options.explain_type = ExplainType::Physical,
4387 Keyword::DISTSQL => options.explain_type = ExplainType::DistSql,
4388 Keyword::FORMAT => {
4389 options.explain_format = {
4390 match parser.expect_one_of_keywords(&[
4391 Keyword::TEXT,
4392 Keyword::JSON,
4393 Keyword::XML,
4394 Keyword::YAML,
4395 Keyword::DOT,
4396 ])? {
4397 Keyword::TEXT => ExplainFormat::Text,
4398 Keyword::JSON => ExplainFormat::Json,
4399 Keyword::XML => ExplainFormat::Xml,
4400 Keyword::YAML => ExplainFormat::Yaml,
4401 Keyword::DOT => ExplainFormat::Dot,
4402 _ => unreachable!("{}", keyword),
4403 }
4404 }
4405 }
4406 Keyword::DURATION_SECS => {
4407 analyze_duration = Some(parser.parse_literal_uint()?);
4408 }
4409 _ => unreachable!("{}", keyword),
4410 };
4411 Ok(())
4412 };
4413
4414 if self.peek_token() == Token::LParen
4417 && self.peek_nth_any_of_keywords(1, &explain_key_words)
4418 && self.consume_token(&Token::LParen)
4419 {
4420 self.parse_comma_separated(parse_explain_option)?;
4421 self.expect_token(&Token::RParen)?;
4422 }
4423
4424 Ok((options, analyze_duration))
4425 }
4426
4427 pub fn parse_explain(&mut self) -> ModalResult<Statement> {
4428 let analyze = self.parse_keyword(Keyword::ANALYZE);
4429 let (options, analyze_duration) = self.parse_explain_options()?;
4430
4431 if analyze {
4432 fn parse_analyze_target(parser: &mut Parser<'_>) -> ModalResult<Option<AnalyzeTarget>> {
4433 if parser.parse_keyword(Keyword::TABLE) {
4434 let table_name = parser.parse_object_name()?;
4435 Ok(Some(AnalyzeTarget::Table(table_name)))
4436 } else if parser.parse_keyword(Keyword::INDEX) {
4437 let index_name = parser.parse_object_name()?;
4438 Ok(Some(AnalyzeTarget::Index(index_name)))
4439 } else if parser.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
4440 let view_name = parser.parse_object_name()?;
4441 Ok(Some(AnalyzeTarget::MaterializedView(view_name)))
4442 } else if parser.parse_keyword(Keyword::INDEX) {
4443 let index_name = parser.parse_object_name()?;
4444 Ok(Some(AnalyzeTarget::Index(index_name)))
4445 } else if parser.parse_keyword(Keyword::SINK) {
4446 let sink_name = parser.parse_object_name()?;
4447 Ok(Some(AnalyzeTarget::Sink(sink_name)))
4448 } else if parser.parse_word("ID") {
4449 let job_id = parser.parse_literal_uint()? as u32;
4450 Ok(Some(AnalyzeTarget::Id(job_id)))
4451 } else {
4452 Ok(None)
4453 }
4454 }
4455 if let Some(target) = parse_analyze_target(self)? {
4456 let statement = Statement::ExplainAnalyzeStreamJob {
4457 target,
4458 duration_secs: analyze_duration,
4459 };
4460 return Ok(statement);
4461 }
4462 }
4463
4464 let statement = match self.parse_statement() {
4465 Ok(statement) => statement,
4466 error @ Err(_) => {
4467 return if analyze {
4468 self.expected_at(
4469 *self,
4470 "SINK, TABLE, MATERIALIZED VIEW, INDEX or a statement after ANALYZE",
4471 )
4472 } else {
4473 error
4474 };
4475 }
4476 };
4477 Ok(Statement::Explain {
4478 analyze,
4479 statement: Box::new(statement),
4480 options,
4481 })
4482 }
4483
4484 pub fn parse_describe(&mut self) -> ModalResult<Statement> {
4485 let kind = match self.parse_one_of_keywords(&[Keyword::FRAGMENT, Keyword::FRAGMENTS]) {
4486 Some(Keyword::FRAGMENT) => {
4487 let fragment_id = self.parse_literal_uint()? as u32;
4488 return Ok(Statement::DescribeFragment { fragment_id });
4489 }
4490 Some(Keyword::FRAGMENTS) => DescribeKind::Fragments,
4491 None => DescribeKind::Plain,
4492 Some(_) => unreachable!(),
4493 };
4494 let name = self.parse_object_name()?;
4495 Ok(Statement::Describe { name, kind })
4496 }
4497
4498 pub fn parse_query(&mut self) -> ModalResult<Query> {
4503 let with = if self.parse_keyword(Keyword::WITH) {
4504 Some(With {
4505 recursive: self.parse_keyword(Keyword::RECURSIVE),
4506 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
4507 })
4508 } else {
4509 None
4510 };
4511
4512 let body = self.parse_query_body(0)?;
4513
4514 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
4515 self.parse_comma_separated(Parser::parse_order_by_expr)?
4516 } else {
4517 vec![]
4518 };
4519
4520 let mut limit = None;
4521 let mut offset = None;
4522 for _x in 0..2 {
4523 if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
4524 limit = self.parse_limit()?
4525 }
4526
4527 if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
4528 offset = Some(self.parse_offset()?)
4529 }
4530 }
4531
4532 let fetch = if self.parse_keyword(Keyword::FETCH) {
4533 if limit.is_some() {
4534 parser_err!("Cannot specify both LIMIT and FETCH");
4535 }
4536 let fetch = self.parse_fetch()?;
4537 if fetch.with_ties && order_by.is_empty() {
4538 parser_err!("WITH TIES cannot be specified without ORDER BY clause");
4539 }
4540 Some(fetch)
4541 } else {
4542 None
4543 };
4544
4545 Ok(Query {
4546 with,
4547 body,
4548 order_by,
4549 limit,
4550 offset,
4551 fetch,
4552 })
4553 }
4554
4555 fn parse_cte(&mut self) -> ModalResult<Cte> {
4557 let name = self.parse_identifier_non_reserved()?;
4558 let cte = if self.parse_keyword(Keyword::AS) {
4559 let cte_inner = self.parse_cte_inner()?;
4560 let alias = TableAlias {
4561 name,
4562 columns: vec![],
4563 };
4564 Cte { alias, cte_inner }
4565 } else {
4566 let columns = self.parse_parenthesized_column_list(Optional)?;
4567 self.expect_keyword(Keyword::AS)?;
4568 let cte_inner = self.parse_cte_inner()?;
4569 let alias = TableAlias { name, columns };
4570 Cte { alias, cte_inner }
4571 };
4572 Ok(cte)
4573 }
4574
4575 fn parse_cte_inner(&mut self) -> ModalResult<CteInner> {
4576 match self.expect_token(&Token::LParen) {
4577 Ok(()) => {
4578 let query = self.parse_query()?;
4579 self.expect_token(&Token::RParen)?;
4580 Ok(CteInner::Query(Box::new(query)))
4581 }
4582 _ => {
4583 let changelog = self.parse_identifier_non_reserved()?;
4584 if changelog.to_string().to_lowercase() != "changelog" {
4585 parser_err!("Expected 'changelog' but found '{}'", changelog);
4586 }
4587 self.expect_keyword(Keyword::FROM)?;
4588 Ok(CteInner::ChangeLog(self.parse_object_name()?))
4589 }
4590 }
4591 }
4592
4593 fn parse_query_body(&mut self, precedence: u8) -> ModalResult<SetExpr> {
4602 let mut expr = if self.parse_keyword(Keyword::SELECT) {
4605 SetExpr::Select(Box::new(self.parse_select()?))
4606 } else if self.consume_token(&Token::LParen) {
4607 let subquery = self.parse_query()?;
4609 self.expect_token(&Token::RParen)?;
4610 SetExpr::Query(Box::new(subquery))
4611 } else if self.parse_keyword(Keyword::VALUES) {
4612 SetExpr::Values(self.parse_values()?)
4613 } else {
4614 return self.expected("SELECT, VALUES, or a subquery in the query body");
4615 };
4616
4617 loop {
4618 let op = self.parse_set_operator(&self.peek_token().token);
4620 let next_precedence = match op {
4621 Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
4623 Some(SetOperator::Intersect) => 20,
4625 None => break,
4627 };
4628 if precedence >= next_precedence {
4629 break;
4630 }
4631 self.next_token(); let all = self.parse_keyword(Keyword::ALL);
4634 let corresponding = self.parse_corresponding()?;
4635
4636 expr = SetExpr::SetOperation {
4637 left: Box::new(expr),
4638 op: op.unwrap(),
4639 corresponding,
4640 all,
4641 right: Box::new(self.parse_query_body(next_precedence)?),
4642 };
4643 }
4644
4645 Ok(expr)
4646 }
4647
4648 fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
4649 match token {
4650 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
4651 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
4652 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
4653 _ => None,
4654 }
4655 }
4656
4657 fn parse_corresponding(&mut self) -> ModalResult<Corresponding> {
4658 let corresponding = if self.parse_keyword(Keyword::CORRESPONDING) {
4659 let column_list = if self.parse_keyword(Keyword::BY) {
4660 Some(self.parse_parenthesized_column_list(IsOptional::Mandatory)?)
4661 } else {
4662 None
4663 };
4664 Corresponding::with_column_list(column_list)
4665 } else {
4666 Corresponding::none()
4667 };
4668 Ok(corresponding)
4669 }
4670
4671 pub fn parse_select(&mut self) -> ModalResult<Select> {
4674 let distinct = self.parse_all_or_distinct_on()?;
4675
4676 let projection = self.parse_comma_separated(Parser::parse_select_item)?;
4677
4678 let from = if self.parse_keyword(Keyword::FROM) {
4684 self.parse_comma_separated(Parser::parse_table_and_joins)?
4685 } else {
4686 vec![]
4687 };
4688 let mut lateral_views = vec![];
4689 loop {
4690 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
4691 let outer = self.parse_keyword(Keyword::OUTER);
4692 let lateral_view = self.parse_expr()?;
4693 let lateral_view_name = self.parse_object_name()?;
4694 let lateral_col_alias = self
4695 .parse_comma_separated(|parser| {
4696 parser.parse_optional_alias(&[
4697 Keyword::WHERE,
4698 Keyword::GROUP,
4699 Keyword::CLUSTER,
4700 Keyword::HAVING,
4701 Keyword::LATERAL,
4702 ]) })?
4704 .into_iter()
4705 .flatten()
4706 .collect();
4707
4708 lateral_views.push(LateralView {
4709 lateral_view,
4710 lateral_view_name,
4711 lateral_col_alias,
4712 outer,
4713 });
4714 } else {
4715 break;
4716 }
4717 }
4718
4719 let selection = if self.parse_keyword(Keyword::WHERE) {
4720 Some(self.parse_expr()?)
4721 } else {
4722 None
4723 };
4724
4725 let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
4726 self.parse_comma_separated(Parser::parse_group_by_expr)?
4727 } else {
4728 vec![]
4729 };
4730
4731 let having = if self.parse_keyword(Keyword::HAVING) {
4732 Some(self.parse_expr()?)
4733 } else {
4734 None
4735 };
4736
4737 Ok(Select {
4738 distinct,
4739 projection,
4740 from,
4741 lateral_views,
4742 selection,
4743 group_by,
4744 having,
4745 })
4746 }
4747
4748 pub fn parse_set(&mut self) -> ModalResult<Statement> {
4749 let modifier = self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL]);
4750 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
4751 let value = alt((
4752 Keyword::DEFAULT.value(SetTimeZoneValue::Default),
4753 Keyword::LOCAL.value(SetTimeZoneValue::Local),
4754 preceded(
4755 Keyword::INTERVAL,
4756 cut_err(Self::parse_literal_interval.try_map(|e| match e {
4757 Expr::Value(v) => match v {
4760 Value::Interval { value, .. } => {
4761 if value != "+00:00" {
4762 return Err(StrError("only support \"+00:00\" ".into()));
4763 }
4764 Ok(SetTimeZoneValue::Ident(Ident::with_quote_unchecked(
4765 '\'',
4766 "UTC".to_owned(),
4767 )))
4768 }
4769 _ => Err(StrError("expect Value::Interval".into())),
4770 },
4771 _ => Err(StrError("expect Expr::Value".into())),
4772 })),
4773 ),
4774 Self::parse_identifier.map(SetTimeZoneValue::Ident),
4775 Self::ensure_parse_value.map(SetTimeZoneValue::Literal),
4776 ))
4777 .expect("variable")
4778 .parse_next(self)?;
4779
4780 Ok(Statement::SetTimeZone {
4781 local: modifier == Some(Keyword::LOCAL),
4782 value,
4783 })
4784 } else if self.parse_keyword(Keyword::CHARACTERISTICS) && modifier == Some(Keyword::SESSION)
4785 {
4786 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
4787 Ok(Statement::SetTransaction {
4788 modes: self.parse_transaction_modes()?,
4789 snapshot: None,
4790 session: true,
4791 })
4792 } else if self.parse_keyword(Keyword::TRANSACTION) && modifier.is_none() {
4793 if self.parse_keyword(Keyword::SNAPSHOT) {
4794 let snapshot_id = self.ensure_parse_value()?;
4795 return Ok(Statement::SetTransaction {
4796 modes: vec![],
4797 snapshot: Some(snapshot_id),
4798 session: false,
4799 });
4800 }
4801 Ok(Statement::SetTransaction {
4802 modes: self.parse_transaction_modes()?,
4803 snapshot: None,
4804 session: false,
4805 })
4806 } else {
4807 let variable = self.parse_identifier()?;
4808
4809 if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
4810 let value = self.parse_set_variable()?;
4811 Ok(Statement::SetVariable {
4812 local: modifier == Some(Keyword::LOCAL),
4813 variable,
4814 value,
4815 })
4816 } else {
4817 self.expected("equals sign or TO")
4818 }
4819 }
4820 }
4821
4822 pub fn parse_show(&mut self) -> ModalResult<Statement> {
4826 let checkpoint = *self;
4827 if let Token::Word(w) = self.next_token().token {
4828 match w.keyword {
4829 Keyword::TABLES => {
4830 return Ok(Statement::ShowObjects {
4831 object: ShowObject::Table {
4832 schema: self.parse_from_and_identifier()?,
4833 },
4834 filter: self.parse_show_statement_filter()?,
4835 });
4836 }
4837 Keyword::INTERNAL => {
4838 self.expect_keyword(Keyword::TABLES)?;
4839 return Ok(Statement::ShowObjects {
4840 object: ShowObject::InternalTable {
4841 schema: self.parse_from_and_identifier()?,
4842 },
4843 filter: self.parse_show_statement_filter()?,
4844 });
4845 }
4846 Keyword::SOURCES => {
4847 return Ok(Statement::ShowObjects {
4848 object: ShowObject::Source {
4849 schema: self.parse_from_and_identifier()?,
4850 },
4851 filter: self.parse_show_statement_filter()?,
4852 });
4853 }
4854 Keyword::SINKS => {
4855 return Ok(Statement::ShowObjects {
4856 object: ShowObject::Sink {
4857 schema: self.parse_from_and_identifier()?,
4858 },
4859 filter: self.parse_show_statement_filter()?,
4860 });
4861 }
4862 Keyword::SUBSCRIPTIONS => {
4863 return Ok(Statement::ShowObjects {
4864 object: ShowObject::Subscription {
4865 schema: self.parse_from_and_identifier()?,
4866 },
4867 filter: self.parse_show_statement_filter()?,
4868 });
4869 }
4870 Keyword::DATABASES => {
4871 return Ok(Statement::ShowObjects {
4872 object: ShowObject::Database,
4873 filter: self.parse_show_statement_filter()?,
4874 });
4875 }
4876 Keyword::SCHEMAS => {
4877 return Ok(Statement::ShowObjects {
4878 object: ShowObject::Schema,
4879 filter: self.parse_show_statement_filter()?,
4880 });
4881 }
4882 Keyword::VIEWS => {
4883 return Ok(Statement::ShowObjects {
4884 object: ShowObject::View {
4885 schema: self.parse_from_and_identifier()?,
4886 },
4887 filter: self.parse_show_statement_filter()?,
4888 });
4889 }
4890 Keyword::MATERIALIZED => {
4891 if self.parse_keyword(Keyword::VIEWS) {
4892 return Ok(Statement::ShowObjects {
4893 object: ShowObject::MaterializedView {
4894 schema: self.parse_from_and_identifier()?,
4895 },
4896 filter: self.parse_show_statement_filter()?,
4897 });
4898 } else {
4899 return self.expected("VIEWS after MATERIALIZED");
4900 }
4901 }
4902 Keyword::COLUMNS => {
4903 if self.parse_keyword(Keyword::FROM) {
4904 return Ok(Statement::ShowObjects {
4905 object: ShowObject::Columns {
4906 table: self.parse_object_name()?,
4907 },
4908 filter: self.parse_show_statement_filter()?,
4909 });
4910 } else {
4911 return self.expected("from after columns");
4912 }
4913 }
4914 Keyword::SECRETS => {
4915 return Ok(Statement::ShowObjects {
4916 object: ShowObject::Secret {
4917 schema: self.parse_from_and_identifier()?,
4918 },
4919 filter: self.parse_show_statement_filter()?,
4920 });
4921 }
4922 Keyword::CONNECTIONS => {
4923 return Ok(Statement::ShowObjects {
4924 object: ShowObject::Connection {
4925 schema: self.parse_from_and_identifier()?,
4926 },
4927 filter: self.parse_show_statement_filter()?,
4928 });
4929 }
4930 Keyword::FUNCTIONS => {
4931 return Ok(Statement::ShowObjects {
4932 object: ShowObject::Function {
4933 schema: self.parse_from_and_identifier()?,
4934 },
4935 filter: self.parse_show_statement_filter()?,
4936 });
4937 }
4938 Keyword::INDEXES => {
4939 if self.parse_keyword(Keyword::FROM) {
4940 return Ok(Statement::ShowObjects {
4941 object: ShowObject::Indexes {
4942 table: self.parse_object_name()?,
4943 },
4944 filter: self.parse_show_statement_filter()?,
4945 });
4946 } else {
4947 return self.expected("from after indexes");
4948 }
4949 }
4950 Keyword::CLUSTER => {
4951 return Ok(Statement::ShowObjects {
4952 object: ShowObject::Cluster,
4953 filter: self.parse_show_statement_filter()?,
4954 });
4955 }
4956 Keyword::JOBS => {
4957 return Ok(Statement::ShowObjects {
4958 object: ShowObject::Jobs,
4959 filter: self.parse_show_statement_filter()?,
4960 });
4961 }
4962 Keyword::PROCESSLIST => {
4963 return Ok(Statement::ShowObjects {
4964 object: ShowObject::ProcessList,
4965 filter: self.parse_show_statement_filter()?,
4966 });
4967 }
4968 Keyword::TRANSACTION => {
4969 self.expect_keywords(&[Keyword::ISOLATION, Keyword::LEVEL])?;
4970 return Ok(Statement::ShowTransactionIsolationLevel);
4971 }
4972 Keyword::CURSORS => {
4973 return Ok(Statement::ShowObjects {
4974 object: ShowObject::Cursor,
4975 filter: None,
4976 });
4977 }
4978 Keyword::SUBSCRIPTION => {
4979 self.expect_keyword(Keyword::CURSORS)?;
4980 return Ok(Statement::ShowObjects {
4981 object: ShowObject::SubscriptionCursor,
4982 filter: None,
4983 });
4984 }
4985 _ => {}
4986 }
4987 }
4988 *self = checkpoint;
4989 Ok(Statement::ShowVariable {
4990 variable: self.parse_identifiers()?,
4991 })
4992 }
4993
4994 pub fn parse_cancel_job(&mut self) -> ModalResult<Statement> {
4995 match self.peek_token().token {
4997 Token::Word(w) if Keyword::JOBS == w.keyword || Keyword::JOB == w.keyword => {
4998 self.next_token();
4999 }
5000 _ => return self.expected("JOBS or JOB after CANCEL"),
5001 }
5002
5003 let mut job_ids = vec![];
5004 loop {
5005 job_ids.push(self.parse_literal_uint()? as u32);
5006 if !self.consume_token(&Token::Comma) {
5007 break;
5008 }
5009 }
5010 Ok(Statement::CancelJobs(JobIdents(job_ids)))
5011 }
5012
5013 pub fn parse_kill_process(&mut self) -> ModalResult<Statement> {
5014 let process_id = self.parse_literal_uint()? as i32;
5015 Ok(Statement::Kill(process_id))
5016 }
5017
5018 pub fn parse_from_and_identifier(&mut self) -> ModalResult<Option<Ident>> {
5021 if self.parse_keyword(Keyword::FROM) {
5022 Ok(Some(self.parse_identifier_non_reserved()?))
5023 } else {
5024 Ok(None)
5025 }
5026 }
5027
5028 pub fn parse_show_create(&mut self) -> ModalResult<Statement> {
5030 if let Token::Word(w) = self.next_token().token {
5031 let show_type = match w.keyword {
5032 Keyword::TABLE => ShowCreateType::Table,
5033 Keyword::MATERIALIZED => {
5034 if self.parse_keyword(Keyword::VIEW) {
5035 ShowCreateType::MaterializedView
5036 } else {
5037 return self.expected("VIEW after MATERIALIZED");
5038 }
5039 }
5040 Keyword::VIEW => ShowCreateType::View,
5041 Keyword::INDEX => ShowCreateType::Index,
5042 Keyword::SOURCE => ShowCreateType::Source,
5043 Keyword::SINK => ShowCreateType::Sink,
5044 Keyword::SUBSCRIPTION => ShowCreateType::Subscription,
5045 Keyword::FUNCTION => ShowCreateType::Function,
5046 _ => return self.expected(
5047 "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5048 ),
5049 };
5050 return Ok(Statement::ShowCreateObject {
5051 create_type: show_type,
5052 name: self.parse_object_name()?,
5053 });
5054 }
5055 self.expected(
5056 "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5057 )
5058 }
5059
5060 pub fn parse_show_statement_filter(&mut self) -> ModalResult<Option<ShowStatementFilter>> {
5061 if self.parse_keyword(Keyword::LIKE) {
5062 Ok(Some(ShowStatementFilter::Like(
5063 self.parse_literal_string()?,
5064 )))
5065 } else if self.parse_keyword(Keyword::ILIKE) {
5066 Ok(Some(ShowStatementFilter::ILike(
5067 self.parse_literal_string()?,
5068 )))
5069 } else if self.parse_keyword(Keyword::WHERE) {
5070 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
5071 } else {
5072 Ok(None)
5073 }
5074 }
5075
5076 pub fn parse_table_and_joins(&mut self) -> ModalResult<TableWithJoins> {
5077 let relation = self.parse_table_factor()?;
5078
5079 let mut joins = vec![];
5083 loop {
5084 let join = if self.parse_keyword(Keyword::CROSS) {
5085 let join_operator = if self.parse_keyword(Keyword::JOIN) {
5086 JoinOperator::CrossJoin
5087 } else {
5088 return self.expected("JOIN after CROSS");
5089 };
5090 Join {
5091 relation: self.parse_table_factor()?,
5092 join_operator,
5093 }
5094 } else {
5095 let (natural, asof) =
5096 match self.parse_one_of_keywords(&[Keyword::NATURAL, Keyword::ASOF]) {
5097 Some(Keyword::NATURAL) => (true, false),
5098 Some(Keyword::ASOF) => (false, true),
5099 Some(_) => unreachable!(),
5100 None => (false, false),
5101 };
5102 let peek_keyword = if let Token::Word(w) = self.peek_token().token {
5103 w.keyword
5104 } else {
5105 Keyword::NoKeyword
5106 };
5107
5108 let join_operator_type = match peek_keyword {
5109 Keyword::INNER | Keyword::JOIN => {
5110 let _ = self.parse_keyword(Keyword::INNER);
5111 self.expect_keyword(Keyword::JOIN)?;
5112 if asof {
5113 JoinOperator::AsOfInner
5114 } else {
5115 JoinOperator::Inner
5116 }
5117 }
5118 kw @ Keyword::LEFT | kw @ Keyword::RIGHT | kw @ Keyword::FULL => {
5119 let checkpoint = *self;
5120 let _ = self.next_token();
5121 let _ = self.parse_keyword(Keyword::OUTER);
5122 self.expect_keyword(Keyword::JOIN)?;
5123 if asof {
5124 if Keyword::LEFT == kw {
5125 JoinOperator::AsOfLeft
5126 } else {
5127 return self.expected_at(
5128 checkpoint,
5129 "LEFT after ASOF. RIGHT or FULL are not supported",
5130 );
5131 }
5132 } else {
5133 match kw {
5134 Keyword::LEFT => JoinOperator::LeftOuter,
5135 Keyword::RIGHT => JoinOperator::RightOuter,
5136 Keyword::FULL => JoinOperator::FullOuter,
5137 _ => unreachable!(),
5138 }
5139 }
5140 }
5141 Keyword::OUTER => {
5142 return self.expected("LEFT, RIGHT, or FULL");
5143 }
5144 _ if natural => {
5145 return self.expected("a join type after NATURAL");
5146 }
5147 _ if asof => {
5148 return self.expected("a join type after ASOF");
5149 }
5150 _ => break,
5151 };
5152 let relation = self.parse_table_factor()?;
5153 let join_constraint = self.parse_join_constraint(natural)?;
5154 let join_operator = join_operator_type(join_constraint);
5155 let need_constraint = match join_operator {
5156 JoinOperator::Inner(JoinConstraint::None) => Some("INNER JOIN"),
5157 JoinOperator::AsOfInner(JoinConstraint::None) => Some("ASOF INNER JOIN"),
5158 JoinOperator::AsOfLeft(JoinConstraint::None) => Some("ASOF LEFT JOIN"),
5159 _ => None,
5160 };
5161 if let Some(join_type) = need_constraint {
5162 return self.expected(&format!("join constraint after {join_type}"));
5163 }
5164
5165 Join {
5166 relation,
5167 join_operator,
5168 }
5169 };
5170 joins.push(join);
5171 }
5172 Ok(TableWithJoins { relation, joins })
5173 }
5174
5175 pub fn parse_table_factor(&mut self) -> ModalResult<TableFactor> {
5177 if self.parse_keyword(Keyword::LATERAL) {
5178 if !self.consume_token(&Token::LParen) {
5180 self.expected("subquery after LATERAL")?;
5181 }
5182 self.parse_derived_table_factor(Lateral)
5183 } else if self.consume_token(&Token::LParen) {
5184 match self.peek_token().token {
5204 Token::Word(w)
5205 if [Keyword::SELECT, Keyword::WITH, Keyword::VALUES].contains(&w.keyword) =>
5206 {
5207 return self.parse_derived_table_factor(NotLateral);
5208 }
5209 _ => {}
5210 };
5211 if self.peek_token() == Token::LParen {
5215 return_ok_if_some!(
5216 self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))
5217 );
5218 }
5219
5220 let table_and_joins = self.parse_table_and_joins()?;
5227
5228 #[allow(clippy::if_same_then_else)]
5229 if !table_and_joins.joins.is_empty() {
5230 self.expect_token(&Token::RParen)?;
5231 Ok(TableFactor::NestedJoin(Box::new(table_and_joins))) } else if let TableFactor::NestedJoin(_) = &table_and_joins.relation {
5233 self.expect_token(&Token::RParen)?;
5236 Ok(TableFactor::NestedJoin(Box::new(table_and_joins)))
5237 } else {
5238 parser_err!(
5241 "Expected joined table, found: {table_and_joins}, next_token: {}",
5242 self.peek_token()
5243 );
5244 }
5245 } else {
5246 let name = self.parse_object_name()?;
5247 if self.peek_token() == Token::LParen {
5248 let arg_list = self.parse_argument_list()?;
5251 if arg_list.distinct {
5252 parser_err!("DISTINCT is not supported in table-valued function calls");
5253 }
5254 if !arg_list.order_by.is_empty() {
5255 parser_err!("ORDER BY is not supported in table-valued function calls");
5256 }
5257 if arg_list.ignore_nulls {
5258 parser_err!("IGNORE NULLS is not supported in table-valued function calls");
5259 }
5260
5261 let args = arg_list.args;
5262 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
5263 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5264
5265 Ok(TableFactor::TableFunction {
5266 name,
5267 alias,
5268 args,
5269 with_ordinality,
5270 })
5271 } else {
5272 let as_of = opt(Self::parse_as_of).parse_next(self)?;
5273 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5274 Ok(TableFactor::Table { name, alias, as_of })
5275 }
5276 }
5277 }
5278
5279 pub fn parse_derived_table_factor(&mut self, lateral: IsLateral) -> ModalResult<TableFactor> {
5280 let subquery = Box::new(self.parse_query()?);
5281 self.expect_token(&Token::RParen)?;
5282 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5283 Ok(TableFactor::Derived {
5284 lateral: match lateral {
5285 Lateral => true,
5286 NotLateral => false,
5287 },
5288 subquery,
5289 alias,
5290 })
5291 }
5292
5293 fn parse_join_constraint(&mut self, natural: bool) -> ModalResult<JoinConstraint> {
5294 if natural {
5295 Ok(JoinConstraint::Natural)
5296 } else if self.parse_keyword(Keyword::ON) {
5297 let constraint = self.parse_expr()?;
5298 Ok(JoinConstraint::On(constraint))
5299 } else if self.parse_keyword(Keyword::USING) {
5300 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5301 Ok(JoinConstraint::Using(columns))
5302 } else {
5303 Ok(JoinConstraint::None)
5304 }
5306 }
5307
5308 pub fn parse_grant(&mut self) -> ModalResult<Statement> {
5310 let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5311
5312 self.expect_keyword(Keyword::TO)?;
5313 let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5314
5315 let with_grant_option =
5316 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
5317
5318 let granted_by = self
5319 .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5320 .then(|| self.parse_identifier().unwrap());
5321
5322 Ok(Statement::Grant {
5323 privileges,
5324 objects,
5325 grantees,
5326 with_grant_option,
5327 granted_by,
5328 })
5329 }
5330
5331 fn parse_grant_revoke_privileges_objects(&mut self) -> ModalResult<(Privileges, GrantObjects)> {
5332 let privileges = if self.parse_keyword(Keyword::ALL) {
5333 Privileges::All {
5334 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
5335 }
5336 } else {
5337 Privileges::Actions(
5338 self.parse_comma_separated(Parser::parse_grant_permission)?
5339 .into_iter()
5340 .map(|(kw, columns)| match kw {
5341 Keyword::CONNECT => Action::Connect,
5342 Keyword::CREATE => Action::Create,
5343 Keyword::DELETE => Action::Delete,
5344 Keyword::EXECUTE => Action::Execute,
5345 Keyword::INSERT => Action::Insert { columns },
5346 Keyword::REFERENCES => Action::References { columns },
5347 Keyword::SELECT => Action::Select { columns },
5348 Keyword::TEMPORARY => Action::Temporary,
5349 Keyword::TRIGGER => Action::Trigger,
5350 Keyword::TRUNCATE => Action::Truncate,
5351 Keyword::UPDATE => Action::Update { columns },
5352 Keyword::USAGE => Action::Usage,
5353 _ => unreachable!(),
5354 })
5355 .collect(),
5356 )
5357 };
5358
5359 self.expect_keyword(Keyword::ON)?;
5360
5361 let objects = if self.parse_keywords(&[
5362 Keyword::ALL,
5363 Keyword::TABLES,
5364 Keyword::IN,
5365 Keyword::SCHEMA,
5366 ]) {
5367 GrantObjects::AllTablesInSchema {
5368 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5369 }
5370 } else if self.parse_keywords(&[
5371 Keyword::ALL,
5372 Keyword::SEQUENCES,
5373 Keyword::IN,
5374 Keyword::SCHEMA,
5375 ]) {
5376 GrantObjects::AllSequencesInSchema {
5377 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5378 }
5379 } else if self.parse_keywords(&[
5380 Keyword::ALL,
5381 Keyword::SOURCES,
5382 Keyword::IN,
5383 Keyword::SCHEMA,
5384 ]) {
5385 GrantObjects::AllSourcesInSchema {
5386 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5387 }
5388 } else if self.parse_keywords(&[Keyword::ALL, Keyword::SINKS, Keyword::IN, Keyword::SCHEMA])
5389 {
5390 GrantObjects::AllSinksInSchema {
5391 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5392 }
5393 } else if self.parse_keywords(&[
5394 Keyword::ALL,
5395 Keyword::MATERIALIZED,
5396 Keyword::VIEWS,
5397 Keyword::IN,
5398 Keyword::SCHEMA,
5399 ]) {
5400 GrantObjects::AllMviewsInSchema {
5401 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5402 }
5403 } else if self.parse_keywords(&[Keyword::ALL, Keyword::VIEWS, Keyword::IN, Keyword::SCHEMA])
5404 {
5405 GrantObjects::AllViewsInSchema {
5406 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5407 }
5408 } else if self.parse_keywords(&[
5409 Keyword::ALL,
5410 Keyword::FUNCTIONS,
5411 Keyword::IN,
5412 Keyword::SCHEMA,
5413 ]) {
5414 GrantObjects::AllFunctionsInSchema {
5415 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5416 }
5417 } else if self.parse_keywords(&[
5418 Keyword::ALL,
5419 Keyword::SECRETS,
5420 Keyword::IN,
5421 Keyword::SCHEMA,
5422 ]) {
5423 GrantObjects::AllSecretsInSchema {
5424 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5425 }
5426 } else if self.parse_keywords(&[
5427 Keyword::ALL,
5428 Keyword::CONNECTIONS,
5429 Keyword::IN,
5430 Keyword::SCHEMA,
5431 ]) {
5432 GrantObjects::AllConnectionsInSchema {
5433 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5434 }
5435 } else if self.parse_keywords(&[
5436 Keyword::ALL,
5437 Keyword::SUBSCRIPTIONS,
5438 Keyword::IN,
5439 Keyword::SCHEMA,
5440 ]) {
5441 GrantObjects::AllSubscriptionsInSchema {
5442 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5443 }
5444 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
5445 GrantObjects::Mviews(self.parse_comma_separated(Parser::parse_object_name)?)
5446 } else {
5447 let object_type = self.parse_one_of_keywords(&[
5448 Keyword::SEQUENCE,
5449 Keyword::DATABASE,
5450 Keyword::SCHEMA,
5451 Keyword::TABLE,
5452 Keyword::SOURCE,
5453 Keyword::SINK,
5454 Keyword::VIEW,
5455 Keyword::SUBSCRIPTION,
5456 Keyword::FUNCTION,
5457 Keyword::CONNECTION,
5458 Keyword::SECRET,
5459 ]);
5460 if let Some(Keyword::FUNCTION) = object_type {
5461 let func_descs = self.parse_comma_separated(Parser::parse_function_desc)?;
5462 GrantObjects::Functions(func_descs)
5463 } else {
5464 let objects = self.parse_comma_separated(Parser::parse_object_name);
5465 match object_type {
5466 Some(Keyword::DATABASE) => GrantObjects::Databases(objects?),
5467 Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
5468 Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
5469 Some(Keyword::SOURCE) => GrantObjects::Sources(objects?),
5470 Some(Keyword::SINK) => GrantObjects::Sinks(objects?),
5471 Some(Keyword::VIEW) => GrantObjects::Views(objects?),
5472 Some(Keyword::SUBSCRIPTION) => GrantObjects::Subscriptions(objects?),
5473 Some(Keyword::CONNECTION) => GrantObjects::Connections(objects?),
5474 Some(Keyword::SECRET) => GrantObjects::Secrets(objects?),
5475 Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
5476 _ => unreachable!(),
5477 }
5478 }
5479 };
5480
5481 Ok((privileges, objects))
5482 }
5483
5484 fn parse_grant_permission(&mut self) -> ModalResult<(Keyword, Option<Vec<Ident>>)> {
5485 let kw = self.expect_one_of_keywords(&[
5486 Keyword::CONNECT,
5487 Keyword::CREATE,
5488 Keyword::DELETE,
5489 Keyword::EXECUTE,
5490 Keyword::INSERT,
5491 Keyword::REFERENCES,
5492 Keyword::SELECT,
5493 Keyword::TEMPORARY,
5494 Keyword::TRIGGER,
5495 Keyword::TRUNCATE,
5496 Keyword::UPDATE,
5497 Keyword::USAGE,
5498 ])?;
5499 let columns = match kw {
5500 Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
5501 let columns = self.parse_parenthesized_column_list(Optional)?;
5502 if columns.is_empty() {
5503 None
5504 } else {
5505 Some(columns)
5506 }
5507 }
5508 _ => None,
5509 };
5510 Ok((kw, columns))
5511 }
5512
5513 pub fn parse_revoke(&mut self) -> ModalResult<Statement> {
5515 let revoke_grant_option =
5516 self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
5517 let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5518
5519 self.expect_keyword(Keyword::FROM)?;
5520 let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5521
5522 let granted_by = self
5523 .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5524 .then(|| self.parse_identifier().unwrap());
5525
5526 let cascade = self.parse_keyword(Keyword::CASCADE);
5527 let restrict = self.parse_keyword(Keyword::RESTRICT);
5528 if cascade && restrict {
5529 parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
5530 }
5531
5532 Ok(Statement::Revoke {
5533 privileges,
5534 objects,
5535 grantees,
5536 granted_by,
5537 revoke_grant_option,
5538 cascade,
5539 })
5540 }
5541
5542 pub fn parse_insert(&mut self) -> ModalResult<Statement> {
5544 self.expect_keyword(Keyword::INTO)?;
5545
5546 let table_name = self.parse_object_name()?;
5547 let columns = self.parse_parenthesized_column_list(Optional)?;
5548
5549 let source = Box::new(self.parse_query()?);
5550 let returning = self.parse_returning(Optional)?;
5551 Ok(Statement::Insert {
5552 table_name,
5553 columns,
5554 source,
5555 returning,
5556 })
5557 }
5558
5559 pub fn parse_update(&mut self) -> ModalResult<Statement> {
5560 let table_name = self.parse_object_name()?;
5561
5562 self.expect_keyword(Keyword::SET)?;
5563 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
5564 let selection = if self.parse_keyword(Keyword::WHERE) {
5565 Some(self.parse_expr()?)
5566 } else {
5567 None
5568 };
5569 let returning = self.parse_returning(Optional)?;
5570 Ok(Statement::Update {
5571 table_name,
5572 assignments,
5573 selection,
5574 returning,
5575 })
5576 }
5577
5578 pub fn parse_assignment(&mut self) -> ModalResult<Assignment> {
5580 let id = self.parse_identifiers_non_keywords()?;
5581 self.expect_token(&Token::Eq)?;
5582
5583 let value = if self.parse_keyword(Keyword::DEFAULT) {
5584 AssignmentValue::Default
5585 } else {
5586 AssignmentValue::Expr(self.parse_expr()?)
5587 };
5588
5589 Ok(Assignment { id, value })
5590 }
5591
5592 fn parse_function_args(&mut self) -> ModalResult<(bool, FunctionArg)> {
5594 let variadic = self.parse_keyword(Keyword::VARIADIC);
5595 let arg = if self.peek_nth_token(1) == Token::RArrow {
5596 let name = self.parse_identifier()?;
5597
5598 self.expect_token(&Token::RArrow)?;
5599 let arg = self.parse_wildcard_or_expr()?.into();
5600
5601 FunctionArg::Named { name, arg }
5602 } else {
5603 FunctionArg::Unnamed(self.parse_wildcard_or_expr()?.into())
5604 };
5605 Ok((variadic, arg))
5606 }
5607
5608 pub fn parse_argument_list(&mut self) -> ModalResult<FunctionArgList> {
5609 self.expect_token(&Token::LParen)?;
5610 if self.consume_token(&Token::RParen) {
5611 Ok(FunctionArgList::empty())
5612 } else {
5613 let distinct = self.parse_all_or_distinct()?;
5614 let args = self.parse_comma_separated(Parser::parse_function_args)?;
5615 if args
5616 .iter()
5617 .take(args.len() - 1)
5618 .any(|(variadic, _)| *variadic)
5619 {
5620 parser_err!("VARIADIC argument must be the last");
5621 }
5622 let variadic = args.last().map(|(variadic, _)| *variadic).unwrap_or(false);
5623 let args = args.into_iter().map(|(_, arg)| arg).collect();
5624
5625 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
5626 self.parse_comma_separated(Parser::parse_order_by_expr)?
5627 } else {
5628 vec![]
5629 };
5630
5631 let ignore_nulls = self.parse_keywords(&[Keyword::IGNORE, Keyword::NULLS]);
5632
5633 let arg_list = FunctionArgList {
5634 distinct,
5635 args,
5636 variadic,
5637 order_by,
5638 ignore_nulls,
5639 };
5640
5641 self.expect_token(&Token::RParen)?;
5642 Ok(arg_list)
5643 }
5644 }
5645
5646 pub fn parse_select_item(&mut self) -> ModalResult<SelectItem> {
5648 match self.parse_wildcard_or_expr()? {
5649 WildcardOrExpr::Expr(expr) => self
5650 .parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
5651 .map(|alias| match alias {
5652 Some(alias) => SelectItem::ExprWithAlias { expr, alias },
5653 None => SelectItem::UnnamedExpr(expr),
5654 }),
5655 WildcardOrExpr::QualifiedWildcard(prefix, except) => {
5656 Ok(SelectItem::QualifiedWildcard(prefix, except))
5657 }
5658 WildcardOrExpr::ExprQualifiedWildcard(expr, prefix) => {
5659 Ok(SelectItem::ExprQualifiedWildcard(expr, prefix))
5660 }
5661 WildcardOrExpr::Wildcard(except) => Ok(SelectItem::Wildcard(except)),
5662 }
5663 }
5664
5665 pub fn parse_order_by_expr(&mut self) -> ModalResult<OrderByExpr> {
5667 let expr = self.parse_expr()?;
5668
5669 let asc = if self.parse_keyword(Keyword::ASC) {
5670 Some(true)
5671 } else if self.parse_keyword(Keyword::DESC) {
5672 Some(false)
5673 } else {
5674 None
5675 };
5676
5677 let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
5678 Some(true)
5679 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
5680 Some(false)
5681 } else {
5682 None
5683 };
5684
5685 Ok(OrderByExpr {
5686 expr,
5687 asc,
5688 nulls_first,
5689 })
5690 }
5691
5692 pub fn parse_limit(&mut self) -> ModalResult<Option<Expr>> {
5694 if self.parse_keyword(Keyword::ALL) {
5695 Ok(None)
5696 } else {
5697 let expr = self.parse_expr()?;
5698 Ok(Some(expr))
5699 }
5700 }
5701
5702 pub fn parse_offset(&mut self) -> ModalResult<String> {
5704 let value = self.parse_number_value()?;
5705 if self.consume_token(&Token::DoubleColon) {
5707 self.expect_keyword(Keyword::BIGINT)?;
5708 }
5709 _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
5710 Ok(value)
5711 }
5712
5713 pub fn parse_fetch(&mut self) -> ModalResult<Fetch> {
5715 self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
5716 let quantity = if self
5717 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
5718 .is_some()
5719 {
5720 None
5721 } else {
5722 let quantity = self.parse_number_value()?;
5723 self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
5724 Some(quantity)
5725 };
5726 let with_ties = if self.parse_keyword(Keyword::ONLY) {
5727 false
5728 } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
5729 true
5730 } else {
5731 return self.expected("one of ONLY or WITH TIES");
5732 };
5733 Ok(Fetch {
5734 with_ties,
5735 quantity,
5736 })
5737 }
5738
5739 pub fn parse_values(&mut self) -> ModalResult<Values> {
5740 let values = self.parse_comma_separated(|parser| {
5741 parser.expect_token(&Token::LParen)?;
5742 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
5743 parser.expect_token(&Token::RParen)?;
5744 Ok(exprs)
5745 })?;
5746 Ok(Values(values))
5747 }
5748
5749 pub fn parse_start_transaction(&mut self) -> ModalResult<Statement> {
5750 self.expect_keyword(Keyword::TRANSACTION)?;
5751 Ok(Statement::StartTransaction {
5752 modes: self.parse_transaction_modes()?,
5753 })
5754 }
5755
5756 pub fn parse_begin(&mut self) -> ModalResult<Statement> {
5757 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
5758 Ok(Statement::Begin {
5759 modes: self.parse_transaction_modes()?,
5760 })
5761 }
5762
5763 pub fn parse_transaction_modes(&mut self) -> ModalResult<Vec<TransactionMode>> {
5764 let mut modes = vec![];
5765 let mut required = false;
5766 loop {
5767 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
5768 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
5769 TransactionIsolationLevel::ReadUncommitted
5770 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
5771 TransactionIsolationLevel::ReadCommitted
5772 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
5773 TransactionIsolationLevel::RepeatableRead
5774 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
5775 TransactionIsolationLevel::Serializable
5776 } else {
5777 self.expected("isolation level")?
5778 };
5779 TransactionMode::IsolationLevel(iso_level)
5780 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
5781 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
5782 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
5783 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
5784 } else if required {
5785 self.expected("transaction mode")?
5786 } else {
5787 break;
5788 };
5789 modes.push(mode);
5790 required = self.consume_token(&Token::Comma);
5795 }
5796 Ok(modes)
5797 }
5798
5799 pub fn parse_commit(&mut self) -> ModalResult<Statement> {
5800 Ok(Statement::Commit {
5801 chain: self.parse_commit_rollback_chain()?,
5802 })
5803 }
5804
5805 pub fn parse_rollback(&mut self) -> ModalResult<Statement> {
5806 Ok(Statement::Rollback {
5807 chain: self.parse_commit_rollback_chain()?,
5808 })
5809 }
5810
5811 pub fn parse_commit_rollback_chain(&mut self) -> ModalResult<bool> {
5812 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
5813 if self.parse_keyword(Keyword::AND) {
5814 let chain = !self.parse_keyword(Keyword::NO);
5815 self.expect_keyword(Keyword::CHAIN)?;
5816 Ok(chain)
5817 } else {
5818 Ok(false)
5819 }
5820 }
5821
5822 fn parse_deallocate(&mut self) -> ModalResult<Statement> {
5823 let prepare = self.parse_keyword(Keyword::PREPARE);
5824 let name = self.parse_identifier()?;
5825 Ok(Statement::Deallocate { name, prepare })
5826 }
5827
5828 fn parse_execute(&mut self) -> ModalResult<Statement> {
5829 let name = self.parse_identifier()?;
5830
5831 let mut parameters = vec![];
5832 if self.consume_token(&Token::LParen) {
5833 parameters = self.parse_comma_separated(Parser::parse_expr)?;
5834 self.expect_token(&Token::RParen)?;
5835 }
5836
5837 Ok(Statement::Execute { name, parameters })
5838 }
5839
5840 fn parse_prepare(&mut self) -> ModalResult<Statement> {
5841 let name = self.parse_identifier()?;
5842
5843 let mut data_types = vec![];
5844 if self.consume_token(&Token::LParen) {
5845 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
5846 self.expect_token(&Token::RParen)?;
5847 }
5848
5849 self.expect_keyword(Keyword::AS)?;
5850 let statement = Box::new(self.parse_statement()?);
5851 Ok(Statement::Prepare {
5852 name,
5853 data_types,
5854 statement,
5855 })
5856 }
5857
5858 fn parse_comment(&mut self) -> ModalResult<Statement> {
5859 self.expect_keyword(Keyword::ON)?;
5860 let checkpoint = *self;
5861 let token = self.next_token();
5862
5863 let (object_type, object_name) = match token.token {
5864 Token::Word(w) if w.keyword == Keyword::COLUMN => {
5865 let object_name = self.parse_object_name()?;
5866 (CommentObject::Column, object_name)
5867 }
5868 Token::Word(w) if w.keyword == Keyword::TABLE => {
5869 let object_name = self.parse_object_name()?;
5870 (CommentObject::Table, object_name)
5871 }
5872 _ => self.expected_at(checkpoint, "comment object_type")?,
5873 };
5874
5875 self.expect_keyword(Keyword::IS)?;
5876 let comment = if self.parse_keyword(Keyword::NULL) {
5877 None
5878 } else {
5879 Some(self.parse_literal_string()?)
5880 };
5881 Ok(Statement::Comment {
5882 object_type,
5883 object_name,
5884 comment,
5885 })
5886 }
5887
5888 fn parse_use(&mut self) -> ModalResult<Statement> {
5889 let db_name = self.parse_object_name()?;
5890 Ok(Statement::Use { db_name })
5891 }
5892}
5893
5894impl Word {
5895 pub fn to_ident(&self) -> ModalResult<Ident> {
5897 if self.value.is_empty() {
5898 parser_err!("zero-length delimited identifier at or near \"{self}\"")
5899 } else {
5900 Ok(Ident {
5901 value: self.value.clone(),
5902 quote_style: self.quote_style,
5903 })
5904 }
5905 }
5906}
5907
5908#[cfg(test)]
5909mod tests {
5910 use super::*;
5911 use crate::test_utils::run_parser_method;
5912
5913 #[test]
5914 fn test_parse_integer_min() {
5915 let min_bigint = "-9223372036854775808";
5916 run_parser_method(min_bigint, |parser| {
5917 assert_eq!(
5918 parser.parse_expr().unwrap(),
5919 Expr::Value(Value::Number("-9223372036854775808".to_owned()))
5920 )
5921 });
5922 }
5923}