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