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 AlterDatabaseOperation::SetParam(self.parse_config_param()?)
3221 } else {
3222 return self.expected("RENAME, OWNER TO, OR SET after ALTER DATABASE");
3223 };
3224
3225 Ok(Statement::AlterDatabase {
3226 name: database_name,
3227 operation,
3228 })
3229 }
3230
3231 pub fn parse_alter_schema(&mut self) -> ModalResult<Statement> {
3232 let schema_name = self.parse_object_name()?;
3233 let operation = if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3234 let owner_name: Ident = self.parse_identifier()?;
3235 AlterSchemaOperation::ChangeOwner {
3236 new_owner_name: owner_name,
3237 }
3238 } else if self.parse_keyword(Keyword::RENAME) {
3239 self.expect_keyword(Keyword::TO)?;
3240 let schema_name = self.parse_object_name()?;
3241 AlterSchemaOperation::RenameSchema { schema_name }
3242 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3243 let target_schema = self.parse_object_name()?;
3244 AlterSchemaOperation::SwapRenameSchema { target_schema }
3245 } else {
3246 return self.expected("RENAME, OWNER TO, OR SWAP WITH after ALTER SCHEMA");
3247 };
3248
3249 Ok(Statement::AlterSchema {
3250 name: schema_name,
3251 operation,
3252 })
3253 }
3254
3255 pub fn parse_alter_user(&mut self) -> ModalResult<Statement> {
3256 Ok(Statement::AlterUser(AlterUserStatement::parse_to(self)?))
3257 }
3258
3259 pub fn parse_alter_table(&mut self) -> ModalResult<Statement> {
3260 let _ = self.parse_keyword(Keyword::ONLY);
3261 let table_name = self.parse_object_name()?;
3262 let operation = if self.parse_keyword(Keyword::ADD) {
3263 if let Some(constraint) = self.parse_optional_table_constraint()? {
3264 AlterTableOperation::AddConstraint(constraint)
3265 } else {
3266 let _ = self.parse_keyword(Keyword::COLUMN);
3267 let _if_not_exists =
3268 self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3269 let column_def = self.parse_column_def()?;
3270 AlterTableOperation::AddColumn { column_def }
3271 }
3272 } else if self.parse_keywords(&[Keyword::DROP, Keyword::CONNECTOR]) {
3273 AlterTableOperation::DropConnector
3274 } else if self.parse_keyword(Keyword::RENAME) {
3275 if self.parse_keyword(Keyword::CONSTRAINT) {
3276 let old_name = self.parse_identifier_non_reserved()?;
3277 self.expect_keyword(Keyword::TO)?;
3278 let new_name = self.parse_identifier_non_reserved()?;
3279 AlterTableOperation::RenameConstraint { old_name, new_name }
3280 } else if self.parse_keyword(Keyword::TO) {
3281 let table_name = self.parse_object_name()?;
3282 AlterTableOperation::RenameTable { table_name }
3283 } else {
3284 let _ = self.parse_keyword(Keyword::COLUMN);
3285 let old_column_name = self.parse_identifier_non_reserved()?;
3286 self.expect_keyword(Keyword::TO)?;
3287 let new_column_name = self.parse_identifier_non_reserved()?;
3288 AlterTableOperation::RenameColumn {
3289 old_column_name,
3290 new_column_name,
3291 }
3292 }
3293 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3294 let owner_name: Ident = self.parse_identifier()?;
3295 AlterTableOperation::ChangeOwner {
3296 new_owner_name: owner_name,
3297 }
3298 } else if self.parse_keyword(Keyword::SET) {
3299 if self.parse_keyword(Keyword::SCHEMA) {
3300 let schema_name = self.parse_object_name()?;
3301 AlterTableOperation::SetSchema {
3302 new_schema_name: schema_name,
3303 }
3304 } else if self.parse_keyword(Keyword::PARALLELISM) {
3305 if self.expect_keyword(Keyword::TO).is_err()
3306 && self.expect_token(&Token::Eq).is_err()
3307 {
3308 return self.expected("TO or = after ALTER TABLE SET PARALLELISM");
3309 }
3310
3311 let value = self.parse_set_variable()?;
3312
3313 let deferred = self.parse_keyword(Keyword::DEFERRED);
3314
3315 AlterTableOperation::SetParallelism {
3316 parallelism: value,
3317 deferred,
3318 }
3319 } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3320 if self.expect_keyword(Keyword::TO).is_err()
3321 && self.expect_token(&Token::Eq).is_err()
3322 {
3323 return self.expected("TO or = after ALTER TABLE SET BACKFILL_PARALLELISM");
3324 }
3325
3326 let value = self.parse_set_variable()?;
3327
3328 let deferred = self.parse_keyword(Keyword::DEFERRED);
3329
3330 AlterTableOperation::SetBackfillParallelism {
3331 parallelism: value,
3332 deferred,
3333 }
3334 } else if let Some(rate_limit) = self.parse_alter_source_rate_limit(true)? {
3335 AlterTableOperation::SetSourceRateLimit { rate_limit }
3336 } else if let Some(rate_limit) = self.parse_alter_backfill_rate_limit()? {
3337 AlterTableOperation::SetBackfillRateLimit { rate_limit }
3338 } else if let Some(rate_limit) = self.parse_alter_dml_rate_limit()? {
3339 AlterTableOperation::SetDmlRateLimit { rate_limit }
3340 } else if self.parse_keyword(Keyword::CONFIG) {
3341 let entries = self.parse_options()?;
3342 AlterTableOperation::SetConfig { entries }
3343 } else {
3344 return self.expected(
3345 "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/SOURCE_RATE_LIMIT/DML_RATE_LIMIT/CONFIG after SET",
3346 );
3347 }
3348 } else if self.parse_keyword(Keyword::RESET) {
3349 if self.parse_keyword(Keyword::CONFIG) {
3350 let keys = self.parse_parenthesized_object_name_list()?;
3351 AlterTableOperation::ResetConfig { keys }
3352 } else {
3353 return self.expected("CONFIG after RESET");
3354 }
3355 } else if self.parse_keyword(Keyword::DROP) {
3356 let _ = self.parse_keyword(Keyword::COLUMN);
3357 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
3358 let column_name = self.parse_identifier_non_reserved()?;
3359 let cascade = self.parse_keyword(Keyword::CASCADE);
3360 AlterTableOperation::DropColumn {
3361 column_name,
3362 if_exists,
3363 cascade,
3364 }
3365 } else if self.parse_keyword(Keyword::ALTER) {
3366 if self.parse_keywords(&[Keyword::WATERMARK, Keyword::FOR]) {
3369 let column_name = self.parse_identifier_non_reserved()?;
3370 self.expect_keyword(Keyword::AS)?;
3371 let expr = self.parse_expr()?;
3372 let with_ttl = self.parse_keywords(&[Keyword::WITH, Keyword::TTL]);
3373 return Ok(Statement::AlterTable {
3374 name: table_name,
3375 operation: AlterTableOperation::AlterWatermark {
3376 column_name,
3377 expr,
3378 with_ttl,
3379 },
3380 });
3381 }
3382 let _ = self.parse_keyword(Keyword::COLUMN);
3383 let column_name = self.parse_identifier_non_reserved()?;
3384
3385 let op = if self.parse_keywords(&[Keyword::SET, Keyword::NOT, Keyword::NULL]) {
3386 AlterColumnOperation::SetNotNull {}
3387 } else if self.parse_keywords(&[Keyword::DROP, Keyword::NOT, Keyword::NULL]) {
3388 AlterColumnOperation::DropNotNull {}
3389 } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
3390 AlterColumnOperation::SetDefault {
3391 value: self.parse_expr()?,
3392 }
3393 } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
3394 AlterColumnOperation::DropDefault {}
3395 } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
3396 || (self.parse_keyword(Keyword::TYPE))
3397 {
3398 let data_type = self.parse_data_type()?;
3399 let using = if self.parse_keyword(Keyword::USING) {
3400 Some(self.parse_expr()?)
3401 } else {
3402 None
3403 };
3404 AlterColumnOperation::SetDataType { data_type, using }
3405 } else {
3406 return self
3407 .expected("SET/DROP NOT NULL, SET DEFAULT, SET DATA TYPE after ALTER COLUMN");
3408 };
3409 AlterTableOperation::AlterColumn { column_name, op }
3410 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3411 AlterTableOperation::RefreshSchema
3412 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3413 let target_table = self.parse_object_name()?;
3414 AlterTableOperation::SwapRenameTable { target_table }
3415 } else if self.parse_keyword(Keyword::CONNECTOR) {
3416 let with_options = self.parse_with_properties()?;
3417 AlterTableOperation::AlterConnectorProps {
3418 alter_props: with_options,
3419 }
3420 } else {
3421 return self.expected(
3422 "ADD or RENAME or OWNER TO or SET or RESET or DROP or SWAP or CONNECTOR after ALTER TABLE",
3423 );
3424 };
3425 Ok(Statement::AlterTable {
3426 name: table_name,
3427 operation,
3428 })
3429 }
3430
3431 pub fn parse_alter_backfill_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3434 if !self.parse_word("BACKFILL_RATE_LIMIT") {
3435 return Ok(None);
3436 }
3437 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3438 return self.expected("TO or = after ALTER TABLE SET BACKFILL_RATE_LIMIT");
3439 }
3440 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3441 -1
3442 } else {
3443 let s = self.parse_number_value()?;
3444 if let Ok(n) = s.parse::<i32>() {
3445 n
3446 } else {
3447 return self.expected("number or DEFAULT");
3448 }
3449 };
3450 Ok(Some(rate_limit))
3451 }
3452
3453 pub fn parse_alter_dml_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3456 if !self.parse_word("DML_RATE_LIMIT") {
3457 return Ok(None);
3458 }
3459 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3460 return self.expected("TO or = after ALTER TABLE SET DML_RATE_LIMIT");
3461 }
3462 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3463 -1
3464 } else {
3465 let s = self.parse_number_value()?;
3466 if let Ok(n) = s.parse::<i32>() {
3467 n
3468 } else {
3469 return self.expected("number or DEFAULT");
3470 }
3471 };
3472 Ok(Some(rate_limit))
3473 }
3474
3475 pub fn parse_alter_source_rate_limit(&mut self, is_table: bool) -> ModalResult<Option<i32>> {
3478 if !self.parse_word("SOURCE_RATE_LIMIT") {
3479 return Ok(None);
3480 }
3481 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3482 let ddl = if is_table { "TABLE" } else { "SOURCE" };
3483 return self.expected(&format!("TO or = after ALTER {ddl} SET SOURCE_RATE_LIMIT"));
3484 }
3485 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3486 -1
3487 } else {
3488 let s = self.parse_number_value()?;
3489 if let Ok(n) = s.parse::<i32>() {
3490 n
3491 } else {
3492 return self.expected("number or DEFAULT");
3493 }
3494 };
3495 Ok(Some(rate_limit))
3496 }
3497
3498 pub fn parse_alter_index(&mut self) -> ModalResult<Statement> {
3499 let index_name = self.parse_object_name()?;
3500 let operation = if self.parse_keyword(Keyword::RENAME) {
3501 if self.parse_keyword(Keyword::TO) {
3502 let index_name = self.parse_object_name()?;
3503 AlterIndexOperation::RenameIndex { index_name }
3504 } else {
3505 return self.expected("TO after RENAME");
3506 }
3507 } else if self.parse_keyword(Keyword::SET) {
3508 if self.parse_keyword(Keyword::PARALLELISM) {
3509 if self.expect_keyword(Keyword::TO).is_err()
3510 && self.expect_token(&Token::Eq).is_err()
3511 {
3512 return self.expected("TO or = after ALTER INDEX SET PARALLELISM");
3513 }
3514
3515 let value = self.parse_set_variable()?;
3516
3517 let deferred = self.parse_keyword(Keyword::DEFERRED);
3518
3519 AlterIndexOperation::SetParallelism {
3520 parallelism: value,
3521 deferred,
3522 }
3523 } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3524 if self.expect_keyword(Keyword::TO).is_err()
3525 && self.expect_token(&Token::Eq).is_err()
3526 {
3527 return self.expected("TO or = after ALTER INDEX SET BACKFILL_PARALLELISM");
3528 }
3529
3530 let value = self.parse_set_variable()?;
3531
3532 let deferred = self.parse_keyword(Keyword::DEFERRED);
3533
3534 AlterIndexOperation::SetBackfillParallelism {
3535 parallelism: value,
3536 deferred,
3537 }
3538 } else if self.parse_keyword(Keyword::CONFIG) {
3539 let entries = self.parse_options()?;
3540 AlterIndexOperation::SetConfig { entries }
3541 } else {
3542 return self.expected("PARALLELISM/BACKFILL_PARALLELISM or CONFIG after SET");
3543 }
3544 } else if self.parse_keyword(Keyword::RESET) {
3545 if self.parse_keyword(Keyword::CONFIG) {
3546 let keys = self.parse_parenthesized_object_name_list()?;
3547 AlterIndexOperation::ResetConfig { keys }
3548 } else {
3549 return self.expected("CONFIG after RESET");
3550 }
3551 } else {
3552 return self.expected("RENAME, SET, or RESET after ALTER INDEX");
3553 };
3554
3555 Ok(Statement::AlterIndex {
3556 name: index_name,
3557 operation,
3558 })
3559 }
3560
3561 pub fn parse_alter_view(&mut self, materialized: bool) -> ModalResult<Statement> {
3562 let view_name = self.parse_object_name()?;
3563 let operation = if self.parse_keyword(Keyword::AS) {
3564 let query = Box::new(self.parse_query()?);
3565 AlterViewOperation::AsQuery { query }
3566 } else if self.parse_keyword(Keyword::RENAME) {
3567 if self.parse_keyword(Keyword::TO) {
3568 let view_name = self.parse_object_name()?;
3569 AlterViewOperation::RenameView { view_name }
3570 } else {
3571 return self.expected("TO after RENAME");
3572 }
3573 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3574 let owner_name: Ident = self.parse_identifier()?;
3575 AlterViewOperation::ChangeOwner {
3576 new_owner_name: owner_name,
3577 }
3578 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3579 let target_view = self.parse_object_name()?;
3580 AlterViewOperation::SwapRenameView { target_view }
3581 } else if self.parse_keyword(Keyword::SET) {
3582 if self.parse_keyword(Keyword::SCHEMA) {
3583 let schema_name = self.parse_object_name()?;
3584 AlterViewOperation::SetSchema {
3585 new_schema_name: schema_name,
3586 }
3587 } else if self.parse_word("STREAMING_ENABLE_UNALIGNED_JOIN") {
3588 if self.expect_keyword(Keyword::TO).is_err()
3589 && self.expect_token(&Token::Eq).is_err()
3590 {
3591 return self
3592 .expected("TO or = after ALTER TABLE SET STREAMING_ENABLE_UNALIGNED_JOIN");
3593 }
3594 let value = self.parse_boolean()?;
3595 AlterViewOperation::SetStreamingEnableUnalignedJoin { enable: value }
3596 } else if self.parse_keyword(Keyword::PARALLELISM) && materialized {
3597 if self.expect_keyword(Keyword::TO).is_err()
3598 && self.expect_token(&Token::Eq).is_err()
3599 {
3600 return self.expected("TO or = after ALTER MATERIALIZED VIEW SET PARALLELISM");
3601 }
3602
3603 let value = self.parse_set_variable()?;
3604
3605 let deferred = self.parse_keyword(Keyword::DEFERRED);
3606
3607 AlterViewOperation::SetParallelism {
3608 parallelism: value,
3609 deferred,
3610 }
3611 } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) && materialized {
3612 if self.expect_keyword(Keyword::TO).is_err()
3613 && self.expect_token(&Token::Eq).is_err()
3614 {
3615 return self.expected(
3616 "TO or = after ALTER MATERIALIZED VIEW SET BACKFILL_PARALLELISM",
3617 );
3618 }
3619
3620 let value = self.parse_set_variable()?;
3621
3622 let deferred = self.parse_keyword(Keyword::DEFERRED);
3623
3624 AlterViewOperation::SetBackfillParallelism {
3625 parallelism: value,
3626 deferred,
3627 }
3628 } else if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3629 if self.expect_keyword(Keyword::TO).is_err()
3630 && self.expect_token(&Token::Eq).is_err()
3631 {
3632 return self
3633 .expected("TO or = after ALTER MATERIALIZED VIEW SET RESOURCE_GROUP");
3634 }
3635 let value = self.parse_set_variable()?;
3636 let deferred = self.parse_keyword(Keyword::DEFERRED);
3637
3638 AlterViewOperation::SetResourceGroup {
3639 resource_group: Some(value),
3640 deferred,
3641 }
3642 } else if materialized
3643 && let Some(rate_limit) = self.parse_alter_backfill_rate_limit()?
3644 {
3645 AlterViewOperation::SetBackfillRateLimit { rate_limit }
3646 } else if self.parse_keyword(Keyword::CONFIG) && materialized {
3647 let entries = self.parse_options()?;
3648 AlterViewOperation::SetConfig { entries }
3649 } else {
3650 return self.expected(
3651 "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/BACKFILL_RATE_LIMIT/CONFIG after SET",
3652 );
3653 }
3654 } else if self.parse_keyword(Keyword::RESET) {
3655 if self.parse_keyword(Keyword::RESOURCE_GROUP) && materialized {
3656 let deferred = self.parse_keyword(Keyword::DEFERRED);
3657
3658 AlterViewOperation::SetResourceGroup {
3659 resource_group: None,
3660 deferred,
3661 }
3662 } else if self.parse_keyword(Keyword::CONFIG) && materialized {
3663 let keys = self.parse_parenthesized_object_name_list()?;
3664 AlterViewOperation::ResetConfig { keys }
3665 } else {
3666 return self.expected("RESOURCE_GROUP or CONFIG after RESET");
3667 }
3668 } else {
3669 return self.expected(&format!(
3670 "AS, RENAME, OWNER TO, SET, or SWAP after ALTER {}VIEW",
3671 if materialized { "MATERIALIZED " } else { "" }
3672 ));
3673 };
3674
3675 Ok(Statement::AlterView {
3676 materialized,
3677 name: view_name,
3678 operation,
3679 })
3680 }
3681
3682 pub fn parse_alter_sink_rate_limit(&mut self) -> ModalResult<Option<i32>> {
3685 if !self.parse_word("SINK_RATE_LIMIT") {
3686 return Ok(None);
3687 }
3688 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
3689 return self.expected("TO or = after ALTER SINK SET SINK_RATE_LIMIT");
3690 }
3691 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
3692 -1
3693 } else {
3694 let s = self.parse_number_value()?;
3695 if let Ok(n) = s.parse::<i32>() {
3696 n
3697 } else {
3698 return self.expected("number or DEFAULT");
3699 }
3700 };
3701 Ok(Some(rate_limit))
3702 }
3703
3704 pub fn parse_alter_sink(&mut self) -> ModalResult<Statement> {
3705 let sink_name = self.parse_object_name()?;
3706 let operation = if self.parse_keyword(Keyword::RENAME) {
3707 if self.parse_keyword(Keyword::TO) {
3708 let sink_name = self.parse_object_name()?;
3709 AlterSinkOperation::RenameSink { sink_name }
3710 } else {
3711 return self.expected("TO after RENAME");
3712 }
3713 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3714 let owner_name: Ident = self.parse_identifier()?;
3715 AlterSinkOperation::ChangeOwner {
3716 new_owner_name: owner_name,
3717 }
3718 } else if self.parse_keyword(Keyword::SET) {
3719 if self.parse_keyword(Keyword::SCHEMA) {
3720 let schema_name = self.parse_object_name()?;
3721 AlterSinkOperation::SetSchema {
3722 new_schema_name: schema_name,
3723 }
3724 } else if self.parse_word("STREAMING_ENABLE_UNALIGNED_JOIN") {
3725 self.expect_keyword(Keyword::TO)?;
3726 let value = self.parse_boolean()?;
3727 AlterSinkOperation::SetStreamingEnableUnalignedJoin { enable: value }
3728 } else if self.parse_keyword(Keyword::PARALLELISM) {
3729 if self.expect_keyword(Keyword::TO).is_err()
3730 && self.expect_token(&Token::Eq).is_err()
3731 {
3732 return self.expected("TO or = after ALTER SINK SET PARALLELISM");
3733 }
3734
3735 let value = self.parse_set_variable()?;
3736 let deferred = self.parse_keyword(Keyword::DEFERRED);
3737
3738 AlterSinkOperation::SetParallelism {
3739 parallelism: value,
3740 deferred,
3741 }
3742 } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3743 if self.expect_keyword(Keyword::TO).is_err()
3744 && self.expect_token(&Token::Eq).is_err()
3745 {
3746 return self.expected("TO or = after ALTER SINK SET BACKFILL_PARALLELISM");
3747 }
3748
3749 let value = self.parse_set_variable()?;
3750 let deferred = self.parse_keyword(Keyword::DEFERRED);
3751
3752 AlterSinkOperation::SetBackfillParallelism {
3753 parallelism: value,
3754 deferred,
3755 }
3756 } else if let Some(rate_limit) = self.parse_alter_sink_rate_limit()? {
3757 AlterSinkOperation::SetSinkRateLimit { rate_limit }
3758 } else if let Some(rate_limit) = self.parse_alter_backfill_rate_limit()? {
3759 AlterSinkOperation::SetBackfillRateLimit { rate_limit }
3760 } else if self.parse_keyword(Keyword::CONFIG) {
3761 let entries = self.parse_options()?;
3762 AlterSinkOperation::SetConfig { entries }
3763 } else {
3764 return self.expected(
3765 "SCHEMA/PARALLELISM/BACKFILL_PARALLELISM/SINK_RATE_LIMIT/BACKFILL_RATE_LIMIT/STREAMING_ENABLE_UNALIGNED_JOIN/CONFIG after SET",
3766 );
3767 }
3768 } else if self.parse_keyword(Keyword::RESET) {
3769 if self.parse_keyword(Keyword::CONFIG) {
3770 let keys = self.parse_parenthesized_object_name_list()?;
3771 AlterSinkOperation::ResetConfig { keys }
3772 } else {
3773 return self.expected("CONFIG after RESET");
3774 }
3775 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3776 let target_sink = self.parse_object_name()?;
3777 AlterSinkOperation::SwapRenameSink { target_sink }
3778 } else if self.parse_keyword(Keyword::CONNECTOR) {
3779 let changed_props = self.parse_with_properties()?;
3780 AlterSinkOperation::AlterConnectorProps {
3781 alter_props: changed_props,
3782 }
3783 } else {
3784 return self
3785 .expected("RENAME or OWNER TO or SET or RESET or CONNECTOR WITH after ALTER SINK");
3786 };
3787
3788 Ok(Statement::AlterSink {
3789 name: sink_name,
3790 operation,
3791 })
3792 }
3793
3794 pub fn parse_alter_subscription(&mut self) -> ModalResult<Statement> {
3795 let subscription_name = self.parse_object_name()?;
3796 let operation = if self.parse_keyword(Keyword::RENAME) {
3797 if self.parse_keyword(Keyword::TO) {
3798 let subscription_name = self.parse_object_name()?;
3799 AlterSubscriptionOperation::RenameSubscription { subscription_name }
3800 } else {
3801 return self.expected("TO after RENAME");
3802 }
3803 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3804 let owner_name: Ident = self.parse_identifier()?;
3805 AlterSubscriptionOperation::ChangeOwner {
3806 new_owner_name: owner_name,
3807 }
3808 } else if self.parse_keyword(Keyword::SET) {
3809 if self.parse_keyword(Keyword::SCHEMA) {
3810 let schema_name = self.parse_object_name()?;
3811 AlterSubscriptionOperation::SetSchema {
3812 new_schema_name: schema_name,
3813 }
3814 } else if self.parse_keyword(Keyword::RETENTION) {
3815 if self.expect_keyword(Keyword::TO).is_err()
3816 && self.expect_token(&Token::Eq).is_err()
3817 {
3818 return self.expected("TO or = after ALTER SUBSCRIPTION SET RETENTION");
3819 }
3820 let retention = self.ensure_parse_value()?;
3821 AlterSubscriptionOperation::SetRetention { retention }
3822 } else {
3823 return self.expected("SCHEMA or RETENTION after SET");
3824 }
3825 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3826 let target_subscription = self.parse_object_name()?;
3827 AlterSubscriptionOperation::SwapRenameSubscription {
3828 target_subscription,
3829 }
3830 } else {
3831 return self.expected("RENAME or OWNER TO or SET or SWAP after ALTER SUBSCRIPTION");
3832 };
3833
3834 Ok(Statement::AlterSubscription {
3835 name: subscription_name,
3836 operation,
3837 })
3838 }
3839
3840 pub fn parse_alter_source(&mut self) -> ModalResult<Statement> {
3841 let source_name = self.parse_object_name()?;
3842 let operation = if self.parse_keyword(Keyword::RENAME) {
3843 if self.parse_keyword(Keyword::TO) {
3844 let source_name = self.parse_object_name()?;
3845 AlterSourceOperation::RenameSource { source_name }
3846 } else {
3847 return self.expected("TO after RENAME");
3848 }
3849 } else if self.parse_keyword(Keyword::ADD) {
3850 let _ = self.parse_keyword(Keyword::COLUMN);
3851 let _if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
3852 let column_def = self.parse_column_def()?;
3853 AlterSourceOperation::AddColumn { column_def }
3854 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3855 let owner_name: Ident = self.parse_identifier()?;
3856 AlterSourceOperation::ChangeOwner {
3857 new_owner_name: owner_name,
3858 }
3859 } else if self.parse_keyword(Keyword::SET) {
3860 if self.parse_keyword(Keyword::SCHEMA) {
3861 let schema_name = self.parse_object_name()?;
3862 AlterSourceOperation::SetSchema {
3863 new_schema_name: schema_name,
3864 }
3865 } else if let Some(rate_limit) = self.parse_alter_source_rate_limit(false)? {
3866 AlterSourceOperation::SetSourceRateLimit { rate_limit }
3867 } else if self.parse_keyword(Keyword::PARALLELISM) {
3868 if self.expect_keyword(Keyword::TO).is_err()
3869 && self.expect_token(&Token::Eq).is_err()
3870 {
3871 return self.expected("TO or = after ALTER SOURCE SET PARALLELISM");
3872 }
3873
3874 let value = self.parse_set_variable()?;
3875 let deferred = self.parse_keyword(Keyword::DEFERRED);
3876
3877 AlterSourceOperation::SetParallelism {
3878 parallelism: value,
3879 deferred,
3880 }
3881 } else if self.parse_keyword(Keyword::BACKFILL_PARALLELISM) {
3882 if self.expect_keyword(Keyword::TO).is_err()
3883 && self.expect_token(&Token::Eq).is_err()
3884 {
3885 return self.expected("TO or = after ALTER SOURCE SET BACKFILL_PARALLELISM");
3886 }
3887
3888 let value = self.parse_set_variable()?;
3889 let deferred = self.parse_keyword(Keyword::DEFERRED);
3890
3891 AlterSourceOperation::SetBackfillParallelism {
3892 parallelism: value,
3893 deferred,
3894 }
3895 } else if self.parse_keyword(Keyword::CONFIG) {
3896 let entries = self.parse_options()?;
3897 AlterSourceOperation::SetConfig { entries }
3898 } else {
3899 return self.expected(
3900 "SCHEMA, SOURCE_RATE_LIMIT, PARALLELISM, BACKFILL_PARALLELISM or CONFIG after SET",
3901 );
3902 }
3903 } else if self.parse_keyword(Keyword::RESET) {
3904 if self.parse_keyword(Keyword::CONFIG) {
3905 let keys = self.parse_parenthesized_object_name_list()?;
3906 AlterSourceOperation::ResetConfig { keys }
3907 } else {
3908 AlterSourceOperation::ResetSource
3910 }
3911 } else if self.peek_nth_any_of_keywords(0, &[Keyword::FORMAT]) {
3912 let format_encode = self.parse_schema()?.unwrap();
3913 if format_encode.key_encode.is_some() {
3914 parser_err!("key encode clause is not supported in source schema");
3915 }
3916 AlterSourceOperation::FormatEncode { format_encode }
3917 } else if self.parse_keywords(&[Keyword::REFRESH, Keyword::SCHEMA]) {
3918 AlterSourceOperation::RefreshSchema
3919 } else if self.parse_keywords(&[Keyword::SWAP, Keyword::WITH]) {
3920 let target_source = self.parse_object_name()?;
3921 AlterSourceOperation::SwapRenameSource { target_source }
3922 } else if self.parse_keyword(Keyword::CONNECTOR) {
3923 let with_options = self.parse_with_properties()?;
3924 AlterSourceOperation::AlterConnectorProps {
3925 alter_props: with_options,
3926 }
3927 } else {
3928 return self.expected(
3929 "RENAME, ADD COLUMN, OWNER TO, CONNECTOR, SET or RESET after ALTER SOURCE",
3930 );
3931 };
3932
3933 Ok(Statement::AlterSource {
3934 name: source_name,
3935 operation,
3936 })
3937 }
3938
3939 pub fn parse_alter_function(&mut self) -> ModalResult<Statement> {
3940 let FunctionDesc { name, args } = self.parse_function_desc()?;
3941
3942 let operation = if self.parse_keyword(Keyword::SET) {
3943 if self.parse_keyword(Keyword::SCHEMA) {
3944 let schema_name = self.parse_object_name()?;
3945 AlterFunctionOperation::SetSchema {
3946 new_schema_name: schema_name,
3947 }
3948 } else {
3949 return self.expected("SCHEMA after SET");
3950 }
3951 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3952 let owner_name: Ident = self.parse_identifier()?;
3953 AlterFunctionOperation::ChangeOwner {
3954 new_owner_name: owner_name,
3955 }
3956 } else {
3957 return self.expected("SET or OWNER TO after ALTER FUNCTION");
3958 };
3959
3960 Ok(Statement::AlterFunction {
3961 name,
3962 args,
3963 operation,
3964 })
3965 }
3966
3967 pub fn parse_alter_connection(&mut self) -> ModalResult<Statement> {
3968 let connection_name = self.parse_object_name()?;
3969 let operation = if self.parse_keyword(Keyword::SET) {
3970 if self.parse_keyword(Keyword::SCHEMA) {
3971 let schema_name = self.parse_object_name()?;
3972 AlterConnectionOperation::SetSchema {
3973 new_schema_name: schema_name,
3974 }
3975 } else {
3976 return self.expected("SCHEMA after SET");
3977 }
3978 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
3979 let owner_name: Ident = self.parse_identifier()?;
3980 AlterConnectionOperation::ChangeOwner {
3981 new_owner_name: owner_name,
3982 }
3983 } else if self.parse_keyword(Keyword::CONNECTOR) {
3984 let with_options = self.parse_with_properties()?;
3985 AlterConnectionOperation::AlterConnectorProps {
3986 alter_props: with_options,
3987 }
3988 } else {
3989 return self.expected("SET, OWNER TO, or CONNECTOR WITH after ALTER CONNECTION");
3990 };
3991
3992 Ok(Statement::AlterConnection {
3993 name: connection_name,
3994 operation,
3995 })
3996 }
3997
3998 pub fn parse_alter_system(&mut self) -> ModalResult<Statement> {
3999 self.expect_keyword(Keyword::SET)?;
4000 let param = self.parse_identifier()?;
4001 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4002 return self.expected("TO or = after ALTER SYSTEM SET");
4003 }
4004 let value = self.parse_set_variable()?;
4005 Ok(Statement::AlterSystem { param, value })
4006 }
4007
4008 pub fn parse_alter_secret(&mut self) -> ModalResult<Statement> {
4009 let secret_name = self.parse_object_name()?;
4010 let operation = if self.parse_keyword(Keyword::WITH) {
4011 let with_options = self.parse_options()?;
4012 if self.parse_keyword(Keyword::AS) {
4013 let new_credential = self.ensure_parse_value()?;
4014 AlterSecretOperation::ChangeCredential {
4015 with_options,
4016 new_credential,
4017 }
4018 } else {
4019 return self.expected("Keyword AS after Options");
4020 }
4021 } else if self.parse_keyword(Keyword::AS) {
4022 let new_credential = self.ensure_parse_value()?;
4023 AlterSecretOperation::ChangeCredential {
4024 with_options: vec![],
4025 new_credential,
4026 }
4027 } else if self.parse_keywords(&[Keyword::OWNER, Keyword::TO]) {
4028 let owner_name: Ident = self.parse_identifier()?;
4029 AlterSecretOperation::ChangeOwner {
4030 new_owner_name: owner_name,
4031 }
4032 } else {
4033 return self.expected("WITH, AS or OWNER TO after ALTER SECRET");
4034 };
4035 Ok(Statement::AlterSecret {
4036 name: secret_name,
4037 operation,
4038 })
4039 }
4040
4041 pub fn parse_alter_fragment(&mut self) -> ModalResult<Statement> {
4042 let mut fragment_ids = vec![self.parse_literal_u32()?];
4043 while self.consume_token(&Token::Comma) {
4044 fragment_ids.push(self.parse_literal_u32()?);
4045 }
4046 if !self.parse_keyword(Keyword::SET) {
4047 return self.expected("SET after ALTER FRAGMENT");
4048 }
4049 let operation = if self.parse_keyword(Keyword::PARALLELISM) {
4050 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4051 return self.expected("TO or = after ALTER FRAGMENT SET PARALLELISM");
4052 }
4053 let parallelism = self.parse_set_variable()?;
4054 AlterFragmentOperation::SetParallelism { parallelism }
4055 } else {
4056 let rate_limit = self.parse_alter_fragment_rate_limit()?;
4057 AlterFragmentOperation::AlterBackfillRateLimit { rate_limit }
4058 };
4059 Ok(Statement::AlterFragment {
4060 fragment_ids,
4061 operation,
4062 })
4063 }
4064
4065 pub fn parse_alter_compaction_group(&mut self) -> ModalResult<Statement> {
4066 if !self.parse_keyword(Keyword::GROUP) {
4067 return self.expected("GROUP after ALTER COMPACTION");
4068 }
4069 let mut group_ids = vec![self.parse_literal_u64()?];
4070 while self.consume_token(&Token::Comma) {
4071 group_ids.push(self.parse_literal_u64()?);
4072 }
4073 if !self.parse_keyword(Keyword::SET) {
4074 return self.expected("SET after ALTER COMPACTION GROUP <id>");
4075 }
4076 let configs = self.parse_comma_separated(Parser::parse_config_param_no_list)?;
4080 let operation = AlterCompactionGroupOperation::Set { configs };
4081 Ok(Statement::AlterCompactionGroup {
4082 group_ids,
4083 operation,
4084 })
4085 }
4086
4087 fn parse_alter_fragment_rate_limit(&mut self) -> ModalResult<i32> {
4088 if !self.parse_word("RATE_LIMIT") {
4089 return self.expected("expected RATE_LIMIT after SET");
4090 }
4091 if self.expect_keyword(Keyword::TO).is_err() && self.expect_token(&Token::Eq).is_err() {
4092 return self.expected("TO or = after RATE_LIMIT");
4093 }
4094 let rate_limit = if self.parse_keyword(Keyword::DEFAULT) {
4095 -1
4096 } else {
4097 let s = self.parse_number_value()?;
4098 if let Ok(n) = s.parse::<i32>() {
4099 n
4100 } else {
4101 return self.expected("number or DEFAULT");
4102 }
4103 };
4104 Ok(rate_limit)
4105 }
4106
4107 pub fn parse_copy(&mut self) -> ModalResult<Statement> {
4109 let entity = if self.consume_token(&Token::LParen) {
4110 let query = self.parse_query()?;
4111 self.expect_token(&Token::RParen)?;
4112 CopyEntity::Query(query.into())
4113 } else {
4114 let table_name = self.parse_object_name()?;
4115 let columns = self.parse_parenthesized_column_list(Optional)?;
4116 CopyEntity::Table {
4117 table_name,
4118 columns,
4119 }
4120 };
4121
4122 let target = if self.parse_keywords(&[Keyword::FROM, Keyword::STDIN]) {
4123 self.expect_token(&Token::SemiColon)?;
4124 let values = self.parse_tsv();
4125 CopyTarget::Stdin { values }
4126 } else if self.parse_keywords(&[Keyword::TO, Keyword::STDOUT]) {
4127 CopyTarget::Stdout
4128 } else {
4129 return self.expected("FROM STDIN or TO STDOUT");
4130 };
4131
4132 Ok(Statement::Copy { entity, target })
4133 }
4134
4135 fn parse_tsv(&mut self) -> Vec<Option<String>> {
4138 self.parse_tab_value()
4139 }
4140
4141 fn parse_tab_value(&mut self) -> Vec<Option<String>> {
4142 let mut values = vec![];
4143 let mut content = String::from("");
4144 while let Some(t) = self.next_token_no_skip() {
4145 match t.token {
4146 Token::Whitespace(Whitespace::Tab) => {
4147 values.push(Some(content.clone()));
4148 content.clear();
4149 }
4150 Token::Whitespace(Whitespace::Newline) => {
4151 values.push(Some(content.clone()));
4152 content.clear();
4153 }
4154 Token::Backslash => {
4155 if self.consume_token(&Token::Period) {
4156 return values;
4157 }
4158 if let Token::Word(w) = self.next_token().token
4159 && w.value == "N"
4160 {
4161 values.push(None);
4162 }
4163 }
4164 _ => {
4165 content.push_str(&t.to_string());
4166 }
4167 }
4168 }
4169 values
4170 }
4171
4172 pub fn ensure_parse_value(&mut self) -> ModalResult<Value> {
4173 match self.parse_value_and_obj_ref::<true>()? {
4174 SqlOptionValue::Value(value) => Ok(value),
4175 SqlOptionValue::SecretRef(_)
4176 | SqlOptionValue::ConnectionRef(_)
4177 | SqlOptionValue::BackfillOrder(_) => unreachable!(),
4178 }
4179 }
4180
4181 pub fn parse_value_and_obj_ref<const FORBID_OBJ_REF: bool>(
4183 &mut self,
4184 ) -> ModalResult<SqlOptionValue> {
4185 let checkpoint = *self;
4186 let token = self.next_token();
4187 match token.token {
4188 Token::Word(w) => match w.keyword {
4189 Keyword::TRUE => Ok(Value::Boolean(true).into()),
4190 Keyword::FALSE => Ok(Value::Boolean(false).into()),
4191 Keyword::NULL => Ok(Value::Null.into()),
4192 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
4193 Some('"') => Ok(Value::DoubleQuotedString(w.value).into()),
4194 Some('\'') => Ok(Value::SingleQuotedString(w.value).into()),
4195 _ => self.expected_at(checkpoint, "A value")?,
4196 },
4197 Keyword::SECRET => {
4198 if FORBID_OBJ_REF {
4199 return self.expected_at(
4200 checkpoint,
4201 "a concrete value rather than a secret reference",
4202 );
4203 }
4204 let secret = self.parse_secret_ref()?;
4205 Ok(SqlOptionValue::SecretRef(secret))
4206 }
4207 _ => self.expected_at(checkpoint, "a concrete value"),
4208 },
4209 Token::Number(ref n) => Ok(Value::Number(n.clone()).into()),
4210 Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.clone()).into()),
4211 Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone()).into()),
4212 Token::CstyleEscapesString(ref s) => Ok(Value::CstyleEscapedString(s.clone()).into()),
4213 Token::NationalStringLiteral(ref s) => {
4214 Ok(Value::NationalStringLiteral(s.clone()).into())
4215 }
4216 Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.clone()).into()),
4217 _ => self.expected_at(checkpoint, "a value"),
4218 }
4219 }
4220
4221 fn parse_secret_ref(&mut self) -> ModalResult<SecretRefValue> {
4222 let secret_name = self.parse_object_name()?;
4223 let ref_as = if self.parse_keywords(&[Keyword::AS, Keyword::FILE]) {
4224 SecretRefAsType::File
4225 } else {
4226 SecretRefAsType::Text
4227 };
4228 Ok(SecretRefValue {
4229 secret_name,
4230 ref_as,
4231 })
4232 }
4233
4234 fn parse_set_variable(&mut self) -> ModalResult<SetVariableValue> {
4235 alt((
4236 Keyword::DEFAULT.value(SetVariableValue::Default),
4237 separated(
4238 1..,
4239 alt((
4240 Self::ensure_parse_value.map(SetVariableValueSingle::Literal),
4241 |parser: &mut Self| {
4242 let checkpoint = *parser;
4243 let ident = parser.parse_identifier()?;
4244 if parser.consume_token(&Token::LParen) {
4245 let args = parser.parse_comma_separated(Parser::ensure_parse_value)?;
4246 parser.expect_token(&Token::RParen)?;
4247 let raw = format!(
4248 "{}({})",
4249 ident,
4250 args.iter().map(ToString::to_string).join(", ")
4251 );
4252 return Ok(SetVariableValueSingle::Raw(raw));
4253 }
4254 if ident.value == "default" {
4255 *parser = checkpoint;
4256 return parser.expected("parameter list value").map_err(|e| e.cut());
4257 }
4258 Ok(SetVariableValueSingle::Ident(ident))
4259 },
4260 fail.expect("parameter value"),
4261 )),
4262 Token::Comma,
4263 )
4264 .map(|list: Vec<SetVariableValueSingle>| {
4265 if list.len() == 1 {
4266 SetVariableValue::Single(list[0].clone())
4267 } else {
4268 SetVariableValue::List(list)
4269 }
4270 }),
4271 ))
4272 .parse_next(self)
4273 }
4274
4275 fn parse_backfill_order_strategy(&mut self) -> ModalResult<BackfillOrderStrategy> {
4276 alt((
4277 Keyword::DEFAULT.value(BackfillOrderStrategy::Default),
4278 Keyword::NONE.value(BackfillOrderStrategy::None),
4279 Keyword::AUTO.value(BackfillOrderStrategy::Auto),
4280 Self::parse_fixed_backfill_order.map(BackfillOrderStrategy::Fixed),
4281 fail.expect("backfill order strategy"),
4282 ))
4283 .parse_next(self)
4284 }
4285
4286 fn parse_fixed_backfill_order(&mut self) -> ModalResult<Vec<(ObjectName, ObjectName)>> {
4287 self.expect_word("FIXED")?;
4288 self.expect_token(&Token::LParen)?;
4289 let edges = separated(
4290 0..,
4291 separated_pair(
4292 Self::parse_object_name,
4293 Token::Op("->".to_owned()),
4294 Self::parse_object_name,
4295 ),
4296 Token::Comma,
4297 )
4298 .parse_next(self)?;
4299 self.expect_token(&Token::RParen)?;
4300 Ok(edges)
4301 }
4302
4303 pub fn parse_number_value(&mut self) -> ModalResult<String> {
4304 let checkpoint = *self;
4305 match self.ensure_parse_value()? {
4306 Value::Number(v) => Ok(v),
4307 _ => self.expected_at(checkpoint, "literal number"),
4308 }
4309 }
4310
4311 pub fn parse_literal_u32(&mut self) -> ModalResult<u32> {
4312 literal_u32(self)
4313 }
4314
4315 pub fn parse_literal_u64(&mut self) -> ModalResult<u64> {
4316 literal_u64(self)
4317 }
4318
4319 pub fn parse_function_definition(&mut self) -> ModalResult<FunctionDefinition> {
4320 alt((
4321 single_quoted_string.map(FunctionDefinition::SingleQuotedDef),
4322 dollar_quoted_string.map(FunctionDefinition::DoubleDollarDef),
4323 Self::parse_identifier.map(|i| FunctionDefinition::Identifier(i.value)),
4324 fail.expect("function definition"),
4325 ))
4326 .parse_next(self)
4327 }
4328
4329 pub fn parse_literal_string(&mut self) -> ModalResult<String> {
4331 let checkpoint = *self;
4332 let token = self.next_token();
4333 match token.token {
4334 Token::SingleQuotedString(s) => Ok(s),
4335 _ => self.expected_at(checkpoint, "literal string"),
4336 }
4337 }
4338
4339 pub fn parse_data_type(&mut self) -> ModalResult<DataType> {
4341 parser_v2::data_type(self)
4342 }
4343
4344 pub fn parse_optional_alias(
4348 &mut self,
4349 reserved_kwds: &[Keyword],
4350 ) -> ModalResult<Option<Ident>> {
4351 let after_as = self.parse_keyword(Keyword::AS);
4352 let checkpoint = *self;
4353 let token = self.next_token();
4354 match token.token {
4355 Token::Word(w) if after_as || (!reserved_kwds.contains(&w.keyword)) => {
4361 Ok(Some(w.to_ident()?))
4362 }
4363 _ => {
4364 *self = checkpoint;
4365 if after_as {
4366 return self.expected("an identifier after AS");
4367 }
4368 Ok(None) }
4370 }
4371 }
4372
4373 pub fn parse_optional_table_alias(
4378 &mut self,
4379 reserved_kwds: &[Keyword],
4380 ) -> ModalResult<Option<TableAlias>> {
4381 match self.parse_optional_alias(reserved_kwds)? {
4382 Some(name) => {
4383 let columns = self.parse_parenthesized_column_list(Optional)?;
4384 Ok(Some(TableAlias { name, columns }))
4385 }
4386 None => Ok(None),
4387 }
4388 }
4389
4390 pub fn parse_as_of(&mut self) -> ModalResult<AsOf> {
4392 Keyword::FOR.parse_next(self)?;
4393 alt((
4394 preceded(
4395 (Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF),
4396 cut_err(
4397 alt((
4398 preceded(
4399 (
4400 Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4401 cut_err(Token::LParen),
4402 cut_err(Token::RParen),
4403 Token::Minus,
4404 ),
4405 Self::parse_literal_interval.try_map(|e| match e {
4406 Expr::Value(v) => match v {
4407 Value::Interval {
4408 value,
4409 leading_field,
4410 ..
4411 } => {
4412 let Some(leading_field) = leading_field else {
4413 return Err(StrError("expect duration unit".into()));
4414 };
4415 Ok(AsOf::ProcessTimeWithInterval((value, leading_field)))
4416 }
4417 _ => Err(StrError("expect Value::Interval".into())),
4418 },
4419 _ => Err(StrError("expect Expr::Value".into())),
4420 }),
4421 ),
4422 (
4423 Self::parse_identifier.verify(|ident| ident.real_value() == "now"),
4424 cut_err(Token::LParen),
4425 cut_err(Token::RParen),
4426 )
4427 .value(AsOf::ProcessTimeWithInterval((
4428 "0".to_owned(),
4429 DateTimeField::Second,
4430 ))),
4431 (
4432 Self::parse_identifier.verify(|ident| ident.real_value() == "proctime"),
4433 cut_err(Token::LParen),
4434 cut_err(Token::RParen),
4435 )
4436 .value(AsOf::ProcessTime),
4437 literal_i64.map(AsOf::TimestampNum),
4438 single_quoted_string.map(AsOf::TimestampString),
4439 ))
4440 .expect("proctime(), now(), number or string"),
4441 ),
4442 ),
4443 preceded(
4444 (Keyword::SYSTEM_VERSION, Keyword::AS, Keyword::OF),
4445 cut_err(
4446 alt((
4447 literal_i64.map(AsOf::VersionNum),
4448 single_quoted_string.map(AsOf::VersionString),
4449 ))
4450 .expect("number or string"),
4451 ),
4452 ),
4453 ))
4454 .parse_next(self)
4455 }
4456
4457 pub fn parse_object_name(&mut self) -> ModalResult<ObjectName> {
4460 let mut idents = vec![];
4461 loop {
4462 idents.push(self.parse_identifier()?);
4463 if !self.consume_token(&Token::Period) {
4464 break;
4465 }
4466 }
4467 Ok(ObjectName(idents))
4468 }
4469
4470 pub fn parse_parenthesized_object_name_list(&mut self) -> ModalResult<Vec<ObjectName>> {
4472 if self.consume_token(&Token::LParen) {
4473 let names = self.parse_comma_separated(Parser::parse_object_name)?;
4474 self.expect_token(&Token::RParen)?;
4475 Ok(names)
4476 } else {
4477 self.expected("a list of object names in parentheses")
4478 }
4479 }
4480
4481 pub fn parse_identifiers_non_keywords(&mut self) -> ModalResult<Vec<Ident>> {
4483 let mut idents = vec![];
4484 loop {
4485 match self.peek_token().token {
4486 Token::Word(w) => {
4487 if w.keyword != Keyword::NoKeyword {
4488 break;
4489 }
4490
4491 idents.push(w.to_ident()?);
4492 }
4493 Token::EOF | Token::Eq => break,
4494 _ => {}
4495 }
4496
4497 self.next_token();
4498 }
4499
4500 Ok(idents)
4501 }
4502
4503 pub fn parse_identifiers(&mut self) -> ModalResult<Vec<Ident>> {
4505 let mut idents = vec![];
4506 loop {
4507 let token = self.next_token();
4508 match token.token {
4509 Token::Word(w) => {
4510 idents.push(w.to_ident()?);
4511 }
4512 Token::EOF => break,
4513 _ => {}
4514 }
4515 }
4516
4517 Ok(idents)
4518 }
4519
4520 pub fn parse_identifier(&mut self) -> ModalResult<Ident> {
4522 let checkpoint = *self;
4523 let token = self.next_token();
4524 match token.token {
4525 Token::Word(w) => Ok(w.to_ident()?),
4526 _ => self.expected_at(checkpoint, "identifier"),
4527 }
4528 }
4529
4530 pub fn parse_identifier_non_reserved(&mut self) -> ModalResult<Ident> {
4532 let checkpoint = *self;
4533 let token = self.next_token();
4534 match token.token {
4535 Token::Word(w) => {
4536 match keywords::RESERVED_FOR_COLUMN_OR_TABLE_NAME.contains(&w.keyword) {
4537 true => parser_err!("syntax error at or near {w}"),
4538 false => Ok(w.to_ident()?),
4539 }
4540 }
4541 _ => self.expected_at(checkpoint, "identifier"),
4542 }
4543 }
4544
4545 pub fn parse_parenthesized_column_list(
4547 &mut self,
4548 optional: IsOptional,
4549 ) -> ModalResult<Vec<Ident>> {
4550 if self.consume_token(&Token::LParen) {
4551 let cols = self.parse_comma_separated(Parser::parse_identifier_non_reserved)?;
4552 self.expect_token(&Token::RParen)?;
4553 Ok(cols)
4554 } else if optional == Optional {
4555 Ok(vec![])
4556 } else {
4557 self.expected("a list of columns in parentheses")
4558 }
4559 }
4560
4561 pub fn parse_returning(&mut self, optional: IsOptional) -> ModalResult<Vec<SelectItem>> {
4562 if self.parse_keyword(Keyword::RETURNING) {
4563 let cols = self.parse_comma_separated(Parser::parse_select_item)?;
4564 Ok(cols)
4565 } else if optional == Optional {
4566 Ok(vec![])
4567 } else {
4568 self.expected("a list of columns or * after returning")
4569 }
4570 }
4571
4572 pub fn parse_row_expr(&mut self) -> ModalResult<Expr> {
4573 Ok(Expr::Row(self.parse_token_wrapped_exprs(
4574 &Token::LParen,
4575 &Token::RParen,
4576 )?))
4577 }
4578
4579 pub fn parse_token_wrapped_exprs(
4581 &mut self,
4582 left: &Token,
4583 right: &Token,
4584 ) -> ModalResult<Vec<Expr>> {
4585 if self.consume_token(left) {
4586 let exprs = if self.consume_token(right) {
4587 vec![]
4588 } else {
4589 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
4590 self.expect_token(right)?;
4591 exprs
4592 };
4593 Ok(exprs)
4594 } else {
4595 self.expected(left.to_string().as_str())
4596 }
4597 }
4598
4599 pub fn parse_optional_precision(&mut self) -> ModalResult<Option<u64>> {
4600 if self.consume_token(&Token::LParen) {
4601 let n = self.parse_literal_u64()?;
4602 self.expect_token(&Token::RParen)?;
4603 Ok(Some(n))
4604 } else {
4605 Ok(None)
4606 }
4607 }
4608
4609 pub fn parse_optional_precision_scale(&mut self) -> ModalResult<(Option<u64>, Option<u64>)> {
4610 if self.consume_token(&Token::LParen) {
4611 let n = self.parse_literal_u64()?;
4612 let scale = if self.consume_token(&Token::Comma) {
4613 Some(self.parse_literal_u64()?)
4614 } else {
4615 None
4616 };
4617 self.expect_token(&Token::RParen)?;
4618 Ok((Some(n), scale))
4619 } else {
4620 Ok((None, None))
4621 }
4622 }
4623
4624 pub fn parse_delete(&mut self) -> ModalResult<Statement> {
4625 if self.parse_keyword(Keyword::META) {
4626 let Some(_) = self.parse_one_of_keywords(&[Keyword::SNAPSHOT, Keyword::SNAPSHOTS])
4627 else {
4628 return self.expected("SNAPSHOT or SNAPSHOTS");
4629 };
4630 let snapshot_ids = self.parse_comma_separated(Parser::parse_literal_u64)?;
4631 return Ok(Statement::DeleteMetaSnapshots { snapshot_ids });
4632 }
4633
4634 self.expect_keyword(Keyword::FROM)?;
4635 let table_name = self.parse_object_name()?;
4636 let selection = if self.parse_keyword(Keyword::WHERE) {
4637 Some(self.parse_expr()?)
4638 } else {
4639 None
4640 };
4641 let returning = self.parse_returning(Optional)?;
4642
4643 Ok(Statement::Delete {
4644 table_name,
4645 selection,
4646 returning,
4647 })
4648 }
4649
4650 pub fn parse_boolean(&mut self) -> ModalResult<bool> {
4651 if let Some(keyword) = self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
4652 match keyword {
4653 Keyword::TRUE => Ok(true),
4654 Keyword::FALSE => Ok(false),
4655 _ => unreachable!(),
4656 }
4657 } else {
4658 self.expected("TRUE or FALSE")
4659 }
4660 }
4661
4662 pub fn parse_optional_boolean(&mut self, default: bool) -> bool {
4663 self.parse_boolean().unwrap_or(default)
4664 }
4665
4666 fn parse_explain_options(&mut self) -> ModalResult<(ExplainOptions, Option<u64>)> {
4667 let mut options = ExplainOptions::default();
4668 let mut analyze_duration = None;
4669
4670 const BACKFILL: &str = "backfill";
4671 const VERBOSE: &str = "verbose";
4672 const TRACE: &str = "trace";
4673 const TYPE: &str = "type";
4674 const LOGICAL: &str = "logical";
4675 const PHYSICAL: &str = "physical";
4676 const DISTSQL: &str = "distsql";
4677 const FORMAT: &str = "format";
4678 const DURATION_SECS: &str = "duration_secs";
4679
4680 let explain_options_identifiers = [
4681 BACKFILL,
4682 VERBOSE,
4683 TRACE,
4684 TYPE,
4685 LOGICAL,
4686 PHYSICAL,
4687 DISTSQL,
4688 FORMAT,
4689 DURATION_SECS,
4690 ];
4691
4692 let parse_explain_option = |parser: &mut Parser<'_>| -> ModalResult<()> {
4693 match parser.parse_identifier()?.real_value().as_str() {
4694 VERBOSE => options.verbose = parser.parse_optional_boolean(true),
4695 TRACE => options.trace = parser.parse_optional_boolean(true),
4696 BACKFILL => options.backfill = parser.parse_optional_boolean(true),
4697 TYPE => {
4698 let explain_type = parser.parse_identifier()?.real_value();
4699 match explain_type.as_str() {
4700 LOGICAL => options.explain_type = ExplainType::Logical,
4701 PHYSICAL => options.explain_type = ExplainType::Physical,
4702 DISTSQL => options.explain_type = ExplainType::DistSql,
4703 unexpected => {
4704 parser_err!("unexpected explain type: [{unexpected}]")
4705 }
4706 }
4707 }
4708 LOGICAL => options.explain_type = ExplainType::Logical,
4709 PHYSICAL => options.explain_type = ExplainType::Physical,
4710 DISTSQL => options.explain_type = ExplainType::DistSql,
4711 FORMAT => {
4712 options.explain_format = {
4713 let format = parser.parse_identifier()?.real_value();
4714 match format.as_str() {
4715 "text" => ExplainFormat::Text,
4716 "json" => ExplainFormat::Json,
4717 "xml" => ExplainFormat::Xml,
4718 "yaml" => ExplainFormat::Yaml,
4719 "dot" => ExplainFormat::Dot,
4720 unexpected => {
4721 parser_err!("unexpected explain format [{unexpected}]")
4722 }
4723 }
4724 }
4725 }
4726 DURATION_SECS => {
4727 analyze_duration = Some(parser.parse_literal_u64()?);
4728 }
4729 unexpected => {
4730 parser_err!("unexpected explain options: [{unexpected}]")
4731 }
4732 };
4733 Ok(())
4734 };
4735
4736 if self.peek_token() == Token::LParen
4739 && let Token::Word(word) = self.peek_nth_token(1).token
4740 && let Ok(ident) = word.to_ident()
4741 && explain_options_identifiers.contains(&ident.real_value().as_str())
4742 {
4743 assert!(self.consume_token(&Token::LParen));
4744 self.parse_comma_separated(parse_explain_option)?;
4745 self.expect_token(&Token::RParen)?;
4746 }
4747
4748 Ok((options, analyze_duration))
4749 }
4750
4751 pub fn parse_explain(&mut self) -> ModalResult<Statement> {
4752 let analyze = self.parse_keyword(Keyword::ANALYZE);
4753 let (options, analyze_duration) = self.parse_explain_options()?;
4754
4755 if analyze {
4756 fn parse_analyze_target(parser: &mut Parser<'_>) -> ModalResult<Option<AnalyzeTarget>> {
4757 if parser.parse_keyword(Keyword::TABLE) {
4758 let table_name = parser.parse_object_name()?;
4759 Ok(Some(AnalyzeTarget::Table(table_name)))
4760 } else if parser.parse_keyword(Keyword::INDEX) {
4761 let index_name = parser.parse_object_name()?;
4762 Ok(Some(AnalyzeTarget::Index(index_name)))
4763 } else if parser.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
4764 let view_name = parser.parse_object_name()?;
4765 Ok(Some(AnalyzeTarget::MaterializedView(view_name)))
4766 } else if parser.parse_keyword(Keyword::INDEX) {
4767 let index_name = parser.parse_object_name()?;
4768 Ok(Some(AnalyzeTarget::Index(index_name)))
4769 } else if parser.parse_keyword(Keyword::SINK) {
4770 let sink_name = parser.parse_object_name()?;
4771 Ok(Some(AnalyzeTarget::Sink(sink_name)))
4772 } else if parser.parse_word("ID") {
4773 let job_id = parser.parse_literal_u32()?;
4774 Ok(Some(AnalyzeTarget::Id(job_id)))
4775 } else {
4776 Ok(None)
4777 }
4778 }
4779 if let Some(target) = parse_analyze_target(self)? {
4780 let statement = Statement::ExplainAnalyzeStreamJob {
4781 target,
4782 duration_secs: analyze_duration,
4783 };
4784 return Ok(statement);
4785 }
4786 }
4787
4788 let statement = match self.parse_statement() {
4789 Ok(statement) => statement,
4790 error @ Err(_) => {
4791 return if analyze {
4792 self.expected_at(
4793 *self,
4794 "SINK, TABLE, MATERIALIZED VIEW, INDEX or a statement after ANALYZE",
4795 )
4796 } else {
4797 error
4798 };
4799 }
4800 };
4801 Ok(Statement::Explain {
4802 analyze,
4803 statement: Box::new(statement),
4804 options,
4805 })
4806 }
4807
4808 pub fn parse_describe(&mut self) -> ModalResult<Statement> {
4809 let kind = match self.parse_one_of_keywords(&[Keyword::FRAGMENT, Keyword::FRAGMENTS]) {
4810 Some(Keyword::FRAGMENT) => {
4811 let fragment_id = self.parse_literal_u32()?;
4812 return Ok(Statement::DescribeFragment { fragment_id });
4813 }
4814 Some(Keyword::FRAGMENTS) => DescribeKind::Fragments,
4815 None => DescribeKind::Plain,
4816 Some(_) => unreachable!(),
4817 };
4818 let name = self.parse_object_name()?;
4819 Ok(Statement::Describe { name, kind })
4820 }
4821
4822 pub fn parse_query(&mut self) -> ModalResult<Query> {
4827 let with = if self.parse_keyword(Keyword::WITH) {
4828 Some(With {
4829 recursive: self.parse_keyword(Keyword::RECURSIVE),
4830 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
4831 })
4832 } else {
4833 None
4834 };
4835
4836 let body = self.parse_query_body(0)?;
4837
4838 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
4839 self.parse_comma_separated(Parser::parse_order_by_expr)?
4840 } else {
4841 vec![]
4842 };
4843
4844 let mut limit = None;
4845 let mut offset = None;
4846 for _x in 0..2 {
4847 if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
4848 limit = self.parse_limit()?
4849 }
4850
4851 if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
4852 offset = Some(self.parse_offset()?)
4853 }
4854 }
4855
4856 let fetch = if self.parse_keyword(Keyword::FETCH) {
4857 if limit.is_some() {
4858 parser_err!("Cannot specify both LIMIT and FETCH");
4859 }
4860 let fetch = self.parse_fetch()?;
4861 if fetch.with_ties && order_by.is_empty() {
4862 parser_err!("WITH TIES cannot be specified without ORDER BY clause");
4863 }
4864 Some(fetch)
4865 } else {
4866 None
4867 };
4868
4869 Ok(Query {
4870 with,
4871 body,
4872 order_by,
4873 limit,
4874 offset,
4875 fetch,
4876 })
4877 }
4878
4879 fn parse_cte(&mut self) -> ModalResult<Cte> {
4881 let name = self.parse_identifier_non_reserved()?;
4882 let cte = if self.parse_keyword(Keyword::AS) {
4883 let cte_inner = self.parse_cte_inner()?;
4884 let alias = TableAlias {
4885 name,
4886 columns: vec![],
4887 };
4888 Cte { alias, cte_inner }
4889 } else {
4890 let columns = self.parse_parenthesized_column_list(Optional)?;
4891 self.expect_keyword(Keyword::AS)?;
4892 let cte_inner = self.parse_cte_inner()?;
4893 let alias = TableAlias { name, columns };
4894 Cte { alias, cte_inner }
4895 };
4896 Ok(cte)
4897 }
4898
4899 fn parse_cte_inner(&mut self) -> ModalResult<CteInner> {
4900 match self.expect_token(&Token::LParen) {
4901 Ok(()) => {
4902 let query = self.parse_query()?;
4903 self.expect_token(&Token::RParen)?;
4904 Ok(CteInner::Query(Box::new(query)))
4905 }
4906 _ => {
4907 let changelog = self.parse_identifier_non_reserved()?;
4908 if changelog.to_string().to_lowercase() != "changelog" {
4909 parser_err!("Expected 'changelog' but found '{}'", changelog);
4910 }
4911 self.expect_keyword(Keyword::FROM)?;
4912 Ok(CteInner::ChangeLog(self.parse_object_name()?))
4913 }
4914 }
4915 }
4916
4917 fn parse_query_body(&mut self, precedence: u8) -> ModalResult<SetExpr> {
4926 let mut expr = if self.parse_keyword(Keyword::SELECT) {
4929 SetExpr::Select(Box::new(self.parse_select()?))
4930 } else if self.consume_token(&Token::LParen) {
4931 let subquery = self.parse_query()?;
4933 self.expect_token(&Token::RParen)?;
4934 SetExpr::Query(Box::new(subquery))
4935 } else if self.parse_keyword(Keyword::VALUES) {
4936 SetExpr::Values(self.parse_values()?)
4937 } else {
4938 return self.expected("SELECT, VALUES, or a subquery in the query body");
4939 };
4940
4941 loop {
4942 let op = self.parse_set_operator(&self.peek_token().token);
4944 let next_precedence = match op {
4945 Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
4947 Some(SetOperator::Intersect) => 20,
4949 None => break,
4951 };
4952 if precedence >= next_precedence {
4953 break;
4954 }
4955 self.next_token(); let all = self.parse_keyword(Keyword::ALL);
4958 let corresponding = self.parse_corresponding()?;
4959
4960 expr = SetExpr::SetOperation {
4961 left: Box::new(expr),
4962 op: op.unwrap(),
4963 corresponding,
4964 all,
4965 right: Box::new(self.parse_query_body(next_precedence)?),
4966 };
4967 }
4968
4969 Ok(expr)
4970 }
4971
4972 fn parse_set_operator(&mut self, token: &Token) -> Option<SetOperator> {
4973 match token {
4974 Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
4975 Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
4976 Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
4977 _ => None,
4978 }
4979 }
4980
4981 fn parse_corresponding(&mut self) -> ModalResult<Corresponding> {
4982 let corresponding = if self.parse_keyword(Keyword::CORRESPONDING) {
4983 let column_list = if self.parse_keyword(Keyword::BY) {
4984 Some(self.parse_parenthesized_column_list(IsOptional::Mandatory)?)
4985 } else {
4986 None
4987 };
4988 Corresponding::with_column_list(column_list)
4989 } else {
4990 Corresponding::none()
4991 };
4992 Ok(corresponding)
4993 }
4994
4995 pub fn parse_select(&mut self) -> ModalResult<Select> {
4998 let distinct = self.parse_all_or_distinct_on()?;
4999
5000 let projection = self.parse_comma_separated(Parser::parse_select_item)?;
5001
5002 let from = if self.parse_keyword(Keyword::FROM) {
5008 self.parse_comma_separated(Parser::parse_table_and_joins)?
5009 } else {
5010 vec![]
5011 };
5012 let mut lateral_views = vec![];
5013 loop {
5014 if self.parse_keywords(&[Keyword::LATERAL, Keyword::VIEW]) {
5015 let outer = self.parse_keyword(Keyword::OUTER);
5016 let lateral_view = self.parse_expr()?;
5017 let lateral_view_name = self.parse_object_name()?;
5018 let lateral_col_alias = self
5019 .parse_comma_separated(|parser| {
5020 parser.parse_optional_alias(&[
5021 Keyword::WHERE,
5022 Keyword::GROUP,
5023 Keyword::CLUSTER,
5024 Keyword::HAVING,
5025 Keyword::LATERAL,
5026 ]) })?
5028 .into_iter()
5029 .flatten()
5030 .collect();
5031
5032 lateral_views.push(LateralView {
5033 lateral_view,
5034 lateral_view_name,
5035 lateral_col_alias,
5036 outer,
5037 });
5038 } else {
5039 break;
5040 }
5041 }
5042
5043 let selection = if self.parse_keyword(Keyword::WHERE) {
5044 Some(self.parse_expr()?)
5045 } else {
5046 None
5047 };
5048
5049 let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
5050 self.parse_comma_separated(Parser::parse_group_by_expr)?
5051 } else {
5052 vec![]
5053 };
5054
5055 let having = if self.parse_keyword(Keyword::HAVING) {
5056 Some(self.parse_expr()?)
5057 } else {
5058 None
5059 };
5060
5061 let window = if self.parse_keyword(Keyword::WINDOW) {
5062 self.parse_comma_separated(Parser::parse_named_window)?
5063 } else {
5064 vec![]
5065 };
5066
5067 Ok(Select {
5068 distinct,
5069 projection,
5070 from,
5071 lateral_views,
5072 selection,
5073 group_by,
5074 having,
5075 window,
5076 })
5077 }
5078
5079 pub fn parse_set(&mut self) -> ModalResult<Statement> {
5080 let modifier = self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL]);
5081 if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
5082 let value = alt((
5083 Keyword::DEFAULT.value(SetTimeZoneValue::Default),
5084 Keyword::LOCAL.value(SetTimeZoneValue::Local),
5085 preceded(
5086 Keyword::INTERVAL,
5087 cut_err(Self::parse_literal_interval.try_map(|e| match e {
5088 Expr::Value(v) => match v {
5091 Value::Interval { value, .. } => {
5092 if value != "+00:00" {
5093 return Err(StrError("only support \"+00:00\" ".into()));
5094 }
5095 Ok(SetTimeZoneValue::Ident(Ident::with_quote_unchecked(
5096 '\'',
5097 "UTC".to_owned(),
5098 )))
5099 }
5100 _ => Err(StrError("expect Value::Interval".into())),
5101 },
5102 _ => Err(StrError("expect Expr::Value".into())),
5103 })),
5104 ),
5105 Self::parse_identifier.map(SetTimeZoneValue::Ident),
5106 Self::ensure_parse_value.map(SetTimeZoneValue::Literal),
5107 ))
5108 .expect("variable")
5109 .parse_next(self)?;
5110
5111 Ok(Statement::SetTimeZone {
5112 local: modifier == Some(Keyword::LOCAL),
5113 value,
5114 })
5115 } else if self.parse_keyword(Keyword::CHARACTERISTICS) && modifier == Some(Keyword::SESSION)
5116 {
5117 self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
5118 Ok(Statement::SetTransaction {
5119 modes: self.parse_transaction_modes()?,
5120 snapshot: None,
5121 session: true,
5122 })
5123 } else if self.parse_keyword(Keyword::TRANSACTION) && modifier.is_none() {
5124 if self.parse_keyword(Keyword::SNAPSHOT) {
5125 let snapshot_id = self.ensure_parse_value()?;
5126 return Ok(Statement::SetTransaction {
5127 modes: vec![],
5128 snapshot: Some(snapshot_id),
5129 session: false,
5130 });
5131 }
5132 Ok(Statement::SetTransaction {
5133 modes: self.parse_transaction_modes()?,
5134 snapshot: None,
5135 session: false,
5136 })
5137 } else {
5138 let config_param = self.parse_config_param()?;
5139 Ok(Statement::SetVariable {
5140 local: modifier == Some(Keyword::LOCAL),
5141 variable: config_param.param,
5142 value: config_param.value,
5143 })
5144 }
5145 }
5146
5147 pub fn parse_show(&mut self) -> ModalResult<Statement> {
5151 let checkpoint = *self;
5152 if let Token::Word(w) = self.next_token().token {
5153 match w.keyword {
5154 Keyword::TABLES => {
5155 return Ok(Statement::ShowObjects {
5156 object: ShowObject::Table {
5157 schema: self.parse_from_and_identifier()?,
5158 },
5159 filter: self.parse_show_statement_filter()?,
5160 });
5161 }
5162 Keyword::INTERNAL => {
5163 self.expect_keyword(Keyword::TABLES)?;
5164 return Ok(Statement::ShowObjects {
5165 object: ShowObject::InternalTable {
5166 schema: self.parse_from_and_identifier()?,
5167 },
5168 filter: self.parse_show_statement_filter()?,
5169 });
5170 }
5171 Keyword::SOURCES => {
5172 return Ok(Statement::ShowObjects {
5173 object: ShowObject::Source {
5174 schema: self.parse_from_and_identifier()?,
5175 },
5176 filter: self.parse_show_statement_filter()?,
5177 });
5178 }
5179 Keyword::SINKS => {
5180 return Ok(Statement::ShowObjects {
5181 object: ShowObject::Sink {
5182 schema: self.parse_from_and_identifier()?,
5183 },
5184 filter: self.parse_show_statement_filter()?,
5185 });
5186 }
5187 Keyword::SUBSCRIPTIONS => {
5188 return Ok(Statement::ShowObjects {
5189 object: ShowObject::Subscription {
5190 schema: self.parse_from_and_identifier()?,
5191 },
5192 filter: self.parse_show_statement_filter()?,
5193 });
5194 }
5195 Keyword::DATABASES => {
5196 return Ok(Statement::ShowObjects {
5197 object: ShowObject::Database,
5198 filter: self.parse_show_statement_filter()?,
5199 });
5200 }
5201 Keyword::SCHEMAS => {
5202 return Ok(Statement::ShowObjects {
5203 object: ShowObject::Schema,
5204 filter: self.parse_show_statement_filter()?,
5205 });
5206 }
5207 Keyword::VIEWS => {
5208 return Ok(Statement::ShowObjects {
5209 object: ShowObject::View {
5210 schema: self.parse_from_and_identifier()?,
5211 },
5212 filter: self.parse_show_statement_filter()?,
5213 });
5214 }
5215 Keyword::MATERIALIZED => {
5216 if self.parse_keyword(Keyword::VIEWS) {
5217 return Ok(Statement::ShowObjects {
5218 object: ShowObject::MaterializedView {
5219 schema: self.parse_from_and_identifier()?,
5220 },
5221 filter: self.parse_show_statement_filter()?,
5222 });
5223 } else {
5224 return self.expected("VIEWS after MATERIALIZED");
5225 }
5226 }
5227 Keyword::COLUMNS => {
5228 if self.parse_keyword(Keyword::FROM) {
5229 return Ok(Statement::ShowObjects {
5230 object: ShowObject::Columns {
5231 table: self.parse_object_name()?,
5232 },
5233 filter: self.parse_show_statement_filter()?,
5234 });
5235 } else {
5236 return self.expected("from after columns");
5237 }
5238 }
5239 Keyword::SECRETS => {
5240 return Ok(Statement::ShowObjects {
5241 object: ShowObject::Secret {
5242 schema: self.parse_from_and_identifier()?,
5243 },
5244 filter: self.parse_show_statement_filter()?,
5245 });
5246 }
5247 Keyword::CONNECTIONS => {
5248 return Ok(Statement::ShowObjects {
5249 object: ShowObject::Connection {
5250 schema: self.parse_from_and_identifier()?,
5251 },
5252 filter: self.parse_show_statement_filter()?,
5253 });
5254 }
5255 Keyword::FUNCTIONS => {
5256 return Ok(Statement::ShowObjects {
5257 object: ShowObject::Function {
5258 schema: self.parse_from_and_identifier()?,
5259 },
5260 filter: self.parse_show_statement_filter()?,
5261 });
5262 }
5263 Keyword::INDEXES => {
5264 if self.parse_keyword(Keyword::FROM) {
5265 return Ok(Statement::ShowObjects {
5266 object: ShowObject::Indexes {
5267 table: self.parse_object_name()?,
5268 },
5269 filter: self.parse_show_statement_filter()?,
5270 });
5271 } else {
5272 return self.expected("from after indexes");
5273 }
5274 }
5275 Keyword::CLUSTER => {
5276 return Ok(Statement::ShowObjects {
5277 object: ShowObject::Cluster,
5278 filter: self.parse_show_statement_filter()?,
5279 });
5280 }
5281 Keyword::JOBS => {
5282 return Ok(Statement::ShowObjects {
5283 object: ShowObject::Jobs,
5284 filter: self.parse_show_statement_filter()?,
5285 });
5286 }
5287 Keyword::PROCESSLIST => {
5288 return Ok(Statement::ShowObjects {
5289 object: ShowObject::ProcessList,
5290 filter: self.parse_show_statement_filter()?,
5291 });
5292 }
5293 Keyword::TRANSACTION => {
5294 self.expect_keywords(&[Keyword::ISOLATION, Keyword::LEVEL])?;
5295 return Ok(Statement::ShowTransactionIsolationLevel);
5296 }
5297 Keyword::CURSORS => {
5298 return Ok(Statement::ShowObjects {
5299 object: ShowObject::Cursor,
5300 filter: None,
5301 });
5302 }
5303 Keyword::SUBSCRIPTION => {
5304 self.expect_keyword(Keyword::CURSORS)?;
5305 return Ok(Statement::ShowObjects {
5306 object: ShowObject::SubscriptionCursor,
5307 filter: None,
5308 });
5309 }
5310 _ => {}
5311 }
5312 }
5313 *self = checkpoint;
5314 Ok(Statement::ShowVariable {
5315 variable: self.parse_identifiers()?,
5316 })
5317 }
5318
5319 pub fn parse_cancel_job(&mut self) -> ModalResult<Statement> {
5320 match self.peek_token().token {
5322 Token::Word(w) if Keyword::JOBS == w.keyword || Keyword::JOB == w.keyword => {
5323 self.next_token();
5324 }
5325 _ => return self.expected("JOBS or JOB after CANCEL"),
5326 }
5327
5328 let mut job_ids = vec![];
5329 loop {
5330 job_ids.push(self.parse_literal_u32()?);
5331 if !self.consume_token(&Token::Comma) {
5332 break;
5333 }
5334 }
5335 Ok(Statement::CancelJobs(JobIdents(job_ids)))
5336 }
5337
5338 pub fn parse_kill_process(&mut self) -> ModalResult<Statement> {
5339 let worker_process_id = self.parse_literal_string()?;
5340 Ok(Statement::Kill(worker_process_id))
5341 }
5342
5343 pub fn parse_from_and_identifier(&mut self) -> ModalResult<Option<Ident>> {
5346 if self.parse_keyword(Keyword::FROM) {
5347 Ok(Some(self.parse_identifier_non_reserved()?))
5348 } else {
5349 Ok(None)
5350 }
5351 }
5352
5353 pub fn parse_show_create(&mut self) -> ModalResult<Statement> {
5355 if let Token::Word(w) = self.next_token().token {
5356 let show_type = match w.keyword {
5357 Keyword::TABLE => ShowCreateType::Table,
5358 Keyword::MATERIALIZED => {
5359 if self.parse_keyword(Keyword::VIEW) {
5360 ShowCreateType::MaterializedView
5361 } else {
5362 return self.expected("VIEW after MATERIALIZED");
5363 }
5364 }
5365 Keyword::VIEW => ShowCreateType::View,
5366 Keyword::INDEX => ShowCreateType::Index,
5367 Keyword::SOURCE => ShowCreateType::Source,
5368 Keyword::SINK => ShowCreateType::Sink,
5369 Keyword::SUBSCRIPTION => ShowCreateType::Subscription,
5370 Keyword::FUNCTION => ShowCreateType::Function,
5371 _ => return self.expected(
5372 "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5373 ),
5374 };
5375 return Ok(Statement::ShowCreateObject {
5376 create_type: show_type,
5377 name: self.parse_object_name()?,
5378 });
5379 }
5380 self.expected(
5381 "TABLE, MATERIALIZED VIEW, VIEW, INDEX, FUNCTION, SOURCE, SUBSCRIPTION or SINK",
5382 )
5383 }
5384
5385 pub fn parse_show_statement_filter(&mut self) -> ModalResult<Option<ShowStatementFilter>> {
5386 if self.parse_keyword(Keyword::LIKE) {
5387 Ok(Some(ShowStatementFilter::Like(
5388 self.parse_literal_string()?,
5389 )))
5390 } else if self.parse_keyword(Keyword::ILIKE) {
5391 Ok(Some(ShowStatementFilter::ILike(
5392 self.parse_literal_string()?,
5393 )))
5394 } else if self.parse_keyword(Keyword::WHERE) {
5395 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
5396 } else {
5397 Ok(None)
5398 }
5399 }
5400
5401 pub fn parse_table_and_joins(&mut self) -> ModalResult<TableWithJoins> {
5402 let relation = self.parse_table_factor()?;
5403
5404 let mut joins = vec![];
5408 loop {
5409 let join = if self.parse_keyword(Keyword::CROSS) {
5410 let join_operator = if self.parse_keyword(Keyword::JOIN) {
5411 JoinOperator::CrossJoin
5412 } else {
5413 return self.expected("JOIN after CROSS");
5414 };
5415 Join {
5416 relation: self.parse_table_factor()?,
5417 join_operator,
5418 }
5419 } else {
5420 let (natural, asof) =
5421 match self.parse_one_of_keywords(&[Keyword::NATURAL, Keyword::ASOF]) {
5422 Some(Keyword::NATURAL) => (true, false),
5423 Some(Keyword::ASOF) => (false, true),
5424 Some(_) => unreachable!(),
5425 None => (false, false),
5426 };
5427 let peek_keyword = if let Token::Word(w) = self.peek_token().token {
5428 w.keyword
5429 } else {
5430 Keyword::NoKeyword
5431 };
5432
5433 let join_operator_type = match peek_keyword {
5434 Keyword::INNER | Keyword::JOIN => {
5435 let _ = self.parse_keyword(Keyword::INNER);
5436 self.expect_keyword(Keyword::JOIN)?;
5437 if asof {
5438 JoinOperator::AsOfInner
5439 } else {
5440 JoinOperator::Inner
5441 }
5442 }
5443 kw @ Keyword::LEFT | kw @ Keyword::RIGHT | kw @ Keyword::FULL => {
5444 let checkpoint = *self;
5445 let _ = self.next_token();
5446 let _ = self.parse_keyword(Keyword::OUTER);
5447 self.expect_keyword(Keyword::JOIN)?;
5448 if asof {
5449 if Keyword::LEFT == kw {
5450 JoinOperator::AsOfLeft
5451 } else {
5452 return self.expected_at(
5453 checkpoint,
5454 "LEFT after ASOF. RIGHT or FULL are not supported",
5455 );
5456 }
5457 } else {
5458 match kw {
5459 Keyword::LEFT => JoinOperator::LeftOuter,
5460 Keyword::RIGHT => JoinOperator::RightOuter,
5461 Keyword::FULL => JoinOperator::FullOuter,
5462 _ => unreachable!(),
5463 }
5464 }
5465 }
5466 Keyword::OUTER => {
5467 return self.expected("LEFT, RIGHT, or FULL");
5468 }
5469 _ if natural => {
5470 return self.expected("a join type after NATURAL");
5471 }
5472 _ if asof => {
5473 return self.expected("a join type after ASOF");
5474 }
5475 _ => break,
5476 };
5477 let relation = self.parse_table_factor()?;
5478 let join_constraint = self.parse_join_constraint(natural)?;
5479 let join_operator = join_operator_type(join_constraint);
5480 let need_constraint = match join_operator {
5481 JoinOperator::Inner(JoinConstraint::None) => Some("INNER JOIN"),
5482 JoinOperator::AsOfInner(JoinConstraint::None) => Some("ASOF INNER JOIN"),
5483 JoinOperator::AsOfLeft(JoinConstraint::None) => Some("ASOF LEFT JOIN"),
5484 _ => None,
5485 };
5486 if let Some(join_type) = need_constraint {
5487 return self.expected(&format!("join constraint after {join_type}"));
5488 }
5489
5490 Join {
5491 relation,
5492 join_operator,
5493 }
5494 };
5495 joins.push(join);
5496 }
5497 Ok(TableWithJoins { relation, joins })
5498 }
5499
5500 pub fn parse_table_factor(&mut self) -> ModalResult<TableFactor> {
5502 if self.parse_keyword(Keyword::LATERAL) {
5503 if !self.consume_token(&Token::LParen) {
5505 self.expected("subquery after LATERAL")?;
5506 }
5507 self.parse_derived_table_factor(Lateral)
5508 } else if self.consume_token(&Token::LParen) {
5509 match self.peek_token().token {
5529 Token::Word(w)
5530 if [Keyword::SELECT, Keyword::WITH, Keyword::VALUES].contains(&w.keyword) =>
5531 {
5532 return self.parse_derived_table_factor(NotLateral);
5533 }
5534 _ => {}
5535 };
5536 if self.peek_token() == Token::LParen {
5540 return_ok_if_some!(
5541 self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral))
5542 );
5543 }
5544
5545 let table_and_joins = self.parse_table_and_joins()?;
5552
5553 if !table_and_joins.joins.is_empty() {
5554 self.expect_token(&Token::RParen)?;
5555 Ok(TableFactor::NestedJoin(Box::new(table_and_joins))) } else if let TableFactor::NestedJoin(_) = &table_and_joins.relation {
5557 self.expect_token(&Token::RParen)?;
5560 Ok(TableFactor::NestedJoin(Box::new(table_and_joins)))
5561 } else {
5562 parser_err!(
5565 "Expected joined table, found: {table_and_joins}, next_token: {}",
5566 self.peek_token()
5567 );
5568 }
5569 } else {
5570 let name = self.parse_object_name()?;
5571 if self.peek_token() == Token::LParen {
5572 let arg_list = self.parse_argument_list()?;
5575 if arg_list.distinct {
5576 parser_err!("DISTINCT is not supported in table-valued function calls");
5577 }
5578 if !arg_list.order_by.is_empty() {
5579 parser_err!("ORDER BY is not supported in table-valued function calls");
5580 }
5581 if arg_list.ignore_nulls {
5582 parser_err!("IGNORE NULLS is not supported in table-valued function calls");
5583 }
5584
5585 let args = arg_list.args;
5586 let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
5587 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5588
5589 Ok(TableFactor::TableFunction {
5590 name,
5591 alias,
5592 args,
5593 with_ordinality,
5594 })
5595 } else {
5596 let as_of = opt(Self::parse_as_of).parse_next(self)?;
5597 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5598 Ok(TableFactor::Table { name, alias, as_of })
5599 }
5600 }
5601 }
5602
5603 pub fn parse_derived_table_factor(&mut self, lateral: IsLateral) -> ModalResult<TableFactor> {
5604 let subquery = Box::new(self.parse_query()?);
5605 self.expect_token(&Token::RParen)?;
5606 let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
5607 Ok(TableFactor::Derived {
5608 lateral: match lateral {
5609 Lateral => true,
5610 NotLateral => false,
5611 },
5612 subquery,
5613 alias,
5614 })
5615 }
5616
5617 fn parse_join_constraint(&mut self, natural: bool) -> ModalResult<JoinConstraint> {
5618 if natural {
5619 Ok(JoinConstraint::Natural)
5620 } else if self.parse_keyword(Keyword::ON) {
5621 let constraint = self.parse_expr()?;
5622 Ok(JoinConstraint::On(constraint))
5623 } else if self.parse_keyword(Keyword::USING) {
5624 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5625 Ok(JoinConstraint::Using(columns))
5626 } else {
5627 Ok(JoinConstraint::None)
5628 }
5630 }
5631
5632 pub fn parse_grant(&mut self) -> ModalResult<Statement> {
5634 let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5635
5636 self.expect_keyword(Keyword::TO)?;
5637 let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5638
5639 let with_grant_option =
5640 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
5641
5642 let granted_by = self
5643 .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5644 .then(|| self.parse_identifier().unwrap());
5645
5646 Ok(Statement::Grant {
5647 privileges,
5648 objects,
5649 grantees,
5650 with_grant_option,
5651 granted_by,
5652 })
5653 }
5654
5655 fn parse_privileges(&mut self) -> ModalResult<Privileges> {
5656 let privileges = if self.parse_keyword(Keyword::ALL) {
5657 Privileges::All {
5658 with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
5659 }
5660 } else {
5661 Privileges::Actions(
5662 self.parse_comma_separated(Parser::parse_grant_permission)?
5663 .into_iter()
5664 .map(|(kw, columns)| match kw {
5665 Keyword::CONNECT => Action::Connect,
5666 Keyword::CREATE => Action::Create,
5667 Keyword::DELETE => Action::Delete,
5668 Keyword::EXECUTE => Action::Execute,
5669 Keyword::INSERT => Action::Insert { columns },
5670 Keyword::REFERENCES => Action::References { columns },
5671 Keyword::SELECT => Action::Select { columns },
5672 Keyword::TEMPORARY => Action::Temporary,
5673 Keyword::TRIGGER => Action::Trigger,
5674 Keyword::TRUNCATE => Action::Truncate,
5675 Keyword::UPDATE => Action::Update { columns },
5676 Keyword::USAGE => Action::Usage,
5677 _ => unreachable!(),
5678 })
5679 .collect(),
5680 )
5681 };
5682
5683 Ok(privileges)
5684 }
5685
5686 fn parse_grant_revoke_privileges_objects(&mut self) -> ModalResult<(Privileges, GrantObjects)> {
5687 let privileges = self.parse_privileges()?;
5688
5689 self.expect_keyword(Keyword::ON)?;
5690
5691 let objects = if self.parse_keywords(&[
5692 Keyword::ALL,
5693 Keyword::TABLES,
5694 Keyword::IN,
5695 Keyword::SCHEMA,
5696 ]) {
5697 GrantObjects::AllTablesInSchema {
5698 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5699 }
5700 } else if self.parse_keywords(&[
5701 Keyword::ALL,
5702 Keyword::SEQUENCES,
5703 Keyword::IN,
5704 Keyword::SCHEMA,
5705 ]) {
5706 GrantObjects::AllSequencesInSchema {
5707 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5708 }
5709 } else if self.parse_keywords(&[
5710 Keyword::ALL,
5711 Keyword::SOURCES,
5712 Keyword::IN,
5713 Keyword::SCHEMA,
5714 ]) {
5715 GrantObjects::AllSourcesInSchema {
5716 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5717 }
5718 } else if self.parse_keywords(&[Keyword::ALL, Keyword::SINKS, Keyword::IN, Keyword::SCHEMA])
5719 {
5720 GrantObjects::AllSinksInSchema {
5721 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5722 }
5723 } else if self.parse_keywords(&[
5724 Keyword::ALL,
5725 Keyword::MATERIALIZED,
5726 Keyword::VIEWS,
5727 Keyword::IN,
5728 Keyword::SCHEMA,
5729 ]) {
5730 GrantObjects::AllMviewsInSchema {
5731 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5732 }
5733 } else if self.parse_keywords(&[Keyword::ALL, Keyword::VIEWS, Keyword::IN, Keyword::SCHEMA])
5734 {
5735 GrantObjects::AllViewsInSchema {
5736 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5737 }
5738 } else if self.parse_keywords(&[
5739 Keyword::ALL,
5740 Keyword::FUNCTIONS,
5741 Keyword::IN,
5742 Keyword::SCHEMA,
5743 ]) {
5744 GrantObjects::AllFunctionsInSchema {
5745 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5746 }
5747 } else if self.parse_keywords(&[
5748 Keyword::ALL,
5749 Keyword::SECRETS,
5750 Keyword::IN,
5751 Keyword::SCHEMA,
5752 ]) {
5753 GrantObjects::AllSecretsInSchema {
5754 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5755 }
5756 } else if self.parse_keywords(&[
5757 Keyword::ALL,
5758 Keyword::CONNECTIONS,
5759 Keyword::IN,
5760 Keyword::SCHEMA,
5761 ]) {
5762 GrantObjects::AllConnectionsInSchema {
5763 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5764 }
5765 } else if self.parse_keywords(&[
5766 Keyword::ALL,
5767 Keyword::SUBSCRIPTIONS,
5768 Keyword::IN,
5769 Keyword::SCHEMA,
5770 ]) {
5771 GrantObjects::AllSubscriptionsInSchema {
5772 schemas: self.parse_comma_separated(Parser::parse_object_name)?,
5773 }
5774 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
5775 GrantObjects::Mviews(self.parse_comma_separated(Parser::parse_object_name)?)
5776 } else {
5777 let object_type = self.parse_one_of_keywords(&[
5778 Keyword::SEQUENCE,
5779 Keyword::DATABASE,
5780 Keyword::SCHEMA,
5781 Keyword::TABLE,
5782 Keyword::SOURCE,
5783 Keyword::SINK,
5784 Keyword::VIEW,
5785 Keyword::SUBSCRIPTION,
5786 Keyword::FUNCTION,
5787 Keyword::CONNECTION,
5788 Keyword::SECRET,
5789 ]);
5790 if let Some(Keyword::FUNCTION) = object_type {
5791 let func_descs = self.parse_comma_separated(Parser::parse_function_desc)?;
5792 GrantObjects::Functions(func_descs)
5793 } else {
5794 let objects = self.parse_comma_separated(Parser::parse_object_name);
5795 match object_type {
5796 Some(Keyword::DATABASE) => GrantObjects::Databases(objects?),
5797 Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
5798 Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
5799 Some(Keyword::SOURCE) => GrantObjects::Sources(objects?),
5800 Some(Keyword::SINK) => GrantObjects::Sinks(objects?),
5801 Some(Keyword::VIEW) => GrantObjects::Views(objects?),
5802 Some(Keyword::SUBSCRIPTION) => GrantObjects::Subscriptions(objects?),
5803 Some(Keyword::CONNECTION) => GrantObjects::Connections(objects?),
5804 Some(Keyword::SECRET) => GrantObjects::Secrets(objects?),
5805 Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
5806 _ => unreachable!(),
5807 }
5808 }
5809 };
5810
5811 Ok((privileges, objects))
5812 }
5813
5814 fn parse_grant_permission(&mut self) -> ModalResult<(Keyword, Option<Vec<Ident>>)> {
5815 let kw = self.expect_one_of_keywords(&[
5816 Keyword::CONNECT,
5817 Keyword::CREATE,
5818 Keyword::DELETE,
5819 Keyword::EXECUTE,
5820 Keyword::INSERT,
5821 Keyword::REFERENCES,
5822 Keyword::SELECT,
5823 Keyword::TEMPORARY,
5824 Keyword::TRIGGER,
5825 Keyword::TRUNCATE,
5826 Keyword::UPDATE,
5827 Keyword::USAGE,
5828 ])?;
5829 let columns = match kw {
5830 Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
5831 let columns = self.parse_parenthesized_column_list(Optional)?;
5832 if columns.is_empty() {
5833 None
5834 } else {
5835 Some(columns)
5836 }
5837 }
5838 _ => None,
5839 };
5840 Ok((kw, columns))
5841 }
5842
5843 pub fn parse_revoke(&mut self) -> ModalResult<Statement> {
5845 let revoke_grant_option =
5846 self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
5847 let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
5848
5849 self.expect_keyword(Keyword::FROM)?;
5850 let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5851
5852 let granted_by = self
5853 .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
5854 .then(|| self.parse_identifier().unwrap());
5855
5856 let cascade = self.parse_keyword(Keyword::CASCADE);
5857 let restrict = self.parse_keyword(Keyword::RESTRICT);
5858 if cascade && restrict {
5859 parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
5860 }
5861
5862 Ok(Statement::Revoke {
5863 privileges,
5864 objects,
5865 grantees,
5866 granted_by,
5867 revoke_grant_option,
5868 cascade,
5869 })
5870 }
5871
5872 fn parse_privilege_object_types(&mut self) -> ModalResult<PrivilegeObjectType> {
5873 let object_type = if self.parse_keyword(Keyword::TABLES) {
5874 PrivilegeObjectType::Tables
5875 } else if self.parse_keyword(Keyword::SOURCES) {
5876 PrivilegeObjectType::Sources
5877 } else if self.parse_keyword(Keyword::SINKS) {
5878 PrivilegeObjectType::Sinks
5879 } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
5880 PrivilegeObjectType::Mviews
5881 } else if self.parse_keyword(Keyword::VIEWS) {
5882 PrivilegeObjectType::Views
5883 } else if self.parse_keyword(Keyword::FUNCTIONS) {
5884 PrivilegeObjectType::Functions
5885 } else if self.parse_keyword(Keyword::SECRETS) {
5886 PrivilegeObjectType::Secrets
5887 } else if self.parse_keyword(Keyword::CONNECTIONS) {
5888 PrivilegeObjectType::Connections
5889 } else if self.parse_keyword(Keyword::SUBSCRIPTIONS) {
5890 PrivilegeObjectType::Subscriptions
5891 } else if self.parse_keyword(Keyword::SCHEMAS) {
5892 PrivilegeObjectType::Schemas
5893 } else {
5894 return self.expected("TABLES, SOURCES, SINKS, MATERIALIZED VIEWS, VIEWS, FUNCTIONS, SECRETS, CONNECTIONS, SUBSCRIPTIONS or SCHEMAS");
5895 };
5896
5897 Ok(object_type)
5898 }
5899
5900 pub fn parse_alter_default_privileges(&mut self) -> ModalResult<Statement> {
5901 let target_users = if self.parse_keyword(Keyword::FOR) {
5903 self.expect_keyword(Keyword::USER)?;
5904 Some(self.parse_comma_separated(Parser::parse_identifier)?)
5905 } else {
5906 None
5907 };
5908
5909 let schema_names = if self.parse_keywords(&[Keyword::IN, Keyword::SCHEMA]) {
5911 Some(self.parse_comma_separated(Parser::parse_object_name)?)
5912 } else {
5913 None
5914 };
5915 let keyword = self.expect_one_of_keywords(&[Keyword::GRANT, Keyword::REVOKE])?;
5916 let for_grant = keyword == Keyword::GRANT;
5917 if for_grant {
5918 let privileges = self.parse_privileges()?;
5919 self.expect_keyword(Keyword::ON)?;
5920 let object_type = self.parse_privilege_object_types()?;
5921 if schema_names.is_some() && object_type == PrivilegeObjectType::Schemas {
5922 parser_err!("cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS");
5923 }
5924 self.expect_keyword(Keyword::TO)?;
5925 let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5926
5927 let with_grant_option =
5928 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
5929
5930 Ok(Statement::AlterDefaultPrivileges {
5931 target_users,
5932 schema_names,
5933 operation: DefaultPrivilegeOperation::Grant {
5934 privileges,
5935 object_type,
5936 grantees,
5937 with_grant_option,
5938 },
5939 })
5940 } else {
5941 let revoke_grant_option =
5942 self.parse_keywords(&[Keyword::GRANT, Keyword::OPTION, Keyword::FOR]);
5943 let privileges = self.parse_privileges()?;
5944 self.expect_keyword(Keyword::ON)?;
5945 let object_type = self.parse_privilege_object_types()?;
5946 if schema_names.is_some() && object_type == PrivilegeObjectType::Schemas {
5947 parser_err!("cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS");
5948 }
5949 self.expect_keyword(Keyword::FROM)?;
5950 let grantees = self.parse_comma_separated(Parser::parse_identifier)?;
5951 let cascade = self.parse_keyword(Keyword::CASCADE);
5952 let restrict = self.parse_keyword(Keyword::RESTRICT);
5953 if cascade && restrict {
5954 parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE");
5955 }
5956
5957 Ok(Statement::AlterDefaultPrivileges {
5958 target_users,
5959 schema_names,
5960 operation: DefaultPrivilegeOperation::Revoke {
5961 privileges,
5962 object_type,
5963 grantees,
5964 revoke_grant_option,
5965 cascade,
5966 },
5967 })
5968 }
5969 }
5970
5971 pub fn parse_insert(&mut self) -> ModalResult<Statement> {
5973 self.expect_keyword(Keyword::INTO)?;
5974
5975 let table_name = self.parse_object_name()?;
5976 let columns = self.parse_parenthesized_column_list(Optional)?;
5977
5978 let source = Box::new(self.parse_query()?);
5979 let returning = self.parse_returning(Optional)?;
5980 Ok(Statement::Insert {
5981 table_name,
5982 columns,
5983 source,
5984 returning,
5985 })
5986 }
5987
5988 pub fn parse_update(&mut self) -> ModalResult<Statement> {
5989 let table_name = self.parse_object_name()?;
5990
5991 self.expect_keyword(Keyword::SET)?;
5992 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
5993 let selection = if self.parse_keyword(Keyword::WHERE) {
5994 Some(self.parse_expr()?)
5995 } else {
5996 None
5997 };
5998 let returning = self.parse_returning(Optional)?;
5999 Ok(Statement::Update {
6000 table_name,
6001 assignments,
6002 selection,
6003 returning,
6004 })
6005 }
6006
6007 pub fn parse_assignment(&mut self) -> ModalResult<Assignment> {
6009 let id = self.parse_identifiers_non_keywords()?;
6010 self.expect_token(&Token::Eq)?;
6011
6012 let value = if self.parse_keyword(Keyword::DEFAULT) {
6013 AssignmentValue::Default
6014 } else {
6015 AssignmentValue::Expr(self.parse_expr()?)
6016 };
6017
6018 Ok(Assignment { id, value })
6019 }
6020
6021 fn parse_function_args(&mut self) -> ModalResult<(bool, FunctionArg)> {
6023 let variadic = self.parse_keyword(Keyword::VARIADIC);
6024 let arg = if self.peek_nth_token(1) == Token::RArrow {
6025 let name = self.parse_identifier()?;
6026
6027 self.expect_token(&Token::RArrow)?;
6028 let arg = if self.parse_keyword(Keyword::SECRET) {
6029 FunctionArgExpr::SecretRef(self.parse_secret_ref()?)
6030 } else {
6031 self.parse_wildcard_or_expr()?.into()
6032 };
6033
6034 FunctionArg::Named { name, arg }
6035 } else if self.parse_keyword(Keyword::SECRET) {
6036 FunctionArg::Unnamed(FunctionArgExpr::SecretRef(self.parse_secret_ref()?))
6037 } else {
6038 FunctionArg::Unnamed(self.parse_wildcard_or_expr()?.into())
6039 };
6040 Ok((variadic, arg))
6041 }
6042
6043 pub fn parse_argument_list(&mut self) -> ModalResult<FunctionArgList> {
6044 self.expect_token(&Token::LParen)?;
6045 if self.consume_token(&Token::RParen) {
6046 Ok(FunctionArgList::empty())
6047 } else {
6048 let distinct = self.parse_all_or_distinct()?;
6049 let args = self.parse_comma_separated(Parser::parse_function_args)?;
6050 if args
6051 .iter()
6052 .take(args.len() - 1)
6053 .any(|(variadic, _)| *variadic)
6054 {
6055 parser_err!("VARIADIC argument must be the last");
6056 }
6057 let variadic = args.last().map(|(variadic, _)| *variadic).unwrap_or(false);
6058 let args = args.into_iter().map(|(_, arg)| arg).collect();
6059
6060 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6061 self.parse_comma_separated(Parser::parse_order_by_expr)?
6062 } else {
6063 vec![]
6064 };
6065
6066 let ignore_nulls = self.parse_keywords(&[Keyword::IGNORE, Keyword::NULLS]);
6067
6068 let arg_list = FunctionArgList {
6069 distinct,
6070 args,
6071 variadic,
6072 order_by,
6073 ignore_nulls,
6074 };
6075
6076 self.expect_token(&Token::RParen)?;
6077 Ok(arg_list)
6078 }
6079 }
6080
6081 pub fn parse_select_item(&mut self) -> ModalResult<SelectItem> {
6083 match self.parse_wildcard_or_expr()? {
6084 WildcardOrExpr::Expr(expr) => self
6085 .parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
6086 .map(|alias| match alias {
6087 Some(alias) => SelectItem::ExprWithAlias { expr, alias },
6088 None => SelectItem::UnnamedExpr(expr),
6089 }),
6090 WildcardOrExpr::QualifiedWildcard(prefix, except) => {
6091 Ok(SelectItem::QualifiedWildcard(prefix, except))
6092 }
6093 WildcardOrExpr::ExprQualifiedWildcard(expr, prefix) => {
6094 Ok(SelectItem::ExprQualifiedWildcard(expr, prefix))
6095 }
6096 WildcardOrExpr::Wildcard(except) => Ok(SelectItem::Wildcard(except)),
6097 }
6098 }
6099
6100 pub fn parse_order_by_expr(&mut self) -> ModalResult<OrderByExpr> {
6102 let expr = self.parse_expr()?;
6103
6104 let asc = if self.parse_keyword(Keyword::ASC) {
6105 Some(true)
6106 } else if self.parse_keyword(Keyword::DESC) {
6107 Some(false)
6108 } else {
6109 None
6110 };
6111
6112 let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
6113 Some(true)
6114 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
6115 Some(false)
6116 } else {
6117 None
6118 };
6119
6120 Ok(OrderByExpr {
6121 expr,
6122 asc,
6123 nulls_first,
6124 })
6125 }
6126
6127 pub fn parse_limit(&mut self) -> ModalResult<Option<Expr>> {
6129 if self.parse_keyword(Keyword::ALL) {
6130 Ok(None)
6131 } else {
6132 let expr = self.parse_expr()?;
6133 Ok(Some(expr))
6134 }
6135 }
6136
6137 pub fn parse_offset(&mut self) -> ModalResult<String> {
6139 let value = self.parse_number_value()?;
6140 if self.consume_token(&Token::DoubleColon) {
6142 self.expect_keyword(Keyword::BIGINT)?;
6143 }
6144 _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
6145 Ok(value)
6146 }
6147
6148 pub fn parse_fetch(&mut self) -> ModalResult<Fetch> {
6150 self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
6151 let quantity = if self
6152 .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
6153 .is_some()
6154 {
6155 None
6156 } else {
6157 let quantity = self.parse_number_value()?;
6158 self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
6159 Some(quantity)
6160 };
6161 let with_ties = if self.parse_keyword(Keyword::ONLY) {
6162 false
6163 } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
6164 true
6165 } else {
6166 return self.expected("one of ONLY or WITH TIES");
6167 };
6168 Ok(Fetch {
6169 with_ties,
6170 quantity,
6171 })
6172 }
6173
6174 pub fn parse_values(&mut self) -> ModalResult<Values> {
6175 let values = self.parse_comma_separated(|parser| {
6176 parser.expect_token(&Token::LParen)?;
6177 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
6178 parser.expect_token(&Token::RParen)?;
6179 Ok(exprs)
6180 })?;
6181 Ok(Values(values))
6182 }
6183
6184 pub fn parse_start_transaction(&mut self) -> ModalResult<Statement> {
6185 self.expect_keyword(Keyword::TRANSACTION)?;
6186 Ok(Statement::StartTransaction {
6187 modes: self.parse_transaction_modes()?,
6188 })
6189 }
6190
6191 pub fn parse_begin(&mut self) -> ModalResult<Statement> {
6192 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
6193 Ok(Statement::Begin {
6194 modes: self.parse_transaction_modes()?,
6195 })
6196 }
6197
6198 pub fn parse_transaction_modes(&mut self) -> ModalResult<Vec<TransactionMode>> {
6199 let mut modes = vec![];
6200 let mut required = false;
6201 loop {
6202 let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
6203 let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
6204 TransactionIsolationLevel::ReadUncommitted
6205 } else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
6206 TransactionIsolationLevel::ReadCommitted
6207 } else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
6208 TransactionIsolationLevel::RepeatableRead
6209 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
6210 TransactionIsolationLevel::Serializable
6211 } else {
6212 self.expected("isolation level")?
6213 };
6214 TransactionMode::IsolationLevel(iso_level)
6215 } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
6216 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
6217 } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
6218 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
6219 } else if required {
6220 self.expected("transaction mode")?
6221 } else {
6222 break;
6223 };
6224 modes.push(mode);
6225 required = self.consume_token(&Token::Comma);
6230 }
6231 Ok(modes)
6232 }
6233
6234 pub fn parse_commit(&mut self) -> ModalResult<Statement> {
6235 Ok(Statement::Commit {
6236 chain: self.parse_commit_rollback_chain()?,
6237 })
6238 }
6239
6240 pub fn parse_rollback(&mut self) -> ModalResult<Statement> {
6241 Ok(Statement::Rollback {
6242 chain: self.parse_commit_rollback_chain()?,
6243 })
6244 }
6245
6246 pub fn parse_commit_rollback_chain(&mut self) -> ModalResult<bool> {
6247 let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
6248 if self.parse_keyword(Keyword::AND) {
6249 let chain = !self.parse_keyword(Keyword::NO);
6250 self.expect_keyword(Keyword::CHAIN)?;
6251 Ok(chain)
6252 } else {
6253 Ok(false)
6254 }
6255 }
6256
6257 fn parse_deallocate(&mut self) -> ModalResult<Statement> {
6258 let prepare = self.parse_keyword(Keyword::PREPARE);
6259 let name = if self.parse_keyword(Keyword::ALL) {
6260 None
6261 } else {
6262 Some(self.parse_identifier()?)
6263 };
6264 Ok(Statement::Deallocate { name, prepare })
6265 }
6266
6267 fn parse_execute(&mut self) -> ModalResult<Statement> {
6268 let name = self.parse_identifier()?;
6269
6270 let mut parameters = vec![];
6271 if self.consume_token(&Token::LParen) {
6272 parameters = self.parse_comma_separated(Parser::parse_expr)?;
6273 self.expect_token(&Token::RParen)?;
6274 }
6275
6276 Ok(Statement::Execute { name, parameters })
6277 }
6278
6279 fn parse_prepare(&mut self) -> ModalResult<Statement> {
6280 let name = self.parse_identifier()?;
6281
6282 let mut data_types = vec![];
6283 if self.consume_token(&Token::LParen) {
6284 data_types = self.parse_comma_separated(Parser::parse_data_type)?;
6285 self.expect_token(&Token::RParen)?;
6286 }
6287
6288 self.expect_keyword(Keyword::AS)?;
6289 let statement = Box::new(self.parse_statement()?);
6290 Ok(Statement::Prepare {
6291 name,
6292 data_types,
6293 statement,
6294 })
6295 }
6296
6297 fn parse_comment(&mut self) -> ModalResult<Statement> {
6298 self.expect_keyword(Keyword::ON)?;
6299 let checkpoint = *self;
6300 let token = self.next_token();
6301
6302 let (object_type, object_name) = match token.token {
6303 Token::Word(w) if w.keyword == Keyword::COLUMN => {
6304 let object_name = self.parse_object_name()?;
6305 (CommentObject::Column, object_name)
6306 }
6307 Token::Word(w) if w.keyword == Keyword::TABLE => {
6308 let object_name = self.parse_object_name()?;
6309 (CommentObject::Table, object_name)
6310 }
6311 _ => self.expected_at(checkpoint, "comment object_type")?,
6312 };
6313
6314 self.expect_keyword(Keyword::IS)?;
6315 let comment = if self.parse_keyword(Keyword::NULL) {
6316 None
6317 } else {
6318 Some(self.parse_literal_string()?)
6319 };
6320 Ok(Statement::Comment {
6321 object_type,
6322 object_name,
6323 comment,
6324 })
6325 }
6326
6327 fn parse_use(&mut self) -> ModalResult<Statement> {
6328 let db_name = self.parse_object_name()?;
6329 Ok(Statement::Use { db_name })
6330 }
6331
6332 pub fn parse_named_window(&mut self) -> ModalResult<NamedWindow> {
6334 let name = self.parse_identifier()?;
6335 self.expect_keywords(&[Keyword::AS])?;
6336 self.expect_token(&Token::LParen)?;
6337 let window_spec = self.parse_window_spec()?;
6338 self.expect_token(&Token::RParen)?;
6339 Ok(NamedWindow { name, window_spec })
6340 }
6341
6342 pub fn parse_window_spec(&mut self) -> ModalResult<WindowSpec> {
6344 let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
6345 self.parse_comma_separated(Parser::parse_expr)?
6346 } else {
6347 vec![]
6348 };
6349 let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
6350 self.parse_comma_separated(Parser::parse_order_by_expr)?
6351 } else {
6352 vec![]
6353 };
6354 let window_frame = if !self.peek_token().eq(&Token::RParen) {
6355 Some(self.parse_window_frame()?)
6356 } else {
6357 None
6358 };
6359 Ok(WindowSpec {
6360 partition_by,
6361 order_by,
6362 window_frame,
6363 })
6364 }
6365
6366 pub fn parse_wait(&mut self) -> ModalResult<Statement> {
6367 let target = if self.parse_keyword(Keyword::TABLE) {
6368 WaitTarget::Table(self.parse_object_name()?)
6369 } else if self.parse_keyword(Keyword::MATERIALIZED) {
6370 self.expect_keyword(Keyword::VIEW)?;
6371 WaitTarget::MaterializedView(self.parse_object_name()?)
6372 } else if self.parse_keyword(Keyword::SINK) {
6373 WaitTarget::Sink(self.parse_object_name()?)
6374 } else if self.parse_keyword(Keyword::INDEX) {
6375 WaitTarget::Index(self.parse_object_name()?)
6376 } else {
6377 WaitTarget::All
6378 };
6379
6380 Ok(Statement::Wait(target))
6381 }
6382}
6383
6384impl Word {
6385 pub fn to_ident(&self) -> ModalResult<Ident> {
6387 if self.value.is_empty() {
6388 parser_err!("zero-length delimited identifier at or near \"{self}\"")
6389 } else {
6390 Ok(Ident {
6391 value: self.value.clone(),
6392 quote_style: self.quote_style,
6393 })
6394 }
6395 }
6396}
6397
6398#[cfg(test)]
6399mod tests {
6400 use super::*;
6401 use crate::test_utils::run_parser_method;
6402
6403 #[test]
6404 fn test_parse_integer_min() {
6405 let min_bigint = "-9223372036854775808";
6406 run_parser_method(min_bigint, |parser| {
6407 assert_eq!(
6408 parser.parse_expr().unwrap(),
6409 Expr::Value(Value::Number("-9223372036854775808".to_owned()))
6410 )
6411 });
6412 }
6413
6414 #[test]
6415 fn test_parse_function_arg_secret_ref() {
6416 use crate::ast::{FunctionArg, FunctionArgExpr, SecretRefAsType, SecretRefValue};
6417
6418 run_parser_method("SECRET my_secret", |parser| {
6420 let (_variadic, arg) = parser.parse_function_args().unwrap();
6421 assert_eq!(
6422 arg,
6423 FunctionArg::Unnamed(FunctionArgExpr::SecretRef(SecretRefValue {
6424 secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6425 ref_as: SecretRefAsType::Text,
6426 }))
6427 );
6428 });
6429
6430 run_parser_method("SECRET my_secret AS FILE", |parser| {
6432 let (_variadic, arg) = parser.parse_function_args().unwrap();
6433 assert_eq!(
6434 arg,
6435 FunctionArg::Unnamed(FunctionArgExpr::SecretRef(SecretRefValue {
6436 secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6437 ref_as: SecretRefAsType::File,
6438 }))
6439 );
6440 });
6441
6442 run_parser_method("header => SECRET my_secret", |parser| {
6444 let (_variadic, arg) = parser.parse_function_args().unwrap();
6445 assert_eq!(
6446 arg,
6447 FunctionArg::Named {
6448 name: Ident::new_unchecked("header"),
6449 arg: FunctionArgExpr::SecretRef(SecretRefValue {
6450 secret_name: ObjectName(vec![Ident::new_unchecked("my_secret")]),
6451 ref_as: SecretRefAsType::Text,
6452 }),
6453 }
6454 );
6455 });
6456 }
6457}