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