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