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