1use std::collections::BTreeMap;
24use std::error::Error;
25use std::fmt;
26
27use IsLateral::*;
28use IsOptional::*;
29use bytesize::ByteSize;
30use itertools::Itertools;
31use mz_ore::cast::CastFrom;
32use mz_ore::collections::CollectionExt;
33use mz_ore::option::OptionExt;
34use mz_ore::stack::{CheckedRecursion, RecursionGuard, RecursionLimitError};
35use mz_sql_lexer::keywords::*;
36use mz_sql_lexer::lexer::{self, IdentString, LexerError, PosToken, Token};
37use serde::{Deserialize, Serialize};
38use tracing::{debug, warn};
39
40use crate::ast::display::AstDisplay;
41use crate::ast::*;
42use crate::ident;
43
44const RECURSION_LIMIT: usize = 128;
48
49const EXPR_CHAIN_LIMIT: usize = 1024;
59
60pub const MAX_STATEMENT_BATCH_SIZE: usize = 1_000_000;
62
63const QUERY_START_KEYWORDS: &[Keyword] = &[WITH, SELECT, SHOW, TABLE, VALUES];
65
66const ANY_ALL_KEYWORDS: &[Keyword] = &[ANY, ALL, SOME];
68
69macro_rules! parser_err {
71 ($parser:expr, $pos:expr, $MSG:expr) => {
72 Err($parser.error($pos, $MSG.to_string()))
73 };
74 ($parser:expr, $pos:expr, $($arg:tt)*) => {
75 Err($parser.error($pos, format!($($arg)*)))
76 };
77}
78
79#[derive(Debug, Clone)]
82pub struct StatementParseResult<'a> {
83 pub ast: Statement<Raw>,
84 pub sql: &'a str,
85}
86
87impl<'a> StatementParseResult<'a> {
88 pub fn new(ast: Statement<Raw>, sql: &'a str) -> Self {
89 Self { ast, sql }
90 }
91}
92
93trait ParserStatementErrorMapper<T> {
94 fn map_parser_err(self, statement_kind: StatementKind) -> Result<T, ParserStatementError>;
96
97 fn map_no_statement_parser_err(self) -> Result<T, ParserStatementError>;
102}
103
104impl<T> ParserStatementErrorMapper<T> for Result<T, ParserError> {
105 fn map_parser_err(self, statement: StatementKind) -> Result<T, ParserStatementError> {
106 self.map_err(|error| ParserStatementError {
107 error,
108 statement: Some(statement),
109 })
110 }
111
112 fn map_no_statement_parser_err(self) -> Result<T, ParserStatementError> {
113 self.map_err(|error| ParserStatementError {
114 error,
115 statement: None,
116 })
117 }
118}
119
120#[mz_ore::instrument(target = "compiler", level = "trace", name = "sql_to_ast")]
126pub fn parse_statements_with_limit(
127 sql: &str,
128) -> Result<Result<Vec<StatementParseResult<'_>>, ParserStatementError>, String> {
129 if sql.len() > MAX_STATEMENT_BATCH_SIZE {
130 return Err(format!(
131 "statement batch size cannot exceed {}",
132 ByteSize::b(u64::cast_from(MAX_STATEMENT_BATCH_SIZE))
133 ));
134 }
135 Ok(parse_statements(sql))
136}
137
138#[mz_ore::instrument(target = "compiler", level = "trace", name = "sql_to_ast")]
140pub fn parse_statements(sql: &str) -> Result<Vec<StatementParseResult<'_>>, ParserStatementError> {
141 let tokens = lexer::lex(sql).map_err(|error| ParserStatementError {
142 error: error.into(),
143 statement: None,
144 })?;
145 let res = Parser::new(sql, tokens).parse_statements();
146 debug!("{:?}", {
149 match &res {
150 Ok(stmts) => stmts
151 .iter()
152 .map(|stmt| stmt.ast.to_ast_string_redacted())
153 .join("; "),
154 Err(_) => "parse error".to_string(),
156 }
157 });
158 res
159}
160
161pub fn parse_expr(sql: &str) -> Result<Expr<Raw>, ParserError> {
163 let tokens = lexer::lex(sql)?;
164 let mut parser = Parser::new(sql, tokens);
165 let expr = parser.parse_expr()?;
166 if parser.next_token().is_some() {
167 parser_err!(
168 parser,
169 parser.peek_prev_pos(),
170 "extra token after expression"
171 )
172 } else {
173 Ok(expr)
174 }
175}
176
177pub fn parse_data_type(sql: &str) -> Result<RawDataType, ParserError> {
179 let tokens = lexer::lex(sql)?;
180 let mut parser = Parser::new(sql, tokens);
181 let data_type = parser.parse_data_type()?;
182 if parser.next_token().is_some() {
183 parser_err!(
184 parser,
185 parser.peek_prev_pos(),
186 "extra token after data type"
187 )
188 } else {
189 Ok(data_type)
190 }
191}
192
193pub fn parse_item_name(sql: &str) -> Result<UnresolvedItemName, ParserError> {
195 let tokens = lexer::lex(sql)?;
196 let mut parser = Parser::new(sql, tokens);
197 let name = parser.parse_item_name()?;
198 if parser.next_token().is_some() {
199 parser_err!(
200 parser,
201 parser.peek_prev_pos(),
202 "extra token after item name"
203 )
204 } else {
205 Ok(name)
206 }
207}
208
209pub fn parse_item_name_with_limit(
216 sql: &str,
217) -> Result<Result<UnresolvedItemName, ParserError>, String> {
218 if sql.len() > MAX_STATEMENT_BATCH_SIZE {
219 return Err(format!(
220 "statement batch size cannot exceed {}",
221 ByteSize::b(u64::cast_from(MAX_STATEMENT_BATCH_SIZE))
222 ));
223 }
224 Ok(parse_item_name(sql))
225}
226
227pub fn split_identifier_string(s: &str) -> Result<Vec<String>, ParserError> {
232 if s.trim().is_empty() {
235 Ok(vec![])
236 } else {
237 let tokens = lexer::lex(s)?;
238 let mut parser = Parser::new(s, tokens);
239 let values = parser.parse_comma_separated(Parser::parse_set_variable_value)?;
240 Ok(values
241 .into_iter()
242 .map(|v| v.into_unquoted_value())
243 .collect())
244 }
245}
246
247macro_rules! maybe {
248 ($e:expr) => {{
249 if let Some(v) = $e {
250 return Ok(v);
251 }
252 }};
253}
254
255#[derive(PartialEq)]
256enum IsOptional {
257 Optional,
258 Mandatory,
259}
260
261enum IsLateral {
262 Lateral,
263 NotLateral,
264}
265
266#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
267pub struct ParserError {
268 pub message: String,
270 pub pos: usize,
272}
273
274impl fmt::Display for ParserError {
275 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
276 f.write_str(&self.message)
277 }
278}
279
280impl Error for ParserError {}
281
282impl From<RecursionLimitError> for ParserError {
283 fn from(_: RecursionLimitError) -> ParserError {
284 ParserError {
285 pos: 0,
286 message: format!(
287 "statement exceeds nested expression limit of {}",
288 RECURSION_LIMIT
289 ),
290 }
291 }
292}
293
294impl ParserError {
295 pub(crate) fn new<S>(pos: usize, message: S) -> ParserError
297 where
298 S: Into<String>,
299 {
300 ParserError {
301 pos,
302 message: message.into(),
303 }
304 }
305}
306
307#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
308pub struct ParserStatementError {
309 pub error: ParserError,
311 pub statement: Option<StatementKind>,
313}
314
315impl Error for ParserStatementError {}
316
317impl fmt::Display for ParserStatementError {
318 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
319 f.write_str(&self.error.to_string())
320 }
321}
322
323impl From<LexerError> for ParserError {
324 fn from(value: LexerError) -> Self {
325 ParserError {
326 message: value.message,
327 pos: value.pos,
328 }
329 }
330}
331
332impl From<Keyword> for Ident {
333 fn from(value: Keyword) -> Ident {
334 Ident::new_unchecked(value.as_str().to_lowercase())
336 }
337}
338
339struct Parser<'a> {
341 sql: &'a str,
342 tokens: Vec<PosToken>,
343 index: usize,
345 recursion_guard: RecursionGuard,
346 speculative_failures: usize,
352}
353
354const SPECULATIVE_FAILURES_PER_TOKEN: usize = 100;
360
361#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
369pub(crate) enum Precedence {
370 Zero,
371 Or,
372 And,
373 PrefixNot,
374 Is,
375 Cmp,
376 Like,
377 Other,
378 PlusMinus,
379 MultiplyDivide,
380 PostfixCollateAt,
381 PrefixPlusMinus,
382 PostfixSubscriptCast,
383}
384
385#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
386enum SetPrecedence {
387 Zero,
388 UnionExcept,
389 Intersect,
390}
391
392impl<'a> Parser<'a> {
393 fn new(sql: &'a str, tokens: Vec<PosToken>) -> Self {
395 Parser {
396 sql,
397 tokens,
398 index: 0,
399 recursion_guard: RecursionGuard::with_limit(RECURSION_LIMIT),
400 speculative_failures: 0,
401 }
402 }
403
404 fn error(&self, pos: usize, message: String) -> ParserError {
405 ParserError { pos, message }
406 }
407
408 fn parse_statements(&mut self) -> Result<Vec<StatementParseResult<'a>>, ParserStatementError> {
409 let mut stmts = Vec::new();
410 let mut expecting_statement_delimiter = false;
411 loop {
412 while self.consume_token(&Token::Semicolon) {
414 expecting_statement_delimiter = false;
415 }
416
417 if self.peek_token().is_none() {
418 break;
419 } else if expecting_statement_delimiter {
420 return self
421 .expected(self.peek_pos(), "end of statement", self.peek_token())
422 .map_no_statement_parser_err();
423 }
424
425 let s = self.parse_statement()?;
426 stmts.push(s);
427 expecting_statement_delimiter = true;
428 }
429 Ok(stmts)
430 }
431 fn parse_statement(&mut self) -> Result<StatementParseResult<'a>, ParserStatementError> {
435 let before = self.peek_pos();
436 let statement = self.parse_statement_inner()?;
437 let after = self.peek_pos();
438 Ok(StatementParseResult::new(
439 statement,
440 self.sql[before..after].trim(),
441 ))
442 }
443
444 fn parse_statement_inner(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
447 match self.next_token() {
448 Some(t) => match t {
449 Token::Keyword(CREATE) => Ok(self.parse_create()?),
450 Token::Keyword(DISCARD) => Ok(self
451 .parse_discard()
452 .map_parser_err(StatementKind::Discard)?),
453 Token::Keyword(DROP) => Ok(self.parse_drop()?),
454 Token::Keyword(DELETE) => {
455 Ok(self.parse_delete().map_parser_err(StatementKind::Delete)?)
456 }
457 Token::Keyword(INSERT) => {
458 Ok(self.parse_insert().map_parser_err(StatementKind::Insert)?)
459 }
460 Token::Keyword(UPDATE) => {
461 Ok(self.parse_update().map_parser_err(StatementKind::Update)?)
462 }
463 Token::Keyword(ALTER) => Ok(self.parse_alter()?),
464 Token::Keyword(COPY) => Ok(self.parse_copy()?),
465 Token::Keyword(SET) => Ok(self.parse_set()?),
466 Token::Keyword(RESET) => Ok(self
467 .parse_reset()
468 .map_parser_err(StatementKind::ResetVariable)?),
469 Token::Keyword(SHOW) => Ok(Statement::Show(
470 self.parse_show().map_parser_err(StatementKind::Show)?,
471 )),
472 Token::Keyword(START) => Ok(self
473 .parse_start_transaction()
474 .map_parser_err(StatementKind::StartTransaction)?),
475 Token::Keyword(BEGIN) => Ok(self
479 .parse_begin()
480 .map_parser_err(StatementKind::StartTransaction)?),
481 Token::Keyword(COMMIT) => {
482 Ok(self.parse_commit().map_parser_err(StatementKind::Commit)?)
483 }
484 Token::Keyword(ROLLBACK) | Token::Keyword(ABORT) => Ok(self
485 .parse_rollback()
486 .map_parser_err(StatementKind::Rollback)?),
487 Token::Keyword(TAIL) => {
488 Ok(self.parse_tail().map_parser_err(StatementKind::Subscribe)?)
489 }
490 Token::Keyword(SUBSCRIBE) => Ok(self
491 .parse_subscribe()
492 .map_parser_err(StatementKind::Subscribe)?),
493 Token::Keyword(EXPLAIN) => Ok(self.parse_explain()?),
494 Token::Keyword(DECLARE) => Ok(self.parse_declare()?),
495 Token::Keyword(FETCH) => {
496 Ok(self.parse_fetch().map_parser_err(StatementKind::Fetch)?)
497 }
498 Token::Keyword(CLOSE) => {
499 Ok(self.parse_close().map_parser_err(StatementKind::Close)?)
500 }
501 Token::Keyword(PREPARE) => Ok(self.parse_prepare()?),
502 Token::Keyword(EXECUTE) => Ok(self
503 .parse_execute()
504 .map_parser_err(StatementKind::Execute)?),
505 Token::Keyword(DEALLOCATE) => Ok(self
506 .parse_deallocate()
507 .map_parser_err(StatementKind::Deallocate)?),
508 Token::Keyword(RAISE) => {
509 Ok(self.parse_raise().map_parser_err(StatementKind::Raise)?)
510 }
511 Token::Keyword(GRANT) => Ok(self.parse_grant()?),
512 Token::Keyword(REVOKE) => Ok(self.parse_revoke()?),
513 Token::Keyword(REASSIGN) => Ok(self
514 .parse_reassign_owned()
515 .map_parser_err(StatementKind::ReassignOwned)?),
516 Token::Keyword(INSPECT) => Ok(Statement::Show(
517 self.parse_inspect().map_no_statement_parser_err()?,
518 )),
519 Token::Keyword(VALIDATE) => Ok(self
520 .parse_validate()
521 .map_parser_err(StatementKind::ValidateConnection)?),
522 Token::Keyword(COMMENT) => Ok(self
523 .parse_comment()
524 .map_parser_err(StatementKind::Comment)?),
525 Token::Keyword(k) if QUERY_START_KEYWORDS.contains(&k) => {
526 self.prev_token();
527 Ok(Statement::Select(
528 self.parse_select_statement()
529 .map_parser_err(StatementKind::Select)?,
530 ))
531 }
532 Token::Keyword(kw) => parser_err!(
533 self,
534 self.peek_prev_pos(),
535 format!("Unexpected keyword {} at the beginning of a statement", kw)
536 )
537 .map_no_statement_parser_err(),
538 Token::LParen => {
539 self.prev_token();
540 let query = self.parse_query().map_parser_err(StatementKind::Select)?;
541 if let Query {
547 ctes: CteBlock::Simple(ctes),
548 body: SetExpr::Show(show),
549 order_by,
550 limit: None,
551 offset: None,
552 } = &query
553 {
554 if ctes.is_empty() && order_by.is_empty() {
555 return Ok(Statement::Show(show.clone()));
556 }
557 }
558 Ok(Statement::Select(SelectStatement {
559 query,
560 as_of: None, }))
562 }
563 unexpected => self
564 .expected(
565 self.peek_prev_pos(),
566 "a keyword at the beginning of a statement",
567 Some(unexpected),
568 )
569 .map_no_statement_parser_err(),
570 },
571 None => self
572 .expected(self.peek_prev_pos(), "SQL statement", None)
573 .map_no_statement_parser_err(),
574 }
575 }
576
577 fn parse_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
579 self.parse_subexpr(Precedence::Zero)
580 }
581
582 fn parse_subexpr(&mut self, precedence: Precedence) -> Result<Expr<Raw>, ParserError> {
584 let expr = self.checked_recur_mut(|parser| parser.parse_prefix())?;
585 self.parse_subexpr_seeded(precedence, expr)
586 }
587
588 fn parse_subexpr_seeded(
589 &mut self,
590 precedence: Precedence,
591 mut expr: Expr<Raw>,
592 ) -> Result<Expr<Raw>, ParserError> {
593 self.checked_recur_mut(|parser| {
594 let mut chain = 0usize;
606 loop {
607 let next_precedence = parser.get_next_precedence();
608 if precedence >= next_precedence {
609 break;
610 }
611 chain += 1;
612 if chain > EXPR_CHAIN_LIMIT {
613 return Err(ParserError::new(
614 parser.peek_pos(),
615 format!(
616 "statement exceeds nested expression limit of {}",
617 EXPR_CHAIN_LIMIT
618 ),
619 ));
620 }
621
622 expr = parser.parse_infix(expr, next_precedence)?;
623 }
624 Ok(expr)
625 })
626 }
627
628 fn parse_prefix(&mut self) -> Result<Expr<Raw>, ParserError> {
630 maybe!(self.maybe_parse(|parser| {
652 let data_type = parser.parse_data_type()?;
653 if data_type.to_string().as_str() == "interval" {
654 Ok(Expr::Value(Value::Interval(parser.parse_interval_value()?)))
655 } else {
656 Ok(Expr::Cast {
657 expr: Box::new(Expr::Value(Value::String(parser.parse_literal_string()?))),
658 data_type,
659 })
660 }
661 }));
662
663 let tok = self
664 .next_token()
665 .ok_or_else(|| self.error(self.peek_prev_pos(), "Unexpected EOF".to_string()))?;
666 let expr = match (tok, self.peek_token()) {
667 (Token::LBracket, _) => {
668 self.prev_token();
669 let function = self.parse_named_function()?;
670 Ok(Expr::Function(function))
671 }
672 (Token::Keyword(TRUE) | Token::Keyword(FALSE) | Token::Keyword(NULL), _) => {
673 self.prev_token();
674 Ok(Expr::Value(self.parse_value()?))
675 }
676 (Token::Keyword(ARRAY), _) => self.parse_array(),
677 (Token::Keyword(LIST), Some(Token::LBracket) | Some(Token::LParen)) => {
678 self.parse_list()
679 }
680 (Token::Keyword(MAP), Some(Token::LBracket) | Some(Token::LParen)) => self.parse_map(),
681 (Token::Keyword(CASE), _) => self.parse_case_expr(),
682 (Token::Keyword(CAST), _) => self.parse_cast_expr(),
683 (Token::Keyword(COALESCE), Some(Token::LParen)) => {
684 self.parse_homogenizing_function(HomogenizingFunction::Coalesce)
685 }
686 (Token::Keyword(GREATEST), Some(Token::LParen)) => {
687 self.parse_homogenizing_function(HomogenizingFunction::Greatest)
688 }
689 (Token::Keyword(LEAST), Some(Token::LParen)) => {
690 self.parse_homogenizing_function(HomogenizingFunction::Least)
691 }
692 (Token::Keyword(NULLIF), Some(Token::LParen)) => self.parse_nullif_expr(),
693 (Token::Keyword(EXISTS), Some(Token::LParen)) => self.parse_exists_expr(),
694 (Token::Keyword(EXTRACT), Some(Token::LParen)) => self.parse_extract_expr(),
695 (Token::Keyword(NOT), _) => Ok(Expr::Not {
696 expr: Box::new(self.parse_subexpr(Precedence::PrefixNot)?),
697 }),
698 (Token::Keyword(OPERATOR), Some(Token::LParen)) => {
699 self.expect_token(&Token::LParen)?;
700 let op = self.parse_operator()?;
701 self.expect_token(&Token::RParen)?;
702 Ok(Expr::Op {
707 op,
708 expr1: Box::new(self.parse_subexpr(Precedence::Other)?),
709 expr2: None,
710 })
711 }
712 (Token::Keyword(ROW), Some(Token::LParen)) => self.parse_row_expr(),
713 (Token::Keyword(TRIM), Some(Token::LParen)) => self.parse_trim_expr(),
714 (Token::Keyword(POSITION), Some(Token::LParen)) => self.parse_position_expr(),
715 (Token::Keyword(NORMALIZE), Some(Token::LParen)) => self.parse_normalize_expr(),
716 (Token::Keyword(SUBSTRING), Some(Token::LParen)) => self.parse_substring_expr(),
717 (Token::Keyword(kw), _) if kw.is_always_reserved() => {
718 return Err(self.error(
719 self.peek_prev_pos(),
720 format!("expected expression, but found reserved keyword: {kw}"),
721 ));
722 }
723 (Token::Keyword(id), _) => self.parse_qualified_identifier(id.into()),
727 (Token::Ident(id), _) => self.parse_qualified_identifier(self.new_identifier(id)?),
728 (Token::Op(op), _) if op == "-" => {
729 if let Some(Token::Number(n)) = self.peek_token() {
730 let n = match n.parse::<f64>() {
731 Ok(n) => n,
732 Err(_) => {
733 return Err(
734 self.error(self.peek_prev_pos(), format!("invalid number {}", n))
735 );
736 }
737 };
738 if n != 0.0 {
739 self.prev_token();
740 return Ok(Expr::Value(self.parse_value()?));
741 }
742 }
743
744 Ok(Expr::Op {
745 op: Op::bare(op),
746 expr1: Box::new(self.parse_subexpr(Precedence::PrefixPlusMinus)?),
747 expr2: None,
748 })
749 }
750 (Token::Op(op), _) if op == "+" => Ok(Expr::Op {
751 op: Op::bare(op),
752 expr1: Box::new(self.parse_subexpr(Precedence::PrefixPlusMinus)?),
753 expr2: None,
754 }),
755 (Token::Op(op), _) if op == "~" => Ok(Expr::Op {
756 op: Op::bare(op),
757 expr1: Box::new(self.parse_subexpr(Precedence::Other)?),
758 expr2: None,
759 }),
760 (Token::Number(_) | Token::String(_) | Token::HexString(_), _) => {
761 self.prev_token();
762 Ok(Expr::Value(self.parse_value()?))
763 }
764 (Token::Parameter(n), _) => Ok(Expr::Parameter(n)),
765 (Token::LParen, _) => {
766 let expr = self.parse_parenthesized_fragment()?.into_expr();
767 self.expect_token(&Token::RParen)?;
768 Ok(expr)
769 }
770 (unexpected, _) => {
771 self.expected(self.peek_prev_pos(), "an expression", Some(unexpected))
772 }
773 }?;
774
775 Ok(expr)
776 }
777
778 fn parse_parenthesized_fragment(&mut self) -> Result<ParenthesizedFragment, ParserError> {
783 if self.peek_one_of_keywords(QUERY_START_KEYWORDS) {
811 Ok(ParenthesizedFragment::Query(self.parse_query()?))
813 } else if !self.consume_token(&Token::LParen) {
814 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
816 Ok(ParenthesizedFragment::Exprs(exprs))
817 } else {
818 let fragment = self.checked_recur_mut(Parser::parse_parenthesized_fragment)?;
824 self.expect_token(&Token::RParen)?;
825
826 match (fragment, self.peek_token()) {
829 (
834 ParenthesizedFragment::Query(query),
835 Some(Token::RParen | Token::Keyword(UNION | INTERSECT | EXCEPT)),
836 ) => {
837 let query = SetExpr::Query(Box::new(query));
838 let ctes = CteBlock::empty();
839 let body = self.parse_query_body_seeded(SetPrecedence::Zero, query)?;
840 Ok(ParenthesizedFragment::Query(
841 self.parse_query_tail(ctes, body)?,
842 ))
843 }
844
845 (fragment, _) => {
850 let prefix = fragment.into_expr();
851 let expr = self.parse_subexpr_seeded(Precedence::Zero, prefix)?;
852 let mut exprs = vec![expr];
853 while self.consume_token(&Token::Comma) {
854 exprs.push(self.parse_expr()?);
855 }
856 Ok(ParenthesizedFragment::Exprs(exprs))
857 }
858 }
859 }
860 }
861
862 fn parse_function(&mut self, name: RawItemName) -> Result<Function<Raw>, ParserError> {
863 self.expect_token(&Token::LParen)?;
864 let distinct = matches!(
865 self.parse_at_most_one_keyword(&[ALL, DISTINCT], &format!("function: {}", name))?,
866 Some(DISTINCT),
867 );
868 let args = self.parse_optional_args(true)?;
869
870 if distinct && matches!(args, FunctionArgs::Star) {
871 return Err(self.error(
872 self.peek_prev_pos() - 1,
873 "DISTINCT * not supported as function args".to_string(),
874 ));
875 }
876
877 let filter = if self.parse_keyword(FILTER) {
878 self.expect_token(&Token::LParen)?;
879 self.expect_keyword(WHERE)?;
880 let expr = self.parse_expr()?;
881 self.expect_token(&Token::RParen)?;
882 Some(Box::new(expr))
883 } else {
884 None
885 };
886 let over =
887 if self.peek_keyword(OVER) || self.peek_keyword(IGNORE) || self.peek_keyword(RESPECT) {
888 let ignore_nulls = self.parse_keywords(&[IGNORE, NULLS]);
892 let respect_nulls = self.parse_keywords(&[RESPECT, NULLS]);
893 self.expect_keyword(OVER)?;
894
895 self.expect_token(&Token::LParen)?;
896 let partition_by = if self.parse_keywords(&[PARTITION, BY]) {
897 self.parse_comma_separated(Parser::parse_expr)?
899 } else {
900 vec![]
901 };
902 let order_by = if self.parse_keywords(&[ORDER, BY]) {
903 self.parse_comma_separated(Parser::parse_order_by_expr)?
904 } else {
905 vec![]
906 };
907 let window_frame = if !self.consume_token(&Token::RParen) {
908 let window_frame = self.parse_window_frame()?;
909 self.expect_token(&Token::RParen)?;
910 Some(window_frame)
911 } else {
912 None
913 };
914
915 Some(WindowSpec {
916 partition_by,
917 order_by,
918 window_frame,
919 ignore_nulls,
920 respect_nulls,
921 })
922 } else {
923 None
924 };
925
926 Ok(Function {
927 name,
928 args,
929 filter,
930 over,
931 distinct,
932 })
933 }
934
935 fn parse_window_frame(&mut self) -> Result<WindowFrame, ParserError> {
936 let units = match self.expect_one_of_keywords(&[ROWS, RANGE, GROUPS])? {
937 ROWS => WindowFrameUnits::Rows,
938 RANGE => WindowFrameUnits::Range,
939 GROUPS => WindowFrameUnits::Groups,
940 _ => unreachable!(),
941 };
942 let (start_bound, end_bound) = if self.parse_keyword(BETWEEN) {
943 let start_bound = self.parse_window_frame_bound()?;
944 self.expect_keyword(AND)?;
945 let end_bound = Some(self.parse_window_frame_bound()?);
946 (start_bound, end_bound)
947 } else {
948 (self.parse_window_frame_bound()?, None)
949 };
950 Ok(WindowFrame {
951 units,
952 start_bound,
953 end_bound,
954 })
955 }
956
957 fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
959 if self.parse_keywords(&[CURRENT, ROW]) {
960 Ok(WindowFrameBound::CurrentRow)
961 } else {
962 let rows = if self.parse_keyword(UNBOUNDED) {
963 None
964 } else {
965 Some(self.parse_literal_uint()?)
966 };
967 if self.parse_keyword(PRECEDING) {
968 Ok(WindowFrameBound::Preceding(rows))
969 } else if self.parse_keyword(FOLLOWING) {
970 Ok(WindowFrameBound::Following(rows))
971 } else {
972 self.expected(self.peek_pos(), "PRECEDING or FOLLOWING", self.peek_token())
973 }
974 }
975 }
976
977 fn parse_case_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
978 let mut operand = None;
979 if !self.parse_keyword(WHEN) {
980 operand = Some(Box::new(self.parse_expr()?));
981 self.expect_keyword(WHEN)?;
982 }
983 let mut conditions = vec![];
984 let mut results = vec![];
985 loop {
986 conditions.push(self.parse_expr()?);
987 self.expect_keyword(THEN)?;
988 results.push(self.parse_expr()?);
989 if !self.parse_keyword(WHEN) {
990 break;
991 }
992 }
993 let else_result = if self.parse_keyword(ELSE) {
994 Some(Box::new(self.parse_expr()?))
995 } else {
996 None
997 };
998 self.expect_keyword(END)?;
999 Ok(Expr::Case {
1000 operand,
1001 conditions,
1002 results,
1003 else_result,
1004 })
1005 }
1006
1007 fn parse_cast_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1009 fn safe_before_pg_cast(expr: &Expr<Raw>) -> bool {
1018 match expr {
1019 Expr::Nested(_)
1020 | Expr::Value(_)
1021 | Expr::Function { .. }
1022 | Expr::Identifier { .. }
1023 | Expr::HomogenizingFunction { .. }
1024 | Expr::NullIf { .. }
1025 | Expr::Subquery { .. }
1026 | Expr::Parameter(..) => true,
1027 Expr::Cast { expr, .. } | Expr::Collate { expr, .. } => safe_before_pg_cast(expr),
1028 _ => false,
1029 }
1030 }
1031
1032 self.expect_token(&Token::LParen)?;
1033 let expr = self.parse_expr()?;
1034 self.expect_keyword(AS)?;
1035 let data_type = self.parse_data_type()?;
1036 self.expect_token(&Token::RParen)?;
1037 if safe_before_pg_cast(&expr) {
1049 Ok(Expr::Cast {
1050 expr: Box::new(expr),
1051 data_type,
1052 })
1053 } else {
1054 Ok(Expr::Cast {
1055 expr: Box::new(Expr::Nested(Box::new(expr))),
1056 data_type,
1057 })
1058 }
1059 }
1060
1061 fn parse_exists_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1063 self.expect_token(&Token::LParen)?;
1064 let exists_node = Expr::Exists(Box::new(self.parse_query()?));
1065 self.expect_token(&Token::RParen)?;
1066 Ok(exists_node)
1067 }
1068
1069 fn parse_homogenizing_function(
1070 &mut self,
1071 function: HomogenizingFunction,
1072 ) -> Result<Expr<Raw>, ParserError> {
1073 self.expect_token(&Token::LParen)?;
1074 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1075 self.expect_token(&Token::RParen)?;
1076 Ok(Expr::HomogenizingFunction { function, exprs })
1077 }
1078
1079 fn parse_nullif_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1080 self.expect_token(&Token::LParen)?;
1081 let l_expr = Box::new(self.parse_expr()?);
1082 self.expect_token(&Token::Comma)?;
1083 let r_expr = Box::new(self.parse_expr()?);
1084 self.expect_token(&Token::RParen)?;
1085 Ok(Expr::NullIf { l_expr, r_expr })
1086 }
1087
1088 fn parse_extract_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1091 self.expect_token(&Token::LParen)?;
1092 let field = match self.next_token() {
1093 Some(Token::Keyword(kw)) => Ident::from(kw).into_string(),
1094 Some(Token::Ident(id)) => self.new_identifier(id)?.into_string(),
1095 Some(Token::String(s)) => s,
1096 t => self.expected(self.peek_prev_pos(), "extract field token", t)?,
1097 };
1098 self.expect_keyword(FROM)?;
1099 let expr = self.parse_expr()?;
1100 self.expect_token(&Token::RParen)?;
1101 Ok(Expr::Function(Function {
1102 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("extract"))),
1103 args: FunctionArgs::args(vec![Expr::Value(Value::String(field)), expr]),
1104 filter: None,
1105 over: None,
1106 distinct: false,
1107 }))
1108 }
1109
1110 fn parse_row_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1111 self.expect_token(&Token::LParen)?;
1112 if self.consume_token(&Token::RParen) {
1113 Ok(Expr::Row { exprs: vec![] })
1114 } else {
1115 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1116 self.expect_token(&Token::RParen)?;
1117 Ok(Expr::Row { exprs })
1118 }
1119 }
1120
1121 fn parse_composite_type_definition(&mut self) -> Result<Vec<ColumnDef<Raw>>, ParserError> {
1122 self.expect_token(&Token::LParen)?;
1123 let fields = self.parse_comma_separated(|parser| {
1124 Ok(ColumnDef {
1125 name: parser.parse_identifier()?,
1126 data_type: parser.parse_data_type()?,
1127 collation: None,
1128 options: vec![],
1129 })
1130 })?;
1131 self.expect_token(&Token::RParen)?;
1132 Ok(fields)
1133 }
1134
1135 fn parse_trim_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1143 self.expect_token(&Token::LParen)?;
1144 let name = match self.parse_one_of_keywords(&[BOTH, LEADING, TRAILING]) {
1145 None | Some(BOTH) => ident!("btrim"),
1146 Some(LEADING) => ident!("ltrim"),
1147 Some(TRAILING) => ident!("rtrim"),
1148 _ => unreachable!(),
1149 };
1150 let mut exprs = Vec::new();
1151 if self.parse_keyword(FROM) {
1152 exprs.push(self.parse_expr()?);
1154 } else {
1155 exprs.push(self.parse_expr()?);
1157 if self.parse_keyword(FROM) {
1158 exprs.insert(0, self.parse_expr()?);
1161 }
1162 }
1163 self.expect_token(&Token::RParen)?;
1164 Ok(Expr::Function(Function {
1165 name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
1166 args: FunctionArgs::args(exprs),
1167 filter: None,
1168 over: None,
1169 distinct: false,
1170 }))
1171 }
1172
1173 fn parse_position_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1175 self.expect_token(&Token::LParen)?;
1176 let needle = self.parse_subexpr(Precedence::Like)?;
1179 self.expect_token(&Token::Keyword(IN))?;
1180 let haystack = self.parse_expr()?;
1181 self.expect_token(&Token::RParen)?;
1182 Ok(Expr::Function(Function {
1183 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("position"))),
1184 args: FunctionArgs::args(vec![needle, haystack]),
1185 filter: None,
1186 over: None,
1187 distinct: false,
1188 }))
1189 }
1190
1191 fn parse_normalize_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1198 self.expect_token(&Token::LParen)?;
1199 let expr = self.parse_expr()?;
1200
1201 let args = if self.consume_token(&Token::Comma) {
1202 let form = self
1203 .expect_one_of_keywords(&[NFC, NFD, NFKC, NFKD])?
1204 .as_str();
1205 vec![expr, Expr::Value(Value::String(form.to_owned()))]
1206 } else {
1207 vec![expr, Expr::Value(Value::String("NFC".to_owned()))]
1208 };
1209
1210 self.expect_token(&Token::RParen)?;
1211 Ok(Expr::Function(Function {
1212 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("normalize"))),
1213 args: FunctionArgs::args(args),
1214 filter: None,
1215 over: None,
1216 distinct: false,
1217 }))
1218 }
1219
1220 fn parse_interval_value(&mut self) -> Result<IntervalValue, ParserError> {
1232 let value = self.parse_literal_string()?;
1235
1236 let (precision_high, precision_low, fsec_max_precision) =
1239 match self.expect_one_of_keywords(&[
1240 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEARS, MONTHS, DAYS, HOURS, MINUTES,
1241 SECONDS,
1242 ]) {
1243 Ok(d) => {
1244 let d_pos = self.peek_prev_pos();
1245 if self.parse_keyword(TO) {
1246 let e = self.expect_one_of_keywords(&[
1247 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEARS, MONTHS, DAYS, HOURS,
1248 MINUTES, SECONDS,
1249 ])?;
1250
1251 let high: DateTimeField = d
1252 .as_str()
1253 .parse()
1254 .map_err(|e| self.error(self.peek_prev_pos(), e))?;
1255 let low: DateTimeField = e
1256 .as_str()
1257 .parse()
1258 .map_err(|e| self.error(self.peek_prev_pos(), e))?;
1259
1260 if high >= low {
1264 return parser_err!(
1265 self,
1266 d_pos,
1267 "Invalid field range in INTERVAL '{}' {} TO {}; the value in the \
1268 position of {} should be more significant than {}.",
1269 value,
1270 d,
1271 e,
1272 d,
1273 e,
1274 );
1275 }
1276
1277 let fsec_max_precision = if low == DateTimeField::Second {
1278 self.parse_optional_precision()?
1279 } else {
1280 None
1281 };
1282
1283 (high, low, fsec_max_precision)
1284 } else {
1285 let low: DateTimeField = d
1286 .as_str()
1287 .parse()
1288 .map_err(|e| self.error(self.peek_prev_pos(), e))?;
1289 let fsec_max_precision = if low == DateTimeField::Second {
1290 self.parse_optional_precision()?
1291 } else {
1292 None
1293 };
1294
1295 (DateTimeField::Year, low, fsec_max_precision)
1296 }
1297 }
1298 Err(_) => (DateTimeField::Year, DateTimeField::Second, None),
1299 };
1300 Ok(IntervalValue {
1301 value,
1302 precision_high,
1303 precision_low,
1304 fsec_max_precision,
1305 })
1306 }
1307
1308 fn parse_infix(
1310 &mut self,
1311 expr: Expr<Raw>,
1312 precedence: Precedence,
1313 ) -> Result<Expr<Raw>, ParserError> {
1314 let tok = self.next_token().unwrap(); let regular_binary_operator = match &tok {
1317 Token::Op(s) => Some(Op::bare(s)),
1318 Token::Eq => Some(Op::bare("=")),
1319 Token::Star => Some(Op::bare("*")),
1320 Token::Keyword(OPERATOR) => {
1321 self.expect_token(&Token::LParen)?;
1322 let op = self.parse_operator()?;
1323 self.expect_token(&Token::RParen)?;
1324 Some(op)
1325 }
1326 _ => None,
1327 };
1328
1329 if let Some(op) = regular_binary_operator {
1330 if let Some(kw) = self.parse_one_of_keywords(ANY_ALL_KEYWORDS) {
1331 self.parse_any_all(expr, op, kw)
1332 } else {
1333 Ok(Expr::Op {
1334 op,
1335 expr1: Box::new(expr),
1336 expr2: Some(Box::new(self.parse_subexpr(precedence)?)),
1337 })
1338 }
1339 } else if let Token::Keyword(kw) = tok {
1340 match kw {
1341 IS => {
1342 let negated = self.parse_keyword(NOT);
1343 if let Some(construct) =
1344 self.parse_one_of_keywords(&[NULL, TRUE, FALSE, UNKNOWN, DISTINCT])
1345 {
1346 let construct = match construct {
1347 NULL => IsExprConstruct::Null,
1348 TRUE => IsExprConstruct::True,
1349 FALSE => IsExprConstruct::False,
1350 UNKNOWN => IsExprConstruct::Unknown,
1351 DISTINCT => {
1352 self.expect_keyword(FROM)?;
1353 let expr = self.parse_subexpr(precedence)?;
1363 IsExprConstruct::DistinctFrom(Box::new(expr))
1364 }
1365 _ => unreachable!(),
1366 };
1367 Ok(Expr::IsExpr {
1368 expr: Box::new(expr),
1369 negated,
1370 construct,
1371 })
1372 } else {
1373 self.expected(
1374 self.peek_pos(),
1375 "NULL, NOT NULL, TRUE, NOT TRUE, FALSE, NOT FALSE, UNKNOWN, NOT UNKNOWN after IS",
1376 self.peek_token(),
1377 )
1378 }
1379 }
1380 ISNULL => Ok(Expr::IsExpr {
1381 expr: Box::new(expr),
1382 negated: false,
1383 construct: IsExprConstruct::Null,
1384 }),
1385 NOT | IN | LIKE | ILIKE | BETWEEN => {
1386 self.prev_token();
1387 let negated = self.parse_keyword(NOT);
1388 if self.parse_keyword(IN) {
1389 self.parse_in(expr, negated)
1390 } else if self.parse_keyword(BETWEEN) {
1391 self.parse_between(expr, negated)
1392 } else if self.parse_keyword(LIKE) {
1393 self.parse_like(expr, false, negated)
1394 } else if self.parse_keyword(ILIKE) {
1395 self.parse_like(expr, true, negated)
1396 } else {
1397 self.expected(
1398 self.peek_pos(),
1399 "IN, BETWEEN, LIKE, or ILIKE after NOT",
1400 self.peek_token(),
1401 )
1402 }
1403 }
1404 AND => Ok(Expr::And {
1405 left: Box::new(expr),
1406 right: Box::new(self.parse_subexpr(precedence)?),
1407 }),
1408 OR => Ok(Expr::Or {
1409 left: Box::new(expr),
1410 right: Box::new(self.parse_subexpr(precedence)?),
1411 }),
1412 AT => {
1413 self.expect_keywords(&[TIME, ZONE])?;
1414 Ok(Expr::Function(Function {
1415 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
1416 "timezone"
1417 ))),
1418 args: FunctionArgs::args(vec![self.parse_subexpr(precedence)?, expr]),
1419 filter: None,
1420 over: None,
1421 distinct: false,
1422 }))
1423 }
1424 COLLATE => Ok(Expr::Collate {
1425 expr: Box::new(expr),
1426 collation: self.parse_item_name()?,
1427 }),
1428 _ => panic!("No infix parser for token {:?}", tok),
1430 }
1431 } else if Token::DoubleColon == tok {
1432 self.parse_pg_cast(expr)
1433 } else if Token::LBracket == tok {
1434 self.prev_token();
1435 self.parse_subscript(expr)
1436 } else if Token::Dot == tok {
1437 match self.next_token() {
1438 Some(Token::Ident(id)) => Ok(Expr::FieldAccess {
1439 expr: Box::new(expr),
1440 field: self.new_identifier(id)?,
1441 }),
1442 Some(Token::Keyword(kw)) => Ok(Expr::FieldAccess {
1445 expr: Box::new(expr),
1446 field: kw.into(),
1447 }),
1448 Some(Token::Star) => Ok(Expr::WildcardAccess(Box::new(expr))),
1449 unexpected => self.expected(
1450 self.peek_prev_pos(),
1451 "an identifier or a '*' after '.'",
1452 unexpected,
1453 ),
1454 }
1455 } else {
1456 panic!("No infix parser for token {:?}", tok)
1458 }
1459 }
1460
1461 fn parse_subscript(&mut self, expr: Expr<Raw>) -> Result<Expr<Raw>, ParserError> {
1463 let mut positions = Vec::new();
1464
1465 while self.consume_token(&Token::LBracket) {
1466 let start = if self.peek_token() == Some(Token::Colon) {
1467 None
1468 } else {
1469 Some(self.parse_expr()?)
1470 };
1471
1472 let (end, explicit_slice) = if self.consume_token(&Token::Colon) {
1473 (
1475 if self.peek_token() == Some(Token::RBracket) {
1477 None
1478 } else {
1479 Some(self.parse_expr()?)
1480 },
1481 true,
1482 )
1483 } else {
1484 (None, false)
1485 };
1486
1487 assert!(
1488 start.is_some() || explicit_slice,
1489 "user typed something between brackets"
1490 );
1491
1492 assert!(
1493 explicit_slice || end.is_none(),
1494 "if end is some, must have an explicit slice"
1495 );
1496
1497 positions.push(SubscriptPosition {
1498 start,
1499 end,
1500 explicit_slice,
1501 });
1502 self.expect_token(&Token::RBracket)?;
1503 }
1504
1505 if matches!(expr, Expr::Cast { .. }) {
1510 Ok(Expr::Subscript {
1511 expr: Box::new(Expr::Nested(Box::new(expr))),
1512 positions,
1513 })
1514 } else {
1515 Ok(Expr::Subscript {
1516 expr: Box::new(expr),
1517 positions,
1518 })
1519 }
1520 }
1521
1522 fn parse_substring_expr(&mut self) -> Result<Expr<Raw>, ParserError> {
1529 self.expect_token(&Token::LParen)?;
1530 let mut exprs = vec![self.parse_expr()?];
1531 if self.parse_keyword(FROM) {
1532 exprs.push(self.parse_expr()?);
1534 if self.parse_keyword(FOR) {
1535 exprs.push(self.parse_expr()?);
1537 }
1538 } else if self.parse_keyword(FOR) {
1539 exprs.push(Expr::Value(Value::Number(String::from("1"))));
1541 exprs.push(self.parse_expr()?);
1542 } else {
1543 self.expect_token(&Token::Comma)?;
1547 exprs.extend(self.parse_comma_separated(Parser::parse_expr)?);
1548 }
1549
1550 self.expect_token(&Token::RParen)?;
1551 Ok(Expr::Function(Function {
1552 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("substring"))),
1553 args: FunctionArgs::args(exprs),
1554 filter: None,
1555 over: None,
1556 distinct: false,
1557 }))
1558 }
1559
1560 fn parse_operator(&mut self) -> Result<Op, ParserError> {
1567 let mut namespace = vec![];
1568 let op = loop {
1569 match self.next_token() {
1570 Some(Token::Keyword(kw)) => namespace.push(kw.into()),
1571 Some(Token::Ident(id)) => namespace.push(self.new_identifier(id)?),
1572 Some(Token::Op(op)) => break op,
1573 Some(Token::Star) => break "*".to_string(),
1576 Some(Token::Eq) => break "=".to_string(),
1577 tok => self.expected(self.peek_prev_pos(), "operator", tok)?,
1578 }
1579 self.expect_token(&Token::Dot)?;
1580 };
1581 Ok(Op {
1582 namespace: Some(namespace),
1583 op,
1584 })
1585 }
1586
1587 fn parse_any_all(
1590 &mut self,
1591 left: Expr<Raw>,
1592 op: Op,
1593 kw: Keyword,
1594 ) -> Result<Expr<Raw>, ParserError> {
1595 self.expect_token(&Token::LParen)?;
1596
1597 let expr = match self.parse_parenthesized_fragment()? {
1598 ParenthesizedFragment::Exprs(exprs) => {
1599 if exprs.len() > 1 {
1600 return parser_err!(
1601 self,
1602 self.peek_pos(),
1603 "{kw} requires a single expression or subquery, not an expression list",
1604 );
1605 }
1606 let right = exprs.into_element();
1607 if kw == ALL {
1608 Expr::AllExpr {
1609 left: Box::new(left),
1610 op,
1611 right: Box::new(right),
1612 }
1613 } else {
1614 Expr::AnyExpr {
1615 left: Box::new(left),
1616 op,
1617 right: Box::new(right),
1618 }
1619 }
1620 }
1621 ParenthesizedFragment::Query(subquery) => {
1622 if kw == ALL {
1623 Expr::AllSubquery {
1624 left: Box::new(left),
1625 op,
1626 right: Box::new(subquery),
1627 }
1628 } else {
1629 Expr::AnySubquery {
1630 left: Box::new(left),
1631 op,
1632 right: Box::new(subquery),
1633 }
1634 }
1635 }
1636 };
1637
1638 self.expect_token(&Token::RParen)?;
1639
1640 Ok(expr)
1641 }
1642
1643 fn parse_in(&mut self, expr: Expr<Raw>, negated: bool) -> Result<Expr<Raw>, ParserError> {
1645 self.expect_token(&Token::LParen)?;
1646 let in_op = match self.parse_parenthesized_fragment()? {
1647 ParenthesizedFragment::Exprs(list) => Expr::InList {
1648 expr: Box::new(expr),
1649 list,
1650 negated,
1651 },
1652 ParenthesizedFragment::Query(subquery) => Expr::InSubquery {
1653 expr: Box::new(expr),
1654 subquery: Box::new(subquery),
1655 negated,
1656 },
1657 };
1658 self.expect_token(&Token::RParen)?;
1659 Ok(in_op)
1660 }
1661
1662 fn parse_between(&mut self, expr: Expr<Raw>, negated: bool) -> Result<Expr<Raw>, ParserError> {
1664 let low = self.parse_subexpr(Precedence::Like)?;
1667 self.expect_keyword(AND)?;
1668 let high = self.parse_subexpr(Precedence::Like)?;
1669 Ok(Expr::Between {
1670 expr: Box::new(expr),
1671 negated,
1672 low: Box::new(low),
1673 high: Box::new(high),
1674 })
1675 }
1676
1677 fn parse_like(
1679 &mut self,
1680 expr: Expr<Raw>,
1681 case_insensitive: bool,
1682 negated: bool,
1683 ) -> Result<Expr<Raw>, ParserError> {
1684 if let Some(kw) = self.parse_one_of_keywords(ANY_ALL_KEYWORDS) {
1685 let op = match (case_insensitive, negated) {
1686 (false, false) => "~~",
1687 (false, true) => "!~~",
1688 (true, false) => "~~*",
1689 (true, true) => "!~~*",
1690 };
1691 return self.parse_any_all(expr, Op::bare(op), kw);
1692 }
1693 let pattern = self.parse_subexpr(Precedence::Like)?;
1694 let escape = if self.parse_keyword(ESCAPE) {
1695 Some(Box::new(self.parse_subexpr(Precedence::Like)?))
1696 } else {
1697 None
1698 };
1699 Ok(Expr::Like {
1700 expr: Box::new(expr),
1701 pattern: Box::new(pattern),
1702 escape,
1703 case_insensitive,
1704 negated,
1705 })
1706 }
1707
1708 fn parse_pg_cast(&mut self, expr: Expr<Raw>) -> Result<Expr<Raw>, ParserError> {
1710 Ok(Expr::Cast {
1711 expr: Box::new(expr),
1712 data_type: self.parse_data_type()?,
1713 })
1714 }
1715
1716 fn get_next_precedence(&self) -> Precedence {
1718 if let Some(token) = self.peek_token() {
1719 match &token {
1720 Token::Keyword(OR) => Precedence::Or,
1721 Token::Keyword(AND) => Precedence::And,
1722 Token::Keyword(NOT) => match &self.peek_nth_token(1) {
1723 Some(Token::Keyword(IN)) => Precedence::Like,
1729 Some(Token::Keyword(BETWEEN)) => Precedence::Like,
1730 Some(Token::Keyword(ILIKE)) => Precedence::Like,
1731 Some(Token::Keyword(LIKE)) => Precedence::Like,
1732 _ => Precedence::Zero,
1733 },
1734 Token::Keyword(IS) | Token::Keyword(ISNULL) => Precedence::Is,
1735 Token::Keyword(IN) => Precedence::Like,
1736 Token::Keyword(BETWEEN) => Precedence::Like,
1737 Token::Keyword(ILIKE) => Precedence::Like,
1738 Token::Keyword(LIKE) => Precedence::Like,
1739 Token::Keyword(OPERATOR) => Precedence::Other,
1740 Token::Op(s) => match s.as_str() {
1741 "<" | "<=" | "<>" | "!=" | ">" | ">=" => Precedence::Cmp,
1742 "+" | "-" => Precedence::PlusMinus,
1743 "/" | "%" => Precedence::MultiplyDivide,
1744 _ => Precedence::Other,
1745 },
1746 Token::Eq => Precedence::Cmp,
1747 Token::Star => Precedence::MultiplyDivide,
1748 Token::Keyword(COLLATE) | Token::Keyword(AT) => Precedence::PostfixCollateAt,
1749 Token::DoubleColon | Token::LBracket | Token::Dot => {
1750 Precedence::PostfixSubscriptCast
1751 }
1752 _ => Precedence::Zero,
1753 }
1754 } else {
1755 Precedence::Zero
1756 }
1757 }
1758
1759 fn peek_token(&self) -> Option<Token> {
1762 self.peek_nth_token(0)
1763 }
1764
1765 fn peek_keyword(&self, kw: Keyword) -> bool {
1766 match self.peek_token() {
1767 Some(Token::Keyword(k)) => k == kw,
1768 _ => false,
1769 }
1770 }
1771
1772 fn peek_keywords(&self, keywords: &[Keyword]) -> bool {
1773 self.peek_keywords_from(0, keywords)
1774 }
1775
1776 fn peek_keywords_from(&self, start: usize, keywords: &[Keyword]) -> bool {
1777 for (i, keyword) in keywords.iter().enumerate() {
1778 match self.peek_nth_token(start + i) {
1779 Some(Token::Keyword(k)) => {
1780 if k != *keyword {
1781 return false;
1782 }
1783 }
1784 _ => return false,
1785 }
1786 }
1787 true
1788 }
1789
1790 fn peek_one_of_keywords(&self, kws: &[Keyword]) -> bool {
1791 match self.peek_token() {
1792 Some(Token::Keyword(k)) => kws.contains(&k),
1793 _ => false,
1794 }
1795 }
1796
1797 fn peek_keywords_lookahead(&self, keywords: &[Keyword]) -> bool {
1800 let mut index = 0;
1801 while index < self.tokens.len() {
1802 if self.peek_keywords_from(index, keywords) {
1803 return true;
1804 }
1805 index += 1;
1806 }
1807 false
1808 }
1809
1810 fn peek_nth_token(&self, n: usize) -> Option<Token> {
1812 self.tokens
1813 .get(self.index + n)
1814 .map(|token| token.kind.clone())
1815 }
1816
1817 fn next_token(&mut self) -> Option<Token> {
1821 let token = self.tokens.get(self.index).map(|token| token.kind.clone());
1822 self.index += 1;
1823 token
1824 }
1825
1826 fn prev_token(&mut self) {
1830 assert!(self.index > 0);
1831 self.index -= 1;
1832 }
1833
1834 fn peek_pos(&self) -> usize {
1837 match self.tokens.get(self.index) {
1838 Some(token) => token.offset,
1839 None => self.sql.len(),
1840 }
1841 }
1842
1843 fn peek_prev_pos(&self) -> usize {
1849 assert!(self.index > 0);
1850 match self.tokens.get(self.index - 1) {
1851 Some(token) => token.offset,
1852 None => self.sql.len(),
1853 }
1854 }
1855
1856 fn expected<D, T>(
1858 &self,
1859 pos: usize,
1860 expected: D,
1861 found: Option<Token>,
1862 ) -> Result<T, ParserError>
1863 where
1864 D: fmt::Display,
1865 {
1866 parser_err!(
1867 self,
1868 pos,
1869 "Expected {}, found {}",
1870 expected,
1871 found.display_or("EOF"),
1872 )
1873 }
1874
1875 #[must_use]
1877 fn parse_keyword(&mut self, kw: Keyword) -> bool {
1878 if self.peek_keyword(kw) {
1879 self.next_token();
1880 true
1881 } else {
1882 false
1883 }
1884 }
1885
1886 #[must_use]
1888 fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
1889 if self.peek_keywords(keywords) {
1890 self.index += keywords.len();
1891 true
1892 } else {
1893 false
1894 }
1895 }
1896
1897 fn parse_at_most_one_keyword(
1898 &mut self,
1899 keywords: &[Keyword],
1900 location: &str,
1901 ) -> Result<Option<Keyword>, ParserError> {
1902 match self.parse_one_of_keywords(keywords) {
1903 Some(first) => {
1904 let remaining_keywords = keywords
1905 .iter()
1906 .cloned()
1907 .filter(|k| *k != first)
1908 .collect::<Vec<_>>();
1909 if let Some(second) = self.parse_one_of_keywords(remaining_keywords.as_slice()) {
1910 let second_pos = self.peek_prev_pos();
1911 parser_err!(
1912 self,
1913 second_pos,
1914 "Cannot specify both {} and {} in {}",
1915 first,
1916 second,
1917 location,
1918 )
1919 } else {
1920 Ok(Some(first))
1921 }
1922 }
1923 None => Ok(None),
1924 }
1925 }
1926
1927 #[must_use]
1929 fn parse_one_of_keywords(&mut self, kws: &[Keyword]) -> Option<Keyword> {
1930 match self.peek_token() {
1931 Some(Token::Keyword(k)) if kws.contains(&k) => {
1932 self.next_token();
1933 Some(k)
1934 }
1935 _ => None,
1936 }
1937 }
1938
1939 fn expect_one_of_keywords(&mut self, keywords: &[Keyword]) -> Result<Keyword, ParserError> {
1941 if let Some(keyword) = self.parse_one_of_keywords(keywords) {
1942 Ok(keyword)
1943 } else {
1944 self.expected(
1945 self.peek_pos(),
1946 format!("one of {}", keywords.iter().join(" or ")),
1947 self.peek_token(),
1948 )
1949 }
1950 }
1951
1952 fn expect_keyword(&mut self, expected: Keyword) -> Result<(), ParserError> {
1954 if self.parse_keyword(expected) {
1955 Ok(())
1956 } else {
1957 self.expected(self.peek_pos(), expected, self.peek_token())
1958 }
1959 }
1960
1961 fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
1964 for kw in expected {
1965 self.expect_keyword(*kw)?;
1966 }
1967 Ok(())
1968 }
1969
1970 #[must_use]
1972 fn consume_token(&mut self, expected: &Token) -> bool {
1973 match &self.peek_token() {
1974 Some(t) if *t == *expected => {
1975 self.next_token();
1976 true
1977 }
1978 _ => false,
1979 }
1980 }
1981
1982 fn expect_token(&mut self, expected: &Token) -> Result<(), ParserError> {
1984 if self.consume_token(expected) {
1985 Ok(())
1986 } else {
1987 self.expected(self.peek_pos(), expected, self.peek_token())
1988 }
1989 }
1990
1991 fn expect_one_of_tokens(&mut self, tokens: &[Token]) -> Result<Token, ParserError> {
1993 match self.peek_token() {
1994 Some(t) if tokens.iter().find(|token| t == **token).is_some() => {
1995 let _ = self.next_token();
1996 Ok(t)
1997 }
1998 _ => self.expected(
1999 self.peek_pos(),
2000 format!("one of {}", tokens.iter().join(" or ")),
2001 self.peek_token(),
2002 ),
2003 }
2004 }
2005
2006 fn expect_keyword_or_token(
2008 &mut self,
2009 expected_keyword: Keyword,
2010 expected_token: &Token,
2011 ) -> Result<(), ParserError> {
2012 if self.parse_keyword(expected_keyword) || self.consume_token(expected_token) {
2013 Ok(())
2014 } else {
2015 self.expected(
2016 self.peek_pos(),
2017 format!("{expected_keyword} or {expected_token}"),
2018 self.peek_token(),
2019 )
2020 }
2021 }
2022
2023 fn parse_list_value<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
2025 where
2026 F: FnMut(&mut Self) -> Result<T, ParserError>,
2027 {
2028 let _ = self.consume_token(&Token::Eq);
2029 let delimiter = self.expect_one_of_tokens(&[Token::LParen, Token::LBracket])?;
2030 let values = self.parse_comma_separated(f)?;
2031 self.expect_token(&match delimiter {
2032 Token::LParen => Token::RParen,
2033 Token::LBracket => Token::RBracket,
2034 _ => unreachable!(),
2035 })?;
2036 Ok(values)
2037 }
2038
2039 fn parse_comma_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
2041 where
2042 F: FnMut(&mut Self) -> Result<T, ParserError>,
2043 {
2044 let mut values = vec![];
2045 loop {
2046 values.push(f(self)?);
2047 if !self.consume_token(&Token::Comma) {
2048 break;
2049 }
2050 }
2051 Ok(values)
2052 }
2053
2054 #[must_use]
2055 fn maybe_parse<T, F>(&mut self, mut f: F) -> Option<T>
2056 where
2057 F: FnMut(&mut Self) -> Result<T, ParserError>,
2058 {
2059 if self.speculative_failures >= SPECULATIVE_FAILURES_PER_TOKEN * self.tokens.len() {
2060 return None;
2061 }
2062 let index = self.index;
2063 if let Ok(t) = f(self) {
2064 Some(t)
2065 } else {
2066 self.index = index;
2067 self.speculative_failures += 1;
2068 None
2069 }
2070 }
2071
2072 fn parse_create(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
2074 if self.peek_keyword(DATABASE) {
2075 self.parse_create_database()
2076 .map_parser_err(StatementKind::CreateDatabase)
2077 } else if self.peek_keyword(SCHEMA) {
2078 self.parse_create_schema()
2079 .map_parser_err(StatementKind::CreateSchema)
2080 } else if self.peek_keywords(&[METRIC, SINK]) {
2081 self.parse_create_metric_sink()
2082 .map_parser_err(StatementKind::CreateMetricSink)
2083 } else if self.peek_keyword(SINK) {
2084 self.parse_create_sink()
2085 .map_parser_err(StatementKind::CreateSink)
2086 } else if self.peek_keyword(TYPE) {
2087 self.parse_create_type()
2088 .map_parser_err(StatementKind::CreateType)
2089 } else if self.peek_keyword(ROLE) {
2090 self.parse_create_role()
2091 .map_parser_err(StatementKind::CreateRole)
2092 } else if self.peek_keyword(CLUSTER) {
2093 self.next_token();
2094 if self.peek_keyword(REPLICA) {
2095 self.parse_create_cluster_replica()
2096 .map_parser_err(StatementKind::CreateClusterReplica)
2097 } else {
2098 self.parse_create_cluster()
2099 .map_parser_err(StatementKind::CreateCluster)
2100 }
2101 } else if self.peek_keyword(INDEX) || self.peek_keywords(&[DEFAULT, INDEX]) {
2102 self.parse_create_index()
2103 .map_parser_err(StatementKind::CreateIndex)
2104 } else if self.peek_keyword(SOURCE) {
2105 self.parse_create_source()
2106 .map_parser_err(StatementKind::CreateSource)
2107 } else if self.peek_keyword(SUBSOURCE) {
2108 self.parse_create_subsource()
2109 .map_parser_err(StatementKind::CreateSubsource)
2110 } else if self.peek_keyword(TABLE)
2111 || self.peek_keywords(&[TEMP, TABLE])
2112 || self.peek_keywords(&[TEMPORARY, TABLE])
2113 {
2114 if self.peek_keywords_lookahead(&[FROM, SOURCE])
2115 || self.peek_keywords_lookahead(&[FROM, WEBHOOK])
2116 {
2117 self.parse_create_table_from_source()
2118 .map_parser_err(StatementKind::CreateTableFromSource)
2119 } else {
2120 self.parse_create_table()
2121 .map_parser_err(StatementKind::CreateTable)
2122 }
2123 } else if self.peek_keyword(SECRET) {
2124 self.parse_create_secret()
2125 .map_parser_err(StatementKind::CreateSecret)
2126 } else if self.peek_keyword(CONNECTION) {
2127 self.parse_create_connection()
2128 .map_parser_err(StatementKind::CreateConnection)
2129 } else if self.peek_keywords(&[MATERIALIZED, VIEW])
2130 || self.peek_keywords(&[OR, REPLACE, MATERIALIZED, VIEW])
2131 || self.peek_keywords(&[REPLACEMENT, MATERIALIZED, VIEW])
2132 || self.peek_keywords(&[OR, REPLACE, REPLACEMENT, MATERIALIZED, VIEW])
2133 {
2134 self.parse_create_materialized_view()
2135 .map_parser_err(StatementKind::CreateMaterializedView)
2136 } else if self.peek_keywords(&[USER]) {
2137 parser_err!(
2138 self,
2139 self.peek_pos(),
2140 "CREATE USER is not supported, for more information consult the documentation at https://materialize.com/docs/sql/create-role/#details"
2141 ).map_parser_err(StatementKind::CreateRole)
2142 } else if self.peek_keywords(&[NETWORK, POLICY]) {
2143 self.parse_create_network_policy()
2144 .map_parser_err(StatementKind::CreateNetworkPolicy)
2145 } else {
2146 let index = self.index;
2147
2148 let parsed_or_replace = self.parse_keywords(&[OR, REPLACE]);
2150 let parsed_temporary = self.parse_one_of_keywords(&[TEMP, TEMPORARY]).is_some();
2151
2152 if self.parse_keyword(VIEW) {
2153 self.index = index;
2154 self.parse_create_view()
2155 .map_parser_err(StatementKind::CreateView)
2156 } else {
2157 let expected_msg = match (parsed_or_replace, parsed_temporary) {
2158 (true, true) => "VIEW after CREATE OR REPLACE TEMPORARY",
2159 (true, false) => {
2160 "[TEMPORARY] VIEW, or MATERIALIZED VIEW after CREATE OR REPLACE"
2161 }
2162 (false, true) => "TABLE, or VIEW after CREATE TEMPORARY",
2163 (false, false) => {
2164 "DATABASE, SCHEMA, ROLE, TYPE, INDEX, SINK, SOURCE, [TEMPORARY] TABLE, \
2165 SECRET, [OR REPLACE] [TEMPORARY] VIEW, or [OR REPLACE] MATERIALIZED VIEW \
2166 after CREATE"
2167 }
2168 };
2169 self.expected(self.peek_pos(), expected_msg, self.peek_token())
2170 .map_no_statement_parser_err()
2171 }
2172 }
2173 }
2174
2175 fn parse_create_database(&mut self) -> Result<Statement<Raw>, ParserError> {
2176 self.expect_keyword(DATABASE)?;
2177 let if_not_exists = self.parse_if_not_exists()?;
2178 let name = self.parse_database_name()?;
2179 Ok(Statement::CreateDatabase(CreateDatabaseStatement {
2180 name,
2181 if_not_exists,
2182 }))
2183 }
2184
2185 fn parse_create_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
2186 self.expect_keyword(SCHEMA)?;
2187 let if_not_exists = self.parse_if_not_exists()?;
2188 let name = self.parse_schema_name()?;
2189 Ok(Statement::CreateSchema(CreateSchemaStatement {
2190 name,
2191 if_not_exists,
2192 }))
2193 }
2194
2195 fn parse_format(&mut self) -> Result<Format<Raw>, ParserError> {
2196 let format = if self.parse_keyword(AVRO) {
2197 self.expect_keyword(USING)?;
2198 Format::Avro(self.parse_avro_schema()?)
2199 } else if self.parse_keyword(PROTOBUF) {
2200 Format::Protobuf(self.parse_protobuf_schema()?)
2201 } else if self.parse_keyword(REGEX) {
2202 let regex = self.parse_literal_string()?;
2203 Format::Regex(regex)
2204 } else if self.parse_keyword(CSV) {
2205 self.expect_keyword(WITH)?;
2206 let columns = if self.parse_keyword(HEADER) || self.parse_keyword(HEADERS) {
2207 CsvColumns::Header {
2208 names: self.parse_parenthesized_column_list(Mandatory)?,
2209 }
2210 } else {
2211 let n_cols = self.parse_literal_uint()?;
2212 self.expect_keyword(COLUMNS)?;
2213 CsvColumns::Count(n_cols)
2214 };
2215 let delimiter = if self.parse_keywords(&[DELIMITED, BY]) {
2216 let s = self.parse_literal_string()?;
2217 match s.len() {
2218 1 => Ok(s.chars().next().unwrap()),
2219 _ => self.expected(self.peek_pos(), "one-character string", self.peek_token()),
2220 }?
2221 } else {
2222 ','
2223 };
2224 Format::Csv { columns, delimiter }
2225 } else if self.parse_keyword(JSON) {
2226 let array = self.parse_keyword(ARRAY);
2227 Format::Json { array }
2228 } else if self.parse_keyword(TEXT) {
2229 Format::Text
2230 } else if self.parse_keyword(BYTES) {
2231 Format::Bytes
2232 } else {
2233 return self.expected(
2234 self.peek_pos(),
2235 "AVRO, PROTOBUF, REGEX, CSV, JSON, TEXT, or BYTES",
2236 self.peek_token(),
2237 );
2238 };
2239 Ok(format)
2240 }
2241
2242 fn parse_avro_schema(&mut self) -> Result<AvroSchema<Raw>, ParserError> {
2243 let avro_schema = if self.parse_keywords(&[CONFLUENT, SCHEMA, REGISTRY]) {
2244 let csr_connection = self.parse_csr_connection_avro()?;
2245 AvroSchema::Csr { csr_connection }
2246 } else if self.parse_keywords(&[AWS, GLUE, SCHEMA, REGISTRY]) {
2247 self.expect_keyword(CONNECTION)?;
2248 let connection = self.parse_raw_name()?;
2249 let with_options = if self.consume_token(&Token::LParen) {
2250 let opts = self.parse_comma_separated(Parser::parse_glue_avro_option)?;
2251 self.expect_token(&Token::RParen)?;
2252 opts
2253 } else {
2254 vec![]
2255 };
2256 let seed = if self.parse_keyword(SEED) {
2261 self.expect_keywords(&[VALUE, SCHEMA])?;
2262 let value_schema = self.parse_literal_string()?;
2263 Some(GlueAvroSeed { value_schema })
2264 } else {
2265 None
2266 };
2267 AvroSchema::Glue {
2268 connection,
2269 with_options,
2270 seed,
2271 }
2272 } else if self.parse_keyword(SCHEMA) {
2273 self.prev_token();
2274 self.expect_keyword(SCHEMA)?;
2275 let schema = Schema {
2276 schema: self.parse_literal_string()?,
2277 };
2278 let with_options = if self.consume_token(&Token::LParen) {
2279 let with_options = self.parse_comma_separated(Parser::parse_avro_schema_option)?;
2280 self.expect_token(&Token::RParen)?;
2281 with_options
2282 } else {
2283 vec![]
2284 };
2285 AvroSchema::InlineSchema {
2286 schema,
2287 with_options,
2288 }
2289 } else {
2290 return self.expected(
2291 self.peek_pos(),
2292 "CONFLUENT SCHEMA REGISTRY, AWS GLUE SCHEMA REGISTRY, or SCHEMA",
2293 self.peek_token(),
2294 );
2295 };
2296 Ok(avro_schema)
2297 }
2298
2299 fn parse_avro_schema_option(&mut self) -> Result<AvroSchemaOption<Raw>, ParserError> {
2300 self.expect_keywords(&[CONFLUENT, WIRE, FORMAT])?;
2301 Ok(AvroSchemaOption {
2302 name: AvroSchemaOptionName::ConfluentWireFormat,
2303 value: self.parse_optional_option_value()?,
2304 })
2305 }
2306
2307 fn parse_glue_avro_option(&mut self) -> Result<GlueAvroOption<Raw>, ParserError> {
2308 let name = match self.expect_one_of_keywords(&[SCHEMA, KEY, VALUE])? {
2314 SCHEMA => {
2315 self.expect_keyword(NAME)?;
2316 GlueAvroOptionName::SchemaName
2317 }
2318 KEY => match self.expect_one_of_keywords(&[SCHEMA, COMPATIBILITY])? {
2319 SCHEMA => {
2320 self.expect_keyword(NAME)?;
2321 GlueAvroOptionName::KeySchemaName
2322 }
2323 COMPATIBILITY => {
2324 self.expect_keyword(LEVEL)?;
2325 GlueAvroOptionName::KeyCompatibilityLevel
2326 }
2327 _ => unreachable!(),
2328 },
2329 VALUE => match self.expect_one_of_keywords(&[SCHEMA, COMPATIBILITY])? {
2330 SCHEMA => {
2331 self.expect_keyword(NAME)?;
2332 GlueAvroOptionName::ValueSchemaName
2333 }
2334 COMPATIBILITY => {
2335 self.expect_keyword(LEVEL)?;
2336 GlueAvroOptionName::ValueCompatibilityLevel
2337 }
2338 _ => unreachable!(),
2339 },
2340 _ => unreachable!(),
2341 };
2342 Ok(GlueAvroOption {
2343 name,
2344 value: self.parse_optional_option_value()?,
2345 })
2346 }
2347
2348 fn parse_protobuf_schema(&mut self) -> Result<ProtobufSchema<Raw>, ParserError> {
2349 if self.parse_keywords(&[USING, CONFLUENT, SCHEMA, REGISTRY]) {
2350 let csr_connection = self.parse_csr_connection_proto()?;
2351 Ok(ProtobufSchema::Csr { csr_connection })
2352 } else if self.parse_keyword(MESSAGE) {
2353 let message_name = self.parse_literal_string()?;
2354 self.expect_keyword(USING)?;
2355 self.expect_keyword(SCHEMA)?;
2356 let schema = Schema {
2357 schema: self.parse_literal_string()?,
2358 };
2359 Ok(ProtobufSchema::InlineSchema {
2360 message_name,
2361 schema,
2362 })
2363 } else {
2364 self.expected(
2365 self.peek_pos(),
2366 "CONFLUENT SCHEMA REGISTRY or MESSAGE",
2367 self.peek_token(),
2368 )
2369 }
2370 }
2371
2372 fn parse_csr_connection_reference(&mut self) -> Result<CsrConnection<Raw>, ParserError> {
2373 self.expect_keyword(CONNECTION)?;
2374 let connection = self.parse_raw_name()?;
2375
2376 let options = if self.consume_token(&Token::LParen) {
2377 let options = self.parse_comma_separated(Parser::parse_csr_config_option)?;
2378 self.expect_token(&Token::RParen)?;
2379 options
2380 } else {
2381 vec![]
2382 };
2383
2384 Ok(CsrConnection {
2385 connection,
2386 options,
2387 })
2388 }
2389
2390 fn parse_csr_config_option(&mut self) -> Result<CsrConfigOption<Raw>, ParserError> {
2391 let name = match self.expect_one_of_keywords(&[AVRO, NULL, KEY, VALUE, DOC])? {
2392 AVRO => {
2393 let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
2394 KEY => CsrConfigOptionName::AvroKeyFullname,
2395 VALUE => CsrConfigOptionName::AvroValueFullname,
2396 _ => unreachable!(),
2397 };
2398 self.expect_keyword(FULLNAME)?;
2399 name
2400 }
2401 NULL => {
2402 self.expect_keyword(DEFAULTS)?;
2403 CsrConfigOptionName::NullDefaults
2404 }
2405 KEY => match self.expect_one_of_keywords(&[DOC, COMPATIBILITY])? {
2406 DOC => {
2407 self.expect_keyword(ON)?;
2408 let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2409 CsrConfigOptionName::AvroDocOn(AvroDocOn {
2410 identifier: doc_on_identifier,
2411 for_schema: DocOnSchema::KeyOnly,
2412 })
2413 }
2414 COMPATIBILITY => {
2415 self.expect_keyword(LEVEL)?;
2416 CsrConfigOptionName::KeyCompatibilityLevel
2417 }
2418 _ => unreachable!(),
2419 },
2420 VALUE => match self.expect_one_of_keywords(&[DOC, COMPATIBILITY])? {
2421 DOC => {
2422 self.expect_keyword(ON)?;
2423 let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2424 CsrConfigOptionName::AvroDocOn(AvroDocOn {
2425 identifier: doc_on_identifier,
2426 for_schema: DocOnSchema::ValueOnly,
2427 })
2428 }
2429 COMPATIBILITY => {
2430 self.expect_keyword(LEVEL)?;
2431 CsrConfigOptionName::ValueCompatibilityLevel
2432 }
2433 _ => unreachable!(),
2434 },
2435 DOC => {
2436 self.expect_keyword(ON)?;
2437 let doc_on_identifier = self.parse_avro_doc_on_option_name()?;
2438 CsrConfigOptionName::AvroDocOn(AvroDocOn {
2439 identifier: doc_on_identifier,
2440 for_schema: DocOnSchema::All,
2441 })
2442 }
2443 _ => unreachable!(),
2444 };
2445 Ok(CsrConfigOption {
2446 name,
2447 value: self.parse_optional_option_value()?,
2448 })
2449 }
2450
2451 fn parse_avro_doc_on_option_name(&mut self) -> Result<DocOnIdentifier<Raw>, ParserError> {
2452 match self.expect_one_of_keywords(&[TYPE, COLUMN])? {
2453 TYPE => Ok(DocOnIdentifier::Type(self.parse_raw_name()?)),
2454 COLUMN => Ok(DocOnIdentifier::Column(self.parse_column_name()?)),
2455 _ => unreachable!(),
2456 }
2457 }
2458
2459 fn parse_csr_connection_avro(&mut self) -> Result<CsrConnectionAvro<Raw>, ParserError> {
2460 let connection = self.parse_csr_connection_reference()?;
2461 let seed = if self.parse_keyword(SEED) {
2462 let key_schema = if self.parse_keyword(KEY) {
2463 self.expect_keyword(SCHEMA)?;
2464 Some(self.parse_literal_string()?)
2465 } else {
2466 None
2467 };
2468
2469 let key_reference_schemas =
2471 if key_schema.is_some() && self.parse_keywords(&[KEY, REFERENCES]) {
2472 self.expect_token(&Token::LParen)?;
2473 let refs = self.parse_comma_separated(|p| p.parse_literal_string())?;
2474 self.expect_token(&Token::RParen)?;
2475 refs
2476 } else {
2477 vec![]
2478 };
2479
2480 self.expect_keywords(&[VALUE, SCHEMA])?;
2481 let value_schema = self.parse_literal_string()?;
2482
2483 let value_reference_schemas = if self.parse_keywords(&[VALUE, REFERENCES]) {
2485 self.expect_token(&Token::LParen)?;
2486 let refs = self.parse_comma_separated(|p| p.parse_literal_string())?;
2487 self.expect_token(&Token::RParen)?;
2488 refs
2489 } else {
2490 vec![]
2491 };
2492
2493 Some(CsrSeedAvro {
2494 key_schema,
2495 value_schema,
2496 key_reference_schemas,
2497 value_reference_schemas,
2498 })
2499 } else {
2500 None
2501 };
2502
2503 let mut parse_schema_strategy =
2504 |kws| -> Result<Option<ReaderSchemaSelectionStrategy>, ParserError> {
2505 if self.parse_keywords(kws) {
2506 Ok(Some(
2507 match self.expect_one_of_keywords(&[ID, LATEST, INLINE])? {
2508 ID => {
2509 let pos = self.index;
2510 ReaderSchemaSelectionStrategy::ById(
2511 self.parse_literal_int()?.try_into().map_err(|_| {
2512 ParserError::new(pos, "Expected a 32-bit integer")
2513 })?,
2514 )
2515 }
2516 LATEST => ReaderSchemaSelectionStrategy::Latest,
2517 INLINE => {
2518 ReaderSchemaSelectionStrategy::Inline(self.parse_literal_string()?)
2519 }
2520 _ => unreachable!(),
2521 },
2522 ))
2523 } else {
2524 Ok(None)
2525 }
2526 };
2527
2528 let key_strategy = parse_schema_strategy(&[KEY, STRATEGY])?;
2529 let value_strategy = parse_schema_strategy(&[VALUE, STRATEGY])?;
2530
2531 Ok(CsrConnectionAvro {
2532 connection,
2533 seed,
2534 key_strategy,
2535 value_strategy,
2536 })
2537 }
2538
2539 fn parse_csr_connection_proto(&mut self) -> Result<CsrConnectionProtobuf<Raw>, ParserError> {
2540 let connection = self.parse_csr_connection_reference()?;
2541
2542 let seed = if self.parse_keyword(SEED) {
2543 let key = if self.parse_keyword(KEY) {
2544 self.expect_keyword(SCHEMA)?;
2545 let schema = self.parse_literal_string()?;
2546 self.expect_keyword(MESSAGE)?;
2547 let message_name = self.parse_literal_string()?;
2548 Some(CsrSeedProtobufSchema {
2549 schema,
2550 message_name,
2551 })
2552 } else {
2553 None
2554 };
2555 self.expect_keywords(&[VALUE, SCHEMA])?;
2556 let value_schema = self.parse_literal_string()?;
2557 self.expect_keyword(MESSAGE)?;
2558 let value_message_name = self.parse_literal_string()?;
2559 Some(CsrSeedProtobuf {
2560 value: CsrSeedProtobufSchema {
2561 schema: value_schema,
2562 message_name: value_message_name,
2563 },
2564 key,
2565 })
2566 } else {
2567 None
2568 };
2569
2570 Ok(CsrConnectionProtobuf { connection, seed })
2571 }
2572
2573 fn parse_source_error_policy_option(&mut self) -> Result<SourceErrorPolicy, ParserError> {
2574 match self.expect_one_of_keywords(&[INLINE])? {
2575 INLINE => Ok(SourceErrorPolicy::Inline {
2576 alias: self.parse_alias()?,
2577 }),
2578 _ => unreachable!(),
2579 }
2580 }
2581
2582 fn parse_source_envelope(&mut self) -> Result<SourceEnvelope, ParserError> {
2583 let envelope = if self.parse_keyword(NONE) {
2584 SourceEnvelope::None
2585 } else if self.parse_keyword(DEBEZIUM) {
2586 SourceEnvelope::Debezium
2587 } else if self.parse_keyword(UPSERT) {
2588 let value_decode_err_policy = if self.consume_token(&Token::LParen) {
2589 self.expect_keywords(&[VALUE, DECODING, ERRORS])?;
2592 let _ = self.consume_token(&Token::Eq);
2593 let open_inner = self.consume_token(&Token::LParen);
2594 let value_decode_err_policy =
2595 self.parse_comma_separated(Parser::parse_source_error_policy_option)?;
2596 if open_inner {
2597 self.expect_token(&Token::RParen)?;
2598 }
2599 self.expect_token(&Token::RParen)?;
2600 value_decode_err_policy
2601 } else {
2602 vec![]
2603 };
2604
2605 SourceEnvelope::Upsert {
2606 value_decode_err_policy,
2607 }
2608 } else if self.parse_keyword(MATERIALIZE) {
2609 SourceEnvelope::CdcV2
2610 } else {
2611 return self.expected(
2612 self.peek_pos(),
2613 "NONE, UPSERT, or MATERIALIZE",
2614 self.peek_token(),
2615 );
2616 };
2617 Ok(envelope)
2618 }
2619
2620 fn parse_sink_envelope(&mut self) -> Result<SinkEnvelope, ParserError> {
2621 if self.parse_keyword(UPSERT) {
2622 Ok(SinkEnvelope::Upsert)
2623 } else if self.parse_keyword(DEBEZIUM) {
2624 Ok(SinkEnvelope::Debezium)
2625 } else {
2626 self.expected(self.peek_pos(), "UPSERT, DEBEZIUM", self.peek_token())
2627 }
2628 }
2629
2630 fn parse_iceberg_sink_mode(&mut self) -> Result<IcebergSinkMode, ParserError> {
2631 if self.parse_keyword(UPSERT) {
2632 Ok(IcebergSinkMode::Upsert)
2633 } else if self.parse_keyword(APPEND) {
2634 Ok(IcebergSinkMode::Append)
2635 } else {
2636 self.expected(self.peek_pos(), "UPSERT, APPEND", self.peek_token())
2637 }
2638 }
2639
2640 fn parse_validate(&mut self) -> Result<Statement<Raw>, ParserError> {
2642 self.expect_keyword(CONNECTION)?;
2643 let name = self.parse_raw_name()?;
2644 Ok(Statement::ValidateConnection(ValidateConnectionStatement {
2645 name,
2646 }))
2647 }
2648
2649 fn parse_create_connection(&mut self) -> Result<Statement<Raw>, ParserError> {
2650 self.expect_keyword(CONNECTION)?;
2651 let if_not_exists = self.parse_if_not_exists()?;
2652 let name = self.parse_item_name()?;
2653 let expect_paren = match self.expect_one_of_keywords(&[FOR, TO])? {
2654 FOR => false,
2655 TO => true,
2656 _ => unreachable!(),
2657 };
2658 let connection_type = match self.expect_one_of_keywords(&[
2659 AWS, GCP, KAFKA, CONFLUENT, POSTGRES, SSH, SQL, MYSQL, ICEBERG,
2660 ])? {
2661 AWS => {
2662 if self.parse_keyword(PRIVATELINK) {
2663 CreateConnectionType::AwsPrivatelink
2664 } else if self.parse_keyword(GLUE) {
2665 self.expect_keywords(&[SCHEMA, REGISTRY])?;
2666 CreateConnectionType::GlueSchemaRegistry
2667 } else {
2668 CreateConnectionType::Aws
2669 }
2670 }
2671 GCP => CreateConnectionType::Gcp,
2672 KAFKA => CreateConnectionType::Kafka,
2673 CONFLUENT => {
2674 self.expect_keywords(&[SCHEMA, REGISTRY])?;
2675 CreateConnectionType::Csr
2676 }
2677 POSTGRES => CreateConnectionType::Postgres,
2678 SSH => {
2679 self.expect_keyword(TUNNEL)?;
2680 CreateConnectionType::Ssh
2681 }
2682 SQL => {
2683 self.expect_keyword(SERVER)?;
2684 CreateConnectionType::SqlServer
2685 }
2686 MYSQL => CreateConnectionType::MySql,
2687 ICEBERG => {
2688 self.expect_keyword(CATALOG)?;
2689 CreateConnectionType::IcebergCatalog
2690 }
2691 _ => unreachable!(),
2692 };
2693 if expect_paren {
2694 self.expect_token(&Token::LParen)?;
2695 }
2696 let values = self.parse_comma_separated(Parser::parse_connection_option_unified)?;
2697 if expect_paren {
2698 self.expect_token(&Token::RParen)?;
2699 }
2700
2701 let with_options = if self.parse_keyword(WITH) {
2702 self.expect_token(&Token::LParen)?;
2703 let options = self.parse_comma_separated(Parser::parse_create_connection_option)?;
2704 self.expect_token(&Token::RParen)?;
2705 options
2706 } else {
2707 vec![]
2708 };
2709
2710 Ok(Statement::CreateConnection(CreateConnectionStatement {
2711 name,
2712 connection_type,
2713 values,
2714 if_not_exists,
2715 with_options,
2716 }))
2717 }
2718
2719 fn parse_create_connection_option_name(
2720 &mut self,
2721 ) -> Result<CreateConnectionOptionName, ParserError> {
2722 let name = match self.expect_one_of_keywords(&[VALIDATE])? {
2723 VALIDATE => CreateConnectionOptionName::Validate,
2724 _ => unreachable!(),
2725 };
2726 Ok(name)
2727 }
2728
2729 fn parse_create_connection_option(
2731 &mut self,
2732 ) -> Result<CreateConnectionOption<Raw>, ParserError> {
2733 let name = self.parse_create_connection_option_name()?;
2734 Ok(CreateConnectionOption {
2735 name,
2736 value: self.parse_optional_option_value()?,
2737 })
2738 }
2739
2740 fn parse_default_aws_privatelink(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2741 let _ = self.consume_token(&Token::Eq);
2742 Ok(WithOptionValue::ConnectionAwsPrivatelink(
2743 self.parse_default_aws_privatelink_()?,
2744 ))
2745 }
2746
2747 fn parse_default_aws_privatelink_(
2748 &mut self,
2749 ) -> Result<ConnectionDefaultAwsPrivatelink<Raw>, ParserError> {
2750 let connection = self.parse_raw_name()?;
2751 let port = if self.consume_token(&Token::LParen) {
2752 self.expect_keyword(PORT)?;
2753 let pos = self.peek_pos();
2754 let Ok(port) = u16::try_from(self.parse_literal_int()?) else {
2755 return parser_err!(self, pos, "Could not parse value into port");
2756 };
2757 self.expect_token(&Token::RParen)?;
2758 Some(port)
2759 } else {
2760 None
2761 };
2762 Ok(ConnectionDefaultAwsPrivatelink { connection, port })
2763 }
2764
2765 fn parse_aws_privatelink(&mut self) -> Result<KafkaBrokerAwsPrivatelink<Raw>, ParserError> {
2767 let connection = self.parse_raw_name()?;
2768 let options = if self.consume_token(&Token::LParen) {
2769 let options =
2770 self.parse_comma_separated(Parser::parse_kafka_broker_aws_privatelink_option)?;
2771 self.expect_token(&Token::RParen)?;
2772 options
2773 } else {
2774 vec![]
2775 };
2776 Ok(KafkaBrokerAwsPrivatelink {
2777 connection,
2778 options,
2779 })
2780 }
2781
2782 fn parse_connection_rule_pattern(&mut self) -> Result<ConnectionRulePattern, ParserError> {
2783 let s = self.parse_literal_string()?;
2784 let pos = self.peek_prev_pos();
2785 let mut prefix_wildcard = false;
2786 let mut suffix_wildcard = false;
2787 let mut remainder = &s[..];
2788
2789 if let Some(stripped) = remainder.strip_prefix('*') {
2790 prefix_wildcard = true;
2791 remainder = stripped;
2792 }
2793 if let Some(stripped) = remainder.strip_suffix('*') {
2794 suffix_wildcard = true;
2795 remainder = stripped;
2796 }
2797
2798 if remainder.contains('*') {
2799 return parser_err!(
2800 self,
2801 pos,
2802 "pattern may only contain `*` as a leading and/or trailing wildcard"
2803 );
2804 }
2805
2806 Ok(ConnectionRulePattern {
2807 prefix_wildcard,
2808 literal_match: remainder.to_owned(),
2809 suffix_wildcard,
2810 })
2811 }
2812
2813 fn parse_kafka_broker_or_matching_rule(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2814 if self.parse_keyword(MATCHING) {
2815 let pattern = self.parse_connection_rule_pattern()?;
2816 self.expect_keyword(USING)?;
2817 self.expect_keywords(&[AWS, PRIVATELINK])?;
2818 let tunnel = self.parse_aws_privatelink()?;
2819 Ok(WithOptionValue::KafkaMatchingBrokerRule(
2820 KafkaMatchingBrokerRule { pattern, tunnel },
2821 ))
2822 } else {
2823 self.parse_kafka_broker()
2824 }
2825 }
2826
2827 fn parse_kafka_broker(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
2828 let _ = self.consume_token(&Token::Eq);
2829 let address = self.parse_literal_string()?;
2830 let tunnel = if self.parse_keyword(USING) {
2831 match self.expect_one_of_keywords(&[AWS, SSH])? {
2832 AWS => {
2833 self.expect_keywords(&[PRIVATELINK])?;
2834 KafkaBrokerTunnel::AwsPrivatelink(self.parse_aws_privatelink()?)
2835 }
2836 SSH => {
2837 self.expect_keywords(&[TUNNEL])?;
2838 KafkaBrokerTunnel::SshTunnel(self.parse_raw_name()?)
2839 }
2840 _ => unreachable!(),
2841 }
2842 } else {
2843 KafkaBrokerTunnel::Direct
2844 };
2845
2846 Ok(WithOptionValue::ConnectionKafkaBroker(KafkaBroker {
2847 address,
2848 tunnel,
2849 }))
2850 }
2851
2852 fn parse_kafka_broker_aws_privatelink_option(
2853 &mut self,
2854 ) -> Result<KafkaBrokerAwsPrivatelinkOption<Raw>, ParserError> {
2855 let name = match self.expect_one_of_keywords(&[AVAILABILITY, PORT])? {
2856 AVAILABILITY => {
2857 self.expect_keywords(&[ZONE])?;
2858 KafkaBrokerAwsPrivatelinkOptionName::AvailabilityZone
2859 }
2860 PORT => KafkaBrokerAwsPrivatelinkOptionName::Port,
2861 _ => unreachable!(),
2862 };
2863 let value = self.parse_optional_option_value()?;
2864 Ok(KafkaBrokerAwsPrivatelinkOption { name, value })
2865 }
2866
2867 fn parse_kafka_source_config_option(
2868 &mut self,
2869 ) -> Result<KafkaSourceConfigOption<Raw>, ParserError> {
2870 let name = match self.expect_one_of_keywords(&[GROUP, START, TOPIC])? {
2871 GROUP => {
2872 self.expect_keywords(&[ID, PREFIX])?;
2873 KafkaSourceConfigOptionName::GroupIdPrefix
2874 }
2875 START => match self.expect_one_of_keywords(&[OFFSET, TIMESTAMP])? {
2876 OFFSET => KafkaSourceConfigOptionName::StartOffset,
2877 TIMESTAMP => KafkaSourceConfigOptionName::StartTimestamp,
2878 _ => unreachable!(),
2879 },
2880 TOPIC => {
2881 if self.parse_keyword(METADATA) {
2882 self.expect_keywords(&[REFRESH, INTERVAL])?;
2883 KafkaSourceConfigOptionName::TopicMetadataRefreshInterval
2884 } else {
2885 KafkaSourceConfigOptionName::Topic
2886 }
2887 }
2888 _ => unreachable!(),
2889 };
2890 Ok(KafkaSourceConfigOption {
2891 name,
2892 value: self.parse_optional_option_value()?,
2893 })
2894 }
2895
2896 fn parse_iceberg_sink_config_option(
2897 &mut self,
2898 ) -> Result<IcebergSinkConfigOption<Raw>, ParserError> {
2899 let name = match self.expect_one_of_keywords(&[NAMESPACE, TABLE])? {
2900 NAMESPACE => IcebergSinkConfigOptionName::Namespace,
2901 TABLE => IcebergSinkConfigOptionName::Table,
2902 _ => unreachable!(),
2903 };
2904 Ok(IcebergSinkConfigOption {
2905 name,
2906 value: self.parse_optional_option_value()?,
2907 })
2908 }
2909
2910 fn parse_kafka_sink_config_option(
2911 &mut self,
2912 ) -> Result<KafkaSinkConfigOption<Raw>, ParserError> {
2913 let name = match self.expect_one_of_keywords(&[
2914 COMPRESSION,
2915 PARTITION,
2916 PROGRESS,
2917 TOPIC,
2918 LEGACY,
2919 TRANSACTIONAL,
2920 ])? {
2921 COMPRESSION => {
2922 self.expect_keyword(TYPE)?;
2923 KafkaSinkConfigOptionName::CompressionType
2924 }
2925 PARTITION => {
2926 self.expect_keyword(BY)?;
2927 let _ = self.consume_token(&Token::Eq);
2928 return Ok(KafkaSinkConfigOption {
2929 name: KafkaSinkConfigOptionName::PartitionBy,
2930 value: Some(WithOptionValue::Expr(self.parse_expr()?)),
2931 });
2932 }
2933 PROGRESS => {
2934 self.expect_keywords(&[GROUP, ID, PREFIX])?;
2935 KafkaSinkConfigOptionName::ProgressGroupIdPrefix
2936 }
2937 TOPIC => {
2938 match self.parse_one_of_keywords(&[METADATA, PARTITION, REPLICATION, CONFIG]) {
2939 None => KafkaSinkConfigOptionName::Topic,
2940 Some(METADATA) => {
2941 self.expect_keywords(&[REFRESH, INTERVAL])?;
2942 KafkaSinkConfigOptionName::TopicMetadataRefreshInterval
2943 }
2944 Some(PARTITION) => {
2945 self.expect_keyword(COUNT)?;
2946 KafkaSinkConfigOptionName::TopicPartitionCount
2947 }
2948 Some(REPLICATION) => {
2949 self.expect_keyword(FACTOR)?;
2950 KafkaSinkConfigOptionName::TopicReplicationFactor
2951 }
2952 Some(CONFIG) => KafkaSinkConfigOptionName::TopicConfig,
2953 Some(other) => {
2954 return parser_err!(
2955 self,
2956 self.peek_prev_pos(),
2957 "unexpected keyword {}",
2958 other
2959 );
2960 }
2961 }
2962 }
2963 TRANSACTIONAL => {
2964 self.expect_keywords(&[ID, PREFIX])?;
2965 KafkaSinkConfigOptionName::TransactionalIdPrefix
2966 }
2967 LEGACY => {
2968 self.expect_keywords(&[IDS])?;
2969 KafkaSinkConfigOptionName::LegacyIds
2970 }
2971 _ => unreachable!(),
2972 };
2973 Ok(KafkaSinkConfigOption {
2974 name,
2975 value: self.parse_optional_option_value()?,
2976 })
2977 }
2978
2979 fn parse_connection_option_name(&mut self) -> Result<ConnectionOptionName, ParserError> {
2980 Ok(
2981 match self.expect_one_of_keywords(&[
2982 ACCESS,
2983 ASSUME,
2984 AVAILABILITY,
2985 AWS,
2986 BROKER,
2987 BROKERS,
2988 CATALOG,
2989 CREDENTIAL,
2990 DATABASE,
2991 ENDPOINT,
2992 GCP,
2993 HOST,
2994 OAUTH2,
2995 PASSWORD,
2996 PORT,
2997 PUBLIC,
2998 PROGRESS,
2999 REGION,
3000 REGISTRY,
3001 SASL,
3002 SCOPE,
3003 SECRET,
3004 SECURITY,
3005 SERVICE,
3006 SESSION,
3007 SSH,
3008 SSL,
3009 STORAGE,
3010 URL,
3011 USER,
3012 USERNAME,
3013 WAREHOUSE,
3014 ])? {
3015 ACCESS => match self.expect_one_of_keywords(&[KEY, DELEGATION])? {
3016 KEY => {
3017 self.expect_keyword(ID)?;
3018 ConnectionOptionName::AccessKeyId
3019 }
3020 DELEGATION => ConnectionOptionName::AccessDelegation,
3021 _ => unreachable!(),
3022 },
3023 ASSUME => {
3024 self.expect_keyword(ROLE)?;
3025 match self.expect_one_of_keywords(&[ARN, SESSION])? {
3026 ARN => ConnectionOptionName::AssumeRoleArn,
3027 SESSION => {
3028 self.expect_keyword(NAME)?;
3029 ConnectionOptionName::AssumeRoleSessionName
3030 }
3031 _ => unreachable!(),
3032 }
3033 }
3034 AVAILABILITY => {
3035 self.expect_keyword(ZONES)?;
3036 ConnectionOptionName::AvailabilityZones
3037 }
3038 AWS => match self.expect_one_of_keywords(&[CONNECTION, PRIVATELINK])? {
3039 CONNECTION => ConnectionOptionName::AwsConnection,
3040 PRIVATELINK => ConnectionOptionName::AwsPrivatelink,
3041 _ => unreachable!(),
3042 },
3043 BROKER => ConnectionOptionName::Broker,
3044 BROKERS => ConnectionOptionName::Brokers,
3045 CATALOG => {
3046 self.expect_keyword(TYPE)?;
3047 ConnectionOptionName::CatalogType
3048 }
3049 CREDENTIAL => ConnectionOptionName::Credential,
3050 DATABASE => ConnectionOptionName::Database,
3051 ENDPOINT => ConnectionOptionName::Endpoint,
3052 GCP => {
3053 self.expect_keyword(CONNECTION)?;
3054 ConnectionOptionName::GcpConnection
3055 }
3056 HOST => ConnectionOptionName::Host,
3057 OAUTH2 => {
3058 self.expect_keywords(&[SERVER, URL])?;
3059 ConnectionOptionName::Oauth2ServerUrl
3060 }
3061 PASSWORD => ConnectionOptionName::Password,
3062 PORT => ConnectionOptionName::Port,
3063 PUBLIC => {
3064 self.expect_keyword(KEY)?;
3065 match self.next_token() {
3066 Some(Token::Number(n)) if n == "1" => ConnectionOptionName::PublicKey1,
3067 Some(Token::Number(n)) if n == "2" => ConnectionOptionName::PublicKey2,
3068 t => self.expected(self.peek_prev_pos(), "1 or 2 after PUBLIC KEY", t)?,
3069 }
3070 }
3071 PROGRESS => {
3072 self.expect_keyword(TOPIC)?;
3073 match self.parse_keywords(&[REPLICATION, FACTOR]) {
3074 true => ConnectionOptionName::ProgressTopicReplicationFactor,
3075 false => ConnectionOptionName::ProgressTopic,
3076 }
3077 }
3078 SECURITY => {
3079 self.expect_keyword(PROTOCOL)?;
3080 ConnectionOptionName::SecurityProtocol
3081 }
3082 REGION => ConnectionOptionName::Region,
3083 REGISTRY => ConnectionOptionName::Registry,
3084 SASL => match self.expect_one_of_keywords(&[MECHANISMS, PASSWORD, USERNAME])? {
3085 MECHANISMS => ConnectionOptionName::SaslMechanisms,
3086 PASSWORD => ConnectionOptionName::SaslPassword,
3087 USERNAME => ConnectionOptionName::SaslUsername,
3088 _ => unreachable!(),
3089 },
3090 SCOPE => ConnectionOptionName::Scope,
3091 SECRET => {
3092 self.expect_keywords(&[ACCESS, KEY])?;
3093 ConnectionOptionName::SecretAccessKey
3094 }
3095 SERVICE => match self.expect_one_of_keywords(&[ACCOUNT, NAME])? {
3096 ACCOUNT => {
3097 self.expect_keyword(KEY)?;
3098 ConnectionOptionName::ServiceAccountKey
3099 }
3100 NAME => ConnectionOptionName::ServiceName,
3101 _ => unreachable!(),
3102 },
3103 SESSION => {
3104 self.expect_keyword(TOKEN)?;
3105 ConnectionOptionName::SessionToken
3106 }
3107 SSH => {
3108 self.expect_keyword(TUNNEL)?;
3109 ConnectionOptionName::SshTunnel
3110 }
3111 SSL => match self.expect_one_of_keywords(&[CERTIFICATE, MODE, KEY])? {
3112 CERTIFICATE => {
3113 if self.parse_keyword(AUTHORITY) {
3114 ConnectionOptionName::SslCertificateAuthority
3115 } else {
3116 ConnectionOptionName::SslCertificate
3117 }
3118 }
3119 KEY => ConnectionOptionName::SslKey,
3120 MODE => ConnectionOptionName::SslMode,
3121 _ => unreachable!(),
3122 },
3123 STORAGE => {
3124 self.expect_keyword(PROVIDER)?;
3125 ConnectionOptionName::StorageProvider
3126 }
3127 URL => ConnectionOptionName::Url,
3128 WAREHOUSE => ConnectionOptionName::Warehouse,
3130 USER | USERNAME => ConnectionOptionName::User,
3131 _ => unreachable!(),
3132 },
3133 )
3134 }
3135
3136 fn parse_connection_option_unified(&mut self) -> Result<ConnectionOption<Raw>, ParserError> {
3137 let name = self.parse_connection_option_name()?;
3138 let value = match name {
3139 ConnectionOptionName::AwsConnection => Some(self.parse_object_option_value()?),
3140 ConnectionOptionName::AwsPrivatelink => Some(self.parse_default_aws_privatelink()?),
3141 ConnectionOptionName::Broker => Some(self.parse_kafka_broker()?),
3142 ConnectionOptionName::Brokers => Some(WithOptionValue::Sequence(
3143 self.parse_list_value(Parser::parse_kafka_broker_or_matching_rule)?,
3144 )),
3145 ConnectionOptionName::GcpConnection => Some(self.parse_object_option_value()?),
3146 ConnectionOptionName::SshTunnel => Some(self.parse_object_option_value()?),
3147 _ if name.value_contains_sensitive_data() => {
3148 self.parse_optional_connection_credential_option_value()?
3149 }
3150 _ => self.parse_optional_option_value()?,
3151 };
3152 Ok(ConnectionOption { name, value })
3153 }
3154
3155 fn parse_create_subsource(&mut self) -> Result<Statement<Raw>, ParserError> {
3156 self.expect_keyword(SUBSOURCE)?;
3157 let if_not_exists = self.parse_if_not_exists()?;
3158 let name = self.parse_item_name()?;
3159
3160 let (columns, constraints) = self.parse_columns(Mandatory)?;
3161
3162 let of_source = if self.parse_keyword(OF) {
3163 self.expect_keyword(SOURCE)?;
3164 Some(self.parse_raw_name()?)
3165 } else {
3166 None
3167 };
3168
3169 let with_options = if self.parse_keyword(WITH) {
3170 self.expect_token(&Token::LParen)?;
3171 let options = self.parse_comma_separated(Parser::parse_create_subsource_option)?;
3172 self.expect_token(&Token::RParen)?;
3173 options
3174 } else {
3175 vec![]
3176 };
3177
3178 Ok(Statement::CreateSubsource(CreateSubsourceStatement {
3179 name,
3180 if_not_exists,
3181 columns,
3182 of_source,
3183 constraints,
3184 with_options,
3185 }))
3186 }
3187
3188 fn parse_create_subsource_option(&mut self) -> Result<CreateSubsourceOption<Raw>, ParserError> {
3189 let option = match self
3190 .expect_one_of_keywords(&[EXTERNAL, PROGRESS, TEXT, EXCLUDE, IGNORE, DETAILS, RETAIN])?
3191 {
3192 EXTERNAL => {
3193 self.expect_keyword(REFERENCE)?;
3194 CreateSubsourceOption {
3195 name: CreateSubsourceOptionName::ExternalReference,
3196 value: self.parse_optional_option_value()?,
3197 }
3198 }
3199 PROGRESS => CreateSubsourceOption {
3200 name: CreateSubsourceOptionName::Progress,
3201 value: self.parse_optional_option_value()?,
3202 },
3203 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
3204 self.expect_keyword(COLUMNS)?;
3205
3206 let _ = self.consume_token(&Token::Eq);
3207
3208 let value = self
3209 .parse_option_sequence(Parser::parse_identifier)?
3210 .map(|inner| {
3211 WithOptionValue::Sequence(
3212 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
3213 )
3214 });
3215
3216 CreateSubsourceOption {
3217 name: match *keyword {
3218 TEXT => CreateSubsourceOptionName::TextColumns,
3219 EXCLUDE | IGNORE => CreateSubsourceOptionName::ExcludeColumns,
3221 _ => unreachable!(),
3222 },
3223 value,
3224 }
3225 }
3226 DETAILS => CreateSubsourceOption {
3227 name: CreateSubsourceOptionName::Details,
3228 value: self.parse_optional_option_value()?,
3229 },
3230 RETAIN => {
3231 self.expect_keyword(HISTORY)?;
3232 CreateSubsourceOption {
3233 name: CreateSubsourceOptionName::RetainHistory,
3234 value: self.parse_option_retain_history()?,
3235 }
3236 }
3237 _ => unreachable!(),
3238 };
3239 Ok(option)
3240 }
3241
3242 fn parse_create_source(&mut self) -> Result<Statement<Raw>, ParserError> {
3243 self.expect_keyword(SOURCE)?;
3244 let if_not_exists = self.parse_if_not_exists()?;
3245 let name = self.parse_item_name()?;
3246
3247 let (col_names, key_constraint) = self.parse_source_columns()?;
3248
3249 let in_cluster = self.parse_optional_in_cluster()?;
3250 self.expect_keyword(FROM)?;
3251
3252 if self.parse_keyword(WEBHOOK) {
3254 return self.parse_create_webhook_source(name, if_not_exists, in_cluster, false);
3255 }
3256
3257 let connection = self.parse_create_source_connection()?;
3258 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
3259 Some(KEY) => {
3260 self.expect_keyword(FORMAT)?;
3261 let key = self.parse_format()?;
3262 self.expect_keywords(&[VALUE, FORMAT])?;
3263 let value = self.parse_format()?;
3264 Some(FormatSpecifier::KeyValue { key, value })
3265 }
3266 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3267 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3268 None => None,
3269 };
3270 let include_metadata = self.parse_source_include_metadata()?;
3271
3272 let envelope = if self.parse_keyword(ENVELOPE) {
3273 Some(self.parse_source_envelope()?)
3274 } else {
3275 None
3276 };
3277
3278 let referenced_subsources = if self.parse_keywords(&[FOR, TABLES]) {
3279 self.expect_token(&Token::LParen)?;
3280 let subsources = self.parse_comma_separated(Parser::parse_subsource_references)?;
3281 self.expect_token(&Token::RParen)?;
3282 Some(ExternalReferences::SubsetTables(subsources))
3283 } else if self.parse_keywords(&[FOR, SCHEMAS]) {
3284 self.expect_token(&Token::LParen)?;
3285 let schemas = self.parse_comma_separated(Parser::parse_identifier)?;
3286 self.expect_token(&Token::RParen)?;
3287 Some(ExternalReferences::SubsetSchemas(schemas))
3288 } else if self.parse_keywords(&[FOR, ALL, TABLES]) {
3289 Some(ExternalReferences::All)
3290 } else {
3291 None
3292 };
3293
3294 let progress_subsource = if self.parse_keywords(&[EXPOSE, PROGRESS, AS]) {
3295 Some(self.parse_deferred_item_name()?)
3296 } else {
3297 None
3298 };
3299
3300 let with_options = if self.parse_keyword(WITH) {
3302 self.expect_token(&Token::LParen)?;
3303 let options = self.parse_comma_separated(Parser::parse_source_option)?;
3304 self.expect_token(&Token::RParen)?;
3305 options
3306 } else {
3307 vec![]
3308 };
3309
3310 Ok(Statement::CreateSource(CreateSourceStatement {
3311 name,
3312 in_cluster,
3313 col_names,
3314 connection,
3315 format,
3316 include_metadata,
3317 envelope,
3318 if_not_exists,
3319 key_constraint,
3320 external_references: referenced_subsources,
3321 progress_subsource,
3322 with_options,
3323 }))
3324 }
3325
3326 fn parse_subsource_references(&mut self) -> Result<ExternalReferenceExport, ParserError> {
3327 let reference = self.parse_item_name()?;
3328 let subsource = if self.parse_one_of_keywords(&[AS, INTO]).is_some() {
3329 Some(self.parse_item_name()?)
3330 } else {
3331 None
3332 };
3333
3334 Ok(ExternalReferenceExport {
3335 reference,
3336 alias: subsource,
3337 })
3338 }
3339
3340 fn parse_source_columns(&mut self) -> Result<(Vec<Ident>, Option<KeyConstraint>), ParserError> {
3346 if self.consume_token(&Token::LParen) {
3347 let mut columns = vec![];
3348 let mut key_constraints = vec![];
3349 loop {
3350 let pos = self.peek_pos();
3351 if let Some(key_constraint) = self.parse_key_constraint()? {
3352 if !key_constraints.is_empty() {
3353 return parser_err!(self, pos, "Multiple key constraints not allowed");
3354 }
3355 key_constraints.push(key_constraint);
3356 } else {
3357 columns.push(self.parse_identifier()?);
3358 }
3359 if !self.consume_token(&Token::Comma) {
3360 break;
3361 }
3362 }
3363 self.expect_token(&Token::RParen)?;
3364 Ok((columns, key_constraints.into_iter().next()))
3365 } else {
3366 Ok((vec![], None))
3367 }
3368 }
3369
3370 fn parse_key_constraint(&mut self) -> Result<Option<KeyConstraint>, ParserError> {
3372 if self.parse_keywords(&[PRIMARY, KEY]) {
3374 let columns = self.parse_parenthesized_column_list(Mandatory)?;
3375 self.expect_keywords(&[NOT, ENFORCED])?;
3376 Ok(Some(KeyConstraint::PrimaryKeyNotEnforced { columns }))
3377 } else {
3378 Ok(None)
3379 }
3380 }
3381
3382 fn parse_source_option_name(&mut self) -> Result<CreateSourceOptionName, ParserError> {
3383 let name = match self.expect_one_of_keywords(&[TIMESTAMP, RETAIN])? {
3384 TIMESTAMP => {
3385 self.expect_keyword(INTERVAL)?;
3386 CreateSourceOptionName::TimestampInterval
3387 }
3388 RETAIN => {
3389 self.expect_keyword(HISTORY)?;
3390 CreateSourceOptionName::RetainHistory
3391 }
3392 _ => unreachable!(),
3393 };
3394 Ok(name)
3395 }
3396
3397 fn parse_source_option(&mut self) -> Result<CreateSourceOption<Raw>, ParserError> {
3399 let name = self.parse_source_option_name()?;
3400 if name == CreateSourceOptionName::RetainHistory {
3401 let _ = self.consume_token(&Token::Eq);
3402 return Ok(CreateSourceOption {
3403 name,
3404 value: self.parse_option_retain_history()?,
3405 });
3406 }
3407 Ok(CreateSourceOption {
3408 name,
3409 value: self.parse_optional_option_value()?,
3410 })
3411 }
3412
3413 fn parse_create_webhook_source(
3414 &mut self,
3415 name: UnresolvedItemName,
3416 if_not_exists: bool,
3417 in_cluster: Option<RawClusterName>,
3418 is_table: bool,
3419 ) -> Result<Statement<Raw>, ParserError> {
3420 self.expect_keywords(&[BODY, FORMAT])?;
3421
3422 let body_format = match self.expect_one_of_keywords(&[JSON, TEXT, BYTES])? {
3425 JSON => {
3426 let array = self.parse_keyword(ARRAY);
3427 Format::Json { array }
3428 }
3429 TEXT => Format::Text,
3430 BYTES => Format::Bytes,
3431 _ => unreachable!(),
3432 };
3433
3434 let mut include_headers = CreateWebhookSourceIncludeHeaders::default();
3435 while self.parse_keyword(INCLUDE) {
3436 match self.expect_one_of_keywords(&[HEADER, HEADERS])? {
3437 HEADER => {
3438 let header_name = self.parse_literal_string()?;
3439 self.expect_keyword(AS)?;
3440 let column_name = self.parse_identifier()?;
3441 let use_bytes = self.parse_keyword(BYTES);
3442
3443 include_headers.mappings.push(CreateWebhookSourceMapHeader {
3444 header_name,
3445 column_name,
3446 use_bytes,
3447 });
3448 }
3449 HEADERS => {
3450 let header_filters = include_headers.column.get_or_insert_with(Vec::default);
3451 if self.consume_token(&Token::LParen) {
3452 let filters = self.parse_comma_separated(|f| {
3453 let block = f.parse_keyword(NOT);
3454 let header_name = f.parse_literal_string()?;
3455 Ok(CreateWebhookSourceFilterHeader { block, header_name })
3456 })?;
3457 header_filters.extend(filters);
3458
3459 self.expect_token(&Token::RParen)?;
3460 }
3461 }
3462 k => unreachable!("programming error, didn't expect {k}"),
3463 }
3464 }
3465
3466 let validate_using = if self.parse_keyword(CHECK) {
3467 self.expect_token(&Token::LParen)?;
3468
3469 let options = if self.parse_keyword(WITH) {
3470 self.expect_token(&Token::LParen)?;
3471 let options = self.parse_create_webhook_check_options()?;
3472 self.expect_token(&Token::RParen)?;
3473
3474 Some(options)
3475 } else {
3476 None
3477 };
3478
3479 let using = self.parse_expr()?;
3480 self.expect_token(&Token::RParen)?;
3481
3482 Some(CreateWebhookSourceCheck { options, using })
3483 } else {
3484 None
3485 };
3486
3487 Ok(Statement::CreateWebhookSource(
3488 CreateWebhookSourceStatement {
3489 name,
3490 is_table,
3491 if_not_exists,
3492 body_format,
3493 include_headers,
3494 validate_using,
3495 in_cluster,
3496 },
3497 ))
3498 }
3499
3500 fn parse_create_webhook_check_options(
3501 &mut self,
3502 ) -> Result<CreateWebhookSourceCheckOptions<Raw>, ParserError> {
3503 let mut secrets = vec![];
3504 let mut headers = vec![];
3505 let mut bodies = vec![];
3506
3507 fn parse_alias(parser: &mut Parser<'_>) -> Result<Option<Ident>, ParserError> {
3508 parser
3509 .parse_keyword(AS)
3510 .then(|| parser.parse_identifier())
3511 .transpose()
3512 }
3513
3514 self.parse_comma_separated(|f| {
3515 match f.expect_one_of_keywords(&[SECRET, HEADERS, BODY])? {
3516 SECRET => {
3517 let secret = f.parse_raw_name()?;
3518 let alias = parse_alias(f)?;
3519 let use_bytes = f.parse_keyword(Keyword::Bytes);
3520
3521 secrets.push(CreateWebhookSourceSecret {
3522 secret,
3523 alias,
3524 use_bytes,
3525 });
3526
3527 Ok(())
3528 }
3529 HEADERS => {
3530 let alias = parse_alias(f)?;
3532 let use_bytes = f.parse_keyword(Keyword::Bytes);
3533 headers.push(CreateWebhookSourceHeader { alias, use_bytes });
3534
3535 Ok(())
3536 }
3537 BODY => {
3538 let alias = parse_alias(f)?;
3539 let use_bytes = f.parse_keyword(Keyword::Bytes);
3540 bodies.push(CreateWebhookSourceBody { alias, use_bytes });
3541
3542 Ok(())
3543 }
3544 k => unreachable!("Unexpected keyword! {k}"),
3545 }
3546 })?;
3547
3548 Ok(CreateWebhookSourceCheckOptions {
3549 secrets,
3550 headers,
3551 bodies,
3552 })
3553 }
3554
3555 fn parse_create_iceberg_sink(
3556 &mut self,
3557 name: Option<UnresolvedItemName>,
3558 in_cluster: Option<RawClusterName>,
3559 from: RawItemName,
3560 if_not_exists: bool,
3561 connection: CreateSinkConnection<Raw>,
3562 ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3563 let mode = if self.parse_keyword(MODE) {
3564 Some(self.parse_iceberg_sink_mode()?)
3565 } else {
3566 None
3567 };
3568
3569 let with_options = if self.parse_keyword(WITH) {
3570 self.expect_token(&Token::LParen)?;
3571 let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3572 self.expect_token(&Token::RParen)?;
3573 options
3574 } else {
3575 vec![]
3576 };
3577
3578 Ok(CreateSinkStatement {
3579 name,
3580 in_cluster,
3581 from,
3582 connection,
3583 format: None,
3584 envelope: None,
3585 mode,
3586 if_not_exists,
3587 with_options,
3588 })
3589 }
3590
3591 fn parse_create_kafka_sink(
3592 &mut self,
3593 name: Option<UnresolvedItemName>,
3594 in_cluster: Option<RawClusterName>,
3595 from: RawItemName,
3596 if_not_exists: bool,
3597 connection: CreateSinkConnection<Raw>,
3598 ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3599 let format = match &self.parse_one_of_keywords(&[KEY, FORMAT]) {
3600 Some(KEY) => {
3601 self.expect_keyword(FORMAT)?;
3602 let key = self.parse_format()?;
3603 self.expect_keywords(&[VALUE, FORMAT])?;
3604 let value = self.parse_format()?;
3605 Some(FormatSpecifier::KeyValue { key, value })
3606 }
3607 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3608 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3609 None => None,
3610 };
3611 let envelope = if self.parse_keyword(ENVELOPE) {
3612 Some(self.parse_sink_envelope()?)
3613 } else {
3614 None
3615 };
3616
3617 let with_options = if self.parse_keyword(WITH) {
3618 self.expect_token(&Token::LParen)?;
3619 let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3620 self.expect_token(&Token::RParen)?;
3621 options
3622 } else {
3623 vec![]
3624 };
3625
3626 Ok(CreateSinkStatement {
3627 name,
3628 in_cluster,
3629 from,
3630 connection,
3631 format,
3632 envelope,
3633 mode: None,
3634 if_not_exists,
3635 with_options,
3636 })
3637 }
3638
3639 fn parse_create_sink(&mut self) -> Result<Statement<Raw>, ParserError> {
3640 self.expect_keyword(SINK)?;
3641 let if_not_exists = self.parse_if_not_exists()?;
3642
3643 let mut name = Some(self.parse_item_name()?);
3644
3645 if (name == Some(UnresolvedItemName::unqualified(ident!("in")))
3652 && self.peek_keyword(CLUSTER))
3653 || (name == Some(UnresolvedItemName::unqualified(ident!("from")))
3654 && !self.peek_keyword(FROM))
3655 {
3656 name = None;
3657 self.prev_token();
3658 }
3659
3660 let in_cluster = self.parse_optional_in_cluster()?;
3661 self.expect_keyword(FROM)?;
3662 let from = self.parse_raw_name()?;
3663 self.expect_keyword(INTO)?;
3664 let connection = self.parse_create_sink_connection()?;
3665
3666 let statement = match connection {
3667 conn @ CreateSinkConnection::Kafka { .. } => {
3668 self.parse_create_kafka_sink(name, in_cluster, from, if_not_exists, conn)
3669 }
3670 conn @ CreateSinkConnection::Iceberg { .. } => {
3671 self.parse_create_iceberg_sink(name, in_cluster, from, if_not_exists, conn)
3672 }
3673 }?;
3674
3675 Ok(Statement::CreateSink(statement))
3676 }
3677
3678 fn parse_create_metric_sink(&mut self) -> Result<Statement<Raw>, ParserError> {
3679 self.expect_keywords(&[METRIC, SINK])?;
3680 let if_not_exists = self.parse_if_not_exists()?;
3681 let name = self.parse_item_name()?;
3682 let in_cluster = self.parse_optional_in_cluster()?;
3683 self.expect_keyword(FROM)?;
3684 let from = self.parse_raw_name()?;
3685 let with_options = if self.parse_keyword(WITH) {
3686 self.expect_token(&Token::LParen)?;
3687 let options = self.parse_comma_separated(Parser::parse_create_metric_sink_option)?;
3688 self.expect_token(&Token::RParen)?;
3689 options
3690 } else {
3691 vec![]
3692 };
3693 Ok(Statement::CreateMetricSink(CreateMetricSinkStatement {
3694 name,
3695 in_cluster,
3696 if_not_exists,
3697 from,
3698 with_options,
3699 }))
3700 }
3701
3702 fn parse_create_metric_sink_option(
3704 &mut self,
3705 ) -> Result<CreateMetricSinkOption<Raw>, ParserError> {
3706 self.expect_keyword(PREFIX)?;
3707 Ok(CreateMetricSinkOption {
3708 name: CreateMetricSinkOptionName::Prefix,
3709 value: self.parse_optional_option_value()?,
3710 })
3711 }
3712
3713 fn parse_create_sink_option_name(&mut self) -> Result<CreateSinkOptionName, ParserError> {
3715 let name = match self.expect_one_of_keywords(&[PARTITION, SNAPSHOT, VERSION, COMMIT])? {
3716 SNAPSHOT => CreateSinkOptionName::Snapshot,
3717 VERSION => CreateSinkOptionName::Version,
3718 PARTITION => {
3719 self.expect_keyword(STRATEGY)?;
3720 CreateSinkOptionName::PartitionStrategy
3721 }
3722 COMMIT => {
3723 self.expect_keyword(INTERVAL)?;
3724 CreateSinkOptionName::CommitInterval
3725 }
3726 _ => unreachable!(),
3727 };
3728 Ok(name)
3729 }
3730
3731 fn parse_create_sink_option(&mut self) -> Result<CreateSinkOption<Raw>, ParserError> {
3733 Ok(CreateSinkOption {
3734 name: self.parse_create_sink_option_name()?,
3735 value: self.parse_optional_option_value()?,
3736 })
3737 }
3738
3739 fn parse_create_source_connection(
3740 &mut self,
3741 ) -> Result<CreateSourceConnection<Raw>, ParserError> {
3742 match self.expect_one_of_keywords(&[KAFKA, POSTGRES, SQL, MYSQL, LOAD])? {
3743 POSTGRES => {
3744 self.expect_keyword(CONNECTION)?;
3745 let connection = self.parse_raw_name()?;
3746
3747 let options = if self.consume_token(&Token::LParen) {
3748 let options = self.parse_comma_separated(Parser::parse_pg_connection_option)?;
3749 self.expect_token(&Token::RParen)?;
3750 options
3751 } else {
3752 vec![]
3753 };
3754
3755 Ok(CreateSourceConnection::Postgres {
3756 connection,
3757 options,
3758 })
3759 }
3760 SQL => {
3761 self.expect_keywords(&[SERVER, CONNECTION])?;
3762 let connection = self.parse_raw_name()?;
3763
3764 let options = if self.consume_token(&Token::LParen) {
3765 let options =
3766 self.parse_comma_separated(Parser::parse_sql_server_connection_option)?;
3767 self.expect_token(&Token::RParen)?;
3768 options
3769 } else {
3770 vec![]
3771 };
3772
3773 Ok(CreateSourceConnection::SqlServer {
3774 connection,
3775 options,
3776 })
3777 }
3778 MYSQL => {
3779 self.expect_keyword(CONNECTION)?;
3780 let connection = self.parse_raw_name()?;
3781
3782 let options = if self.consume_token(&Token::LParen) {
3783 let options =
3784 self.parse_comma_separated(Parser::parse_mysql_connection_option)?;
3785 self.expect_token(&Token::RParen)?;
3786 options
3787 } else {
3788 vec![]
3789 };
3790
3791 Ok(CreateSourceConnection::MySql {
3792 connection,
3793 options,
3794 })
3795 }
3796 KAFKA => {
3797 self.expect_keyword(CONNECTION)?;
3798 let connection = self.parse_raw_name()?;
3799
3800 let options = if self.consume_token(&Token::LParen) {
3801 let options =
3802 self.parse_comma_separated(Parser::parse_kafka_source_config_option)?;
3803 self.expect_token(&Token::RParen)?;
3804 options
3805 } else {
3806 vec![]
3807 };
3808
3809 Ok(CreateSourceConnection::Kafka {
3810 connection,
3811 options,
3812 })
3813 }
3814 LOAD => {
3815 self.expect_keyword(GENERATOR)?;
3816 let generator = match self.expect_one_of_keywords(&[
3817 CLOCK, COUNTER, MARKETING, AUCTION, TPCH, DATUMS, KEY,
3818 ])? {
3819 CLOCK => LoadGenerator::Clock,
3820 COUNTER => LoadGenerator::Counter,
3821 AUCTION => LoadGenerator::Auction,
3822 TPCH => LoadGenerator::Tpch,
3823 DATUMS => LoadGenerator::Datums,
3824 MARKETING => LoadGenerator::Marketing,
3825 KEY => {
3826 self.expect_keyword(VALUE)?;
3827 LoadGenerator::KeyValue
3828 }
3829 _ => unreachable!(),
3830 };
3831 let options = if self.consume_token(&Token::LParen) {
3832 let options =
3833 self.parse_comma_separated(Parser::parse_load_generator_option)?;
3834 self.expect_token(&Token::RParen)?;
3835 options
3836 } else {
3837 vec![]
3838 };
3839 Ok(CreateSourceConnection::LoadGenerator { generator, options })
3840 }
3841 _ => unreachable!(),
3842 }
3843 }
3844
3845 fn parse_pg_connection_option(&mut self) -> Result<PgConfigOption<Raw>, ParserError> {
3846 let name = match self.expect_one_of_keywords(&[DETAILS, PUBLICATION, TEXT, EXCLUDE])? {
3847 DETAILS => PgConfigOptionName::Details,
3848 PUBLICATION => PgConfigOptionName::Publication,
3849 TEXT => {
3850 self.expect_keyword(COLUMNS)?;
3851
3852 let _ = self.consume_token(&Token::Eq);
3853
3854 let value = self
3855 .parse_option_sequence(Parser::parse_item_name)?
3856 .map(|inner| {
3857 WithOptionValue::Sequence(
3858 inner
3859 .into_iter()
3860 .map(WithOptionValue::UnresolvedItemName)
3861 .collect_vec(),
3862 )
3863 });
3864
3865 return Ok(PgConfigOption {
3866 name: PgConfigOptionName::TextColumns,
3867 value,
3868 });
3869 }
3870 EXCLUDE => {
3871 self.expect_keyword(COLUMNS)?;
3872
3873 let _ = self.consume_token(&Token::Eq);
3874
3875 let value = self
3876 .parse_option_sequence(Parser::parse_item_name)?
3877 .map(|inner| {
3878 WithOptionValue::Sequence(
3879 inner
3880 .into_iter()
3881 .map(WithOptionValue::UnresolvedItemName)
3882 .collect_vec(),
3883 )
3884 });
3885
3886 return Ok(PgConfigOption {
3887 name: PgConfigOptionName::ExcludeColumns,
3888 value,
3889 });
3890 }
3891 _ => unreachable!(),
3892 };
3893 Ok(PgConfigOption {
3894 name,
3895 value: self.parse_optional_option_value()?,
3896 })
3897 }
3898
3899 fn parse_mysql_connection_option(&mut self) -> Result<MySqlConfigOption<Raw>, ParserError> {
3900 match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE, IGNORE])? {
3901 DETAILS => Ok(MySqlConfigOption {
3902 name: MySqlConfigOptionName::Details,
3903 value: self.parse_optional_option_value()?,
3904 }),
3905 TEXT => {
3906 self.expect_keyword(COLUMNS)?;
3907
3908 let _ = self.consume_token(&Token::Eq);
3909
3910 let value = self
3911 .parse_option_sequence(Parser::parse_item_name)?
3912 .map(|inner| {
3913 WithOptionValue::Sequence(
3914 inner
3915 .into_iter()
3916 .map(WithOptionValue::UnresolvedItemName)
3917 .collect_vec(),
3918 )
3919 });
3920
3921 Ok(MySqlConfigOption {
3922 name: MySqlConfigOptionName::TextColumns,
3923 value,
3924 })
3925 }
3926 EXCLUDE | IGNORE => {
3928 self.expect_keyword(COLUMNS)?;
3929
3930 let _ = self.consume_token(&Token::Eq);
3931
3932 let value = self
3933 .parse_option_sequence(Parser::parse_item_name)?
3934 .map(|inner| {
3935 WithOptionValue::Sequence(
3936 inner
3937 .into_iter()
3938 .map(WithOptionValue::UnresolvedItemName)
3939 .collect_vec(),
3940 )
3941 });
3942
3943 Ok(MySqlConfigOption {
3944 name: MySqlConfigOptionName::ExcludeColumns,
3945 value,
3946 })
3947 }
3948 _ => unreachable!(),
3949 }
3950 }
3951
3952 fn parse_sql_server_connection_option(
3953 &mut self,
3954 ) -> Result<SqlServerConfigOption<Raw>, ParserError> {
3955 match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE])? {
3956 DETAILS => Ok(SqlServerConfigOption {
3957 name: SqlServerConfigOptionName::Details,
3958 value: self.parse_optional_option_value()?,
3959 }),
3960 TEXT => {
3961 self.expect_keyword(COLUMNS)?;
3962
3963 let _ = self.consume_token(&Token::Eq);
3964
3965 let value = self
3966 .parse_option_sequence(Parser::parse_item_name)?
3967 .map(|inner| {
3968 WithOptionValue::Sequence(
3969 inner
3970 .into_iter()
3971 .map(WithOptionValue::UnresolvedItemName)
3972 .collect_vec(),
3973 )
3974 });
3975
3976 Ok(SqlServerConfigOption {
3977 name: SqlServerConfigOptionName::TextColumns,
3978 value,
3979 })
3980 }
3981 EXCLUDE => {
3982 self.expect_keyword(COLUMNS)?;
3983
3984 let _ = self.consume_token(&Token::Eq);
3985
3986 let value = self
3987 .parse_option_sequence(Parser::parse_item_name)?
3988 .map(|inner| {
3989 WithOptionValue::Sequence(
3990 inner
3991 .into_iter()
3992 .map(WithOptionValue::UnresolvedItemName)
3993 .collect_vec(),
3994 )
3995 });
3996
3997 Ok(SqlServerConfigOption {
3998 name: SqlServerConfigOptionName::ExcludeColumns,
3999 value,
4000 })
4001 }
4002 _ => unreachable!(),
4003 }
4004 }
4005
4006 fn parse_load_generator_option(&mut self) -> Result<LoadGeneratorOption<Raw>, ParserError> {
4007 let name = match self.expect_one_of_keywords(&[
4008 AS,
4009 UP,
4010 SCALE,
4011 TICK,
4012 MAX,
4013 KEYS,
4014 SNAPSHOT,
4015 TRANSACTIONAL,
4016 VALUE,
4017 SEED,
4018 PARTITIONS,
4019 BATCH,
4020 ])? {
4021 AS => {
4022 self.expect_keyword(OF)?;
4023 LoadGeneratorOptionName::AsOf
4024 }
4025 UP => {
4026 self.expect_keyword(TO)?;
4027 LoadGeneratorOptionName::UpTo
4028 }
4029 SCALE => {
4030 self.expect_keyword(FACTOR)?;
4031 LoadGeneratorOptionName::ScaleFactor
4032 }
4033 TICK => {
4034 self.expect_keyword(INTERVAL)?;
4035 LoadGeneratorOptionName::TickInterval
4036 }
4037 MAX => {
4038 self.expect_keyword(CARDINALITY)?;
4039 LoadGeneratorOptionName::MaxCardinality
4040 }
4041 KEYS => LoadGeneratorOptionName::Keys,
4042 SNAPSHOT => {
4043 self.expect_keyword(ROUNDS)?;
4044 LoadGeneratorOptionName::SnapshotRounds
4045 }
4046 TRANSACTIONAL => {
4047 self.expect_keyword(SNAPSHOT)?;
4048 LoadGeneratorOptionName::TransactionalSnapshot
4049 }
4050 VALUE => {
4051 self.expect_keyword(SIZE)?;
4052 LoadGeneratorOptionName::ValueSize
4053 }
4054 SEED => LoadGeneratorOptionName::Seed,
4055 PARTITIONS => LoadGeneratorOptionName::Partitions,
4056 BATCH => {
4057 self.expect_keyword(SIZE)?;
4058 LoadGeneratorOptionName::BatchSize
4059 }
4060 _ => unreachable!(),
4061 };
4062
4063 let _ = self.consume_token(&Token::Eq);
4064 Ok(LoadGeneratorOption {
4065 name,
4066 value: self.parse_optional_option_value()?,
4067 })
4068 }
4069
4070 fn parse_create_kafka_sink_connection(
4071 &mut self,
4072 ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4073 self.expect_keyword(CONNECTION)?;
4074
4075 let connection = self.parse_raw_name()?;
4076
4077 let options = if self.consume_token(&Token::LParen) {
4078 let options = self.parse_comma_separated(Parser::parse_kafka_sink_config_option)?;
4079 self.expect_token(&Token::RParen)?;
4080 options
4081 } else {
4082 vec![]
4083 };
4084
4085 let key =
4089 if self.peek_keyword(KEY) && self.peek_nth_token(1) != Some(Token::Keyword(FORMAT)) {
4090 let _ = self.expect_keyword(KEY);
4091 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4092
4093 let not_enforced = if self.peek_keywords(&[NOT, ENFORCED]) {
4094 self.expect_keywords(&[NOT, ENFORCED])?;
4095 true
4096 } else {
4097 false
4098 };
4099 Some(SinkKey {
4100 key_columns,
4101 not_enforced,
4102 })
4103 } else {
4104 None
4105 };
4106
4107 let headers = if self.parse_keyword(HEADERS) {
4108 Some(self.parse_identifier()?)
4109 } else {
4110 None
4111 };
4112
4113 Ok(CreateSinkConnection::Kafka {
4114 connection,
4115 options,
4116 key,
4117 headers,
4118 })
4119 }
4120
4121 fn parse_create_iceberg_sink_connection(
4122 &mut self,
4123 ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4124 self.expect_keyword(CONNECTION)?;
4125 let catalog_connection = self.parse_raw_name()?;
4126
4127 let options = if self.consume_token(&Token::LParen) {
4128 let options = self.parse_comma_separated(Parser::parse_iceberg_sink_config_option)?;
4129 self.expect_token(&Token::RParen)?;
4130 options
4131 } else {
4132 vec![]
4133 };
4134
4135 let aws_connection = if self.parse_keywords(&[USING, AWS, CONNECTION]) {
4136 Some(self.parse_raw_name()?)
4137 } else {
4138 None
4139 };
4140
4141 let key = if self.parse_keyword(KEY) {
4142 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4143
4144 let not_enforced = self.parse_keywords(&[NOT, ENFORCED]);
4145 Some(SinkKey {
4146 key_columns,
4147 not_enforced,
4148 })
4149 } else {
4150 None
4151 };
4152
4153 Ok(CreateSinkConnection::Iceberg {
4154 catalog_connection,
4155 aws_connection,
4156 key,
4157 options,
4158 })
4159 }
4160
4161 fn parse_create_sink_connection(&mut self) -> Result<CreateSinkConnection<Raw>, ParserError> {
4162 match self.expect_one_of_keywords(&[KAFKA, ICEBERG])? {
4163 KAFKA => self.parse_create_kafka_sink_connection(),
4164 ICEBERG => {
4165 self.expect_keyword(CATALOG)?;
4166 self.parse_create_iceberg_sink_connection()
4167 }
4168 _ => unreachable!(),
4169 }
4170 }
4171
4172 fn parse_create_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4173 let mut if_exists = if self.parse_keyword(OR) {
4174 self.expect_keyword(REPLACE)?;
4175 IfExistsBehavior::Replace
4176 } else {
4177 IfExistsBehavior::Error
4178 };
4179 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
4180 self.expect_keyword(VIEW)?;
4181 if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4182 if_exists = IfExistsBehavior::Skip;
4183 }
4184
4185 let definition = self.parse_view_definition()?;
4186 Ok(Statement::CreateView(CreateViewStatement {
4187 temporary,
4188 if_exists,
4189 definition,
4190 }))
4191 }
4192
4193 fn parse_view_definition(&mut self) -> Result<ViewDefinition<Raw>, ParserError> {
4194 let name = self.parse_item_name()?;
4196 let columns = self.parse_parenthesized_column_list(Optional)?;
4197 self.expect_keyword(AS)?;
4199 let query = self.parse_query()?;
4200 Ok(ViewDefinition {
4202 name,
4203 columns,
4204 query,
4205 })
4206 }
4207
4208 fn parse_create_materialized_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4209 let mut if_exists = if self.parse_keyword(OR) {
4210 self.expect_keyword(REPLACE)?;
4211 IfExistsBehavior::Replace
4212 } else {
4213 IfExistsBehavior::Error
4214 };
4215 let replacement = self.parse_keyword(REPLACEMENT);
4216 self.expect_keywords(&[MATERIALIZED, VIEW])?;
4217 if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4218 if_exists = IfExistsBehavior::Skip;
4219 }
4220
4221 let name = self.parse_item_name()?;
4222 let columns = self.parse_parenthesized_column_list(Optional)?;
4223 let replacement_for = if replacement {
4224 self.expect_keyword(FOR)?;
4225 Some(self.parse_raw_name()?)
4226 } else {
4227 None
4228 };
4229 let (in_cluster, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
4230 let cluster = self.parse_raw_ident()?;
4231 let replica = if self.parse_keyword(REPLICA) {
4232 Some(self.parse_identifier()?)
4233 } else {
4234 None
4235 };
4236 (Some(cluster), replica)
4237 } else if self.parse_keywords(&[IN, REPLICA]) {
4238 let replica = self.parse_identifier()?;
4239 (None, Some(replica))
4240 } else {
4241 (None, None)
4242 };
4243
4244 let with_options = if self.parse_keyword(WITH) {
4245 self.expect_token(&Token::LParen)?;
4246 let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
4247 self.expect_token(&Token::RParen)?;
4248 options
4249 } else {
4250 vec![]
4251 };
4252
4253 self.expect_keyword(AS)?;
4254 let query = self.parse_query()?;
4255 let as_of = self.parse_optional_internal_as_of()?;
4256
4257 Ok(Statement::CreateMaterializedView(
4258 CreateMaterializedViewStatement {
4259 if_exists,
4260 name,
4261 columns,
4262 replacement_for,
4263 in_cluster,
4264 in_cluster_replica,
4265 query,
4266 as_of,
4267 with_options,
4268 },
4269 ))
4270 }
4271
4272 fn parse_materialized_view_option_name(
4273 &mut self,
4274 ) -> Result<MaterializedViewOptionName, ParserError> {
4275 let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4276 let name = match option {
4277 ASSERT => {
4278 self.expect_keywords(&[NOT, NULL])?;
4279 MaterializedViewOptionName::AssertNotNull
4280 }
4281 PARTITION => {
4282 self.expect_keyword(BY)?;
4283 MaterializedViewOptionName::PartitionBy
4284 }
4285 RETAIN => {
4286 self.expect_keyword(HISTORY)?;
4287 MaterializedViewOptionName::RetainHistory
4288 }
4289 REFRESH => MaterializedViewOptionName::Refresh,
4290 _ => unreachable!(),
4291 };
4292 Ok(name)
4293 }
4294
4295 fn parse_materialized_view_option(
4296 &mut self,
4297 ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4298 let name = self.parse_materialized_view_option_name()?;
4299 let value = match name {
4300 MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4301 MaterializedViewOptionName::Refresh => {
4302 Some(self.parse_materialized_view_refresh_option_value()?)
4303 }
4304 _ => self.parse_optional_option_value()?,
4305 };
4306 Ok(MaterializedViewOption { name, value })
4307 }
4308
4309 fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4310 Ok(Some(self.parse_retain_history()?))
4311 }
4312
4313 fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4314 let _ = self.consume_token(&Token::Eq);
4315 self.expect_keyword(FOR)?;
4316 let value = self.parse_value()?;
4317 Ok(WithOptionValue::RetainHistoryFor(value))
4318 }
4319
4320 fn parse_materialized_view_refresh_option_value(
4321 &mut self,
4322 ) -> Result<WithOptionValue<Raw>, ParserError> {
4323 let _ = self.consume_token(&Token::Eq);
4324
4325 match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4326 ON => {
4327 self.expect_keyword(COMMIT)?;
4328 Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4329 }
4330 AT => {
4331 if self.parse_keyword(CREATION) {
4332 Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4333 } else {
4334 Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4335 RefreshAtOptionValue {
4336 time: self.parse_expr()?,
4337 },
4338 )))
4339 }
4340 }
4341 EVERY => {
4342 let interval = self.parse_interval_value()?;
4343 let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4344 Some(self.parse_expr()?)
4345 } else {
4346 None
4347 };
4348 Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4349 RefreshEveryOptionValue {
4350 interval,
4351 aligned_to,
4352 },
4353 )))
4354 }
4355 _ => unreachable!(),
4356 }
4357 }
4358
4359 fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4360 let default_index = self.parse_keyword(DEFAULT);
4361 self.expect_keyword(INDEX)?;
4362
4363 let if_not_exists = self.parse_if_not_exists()?;
4364 let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4365 if if_not_exists && !default_index {
4366 return self.expected(self.peek_pos(), "index name", self.peek_token());
4367 }
4368 None
4369 } else {
4370 Some(self.parse_identifier()?)
4371 };
4372 let in_cluster = self.parse_optional_in_cluster()?;
4373 self.expect_keyword(ON)?;
4374 let on_name = self.parse_raw_name()?;
4375
4376 if self.parse_keyword(USING) {
4378 self.expect_keyword(ARRANGEMENT)?;
4379 }
4380
4381 let key_parts = if default_index {
4382 None
4383 } else {
4384 self.expect_token(&Token::LParen)?;
4385 if self.consume_token(&Token::RParen) {
4386 Some(vec![])
4387 } else {
4388 let key_parts = self
4389 .parse_comma_separated(Parser::parse_order_by_expr)?
4390 .into_iter()
4391 .map(|x| x.expr)
4392 .collect::<Vec<_>>();
4393 self.expect_token(&Token::RParen)?;
4394 Some(key_parts)
4395 }
4396 };
4397
4398 let with_options = if self.parse_keyword(WITH) {
4399 self.expect_token(&Token::LParen)?;
4400 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4401 vec![]
4402 } else {
4403 self.parse_comma_separated(Parser::parse_index_option)?
4404 };
4405 self.expect_token(&Token::RParen)?;
4406 o
4407 } else {
4408 vec![]
4409 };
4410
4411 Ok(Statement::CreateIndex(CreateIndexStatement {
4412 name,
4413 in_cluster,
4414 on_name,
4415 key_parts,
4416 with_options,
4417 if_not_exists,
4418 }))
4419 }
4420
4421 fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4422 if self.parse_keyword(REDACTED) {
4425 return Ok(TableOptionName::RedactedTest);
4426 }
4427 let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4428 PARTITION => {
4429 self.expect_keyword(BY)?;
4430 TableOptionName::PartitionBy
4431 }
4432 RETAIN => {
4433 self.expect_keyword(HISTORY)?;
4434 TableOptionName::RetainHistory
4435 }
4436 _ => unreachable!(),
4437 };
4438 Ok(name)
4439 }
4440
4441 fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4442 let name = self.parse_table_option_name()?;
4443 let value = match name {
4444 TableOptionName::PartitionBy => self.parse_optional_option_value(),
4445 TableOptionName::RetainHistory => self.parse_option_retain_history(),
4446 TableOptionName::RedactedTest => self.parse_optional_option_value(),
4447 }?;
4448 Ok(TableOption { name, value })
4449 }
4450
4451 fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4452 self.expect_keywords(&[RETAIN, HISTORY])?;
4453 Ok(IndexOptionName::RetainHistory)
4454 }
4455
4456 fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4457 let name = self.parse_index_option_name()?;
4458 let value = match name {
4459 IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4460 }?;
4461 Ok(IndexOption { name, value })
4462 }
4463
4464 fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4465 if self.consume_token(&Token::LBracket) {
4466 let id = self.parse_raw_ident_str()?;
4467 self.expect_token(&Token::RBracket)?;
4468 Ok(RawClusterName::Resolved(id))
4469 } else {
4470 Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4471 }
4472 }
4473
4474 fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4475 if self.consume_token(&Token::LBracket) {
4476 let id = self.parse_raw_ident_str()?;
4477 self.expect_token(&Token::RBracket)?;
4478 Ok(RawNetworkPolicyName::Resolved(id))
4479 } else {
4480 Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4481 }
4482 }
4483
4484 fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4485 let id = match self.next_token() {
4486 Some(Token::Ident(id)) => id.into_inner(),
4487 Some(Token::Number(n)) => n,
4488 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4489 };
4490 if id.is_empty() {
4493 return parser_err!(self, self.peek_prev_pos(), "expected id");
4494 }
4495 Ok(id)
4496 }
4497
4498 fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4499 if self.parse_keywords(&[IN, CLUSTER]) {
4500 Ok(Some(self.parse_raw_ident()?))
4501 } else {
4502 Ok(None)
4503 }
4504 }
4505
4506 fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4507 self.expect_keyword(ROLE)?;
4508 let name = self.parse_identifier()?;
4509 let _ = self.parse_keyword(WITH);
4510 let options = self.parse_role_attributes()?;
4511 Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4512 }
4513
4514 fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4515 let mut options = vec![];
4516 loop {
4517 match self.parse_one_of_keywords(&[
4518 SUPERUSER,
4519 NOSUPERUSER,
4520 LOGIN,
4521 NOLOGIN,
4522 INHERIT,
4523 NOINHERIT,
4524 CREATECLUSTER,
4525 NOCREATECLUSTER,
4526 CREATEDB,
4527 NOCREATEDB,
4528 CREATEROLE,
4529 NOCREATEROLE,
4530 PASSWORD,
4531 ]) {
4532 None => break,
4533 Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4534 Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4535 Some(LOGIN) => options.push(RoleAttribute::Login),
4536 Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4537 Some(INHERIT) => options.push(RoleAttribute::Inherit),
4538 Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4539 Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4540 Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4541 Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4542 Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4543 Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4544 Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4545 Some(PASSWORD) => {
4546 if self.parse_keyword(NULL) {
4547 options.push(RoleAttribute::Password(None));
4548 continue;
4549 }
4550 let password = self.parse_literal_string()?;
4551 options.push(RoleAttribute::Password(Some(password)));
4552 }
4553 Some(_) => unreachable!(),
4554 }
4555 }
4556 Ok(options)
4557 }
4558
4559 fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4560 self.expect_keyword(SECRET)?;
4561 let if_not_exists = self.parse_if_not_exists()?;
4562 let name = self.parse_item_name()?;
4563 self.expect_keyword(AS)?;
4564 let value = self.parse_expr()?;
4565 Ok(Statement::CreateSecret(CreateSecretStatement {
4566 name,
4567 if_not_exists,
4568 value,
4569 }))
4570 }
4571
4572 fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4573 self.expect_keyword(TYPE)?;
4574 let name = self.parse_item_name()?;
4575 self.expect_keyword(AS)?;
4576
4577 match self.parse_one_of_keywords(&[LIST, MAP]) {
4578 Some(LIST) => {
4579 self.expect_token(&Token::LParen)?;
4580 let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4581 self.expect_token(&Token::RParen)?;
4582 Ok(Statement::CreateType(CreateTypeStatement {
4583 name,
4584 as_type: CreateTypeAs::List { options },
4585 }))
4586 }
4587 Some(MAP) => {
4588 self.expect_token(&Token::LParen)?;
4589 let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4590 self.expect_token(&Token::RParen)?;
4591 Ok(Statement::CreateType(CreateTypeStatement {
4592 name,
4593 as_type: CreateTypeAs::Map { options },
4594 }))
4595 }
4596 None => {
4597 let column_defs = self.parse_composite_type_definition()?;
4598
4599 Ok(Statement::CreateType(CreateTypeStatement {
4600 name,
4601 as_type: CreateTypeAs::Record { column_defs },
4602 }))
4603 }
4604 _ => unreachable!(),
4605 }
4606 }
4607
4608 fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4609 self.expect_keywords(&[ELEMENT, TYPE])?;
4610 let name = CreateTypeListOptionName::ElementType;
4611 Ok(CreateTypeListOption {
4612 name,
4613 value: Some(self.parse_data_type_option_value()?),
4614 })
4615 }
4616
4617 fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4618 let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4619 KEY => {
4620 self.expect_keyword(TYPE)?;
4621 CreateTypeMapOptionName::KeyType
4622 }
4623 VALUE => {
4624 self.expect_keyword(TYPE)?;
4625 CreateTypeMapOptionName::ValueType
4626 }
4627 _ => unreachable!(),
4628 };
4629 Ok(CreateTypeMapOption {
4630 name,
4631 value: Some(self.parse_data_type_option_value()?),
4632 })
4633 }
4634
4635 fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4636 let if_not_exists = self.parse_if_not_exists()?;
4637 let name = self.parse_identifier()?;
4638 let paren = self.consume_token(&Token::LParen);
4641 let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4642 if paren {
4643 self.expect_token(&Token::RParen)?;
4644 }
4645
4646 let features = if self.parse_keywords(&[FEATURES]) {
4647 self.expect_token(&Token::LParen)?;
4648 let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4649 self.expect_token(&Token::RParen)?;
4650 features
4651 } else {
4652 Vec::new()
4653 };
4654
4655 Ok(Statement::CreateCluster(CreateClusterStatement {
4656 name,
4657 options,
4658 features,
4659 if_not_exists,
4660 }))
4661 }
4662
4663 fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4664 let option = self.expect_one_of_keywords(&[
4665 AUTO,
4666 AVAILABILITY,
4667 DISK,
4668 EXPERIMENTAL,
4669 INTROSPECTION,
4670 MANAGED,
4671 REPLICAS,
4672 REPLICATION,
4673 SIZE,
4674 SCHEDULE,
4675 WORKLOAD,
4676 ])?;
4677 let name = match option {
4678 AUTO => {
4679 self.expect_keywords(&[SCALING, STRATEGY])?;
4680 ClusterOptionName::AutoScalingStrategy
4681 }
4682 AVAILABILITY => {
4683 self.expect_keyword(ZONES)?;
4684 ClusterOptionName::AvailabilityZones
4685 }
4686 DISK => ClusterOptionName::Disk,
4687 EXPERIMENTAL => {
4688 self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4689 ClusterOptionName::ExperimentalArrangementCompression
4690 }
4691 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4692 DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4693 INTERVAL => ClusterOptionName::IntrospectionInterval,
4694 _ => unreachable!(),
4695 },
4696 MANAGED => ClusterOptionName::Managed,
4697 REPLICAS => ClusterOptionName::Replicas,
4698 REPLICATION => {
4699 self.expect_keyword(FACTOR)?;
4700 ClusterOptionName::ReplicationFactor
4701 }
4702 SIZE => ClusterOptionName::Size,
4703 SCHEDULE => ClusterOptionName::Schedule,
4704 WORKLOAD => {
4705 self.expect_keyword(CLASS)?;
4706 ClusterOptionName::WorkloadClass
4707 }
4708 _ => unreachable!(),
4709 };
4710 Ok(name)
4711 }
4712
4713 fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4714 let name = self.parse_cluster_option_name()?;
4715
4716 match name {
4717 ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4718 ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4719 ClusterOptionName::AutoScalingStrategy => {
4720 self.parse_cluster_option_auto_scaling_strategy()
4721 }
4722 _ => {
4723 let value = self.parse_optional_option_value()?;
4724 Ok(ClusterOption { name, value })
4725 }
4726 }
4727 }
4728
4729 fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4730 let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4731 WAIT => {
4732 let _ = self.consume_token(&Token::Eq);
4733 let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4734 FOR => Some(WithOptionValue::ClusterAlterStrategy(
4735 ClusterAlterOptionValue::For(self.parse_value()?),
4736 )),
4737 UNTIL => {
4738 self.expect_keyword(READY)?;
4739 let _ = self.consume_token(&Token::Eq);
4740 self.expect_token(&Token::LParen)?;
4741 let opts = Some(WithOptionValue::ClusterAlterStrategy(
4742 ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4743 Parser::parse_cluster_alter_until_ready_option,
4744 )?),
4745 ));
4746 self.expect_token(&Token::RParen)?;
4747 opts
4748 }
4749 _ => unreachable!(),
4750 };
4751 (ClusterAlterOptionName::Wait, v)
4752 }
4753 _ => unreachable!(),
4754 };
4755 Ok(ClusterAlterOption { name, value })
4756 }
4757
4758 fn parse_cluster_alter_until_ready_option(
4759 &mut self,
4760 ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4761 let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4762 ON => {
4763 self.expect_keywords(&[TIMEOUT])?;
4764 ClusterAlterUntilReadyOptionName::OnTimeout
4765 }
4766 TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4767 _ => unreachable!(),
4768 };
4769 let value = self.parse_optional_option_value()?;
4770 Ok(ClusterAlterUntilReadyOption { name, value })
4771 }
4772
4773 fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4774 let _ = self.consume_token(&Token::Eq);
4775 self.expect_token(&Token::LParen)?;
4776 let replicas = if self.consume_token(&Token::RParen) {
4777 vec![]
4778 } else {
4779 let replicas = self.parse_comma_separated(|parser| {
4780 let name = parser.parse_identifier()?;
4781 parser.expect_token(&Token::LParen)?;
4782 let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4783 parser.expect_token(&Token::RParen)?;
4784 Ok(ReplicaDefinition { name, options })
4785 })?;
4786 self.expect_token(&Token::RParen)?;
4787 replicas
4788 };
4789 Ok(ClusterOption {
4790 name: ClusterOptionName::Replicas,
4791 value: Some(WithOptionValue::ClusterReplicas(replicas)),
4792 })
4793 }
4794
4795 fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4796 let _ = self.consume_token(&Token::Eq);
4797 let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4798 let value = match kw {
4799 MANUAL => ClusterScheduleOptionValue::Manual,
4800 ON => {
4801 self.expect_keyword(REFRESH)?;
4802 let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4804 self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4805 let _ = self.consume_token(&Token::Eq);
4806 let interval = self.parse_interval_value()?;
4807 self.expect_token(&Token::RParen)?;
4808 Some(interval)
4809 } else {
4810 None
4811 };
4812 ClusterScheduleOptionValue::Refresh {
4813 hydration_time_estimate,
4814 }
4815 }
4816 _ => unreachable!(),
4817 };
4818 Ok(ClusterOption {
4819 name: ClusterOptionName::Schedule,
4820 value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4821 })
4822 }
4823
4824 fn parse_cluster_option_auto_scaling_strategy(
4829 &mut self,
4830 ) -> Result<ClusterOption<Raw>, ParserError> {
4831 let _ = self.consume_token(&Token::Eq);
4832 self.expect_token(&Token::LParen)?;
4833 let mut value = ClusterAutoScalingStrategyOptionValue { on_hydration: None };
4834 if !self.consume_token(&Token::RParen) {
4835 loop {
4838 self.expect_keywords(&[ON, HYDRATION])?;
4839 self.expect_token(&Token::LParen)?;
4840 self.expect_keywords(&[HYDRATION, SIZE])?;
4841 let _ = self.consume_token(&Token::Eq);
4842 let hydration_size = self.parse_value()?;
4843 let linger_duration = if self.consume_token(&Token::Comma) {
4844 self.expect_keywords(&[LINGER, DURATION])?;
4845 let _ = self.consume_token(&Token::Eq);
4846 Some(self.parse_value()?)
4847 } else {
4848 None
4849 };
4850 self.expect_token(&Token::RParen)?;
4851 if value.on_hydration.is_some() {
4854 return parser_err!(
4855 self,
4856 self.peek_prev_pos(),
4857 "ON HYDRATION specified more than once"
4858 );
4859 }
4860 value.on_hydration = Some(OnHydrationOptionValue {
4861 hydration_size,
4862 linger_duration,
4863 });
4864 if !self.consume_token(&Token::Comma) {
4865 break;
4866 }
4867 }
4868 self.expect_token(&Token::RParen)?;
4869 }
4870 Ok(ClusterOption {
4871 name: ClusterOptionName::AutoScalingStrategy,
4872 value: Some(WithOptionValue::ClusterAutoScalingStrategyOptionValue(
4873 value,
4874 )),
4875 })
4876 }
4877
4878 fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4879 let name = match self.expect_one_of_keywords(&[
4880 AVAILABILITY,
4881 BILLED,
4882 COMPUTE,
4883 COMPUTECTL,
4884 DISK,
4885 EXPERIMENTAL,
4886 INTERNAL,
4887 INTROSPECTION,
4888 SIZE,
4889 STORAGE,
4890 STORAGECTL,
4891 WORKERS,
4892 ])? {
4893 AVAILABILITY => {
4894 self.expect_keyword(ZONE)?;
4895 ReplicaOptionName::AvailabilityZone
4896 }
4897 BILLED => {
4898 self.expect_keyword(AS)?;
4899 ReplicaOptionName::BilledAs
4900 }
4901 COMPUTE => {
4902 self.expect_keyword(ADDRESSES)?;
4903 ReplicaOptionName::ComputeAddresses
4904 }
4905 COMPUTECTL => {
4906 self.expect_keyword(ADDRESSES)?;
4907 ReplicaOptionName::ComputectlAddresses
4908 }
4909 DISK => ReplicaOptionName::Disk,
4910 EXPERIMENTAL => {
4911 self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4912 ReplicaOptionName::ExperimentalArrangementCompression
4913 }
4914 INTERNAL => ReplicaOptionName::Internal,
4915 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4916 DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4917 INTERVAL => ReplicaOptionName::IntrospectionInterval,
4918 _ => unreachable!(),
4919 },
4920 SIZE => ReplicaOptionName::Size,
4921 STORAGE => {
4922 self.expect_keyword(ADDRESSES)?;
4923 ReplicaOptionName::StorageAddresses
4924 }
4925 STORAGECTL => {
4926 self.expect_keyword(ADDRESSES)?;
4927 ReplicaOptionName::StoragectlAddresses
4928 }
4929 WORKERS => ReplicaOptionName::Workers,
4930 _ => unreachable!(),
4931 };
4932 let value = self.parse_optional_option_value()?;
4933 Ok(ReplicaOption { name, value })
4934 }
4935
4936 fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4937 Ok(ClusterFeature {
4938 name: self.parse_cluster_feature_name()?,
4939 value: self.parse_optional_option_value()?,
4940 })
4941 }
4942
4943 fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4944 self.next_token();
4945 let if_not_exists = self.parse_if_not_exists()?;
4946 let of_cluster = self.parse_identifier()?;
4947 self.expect_token(&Token::Dot)?;
4948 let name = self.parse_identifier()?;
4949 let paren = self.consume_token(&Token::LParen);
4952 let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4953 if paren {
4954 let _ = self.consume_token(&Token::RParen);
4955 }
4956 Ok(Statement::CreateClusterReplica(
4957 CreateClusterReplicaStatement {
4958 of_cluster,
4959 definition: ReplicaDefinition { name, options },
4960 if_not_exists,
4961 },
4962 ))
4963 }
4964
4965 fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4966 if self.parse_keyword(IF) {
4967 self.expect_keyword(EXISTS)?;
4968 Ok(true)
4969 } else {
4970 Ok(false)
4971 }
4972 }
4973
4974 fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4975 if self.parse_keyword(IF) {
4976 self.expect_keywords(&[NOT, EXISTS])?;
4977 Ok(true)
4978 } else {
4979 Ok(false)
4980 }
4981 }
4982
4983 fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4984 self.parse_keyword(AS)
4985 .then(|| self.parse_identifier())
4986 .transpose()
4987 }
4988
4989 fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
4990 if self.parse_keyword(INCLUDE) {
4991 self.parse_comma_separated(|parser| {
4992 let metadata = match parser
4993 .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
4994 {
4995 KEY => SourceIncludeMetadata::Key {
4996 alias: parser.parse_alias()?,
4997 },
4998 TIMESTAMP => SourceIncludeMetadata::Timestamp {
4999 alias: parser.parse_alias()?,
5000 },
5001 PARTITION => SourceIncludeMetadata::Partition {
5002 alias: parser.parse_alias()?,
5003 },
5004 OFFSET => SourceIncludeMetadata::Offset {
5005 alias: parser.parse_alias()?,
5006 },
5007 HEADERS => SourceIncludeMetadata::Headers {
5008 alias: parser.parse_alias()?,
5009 },
5010 HEADER => {
5011 let key: String = parser.parse_literal_string()?;
5012 parser.expect_keyword(AS)?;
5013 let alias = parser.parse_identifier()?;
5014 let use_bytes = parser.parse_keyword(BYTES);
5015 SourceIncludeMetadata::Header {
5016 alias,
5017 key,
5018 use_bytes,
5019 }
5020 }
5021 _ => unreachable!("only explicitly allowed items can be parsed"),
5022 };
5023 Ok(metadata)
5024 })
5025 } else {
5026 Ok(vec![])
5027 }
5028 }
5029
5030 fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
5031 let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
5032 ALL => DiscardTarget::All,
5033 PLANS => DiscardTarget::Plans,
5034 SEQUENCES => DiscardTarget::Sequences,
5035 TEMP | TEMPORARY => DiscardTarget::Temp,
5036 _ => unreachable!(),
5037 };
5038 Ok(Statement::Discard(DiscardStatement { target }))
5039 }
5040
5041 fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5042 if self.parse_keyword(OWNED) {
5043 self.parse_drop_owned()
5044 .map_parser_err(StatementKind::DropOwned)
5045 } else {
5046 self.parse_drop_objects()
5047 .map_parser_err(StatementKind::DropObjects)
5048 }
5049 }
5050
5051 fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
5052 let object_type = self.expect_object_type()?;
5053 let if_exists = self.parse_if_exists()?;
5054 match object_type {
5055 ObjectType::Database => {
5056 let name = UnresolvedObjectName::Database(self.parse_database_name()?);
5057 let restrict = matches!(
5058 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5059 Some(RESTRICT),
5060 );
5061 Ok(Statement::DropObjects(DropObjectsStatement {
5062 object_type: ObjectType::Database,
5063 if_exists,
5064 names: vec![name],
5065 cascade: !restrict,
5066 }))
5067 }
5068 ObjectType::Schema => {
5069 let names = self.parse_comma_separated(|parser| {
5070 Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
5071 })?;
5072
5073 let cascade = matches!(
5074 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5075 Some(CASCADE),
5076 );
5077 Ok(Statement::DropObjects(DropObjectsStatement {
5078 object_type: ObjectType::Schema,
5079 if_exists,
5080 names,
5081 cascade,
5082 }))
5083 }
5084 ObjectType::Role => {
5085 let names = self.parse_comma_separated(|parser| {
5086 Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
5087 })?;
5088 Ok(Statement::DropObjects(DropObjectsStatement {
5089 object_type: ObjectType::Role,
5090 if_exists,
5091 names,
5092 cascade: false,
5093 }))
5094 }
5095 ObjectType::NetworkPolicy => {
5096 let names = self.parse_comma_separated(|parser| {
5097 Ok(UnresolvedObjectName::NetworkPolicy(
5098 parser.parse_identifier()?,
5099 ))
5100 })?;
5101 Ok(Statement::DropObjects(DropObjectsStatement {
5102 object_type: ObjectType::NetworkPolicy,
5103 if_exists,
5104 names,
5105 cascade: false,
5106 }))
5107 }
5108 ObjectType::Cluster => self.parse_drop_clusters(if_exists),
5109 ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
5110 ObjectType::Table
5111 | ObjectType::View
5112 | ObjectType::MaterializedView
5113 | ObjectType::Source
5114 | ObjectType::Sink
5115 | ObjectType::MetricSink
5116 | ObjectType::Index
5117 | ObjectType::Type
5118 | ObjectType::Secret
5119 | ObjectType::Connection => {
5120 let names = self.parse_comma_separated(|parser| {
5121 Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
5122 })?;
5123 let cascade = matches!(
5124 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5125 Some(CASCADE),
5126 );
5127 Ok(Statement::DropObjects(DropObjectsStatement {
5128 object_type,
5129 if_exists,
5130 names,
5131 cascade,
5132 }))
5133 }
5134 ObjectType::Func | ObjectType::Subsource => parser_err!(
5135 self,
5136 self.peek_prev_pos(),
5137 format!("Unsupported DROP on {object_type}")
5138 ),
5139 }
5140 }
5141
5142 fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
5143 let names = self.parse_comma_separated(|parser| {
5144 Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
5145 })?;
5146 let cascade = matches!(
5147 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5148 Some(CASCADE),
5149 );
5150 Ok(Statement::DropObjects(DropObjectsStatement {
5151 object_type: ObjectType::Cluster,
5152 if_exists,
5153 names,
5154 cascade,
5155 }))
5156 }
5157
5158 fn parse_drop_cluster_replicas(
5159 &mut self,
5160 if_exists: bool,
5161 ) -> Result<Statement<Raw>, ParserError> {
5162 let names = self.parse_comma_separated(|p| {
5163 Ok(UnresolvedObjectName::ClusterReplica(
5164 p.parse_cluster_replica_name()?,
5165 ))
5166 })?;
5167 Ok(Statement::DropObjects(DropObjectsStatement {
5168 object_type: ObjectType::ClusterReplica,
5169 if_exists,
5170 names,
5171 cascade: false,
5172 }))
5173 }
5174
5175 fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5176 self.expect_keyword(BY)?;
5177 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5178 let cascade = if self.parse_keyword(CASCADE) {
5179 Some(true)
5180 } else if self.parse_keyword(RESTRICT) {
5181 Some(false)
5182 } else {
5183 None
5184 };
5185 Ok(Statement::DropOwned(DropOwnedStatement {
5186 role_names,
5187 cascade,
5188 }))
5189 }
5190
5191 fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5192 let cluster = self.parse_identifier()?;
5193 self.expect_token(&Token::Dot)?;
5194 let replica = self.parse_identifier()?;
5195 Ok(QualifiedReplica { cluster, replica })
5196 }
5197
5198 fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5199 let name = self.parse_identifier()?;
5200 self.expect_keyword(SET)?;
5201 self.expect_token(&Token::LParen)?;
5202 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5203 self.expect_token(&Token::RParen)?;
5204 Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5205 name,
5206 options,
5207 }))
5208 }
5209
5210 fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5211 self.expect_keywords(&[NETWORK, POLICY])?;
5212 let name = self.parse_identifier()?;
5213 self.expect_token(&Token::LParen)?;
5214 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5215 self.expect_token(&Token::RParen)?;
5216 Ok(Statement::CreateNetworkPolicy(
5217 CreateNetworkPolicyStatement { name, options },
5218 ))
5219 }
5220
5221 fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5222 let name = match self.expect_one_of_keywords(&[RULES])? {
5223 RULES => NetworkPolicyOptionName::Rules,
5224 v => panic!("found unreachable keyword {}", v),
5225 };
5226 match name {
5227 NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5228 }
5229 }
5230
5231 fn parse_network_policy_option_rules(
5232 &mut self,
5233 ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5234 let _ = self.consume_token(&Token::Eq);
5235 self.expect_token(&Token::LParen)?;
5236 let rules = if self.consume_token(&Token::RParen) {
5237 vec![]
5238 } else {
5239 let rules = self.parse_comma_separated(|parser| {
5240 let name = parser.parse_identifier()?;
5241 parser.expect_token(&Token::LParen)?;
5242 let options =
5243 parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5244 parser.expect_token(&Token::RParen)?;
5245 Ok(NetworkPolicyRuleDefinition { name, options })
5246 })?;
5247 self.expect_token(&Token::RParen)?;
5248 rules
5249 };
5250 Ok(NetworkPolicyOption {
5251 name: NetworkPolicyOptionName::Rules,
5252 value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5253 })
5254 }
5255
5256 fn parse_network_policy_rule_option(
5257 &mut self,
5258 ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5259 let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5260 ACTION => NetworkPolicyRuleOptionName::Action,
5261 ADDRESS => NetworkPolicyRuleOptionName::Address,
5262 DIRECTION => NetworkPolicyRuleOptionName::Direction,
5263 v => panic!("found unreachable keyword {}", v),
5264 };
5265 let value = self.parse_optional_option_value()?;
5266 Ok(NetworkPolicyRuleOption { name, value })
5267 }
5268
5269 fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5270 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5271 self.expect_keyword(TABLE)?;
5272 let if_not_exists = self.parse_if_not_exists()?;
5273 let table_name = self.parse_item_name()?;
5274 let (columns, constraints) = self.parse_columns(Mandatory)?;
5276
5277 let with_options = if self.parse_keyword(WITH) {
5278 self.expect_token(&Token::LParen)?;
5279 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5280 vec![]
5281 } else {
5282 self.parse_comma_separated(Parser::parse_table_option)?
5283 };
5284 self.expect_token(&Token::RParen)?;
5285 o
5286 } else {
5287 vec![]
5288 };
5289
5290 Ok(Statement::CreateTable(CreateTableStatement {
5291 name: table_name,
5292 columns,
5293 constraints,
5294 if_not_exists,
5295 temporary,
5296 with_options,
5297 }))
5298 }
5299
5300 fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5301 if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5302 return parser_err!(
5303 self,
5304 self.peek_prev_pos(),
5305 "temporary tables FROM SOURCE are not supported"
5306 );
5307 }
5308 self.expect_keyword(TABLE)?;
5309 let if_not_exists = self.parse_if_not_exists()?;
5310 let table_name = self.parse_item_name()?;
5311
5312 if self.parse_keywords(&[FROM, WEBHOOK]) {
5313 return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5315 }
5316
5317 let (columns, constraints) = self.parse_table_from_source_columns()?;
5318
5319 self.expect_keywords(&[FROM, SOURCE])?;
5320
5321 let source = self.parse_raw_name()?;
5322
5323 let external_reference = if self.consume_token(&Token::LParen) {
5324 self.expect_keyword(REFERENCE)?;
5325 let _ = self.consume_token(&Token::Eq);
5326 let external_reference = self.parse_item_name()?;
5327 self.expect_token(&Token::RParen)?;
5328 Some(external_reference)
5329 } else {
5330 None
5331 };
5332
5333 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5334 Some(KEY) => {
5335 self.expect_keyword(FORMAT)?;
5336 let key = self.parse_format()?;
5337 self.expect_keywords(&[VALUE, FORMAT])?;
5338 let value = self.parse_format()?;
5339 Some(FormatSpecifier::KeyValue { key, value })
5340 }
5341 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5342 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5343 None => None,
5344 };
5345 let include_metadata = self.parse_source_include_metadata()?;
5346
5347 let envelope = if self.parse_keyword(ENVELOPE) {
5348 Some(self.parse_source_envelope()?)
5349 } else {
5350 None
5351 };
5352
5353 let with_options = if self.parse_keyword(WITH) {
5354 self.expect_token(&Token::LParen)?;
5355 let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5356 self.expect_token(&Token::RParen)?;
5357 options
5358 } else {
5359 vec![]
5360 };
5361
5362 Ok(Statement::CreateTableFromSource(
5363 CreateTableFromSourceStatement {
5364 name: table_name,
5365 columns,
5366 constraints,
5367 if_not_exists,
5368 source,
5369 external_reference,
5370 format,
5371 include_metadata,
5372 envelope,
5373 with_options,
5374 },
5375 ))
5376 }
5377
5378 fn parse_table_from_source_option(
5379 &mut self,
5380 ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5381 let option = match self
5382 .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5383 {
5384 TEXT => {
5385 self.expect_keyword(COLUMNS)?;
5386
5387 let _ = self.consume_token(&Token::Eq);
5388
5389 let value = self
5390 .parse_option_sequence(Parser::parse_identifier)?
5391 .map(|inner| {
5392 WithOptionValue::Sequence(
5393 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5394 )
5395 });
5396
5397 TableFromSourceOption {
5398 name: TableFromSourceOptionName::TextColumns,
5399 value,
5400 }
5401 }
5402 EXCLUDE => match self.expect_one_of_keywords(&[COLUMNS, CONSTRAINTS, ALL])? {
5403 COLUMNS => {
5404 let _ = self.consume_token(&Token::Eq);
5405
5406 let value =
5407 self.parse_option_sequence(Parser::parse_identifier)?
5408 .map(|inner| {
5409 WithOptionValue::Sequence(
5410 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5411 )
5412 });
5413
5414 TableFromSourceOption {
5415 name: TableFromSourceOptionName::ExcludeColumns,
5416 value,
5417 }
5418 }
5419 CONSTRAINTS => {
5420 let _ = self.consume_token(&Token::Eq);
5421
5422 let value = self
5426 .parse_option_sequence(Parser::parse_literal_string)?
5427 .map(|inner| {
5428 WithOptionValue::Sequence(
5429 inner
5430 .into_iter()
5431 .map(|s| WithOptionValue::Value(Value::String(s)))
5432 .collect_vec(),
5433 )
5434 });
5435
5436 TableFromSourceOption {
5437 name: TableFromSourceOptionName::ExcludeConstraints,
5438 value,
5439 }
5440 }
5441 ALL => {
5442 self.expect_keyword(CONSTRAINTS)?;
5443 TableFromSourceOption {
5444 name: TableFromSourceOptionName::ExcludeAllConstraints,
5445 value: None,
5446 }
5447 }
5448 _ => unreachable!(),
5449 },
5450 DETAILS => TableFromSourceOption {
5451 name: TableFromSourceOptionName::Details,
5452 value: self.parse_optional_option_value()?,
5453 },
5454 IGNORE => {
5455 self.expect_keyword(COLUMNS)?;
5456 let _ = self.consume_token(&Token::Eq);
5457
5458 let value = self
5459 .parse_option_sequence(Parser::parse_identifier)?
5460 .map(|inner| {
5461 WithOptionValue::Sequence(
5462 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5463 )
5464 });
5465 TableFromSourceOption {
5466 name: TableFromSourceOptionName::ExcludeColumns,
5468 value,
5469 }
5470 }
5471 PARTITION => {
5472 self.expect_keyword(BY)?;
5473 TableFromSourceOption {
5474 name: TableFromSourceOptionName::PartitionBy,
5475 value: self.parse_optional_option_value()?,
5476 }
5477 }
5478 RETAIN => {
5479 self.expect_keyword(HISTORY)?;
5480 TableFromSourceOption {
5481 name: TableFromSourceOptionName::RetainHistory,
5482 value: self.parse_option_retain_history()?,
5483 }
5484 }
5485 _ => unreachable!(),
5486 };
5487 Ok(option)
5488 }
5489
5490 fn parse_table_from_source_columns(
5491 &mut self,
5492 ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5493 let mut constraints = vec![];
5494
5495 if !self.consume_token(&Token::LParen) {
5496 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5497 }
5498 if self.consume_token(&Token::RParen) {
5499 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5501 }
5502
5503 let mut column_names = vec![];
5504 let mut column_defs = vec![];
5505 loop {
5506 if let Some(constraint) = self.parse_optional_table_constraint()? {
5507 constraints.push(constraint);
5508 } else if let Some(column_name) = self.consume_identifier()? {
5509 let next_token = self.peek_token();
5510 match next_token {
5511 Some(Token::Comma) | Some(Token::RParen) => {
5512 column_names.push(column_name);
5513 }
5514 _ => {
5515 let data_type = self.parse_data_type()?;
5516 let collation = if self.parse_keyword(COLLATE) {
5517 Some(self.parse_item_name()?)
5518 } else {
5519 None
5520 };
5521 let mut options = vec![];
5522 loop {
5523 match self.peek_token() {
5524 None | Some(Token::Comma) | Some(Token::RParen) => break,
5525 _ => options.push(self.parse_column_option_def()?),
5526 }
5527 }
5528
5529 column_defs.push(ColumnDef {
5530 name: column_name,
5531 data_type,
5532 collation,
5533 options,
5534 });
5535 }
5536 }
5537 } else {
5538 return self.expected(
5539 self.peek_pos(),
5540 "column name or constraint definition",
5541 self.peek_token(),
5542 );
5543 }
5544 if self.consume_token(&Token::Comma) {
5545 } else if self.consume_token(&Token::RParen) {
5547 break;
5548 } else {
5549 return self.expected(
5550 self.peek_pos(),
5551 "',' or ')' after column definition",
5552 self.peek_token(),
5553 );
5554 }
5555 }
5556 if !column_defs.is_empty() && !column_names.is_empty() {
5557 return parser_err!(
5558 self,
5559 self.peek_prev_pos(),
5560 "cannot mix column definitions and column names"
5561 );
5562 }
5563
5564 let columns = match column_defs.is_empty() {
5565 true => match column_names.is_empty() {
5566 true => TableFromSourceColumns::NotSpecified,
5567 false => TableFromSourceColumns::Named(column_names),
5568 },
5569 false => TableFromSourceColumns::Defined(column_defs),
5570 };
5571
5572 Ok((columns, constraints))
5573 }
5574
5575 fn parse_columns(
5576 &mut self,
5577 optional: IsOptional,
5578 ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5579 let mut columns = vec![];
5580 let mut constraints = vec![];
5581
5582 if !self.consume_token(&Token::LParen) {
5583 if optional == Optional {
5584 return Ok((columns, constraints));
5585 } else {
5586 return self.expected(
5587 self.peek_pos(),
5588 "a list of columns in parentheses",
5589 self.peek_token(),
5590 );
5591 }
5592 }
5593 if self.consume_token(&Token::RParen) {
5594 return Ok((columns, constraints));
5596 }
5597
5598 loop {
5599 if let Some(constraint) = self.parse_optional_table_constraint()? {
5600 constraints.push(constraint);
5601 } else if let Some(column_name) = self.consume_identifier()? {
5602 let data_type = self.parse_data_type()?;
5603 let collation = if self.parse_keyword(COLLATE) {
5604 Some(self.parse_item_name()?)
5605 } else {
5606 None
5607 };
5608 let mut options = vec![];
5609 loop {
5610 match self.peek_token() {
5611 None | Some(Token::Comma) | Some(Token::RParen) => break,
5612 _ => options.push(self.parse_column_option_def()?),
5613 }
5614 }
5615
5616 columns.push(ColumnDef {
5617 name: column_name,
5618 data_type,
5619 collation,
5620 options,
5621 });
5622 } else {
5623 return self.expected(
5624 self.peek_pos(),
5625 "column name or constraint definition",
5626 self.peek_token(),
5627 );
5628 }
5629 if self.consume_token(&Token::Comma) {
5630 } else if self.consume_token(&Token::RParen) {
5632 break;
5633 } else {
5634 return self.expected(
5635 self.peek_pos(),
5636 "',' or ')' after column definition",
5637 self.peek_token(),
5638 );
5639 }
5640 }
5641
5642 Ok((columns, constraints))
5643 }
5644
5645 fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5646 let name = if self.parse_keyword(CONSTRAINT) {
5647 Some(self.parse_identifier()?)
5648 } else {
5649 None
5650 };
5651
5652 let option = if self.parse_keywords(&[NOT, NULL]) {
5653 ColumnOption::NotNull
5654 } else if self.parse_keyword(NULL) {
5655 ColumnOption::Null
5656 } else if self.parse_keyword(DEFAULT) {
5657 ColumnOption::Default(self.parse_expr()?)
5658 } else if self.parse_keywords(&[PRIMARY, KEY]) {
5659 ColumnOption::Unique { is_primary: true }
5660 } else if self.parse_keyword(UNIQUE) {
5661 ColumnOption::Unique { is_primary: false }
5662 } else if self.parse_keyword(REFERENCES) {
5663 let foreign_table = self.parse_item_name()?;
5664 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5665 ColumnOption::ForeignKey {
5666 foreign_table,
5667 referred_columns,
5668 }
5669 } else if self.parse_keyword(CHECK) {
5670 self.expect_token(&Token::LParen)?;
5671 let expr = self.parse_expr()?;
5672 self.expect_token(&Token::RParen)?;
5673 ColumnOption::Check(expr)
5674 } else if self.parse_keyword(VERSION) {
5675 self.expect_keyword(ADDED)?;
5676 let action = ColumnVersioned::Added;
5677 let version = self.parse_version()?;
5678
5679 ColumnOption::Versioned { action, version }
5680 } else {
5681 return self.expected(self.peek_pos(), "column option", self.peek_token());
5682 };
5683
5684 Ok(ColumnOptionDef { name, option })
5685 }
5686
5687 fn parse_optional_table_constraint(
5688 &mut self,
5689 ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5690 let name = if self.parse_keyword(CONSTRAINT) {
5691 Some(self.parse_identifier()?)
5692 } else {
5693 None
5694 };
5695 match self.next_token() {
5696 Some(Token::Keyword(PRIMARY)) => {
5697 self.expect_keyword(KEY)?;
5698 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5699 Ok(Some(TableConstraint::Unique {
5700 name,
5701 columns,
5702 is_primary: true,
5703 nulls_not_distinct: false,
5704 }))
5705 }
5706 Some(Token::Keyword(UNIQUE)) => {
5707 let nulls_not_distinct = if self.parse_keyword(NULLS) {
5708 self.expect_keywords(&[NOT, DISTINCT])?;
5709 true
5710 } else {
5711 false
5712 };
5713
5714 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5715 Ok(Some(TableConstraint::Unique {
5716 name,
5717 columns,
5718 is_primary: false,
5719 nulls_not_distinct,
5720 }))
5721 }
5722 Some(Token::Keyword(FOREIGN)) => {
5723 self.expect_keyword(KEY)?;
5724 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5725 self.expect_keyword(REFERENCES)?;
5726 let foreign_table = self.parse_raw_name()?;
5727 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5728 Ok(Some(TableConstraint::ForeignKey {
5729 name,
5730 columns,
5731 foreign_table,
5732 referred_columns,
5733 }))
5734 }
5735 Some(Token::Keyword(CHECK)) => {
5736 self.expect_token(&Token::LParen)?;
5737 let expr = Box::new(self.parse_expr()?);
5738 self.expect_token(&Token::RParen)?;
5739 Ok(Some(TableConstraint::Check { name, expr }))
5740 }
5741 unexpected => {
5742 if name.is_some() {
5743 self.expected(
5744 self.peek_prev_pos(),
5745 "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5746 unexpected,
5747 )
5748 } else {
5749 self.prev_token();
5750 Ok(None)
5751 }
5752 }
5753 }
5754 }
5755
5756 fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5757 let _ = self.consume_token(&Token::Eq);
5758 Ok(WithOptionValue::Item(self.parse_raw_name()?))
5759 }
5760
5761 fn parse_optional_connection_credential_option_value(
5762 &mut self,
5763 ) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5764 match self.peek_token() {
5765 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5766 _ => {
5767 let _ = self.consume_token(&Token::Eq);
5768 Ok(Some(self.parse_connection_credential_option_value()?))
5769 }
5770 }
5771 }
5772
5773 fn parse_connection_credential_option_value(
5774 &mut self,
5775 ) -> Result<WithOptionValue<Raw>, ParserError> {
5776 if self.parse_keyword(SECRET) {
5777 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5778 Ok(WithOptionValue::Secret(secret))
5779 } else {
5780 Ok(WithOptionValue::Value(Value::String("secret".to_string())))
5781 }
5782 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5783 Ok(WithOptionValue::Value(value))
5784 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
5785 Ok(WithOptionValue::Value(Value::String(ident.into_string())))
5786 } else {
5787 self.expected(
5788 self.peek_pos(),
5789 "connection credential value",
5790 self.peek_token(),
5791 )
5792 }
5793 }
5794
5795 fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5796 match self.peek_token() {
5801 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5802 _ => {
5803 let _ = self.consume_token(&Token::Eq);
5804 Ok(Some(self.parse_option_value()?))
5805 }
5806 }
5807 }
5808
5809 fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5810 where
5811 F: FnMut(&mut Self) -> Result<T, ParserError>,
5812 {
5813 Ok(if self.consume_token(&Token::LParen) {
5814 let options = if self.consume_token(&Token::RParen) {
5815 vec![]
5816 } else {
5817 let options = self.parse_comma_separated(f)?;
5818 self.expect_token(&Token::RParen)?;
5819 options
5820 };
5821
5822 Some(options)
5823 } else if self.consume_token(&Token::LBracket) {
5824 let options = if self.consume_token(&Token::RBracket) {
5825 vec![]
5826 } else {
5827 let options = self.parse_comma_separated(f)?;
5828
5829 self.expect_token(&Token::RBracket)?;
5830 options
5831 };
5832
5833 Some(options)
5834 } else {
5835 None
5836 })
5837 }
5838
5839 fn parse_option_map(
5840 &mut self,
5841 ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5842 if !(self.peek_keyword(MAP) && self.peek_nth_token(1) == Some(Token::LBracket)) {
5849 return Ok(None);
5850 }
5851 Ok(if self.parse_keyword(MAP) {
5852 self.expect_token(&Token::LBracket)?;
5853 let mut map = BTreeMap::new();
5854 loop {
5855 if let Some(Token::RBracket) = self.peek_token() {
5856 break;
5857 }
5858 let key = match self.next_token() {
5859 Some(Token::String(s)) => s,
5860 token => return self.expected(self.peek_pos(), "string", token),
5861 };
5862 self.expect_token(&Token::Arrow)?;
5863 let value = Parser::parse_option_value(self)?;
5864 map.insert(key, value);
5865 if !self.consume_token(&Token::Comma) {
5866 break;
5867 }
5868 }
5869 self.expect_token(&Token::RBracket)?;
5870 Some(map)
5871 } else {
5872 None
5873 })
5874 }
5875
5876 fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5877 if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5878 Ok(WithOptionValue::Sequence(seq))
5879 } else if let Some(map) = self.parse_option_map()? {
5880 Ok(WithOptionValue::Map(map))
5881 } else if self.parse_keyword(SECRET) {
5882 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5883 Ok(WithOptionValue::Secret(secret))
5884 } else {
5885 Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5886 vec![ident!("secret")],
5887 )))
5888 }
5889 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5890 Ok(WithOptionValue::Value(value))
5891 } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5892 Ok(WithOptionValue::UnresolvedItemName(item_name))
5893 } else {
5894 self.expected(self.peek_pos(), "option value", self.peek_token())
5895 }
5896 }
5897
5898 fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5899 let _ = self.consume_token(&Token::Eq);
5900 Ok(WithOptionValue::DataType(self.parse_data_type()?))
5901 }
5902
5903 fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5904 if self.parse_keyword(SYSTEM) {
5905 self.parse_alter_system()
5906 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5907 self.parse_alter_default_privileges()
5908 .map_parser_err(StatementKind::AlterDefaultPrivileges)
5909 } else {
5910 self.parse_alter_object()
5911 }
5912 }
5913
5914 fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5915 let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5916
5917 match object_type {
5918 ObjectType::Role => self
5919 .parse_alter_role()
5920 .map_parser_err(StatementKind::AlterRole),
5921 ObjectType::Sink => self.parse_alter_sink(),
5922 ObjectType::Source => self.parse_alter_source(),
5923 ObjectType::Index => self.parse_alter_index(),
5924 ObjectType::Secret => self.parse_alter_secret(),
5925 ObjectType::Connection => self.parse_alter_connection(),
5926 ObjectType::View | ObjectType::MaterializedView | ObjectType::Table => {
5927 self.parse_alter_views(object_type)
5928 }
5929 ObjectType::Type => {
5930 let if_exists = self
5931 .parse_if_exists()
5932 .map_parser_err(StatementKind::AlterOwner)?;
5933 let name = UnresolvedObjectName::Item(
5934 self.parse_item_name()
5935 .map_parser_err(StatementKind::AlterOwner)?,
5936 );
5937 self.expect_keywords(&[OWNER, TO])
5938 .map_parser_err(StatementKind::AlterOwner)?;
5939 let new_owner = self
5940 .parse_identifier()
5941 .map_parser_err(StatementKind::AlterOwner)?;
5942 Ok(Statement::AlterOwner(AlterOwnerStatement {
5943 object_type,
5944 if_exists,
5945 name,
5946 new_owner,
5947 }))
5948 }
5949 ObjectType::Cluster => self.parse_alter_cluster(object_type),
5950 ObjectType::ClusterReplica => {
5951 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5952 let name = UnresolvedObjectName::ClusterReplica(
5953 self.parse_cluster_replica_name()
5954 .map_no_statement_parser_err()?,
5955 );
5956 let action = self
5957 .expect_one_of_keywords(&[OWNER, RENAME])
5958 .map_no_statement_parser_err()?;
5959 self.expect_keyword(TO).map_no_statement_parser_err()?;
5960 match action {
5961 OWNER => {
5962 let new_owner = self
5963 .parse_identifier()
5964 .map_parser_err(StatementKind::AlterOwner)?;
5965 Ok(Statement::AlterOwner(AlterOwnerStatement {
5966 object_type,
5967 if_exists,
5968 name,
5969 new_owner,
5970 }))
5971 }
5972 RENAME => {
5973 let to_item_name = self
5974 .parse_identifier()
5975 .map_parser_err(StatementKind::AlterObjectRename)?;
5976 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5977 object_type,
5978 if_exists,
5979 name,
5980 to_item_name,
5981 }))
5982 }
5983 _ => unreachable!(),
5984 }
5985 }
5986 ObjectType::Database => {
5987 let if_exists = self
5988 .parse_if_exists()
5989 .map_parser_err(StatementKind::AlterOwner)?;
5990 let name = UnresolvedObjectName::Database(
5991 self.parse_database_name()
5992 .map_parser_err(StatementKind::AlterOwner)?,
5993 );
5994 self.expect_keywords(&[OWNER, TO])
5995 .map_parser_err(StatementKind::AlterOwner)?;
5996 let new_owner = self
5997 .parse_identifier()
5998 .map_parser_err(StatementKind::AlterOwner)?;
5999 Ok(Statement::AlterOwner(AlterOwnerStatement {
6000 object_type,
6001 if_exists,
6002 name,
6003 new_owner,
6004 }))
6005 }
6006 ObjectType::Schema => self.parse_alter_schema(object_type),
6007 ObjectType::NetworkPolicy => self
6008 .parse_alter_network_policy()
6009 .map_parser_err(StatementKind::AlterNetworkPolicy),
6010 ObjectType::Func | ObjectType::Subsource | ObjectType::MetricSink => parser_err!(
6014 self,
6015 self.peek_prev_pos(),
6016 format!("Unsupported ALTER on {object_type}")
6017 )
6018 .map_no_statement_parser_err(),
6019 }
6020 }
6021
6022 fn parse_alter_cluster(
6023 &mut self,
6024 object_type: ObjectType,
6025 ) -> Result<Statement<Raw>, ParserStatementError> {
6026 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6027 let name = self.parse_identifier().map_no_statement_parser_err()?;
6028 let action = self
6029 .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
6030 .map_no_statement_parser_err()?;
6031 match action {
6032 OWNER => {
6033 self.expect_keyword(TO)
6034 .map_parser_err(StatementKind::AlterOwner)?;
6035 let new_owner = self
6036 .parse_identifier()
6037 .map_parser_err(StatementKind::AlterOwner)?;
6038 let name = UnresolvedObjectName::Cluster(name);
6039 Ok(Statement::AlterOwner(AlterOwnerStatement {
6040 object_type,
6041 if_exists,
6042 name,
6043 new_owner,
6044 }))
6045 }
6046 RENAME => {
6047 self.expect_keyword(TO)
6048 .map_parser_err(StatementKind::AlterObjectRename)?;
6049 let to_item_name = self
6050 .parse_identifier()
6051 .map_parser_err(StatementKind::AlterObjectRename)?;
6052 let name = UnresolvedObjectName::Cluster(name);
6053 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6054 object_type,
6055 if_exists,
6056 name,
6057 to_item_name,
6058 }))
6059 }
6060 RESET => {
6061 self.expect_token(&Token::LParen)
6062 .map_parser_err(StatementKind::AlterCluster)?;
6063 let names = self
6064 .parse_comma_separated(Parser::parse_cluster_option_name)
6065 .map_parser_err(StatementKind::AlterCluster)?;
6066 self.expect_token(&Token::RParen)
6067 .map_parser_err(StatementKind::AlterCluster)?;
6068 Ok(Statement::AlterCluster(AlterClusterStatement {
6069 if_exists,
6070 name,
6071 action: AlterClusterAction::ResetOptions(names),
6072 }))
6073 }
6074 SET => {
6075 self.expect_token(&Token::LParen)
6076 .map_parser_err(StatementKind::AlterCluster)?;
6077 let options = self
6078 .parse_comma_separated(Parser::parse_cluster_option)
6079 .map_parser_err(StatementKind::AlterCluster)?;
6080 self.expect_token(&Token::RParen)
6081 .map_parser_err(StatementKind::AlterCluster)?;
6082 let with_options = if self.parse_keyword(WITH) {
6083 self.expect_token(&Token::LParen)
6084 .map_parser_err(StatementKind::AlterCluster)?;
6085 let options = self
6086 .parse_comma_separated(Parser::parse_alter_cluster_option)
6087 .map_parser_err(StatementKind::AlterCluster)?;
6088 self.expect_token(&Token::RParen)
6089 .map_parser_err(StatementKind::AlterCluster)?;
6090 options
6091 } else {
6092 vec![]
6093 };
6094 Ok(Statement::AlterCluster(AlterClusterStatement {
6095 if_exists,
6096 name,
6097 action: AlterClusterAction::SetOptions {
6098 options,
6099 with_options,
6100 },
6101 }))
6102 }
6103 SWAP => {
6104 self.expect_keyword(WITH)
6105 .map_parser_err(StatementKind::AlterObjectSwap)?;
6106 let name_b = self
6107 .parse_identifier()
6108 .map_parser_err(StatementKind::AlterObjectSwap)?;
6109
6110 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6111 object_type,
6112 if_exists,
6113 name_a: UnresolvedObjectName::Cluster(name),
6114 name_b,
6115 }))
6116 }
6117 _ => unreachable!(),
6118 }
6119 }
6120
6121 fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6122 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6123 let source_name = self.parse_item_name().map_no_statement_parser_err()?;
6124
6125 Ok(
6126 match self
6127 .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
6128 .map_no_statement_parser_err()?
6129 {
6130 ADD => {
6131 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6132 .map_parser_err(StatementKind::AlterSource)?;
6133
6134 let subsources = self
6136 .parse_comma_separated(Parser::parse_subsource_references)
6137 .map_parser_err(StatementKind::AlterSource)?;
6138
6139 let options = if self.parse_keyword(WITH) {
6140 self.expect_token(&Token::LParen)
6141 .map_parser_err(StatementKind::AlterSource)?;
6142 let options = self
6143 .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
6144 .map_parser_err(StatementKind::AlterSource)?;
6145 self.expect_token(&Token::RParen)
6146 .map_parser_err(StatementKind::AlterSource)?;
6147 options
6148 } else {
6149 vec![]
6150 };
6151
6152 Statement::AlterSource(AlterSourceStatement {
6153 source_name,
6154 if_exists,
6155 action: AlterSourceAction::AddSubsources {
6156 external_references: subsources,
6157 options,
6158 },
6159 })
6160 }
6161 DROP => {
6162 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6163 .map_parser_err(StatementKind::AlterSource)?;
6164
6165 let if_exists_inner = self
6166 .parse_if_exists()
6167 .map_parser_err(StatementKind::AlterSource)?;
6168
6169 let names = self
6170 .parse_comma_separated(Parser::parse_item_name)
6171 .map_parser_err(StatementKind::AlterSource)?;
6172
6173 let cascade = matches!(
6174 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
6175 .map_parser_err(StatementKind::AlterSource)?,
6176 Some(CASCADE),
6177 );
6178
6179 Statement::AlterSource(AlterSourceStatement {
6180 source_name,
6181 if_exists,
6182 action: AlterSourceAction::DropSubsources {
6183 if_exists: if_exists_inner,
6184 cascade,
6185 names,
6186 },
6187 })
6188 }
6189 RESET => {
6190 self.expect_token(&Token::LParen)
6191 .map_parser_err(StatementKind::AlterSource)?;
6192 let reset_options = self
6193 .parse_comma_separated(Parser::parse_source_option_name)
6194 .map_parser_err(StatementKind::AlterSource)?;
6195 self.expect_token(&Token::RParen)
6196 .map_parser_err(StatementKind::AlterSource)?;
6197
6198 Statement::AlterSource(AlterSourceStatement {
6199 source_name,
6200 if_exists,
6201 action: AlterSourceAction::ResetOptions(reset_options),
6202 })
6203 }
6204 SET => {
6205 if let Some(stmt) = self.maybe_parse_alter_set_cluster(
6206 if_exists,
6207 &source_name,
6208 ObjectType::Source,
6209 ) {
6210 return stmt;
6211 }
6212 self.expect_token(&Token::LParen)
6213 .map_parser_err(StatementKind::AlterSource)?;
6214 let set_options = self
6215 .parse_comma_separated(Parser::parse_source_option)
6216 .map_parser_err(StatementKind::AlterSource)?;
6217 self.expect_token(&Token::RParen)
6218 .map_parser_err(StatementKind::AlterSource)?;
6219 Statement::AlterSource(AlterSourceStatement {
6220 source_name,
6221 if_exists,
6222 action: AlterSourceAction::SetOptions(set_options),
6223 })
6224 }
6225 RENAME => {
6226 self.expect_keyword(TO)
6227 .map_parser_err(StatementKind::AlterObjectRename)?;
6228 let to_item_name = self
6229 .parse_identifier()
6230 .map_parser_err(StatementKind::AlterObjectRename)?;
6231
6232 Statement::AlterObjectRename(AlterObjectRenameStatement {
6233 object_type: ObjectType::Source,
6234 if_exists,
6235 name: UnresolvedObjectName::Item(source_name),
6236 to_item_name,
6237 })
6238 }
6239 OWNER => {
6240 self.expect_keyword(TO)
6241 .map_parser_err(StatementKind::AlterOwner)?;
6242 let new_owner = self
6243 .parse_identifier()
6244 .map_parser_err(StatementKind::AlterOwner)?;
6245
6246 Statement::AlterOwner(AlterOwnerStatement {
6247 object_type: ObjectType::Source,
6248 if_exists,
6249 name: UnresolvedObjectName::Item(source_name),
6250 new_owner,
6251 })
6252 }
6253 REFRESH => {
6254 self.expect_keyword(REFERENCES)
6255 .map_parser_err(StatementKind::AlterSource)?;
6256 Statement::AlterSource(AlterSourceStatement {
6257 source_name,
6258 if_exists,
6259 action: AlterSourceAction::RefreshReferences,
6260 })
6261 }
6262 _ => unreachable!(),
6263 },
6264 )
6265 }
6266
6267 fn parse_alter_source_add_subsource_option(
6268 &mut self,
6269 ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6270 match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6271 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6272 self.expect_keyword(COLUMNS)?;
6273
6274 let _ = self.consume_token(&Token::Eq);
6275
6276 let value = self
6277 .parse_option_sequence(Parser::parse_item_name)?
6278 .map(|inner| {
6279 WithOptionValue::Sequence(
6280 inner
6281 .into_iter()
6282 .map(WithOptionValue::UnresolvedItemName)
6283 .collect_vec(),
6284 )
6285 });
6286
6287 Ok(AlterSourceAddSubsourceOption {
6288 name: match *keyword {
6289 TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6290 EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6292 _ => unreachable!(),
6293 },
6294 value,
6295 })
6296 }
6297 _ => unreachable!(),
6298 }
6299 }
6300
6301 fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6302 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6303 let name = self.parse_item_name().map_no_statement_parser_err()?;
6304
6305 Ok(
6306 match self
6307 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6308 .map_no_statement_parser_err()?
6309 {
6310 RESET => {
6311 self.expect_token(&Token::LParen)
6312 .map_parser_err(StatementKind::AlterIndex)?;
6313 let reset_options = self
6314 .parse_comma_separated(Parser::parse_index_option_name)
6315 .map_parser_err(StatementKind::AlterIndex)?;
6316 self.expect_token(&Token::RParen)
6317 .map_parser_err(StatementKind::AlterIndex)?;
6318
6319 Statement::AlterIndex(AlterIndexStatement {
6320 index_name: name,
6321 if_exists,
6322 action: AlterIndexAction::ResetOptions(reset_options),
6323 })
6324 }
6325 SET => {
6326 self.expect_token(&Token::LParen)
6327 .map_parser_err(StatementKind::AlterIndex)?;
6328 let set_options = self
6329 .parse_comma_separated(Parser::parse_index_option)
6330 .map_parser_err(StatementKind::AlterIndex)?;
6331 self.expect_token(&Token::RParen)
6332 .map_parser_err(StatementKind::AlterIndex)?;
6333 Statement::AlterIndex(AlterIndexStatement {
6334 index_name: name,
6335 if_exists,
6336 action: AlterIndexAction::SetOptions(set_options),
6337 })
6338 }
6339 RENAME => {
6340 self.expect_keyword(TO)
6341 .map_parser_err(StatementKind::AlterObjectRename)?;
6342 let to_item_name = self
6343 .parse_identifier()
6344 .map_parser_err(StatementKind::AlterObjectRename)?;
6345
6346 Statement::AlterObjectRename(AlterObjectRenameStatement {
6347 object_type: ObjectType::Index,
6348 if_exists,
6349 name: UnresolvedObjectName::Item(name),
6350 to_item_name,
6351 })
6352 }
6353 OWNER => {
6354 self.expect_keyword(TO)
6355 .map_parser_err(StatementKind::AlterOwner)?;
6356 let new_owner = self
6357 .parse_identifier()
6358 .map_parser_err(StatementKind::AlterOwner)?;
6359
6360 Statement::AlterOwner(AlterOwnerStatement {
6361 object_type: ObjectType::Index,
6362 if_exists,
6363 name: UnresolvedObjectName::Item(name),
6364 new_owner,
6365 })
6366 }
6367 _ => unreachable!(),
6368 },
6369 )
6370 }
6371
6372 fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6373 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6374 let name = self.parse_item_name().map_no_statement_parser_err()?;
6375
6376 Ok(
6377 match self
6378 .expect_one_of_keywords(&[AS, RENAME, OWNER])
6379 .map_no_statement_parser_err()?
6380 {
6381 AS => {
6382 let value = self
6383 .parse_expr()
6384 .map_parser_err(StatementKind::AlterSecret)?;
6385 Statement::AlterSecret(AlterSecretStatement {
6386 name,
6387 if_exists,
6388 value,
6389 })
6390 }
6391 RENAME => {
6392 self.expect_keyword(TO)
6393 .map_parser_err(StatementKind::AlterObjectRename)?;
6394 let to_item_name = self
6395 .parse_identifier()
6396 .map_parser_err(StatementKind::AlterObjectRename)?;
6397
6398 Statement::AlterObjectRename(AlterObjectRenameStatement {
6399 object_type: ObjectType::Secret,
6400 if_exists,
6401 name: UnresolvedObjectName::Item(name),
6402 to_item_name,
6403 })
6404 }
6405 OWNER => {
6406 self.expect_keyword(TO)
6407 .map_parser_err(StatementKind::AlterOwner)?;
6408 let new_owner = self
6409 .parse_identifier()
6410 .map_parser_err(StatementKind::AlterOwner)?;
6411
6412 Statement::AlterOwner(AlterOwnerStatement {
6413 object_type: ObjectType::Secret,
6414 if_exists,
6415 name: UnresolvedObjectName::Item(name),
6416 new_owner,
6417 })
6418 }
6419 _ => unreachable!(),
6420 },
6421 )
6422 }
6423
6424 fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6426 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6427 let name = self.parse_item_name().map_no_statement_parser_err()?;
6428
6429 Ok(
6430 match self
6431 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6432 .map_no_statement_parser_err()?
6433 {
6434 RESET => {
6435 self.expect_token(&Token::LParen)
6436 .map_parser_err(StatementKind::AlterSink)?;
6437 let reset_options = self
6438 .parse_comma_separated(Parser::parse_create_sink_option_name)
6439 .map_parser_err(StatementKind::AlterSink)?;
6440 self.expect_token(&Token::RParen)
6441 .map_parser_err(StatementKind::AlterSink)?;
6442
6443 Statement::AlterSink(AlterSinkStatement {
6444 sink_name: name,
6445 if_exists,
6446 action: AlterSinkAction::ResetOptions(reset_options),
6447 })
6448 }
6449 SET => {
6450 if let Some(result) =
6451 self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6452 {
6453 return result;
6454 }
6455
6456 if self.parse_keyword(FROM) {
6457 let from = self
6458 .parse_raw_name()
6459 .map_parser_err(StatementKind::AlterSink)?;
6460
6461 Statement::AlterSink(AlterSinkStatement {
6462 sink_name: name,
6463 if_exists,
6464 action: AlterSinkAction::ChangeRelation(from),
6465 })
6466 } else {
6467 self.expect_token(&Token::LParen)
6468 .map_parser_err(StatementKind::AlterSink)?;
6469 let set_options = self
6470 .parse_comma_separated(Parser::parse_create_sink_option)
6471 .map_parser_err(StatementKind::AlterSink)?;
6472 self.expect_token(&Token::RParen)
6473 .map_parser_err(StatementKind::AlterSink)?;
6474 Statement::AlterSink(AlterSinkStatement {
6475 sink_name: name,
6476 if_exists,
6477 action: AlterSinkAction::SetOptions(set_options),
6478 })
6479 }
6480 }
6481 RENAME => {
6482 self.expect_keyword(TO)
6483 .map_parser_err(StatementKind::AlterObjectRename)?;
6484 let to_item_name = self
6485 .parse_identifier()
6486 .map_parser_err(StatementKind::AlterObjectRename)?;
6487
6488 Statement::AlterObjectRename(AlterObjectRenameStatement {
6489 object_type: ObjectType::Sink,
6490 if_exists,
6491 name: UnresolvedObjectName::Item(name),
6492 to_item_name,
6493 })
6494 }
6495 OWNER => {
6496 self.expect_keyword(TO)
6497 .map_parser_err(StatementKind::AlterOwner)?;
6498 let new_owner = self
6499 .parse_identifier()
6500 .map_parser_err(StatementKind::AlterOwner)?;
6501
6502 Statement::AlterOwner(AlterOwnerStatement {
6503 object_type: ObjectType::Sink,
6504 if_exists,
6505 name: UnresolvedObjectName::Item(name),
6506 new_owner,
6507 })
6508 }
6509 _ => unreachable!(),
6510 },
6511 )
6512 }
6513
6514 fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6516 match self
6517 .expect_one_of_keywords(&[SET, RESET])
6518 .map_no_statement_parser_err()?
6519 {
6520 SET => {
6521 let name = self
6522 .parse_identifier()
6523 .map_parser_err(StatementKind::AlterSystemSet)?;
6524 self.expect_keyword_or_token(TO, &Token::Eq)
6525 .map_parser_err(StatementKind::AlterSystemSet)?;
6526 let to = self
6527 .parse_set_variable_to()
6528 .map_parser_err(StatementKind::AlterSystemSet)?;
6529 Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6530 name,
6531 to,
6532 }))
6533 }
6534 RESET => {
6535 if self.parse_keyword(ALL) {
6536 Ok(Statement::AlterSystemResetAll(
6537 AlterSystemResetAllStatement {},
6538 ))
6539 } else {
6540 let name = self
6541 .parse_identifier()
6542 .map_parser_err(StatementKind::AlterSystemReset)?;
6543 Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6544 name,
6545 }))
6546 }
6547 }
6548 _ => unreachable!(),
6549 }
6550 }
6551
6552 fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6553 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6554 let name = self.parse_item_name().map_no_statement_parser_err()?;
6555
6556 Ok(
6557 match self
6558 .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6559 .map_no_statement_parser_err()?
6560 {
6561 RENAME => {
6562 self.expect_keyword(TO)
6563 .map_parser_err(StatementKind::AlterObjectRename)?;
6564 let to_item_name = self
6565 .parse_identifier()
6566 .map_parser_err(StatementKind::AlterObjectRename)?;
6567
6568 Statement::AlterObjectRename(AlterObjectRenameStatement {
6569 object_type: ObjectType::Connection,
6570 if_exists,
6571 name: UnresolvedObjectName::Item(name),
6572 to_item_name,
6573 })
6574 }
6575 OWNER => {
6576 self.expect_keyword(TO)
6577 .map_parser_err(StatementKind::AlterOwner)?;
6578 let new_owner = self
6579 .parse_identifier()
6580 .map_parser_err(StatementKind::AlterOwner)?;
6581
6582 Statement::AlterOwner(AlterOwnerStatement {
6583 object_type: ObjectType::Connection,
6584 if_exists,
6585 name: UnresolvedObjectName::Item(name),
6586 new_owner,
6587 })
6588 }
6589 _ => {
6590 self.prev_token();
6591 let actions = self
6592 .parse_comma_separated(Parser::parse_alter_connection_action)
6593 .map_parser_err(StatementKind::AlterConnection)?;
6594
6595 let with_options = if self.parse_keyword(WITH) {
6596 self.expect_token(&Token::LParen)
6597 .map_parser_err(StatementKind::AlterConnection)?;
6598 let options = self
6599 .parse_comma_separated(Parser::parse_alter_connection_option)
6600 .map_parser_err(StatementKind::AlterConnection)?;
6601 self.expect_token(&Token::RParen)
6602 .map_parser_err(StatementKind::AlterConnection)?;
6603 options
6604 } else {
6605 vec![]
6606 };
6607
6608 Statement::AlterConnection(AlterConnectionStatement {
6609 name,
6610 if_exists,
6611 actions,
6612 with_options,
6613 })
6614 }
6615 },
6616 )
6617 }
6618
6619 fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6620 let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6621 ROTATE => {
6622 self.expect_keyword(KEYS)?;
6623 AlterConnectionAction::RotateKeys
6624 }
6625 SET => {
6626 self.expect_token(&Token::LParen)?;
6627 let option = self.parse_connection_option_unified()?;
6628 self.expect_token(&Token::RParen)?;
6629 AlterConnectionAction::SetOption(option)
6630 }
6631 DROP | RESET => {
6632 self.expect_token(&Token::LParen)?;
6633 let option = self.parse_connection_option_name()?;
6634 self.expect_token(&Token::RParen)?;
6635 AlterConnectionAction::DropOption(option)
6636 }
6637 _ => unreachable!(),
6638 };
6639
6640 Ok(r)
6641 }
6642
6643 fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6645 let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6646 VALIDATE => AlterConnectionOptionName::Validate,
6647 _ => unreachable!(),
6648 };
6649
6650 Ok(AlterConnectionOption {
6651 name,
6652 value: self.parse_optional_option_value()?,
6653 })
6654 }
6655
6656 fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6657 let name = self.parse_identifier()?;
6658
6659 let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6660 Some(SET) => {
6661 let name = self.parse_identifier()?;
6662 self.expect_keyword_or_token(TO, &Token::Eq)?;
6663 let value = self.parse_set_variable_to()?;
6664 let var = SetRoleVar::Set { name, value };
6665 AlterRoleOption::Variable(var)
6666 }
6667 Some(RESET) => {
6668 let name = self.parse_identifier()?;
6669 let var = SetRoleVar::Reset { name };
6670 AlterRoleOption::Variable(var)
6671 }
6672 Some(WITH) | None => {
6673 let _ = self.parse_keyword(WITH);
6674 let attrs = self.parse_role_attributes()?;
6675 AlterRoleOption::Attributes(attrs)
6676 }
6677 Some(k) => unreachable!("unmatched keyword: {k}"),
6678 };
6679
6680 Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6681 }
6682
6683 fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6684 self.expect_keyword(FOR)?;
6685 let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6686 ROLE | USER => TargetRoleSpecification::Roles(
6687 self.parse_comma_separated(Parser::parse_identifier)?,
6688 ),
6689 ALL => {
6690 self.expect_keyword(ROLES)?;
6691 TargetRoleSpecification::AllRoles
6692 }
6693 _ => unreachable!(),
6694 };
6695 let target_objects = if self.parse_keyword(IN) {
6696 match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6697 SCHEMA => GrantTargetAllSpecification::AllSchemas {
6698 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6699 },
6700 DATABASE => GrantTargetAllSpecification::AllDatabases {
6701 databases: self.parse_comma_separated(Parser::parse_database_name)?,
6702 },
6703 _ => unreachable!(),
6704 }
6705 } else {
6706 GrantTargetAllSpecification::All
6707 };
6708 let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6709 let privileges = self.parse_privilege_specification().ok_or_else(|| {
6710 self.expected::<_, PrivilegeSpecification>(
6711 self.peek_pos(),
6712 "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6713 self.peek_token(),
6714 )
6715 .expect_err("only returns errors")
6716 })?;
6717 self.expect_keyword(ON)?;
6718 let object_type =
6719 self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6720 if is_grant {
6721 self.expect_keyword(TO)?;
6722 } else {
6723 self.expect_keyword(FROM)?;
6724 }
6725 let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6726
6727 let grant_or_revoke = if is_grant {
6728 AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6729 privileges,
6730 object_type,
6731 grantees,
6732 })
6733 } else {
6734 AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6735 privileges,
6736 object_type,
6737 revokees: grantees,
6738 })
6739 };
6740
6741 Ok(Statement::AlterDefaultPrivileges(
6742 AlterDefaultPrivilegesStatement {
6743 target_roles,
6744 target_objects,
6745 grant_or_revoke,
6746 },
6747 ))
6748 }
6749
6750 fn parse_alter_views(
6751 &mut self,
6752 object_type: ObjectType,
6753 ) -> Result<Statement<Raw>, ParserStatementError> {
6754 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6755 let name = self.parse_item_name().map_no_statement_parser_err()?;
6756 let keywords: &[_] = match object_type {
6757 ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6758 ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6759 ObjectType::View => &[SET, RENAME, OWNER, RESET],
6760 ObjectType::Source
6761 | ObjectType::Sink
6762 | ObjectType::MetricSink
6763 | ObjectType::Index
6764 | ObjectType::Type
6765 | ObjectType::Role
6766 | ObjectType::Cluster
6767 | ObjectType::ClusterReplica
6768 | ObjectType::Secret
6769 | ObjectType::Connection
6770 | ObjectType::Database
6771 | ObjectType::Schema
6772 | ObjectType::Func
6773 | ObjectType::Subsource
6774 | ObjectType::NetworkPolicy => {
6775 unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6776 }
6777 };
6778
6779 let action = self
6780 .expect_one_of_keywords(keywords)
6781 .map_no_statement_parser_err()?;
6782 match action {
6783 RENAME => {
6784 self.expect_keyword(TO).map_no_statement_parser_err()?;
6785 let to_item_name = self
6786 .parse_identifier()
6787 .map_parser_err(StatementKind::AlterObjectRename)?;
6788 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6789 object_type,
6790 if_exists,
6791 name: UnresolvedObjectName::Item(name),
6792 to_item_name,
6793 }))
6794 }
6795 SET => {
6796 if self.parse_keyword(CLUSTER) {
6797 self.parse_alter_set_cluster(if_exists, name, object_type)
6798 } else {
6799 self.expect_token(&Token::LParen)
6800 .map_no_statement_parser_err()?;
6801 self.expect_keywords(&[RETAIN, HISTORY])
6802 .map_parser_err(StatementKind::AlterRetainHistory)?;
6803 let history = self
6804 .parse_retain_history()
6805 .map_parser_err(StatementKind::AlterRetainHistory)?;
6806 self.expect_token(&Token::RParen)
6807 .map_parser_err(StatementKind::AlterCluster)?;
6808 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6809 object_type,
6810 if_exists,
6811 name: UnresolvedObjectName::Item(name),
6812 history: Some(history),
6813 }))
6814 }
6815 }
6816 RESET => {
6817 self.expect_token(&Token::LParen)
6818 .map_no_statement_parser_err()?;
6819 self.expect_keywords(&[RETAIN, HISTORY])
6820 .map_parser_err(StatementKind::AlterRetainHistory)?;
6821 self.expect_token(&Token::RParen)
6822 .map_no_statement_parser_err()?;
6823 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6824 object_type,
6825 if_exists,
6826 name: UnresolvedObjectName::Item(name),
6827 history: None,
6828 }))
6829 }
6830 OWNER => {
6831 self.expect_keyword(TO).map_no_statement_parser_err()?;
6832 let new_owner = self
6833 .parse_identifier()
6834 .map_parser_err(StatementKind::AlterOwner)?;
6835 Ok(Statement::AlterOwner(AlterOwnerStatement {
6836 object_type,
6837 if_exists,
6838 name: UnresolvedObjectName::Item(name),
6839 new_owner,
6840 }))
6841 }
6842 ADD => {
6843 assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6844
6845 self.expect_keyword(COLUMN)
6846 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6847 let if_col_not_exist = self
6848 .parse_if_not_exists()
6849 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6850 let column_name = self
6851 .parse_identifier()
6852 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6853 let data_type = self
6854 .parse_data_type()
6855 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6856
6857 Ok(Statement::AlterTableAddColumn(
6858 AlterTableAddColumnStatement {
6859 if_exists,
6860 name,
6861 if_col_not_exist,
6862 column_name,
6863 data_type,
6864 },
6865 ))
6866 }
6867 APPLY => {
6868 assert_eq!(
6869 object_type,
6870 ObjectType::MaterializedView,
6871 "checked object_type above",
6872 );
6873
6874 self.expect_keyword(REPLACEMENT)
6875 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6876
6877 let replacement_name = self
6878 .parse_item_name()
6879 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6880
6881 Ok(Statement::AlterMaterializedViewApplyReplacement(
6882 AlterMaterializedViewApplyReplacementStatement {
6883 if_exists,
6884 name,
6885 replacement_name,
6886 },
6887 ))
6888 }
6889 _ => unreachable!(),
6890 }
6891 }
6892
6893 fn parse_alter_schema(
6894 &mut self,
6895 object_type: ObjectType,
6896 ) -> Result<Statement<Raw>, ParserStatementError> {
6897 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6898 let name = self.parse_schema_name().map_no_statement_parser_err()?;
6899 let name = UnresolvedObjectName::Schema(name);
6900 let action = self
6901 .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6902 .map_no_statement_parser_err()?;
6903
6904 match action {
6905 OWNER => {
6906 self.expect_keyword(TO)
6907 .map_parser_err(StatementKind::AlterOwner)?;
6908 let new_owner = self
6909 .parse_identifier()
6910 .map_parser_err(StatementKind::AlterOwner)?;
6911
6912 Ok(Statement::AlterOwner(AlterOwnerStatement {
6913 object_type,
6914 if_exists,
6915 name,
6916 new_owner,
6917 }))
6918 }
6919 RENAME => {
6920 self.expect_keyword(TO)
6921 .map_parser_err(StatementKind::AlterObjectRename)?;
6922 let to_item_name = self
6923 .parse_identifier()
6924 .map_parser_err(StatementKind::AlterObjectRename)?;
6925
6926 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6927 object_type,
6928 if_exists,
6929 name,
6930 to_item_name,
6931 }))
6932 }
6933 SWAP => {
6934 self.expect_keyword(WITH)
6935 .map_parser_err(StatementKind::AlterObjectSwap)?;
6936 let name_b = self
6937 .parse_identifier()
6938 .map_parser_err(StatementKind::AlterObjectSwap)?;
6939
6940 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6941 object_type,
6942 if_exists,
6943 name_a: name,
6944 name_b,
6945 }))
6946 }
6947 k => unreachable!("programming error, unmatched {k}"),
6948 }
6949 }
6950
6951 fn maybe_parse_alter_set_cluster(
6953 &mut self,
6954 if_exists: bool,
6955 name: &UnresolvedItemName,
6956 object_type: ObjectType,
6957 ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6958 if self.parse_keyword(CLUSTER) {
6959 Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6960 } else {
6961 None
6962 }
6963 }
6964
6965 fn parse_alter_set_cluster(
6967 &mut self,
6968 if_exists: bool,
6969 name: UnresolvedItemName,
6970 object_type: ObjectType,
6971 ) -> Result<Statement<Raw>, ParserStatementError> {
6972 let set_cluster = self
6973 .parse_raw_ident()
6974 .map_parser_err(StatementKind::AlterSetCluster)?;
6975 Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6976 name,
6977 if_exists,
6978 set_cluster,
6979 object_type,
6980 }))
6981 }
6982
6983 fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6985 let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6987 Some(self.peek_prev_pos())
6988 } else {
6989 None
6990 };
6991
6992 let relation = if self.consume_token(&Token::LParen) {
6993 let query = self.parse_statement()?.ast;
6994 self.expect_token(&Token::RParen)
6995 .map_parser_err(StatementKind::Copy)?;
6996 match query {
6997 Statement::Select(stmt) => CopyRelation::Select(stmt),
6998 Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6999 _ => {
7000 return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
7001 .map_parser_err(StatementKind::Copy);
7002 }
7003 }
7004 } else {
7005 let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
7006 let columns = self
7007 .parse_parenthesized_column_list(Optional)
7008 .map_parser_err(StatementKind::Copy)?;
7009 CopyRelation::Named { name, columns }
7010 };
7011 let (direction, target) = match self
7012 .expect_one_of_keywords(&[FROM, TO])
7013 .map_parser_err(StatementKind::Copy)?
7014 {
7015 FROM => {
7016 if let CopyRelation::Named { .. } = relation {
7017 } else {
7019 return parser_err!(
7020 self,
7021 self.peek_prev_pos(),
7022 "queries not allowed in COPY FROM"
7023 )
7024 .map_no_statement_parser_err();
7025 }
7026 if self.parse_keyword(STDIN) {
7027 (CopyDirection::From, CopyTarget::Stdin)
7028 } else {
7029 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
7030 (CopyDirection::From, CopyTarget::Expr(url_expr))
7031 }
7032 }
7033 TO => {
7034 if let Some(into_pos) = maybe_into_pos {
7036 return self
7037 .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
7038 .map_parser_err(StatementKind::Copy);
7039 }
7040
7041 if self.parse_keyword(STDOUT) {
7042 (CopyDirection::To, CopyTarget::Stdout)
7043 } else {
7044 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
7045 (CopyDirection::To, CopyTarget::Expr(url_expr))
7046 }
7047 }
7048 _ => unreachable!(),
7049 };
7050 let has_options = if self.parse_keyword(WITH) {
7054 self.expect_token(&Token::LParen)
7055 .map_parser_err(StatementKind::Copy)?;
7056 true
7057 } else {
7058 self.consume_token(&Token::LParen)
7059 };
7060 let options = if has_options {
7061 let o = self
7062 .parse_comma_separated(Parser::parse_copy_option)
7063 .map_parser_err(StatementKind::Copy)?;
7064 self.expect_token(&Token::RParen)
7065 .map_parser_err(StatementKind::Copy)?;
7066 o
7067 } else {
7068 vec![]
7069 };
7070 Ok(Statement::Copy(CopyStatement {
7071 relation,
7072 direction,
7073 target,
7074 options,
7075 }))
7076 }
7077
7078 fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
7079 let name = match self.expect_one_of_keywords(&[
7080 FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
7081 ])? {
7082 FORMAT => CopyOptionName::Format,
7083 DELIMITER => CopyOptionName::Delimiter,
7084 NULL => CopyOptionName::Null,
7085 ESCAPE => CopyOptionName::Escape,
7086 QUOTE => CopyOptionName::Quote,
7087 HEADER => CopyOptionName::Header,
7088 AWS => {
7089 self.expect_keyword(CONNECTION)?;
7090 return Ok(CopyOption {
7091 name: CopyOptionName::AwsConnection,
7092 value: Some(self.parse_object_option_value()?),
7093 });
7094 }
7095 MAX => {
7096 self.expect_keywords(&[FILE, SIZE])?;
7097 CopyOptionName::MaxFileSize
7098 }
7099 FILES => CopyOptionName::Files,
7100 PATTERN => CopyOptionName::Pattern,
7101 _ => unreachable!(),
7102 };
7103 Ok(CopyOption {
7104 name,
7105 value: self.parse_optional_option_value()?,
7106 })
7107 }
7108
7109 fn parse_value(&mut self) -> Result<Value, ParserError> {
7111 match self.next_token() {
7112 Some(t) => match t {
7113 Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
7114 Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
7115 Token::Keyword(NULL) => Ok(Value::Null),
7116 Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
7117 Token::Keyword(kw) => {
7118 parser_err!(
7119 self,
7120 self.peek_prev_pos(),
7121 format!("No value parser for keyword {}", kw)
7122 )
7123 }
7124 Token::Op(ref op) if op == "-" => match self.next_token() {
7125 Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
7126 other => self.expected(self.peek_prev_pos(), "literal int", other),
7127 },
7128 Token::Number(ref n) => Ok(Value::Number(n.to_string())),
7129 Token::String(ref s) => Ok(Value::String(s.to_string())),
7130 Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
7131 _ => parser_err!(
7132 self,
7133 self.peek_prev_pos(),
7134 format!("Unsupported value: {:?}", t)
7135 ),
7136 },
7137 None => parser_err!(
7138 self,
7139 self.peek_prev_pos(),
7140 "Expecting a value, but found EOF"
7141 ),
7142 }
7143 }
7144
7145 fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
7146 if self.consume_token(&Token::LParen) {
7147 let subquery = self.parse_query()?;
7148 self.expect_token(&Token::RParen)?;
7149 Ok(Expr::ArraySubquery(Box::new(subquery)))
7150 } else {
7151 self.parse_sequence(Self::parse_array).map(Expr::Array)
7152 }
7153 }
7154
7155 fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
7156 if self.consume_token(&Token::LParen) {
7157 let subquery = self.parse_query()?;
7158 self.expect_token(&Token::RParen)?;
7159 Ok(Expr::ListSubquery(Box::new(subquery)))
7160 } else {
7161 self.parse_sequence(Self::parse_list).map(Expr::List)
7162 }
7163 }
7164
7165 fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
7166 if self.consume_token(&Token::LParen) {
7167 let subquery = self.parse_query()?;
7168 self.expect_token(&Token::RParen)?;
7169 return Ok(Expr::MapSubquery(Box::new(subquery)));
7170 }
7171
7172 self.expect_token(&Token::LBracket)?;
7173 let mut exprs = vec![];
7174 loop {
7175 if let Some(Token::RBracket) = self.peek_token() {
7176 break;
7177 }
7178 let key = self.parse_expr()?;
7179 self.expect_token(&Token::Arrow)?;
7180 let value = if let Some(Token::LBracket) = self.peek_token() {
7181 self.parse_map()?
7182 } else {
7183 self.parse_expr()?
7184 };
7185 exprs.push(MapEntry { key, value });
7186 if !self.consume_token(&Token::Comma) {
7187 break;
7188 }
7189 }
7190 self.expect_token(&Token::RBracket)?;
7191 Ok(Expr::Map(exprs))
7192 }
7193
7194 fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
7195 where
7196 F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
7197 {
7198 self.expect_token(&Token::LBracket)?;
7199 let mut exprs = vec![];
7200 loop {
7201 if let Some(Token::RBracket) = self.peek_token() {
7202 break;
7203 }
7204 let expr = if let Some(Token::LBracket) = self.peek_token() {
7205 f(self)?
7206 } else {
7207 self.parse_expr()?
7208 };
7209 exprs.push(expr);
7210 if !self.consume_token(&Token::Comma) {
7211 break;
7212 }
7213 }
7214 self.expect_token(&Token::RBracket)?;
7215 Ok(exprs)
7216 }
7217
7218 fn parse_number_value(&mut self) -> Result<Value, ParserError> {
7219 match self.parse_value()? {
7220 v @ Value::Number(_) => Ok(v),
7221 _ => {
7222 self.prev_token();
7223 self.expected(self.peek_pos(), "literal number", self.peek_token())
7224 }
7225 }
7226 }
7227
7228 fn parse_version(&mut self) -> Result<Version, ParserError> {
7229 let version = self.parse_literal_uint()?;
7230 Ok(Version(version))
7231 }
7232
7233 fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7235 let negative = self.consume_token(&Token::Op("-".into()));
7236 match self.next_token() {
7237 Some(Token::Number(s)) => {
7238 let n = s.parse::<i64>().map_err(|e| {
7239 self.error(
7240 self.peek_prev_pos(),
7241 format!("Could not parse '{}' as i64: {}", s, e),
7242 )
7243 })?;
7244 if negative {
7245 n.checked_neg().ok_or_else(|| {
7246 self.error(
7247 self.peek_prev_pos(),
7248 format!("Could not parse '{}' as i64: overflows i64", s),
7249 )
7250 })
7251 } else {
7252 Ok(n)
7253 }
7254 }
7255 other => self.expected(self.peek_prev_pos(), "literal integer", other),
7256 }
7257 }
7258
7259 fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7261 match self.next_token() {
7262 Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7263 self.error(
7264 self.peek_prev_pos(),
7265 format!("Could not parse '{}' as u64: {}", s, e),
7266 )
7267 }),
7268 other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7269 }
7270 }
7271
7272 fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7274 match self.next_token() {
7275 Some(Token::String(ref s)) => Ok(s.clone()),
7276 other => self.expected(self.peek_prev_pos(), "literal string", other),
7277 }
7278 }
7279
7280 fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7282 let other = |ident| RawDataType::Other {
7283 name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7284 typ_mod: vec![],
7285 };
7286
7287 let mut data_type = match self.next_token() {
7288 Some(Token::Keyword(kw)) => match kw {
7289 CHAR | CHARACTER => {
7291 let name = if self.parse_keyword(VARYING) {
7292 ident!("varchar")
7293 } else {
7294 ident!("bpchar")
7295 };
7296 RawDataType::Other {
7297 name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7298 typ_mod: self.parse_typ_mod()?,
7299 }
7300 }
7301 BPCHAR => RawDataType::Other {
7302 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7303 typ_mod: self.parse_typ_mod()?,
7304 },
7305 VARCHAR => RawDataType::Other {
7306 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7307 typ_mod: self.parse_typ_mod()?,
7308 },
7309 STRING => other(ident!("text")),
7310
7311 BIGINT => other(ident!("int8")),
7313 SMALLINT => other(ident!("int2")),
7314 DEC | DECIMAL => RawDataType::Other {
7315 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7316 typ_mod: self.parse_typ_mod()?,
7317 },
7318 DOUBLE => {
7319 let _ = self.parse_keyword(PRECISION);
7320 other(ident!("float8"))
7321 }
7322 FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7323 v if v == 0 || v > 53 => {
7324 return Err(self.error(
7325 self.peek_prev_pos(),
7326 "precision for type float must be within ([1-53])".into(),
7327 ));
7328 }
7329 v if v < 25 => other(ident!("float4")),
7330 _ => other(ident!("float8")),
7331 },
7332 INT | INTEGER => other(ident!("int4")),
7333 REAL => other(ident!("float4")),
7334
7335 TIME => {
7337 if self.parse_keyword(WITH) {
7338 self.expect_keywords(&[TIME, ZONE])?;
7339 other(ident!("timetz"))
7340 } else {
7341 if self.parse_keyword(WITHOUT) {
7342 self.expect_keywords(&[TIME, ZONE])?;
7343 }
7344 other(ident!("time"))
7345 }
7346 }
7347 TIMESTAMP => {
7348 let typ_mod = self.parse_timestamp_precision()?;
7349 if self.parse_keyword(WITH) {
7350 self.expect_keywords(&[TIME, ZONE])?;
7351 RawDataType::Other {
7352 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7353 "timestamptz"
7354 ))),
7355 typ_mod,
7356 }
7357 } else {
7358 if self.parse_keyword(WITHOUT) {
7359 self.expect_keywords(&[TIME, ZONE])?;
7360 }
7361 RawDataType::Other {
7362 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7363 "timestamp"
7364 ))),
7365 typ_mod,
7366 }
7367 }
7368 }
7369 TIMESTAMPTZ => {
7370 let typ_mod = self.parse_timestamp_precision()?;
7371 RawDataType::Other {
7372 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7373 "timestamptz"
7374 ))),
7375 typ_mod,
7376 }
7377 }
7378
7379 MAP => {
7381 return self.parse_map_type();
7382 }
7383
7384 BOOLEAN => other(ident!("bool")),
7386 BYTES => other(ident!("bytea")),
7387 JSON => other(ident!("jsonb")),
7388
7389 kw if kw.is_sometimes_reserved() => {
7392 return self.expected(
7393 self.peek_prev_pos(),
7394 "a data type name",
7395 Some(Token::Keyword(kw)),
7396 );
7397 }
7398 _ => {
7399 self.prev_token();
7400 RawDataType::Other {
7401 name: RawItemName::Name(self.parse_item_name()?),
7402 typ_mod: self.parse_typ_mod()?,
7403 }
7404 }
7405 },
7406 Some(Token::Ident(_) | Token::LBracket) => {
7407 self.prev_token();
7408 RawDataType::Other {
7409 name: self.parse_raw_name()?,
7410 typ_mod: self.parse_typ_mod()?,
7411 }
7412 }
7413 other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7414 };
7415
7416 loop {
7417 match self.peek_token() {
7418 Some(Token::Keyword(LIST)) => {
7419 self.next_token();
7420 data_type = RawDataType::List(Box::new(data_type));
7421 }
7422 Some(Token::LBracket) => {
7423 self.next_token();
7426 let _ = self.maybe_parse(|parser| parser.parse_number_value());
7427 self.expect_token(&Token::RBracket)?;
7428 if !matches!(data_type, RawDataType::Array(_)) {
7429 data_type = RawDataType::Array(Box::new(data_type));
7430 }
7431 }
7432 _ => break,
7433 }
7434 }
7435 Ok(data_type)
7436 }
7437
7438 fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7439 if self.consume_token(&Token::LParen) {
7440 let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7441 self.expect_token(&Token::RParen)?;
7442 Ok(typ_mod)
7443 } else {
7444 Ok(vec![])
7445 }
7446 }
7447
7448 fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7450 if self.consume_token(&Token::LParen) {
7451 let typ_mod = self.parse_literal_int()?;
7452 self.expect_token(&Token::RParen)?;
7453 Ok(vec![typ_mod])
7454 } else {
7455 Ok(vec![])
7456 }
7457 }
7458
7459 fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7463 where
7464 F: FnOnce(Keyword) -> bool,
7465 {
7466 let after_as = self.parse_keyword(AS);
7467 match self.next_token() {
7468 Some(Token::Keyword(OF)) => {
7471 self.prev_token();
7472 if after_as {
7473 self.prev_token();
7474 }
7475 Ok(None)
7476 }
7477 Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7483 Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7484 not_an_ident => {
7485 if after_as {
7486 return self.expected(
7487 self.peek_prev_pos(),
7488 "an identifier after AS",
7489 not_an_ident,
7490 );
7491 }
7492 self.prev_token();
7493 Ok(None) }
7495 }
7496 }
7497
7498 fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7503 match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7504 Some(name) => {
7505 let columns = self.parse_parenthesized_column_list(Optional)?;
7506 Ok(Some(TableAlias {
7507 name,
7508 columns,
7509 strict: false,
7510 }))
7511 }
7512 None => Ok(None),
7513 }
7514 }
7515
7516 fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7517 Ok(match self.parse_raw_name()? {
7518 named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7519 RawItemName::Name(name) => DeferredItemName::Deferred(name),
7520 })
7521 }
7522
7523 fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7524 if self.consume_token(&Token::LBracket) {
7525 let id = match self.next_token() {
7526 Some(Token::Ident(id)) => id.into_inner(),
7527 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7528 };
7529 self.expect_keyword(AS)?;
7530 let name = self.parse_item_name()?;
7531 if name.0.len() < 2 {
7533 return parser_err!(
7534 self,
7535 self.peek_prev_pos(),
7536 "table name in square brackets must be fully qualified"
7537 );
7538 }
7539
7540 let version = if self.parse_keywords(&[VERSION]) {
7541 let version = self.parse_version()?;
7542 Some(version)
7543 } else {
7544 None
7545 };
7546
7547 self.expect_token(&Token::RBracket)?;
7548 Ok(RawItemName::Id(id, name, version))
7549 } else {
7550 Ok(RawItemName::Name(self.parse_item_name()?))
7551 }
7552 }
7553
7554 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7555 let start = self.peek_pos();
7556 let mut item_name = self.parse_raw_name()?;
7557 let column_name = match &mut item_name {
7558 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7559 if identifiers.len() < 2 {
7560 return Err(ParserError::new(
7561 start,
7562 "need to specify an object and a column",
7563 ));
7564 }
7565 identifiers.pop().unwrap()
7566 }
7567 RawItemName::Id(_, _, _) => {
7568 self.expect_token(&Token::Dot)?;
7569 self.parse_identifier()?
7570 }
7571 };
7572
7573 Ok(ColumnName {
7574 relation: item_name,
7575 column: column_name,
7576 })
7577 }
7578
7579 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7582 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7583 }
7584
7585 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7588 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7589 }
7590
7591 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7594 Ok(UnresolvedItemName(self.parse_identifiers()?))
7595 }
7596
7597 fn parse_object_name(
7599 &mut self,
7600 object_type: ObjectType,
7601 ) -> Result<UnresolvedObjectName, ParserError> {
7602 Ok(match object_type {
7603 ObjectType::Table
7604 | ObjectType::View
7605 | ObjectType::MaterializedView
7606 | ObjectType::Source
7607 | ObjectType::Subsource
7608 | ObjectType::Sink
7609 | ObjectType::MetricSink
7610 | ObjectType::Index
7611 | ObjectType::Type
7612 | ObjectType::Secret
7613 | ObjectType::Connection
7614 | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7615 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7616 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7617 ObjectType::ClusterReplica => {
7618 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7619 }
7620 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7621 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7622 ObjectType::NetworkPolicy => {
7623 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7624 }
7625 })
7626 }
7627
7628 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7630 let mut idents = vec![];
7631 loop {
7632 idents.push(self.parse_identifier()?);
7633 if !self.consume_token(&Token::Dot) {
7634 break;
7635 }
7636 }
7637 Ok(idents)
7638 }
7639
7640 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7642 match self.consume_identifier()? {
7643 Some(id) => {
7644 if id.as_str().is_empty() {
7645 return parser_err!(
7646 self,
7647 self.peek_prev_pos(),
7648 "zero-length delimited identifier",
7649 );
7650 }
7651 Ok(id)
7652 }
7653 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7654 }
7655 }
7656
7657 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7658 match self.peek_token() {
7659 Some(Token::Keyword(kw)) => {
7660 self.next_token();
7661 Ok(Some(kw.into()))
7662 }
7663 Some(Token::Ident(id)) => {
7664 self.next_token();
7665 Ok(Some(self.new_identifier(id)?))
7666 }
7667 _ => Ok(None),
7668 }
7669 }
7670
7671 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7672 let mut id_parts = vec![id];
7673 match self.peek_token() {
7674 Some(Token::LParen) | Some(Token::Dot) => {
7675 let mut ends_with_wildcard = false;
7676 while self.consume_token(&Token::Dot) {
7677 match self.next_token() {
7678 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7679 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7680 Some(Token::Star) => {
7681 ends_with_wildcard = true;
7682 break;
7683 }
7684 unexpected => {
7685 return self.expected(
7686 self.peek_prev_pos(),
7687 "an identifier or a '*' after '.'",
7688 unexpected,
7689 );
7690 }
7691 }
7692 }
7693 if ends_with_wildcard {
7694 Ok(Expr::QualifiedWildcard(id_parts))
7695 } else if self.peek_token() == Some(Token::LParen) {
7696 let function =
7697 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7698 Ok(Expr::Function(function))
7699 } else {
7700 Ok(Expr::Identifier(id_parts))
7701 }
7702 }
7703 _ => Ok(Expr::Identifier(id_parts)),
7704 }
7705 }
7706
7707 fn parse_parenthesized_column_list(
7709 &mut self,
7710 optional: IsOptional,
7711 ) -> Result<Vec<Ident>, ParserError> {
7712 if self.consume_token(&Token::LParen) {
7713 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7714 self.expect_token(&Token::RParen)?;
7715 Ok(cols)
7716 } else if optional == Optional {
7717 Ok(vec![])
7718 } else {
7719 self.expected(
7720 self.peek_pos(),
7721 "a list of columns in parentheses",
7722 self.peek_token(),
7723 )
7724 }
7725 }
7726
7727 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7728 if self.consume_token(&Token::LParen) {
7729 let n = self.parse_literal_uint()?;
7730 self.expect_token(&Token::RParen)?;
7731 Ok(Some(n))
7732 } else {
7733 Ok(None)
7734 }
7735 }
7736
7737 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7738 self.expect_token(&Token::LBracket)?;
7739 let key_type = Box::new(self.parse_data_type()?);
7740 self.expect_token(&Token::Arrow)?;
7741 let value_type = Box::new(self.parse_data_type()?);
7742 self.expect_token(&Token::RBracket)?;
7743 Ok(RawDataType::Map {
7744 key_type,
7745 value_type,
7746 })
7747 }
7748
7749 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7750 self.expect_keyword(FROM)?;
7751 let table_name = RawItemName::Name(self.parse_item_name()?);
7752 let alias = self.parse_optional_table_alias()?;
7753 let using = if self.parse_keyword(USING) {
7754 self.parse_comma_separated(Parser::parse_table_and_joins)?
7755 } else {
7756 vec![]
7757 };
7758 let selection = if self.parse_keyword(WHERE) {
7759 Some(self.parse_expr()?)
7760 } else {
7761 None
7762 };
7763
7764 Ok(Statement::Delete(DeleteStatement {
7765 table_name,
7766 alias,
7767 using,
7768 selection,
7769 }))
7770 }
7771
7772 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7774 Ok(SelectStatement {
7775 query: self.parse_query()?,
7776 as_of: self.parse_optional_as_of()?,
7777 })
7778 }
7779
7780 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7785 self.checked_recur_mut(|parser| {
7786 let cte_block = if parser.parse_keyword(WITH) {
7787 if parser.parse_keyword(MUTUALLY) {
7788 parser.expect_keyword(RECURSIVE)?;
7789 let options = if parser.consume_token(&Token::LParen) {
7790 let options =
7791 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7792 parser.expect_token(&Token::RParen)?;
7793 options
7794 } else {
7795 vec![]
7796 };
7797 CteBlock::MutuallyRecursive(MutRecBlock {
7798 options,
7799 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7800 })
7801 } else {
7802 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7804 }
7805 } else {
7806 CteBlock::empty()
7807 };
7808
7809 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7810
7811 parser.parse_query_tail(cte_block, body)
7812 })
7813 }
7814
7815 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7816 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7817 RECURSION => {
7818 self.expect_keyword(LIMIT)?;
7819 Ok(MutRecBlockOption {
7820 name: MutRecBlockOptionName::RecursionLimit,
7821 value: self.parse_optional_option_value()?,
7822 })
7823 }
7824 RETURN => {
7825 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7826 Ok(MutRecBlockOption {
7827 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7828 value: self.parse_optional_option_value()?,
7829 })
7830 }
7831 ERROR => {
7832 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7833 Ok(MutRecBlockOption {
7834 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7835 value: self.parse_optional_option_value()?,
7836 })
7837 }
7838 _ => unreachable!(),
7839 }
7840 }
7841
7842 fn parse_query_tail(
7843 &mut self,
7844 ctes: CteBlock<Raw>,
7845 body: SetExpr<Raw>,
7846 ) -> Result<Query<Raw>, ParserError> {
7847 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7848 SetExpr::Query(query) => {
7849 let Query {
7850 ctes,
7851 body,
7852 order_by,
7853 limit,
7854 offset,
7855 } = *query;
7856 (ctes, order_by, limit, offset, body)
7857 }
7858 _ => (CteBlock::empty(), vec![], None, None, body),
7859 };
7860
7861 let ctes = if ctes.is_empty() {
7862 inner_ctes
7863 } else if !inner_ctes.is_empty() {
7864 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7865 } else {
7866 ctes
7867 };
7868
7869 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7870 if !inner_order_by.is_empty() {
7871 return parser_err!(
7872 self,
7873 self.peek_prev_pos(),
7874 "multiple ORDER BY clauses not allowed"
7875 );
7876 }
7877 self.parse_comma_separated(Parser::parse_order_by_expr)?
7878 } else {
7879 inner_order_by
7880 };
7881
7882 let mut limit = inner_limit;
7886 let mut offset = inner_offset;
7887 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7888 match parsed_keyword {
7889 LIMIT => {
7890 if limit.is_some() {
7891 return parser_err!(
7892 self,
7893 self.peek_prev_pos(),
7894 "multiple LIMIT/FETCH clauses not allowed"
7895 );
7896 }
7897 limit = if self.parse_keyword(ALL) {
7898 None
7899 } else {
7900 Some(Limit {
7901 with_ties: false,
7902 quantity: self.parse_expr()?,
7903 })
7904 };
7905 }
7906 OFFSET => {
7907 if offset.is_some() {
7908 return parser_err!(
7909 self,
7910 self.peek_prev_pos(),
7911 "multiple OFFSET clauses not allowed"
7912 );
7913 }
7914 let value = self.parse_expr()?;
7915 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7916 offset = Some(value);
7917 }
7918 FETCH => {
7919 if limit.is_some() {
7920 return parser_err!(
7921 self,
7922 self.peek_prev_pos(),
7923 "multiple LIMIT/FETCH clauses not allowed"
7924 );
7925 }
7926 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7927 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7928 Expr::Value(Value::Number('1'.into()))
7929 } else {
7930 let quantity = self.parse_expr()?;
7931 self.expect_one_of_keywords(&[ROW, ROWS])?;
7932 quantity
7933 };
7934 let with_ties = if self.parse_keyword(ONLY) {
7935 false
7936 } else if self.parse_keywords(&[WITH, TIES]) {
7937 true
7938 } else {
7939 return self.expected(
7940 self.peek_pos(),
7941 "one of ONLY or WITH TIES",
7942 self.peek_token(),
7943 );
7944 };
7945 limit = Some(Limit {
7946 with_ties,
7947 quantity,
7948 });
7949 }
7950 _ => unreachable!(),
7951 }
7952 }
7953
7954 Ok(Query {
7955 ctes,
7956 body,
7957 order_by,
7958 limit,
7959 offset,
7960 })
7961 }
7962
7963 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7965 let alias = TableAlias {
7966 name: self.parse_identifier()?,
7967 columns: self.parse_parenthesized_column_list(Optional)?,
7968 strict: false,
7969 };
7970 self.expect_keyword(AS)?;
7971 self.expect_token(&Token::LParen)?;
7972 let query = self.parse_query()?;
7973 self.expect_token(&Token::RParen)?;
7974 Ok(Cte {
7975 alias,
7976 query,
7977 id: (),
7978 })
7979 }
7980
7981 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7987 let name = self.parse_identifier()?;
7988 self.expect_token(&Token::LParen)?;
7989 let columns = self.parse_comma_separated(|parser| {
7990 Ok(CteMutRecColumnDef {
7991 name: parser.parse_identifier()?,
7992 data_type: parser.parse_data_type()?,
7993 })
7994 })?;
7995 self.expect_token(&Token::RParen)?;
7996 self.expect_keyword(AS)?;
7997 self.expect_token(&Token::LParen)?;
7998 let query = self.parse_query()?;
7999 self.expect_token(&Token::RParen)?;
8000 Ok(CteMutRec {
8001 name,
8002 columns,
8003 query,
8004 id: (),
8005 })
8006 }
8007
8008 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
8017 let expr = if self.parse_keyword(SELECT) {
8020 SetExpr::Select(Box::new(self.parse_select()?))
8021 } else if self.consume_token(&Token::LParen) {
8022 let subquery = self.parse_query()?;
8024 self.expect_token(&Token::RParen)?;
8025 SetExpr::Query(Box::new(subquery))
8026 } else if self.parse_keyword(VALUES) {
8027 SetExpr::Values(self.parse_values()?)
8028 } else if self.parse_keyword(SHOW) {
8029 SetExpr::Show(self.parse_show()?)
8030 } else if self.parse_keyword(TABLE) {
8031 SetExpr::Table(self.parse_raw_name()?)
8032 } else {
8033 return self.expected(
8034 self.peek_pos(),
8035 "SELECT, VALUES, or a subquery in the query body",
8036 self.peek_token(),
8037 );
8038 };
8039
8040 self.parse_query_body_seeded(precedence, expr)
8041 }
8042
8043 fn parse_query_body_seeded(
8044 &mut self,
8045 precedence: SetPrecedence,
8046 mut expr: SetExpr<Raw>,
8047 ) -> Result<SetExpr<Raw>, ParserError> {
8048 loop {
8049 let next_token = self.peek_token();
8051 let op = self.parse_set_operator(&next_token);
8052 let next_precedence = match op {
8053 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
8055 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
8057 None => break,
8059 };
8060 if precedence >= next_precedence {
8061 break;
8062 }
8063 self.next_token(); let all = self.parse_keyword(ALL);
8066 let distinct = self.parse_keyword(DISTINCT);
8067 if all && distinct {
8068 return parser_err!(
8069 self,
8070 self.peek_prev_pos(),
8071 "Cannot specify both ALL and DISTINCT in set operation"
8072 );
8073 }
8074 expr = SetExpr::SetOperation {
8075 left: Box::new(expr),
8076 op: op.unwrap(),
8077 all,
8078 right: Box::new(self.parse_query_body(next_precedence)?),
8079 };
8080 }
8081
8082 Ok(expr)
8083 }
8084
8085 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
8086 match token {
8087 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
8088 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
8089 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
8090 _ => None,
8091 }
8092 }
8093
8094 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
8097 let all = self.parse_keyword(ALL);
8098 let distinct = self.parse_keyword(DISTINCT);
8099 if all && distinct {
8100 return parser_err!(
8101 self,
8102 self.peek_prev_pos(),
8103 "Cannot specify both ALL and DISTINCT in SELECT"
8104 );
8105 }
8106 let distinct = if distinct && self.parse_keyword(ON) {
8107 self.expect_token(&Token::LParen)?;
8108 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
8109 self.expect_token(&Token::RParen)?;
8110 Some(Distinct::On(exprs))
8111 } else if distinct {
8112 Some(Distinct::EntireRow)
8113 } else {
8114 None
8115 };
8116
8117 let projection = match self.peek_token() {
8118 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
8122 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
8123 _ => {
8124 let mut projection = vec![];
8125 loop {
8126 projection.push(self.parse_select_item()?);
8127 if !self.consume_token(&Token::Comma) {
8128 break;
8129 }
8130 if self.peek_keyword(FROM) {
8131 return parser_err!(
8132 self,
8133 self.peek_prev_pos(),
8134 "invalid trailing comma in SELECT list",
8135 );
8136 }
8137 }
8138 projection
8139 }
8140 };
8141
8142 let from = if self.parse_keyword(FROM) {
8148 self.parse_comma_separated(Parser::parse_table_and_joins)?
8149 } else {
8150 vec![]
8151 };
8152
8153 let selection = if self.parse_keyword(WHERE) {
8154 Some(self.parse_expr()?)
8155 } else {
8156 None
8157 };
8158
8159 let group_by = if self.parse_keywords(&[GROUP, BY]) {
8160 self.parse_comma_separated(Parser::parse_expr)?
8161 } else {
8162 vec![]
8163 };
8164
8165 let having = if self.parse_keyword(HAVING) {
8166 Some(self.parse_expr()?)
8167 } else {
8168 None
8169 };
8170
8171 let qualify = if self.parse_keyword(QUALIFY) {
8172 Some(self.parse_expr()?)
8173 } else {
8174 None
8175 };
8176
8177 let options = if self.parse_keyword(OPTIONS) {
8178 self.expect_token(&Token::LParen)?;
8179 let options = self.parse_comma_separated(Self::parse_select_option)?;
8180 self.expect_token(&Token::RParen)?;
8181 options
8182 } else {
8183 vec![]
8184 };
8185
8186 Ok(Select {
8187 distinct,
8188 projection,
8189 from,
8190 selection,
8191 group_by,
8192 having,
8193 qualify,
8194 options,
8195 })
8196 }
8197
8198 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8199 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8200 EXPECTED => {
8201 self.expect_keywords(&[GROUP, SIZE])?;
8202 SelectOptionName::ExpectedGroupSize
8203 }
8204 AGGREGATE => {
8205 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8206 SelectOptionName::AggregateInputGroupSize
8207 }
8208 DISTINCT => {
8209 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8210 SelectOptionName::DistinctOnInputGroupSize
8211 }
8212 LIMIT => {
8213 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8214 SelectOptionName::LimitInputGroupSize
8215 }
8216 _ => unreachable!(),
8217 };
8218 Ok(SelectOption {
8219 name,
8220 value: self.parse_optional_option_value()?,
8221 })
8222 }
8223
8224 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8225 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8226 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8227 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8228 if !normal {
8229 match variable.as_str().parse() {
8230 Ok(TIME) => {
8231 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8232 variable = ident!("timezone");
8233 normal = true;
8234 }
8235 Ok(NAMES) => {
8236 variable = ident!("client_encoding");
8237 normal = true;
8238 }
8239 _ => {}
8240 }
8241 }
8242 if variable.as_str().parse() == Ok(SCHEMA) {
8243 variable = ident!("search_path");
8244 let to = self
8245 .parse_set_schema_to()
8246 .map_parser_err(StatementKind::SetVariable)?;
8247 Ok(Statement::SetVariable(SetVariableStatement {
8248 local: modifier == Some(LOCAL),
8249 variable,
8250 to,
8251 }))
8252 } else if normal {
8253 let to = self
8254 .parse_set_variable_to()
8255 .map_parser_err(StatementKind::SetVariable)?;
8256 Ok(Statement::SetVariable(SetVariableStatement {
8257 local: modifier == Some(LOCAL),
8258 variable,
8259 to,
8260 }))
8261 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8262 Ok(Statement::SetTransaction(SetTransactionStatement {
8264 local: true,
8265 modes: self
8266 .parse_transaction_modes(true)
8267 .map_parser_err(StatementKind::SetTransaction)?,
8268 }))
8269 } else if modifier == Some(SESSION)
8270 && variable.as_str().parse() == Ok(CHARACTERISTICS)
8271 && self.parse_keywords(&[AS, TRANSACTION])
8272 {
8273 Ok(Statement::SetTransaction(SetTransactionStatement {
8275 local: false,
8276 modes: self
8277 .parse_transaction_modes(true)
8278 .map_parser_err(StatementKind::SetTransaction)?,
8279 }))
8280 } else {
8281 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8282 .map_no_statement_parser_err()
8283 }
8284 }
8285
8286 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8287 if self.parse_keyword(DEFAULT) {
8288 Ok(SetVariableTo::Default)
8289 } else {
8290 let to = self.parse_set_variable_value()?;
8291 Ok(SetVariableTo::Values(vec![to]))
8292 }
8293 }
8294
8295 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8296 if self.parse_keyword(DEFAULT) {
8297 Ok(SetVariableTo::Default)
8298 } else {
8299 Ok(SetVariableTo::Values(
8300 self.parse_comma_separated(Parser::parse_set_variable_value)?,
8301 ))
8302 }
8303 }
8304
8305 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8306 if let Some(value) = self.maybe_parse(Parser::parse_value) {
8307 Ok(SetVariableValue::Literal(value))
8308 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8309 Ok(SetVariableValue::Ident(ident))
8310 } else {
8311 self.expected(self.peek_pos(), "variable value", self.peek_token())
8312 }
8313 }
8314
8315 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8316 let mut variable = self.parse_identifier()?;
8317 if variable.as_str().parse() == Ok(SCHEMA) {
8318 variable = ident!("search_path");
8319 }
8320 Ok(Statement::ResetVariable(ResetVariableStatement {
8321 variable,
8322 }))
8323 }
8324
8325 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8326 let redacted = self.parse_keyword(REDACTED);
8327 if redacted && !self.peek_keyword(CREATE) {
8328 return parser_err!(
8329 self,
8330 self.peek_pos(),
8331 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8332 );
8333 }
8334 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8335 self.parse_show_columns()
8336 } else if self.parse_keyword(OBJECTS) {
8337 let from = if self.parse_keywords(&[FROM]) {
8338 Some(self.parse_schema_name()?)
8339 } else {
8340 None
8341 };
8342 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8343 object_type: ShowObjectType::Object,
8344 from,
8345 filter: self.parse_show_statement_filter()?,
8346 }))
8347 } else if let Some(object_type) = self.parse_plural_object_type() {
8348 let from = if object_type.lives_in_schema() {
8349 if self.parse_keywords(&[FROM]) {
8350 Some(self.parse_schema_name()?)
8351 } else {
8352 None
8353 }
8354 } else {
8355 None
8356 };
8357
8358 let show_object_type = match object_type {
8359 ObjectType::Database => ShowObjectType::Database,
8360 ObjectType::Schema => {
8361 let from = if self.parse_keyword(FROM) {
8362 Some(self.parse_database_name()?)
8363 } else {
8364 None
8365 };
8366 ShowObjectType::Schema { from }
8367 }
8368 ObjectType::Table => {
8369 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8370 Some(self.parse_raw_name()?)
8371 } else {
8372 None
8373 };
8374 ShowObjectType::Table { on_source }
8375 }
8376 ObjectType::View => ShowObjectType::View,
8377 ObjectType::Source => {
8378 let in_cluster = self.parse_optional_in_cluster()?;
8379 ShowObjectType::Source { in_cluster }
8380 }
8381 ObjectType::Subsource => {
8382 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8383 Some(self.parse_raw_name()?)
8384 } else {
8385 None
8386 };
8387
8388 if from.is_some() && on_source.is_some() {
8389 return parser_err!(
8390 self,
8391 self.peek_prev_pos(),
8392 "Cannot specify both FROM and ON"
8393 );
8394 }
8395
8396 ShowObjectType::Subsource { on_source }
8397 }
8398 ObjectType::Sink => {
8399 let in_cluster = self.parse_optional_in_cluster()?;
8400 ShowObjectType::Sink { in_cluster }
8401 }
8402 ObjectType::MetricSink => {
8403 let in_cluster = self.parse_optional_in_cluster()?;
8404 ShowObjectType::MetricSink { in_cluster }
8405 }
8406 ObjectType::Type => ShowObjectType::Type,
8407 ObjectType::Role => ShowObjectType::Role,
8408 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8409 ObjectType::Secret => ShowObjectType::Secret,
8410 ObjectType::Connection => ShowObjectType::Connection,
8411 ObjectType::Cluster => ShowObjectType::Cluster,
8412 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8413 ObjectType::MaterializedView => {
8414 let in_cluster = self.parse_optional_in_cluster()?;
8415 ShowObjectType::MaterializedView { in_cluster }
8416 }
8417 ObjectType::Index => {
8418 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8419 Some(self.parse_raw_name()?)
8420 } else {
8421 None
8422 };
8423
8424 if from.is_some() && on_object.is_some() {
8425 return parser_err!(
8426 self,
8427 self.peek_prev_pos(),
8428 "Cannot specify both FROM and ON"
8429 );
8430 }
8431
8432 let in_cluster = self.parse_optional_in_cluster()?;
8433 ShowObjectType::Index {
8434 in_cluster,
8435 on_object,
8436 }
8437 }
8438 ObjectType::Func => {
8439 return parser_err!(
8440 self,
8441 self.peek_prev_pos(),
8442 format!("Unsupported SHOW on {object_type}")
8443 );
8444 }
8445 };
8446 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8447 object_type: show_object_type,
8448 from,
8449 filter: self.parse_show_statement_filter()?,
8450 }))
8451 } else if self.parse_keyword(CLUSTER) {
8452 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8453 variable: ident!("cluster"),
8454 }))
8455 } else if self.parse_keyword(PRIVILEGES) {
8456 self.parse_show_privileges()
8457 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8458 self.parse_show_default_privileges()
8459 } else if self.parse_keyword(ROLE) {
8460 self.expect_keyword(MEMBERSHIP)?;
8461 let role = if self.parse_keyword(FOR) {
8462 Some(self.parse_identifier()?)
8463 } else {
8464 None
8465 };
8466 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8467 object_type: ShowObjectType::RoleMembership { role },
8468 from: None,
8469 filter: self.parse_show_statement_filter()?,
8470 }))
8471 } else if self.parse_keywords(&[CREATE, VIEW]) {
8472 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8473 view_name: self.parse_raw_name()?,
8474 redacted,
8475 }))
8476 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8477 Ok(ShowStatement::ShowCreateMaterializedView(
8478 ShowCreateMaterializedViewStatement {
8479 materialized_view_name: self.parse_raw_name()?,
8480 redacted,
8481 },
8482 ))
8483 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8484 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8485 source_name: self.parse_raw_name()?,
8486 redacted,
8487 }))
8488 } else if self.parse_keywords(&[CREATE, TABLE]) {
8489 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8490 table_name: self.parse_raw_name()?,
8491 redacted,
8492 }))
8493 } else if self.parse_keywords(&[CREATE, SINK]) {
8494 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8495 sink_name: self.parse_raw_name()?,
8496 redacted,
8497 }))
8498 } else if self.parse_keywords(&[CREATE, METRIC, SINK]) {
8499 Ok(ShowStatement::ShowCreateMetricSink(
8500 ShowCreateMetricSinkStatement {
8501 metric_sink_name: self.parse_raw_name()?,
8502 redacted,
8503 },
8504 ))
8505 } else if self.parse_keywords(&[CREATE, INDEX]) {
8506 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8507 index_name: self.parse_raw_name()?,
8508 redacted,
8509 }))
8510 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8511 Ok(ShowStatement::ShowCreateConnection(
8512 ShowCreateConnectionStatement {
8513 connection_name: self.parse_raw_name()?,
8514 redacted,
8515 },
8516 ))
8517 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8518 if redacted {
8519 return parser_err!(
8520 self,
8521 self.peek_prev_pos(),
8522 "SHOW REDACTED CREATE CLUSTER is not supported"
8523 );
8524 }
8525 Ok(ShowStatement::ShowCreateCluster(
8526 ShowCreateClusterStatement {
8527 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8528 },
8529 ))
8530 } else if self.parse_keywords(&[CREATE, TYPE]) {
8531 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8532 type_name: self.parse_data_type()?,
8533 redacted,
8534 }))
8535 } else {
8536 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8537 ident!("transaction_isolation")
8538 } else if self.parse_keywords(&[TIME, ZONE]) {
8539 ident!("timezone")
8540 } else {
8541 self.parse_identifier()?
8542 };
8543 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8544 variable,
8545 }))
8546 }
8547 }
8548
8549 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8550 self.expect_one_of_keywords(&[FROM, IN])?;
8551 let table_name = self.parse_raw_name()?;
8552 let filter = self.parse_show_statement_filter()?;
8556 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8557 table_name,
8558 filter,
8559 }))
8560 }
8561
8562 fn parse_show_statement_filter(
8563 &mut self,
8564 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8565 if self.parse_keyword(LIKE) {
8566 Ok(Some(ShowStatementFilter::Like(
8567 self.parse_literal_string()?,
8568 )))
8569 } else if self.parse_keyword(WHERE) {
8570 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8571 } else {
8572 Ok(None)
8573 }
8574 }
8575
8576 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8577 let object_type = if self.parse_keyword(ON) {
8578 Some(self.expect_plural_system_object_type_for_privileges()?)
8579 } else {
8580 None
8581 };
8582 let role = if self.parse_keyword(FOR) {
8583 Some(self.parse_identifier()?)
8584 } else {
8585 None
8586 };
8587 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8588 object_type: ShowObjectType::Privileges { object_type, role },
8589 from: None,
8590 filter: self.parse_show_statement_filter()?,
8591 }))
8592 }
8593
8594 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8595 let object_type = if self.parse_keyword(ON) {
8596 Some(self.expect_plural_object_type_for_privileges()?)
8597 } else {
8598 None
8599 };
8600 let role = if self.parse_keyword(FOR) {
8601 Some(self.parse_identifier()?)
8602 } else {
8603 None
8604 };
8605 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8606 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8607 from: None,
8608 filter: self.parse_show_statement_filter()?,
8609 }))
8610 }
8611
8612 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8613 self.expect_keyword(SHARD)?;
8614 let id = self.parse_literal_string()?;
8615 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8616 }
8617
8618 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8619 let relation = self.parse_table_factor()?;
8620
8621 let mut joins = vec![];
8625 loop {
8626 let join = if self.parse_keyword(CROSS) {
8627 self.expect_keyword(JOIN)?;
8628 Join {
8629 relation: self.parse_table_factor()?,
8630 join_operator: JoinOperator::CrossJoin,
8631 }
8632 } else {
8633 let natural = self.parse_keyword(NATURAL);
8634 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8635 Some(kw)
8636 } else {
8637 None
8638 };
8639
8640 let join_operator_type = match peek_keyword {
8641 Some(INNER) | Some(JOIN) => {
8642 let _ = self.parse_keyword(INNER);
8643 self.expect_keyword(JOIN)?;
8644 JoinOperator::Inner
8645 }
8646 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8647 let _ = self.next_token();
8648 let _ = self.parse_keyword(OUTER);
8649 self.expect_keyword(JOIN)?;
8650 match kw {
8651 LEFT => JoinOperator::LeftOuter,
8652 RIGHT => JoinOperator::RightOuter,
8653 FULL => JoinOperator::FullOuter,
8654 _ => unreachable!(),
8655 }
8656 }
8657 Some(OUTER) => {
8658 return self.expected(
8659 self.peek_pos(),
8660 "LEFT, RIGHT, or FULL",
8661 self.peek_token(),
8662 );
8663 }
8664 None if natural => {
8665 return self.expected(
8666 self.peek_pos(),
8667 "a join type after NATURAL",
8668 self.peek_token(),
8669 );
8670 }
8671 _ => break,
8672 };
8673 let relation = self.parse_table_factor()?;
8674 let join_constraint = self.parse_join_constraint(natural)?;
8675 Join {
8676 relation,
8677 join_operator: join_operator_type(join_constraint),
8678 }
8679 };
8680 joins.push(join);
8681 }
8682 Ok(TableWithJoins { relation, joins })
8683 }
8684
8685 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8687 self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8694 }
8695
8696 fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8697 if self.parse_keyword(LATERAL) {
8698 if self.consume_token(&Token::LParen) {
8700 return self.parse_derived_table_factor(Lateral);
8701 } else if self.parse_keywords(&[ROWS, FROM]) {
8702 return self.parse_rows_from();
8703 } else {
8704 let name = self.parse_raw_name()?;
8705 self.expect_token(&Token::LParen)?;
8706 let args = self.parse_optional_args(false)?;
8707 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8708 return Ok(TableFactor::Function {
8709 function: Function {
8710 name,
8711 args,
8712 filter: None,
8713 over: None,
8714 distinct: false,
8715 },
8716 alias,
8717 with_ordinality,
8718 });
8719 }
8720 }
8721
8722 if self.consume_token(&Token::LParen) {
8723 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8745
8746 let table_and_joins = self.parse_table_and_joins()?;
8757 match table_and_joins.relation {
8758 TableFactor::NestedJoin { .. } => (),
8759 _ => {
8760 if table_and_joins.joins.is_empty() {
8761 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8764 }
8765 }
8766 }
8767 self.expect_token(&Token::RParen)?;
8768 Ok(TableFactor::NestedJoin {
8769 join: Box::new(table_and_joins),
8770 alias: self.parse_optional_table_alias()?,
8771 })
8772 } else if self.parse_keywords(&[ROWS, FROM]) {
8773 Ok(self.parse_rows_from()?)
8774 } else {
8775 let name = self.parse_raw_name()?;
8776 if self.consume_token(&Token::LParen) {
8777 let args = self.parse_optional_args(false)?;
8778 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8779 Ok(TableFactor::Function {
8780 function: Function {
8781 name,
8782 args,
8783 filter: None,
8784 over: None,
8785 distinct: false,
8786 },
8787 alias,
8788 with_ordinality,
8789 })
8790 } else {
8791 Ok(TableFactor::Table {
8792 name,
8793 alias: self.parse_optional_table_alias()?,
8794 })
8795 }
8796 }
8797 }
8798
8799 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8800 self.expect_token(&Token::LParen)?;
8801 let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8802 self.expect_token(&Token::RParen)?;
8803 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8804 Ok(TableFactor::RowsFrom {
8805 functions,
8806 alias,
8807 with_ordinality,
8808 })
8809 }
8810
8811 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8818 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8819 let alias = self.parse_optional_table_alias()?;
8820 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8821 if with_ordinality_1 && with_ordinality_2 {
8822 return parser_err!(
8823 self,
8824 self.peek_prev_pos(),
8825 "WITH ORDINALITY specified twice"
8826 );
8827 }
8828 Ok((with_ordinality_1 || with_ordinality_2, alias))
8829 }
8830
8831 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8832 let name = self.parse_raw_name()?;
8833 self.parse_function(name)
8834 }
8835
8836 fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8841 let name = self.parse_raw_name()?;
8842 self.expect_token(&Token::LParen)?;
8843 let args = self.parse_optional_args(false)?;
8844 Ok(Function {
8845 name,
8846 args,
8847 filter: None,
8848 over: None,
8849 distinct: false,
8850 })
8851 }
8852
8853 fn parse_derived_table_factor(
8854 &mut self,
8855 lateral: IsLateral,
8856 ) -> Result<TableFactor<Raw>, ParserError> {
8857 let subquery = Box::new(self.parse_query()?);
8858 self.expect_token(&Token::RParen)?;
8859 let alias = self.parse_optional_table_alias()?;
8860 Ok(TableFactor::Derived {
8861 lateral: match lateral {
8862 Lateral => true,
8863 NotLateral => false,
8864 },
8865 subquery,
8866 alias,
8867 })
8868 }
8869
8870 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8871 if natural {
8872 Ok(JoinConstraint::Natural)
8873 } else if self.parse_keyword(ON) {
8874 let constraint = self.parse_expr()?;
8875 Ok(JoinConstraint::On(constraint))
8876 } else if self.parse_keyword(USING) {
8877 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8878 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8879
8880 Ok(JoinConstraint::Using { columns, alias })
8881 } else {
8882 self.expected(
8883 self.peek_pos(),
8884 "ON, or USING after JOIN",
8885 self.peek_token(),
8886 )
8887 }
8888 }
8889
8890 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8892 self.expect_keyword(INTO)?;
8893 let table_name = self.parse_raw_name()?;
8894 let columns = self.parse_parenthesized_column_list(Optional)?;
8895 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8896 InsertSource::DefaultValues
8897 } else {
8898 InsertSource::Query(self.parse_query()?)
8899 };
8900 let returning = self.parse_returning()?;
8901 Ok(Statement::Insert(InsertStatement {
8902 table_name,
8903 columns,
8904 source,
8905 returning,
8906 }))
8907 }
8908
8909 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8910 Ok(if self.parse_keyword(RETURNING) {
8911 self.parse_comma_separated(Parser::parse_select_item)?
8912 } else {
8913 Vec::new()
8914 })
8915 }
8916
8917 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8918 let table_name = RawItemName::Name(self.parse_item_name()?);
8919 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8921 let alias = alias.map(|name| TableAlias {
8922 name,
8923 columns: Vec::new(),
8924 strict: false,
8925 });
8926
8927 self.expect_keyword(SET)?;
8928 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8929 let selection = if self.parse_keyword(WHERE) {
8930 Some(self.parse_expr()?)
8931 } else {
8932 None
8933 };
8934
8935 Ok(Statement::Update(UpdateStatement {
8936 table_name,
8937 alias,
8938 assignments,
8939 selection,
8940 }))
8941 }
8942
8943 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8945 let id = self.parse_identifier()?;
8946 self.expect_token(&Token::Eq)?;
8947 let value = self.parse_expr()?;
8948 Ok(Assignment { id, value })
8949 }
8950
8951 fn parse_optional_args(
8952 &mut self,
8953 allow_order_by: bool,
8954 ) -> Result<FunctionArgs<Raw>, ParserError> {
8955 if self.consume_token(&Token::Star) {
8956 self.expect_token(&Token::RParen)?;
8957 Ok(FunctionArgs::Star)
8958 } else if self.consume_token(&Token::RParen) {
8959 Ok(FunctionArgs::args(vec![]))
8960 } else {
8961 let args = self.parse_comma_separated(Parser::parse_expr)?;
8962 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8966 self.parse_comma_separated(Parser::parse_order_by_expr)?
8967 } else {
8968 vec![]
8969 };
8970 self.expect_token(&Token::RParen)?;
8971 Ok(FunctionArgs::Args { args, order_by })
8972 }
8973 }
8974
8975 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8977 if self.parse_keyword(AS) {
8978 self.expect_keyword(OF)?;
8979 if self.parse_keywords(&[AT, LEAST]) {
8980 match self.parse_expr() {
8981 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8982 Err(e) => self.expected(
8983 e.pos,
8984 "a timestamp value after 'AS OF AT LEAST'",
8985 self.peek_token(),
8986 ),
8987 }
8988 } else {
8989 match self.parse_expr() {
8990 Ok(expr) => Ok(Some(AsOf::At(expr))),
8991 Err(e) => {
8992 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8993 }
8994 }
8995 }
8996 } else {
8997 Ok(None)
8998 }
8999 }
9000
9001 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
9003 if self.parse_keyword(UP) {
9004 self.expect_keyword(TO)?;
9005 self.parse_expr().map(Some)
9006 } else {
9007 Ok(None)
9008 }
9009 }
9010
9011 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
9016 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
9017 let value = parser.parse_value().ok()?;
9018 let Value::Number(s) = value else { return None };
9019 s.parse().ok()
9020 }
9021
9022 if self.parse_keywords(&[AS, OF]) {
9023 match try_parse_u64(self) {
9024 Some(time) => Ok(Some(time)),
9025 None => {
9026 self.prev_token();
9027 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
9028 }
9029 }
9030 } else {
9031 Ok(None)
9032 }
9033 }
9034
9035 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
9037 if self.consume_token(&Token::Star) {
9038 return Ok(SelectItem::Wildcard);
9039 }
9040 Ok(SelectItem::Expr {
9041 expr: self.parse_expr()?,
9042 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
9043 })
9044 }
9045
9046 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
9049 let expr = self.parse_expr()?;
9050
9051 let asc = if self.parse_keyword(ASC) {
9052 Some(true)
9053 } else if self.parse_keyword(DESC) {
9054 Some(false)
9055 } else {
9056 None
9057 };
9058
9059 let nulls_last = if self.parse_keyword(NULLS) {
9060 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
9061 Some(last)
9062 } else {
9063 None
9064 };
9065
9066 Ok(OrderByExpr {
9067 expr,
9068 asc,
9069 nulls_last,
9070 })
9071 }
9072
9073 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
9074 let values = self.parse_comma_separated(|parser| {
9075 parser.expect_token(&Token::LParen)?;
9076 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
9077 parser.expect_token(&Token::RParen)?;
9078 Ok(exprs)
9079 })?;
9080 Ok(Values(values))
9081 }
9082
9083 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
9084 self.expect_keyword(TRANSACTION)?;
9085 Ok(Statement::StartTransaction(StartTransactionStatement {
9086 modes: self.parse_transaction_modes(false)?,
9087 }))
9088 }
9089
9090 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
9091 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9092 Ok(Statement::StartTransaction(StartTransactionStatement {
9093 modes: self.parse_transaction_modes(false)?,
9094 }))
9095 }
9096
9097 fn parse_transaction_modes(
9098 &mut self,
9099 mut required: bool,
9100 ) -> Result<Vec<TransactionMode>, ParserError> {
9101 let mut modes = vec![];
9102 loop {
9103 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
9104 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
9105 TransactionIsolationLevel::ReadUncommitted
9106 } else if self.parse_keywords(&[READ, COMMITTED]) {
9107 TransactionIsolationLevel::ReadCommitted
9108 } else if self.parse_keywords(&[REPEATABLE, READ]) {
9109 TransactionIsolationLevel::RepeatableRead
9110 } else if self.parse_keyword(SERIALIZABLE) {
9111 TransactionIsolationLevel::Serializable
9112 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
9113 TransactionIsolationLevel::StrongSessionSerializable
9114 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
9115 TransactionIsolationLevel::StrictSerializable
9116 } else {
9117 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
9118 };
9119 TransactionMode::IsolationLevel(iso_level)
9120 } else if self.parse_keywords(&[READ, ONLY]) {
9121 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
9122 } else if self.parse_keywords(&[READ, WRITE]) {
9123 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
9124 } else if required {
9125 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
9126 } else {
9127 break;
9128 };
9129 modes.push(mode);
9130 required = self.consume_token(&Token::Comma);
9135 }
9136 Ok(modes)
9137 }
9138
9139 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
9140 Ok(Statement::Commit(CommitStatement {
9141 chain: self.parse_commit_rollback_chain()?,
9142 }))
9143 }
9144
9145 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9146 Ok(Statement::Rollback(RollbackStatement {
9147 chain: self.parse_commit_rollback_chain()?,
9148 }))
9149 }
9150
9151 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9152 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9153 if self.parse_keyword(AND) {
9154 let chain = !self.parse_keyword(NO);
9155 self.expect_keyword(CHAIN)?;
9156 Ok(chain)
9157 } else {
9158 Ok(false)
9159 }
9160 }
9161
9162 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9163 parser_err!(
9164 self,
9165 self.peek_prev_pos(),
9166 "TAIL has been renamed to SUBSCRIBE"
9167 )
9168 }
9169
9170 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9171 let _ = self.parse_keyword(TO);
9172 let relation = if self.consume_token(&Token::LParen) {
9173 let query = self.parse_query()?;
9174 self.expect_token(&Token::RParen)?;
9175 SubscribeRelation::Query(query)
9176 } else {
9177 SubscribeRelation::Name(self.parse_raw_name()?)
9178 };
9179 let mut output = self.parse_subscribe_output()?;
9180 let options = if self.parse_keyword(WITH) {
9181 self.expect_token(&Token::LParen)?;
9182 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9183 self.expect_token(&Token::RParen)?;
9184 options
9185 } else {
9186 vec![]
9187 };
9188 let as_of = self.parse_optional_as_of()?;
9189 let up_to = self.parse_optional_up_to()?;
9190 if output == SubscribeOutput::Diffs {
9197 output = self.parse_subscribe_output()?;
9198 }
9199 Ok(Statement::Subscribe(SubscribeStatement {
9200 relation,
9201 options,
9202 as_of,
9203 up_to,
9204 output,
9205 }))
9206 }
9207
9208 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9209 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9210 PROGRESS => SubscribeOptionName::Progress,
9211 SNAPSHOT => SubscribeOptionName::Snapshot,
9212 _ => unreachable!(),
9213 };
9214 Ok(SubscribeOption {
9215 name,
9216 value: self.parse_optional_option_value()?,
9217 })
9218 }
9219
9220 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9221 if self.parse_keywords(&[ENVELOPE]) {
9222 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9223 self.expect_token(&Token::LParen)?;
9224 self.expect_keyword(KEY)?;
9225 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9226 let output = match keyword {
9227 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9228 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9229 _ => unreachable!("no other keyword allowed"),
9230 };
9231 self.expect_token(&Token::RParen)?;
9232 Ok(output)
9233 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9234 Ok(SubscribeOutput::WithinTimestampOrderBy {
9235 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9236 })
9237 } else {
9238 Ok(SubscribeOutput::Diffs)
9239 }
9240 }
9241
9242 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9245 if self.parse_keyword(TIMESTAMP) {
9246 self.parse_explain_timestamp()
9247 .map_parser_err(StatementKind::ExplainTimestamp)
9248 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9249 self.parse_explain_pushdown()
9250 .map_parser_err(StatementKind::ExplainPushdown)
9251 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9252 self.parse_explain_analyze()
9253 .map_parser_err(StatementKind::ExplainAnalyzeObject)
9254 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9255 self.parse_explain_schema()
9256 .map_parser_err(StatementKind::ExplainSinkSchema)
9257 } else {
9258 self.parse_explain_plan()
9259 .map_parser_err(StatementKind::ExplainPlan)
9260 }
9261 }
9262
9263 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9264 let explainee = if self.parse_keyword(VIEW) {
9265 Explainee::View(self.parse_raw_name()?)
9267 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9268 Explainee::MaterializedView(self.parse_raw_name()?)
9270 } else if self.parse_keyword(INDEX) {
9271 Explainee::Index(self.parse_raw_name()?)
9273 } else if self.parse_keywords(&[REPLAN, VIEW]) {
9274 Explainee::ReplanView(self.parse_raw_name()?)
9276 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9277 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9279 } else if self.parse_keywords(&[REPLAN, INDEX]) {
9280 Explainee::ReplanIndex(self.parse_raw_name()?)
9282 } else {
9283 let broken = self.parse_keyword(BROKEN);
9284
9285 if self.peek_keywords(&[CREATE, VIEW])
9286 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9287 {
9288 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
9291 Statement::CreateView(stmt) => stmt,
9292 _ => panic!("Unexpected statement type return after parsing"),
9293 };
9294
9295 Explainee::CreateView(Box::new(stmt), broken)
9296 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9297 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9298 {
9299 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
9302 Statement::CreateMaterializedView(stmt) => stmt,
9303 _ => panic!("Unexpected statement type return after parsing"),
9304 };
9305
9306 Explainee::CreateMaterializedView(Box::new(stmt), broken)
9307 } else if self.peek_keywords(&[CREATE, INDEX])
9308 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9309 {
9310 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
9313 Statement::CreateIndex(stmt) => stmt,
9314 _ => panic!("Unexpected statement type return after parsing"),
9315 };
9316
9317 Explainee::CreateIndex(Box::new(stmt), broken)
9318 } else if self.peek_keyword(SUBSCRIBE) {
9319 let _ = self.parse_keyword(SUBSCRIBE); let stmt = match self.parse_subscribe()? {
9322 Statement::Subscribe(stmt) => stmt,
9323 _ => panic!("Unexpected statement type return after parsing"),
9324 };
9325 Explainee::Subscribe(Box::new(stmt), broken)
9326 } else {
9327 let query = self.parse_select_statement()?;
9329 Explainee::Select(Box::new(query), broken)
9330 }
9331 };
9332 Ok(explainee)
9333 }
9334
9335 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9338 let start = self.peek_pos();
9339 let (has_stage, stage) = match self.parse_one_of_keywords(&[
9340 RAW,
9341 DECORRELATED,
9342 LOCALLY,
9343 OPTIMIZED,
9344 PHYSICAL,
9345 OPTIMIZER,
9346 PLAN,
9347 ]) {
9348 Some(RAW) => {
9349 self.expect_keyword(PLAN)?;
9350 (true, Some(ExplainStage::RawPlan))
9351 }
9352 Some(DECORRELATED) => {
9353 self.expect_keyword(PLAN)?;
9354 (true, Some(ExplainStage::DecorrelatedPlan))
9355 }
9356 Some(LOCALLY) => {
9357 self.expect_keywords(&[OPTIMIZED, PLAN])?;
9358 (true, Some(ExplainStage::LocalPlan))
9359 }
9360 Some(OPTIMIZED) => {
9361 self.expect_keyword(PLAN)?;
9362 (true, Some(ExplainStage::GlobalPlan))
9363 }
9364 Some(PHYSICAL) => {
9365 self.expect_keyword(PLAN)?;
9366 (true, Some(ExplainStage::PhysicalPlan))
9367 }
9368 Some(OPTIMIZER) => {
9369 self.expect_keyword(TRACE)?;
9370 (true, Some(ExplainStage::Trace))
9371 }
9372 Some(PLAN) => {
9373 if self.parse_keyword(INSIGHTS) {
9374 (true, Some(ExplainStage::PlanInsights))
9375 } else {
9376 (true, None)
9378 }
9379 }
9380 None => {
9381 (false, None)
9383 }
9384 _ => unreachable!(),
9385 };
9386
9387 let with_options = if self.parse_keyword(WITH) {
9388 if self.consume_token(&Token::LParen) {
9389 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9390 self.expect_token(&Token::RParen)?;
9391 options
9392 } else {
9393 self.prev_token(); vec![]
9395 }
9396 } else {
9397 vec![]
9398 };
9399
9400 let format = if self.parse_keyword(AS) {
9401 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9402 Some(TEXT) => Some(ExplainFormat::Text),
9403 Some(JSON) => Some(ExplainFormat::Json),
9404 Some(DOT) => Some(ExplainFormat::Dot),
9405 Some(VERBOSE) => {
9406 self.expect_keyword(TEXT)?;
9407 Some(ExplainFormat::VerboseText)
9408 }
9409 None => return Err(ParserError::new(self.index, "expected a format")),
9410 _ => unreachable!(),
9411 }
9412 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9413 Some(ExplainFormat::VerboseText)
9415 } else {
9416 None
9417 };
9418
9419 if has_stage {
9420 self.expect_keyword(FOR)?;
9421 }
9422
9423 let explainee = self.parse_explainee()?;
9424
9425 if matches!((explainee.is_view(), &stage), (true, None)) {
9428 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9429 return Err(self.error(start, msg));
9430 }
9431
9432 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9433 stage,
9434 with_options,
9435 format,
9436 explainee,
9437 }))
9438 }
9439
9440 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9441 Ok(ExplainPlanOption {
9442 name: self.parse_explain_plan_option_name()?,
9443 value: self.parse_optional_option_value()?,
9444 })
9445 }
9446
9447 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9450 self.expect_keyword(FOR)?;
9451
9452 let explainee = self.parse_explainee()?;
9453
9454 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9455 explainee,
9456 }))
9457 }
9458
9459 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9460 if self.parse_keyword(CLUSTER) {
9462 let properties = self.parse_explain_analyze_computation_properties()?;
9463 let as_sql = self.parse_keywords(&[AS, SQL]);
9464 return Ok(Statement::ExplainAnalyzeCluster(
9465 ExplainAnalyzeClusterStatement { properties, as_sql },
9466 ));
9467 }
9468
9469 let properties = if self.parse_keyword(HINTS) {
9472 ExplainAnalyzeProperty::Hints
9473 } else {
9474 ExplainAnalyzeProperty::Computation(
9475 self.parse_explain_analyze_computation_properties()?,
9476 )
9477 };
9478
9479 self.expect_keyword(FOR)?;
9480
9481 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9482 INDEX => Explainee::Index(self.parse_raw_name()?),
9483 MATERIALIZED => {
9484 self.expect_keyword(VIEW)?;
9485 Explainee::MaterializedView(self.parse_raw_name()?)
9486 }
9487 _ => unreachable!(),
9488 };
9489
9490 let as_sql = self.parse_keywords(&[AS, SQL]);
9491
9492 Ok(Statement::ExplainAnalyzeObject(
9493 ExplainAnalyzeObjectStatement {
9494 properties,
9495 explainee,
9496 as_sql,
9497 },
9498 ))
9499 }
9500
9501 fn parse_explain_analyze_computation_properties(
9502 &mut self,
9503 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9504 let mut computation_properties = vec![CPU, MEMORY];
9505 let (kw, property) =
9506 self.parse_explain_analyze_computation_property(&computation_properties)?;
9507 let mut properties = vec![property];
9508 computation_properties.retain(|p| p != &kw);
9509
9510 while self.consume_token(&Token::Comma) {
9511 let (kw, property) =
9512 self.parse_explain_analyze_computation_property(&computation_properties)?;
9513 computation_properties.retain(|p| p != &kw);
9514 properties.push(property);
9515 }
9516
9517 let skew = self.parse_keywords(&[WITH, SKEW]);
9518
9519 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9520 }
9521
9522 fn parse_explain_analyze_computation_property(
9523 &mut self,
9524 properties: &[Keyword],
9525 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9526 if properties.is_empty() {
9527 return Err(ParserError::new(
9528 self.peek_pos(),
9529 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9530 ));
9531 }
9532
9533 match self.expect_one_of_keywords(properties)? {
9534 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9535 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9536 _ => unreachable!(),
9537 }
9538 }
9539
9540 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9543 let format = if self.parse_keyword(AS) {
9544 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9545 Some(TEXT) => Some(ExplainFormat::Text),
9546 Some(JSON) => Some(ExplainFormat::Json),
9547 Some(DOT) => Some(ExplainFormat::Dot),
9548 None => return Err(ParserError::new(self.index, "expected a format")),
9549 _ => unreachable!(),
9550 }
9551 } else {
9552 None
9553 };
9554
9555 self.expect_keyword(FOR)?;
9556
9557 let query = self.parse_select_statement()?;
9558
9559 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9560 format,
9561 select: query,
9562 }))
9563 }
9564 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9567 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9568 KEY => ExplainSinkSchemaFor::Key,
9569 VALUE => ExplainSinkSchemaFor::Value,
9570 _ => unreachable!(),
9571 };
9572
9573 self.expect_keyword(SCHEMA)?;
9574
9575 let format = if self.parse_keyword(AS) {
9576 self.expect_keyword(JSON)?;
9578 Some(ExplainFormat::Json)
9579 } else {
9580 None
9581 };
9582
9583 self.expect_keywords(&[FOR, CREATE])?;
9584
9585 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9586 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9587 schema_for,
9588 format,
9589 statement,
9590 }))
9591 } else {
9592 unreachable!("only create sink can be returned here");
9593 }
9594 }
9595
9596 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9599 let name = self
9600 .parse_identifier()
9601 .map_parser_err(StatementKind::Declare)?;
9602 self.expect_keyword(CURSOR)
9603 .map_parser_err(StatementKind::Declare)?;
9604 if self.parse_keyword(WITH) {
9605 let err = parser_err!(
9606 self,
9607 self.peek_prev_pos(),
9608 "WITH HOLD is unsupported for cursors"
9609 )
9610 .map_parser_err(StatementKind::Declare);
9611 self.expect_keyword(HOLD)
9612 .map_parser_err(StatementKind::Declare)?;
9613 return err;
9614 }
9615 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9617 self.expect_keyword(FOR)
9618 .map_parser_err(StatementKind::Declare)?;
9619 let StatementParseResult { ast, sql } = self.parse_statement()?;
9620 Ok(Statement::Declare(DeclareStatement {
9621 name,
9622 stmt: Box::new(ast),
9623 sql: sql.to_string(),
9624 }))
9625 }
9626
9627 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9630 let name = self.parse_identifier()?;
9631 Ok(Statement::Close(CloseStatement { name }))
9632 }
9633
9634 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9637 let name = self
9638 .parse_identifier()
9639 .map_parser_err(StatementKind::Prepare)?;
9640 self.expect_keyword(AS)
9641 .map_parser_err(StatementKind::Prepare)?;
9642 let pos = self.peek_pos();
9643 let StatementParseResult { ast, sql } = self.parse_statement()?;
9645 if !matches!(
9646 ast,
9647 Statement::Select(_)
9648 | Statement::Insert(_)
9649 | Statement::Delete(_)
9650 | Statement::Update(_)
9651 | Statement::Fetch(_),
9652 ) {
9653 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9654 }
9655 Ok(Statement::Prepare(PrepareStatement {
9656 name,
9657 stmt: Box::new(ast),
9658 sql: sql.to_string(),
9659 }))
9660 }
9661
9662 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9665 if self.parse_keywords(&[UNIT, TEST]) {
9667 return self.parse_execute_unit_test();
9668 }
9669
9670 let name = self.parse_identifier()?;
9672 let params = if self.consume_token(&Token::LParen) {
9673 let params = self.parse_comma_separated(Parser::parse_expr)?;
9674 self.expect_token(&Token::RParen)?;
9675 params
9676 } else {
9677 Vec::new()
9678 };
9679 Ok(Statement::Execute(ExecuteStatement { name, params }))
9680 }
9681
9682 fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9685 let name = self.parse_identifier()?;
9687
9688 self.expect_keyword(FOR)?;
9690
9691 let target = self.parse_raw_name()?;
9693
9694 let at_time = if self.parse_keywords(&[AT, TIME]) {
9696 Some(self.parse_expr()?)
9697 } else {
9698 None
9699 };
9700
9701 let mut mocks = Vec::new();
9705 if self.parse_keyword(MOCK) {
9706 mocks.push(self.parse_mock_view_def()?);
9707 while self.consume_token(&Token::Comma) {
9708 self.expect_keyword(MOCK)?;
9709 mocks.push(self.parse_mock_view_def()?);
9710 }
9711 }
9712
9713 self.expect_keyword(EXPECTED)?;
9714
9715 self.expect_token(&Token::LParen)?;
9716 let expected_columns = self.parse_comma_separated(|parser| {
9717 Ok(ColumnDef {
9718 name: parser.parse_identifier()?,
9719 data_type: parser.parse_data_type()?,
9720 collation: None,
9721 options: vec![],
9722 })
9723 })?;
9724 self.expect_token(&Token::RParen)?;
9725
9726 self.expect_keyword(AS)?;
9727 self.expect_token(&Token::LParen)?;
9728 let expected_query = self.parse_query()?;
9729 self.expect_token(&Token::RParen)?;
9730
9731 let expected = ExpectedResultDef {
9732 columns: expected_columns,
9733 query: expected_query,
9734 };
9735
9736 Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9737 name,
9738 target,
9739 at_time,
9740 mocks,
9741 expected,
9742 }))
9743 }
9744
9745 fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9748 let name = self.parse_raw_name()?;
9749
9750 self.expect_token(&Token::LParen)?;
9751 let columns = self.parse_comma_separated(|parser| {
9752 Ok(ColumnDef {
9753 name: parser.parse_identifier()?,
9754 data_type: parser.parse_data_type()?,
9755 collation: None,
9756 options: vec![],
9757 })
9758 })?;
9759 self.expect_token(&Token::RParen)?;
9760
9761 self.expect_keyword(AS)?;
9762 self.expect_token(&Token::LParen)?;
9763 let query = self.parse_query()?;
9764 self.expect_token(&Token::RParen)?;
9765
9766 Ok(MockViewDef {
9767 name,
9768 columns,
9769 query,
9770 })
9771 }
9772
9773 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9776 let _ = self.parse_keyword(PREPARE);
9777 let name = if self.parse_keyword(ALL) {
9778 None
9779 } else {
9780 Some(self.parse_identifier()?)
9781 };
9782 Ok(Statement::Deallocate(DeallocateStatement { name }))
9783 }
9784
9785 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9788 let _ = self.parse_keyword(FORWARD);
9789 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9790 Some(FetchDirection::ForwardCount(count))
9791 } else if self.parse_keyword(ALL) {
9792 Some(FetchDirection::ForwardAll)
9793 } else {
9794 None
9795 };
9796 let _ = self.parse_keyword(FROM);
9797 let name = self.parse_identifier()?;
9798 let options = if self.parse_keyword(WITH) {
9799 self.expect_token(&Token::LParen)?;
9800 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9801 self.expect_token(&Token::RParen)?;
9802 options
9803 } else {
9804 vec![]
9805 };
9806 Ok(Statement::Fetch(FetchStatement {
9807 name,
9808 count,
9809 options,
9810 }))
9811 }
9812
9813 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9814 self.expect_keyword(TIMEOUT)?;
9815 Ok(FetchOption {
9816 name: FetchOptionName::Timeout,
9817 value: self.parse_optional_option_value()?,
9818 })
9819 }
9820
9821 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9824 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9825 Some(DEBUG) => NoticeSeverity::Debug,
9826 Some(INFO) => NoticeSeverity::Info,
9827 Some(LOG) => NoticeSeverity::Log,
9828 Some(NOTICE) => NoticeSeverity::Notice,
9829 Some(WARNING) => NoticeSeverity::Warning,
9830 Some(_) => unreachable!(),
9831 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9832 };
9833
9834 Ok(Statement::Raise(RaiseStatement { severity }))
9835 }
9836
9837 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9840 match self.parse_privilege_specification() {
9841 Some(privileges) => self
9842 .parse_grant_privilege(privileges)
9843 .map_parser_err(StatementKind::GrantPrivileges),
9844 None => self
9845 .parse_grant_role()
9846 .map_parser_err(StatementKind::GrantRole),
9847 }
9848 }
9849
9850 fn parse_grant_privilege(
9853 &mut self,
9854 privileges: PrivilegeSpecification,
9855 ) -> Result<Statement<Raw>, ParserError> {
9856 self.expect_keyword(ON)?;
9857 let target = self.expect_grant_target_specification("GRANT")?;
9858 self.expect_keyword(TO)?;
9859 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9860 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9861 privileges,
9862 target,
9863 roles,
9864 }))
9865 }
9866
9867 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9870 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9871 self.expect_keyword(TO)?;
9872 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9873 Ok(Statement::GrantRole(GrantRoleStatement {
9874 role_names,
9875 member_names,
9876 }))
9877 }
9878
9879 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9882 match self.parse_privilege_specification() {
9883 Some(privileges) => self
9884 .parse_revoke_privilege(privileges)
9885 .map_parser_err(StatementKind::RevokePrivileges),
9886 None => self
9887 .parse_revoke_role()
9888 .map_parser_err(StatementKind::RevokeRole),
9889 }
9890 }
9891
9892 fn parse_revoke_privilege(
9895 &mut self,
9896 privileges: PrivilegeSpecification,
9897 ) -> Result<Statement<Raw>, ParserError> {
9898 self.expect_keyword(ON)?;
9899 let target = self.expect_grant_target_specification("REVOKE")?;
9900 self.expect_keyword(FROM)?;
9901 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9902 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9903 privileges,
9904 target,
9905 roles,
9906 }))
9907 }
9908
9909 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9912 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9913 self.expect_keyword(FROM)?;
9914 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9915 Ok(Statement::RevokeRole(RevokeRoleStatement {
9916 role_names,
9917 member_names,
9918 }))
9919 }
9920
9921 fn expect_grant_target_specification(
9922 &mut self,
9923 statement_type: &str,
9924 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9925 if self.parse_keyword(SYSTEM) {
9926 return Ok(GrantTargetSpecification::System);
9927 }
9928
9929 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9930 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9931 let object_spec_inner = if self.parse_keyword(IN) {
9932 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9933 return parser_err!(
9934 self,
9935 self.peek_prev_pos(),
9936 format!("IN invalid for {object_type}S")
9937 );
9938 }
9939 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9940 DATABASE => GrantTargetSpecificationInner::All(
9941 GrantTargetAllSpecification::AllDatabases {
9942 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9943 },
9944 ),
9945 SCHEMA => {
9946 if object_type == ObjectType::Schema {
9947 self.prev_token();
9948 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9949 }
9950 GrantTargetSpecificationInner::All(
9951 GrantTargetAllSpecification::AllSchemas {
9952 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9953 },
9954 )
9955 }
9956 _ => unreachable!(),
9957 }
9958 } else {
9959 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9960 };
9961 (object_type, object_spec_inner)
9962 } else {
9963 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9964 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9965 names: self
9966 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9967 };
9968 (object_type, object_spec_inner)
9969 };
9970
9971 Ok(GrantTargetSpecification::Object {
9972 object_type,
9973 object_spec_inner,
9974 })
9975 }
9976
9977 fn expect_grant_revoke_object_type(
9980 &mut self,
9981 statement_type: &str,
9982 ) -> Result<ObjectType, ParserError> {
9983 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9985 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9986 }
9987
9988 fn expect_grant_revoke_plural_object_type(
9991 &mut self,
9992 statement_type: &str,
9993 ) -> Result<ObjectType, ParserError> {
9994 let object_type = self.expect_plural_object_type().map_err(|_| {
9995 self.expected::<_, ObjectType>(
9997 self.peek_pos(),
9998 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9999 self.peek_token(),
10000 )
10001 .unwrap_err()
10002 })?;
10003 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
10004 Ok(object_type)
10005 }
10006
10007 fn expect_grant_revoke_object_type_inner(
10008 &self,
10009 statement_type: &str,
10010 object_type: ObjectType,
10011 ) -> Result<ObjectType, ParserError> {
10012 match object_type {
10013 ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
10014 parser_err!(
10015 self,
10016 self.peek_prev_pos(),
10017 format!(
10018 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
10019 )
10020 )
10021 }
10022 ObjectType::Sink
10023 | ObjectType::MetricSink
10024 | ObjectType::Index
10025 | ObjectType::ClusterReplica
10026 | ObjectType::Role
10027 | ObjectType::Func
10028 | ObjectType::Subsource => {
10029 parser_err!(
10030 self,
10031 self.peek_prev_pos(),
10032 format!("Unsupported {statement_type} on {object_type}")
10033 )
10034 }
10035 ObjectType::Table
10036 | ObjectType::Type
10037 | ObjectType::Cluster
10038 | ObjectType::Secret
10039 | ObjectType::Connection
10040 | ObjectType::Database
10041 | ObjectType::Schema
10042 | ObjectType::NetworkPolicy => Ok(object_type),
10043 }
10044 }
10045
10046 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
10048 Ok(
10049 match self.expect_one_of_keywords(&[
10050 TABLE,
10051 VIEW,
10052 MATERIALIZED,
10053 SOURCE,
10054 SINK,
10055 METRIC,
10056 INDEX,
10057 TYPE,
10058 ROLE,
10059 USER,
10060 CLUSTER,
10061 SECRET,
10062 CONNECTION,
10063 DATABASE,
10064 SCHEMA,
10065 FUNCTION,
10066 NETWORK,
10067 ])? {
10068 TABLE => ObjectType::Table,
10069 VIEW => ObjectType::View,
10070 MATERIALIZED => {
10071 if let Err(e) = self.expect_keyword(VIEW) {
10072 self.prev_token();
10073 return Err(e);
10074 }
10075 ObjectType::MaterializedView
10076 }
10077 SOURCE => ObjectType::Source,
10078 SINK => ObjectType::Sink,
10079 METRIC => {
10080 if let Err(e) = self.expect_keyword(SINK) {
10081 self.prev_token();
10082 return Err(e);
10083 }
10084 ObjectType::MetricSink
10085 }
10086 INDEX => ObjectType::Index,
10087 TYPE => ObjectType::Type,
10088 ROLE | USER => ObjectType::Role,
10089 CLUSTER => {
10090 if self.parse_keyword(REPLICA) {
10091 ObjectType::ClusterReplica
10092 } else {
10093 ObjectType::Cluster
10094 }
10095 }
10096 SECRET => ObjectType::Secret,
10097 CONNECTION => ObjectType::Connection,
10098 DATABASE => ObjectType::Database,
10099 SCHEMA => ObjectType::Schema,
10100 FUNCTION => ObjectType::Func,
10101 NETWORK => {
10102 if let Err(e) = self.expect_keyword(POLICY) {
10103 self.prev_token();
10104 return Err(e);
10105 }
10106 ObjectType::NetworkPolicy
10107 }
10108 _ => unreachable!(),
10109 },
10110 )
10111 }
10112
10113 fn parse_object_type(&mut self) -> Option<ObjectType> {
10115 Some(
10116 match self.parse_one_of_keywords(&[
10117 TABLE,
10118 VIEW,
10119 MATERIALIZED,
10120 SOURCE,
10121 SINK,
10122 METRIC,
10123 INDEX,
10124 TYPE,
10125 ROLE,
10126 USER,
10127 CLUSTER,
10128 SECRET,
10129 CONNECTION,
10130 DATABASE,
10131 SCHEMA,
10132 FUNCTION,
10133 NETWORK,
10134 ])? {
10135 TABLE => ObjectType::Table,
10136 VIEW => ObjectType::View,
10137 MATERIALIZED => {
10138 if self.parse_keyword(VIEW) {
10139 ObjectType::MaterializedView
10140 } else {
10141 self.prev_token();
10142 return None;
10143 }
10144 }
10145 SOURCE => ObjectType::Source,
10146 SINK => ObjectType::Sink,
10147 METRIC => {
10148 if self.parse_keyword(SINK) {
10149 ObjectType::MetricSink
10150 } else {
10151 self.prev_token();
10152 return None;
10153 }
10154 }
10155 INDEX => ObjectType::Index,
10156 TYPE => ObjectType::Type,
10157 ROLE | USER => ObjectType::Role,
10158 CLUSTER => {
10159 if self.parse_keyword(REPLICA) {
10160 ObjectType::ClusterReplica
10161 } else {
10162 ObjectType::Cluster
10163 }
10164 }
10165 SECRET => ObjectType::Secret,
10166 CONNECTION => ObjectType::Connection,
10167 DATABASE => ObjectType::Database,
10168 SCHEMA => ObjectType::Schema,
10169 FUNCTION => ObjectType::Func,
10170 NETWORK => {
10171 if self.parse_keyword(POLICY) {
10172 ObjectType::NetworkPolicy
10173 } else {
10174 self.prev_token();
10175 return None;
10176 }
10177 }
10178 _ => unreachable!(),
10179 },
10180 )
10181 }
10182
10183 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10185 Ok(
10186 match self.expect_one_of_keywords(&[
10187 TABLES,
10188 VIEWS,
10189 MATERIALIZED,
10190 SOURCES,
10191 SINKS,
10192 INDEXES,
10193 TYPES,
10194 ROLES,
10195 USERS,
10196 CLUSTER,
10197 CLUSTERS,
10198 SECRETS,
10199 CONNECTIONS,
10200 DATABASES,
10201 SCHEMAS,
10202 POLICIES,
10203 ])? {
10204 TABLES => ObjectType::Table,
10205 VIEWS => ObjectType::View,
10206 MATERIALIZED => {
10207 if let Err(e) = self.expect_keyword(VIEWS) {
10208 self.prev_token();
10209 return Err(e);
10210 }
10211 ObjectType::MaterializedView
10212 }
10213 SOURCES => ObjectType::Source,
10214 SINKS => ObjectType::Sink,
10215 INDEXES => ObjectType::Index,
10216 TYPES => ObjectType::Type,
10217 ROLES | USERS => ObjectType::Role,
10218 CLUSTER => {
10219 if let Err(e) = self.expect_keyword(REPLICAS) {
10220 self.prev_token();
10221 return Err(e);
10222 }
10223 ObjectType::ClusterReplica
10224 }
10225 CLUSTERS => ObjectType::Cluster,
10226 SECRETS => ObjectType::Secret,
10227 CONNECTIONS => ObjectType::Connection,
10228 DATABASES => ObjectType::Database,
10229 SCHEMAS => ObjectType::Schema,
10230 POLICIES => ObjectType::NetworkPolicy,
10231 _ => unreachable!(),
10232 },
10233 )
10234 }
10235
10236 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10238 Some(
10239 match self.parse_one_of_keywords(&[
10240 TABLES,
10241 VIEWS,
10242 MATERIALIZED,
10243 SOURCES,
10244 SINKS,
10245 METRIC,
10246 INDEXES,
10247 TYPES,
10248 ROLES,
10249 USERS,
10250 CLUSTER,
10251 CLUSTERS,
10252 SECRETS,
10253 CONNECTIONS,
10254 DATABASES,
10255 SCHEMAS,
10256 SUBSOURCES,
10257 NETWORK,
10258 ])? {
10259 TABLES => ObjectType::Table,
10260 VIEWS => ObjectType::View,
10261 MATERIALIZED => {
10262 if self.parse_keyword(VIEWS) {
10263 ObjectType::MaterializedView
10264 } else {
10265 self.prev_token();
10266 return None;
10267 }
10268 }
10269 SOURCES => ObjectType::Source,
10270 SINKS => ObjectType::Sink,
10271 METRIC => {
10272 if self.parse_keyword(SINKS) {
10273 ObjectType::MetricSink
10274 } else {
10275 self.prev_token();
10276 return None;
10277 }
10278 }
10279 INDEXES => ObjectType::Index,
10280 TYPES => ObjectType::Type,
10281 ROLES | USERS => ObjectType::Role,
10282 CLUSTER => {
10283 if self.parse_keyword(REPLICAS) {
10284 ObjectType::ClusterReplica
10285 } else {
10286 self.prev_token();
10287 return None;
10288 }
10289 }
10290 CLUSTERS => ObjectType::Cluster,
10291 SECRETS => ObjectType::Secret,
10292 CONNECTIONS => ObjectType::Connection,
10293 DATABASES => ObjectType::Database,
10294 SCHEMAS => ObjectType::Schema,
10295 SUBSOURCES => ObjectType::Subsource,
10296 NETWORK => {
10297 if self.parse_keyword(POLICIES) {
10298 ObjectType::NetworkPolicy
10299 } else {
10300 self.prev_token();
10301 return None;
10302 }
10303 }
10304 _ => unreachable!(),
10305 },
10306 )
10307 }
10308
10309 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10312 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10313 return parser_err!(
10314 self,
10315 self.peek_prev_pos(),
10316 format!("For object type {object_type}, you must specify 'TABLES'")
10317 );
10318 }
10319 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10320 self.prev_token();
10321 return parser_err!(
10322 self,
10323 self.peek_prev_pos(),
10324 "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10325 );
10326 }
10327
10328 Ok(
10329 match self.expect_one_of_keywords(&[
10330 TABLES,
10331 TYPES,
10332 CLUSTERS,
10333 SECRETS,
10334 CONNECTIONS,
10335 DATABASES,
10336 SCHEMAS,
10337 ])? {
10338 TABLES => ObjectType::Table,
10339 TYPES => ObjectType::Type,
10340 CLUSTERS => ObjectType::Cluster,
10341 SECRETS => ObjectType::Secret,
10342 CONNECTIONS => ObjectType::Connection,
10343 DATABASES => ObjectType::Database,
10344 SCHEMAS => ObjectType::Schema,
10345 _ => unreachable!(),
10346 },
10347 )
10348 }
10349
10350 fn expect_plural_system_object_type_for_privileges(
10353 &mut self,
10354 ) -> Result<SystemObjectType, ParserError> {
10355 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10356 return parser_err!(
10357 self,
10358 self.peek_prev_pos(),
10359 format!("For object type {object_type}, you must specify 'TABLES'")
10360 );
10361 }
10362 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10363 self.prev_token();
10364 return parser_err!(
10365 self,
10366 self.peek_prev_pos(),
10367 "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10368 );
10369 }
10370
10371 Ok(
10372 match self.expect_one_of_keywords(&[
10373 SYSTEM,
10374 TABLES,
10375 TYPES,
10376 CLUSTERS,
10377 SECRETS,
10378 CONNECTIONS,
10379 DATABASES,
10380 SCHEMAS,
10381 ])? {
10382 SYSTEM => SystemObjectType::System,
10383 TABLES => SystemObjectType::Object(ObjectType::Table),
10384 TYPES => SystemObjectType::Object(ObjectType::Type),
10385 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10386 SECRETS => SystemObjectType::Object(ObjectType::Secret),
10387 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10388 DATABASES => SystemObjectType::Object(ObjectType::Database),
10389 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10390 _ => unreachable!(),
10391 },
10392 )
10393 }
10394
10395 fn parse_privilege(&mut self) -> Option<Privilege> {
10397 Some(
10398 match self.parse_one_of_keywords(&[
10399 INSERT,
10400 SELECT,
10401 UPDATE,
10402 DELETE,
10403 USAGE,
10404 CREATE,
10405 CREATEROLE,
10406 CREATEDB,
10407 CREATECLUSTER,
10408 CREATENETWORKPOLICY,
10409 ])? {
10410 INSERT => Privilege::INSERT,
10411 SELECT => Privilege::SELECT,
10412 UPDATE => Privilege::UPDATE,
10413 DELETE => Privilege::DELETE,
10414 USAGE => Privilege::USAGE,
10415 CREATE => Privilege::CREATE,
10416 CREATEROLE => Privilege::CREATEROLE,
10417 CREATEDB => Privilege::CREATEDB,
10418 CREATECLUSTER => Privilege::CREATECLUSTER,
10419 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10420 _ => unreachable!(),
10421 },
10422 )
10423 }
10424
10425 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10427 if self.parse_keyword(ALL) {
10428 let _ = self.parse_keyword(PRIVILEGES);
10429 return Some(PrivilegeSpecification::All);
10430 }
10431
10432 let mut privileges = Vec::new();
10433 while let Some(privilege) = self.parse_privilege() {
10434 privileges.push(privilege);
10435 if !self.consume_token(&Token::Comma) {
10436 break;
10437 }
10438 }
10439
10440 if privileges.is_empty() {
10441 None
10442 } else {
10443 Some(PrivilegeSpecification::Privileges(privileges))
10444 }
10445 }
10446
10447 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10449 let _ = self.parse_keyword(GROUP);
10450 self.parse_identifier()
10451 }
10452
10453 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10456 self.expect_keywords(&[OWNED, BY])?;
10457 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10458 self.expect_keyword(TO)?;
10459 let new_role = self.parse_identifier()?;
10460 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10461 old_roles,
10462 new_role,
10463 }))
10464 }
10465
10466 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10467 self.expect_keyword(ON)?;
10468
10469 let object = match self.expect_one_of_keywords(&[
10470 TABLE,
10471 VIEW,
10472 COLUMN,
10473 MATERIALIZED,
10474 SOURCE,
10475 SINK,
10476 INDEX,
10477 FUNCTION,
10478 CONNECTION,
10479 TYPE,
10480 SECRET,
10481 ROLE,
10482 DATABASE,
10483 SCHEMA,
10484 CLUSTER,
10485 NETWORK,
10486 ])? {
10487 TABLE => {
10488 let name = self.parse_raw_name()?;
10489 CommentObjectType::Table { name }
10490 }
10491 VIEW => {
10492 let name = self.parse_raw_name()?;
10493 CommentObjectType::View { name }
10494 }
10495 MATERIALIZED => {
10496 self.expect_keyword(VIEW)?;
10497 let name = self.parse_raw_name()?;
10498 CommentObjectType::MaterializedView { name }
10499 }
10500 SOURCE => {
10501 let name = self.parse_raw_name()?;
10502 CommentObjectType::Source { name }
10503 }
10504 SINK => {
10505 let name = self.parse_raw_name()?;
10506 CommentObjectType::Sink { name }
10507 }
10508 INDEX => {
10509 let name = self.parse_raw_name()?;
10510 CommentObjectType::Index { name }
10511 }
10512 FUNCTION => {
10513 let name = self.parse_raw_name()?;
10514 CommentObjectType::Func { name }
10515 }
10516 CONNECTION => {
10517 let name = self.parse_raw_name()?;
10518 CommentObjectType::Connection { name }
10519 }
10520 TYPE => {
10521 let ty = self.parse_data_type()?;
10522 CommentObjectType::Type { ty }
10523 }
10524 SECRET => {
10525 let name = self.parse_raw_name()?;
10526 CommentObjectType::Secret { name }
10527 }
10528 ROLE => {
10529 let name = self.parse_identifier()?;
10530 CommentObjectType::Role { name }
10531 }
10532 DATABASE => {
10533 let name = self.parse_database_name()?;
10534 CommentObjectType::Database { name }
10535 }
10536 SCHEMA => {
10537 let name = self.parse_schema_name()?;
10538 CommentObjectType::Schema { name }
10539 }
10540 CLUSTER => {
10541 if self.parse_keyword(REPLICA) {
10542 let name = self.parse_cluster_replica_name()?;
10543 CommentObjectType::ClusterReplica { name }
10544 } else {
10545 let name = self.parse_raw_ident()?;
10546 CommentObjectType::Cluster { name }
10547 }
10548 }
10549 COLUMN => {
10550 let name = self.parse_column_name()?;
10551 CommentObjectType::Column { name }
10552 }
10553 NETWORK => {
10554 self.expect_keyword(POLICY)?;
10555 let name = self.parse_raw_network_policy_name()?;
10556 CommentObjectType::NetworkPolicy { name }
10557 }
10558 _ => unreachable!(),
10559 };
10560
10561 self.expect_keyword(IS)?;
10562 let comment = match self.next_token() {
10563 Some(Token::Keyword(NULL)) => None,
10564 Some(Token::String(s)) => Some(s),
10565 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10566 };
10567
10568 Ok(Statement::Comment(CommentStatement { object, comment }))
10569 }
10570
10571 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10572 where
10573 S: TryInto<IdentString>,
10574 <S as TryInto<IdentString>>::Error: fmt::Display,
10575 {
10576 Ident::new(s).map_err(|e| ParserError {
10577 pos: self.peek_prev_pos(),
10578 message: e.to_string(),
10579 })
10580 }
10581}
10582
10583impl CheckedRecursion for Parser<'_> {
10584 fn recursion_guard(&self) -> &RecursionGuard {
10585 &self.recursion_guard
10586 }
10587}
10588
10589enum ParenthesizedFragment {
10593 Query(Query<Raw>),
10594 Exprs(Vec<Expr<Raw>>),
10595}
10596
10597impl ParenthesizedFragment {
10598 fn into_expr(self) -> Expr<Raw> {
10600 match self {
10601 ParenthesizedFragment::Exprs(exprs) => {
10602 if exprs.len() == 1 {
10605 Expr::Nested(Box::new(exprs.into_element()))
10608 } else {
10609 Expr::Row { exprs }
10612 }
10613 }
10614 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10616 }
10617 }
10618}
10619
10620include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));