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