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 Some(Token::Number(n)) => n,
4503 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4504 };
4505 if id.is_empty() {
4508 return parser_err!(self, self.peek_prev_pos(), "expected id");
4509 }
4510 Ok(id)
4511 }
4512
4513 fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4514 if self.parse_keywords(&[IN, CLUSTER]) {
4515 Ok(Some(self.parse_raw_ident()?))
4516 } else {
4517 Ok(None)
4518 }
4519 }
4520
4521 fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4522 self.expect_keyword(ROLE)?;
4523 let name = self.parse_identifier()?;
4524 let _ = self.parse_keyword(WITH);
4525 let options = self.parse_role_attributes()?;
4526 Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4527 }
4528
4529 fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4530 let mut options = vec![];
4531 loop {
4532 match self.parse_one_of_keywords(&[
4533 SUPERUSER,
4534 NOSUPERUSER,
4535 LOGIN,
4536 NOLOGIN,
4537 INHERIT,
4538 NOINHERIT,
4539 CREATECLUSTER,
4540 NOCREATECLUSTER,
4541 CREATEDB,
4542 NOCREATEDB,
4543 CREATEROLE,
4544 NOCREATEROLE,
4545 PASSWORD,
4546 ]) {
4547 None => break,
4548 Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4549 Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4550 Some(LOGIN) => options.push(RoleAttribute::Login),
4551 Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4552 Some(INHERIT) => options.push(RoleAttribute::Inherit),
4553 Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4554 Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4555 Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4556 Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4557 Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4558 Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4559 Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4560 Some(PASSWORD) => {
4561 if self.parse_keyword(NULL) {
4562 options.push(RoleAttribute::Password(None));
4563 continue;
4564 }
4565 let password = self.parse_literal_string()?;
4566 options.push(RoleAttribute::Password(Some(password)));
4567 }
4568 Some(_) => unreachable!(),
4569 }
4570 }
4571 Ok(options)
4572 }
4573
4574 fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4575 self.expect_keyword(SECRET)?;
4576 let if_not_exists = self.parse_if_not_exists()?;
4577 let name = self.parse_item_name()?;
4578 self.expect_keyword(AS)?;
4579 let value = self.parse_expr()?;
4580 Ok(Statement::CreateSecret(CreateSecretStatement {
4581 name,
4582 if_not_exists,
4583 value,
4584 }))
4585 }
4586
4587 fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4588 self.expect_keyword(TYPE)?;
4589 let name = self.parse_item_name()?;
4590 self.expect_keyword(AS)?;
4591
4592 match self.parse_one_of_keywords(&[LIST, MAP]) {
4593 Some(LIST) => {
4594 self.expect_token(&Token::LParen)?;
4595 let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4596 self.expect_token(&Token::RParen)?;
4597 Ok(Statement::CreateType(CreateTypeStatement {
4598 name,
4599 as_type: CreateTypeAs::List { options },
4600 }))
4601 }
4602 Some(MAP) => {
4603 self.expect_token(&Token::LParen)?;
4604 let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4605 self.expect_token(&Token::RParen)?;
4606 Ok(Statement::CreateType(CreateTypeStatement {
4607 name,
4608 as_type: CreateTypeAs::Map { options },
4609 }))
4610 }
4611 None => {
4612 let column_defs = self.parse_composite_type_definition()?;
4613
4614 Ok(Statement::CreateType(CreateTypeStatement {
4615 name,
4616 as_type: CreateTypeAs::Record { column_defs },
4617 }))
4618 }
4619 _ => unreachable!(),
4620 }
4621 }
4622
4623 fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4624 self.expect_keywords(&[ELEMENT, TYPE])?;
4625 let name = CreateTypeListOptionName::ElementType;
4626 Ok(CreateTypeListOption {
4627 name,
4628 value: Some(self.parse_data_type_option_value()?),
4629 })
4630 }
4631
4632 fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4633 let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4634 KEY => {
4635 self.expect_keyword(TYPE)?;
4636 CreateTypeMapOptionName::KeyType
4637 }
4638 VALUE => {
4639 self.expect_keyword(TYPE)?;
4640 CreateTypeMapOptionName::ValueType
4641 }
4642 _ => unreachable!(),
4643 };
4644 Ok(CreateTypeMapOption {
4645 name,
4646 value: Some(self.parse_data_type_option_value()?),
4647 })
4648 }
4649
4650 fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4651 let if_not_exists = self.parse_if_not_exists()?;
4652 let name = self.parse_identifier()?;
4653 let paren = self.consume_token(&Token::LParen);
4656 let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4657 if paren {
4658 self.expect_token(&Token::RParen)?;
4659 }
4660
4661 let features = if self.parse_keywords(&[FEATURES]) {
4662 self.expect_token(&Token::LParen)?;
4663 let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4664 self.expect_token(&Token::RParen)?;
4665 features
4666 } else {
4667 Vec::new()
4668 };
4669
4670 Ok(Statement::CreateCluster(CreateClusterStatement {
4671 name,
4672 options,
4673 features,
4674 if_not_exists,
4675 }))
4676 }
4677
4678 fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4679 let option = self.expect_one_of_keywords(&[
4680 AUTO,
4681 AVAILABILITY,
4682 DISK,
4683 EXPERIMENTAL,
4684 INTROSPECTION,
4685 MANAGED,
4686 REPLICAS,
4687 REPLICATION,
4688 SIZE,
4689 SCHEDULE,
4690 WORKLOAD,
4691 ])?;
4692 let name = match option {
4693 AUTO => {
4694 self.expect_keywords(&[SCALING, STRATEGY])?;
4695 ClusterOptionName::AutoScalingStrategy
4696 }
4697 AVAILABILITY => {
4698 self.expect_keyword(ZONES)?;
4699 ClusterOptionName::AvailabilityZones
4700 }
4701 DISK => ClusterOptionName::Disk,
4702 EXPERIMENTAL => {
4703 self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4704 ClusterOptionName::ExperimentalArrangementCompression
4705 }
4706 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4707 DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4708 INTERVAL => ClusterOptionName::IntrospectionInterval,
4709 _ => unreachable!(),
4710 },
4711 MANAGED => ClusterOptionName::Managed,
4712 REPLICAS => ClusterOptionName::Replicas,
4713 REPLICATION => {
4714 self.expect_keyword(FACTOR)?;
4715 ClusterOptionName::ReplicationFactor
4716 }
4717 SIZE => ClusterOptionName::Size,
4718 SCHEDULE => ClusterOptionName::Schedule,
4719 WORKLOAD => {
4720 self.expect_keyword(CLASS)?;
4721 ClusterOptionName::WorkloadClass
4722 }
4723 _ => unreachable!(),
4724 };
4725 Ok(name)
4726 }
4727
4728 fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4729 let name = self.parse_cluster_option_name()?;
4730
4731 match name {
4732 ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4733 ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4734 ClusterOptionName::AutoScalingStrategy => {
4735 self.parse_cluster_option_auto_scaling_strategy()
4736 }
4737 _ => {
4738 let value = self.parse_optional_option_value()?;
4739 Ok(ClusterOption { name, value })
4740 }
4741 }
4742 }
4743
4744 fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4745 let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4746 WAIT => {
4747 let _ = self.consume_token(&Token::Eq);
4748 let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4749 FOR => Some(WithOptionValue::ClusterAlterStrategy(
4750 ClusterAlterOptionValue::For(self.parse_value()?),
4751 )),
4752 UNTIL => {
4753 self.expect_keyword(READY)?;
4754 let _ = self.consume_token(&Token::Eq);
4755 self.expect_token(&Token::LParen)?;
4756 let opts = Some(WithOptionValue::ClusterAlterStrategy(
4757 ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4758 Parser::parse_cluster_alter_until_ready_option,
4759 )?),
4760 ));
4761 self.expect_token(&Token::RParen)?;
4762 opts
4763 }
4764 _ => unreachable!(),
4765 };
4766 (ClusterAlterOptionName::Wait, v)
4767 }
4768 _ => unreachable!(),
4769 };
4770 Ok(ClusterAlterOption { name, value })
4771 }
4772
4773 fn parse_cluster_alter_until_ready_option(
4774 &mut self,
4775 ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4776 let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4777 ON => {
4778 self.expect_keywords(&[TIMEOUT])?;
4779 ClusterAlterUntilReadyOptionName::OnTimeout
4780 }
4781 TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4782 _ => unreachable!(),
4783 };
4784 let value = self.parse_optional_option_value()?;
4785 Ok(ClusterAlterUntilReadyOption { name, value })
4786 }
4787
4788 fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4789 let _ = self.consume_token(&Token::Eq);
4790 self.expect_token(&Token::LParen)?;
4791 let replicas = if self.consume_token(&Token::RParen) {
4792 vec![]
4793 } else {
4794 let replicas = self.parse_comma_separated(|parser| {
4795 let name = parser.parse_identifier()?;
4796 parser.expect_token(&Token::LParen)?;
4797 let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4798 parser.expect_token(&Token::RParen)?;
4799 Ok(ReplicaDefinition { name, options })
4800 })?;
4801 self.expect_token(&Token::RParen)?;
4802 replicas
4803 };
4804 Ok(ClusterOption {
4805 name: ClusterOptionName::Replicas,
4806 value: Some(WithOptionValue::ClusterReplicas(replicas)),
4807 })
4808 }
4809
4810 fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4811 let _ = self.consume_token(&Token::Eq);
4812 let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4813 let value = match kw {
4814 MANUAL => ClusterScheduleOptionValue::Manual,
4815 ON => {
4816 self.expect_keyword(REFRESH)?;
4817 let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4819 self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4820 let _ = self.consume_token(&Token::Eq);
4821 let interval = self.parse_interval_value()?;
4822 self.expect_token(&Token::RParen)?;
4823 Some(interval)
4824 } else {
4825 None
4826 };
4827 ClusterScheduleOptionValue::Refresh {
4828 hydration_time_estimate,
4829 }
4830 }
4831 _ => unreachable!(),
4832 };
4833 Ok(ClusterOption {
4834 name: ClusterOptionName::Schedule,
4835 value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4836 })
4837 }
4838
4839 fn parse_cluster_option_auto_scaling_strategy(
4844 &mut self,
4845 ) -> Result<ClusterOption<Raw>, ParserError> {
4846 let _ = self.consume_token(&Token::Eq);
4847 self.expect_token(&Token::LParen)?;
4848 let mut value = ClusterAutoScalingStrategyOptionValue { on_hydration: None };
4849 if !self.consume_token(&Token::RParen) {
4850 loop {
4853 self.expect_keywords(&[ON, HYDRATION])?;
4854 self.expect_token(&Token::LParen)?;
4855 self.expect_keywords(&[HYDRATION, SIZE])?;
4856 let _ = self.consume_token(&Token::Eq);
4857 let hydration_size = self.parse_value()?;
4858 let linger_duration = if self.consume_token(&Token::Comma) {
4859 self.expect_keywords(&[LINGER, DURATION])?;
4860 let _ = self.consume_token(&Token::Eq);
4861 Some(self.parse_value()?)
4862 } else {
4863 None
4864 };
4865 self.expect_token(&Token::RParen)?;
4866 if value.on_hydration.is_some() {
4869 return parser_err!(
4870 self,
4871 self.peek_prev_pos(),
4872 "ON HYDRATION specified more than once"
4873 );
4874 }
4875 value.on_hydration = Some(OnHydrationOptionValue {
4876 hydration_size,
4877 linger_duration,
4878 });
4879 if !self.consume_token(&Token::Comma) {
4880 break;
4881 }
4882 }
4883 self.expect_token(&Token::RParen)?;
4884 }
4885 Ok(ClusterOption {
4886 name: ClusterOptionName::AutoScalingStrategy,
4887 value: Some(WithOptionValue::ClusterAutoScalingStrategyOptionValue(
4888 value,
4889 )),
4890 })
4891 }
4892
4893 fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4894 let name = match self.expect_one_of_keywords(&[
4895 AVAILABILITY,
4896 BILLED,
4897 COMPUTE,
4898 COMPUTECTL,
4899 DISK,
4900 EXPERIMENTAL,
4901 INTERNAL,
4902 INTROSPECTION,
4903 SIZE,
4904 STORAGE,
4905 STORAGECTL,
4906 WORKERS,
4907 ])? {
4908 AVAILABILITY => {
4909 self.expect_keyword(ZONE)?;
4910 ReplicaOptionName::AvailabilityZone
4911 }
4912 BILLED => {
4913 self.expect_keyword(AS)?;
4914 ReplicaOptionName::BilledAs
4915 }
4916 COMPUTE => {
4917 self.expect_keyword(ADDRESSES)?;
4918 ReplicaOptionName::ComputeAddresses
4919 }
4920 COMPUTECTL => {
4921 self.expect_keyword(ADDRESSES)?;
4922 ReplicaOptionName::ComputectlAddresses
4923 }
4924 DISK => ReplicaOptionName::Disk,
4925 EXPERIMENTAL => {
4926 self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4927 ReplicaOptionName::ExperimentalArrangementCompression
4928 }
4929 INTERNAL => ReplicaOptionName::Internal,
4930 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4931 DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4932 INTERVAL => ReplicaOptionName::IntrospectionInterval,
4933 _ => unreachable!(),
4934 },
4935 SIZE => ReplicaOptionName::Size,
4936 STORAGE => {
4937 self.expect_keyword(ADDRESSES)?;
4938 ReplicaOptionName::StorageAddresses
4939 }
4940 STORAGECTL => {
4941 self.expect_keyword(ADDRESSES)?;
4942 ReplicaOptionName::StoragectlAddresses
4943 }
4944 WORKERS => ReplicaOptionName::Workers,
4945 _ => unreachable!(),
4946 };
4947 let value = self.parse_optional_option_value()?;
4948 Ok(ReplicaOption { name, value })
4949 }
4950
4951 fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4952 Ok(ClusterFeature {
4953 name: self.parse_cluster_feature_name()?,
4954 value: self.parse_optional_option_value()?,
4955 })
4956 }
4957
4958 fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4959 self.next_token();
4960 let if_not_exists = self.parse_if_not_exists()?;
4961 let of_cluster = self.parse_identifier()?;
4962 self.expect_token(&Token::Dot)?;
4963 let name = self.parse_identifier()?;
4964 let paren = self.consume_token(&Token::LParen);
4967 let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4968 if paren {
4969 let _ = self.consume_token(&Token::RParen);
4970 }
4971 Ok(Statement::CreateClusterReplica(
4972 CreateClusterReplicaStatement {
4973 of_cluster,
4974 definition: ReplicaDefinition { name, options },
4975 if_not_exists,
4976 },
4977 ))
4978 }
4979
4980 fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4981 if self.parse_keyword(IF) {
4982 self.expect_keyword(EXISTS)?;
4983 Ok(true)
4984 } else {
4985 Ok(false)
4986 }
4987 }
4988
4989 fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4990 if self.parse_keyword(IF) {
4991 self.expect_keywords(&[NOT, EXISTS])?;
4992 Ok(true)
4993 } else {
4994 Ok(false)
4995 }
4996 }
4997
4998 fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4999 self.parse_keyword(AS)
5000 .then(|| self.parse_identifier())
5001 .transpose()
5002 }
5003
5004 fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
5005 if self.parse_keyword(INCLUDE) {
5006 self.parse_comma_separated(|parser| {
5007 let metadata = match parser
5008 .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
5009 {
5010 KEY => SourceIncludeMetadata::Key {
5011 alias: parser.parse_alias()?,
5012 },
5013 TIMESTAMP => SourceIncludeMetadata::Timestamp {
5014 alias: parser.parse_alias()?,
5015 },
5016 PARTITION => SourceIncludeMetadata::Partition {
5017 alias: parser.parse_alias()?,
5018 },
5019 OFFSET => SourceIncludeMetadata::Offset {
5020 alias: parser.parse_alias()?,
5021 },
5022 HEADERS => SourceIncludeMetadata::Headers {
5023 alias: parser.parse_alias()?,
5024 },
5025 HEADER => {
5026 let key: String = parser.parse_literal_string()?;
5027 parser.expect_keyword(AS)?;
5028 let alias = parser.parse_identifier()?;
5029 let use_bytes = parser.parse_keyword(BYTES);
5030 SourceIncludeMetadata::Header {
5031 alias,
5032 key,
5033 use_bytes,
5034 }
5035 }
5036 _ => unreachable!("only explicitly allowed items can be parsed"),
5037 };
5038 Ok(metadata)
5039 })
5040 } else {
5041 Ok(vec![])
5042 }
5043 }
5044
5045 fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
5046 let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
5047 ALL => DiscardTarget::All,
5048 PLANS => DiscardTarget::Plans,
5049 SEQUENCES => DiscardTarget::Sequences,
5050 TEMP | TEMPORARY => DiscardTarget::Temp,
5051 _ => unreachable!(),
5052 };
5053 Ok(Statement::Discard(DiscardStatement { target }))
5054 }
5055
5056 fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5057 if self.parse_keyword(OWNED) {
5058 self.parse_drop_owned()
5059 .map_parser_err(StatementKind::DropOwned)
5060 } else {
5061 self.parse_drop_objects()
5062 .map_parser_err(StatementKind::DropObjects)
5063 }
5064 }
5065
5066 fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
5067 let object_type = self.expect_object_type()?;
5068 let if_exists = self.parse_if_exists()?;
5069 match object_type {
5070 ObjectType::Database => {
5071 let name = UnresolvedObjectName::Database(self.parse_database_name()?);
5072 let restrict = matches!(
5073 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5074 Some(RESTRICT),
5075 );
5076 Ok(Statement::DropObjects(DropObjectsStatement {
5077 object_type: ObjectType::Database,
5078 if_exists,
5079 names: vec![name],
5080 cascade: !restrict,
5081 }))
5082 }
5083 ObjectType::Schema => {
5084 let names = self.parse_comma_separated(|parser| {
5085 Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
5086 })?;
5087
5088 let cascade = matches!(
5089 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5090 Some(CASCADE),
5091 );
5092 Ok(Statement::DropObjects(DropObjectsStatement {
5093 object_type: ObjectType::Schema,
5094 if_exists,
5095 names,
5096 cascade,
5097 }))
5098 }
5099 ObjectType::Role => {
5100 let names = self.parse_comma_separated(|parser| {
5101 Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
5102 })?;
5103 Ok(Statement::DropObjects(DropObjectsStatement {
5104 object_type: ObjectType::Role,
5105 if_exists,
5106 names,
5107 cascade: false,
5108 }))
5109 }
5110 ObjectType::NetworkPolicy => {
5111 let names = self.parse_comma_separated(|parser| {
5112 Ok(UnresolvedObjectName::NetworkPolicy(
5113 parser.parse_identifier()?,
5114 ))
5115 })?;
5116 Ok(Statement::DropObjects(DropObjectsStatement {
5117 object_type: ObjectType::NetworkPolicy,
5118 if_exists,
5119 names,
5120 cascade: false,
5121 }))
5122 }
5123 ObjectType::Cluster => self.parse_drop_clusters(if_exists),
5124 ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
5125 ObjectType::Table
5126 | ObjectType::View
5127 | ObjectType::MaterializedView
5128 | ObjectType::Source
5129 | ObjectType::Sink
5130 | ObjectType::MetricSink
5131 | ObjectType::Index
5132 | ObjectType::Type
5133 | ObjectType::Secret
5134 | ObjectType::Connection => {
5135 let names = self.parse_comma_separated(|parser| {
5136 Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
5137 })?;
5138 let cascade = matches!(
5139 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5140 Some(CASCADE),
5141 );
5142 Ok(Statement::DropObjects(DropObjectsStatement {
5143 object_type,
5144 if_exists,
5145 names,
5146 cascade,
5147 }))
5148 }
5149 ObjectType::Func | ObjectType::Subsource => parser_err!(
5150 self,
5151 self.peek_prev_pos(),
5152 format!("Unsupported DROP on {object_type}")
5153 ),
5154 }
5155 }
5156
5157 fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
5158 let names = self.parse_comma_separated(|parser| {
5159 Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
5160 })?;
5161 let cascade = matches!(
5162 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5163 Some(CASCADE),
5164 );
5165 Ok(Statement::DropObjects(DropObjectsStatement {
5166 object_type: ObjectType::Cluster,
5167 if_exists,
5168 names,
5169 cascade,
5170 }))
5171 }
5172
5173 fn parse_drop_cluster_replicas(
5174 &mut self,
5175 if_exists: bool,
5176 ) -> Result<Statement<Raw>, ParserError> {
5177 let names = self.parse_comma_separated(|p| {
5178 Ok(UnresolvedObjectName::ClusterReplica(
5179 p.parse_cluster_replica_name()?,
5180 ))
5181 })?;
5182 Ok(Statement::DropObjects(DropObjectsStatement {
5183 object_type: ObjectType::ClusterReplica,
5184 if_exists,
5185 names,
5186 cascade: false,
5187 }))
5188 }
5189
5190 fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5191 self.expect_keyword(BY)?;
5192 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5193 let cascade = if self.parse_keyword(CASCADE) {
5194 Some(true)
5195 } else if self.parse_keyword(RESTRICT) {
5196 Some(false)
5197 } else {
5198 None
5199 };
5200 Ok(Statement::DropOwned(DropOwnedStatement {
5201 role_names,
5202 cascade,
5203 }))
5204 }
5205
5206 fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5207 let cluster = self.parse_identifier()?;
5208 self.expect_token(&Token::Dot)?;
5209 let replica = self.parse_identifier()?;
5210 Ok(QualifiedReplica { cluster, replica })
5211 }
5212
5213 fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5214 let name = self.parse_identifier()?;
5215 self.expect_keyword(SET)?;
5216 self.expect_token(&Token::LParen)?;
5217 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5218 self.expect_token(&Token::RParen)?;
5219 Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5220 name,
5221 options,
5222 }))
5223 }
5224
5225 fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5226 self.expect_keywords(&[NETWORK, POLICY])?;
5227 let name = self.parse_identifier()?;
5228 self.expect_token(&Token::LParen)?;
5229 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5230 self.expect_token(&Token::RParen)?;
5231 Ok(Statement::CreateNetworkPolicy(
5232 CreateNetworkPolicyStatement { name, options },
5233 ))
5234 }
5235
5236 fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5237 let name = match self.expect_one_of_keywords(&[RULES])? {
5238 RULES => NetworkPolicyOptionName::Rules,
5239 v => panic!("found unreachable keyword {}", v),
5240 };
5241 match name {
5242 NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5243 }
5244 }
5245
5246 fn parse_network_policy_option_rules(
5247 &mut self,
5248 ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5249 let _ = self.consume_token(&Token::Eq);
5250 self.expect_token(&Token::LParen)?;
5251 let rules = if self.consume_token(&Token::RParen) {
5252 vec![]
5253 } else {
5254 let rules = self.parse_comma_separated(|parser| {
5255 let name = parser.parse_identifier()?;
5256 parser.expect_token(&Token::LParen)?;
5257 let options =
5258 parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5259 parser.expect_token(&Token::RParen)?;
5260 Ok(NetworkPolicyRuleDefinition { name, options })
5261 })?;
5262 self.expect_token(&Token::RParen)?;
5263 rules
5264 };
5265 Ok(NetworkPolicyOption {
5266 name: NetworkPolicyOptionName::Rules,
5267 value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5268 })
5269 }
5270
5271 fn parse_network_policy_rule_option(
5272 &mut self,
5273 ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5274 let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5275 ACTION => NetworkPolicyRuleOptionName::Action,
5276 ADDRESS => NetworkPolicyRuleOptionName::Address,
5277 DIRECTION => NetworkPolicyRuleOptionName::Direction,
5278 v => panic!("found unreachable keyword {}", v),
5279 };
5280 let value = self.parse_optional_option_value()?;
5281 Ok(NetworkPolicyRuleOption { name, value })
5282 }
5283
5284 fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5285 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5286 self.expect_keyword(TABLE)?;
5287 let if_not_exists = self.parse_if_not_exists()?;
5288 let table_name = self.parse_item_name()?;
5289 let (columns, constraints) = self.parse_columns(Mandatory)?;
5291
5292 let with_options = if self.parse_keyword(WITH) {
5293 self.expect_token(&Token::LParen)?;
5294 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5295 vec![]
5296 } else {
5297 self.parse_comma_separated(Parser::parse_table_option)?
5298 };
5299 self.expect_token(&Token::RParen)?;
5300 o
5301 } else {
5302 vec![]
5303 };
5304
5305 Ok(Statement::CreateTable(CreateTableStatement {
5306 name: table_name,
5307 columns,
5308 constraints,
5309 if_not_exists,
5310 temporary,
5311 with_options,
5312 }))
5313 }
5314
5315 fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5316 if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5317 return parser_err!(
5318 self,
5319 self.peek_prev_pos(),
5320 "temporary tables FROM SOURCE are not supported"
5321 );
5322 }
5323 self.expect_keyword(TABLE)?;
5324 let if_not_exists = self.parse_if_not_exists()?;
5325 let table_name = self.parse_item_name()?;
5326
5327 if self.parse_keywords(&[FROM, WEBHOOK]) {
5328 return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5330 }
5331
5332 let (columns, constraints) = self.parse_table_from_source_columns()?;
5333
5334 self.expect_keywords(&[FROM, SOURCE])?;
5335
5336 let source = self.parse_raw_name()?;
5337
5338 let external_reference = if self.consume_token(&Token::LParen) {
5339 self.expect_keyword(REFERENCE)?;
5340 let _ = self.consume_token(&Token::Eq);
5341 let external_reference = self.parse_item_name()?;
5342 self.expect_token(&Token::RParen)?;
5343 Some(external_reference)
5344 } else {
5345 None
5346 };
5347
5348 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5349 Some(KEY) => {
5350 self.expect_keyword(FORMAT)?;
5351 let key = self.parse_format()?;
5352 self.expect_keywords(&[VALUE, FORMAT])?;
5353 let value = self.parse_format()?;
5354 Some(FormatSpecifier::KeyValue { key, value })
5355 }
5356 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5357 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5358 None => None,
5359 };
5360 let include_metadata = self.parse_source_include_metadata()?;
5361
5362 let envelope = if self.parse_keyword(ENVELOPE) {
5363 Some(self.parse_source_envelope()?)
5364 } else {
5365 None
5366 };
5367
5368 let with_options = if self.parse_keyword(WITH) {
5369 self.expect_token(&Token::LParen)?;
5370 let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5371 self.expect_token(&Token::RParen)?;
5372 options
5373 } else {
5374 vec![]
5375 };
5376
5377 Ok(Statement::CreateTableFromSource(
5378 CreateTableFromSourceStatement {
5379 name: table_name,
5380 columns,
5381 constraints,
5382 if_not_exists,
5383 source,
5384 external_reference,
5385 format,
5386 include_metadata,
5387 envelope,
5388 with_options,
5389 },
5390 ))
5391 }
5392
5393 fn parse_table_from_source_option(
5394 &mut self,
5395 ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5396 let option = match self
5397 .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5398 {
5399 TEXT => {
5400 self.expect_keyword(COLUMNS)?;
5401
5402 let _ = self.consume_token(&Token::Eq);
5403
5404 let value = self
5405 .parse_option_sequence(Parser::parse_identifier)?
5406 .map(|inner| {
5407 WithOptionValue::Sequence(
5408 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5409 )
5410 });
5411
5412 TableFromSourceOption {
5413 name: TableFromSourceOptionName::TextColumns,
5414 value,
5415 }
5416 }
5417 EXCLUDE => match self.expect_one_of_keywords(&[COLUMNS, CONSTRAINTS, ALL])? {
5418 COLUMNS => {
5419 let _ = self.consume_token(&Token::Eq);
5420
5421 let value =
5422 self.parse_option_sequence(Parser::parse_identifier)?
5423 .map(|inner| {
5424 WithOptionValue::Sequence(
5425 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5426 )
5427 });
5428
5429 TableFromSourceOption {
5430 name: TableFromSourceOptionName::ExcludeColumns,
5431 value,
5432 }
5433 }
5434 CONSTRAINTS => {
5435 let _ = self.consume_token(&Token::Eq);
5436
5437 let value = self
5441 .parse_option_sequence(Parser::parse_literal_string)?
5442 .map(|inner| {
5443 WithOptionValue::Sequence(
5444 inner
5445 .into_iter()
5446 .map(|s| WithOptionValue::Value(Value::String(s)))
5447 .collect_vec(),
5448 )
5449 });
5450
5451 TableFromSourceOption {
5452 name: TableFromSourceOptionName::ExcludeConstraints,
5453 value,
5454 }
5455 }
5456 ALL => {
5457 let name = match self.expect_one_of_keywords(&[CONSTRAINTS, NOT])? {
5458 CONSTRAINTS => TableFromSourceOptionName::ExcludeAllConstraints,
5459 NOT => {
5460 self.expect_keywords(&[NULL, CONSTRAINTS])?;
5461 TableFromSourceOptionName::ExcludeAllNotNullConstraints
5462 }
5463 _ => unreachable!(),
5464 };
5465 TableFromSourceOption { name, value: None }
5466 }
5467 _ => unreachable!(),
5468 },
5469 DETAILS => TableFromSourceOption {
5470 name: TableFromSourceOptionName::Details,
5471 value: self.parse_optional_option_value()?,
5472 },
5473 IGNORE => {
5474 self.expect_keyword(COLUMNS)?;
5475 let _ = self.consume_token(&Token::Eq);
5476
5477 let value = self
5478 .parse_option_sequence(Parser::parse_identifier)?
5479 .map(|inner| {
5480 WithOptionValue::Sequence(
5481 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5482 )
5483 });
5484 TableFromSourceOption {
5485 name: TableFromSourceOptionName::ExcludeColumns,
5487 value,
5488 }
5489 }
5490 PARTITION => {
5491 self.expect_keyword(BY)?;
5492 TableFromSourceOption {
5493 name: TableFromSourceOptionName::PartitionBy,
5494 value: self.parse_optional_option_value()?,
5495 }
5496 }
5497 RETAIN => {
5498 self.expect_keyword(HISTORY)?;
5499 TableFromSourceOption {
5500 name: TableFromSourceOptionName::RetainHistory,
5501 value: self.parse_option_retain_history()?,
5502 }
5503 }
5504 _ => unreachable!(),
5505 };
5506 Ok(option)
5507 }
5508
5509 fn parse_table_from_source_columns(
5510 &mut self,
5511 ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5512 let mut constraints = vec![];
5513
5514 if !self.consume_token(&Token::LParen) {
5515 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5516 }
5517 if self.consume_token(&Token::RParen) {
5518 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5520 }
5521
5522 let mut column_names = vec![];
5523 let mut column_defs = vec![];
5524 loop {
5525 if let Some(constraint) = self.parse_optional_table_constraint()? {
5526 constraints.push(constraint);
5527 } else if let Some(column_name) = self.consume_identifier()? {
5528 let next_token = self.peek_token();
5529 match next_token {
5530 Some(Token::Comma) | Some(Token::RParen) => {
5531 column_names.push(column_name);
5532 }
5533 _ => {
5534 let data_type = self.parse_data_type()?;
5535 let collation = if self.parse_keyword(COLLATE) {
5536 Some(self.parse_item_name()?)
5537 } else {
5538 None
5539 };
5540 let mut options = vec![];
5541 loop {
5542 match self.peek_token() {
5543 None | Some(Token::Comma) | Some(Token::RParen) => break,
5544 _ => options.push(self.parse_column_option_def()?),
5545 }
5546 }
5547
5548 column_defs.push(ColumnDef {
5549 name: column_name,
5550 data_type,
5551 collation,
5552 options,
5553 });
5554 }
5555 }
5556 } else {
5557 return self.expected(
5558 self.peek_pos(),
5559 "column name or constraint definition",
5560 self.peek_token(),
5561 );
5562 }
5563 if self.consume_token(&Token::Comma) {
5564 } else if self.consume_token(&Token::RParen) {
5566 break;
5567 } else {
5568 return self.expected(
5569 self.peek_pos(),
5570 "',' or ')' after column definition",
5571 self.peek_token(),
5572 );
5573 }
5574 }
5575 if !column_defs.is_empty() && !column_names.is_empty() {
5576 return parser_err!(
5577 self,
5578 self.peek_prev_pos(),
5579 "cannot mix column definitions and column names"
5580 );
5581 }
5582
5583 let columns = match column_defs.is_empty() {
5584 true => match column_names.is_empty() {
5585 true => TableFromSourceColumns::NotSpecified,
5586 false => TableFromSourceColumns::Named(column_names),
5587 },
5588 false => TableFromSourceColumns::Defined(column_defs),
5589 };
5590
5591 Ok((columns, constraints))
5592 }
5593
5594 fn parse_columns(
5595 &mut self,
5596 optional: IsOptional,
5597 ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5598 let mut columns = vec![];
5599 let mut constraints = vec![];
5600
5601 if !self.consume_token(&Token::LParen) {
5602 if optional == Optional {
5603 return Ok((columns, constraints));
5604 } else {
5605 return self.expected(
5606 self.peek_pos(),
5607 "a list of columns in parentheses",
5608 self.peek_token(),
5609 );
5610 }
5611 }
5612 if self.consume_token(&Token::RParen) {
5613 return Ok((columns, constraints));
5615 }
5616
5617 loop {
5618 if let Some(constraint) = self.parse_optional_table_constraint()? {
5619 constraints.push(constraint);
5620 } else if let Some(column_name) = self.consume_identifier()? {
5621 let data_type = self.parse_data_type()?;
5622 let collation = if self.parse_keyword(COLLATE) {
5623 Some(self.parse_item_name()?)
5624 } else {
5625 None
5626 };
5627 let mut options = vec![];
5628 loop {
5629 match self.peek_token() {
5630 None | Some(Token::Comma) | Some(Token::RParen) => break,
5631 _ => options.push(self.parse_column_option_def()?),
5632 }
5633 }
5634
5635 columns.push(ColumnDef {
5636 name: column_name,
5637 data_type,
5638 collation,
5639 options,
5640 });
5641 } else {
5642 return self.expected(
5643 self.peek_pos(),
5644 "column name or constraint definition",
5645 self.peek_token(),
5646 );
5647 }
5648 if self.consume_token(&Token::Comma) {
5649 } else if self.consume_token(&Token::RParen) {
5651 break;
5652 } else {
5653 return self.expected(
5654 self.peek_pos(),
5655 "',' or ')' after column definition",
5656 self.peek_token(),
5657 );
5658 }
5659 }
5660
5661 Ok((columns, constraints))
5662 }
5663
5664 fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5665 let name = if self.parse_keyword(CONSTRAINT) {
5666 Some(self.parse_identifier()?)
5667 } else {
5668 None
5669 };
5670
5671 let option = if self.parse_keywords(&[NOT, NULL]) {
5672 ColumnOption::NotNull
5673 } else if self.parse_keyword(NULL) {
5674 ColumnOption::Null
5675 } else if self.parse_keyword(DEFAULT) {
5676 ColumnOption::Default(self.parse_expr()?)
5677 } else if self.parse_keywords(&[PRIMARY, KEY]) {
5678 ColumnOption::Unique { is_primary: true }
5679 } else if self.parse_keyword(UNIQUE) {
5680 ColumnOption::Unique { is_primary: false }
5681 } else if self.parse_keyword(REFERENCES) {
5682 let foreign_table = self.parse_item_name()?;
5683 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5684 ColumnOption::ForeignKey {
5685 foreign_table,
5686 referred_columns,
5687 }
5688 } else if self.parse_keyword(CHECK) {
5689 self.expect_token(&Token::LParen)?;
5690 let expr = self.parse_expr()?;
5691 self.expect_token(&Token::RParen)?;
5692 ColumnOption::Check(expr)
5693 } else if self.parse_keyword(VERSION) {
5694 self.expect_keyword(ADDED)?;
5695 let action = ColumnVersioned::Added;
5696 let version = self.parse_version()?;
5697
5698 ColumnOption::Versioned { action, version }
5699 } else {
5700 return self.expected(self.peek_pos(), "column option", self.peek_token());
5701 };
5702
5703 Ok(ColumnOptionDef { name, option })
5704 }
5705
5706 fn parse_optional_table_constraint(
5707 &mut self,
5708 ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5709 let name = if self.parse_keyword(CONSTRAINT) {
5710 Some(self.parse_identifier()?)
5711 } else {
5712 None
5713 };
5714 match self.next_token() {
5715 Some(Token::Keyword(PRIMARY)) => {
5716 self.expect_keyword(KEY)?;
5717 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5718 Ok(Some(TableConstraint::Unique {
5719 name,
5720 columns,
5721 is_primary: true,
5722 nulls_not_distinct: false,
5723 }))
5724 }
5725 Some(Token::Keyword(UNIQUE)) => {
5726 let nulls_not_distinct = if self.parse_keyword(NULLS) {
5727 self.expect_keywords(&[NOT, DISTINCT])?;
5728 true
5729 } else {
5730 false
5731 };
5732
5733 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5734 Ok(Some(TableConstraint::Unique {
5735 name,
5736 columns,
5737 is_primary: false,
5738 nulls_not_distinct,
5739 }))
5740 }
5741 Some(Token::Keyword(FOREIGN)) => {
5742 self.expect_keyword(KEY)?;
5743 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5744 self.expect_keyword(REFERENCES)?;
5745 let foreign_table = self.parse_raw_name()?;
5746 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5747 Ok(Some(TableConstraint::ForeignKey {
5748 name,
5749 columns,
5750 foreign_table,
5751 referred_columns,
5752 }))
5753 }
5754 Some(Token::Keyword(CHECK)) => {
5755 self.expect_token(&Token::LParen)?;
5756 let expr = Box::new(self.parse_expr()?);
5757 self.expect_token(&Token::RParen)?;
5758 Ok(Some(TableConstraint::Check { name, expr }))
5759 }
5760 unexpected => {
5761 if name.is_some() {
5762 self.expected(
5763 self.peek_prev_pos(),
5764 "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5765 unexpected,
5766 )
5767 } else {
5768 self.prev_token();
5769 Ok(None)
5770 }
5771 }
5772 }
5773 }
5774
5775 fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5776 let _ = self.consume_token(&Token::Eq);
5777 Ok(WithOptionValue::Item(self.parse_raw_name()?))
5778 }
5779
5780 fn parse_optional_connection_credential_option_value(
5781 &mut self,
5782 ) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5783 match self.peek_token() {
5784 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5785 _ => {
5786 let _ = self.consume_token(&Token::Eq);
5787 Ok(Some(self.parse_connection_credential_option_value()?))
5788 }
5789 }
5790 }
5791
5792 fn parse_connection_credential_option_value(
5793 &mut self,
5794 ) -> Result<WithOptionValue<Raw>, ParserError> {
5795 if self.parse_keyword(SECRET) {
5796 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5797 Ok(WithOptionValue::Secret(secret))
5798 } else {
5799 Ok(WithOptionValue::Value(Value::String("secret".to_string())))
5800 }
5801 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5802 Ok(WithOptionValue::Value(value))
5803 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
5804 Ok(WithOptionValue::Value(Value::String(ident.into_string())))
5805 } else {
5806 self.expected(
5807 self.peek_pos(),
5808 "connection credential value",
5809 self.peek_token(),
5810 )
5811 }
5812 }
5813
5814 fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5815 match self.peek_token() {
5820 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5821 _ => {
5822 let _ = self.consume_token(&Token::Eq);
5823 Ok(Some(self.parse_option_value()?))
5824 }
5825 }
5826 }
5827
5828 fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5829 where
5830 F: FnMut(&mut Self) -> Result<T, ParserError>,
5831 {
5832 Ok(if self.consume_token(&Token::LParen) {
5833 let options = if self.consume_token(&Token::RParen) {
5834 vec![]
5835 } else {
5836 let options = self.parse_comma_separated(f)?;
5837 self.expect_token(&Token::RParen)?;
5838 options
5839 };
5840
5841 Some(options)
5842 } else if self.consume_token(&Token::LBracket) {
5843 let options = if self.consume_token(&Token::RBracket) {
5844 vec![]
5845 } else {
5846 let options = self.parse_comma_separated(f)?;
5847
5848 self.expect_token(&Token::RBracket)?;
5849 options
5850 };
5851
5852 Some(options)
5853 } else {
5854 None
5855 })
5856 }
5857
5858 fn parse_option_map(
5859 &mut self,
5860 ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5861 if !(self.peek_keyword(MAP) && self.peek_nth_token(1) == Some(Token::LBracket)) {
5868 return Ok(None);
5869 }
5870 Ok(if self.parse_keyword(MAP) {
5871 self.expect_token(&Token::LBracket)?;
5872 let mut map = BTreeMap::new();
5873 loop {
5874 if let Some(Token::RBracket) = self.peek_token() {
5875 break;
5876 }
5877 let key = match self.next_token() {
5878 Some(Token::String(s)) => s,
5879 token => return self.expected(self.peek_pos(), "string", token),
5880 };
5881 self.expect_token(&Token::Arrow)?;
5882 let value = Parser::parse_option_value(self)?;
5883 map.insert(key, value);
5884 if !self.consume_token(&Token::Comma) {
5885 break;
5886 }
5887 }
5888 self.expect_token(&Token::RBracket)?;
5889 Some(map)
5890 } else {
5891 None
5892 })
5893 }
5894
5895 fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5896 if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5897 Ok(WithOptionValue::Sequence(seq))
5898 } else if let Some(map) = self.parse_option_map()? {
5899 Ok(WithOptionValue::Map(map))
5900 } else if self.parse_keyword(SECRET) {
5901 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5902 Ok(WithOptionValue::Secret(secret))
5903 } else {
5904 Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5905 vec![ident!("secret")],
5906 )))
5907 }
5908 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5909 Ok(WithOptionValue::Value(value))
5910 } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5911 Ok(WithOptionValue::UnresolvedItemName(item_name))
5912 } else {
5913 self.expected(self.peek_pos(), "option value", self.peek_token())
5914 }
5915 }
5916
5917 fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5918 let _ = self.consume_token(&Token::Eq);
5919 Ok(WithOptionValue::DataType(self.parse_data_type()?))
5920 }
5921
5922 fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5923 if self.parse_keyword(SYSTEM) {
5924 self.parse_alter_system()
5925 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5926 self.parse_alter_default_privileges()
5927 .map_parser_err(StatementKind::AlterDefaultPrivileges)
5928 } else {
5929 self.parse_alter_object()
5930 }
5931 }
5932
5933 fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5934 let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5935
5936 match object_type {
5937 ObjectType::Role => self
5938 .parse_alter_role()
5939 .map_parser_err(StatementKind::AlterRole),
5940 ObjectType::Sink => self.parse_alter_sink(),
5941 ObjectType::Source => self.parse_alter_source(),
5942 ObjectType::Index => self.parse_alter_index(),
5943 ObjectType::Secret => self.parse_alter_secret(),
5944 ObjectType::Connection => self.parse_alter_connection(),
5945 ObjectType::View | ObjectType::MaterializedView | ObjectType::Table => {
5946 self.parse_alter_views(object_type)
5947 }
5948 ObjectType::Type => {
5949 let if_exists = self
5950 .parse_if_exists()
5951 .map_parser_err(StatementKind::AlterOwner)?;
5952 let name = UnresolvedObjectName::Item(
5953 self.parse_item_name()
5954 .map_parser_err(StatementKind::AlterOwner)?,
5955 );
5956 self.expect_keywords(&[OWNER, TO])
5957 .map_parser_err(StatementKind::AlterOwner)?;
5958 let new_owner = self
5959 .parse_identifier()
5960 .map_parser_err(StatementKind::AlterOwner)?;
5961 Ok(Statement::AlterOwner(AlterOwnerStatement {
5962 object_type,
5963 if_exists,
5964 name,
5965 new_owner,
5966 }))
5967 }
5968 ObjectType::Cluster => self.parse_alter_cluster(object_type),
5969 ObjectType::ClusterReplica => {
5970 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5971 let name = UnresolvedObjectName::ClusterReplica(
5972 self.parse_cluster_replica_name()
5973 .map_no_statement_parser_err()?,
5974 );
5975 let action = self
5976 .expect_one_of_keywords(&[OWNER, RENAME])
5977 .map_no_statement_parser_err()?;
5978 self.expect_keyword(TO).map_no_statement_parser_err()?;
5979 match action {
5980 OWNER => {
5981 let new_owner = self
5982 .parse_identifier()
5983 .map_parser_err(StatementKind::AlterOwner)?;
5984 Ok(Statement::AlterOwner(AlterOwnerStatement {
5985 object_type,
5986 if_exists,
5987 name,
5988 new_owner,
5989 }))
5990 }
5991 RENAME => {
5992 let to_item_name = self
5993 .parse_identifier()
5994 .map_parser_err(StatementKind::AlterObjectRename)?;
5995 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5996 object_type,
5997 if_exists,
5998 name,
5999 to_item_name,
6000 }))
6001 }
6002 _ => unreachable!(),
6003 }
6004 }
6005 ObjectType::Database => {
6006 let if_exists = self
6007 .parse_if_exists()
6008 .map_parser_err(StatementKind::AlterOwner)?;
6009 let name = UnresolvedObjectName::Database(
6010 self.parse_database_name()
6011 .map_parser_err(StatementKind::AlterOwner)?,
6012 );
6013 self.expect_keywords(&[OWNER, TO])
6014 .map_parser_err(StatementKind::AlterOwner)?;
6015 let new_owner = self
6016 .parse_identifier()
6017 .map_parser_err(StatementKind::AlterOwner)?;
6018 Ok(Statement::AlterOwner(AlterOwnerStatement {
6019 object_type,
6020 if_exists,
6021 name,
6022 new_owner,
6023 }))
6024 }
6025 ObjectType::Schema => self.parse_alter_schema(object_type),
6026 ObjectType::NetworkPolicy => self
6027 .parse_alter_network_policy()
6028 .map_parser_err(StatementKind::AlterNetworkPolicy),
6029 ObjectType::Func | ObjectType::Subsource | ObjectType::MetricSink => parser_err!(
6033 self,
6034 self.peek_prev_pos(),
6035 format!("Unsupported ALTER on {object_type}")
6036 )
6037 .map_no_statement_parser_err(),
6038 }
6039 }
6040
6041 fn parse_alter_cluster(
6042 &mut self,
6043 object_type: ObjectType,
6044 ) -> Result<Statement<Raw>, ParserStatementError> {
6045 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6046 let name = self.parse_identifier().map_no_statement_parser_err()?;
6047 let action = self
6048 .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
6049 .map_no_statement_parser_err()?;
6050 match action {
6051 OWNER => {
6052 self.expect_keyword(TO)
6053 .map_parser_err(StatementKind::AlterOwner)?;
6054 let new_owner = self
6055 .parse_identifier()
6056 .map_parser_err(StatementKind::AlterOwner)?;
6057 let name = UnresolvedObjectName::Cluster(name);
6058 Ok(Statement::AlterOwner(AlterOwnerStatement {
6059 object_type,
6060 if_exists,
6061 name,
6062 new_owner,
6063 }))
6064 }
6065 RENAME => {
6066 self.expect_keyword(TO)
6067 .map_parser_err(StatementKind::AlterObjectRename)?;
6068 let to_item_name = self
6069 .parse_identifier()
6070 .map_parser_err(StatementKind::AlterObjectRename)?;
6071 let name = UnresolvedObjectName::Cluster(name);
6072 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6073 object_type,
6074 if_exists,
6075 name,
6076 to_item_name,
6077 }))
6078 }
6079 RESET => {
6080 self.expect_token(&Token::LParen)
6081 .map_parser_err(StatementKind::AlterCluster)?;
6082 let names = self
6083 .parse_comma_separated(Parser::parse_cluster_option_name)
6084 .map_parser_err(StatementKind::AlterCluster)?;
6085 self.expect_token(&Token::RParen)
6086 .map_parser_err(StatementKind::AlterCluster)?;
6087 Ok(Statement::AlterCluster(AlterClusterStatement {
6088 if_exists,
6089 name,
6090 action: AlterClusterAction::ResetOptions(names),
6091 }))
6092 }
6093 SET => {
6094 self.expect_token(&Token::LParen)
6095 .map_parser_err(StatementKind::AlterCluster)?;
6096 let options = self
6097 .parse_comma_separated(Parser::parse_cluster_option)
6098 .map_parser_err(StatementKind::AlterCluster)?;
6099 self.expect_token(&Token::RParen)
6100 .map_parser_err(StatementKind::AlterCluster)?;
6101 let with_options = if self.parse_keyword(WITH) {
6102 self.expect_token(&Token::LParen)
6103 .map_parser_err(StatementKind::AlterCluster)?;
6104 let options = self
6105 .parse_comma_separated(Parser::parse_alter_cluster_option)
6106 .map_parser_err(StatementKind::AlterCluster)?;
6107 self.expect_token(&Token::RParen)
6108 .map_parser_err(StatementKind::AlterCluster)?;
6109 options
6110 } else {
6111 vec![]
6112 };
6113 Ok(Statement::AlterCluster(AlterClusterStatement {
6114 if_exists,
6115 name,
6116 action: AlterClusterAction::SetOptions {
6117 options,
6118 with_options,
6119 },
6120 }))
6121 }
6122 SWAP => {
6123 self.expect_keyword(WITH)
6124 .map_parser_err(StatementKind::AlterObjectSwap)?;
6125 let name_b = self
6126 .parse_identifier()
6127 .map_parser_err(StatementKind::AlterObjectSwap)?;
6128
6129 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6130 object_type,
6131 if_exists,
6132 name_a: UnresolvedObjectName::Cluster(name),
6133 name_b,
6134 }))
6135 }
6136 _ => unreachable!(),
6137 }
6138 }
6139
6140 fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6141 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6142 let source_name = self.parse_item_name().map_no_statement_parser_err()?;
6143
6144 Ok(
6145 match self
6146 .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
6147 .map_no_statement_parser_err()?
6148 {
6149 ADD => {
6150 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6151 .map_parser_err(StatementKind::AlterSource)?;
6152
6153 let subsources = self
6155 .parse_comma_separated(Parser::parse_subsource_references)
6156 .map_parser_err(StatementKind::AlterSource)?;
6157
6158 let options = if self.parse_keyword(WITH) {
6159 self.expect_token(&Token::LParen)
6160 .map_parser_err(StatementKind::AlterSource)?;
6161 let options = self
6162 .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
6163 .map_parser_err(StatementKind::AlterSource)?;
6164 self.expect_token(&Token::RParen)
6165 .map_parser_err(StatementKind::AlterSource)?;
6166 options
6167 } else {
6168 vec![]
6169 };
6170
6171 Statement::AlterSource(AlterSourceStatement {
6172 source_name,
6173 if_exists,
6174 action: AlterSourceAction::AddSubsources {
6175 external_references: subsources,
6176 options,
6177 },
6178 })
6179 }
6180 DROP => {
6181 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6182 .map_parser_err(StatementKind::AlterSource)?;
6183
6184 let if_exists_inner = self
6185 .parse_if_exists()
6186 .map_parser_err(StatementKind::AlterSource)?;
6187
6188 let names = self
6189 .parse_comma_separated(Parser::parse_item_name)
6190 .map_parser_err(StatementKind::AlterSource)?;
6191
6192 let cascade = matches!(
6193 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
6194 .map_parser_err(StatementKind::AlterSource)?,
6195 Some(CASCADE),
6196 );
6197
6198 Statement::AlterSource(AlterSourceStatement {
6199 source_name,
6200 if_exists,
6201 action: AlterSourceAction::DropSubsources {
6202 if_exists: if_exists_inner,
6203 cascade,
6204 names,
6205 },
6206 })
6207 }
6208 RESET => {
6209 self.expect_token(&Token::LParen)
6210 .map_parser_err(StatementKind::AlterSource)?;
6211 let reset_options = self
6212 .parse_comma_separated(Parser::parse_source_option_name)
6213 .map_parser_err(StatementKind::AlterSource)?;
6214 self.expect_token(&Token::RParen)
6215 .map_parser_err(StatementKind::AlterSource)?;
6216
6217 Statement::AlterSource(AlterSourceStatement {
6218 source_name,
6219 if_exists,
6220 action: AlterSourceAction::ResetOptions(reset_options),
6221 })
6222 }
6223 SET => {
6224 if let Some(stmt) = self.maybe_parse_alter_set_cluster(
6225 if_exists,
6226 &source_name,
6227 ObjectType::Source,
6228 ) {
6229 return stmt;
6230 }
6231 self.expect_token(&Token::LParen)
6232 .map_parser_err(StatementKind::AlterSource)?;
6233 let set_options = self
6234 .parse_comma_separated(Parser::parse_source_option)
6235 .map_parser_err(StatementKind::AlterSource)?;
6236 self.expect_token(&Token::RParen)
6237 .map_parser_err(StatementKind::AlterSource)?;
6238 Statement::AlterSource(AlterSourceStatement {
6239 source_name,
6240 if_exists,
6241 action: AlterSourceAction::SetOptions(set_options),
6242 })
6243 }
6244 RENAME => {
6245 self.expect_keyword(TO)
6246 .map_parser_err(StatementKind::AlterObjectRename)?;
6247 let to_item_name = self
6248 .parse_identifier()
6249 .map_parser_err(StatementKind::AlterObjectRename)?;
6250
6251 Statement::AlterObjectRename(AlterObjectRenameStatement {
6252 object_type: ObjectType::Source,
6253 if_exists,
6254 name: UnresolvedObjectName::Item(source_name),
6255 to_item_name,
6256 })
6257 }
6258 OWNER => {
6259 self.expect_keyword(TO)
6260 .map_parser_err(StatementKind::AlterOwner)?;
6261 let new_owner = self
6262 .parse_identifier()
6263 .map_parser_err(StatementKind::AlterOwner)?;
6264
6265 Statement::AlterOwner(AlterOwnerStatement {
6266 object_type: ObjectType::Source,
6267 if_exists,
6268 name: UnresolvedObjectName::Item(source_name),
6269 new_owner,
6270 })
6271 }
6272 REFRESH => {
6273 self.expect_keyword(REFERENCES)
6274 .map_parser_err(StatementKind::AlterSource)?;
6275 Statement::AlterSource(AlterSourceStatement {
6276 source_name,
6277 if_exists,
6278 action: AlterSourceAction::RefreshReferences,
6279 })
6280 }
6281 _ => unreachable!(),
6282 },
6283 )
6284 }
6285
6286 fn parse_alter_source_add_subsource_option(
6287 &mut self,
6288 ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6289 match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6290 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6291 self.expect_keyword(COLUMNS)?;
6292
6293 let _ = self.consume_token(&Token::Eq);
6294
6295 let value = self
6296 .parse_option_sequence(Parser::parse_item_name)?
6297 .map(|inner| {
6298 WithOptionValue::Sequence(
6299 inner
6300 .into_iter()
6301 .map(WithOptionValue::UnresolvedItemName)
6302 .collect_vec(),
6303 )
6304 });
6305
6306 Ok(AlterSourceAddSubsourceOption {
6307 name: match *keyword {
6308 TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6309 EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6311 _ => unreachable!(),
6312 },
6313 value,
6314 })
6315 }
6316 _ => unreachable!(),
6317 }
6318 }
6319
6320 fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6321 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6322 let name = self.parse_item_name().map_no_statement_parser_err()?;
6323
6324 Ok(
6325 match self
6326 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6327 .map_no_statement_parser_err()?
6328 {
6329 RESET => {
6330 self.expect_token(&Token::LParen)
6331 .map_parser_err(StatementKind::AlterIndex)?;
6332 let reset_options = self
6333 .parse_comma_separated(Parser::parse_index_option_name)
6334 .map_parser_err(StatementKind::AlterIndex)?;
6335 self.expect_token(&Token::RParen)
6336 .map_parser_err(StatementKind::AlterIndex)?;
6337
6338 Statement::AlterIndex(AlterIndexStatement {
6339 index_name: name,
6340 if_exists,
6341 action: AlterIndexAction::ResetOptions(reset_options),
6342 })
6343 }
6344 SET => {
6345 self.expect_token(&Token::LParen)
6346 .map_parser_err(StatementKind::AlterIndex)?;
6347 let set_options = self
6348 .parse_comma_separated(Parser::parse_index_option)
6349 .map_parser_err(StatementKind::AlterIndex)?;
6350 self.expect_token(&Token::RParen)
6351 .map_parser_err(StatementKind::AlterIndex)?;
6352 Statement::AlterIndex(AlterIndexStatement {
6353 index_name: name,
6354 if_exists,
6355 action: AlterIndexAction::SetOptions(set_options),
6356 })
6357 }
6358 RENAME => {
6359 self.expect_keyword(TO)
6360 .map_parser_err(StatementKind::AlterObjectRename)?;
6361 let to_item_name = self
6362 .parse_identifier()
6363 .map_parser_err(StatementKind::AlterObjectRename)?;
6364
6365 Statement::AlterObjectRename(AlterObjectRenameStatement {
6366 object_type: ObjectType::Index,
6367 if_exists,
6368 name: UnresolvedObjectName::Item(name),
6369 to_item_name,
6370 })
6371 }
6372 OWNER => {
6373 self.expect_keyword(TO)
6374 .map_parser_err(StatementKind::AlterOwner)?;
6375 let new_owner = self
6376 .parse_identifier()
6377 .map_parser_err(StatementKind::AlterOwner)?;
6378
6379 Statement::AlterOwner(AlterOwnerStatement {
6380 object_type: ObjectType::Index,
6381 if_exists,
6382 name: UnresolvedObjectName::Item(name),
6383 new_owner,
6384 })
6385 }
6386 _ => unreachable!(),
6387 },
6388 )
6389 }
6390
6391 fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6392 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6393 let name = self.parse_item_name().map_no_statement_parser_err()?;
6394
6395 Ok(
6396 match self
6397 .expect_one_of_keywords(&[AS, RENAME, OWNER])
6398 .map_no_statement_parser_err()?
6399 {
6400 AS => {
6401 let value = self
6402 .parse_expr()
6403 .map_parser_err(StatementKind::AlterSecret)?;
6404 Statement::AlterSecret(AlterSecretStatement {
6405 name,
6406 if_exists,
6407 value,
6408 })
6409 }
6410 RENAME => {
6411 self.expect_keyword(TO)
6412 .map_parser_err(StatementKind::AlterObjectRename)?;
6413 let to_item_name = self
6414 .parse_identifier()
6415 .map_parser_err(StatementKind::AlterObjectRename)?;
6416
6417 Statement::AlterObjectRename(AlterObjectRenameStatement {
6418 object_type: ObjectType::Secret,
6419 if_exists,
6420 name: UnresolvedObjectName::Item(name),
6421 to_item_name,
6422 })
6423 }
6424 OWNER => {
6425 self.expect_keyword(TO)
6426 .map_parser_err(StatementKind::AlterOwner)?;
6427 let new_owner = self
6428 .parse_identifier()
6429 .map_parser_err(StatementKind::AlterOwner)?;
6430
6431 Statement::AlterOwner(AlterOwnerStatement {
6432 object_type: ObjectType::Secret,
6433 if_exists,
6434 name: UnresolvedObjectName::Item(name),
6435 new_owner,
6436 })
6437 }
6438 _ => unreachable!(),
6439 },
6440 )
6441 }
6442
6443 fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6445 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6446 let name = self.parse_item_name().map_no_statement_parser_err()?;
6447
6448 Ok(
6449 match self
6450 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6451 .map_no_statement_parser_err()?
6452 {
6453 RESET => {
6454 self.expect_token(&Token::LParen)
6455 .map_parser_err(StatementKind::AlterSink)?;
6456 let reset_options = self
6457 .parse_comma_separated(Parser::parse_create_sink_option_name)
6458 .map_parser_err(StatementKind::AlterSink)?;
6459 self.expect_token(&Token::RParen)
6460 .map_parser_err(StatementKind::AlterSink)?;
6461
6462 Statement::AlterSink(AlterSinkStatement {
6463 sink_name: name,
6464 if_exists,
6465 action: AlterSinkAction::ResetOptions(reset_options),
6466 })
6467 }
6468 SET => {
6469 if let Some(result) =
6470 self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6471 {
6472 return result;
6473 }
6474
6475 if self.parse_keyword(FROM) {
6476 let from = self
6477 .parse_raw_name()
6478 .map_parser_err(StatementKind::AlterSink)?;
6479
6480 Statement::AlterSink(AlterSinkStatement {
6481 sink_name: name,
6482 if_exists,
6483 action: AlterSinkAction::ChangeRelation(from),
6484 })
6485 } else {
6486 self.expect_token(&Token::LParen)
6487 .map_parser_err(StatementKind::AlterSink)?;
6488 let set_options = self
6489 .parse_comma_separated(Parser::parse_create_sink_option)
6490 .map_parser_err(StatementKind::AlterSink)?;
6491 self.expect_token(&Token::RParen)
6492 .map_parser_err(StatementKind::AlterSink)?;
6493 Statement::AlterSink(AlterSinkStatement {
6494 sink_name: name,
6495 if_exists,
6496 action: AlterSinkAction::SetOptions(set_options),
6497 })
6498 }
6499 }
6500 RENAME => {
6501 self.expect_keyword(TO)
6502 .map_parser_err(StatementKind::AlterObjectRename)?;
6503 let to_item_name = self
6504 .parse_identifier()
6505 .map_parser_err(StatementKind::AlterObjectRename)?;
6506
6507 Statement::AlterObjectRename(AlterObjectRenameStatement {
6508 object_type: ObjectType::Sink,
6509 if_exists,
6510 name: UnresolvedObjectName::Item(name),
6511 to_item_name,
6512 })
6513 }
6514 OWNER => {
6515 self.expect_keyword(TO)
6516 .map_parser_err(StatementKind::AlterOwner)?;
6517 let new_owner = self
6518 .parse_identifier()
6519 .map_parser_err(StatementKind::AlterOwner)?;
6520
6521 Statement::AlterOwner(AlterOwnerStatement {
6522 object_type: ObjectType::Sink,
6523 if_exists,
6524 name: UnresolvedObjectName::Item(name),
6525 new_owner,
6526 })
6527 }
6528 _ => unreachable!(),
6529 },
6530 )
6531 }
6532
6533 fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6535 match self
6536 .expect_one_of_keywords(&[SET, RESET])
6537 .map_no_statement_parser_err()?
6538 {
6539 SET => {
6540 let name = self
6541 .parse_identifier()
6542 .map_parser_err(StatementKind::AlterSystemSet)?;
6543 self.expect_keyword_or_token(TO, &Token::Eq)
6544 .map_parser_err(StatementKind::AlterSystemSet)?;
6545 let to = self
6546 .parse_set_variable_to()
6547 .map_parser_err(StatementKind::AlterSystemSet)?;
6548 Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6549 name,
6550 to,
6551 }))
6552 }
6553 RESET => {
6554 if self.parse_keyword(ALL) {
6555 Ok(Statement::AlterSystemResetAll(
6556 AlterSystemResetAllStatement {},
6557 ))
6558 } else {
6559 let name = self
6560 .parse_identifier()
6561 .map_parser_err(StatementKind::AlterSystemReset)?;
6562 Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6563 name,
6564 }))
6565 }
6566 }
6567 _ => unreachable!(),
6568 }
6569 }
6570
6571 fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6572 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6573 let name = self.parse_item_name().map_no_statement_parser_err()?;
6574
6575 Ok(
6576 match self
6577 .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6578 .map_no_statement_parser_err()?
6579 {
6580 RENAME => {
6581 self.expect_keyword(TO)
6582 .map_parser_err(StatementKind::AlterObjectRename)?;
6583 let to_item_name = self
6584 .parse_identifier()
6585 .map_parser_err(StatementKind::AlterObjectRename)?;
6586
6587 Statement::AlterObjectRename(AlterObjectRenameStatement {
6588 object_type: ObjectType::Connection,
6589 if_exists,
6590 name: UnresolvedObjectName::Item(name),
6591 to_item_name,
6592 })
6593 }
6594 OWNER => {
6595 self.expect_keyword(TO)
6596 .map_parser_err(StatementKind::AlterOwner)?;
6597 let new_owner = self
6598 .parse_identifier()
6599 .map_parser_err(StatementKind::AlterOwner)?;
6600
6601 Statement::AlterOwner(AlterOwnerStatement {
6602 object_type: ObjectType::Connection,
6603 if_exists,
6604 name: UnresolvedObjectName::Item(name),
6605 new_owner,
6606 })
6607 }
6608 _ => {
6609 self.prev_token();
6610 let actions = self
6611 .parse_comma_separated(Parser::parse_alter_connection_action)
6612 .map_parser_err(StatementKind::AlterConnection)?;
6613
6614 let with_options = if self.parse_keyword(WITH) {
6615 self.expect_token(&Token::LParen)
6616 .map_parser_err(StatementKind::AlterConnection)?;
6617 let options = self
6618 .parse_comma_separated(Parser::parse_alter_connection_option)
6619 .map_parser_err(StatementKind::AlterConnection)?;
6620 self.expect_token(&Token::RParen)
6621 .map_parser_err(StatementKind::AlterConnection)?;
6622 options
6623 } else {
6624 vec![]
6625 };
6626
6627 Statement::AlterConnection(AlterConnectionStatement {
6628 name,
6629 if_exists,
6630 actions,
6631 with_options,
6632 })
6633 }
6634 },
6635 )
6636 }
6637
6638 fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6639 let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6640 ROTATE => {
6641 self.expect_keyword(KEYS)?;
6642 AlterConnectionAction::RotateKeys
6643 }
6644 SET => {
6645 self.expect_token(&Token::LParen)?;
6646 let option = self.parse_connection_option_unified()?;
6647 self.expect_token(&Token::RParen)?;
6648 AlterConnectionAction::SetOption(option)
6649 }
6650 DROP | RESET => {
6651 self.expect_token(&Token::LParen)?;
6652 let option = self.parse_connection_option_name()?;
6653 self.expect_token(&Token::RParen)?;
6654 AlterConnectionAction::DropOption(option)
6655 }
6656 _ => unreachable!(),
6657 };
6658
6659 Ok(r)
6660 }
6661
6662 fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6664 let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6665 VALIDATE => AlterConnectionOptionName::Validate,
6666 _ => unreachable!(),
6667 };
6668
6669 Ok(AlterConnectionOption {
6670 name,
6671 value: self.parse_optional_option_value()?,
6672 })
6673 }
6674
6675 fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6676 let name = self.parse_identifier()?;
6677
6678 let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6679 Some(SET) => {
6680 let name = self.parse_identifier()?;
6681 self.expect_keyword_or_token(TO, &Token::Eq)?;
6682 let value = self.parse_set_variable_to()?;
6683 let var = SetRoleVar::Set { name, value };
6684 AlterRoleOption::Variable(var)
6685 }
6686 Some(RESET) => {
6687 let name = self.parse_identifier()?;
6688 let var = SetRoleVar::Reset { name };
6689 AlterRoleOption::Variable(var)
6690 }
6691 Some(WITH) | None => {
6692 let _ = self.parse_keyword(WITH);
6693 let attrs = self.parse_role_attributes()?;
6694 AlterRoleOption::Attributes(attrs)
6695 }
6696 Some(k) => unreachable!("unmatched keyword: {k}"),
6697 };
6698
6699 Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6700 }
6701
6702 fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6703 self.expect_keyword(FOR)?;
6704 let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6705 ROLE | USER => TargetRoleSpecification::Roles(
6706 self.parse_comma_separated(Parser::parse_identifier)?,
6707 ),
6708 ALL => {
6709 self.expect_keyword(ROLES)?;
6710 TargetRoleSpecification::AllRoles
6711 }
6712 _ => unreachable!(),
6713 };
6714 let target_objects = if self.parse_keyword(IN) {
6715 match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6716 SCHEMA => GrantTargetAllSpecification::AllSchemas {
6717 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6718 },
6719 DATABASE => GrantTargetAllSpecification::AllDatabases {
6720 databases: self.parse_comma_separated(Parser::parse_database_name)?,
6721 },
6722 _ => unreachable!(),
6723 }
6724 } else {
6725 GrantTargetAllSpecification::All
6726 };
6727 let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6728 let privileges = self.parse_privilege_specification().ok_or_else(|| {
6729 self.expected::<_, PrivilegeSpecification>(
6730 self.peek_pos(),
6731 "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6732 self.peek_token(),
6733 )
6734 .expect_err("only returns errors")
6735 })?;
6736 self.expect_keyword(ON)?;
6737 let object_type =
6738 self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6739 if is_grant {
6740 self.expect_keyword(TO)?;
6741 } else {
6742 self.expect_keyword(FROM)?;
6743 }
6744 let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6745
6746 let grant_or_revoke = if is_grant {
6747 AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6748 privileges,
6749 object_type,
6750 grantees,
6751 })
6752 } else {
6753 AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6754 privileges,
6755 object_type,
6756 revokees: grantees,
6757 })
6758 };
6759
6760 Ok(Statement::AlterDefaultPrivileges(
6761 AlterDefaultPrivilegesStatement {
6762 target_roles,
6763 target_objects,
6764 grant_or_revoke,
6765 },
6766 ))
6767 }
6768
6769 fn parse_alter_views(
6770 &mut self,
6771 object_type: ObjectType,
6772 ) -> Result<Statement<Raw>, ParserStatementError> {
6773 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6774 let name = self.parse_item_name().map_no_statement_parser_err()?;
6775 let keywords: &[_] = match object_type {
6776 ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6777 ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6778 ObjectType::View => &[SET, RENAME, OWNER, RESET],
6779 ObjectType::Source
6780 | ObjectType::Sink
6781 | ObjectType::MetricSink
6782 | ObjectType::Index
6783 | ObjectType::Type
6784 | ObjectType::Role
6785 | ObjectType::Cluster
6786 | ObjectType::ClusterReplica
6787 | ObjectType::Secret
6788 | ObjectType::Connection
6789 | ObjectType::Database
6790 | ObjectType::Schema
6791 | ObjectType::Func
6792 | ObjectType::Subsource
6793 | ObjectType::NetworkPolicy => {
6794 unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6795 }
6796 };
6797
6798 let action = self
6799 .expect_one_of_keywords(keywords)
6800 .map_no_statement_parser_err()?;
6801 match action {
6802 RENAME => {
6803 self.expect_keyword(TO).map_no_statement_parser_err()?;
6804 let to_item_name = self
6805 .parse_identifier()
6806 .map_parser_err(StatementKind::AlterObjectRename)?;
6807 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6808 object_type,
6809 if_exists,
6810 name: UnresolvedObjectName::Item(name),
6811 to_item_name,
6812 }))
6813 }
6814 SET => {
6815 if self.parse_keyword(CLUSTER) {
6816 self.parse_alter_set_cluster(if_exists, name, object_type)
6817 } else {
6818 self.expect_token(&Token::LParen)
6819 .map_no_statement_parser_err()?;
6820 self.expect_keywords(&[RETAIN, HISTORY])
6821 .map_parser_err(StatementKind::AlterRetainHistory)?;
6822 let history = self
6823 .parse_retain_history()
6824 .map_parser_err(StatementKind::AlterRetainHistory)?;
6825 self.expect_token(&Token::RParen)
6826 .map_parser_err(StatementKind::AlterCluster)?;
6827 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6828 object_type,
6829 if_exists,
6830 name: UnresolvedObjectName::Item(name),
6831 history: Some(history),
6832 }))
6833 }
6834 }
6835 RESET => {
6836 self.expect_token(&Token::LParen)
6837 .map_no_statement_parser_err()?;
6838 self.expect_keywords(&[RETAIN, HISTORY])
6839 .map_parser_err(StatementKind::AlterRetainHistory)?;
6840 self.expect_token(&Token::RParen)
6841 .map_no_statement_parser_err()?;
6842 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6843 object_type,
6844 if_exists,
6845 name: UnresolvedObjectName::Item(name),
6846 history: None,
6847 }))
6848 }
6849 OWNER => {
6850 self.expect_keyword(TO).map_no_statement_parser_err()?;
6851 let new_owner = self
6852 .parse_identifier()
6853 .map_parser_err(StatementKind::AlterOwner)?;
6854 Ok(Statement::AlterOwner(AlterOwnerStatement {
6855 object_type,
6856 if_exists,
6857 name: UnresolvedObjectName::Item(name),
6858 new_owner,
6859 }))
6860 }
6861 ADD => {
6862 assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6863
6864 self.expect_keyword(COLUMN)
6865 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6866 let if_col_not_exist = self
6867 .parse_if_not_exists()
6868 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6869 let column_name = self
6870 .parse_identifier()
6871 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6872 let data_type = self
6873 .parse_data_type()
6874 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6875
6876 Ok(Statement::AlterTableAddColumn(
6877 AlterTableAddColumnStatement {
6878 if_exists,
6879 name,
6880 if_col_not_exist,
6881 column_name,
6882 data_type,
6883 },
6884 ))
6885 }
6886 APPLY => {
6887 assert_eq!(
6888 object_type,
6889 ObjectType::MaterializedView,
6890 "checked object_type above",
6891 );
6892
6893 self.expect_keyword(REPLACEMENT)
6894 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6895
6896 let replacement_name = self
6897 .parse_item_name()
6898 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6899
6900 Ok(Statement::AlterMaterializedViewApplyReplacement(
6901 AlterMaterializedViewApplyReplacementStatement {
6902 if_exists,
6903 name,
6904 replacement_name,
6905 },
6906 ))
6907 }
6908 _ => unreachable!(),
6909 }
6910 }
6911
6912 fn parse_alter_schema(
6913 &mut self,
6914 object_type: ObjectType,
6915 ) -> Result<Statement<Raw>, ParserStatementError> {
6916 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6917 let name = self.parse_schema_name().map_no_statement_parser_err()?;
6918 let name = UnresolvedObjectName::Schema(name);
6919 let action = self
6920 .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6921 .map_no_statement_parser_err()?;
6922
6923 match action {
6924 OWNER => {
6925 self.expect_keyword(TO)
6926 .map_parser_err(StatementKind::AlterOwner)?;
6927 let new_owner = self
6928 .parse_identifier()
6929 .map_parser_err(StatementKind::AlterOwner)?;
6930
6931 Ok(Statement::AlterOwner(AlterOwnerStatement {
6932 object_type,
6933 if_exists,
6934 name,
6935 new_owner,
6936 }))
6937 }
6938 RENAME => {
6939 self.expect_keyword(TO)
6940 .map_parser_err(StatementKind::AlterObjectRename)?;
6941 let to_item_name = self
6942 .parse_identifier()
6943 .map_parser_err(StatementKind::AlterObjectRename)?;
6944
6945 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6946 object_type,
6947 if_exists,
6948 name,
6949 to_item_name,
6950 }))
6951 }
6952 SWAP => {
6953 self.expect_keyword(WITH)
6954 .map_parser_err(StatementKind::AlterObjectSwap)?;
6955 let name_b = self
6956 .parse_identifier()
6957 .map_parser_err(StatementKind::AlterObjectSwap)?;
6958
6959 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6960 object_type,
6961 if_exists,
6962 name_a: name,
6963 name_b,
6964 }))
6965 }
6966 k => unreachable!("programming error, unmatched {k}"),
6967 }
6968 }
6969
6970 fn maybe_parse_alter_set_cluster(
6972 &mut self,
6973 if_exists: bool,
6974 name: &UnresolvedItemName,
6975 object_type: ObjectType,
6976 ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6977 if self.parse_keyword(CLUSTER) {
6978 Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6979 } else {
6980 None
6981 }
6982 }
6983
6984 fn parse_alter_set_cluster(
6986 &mut self,
6987 if_exists: bool,
6988 name: UnresolvedItemName,
6989 object_type: ObjectType,
6990 ) -> Result<Statement<Raw>, ParserStatementError> {
6991 let set_cluster = self
6992 .parse_raw_ident()
6993 .map_parser_err(StatementKind::AlterSetCluster)?;
6994 Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6995 name,
6996 if_exists,
6997 set_cluster,
6998 object_type,
6999 }))
7000 }
7001
7002 fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7004 let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
7006 Some(self.peek_prev_pos())
7007 } else {
7008 None
7009 };
7010
7011 let relation = if self.consume_token(&Token::LParen) {
7012 let query = self.parse_statement()?.ast;
7013 self.expect_token(&Token::RParen)
7014 .map_parser_err(StatementKind::Copy)?;
7015 match query {
7016 Statement::Select(stmt) => CopyRelation::Select(stmt),
7017 Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
7018 _ => {
7019 return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
7020 .map_parser_err(StatementKind::Copy);
7021 }
7022 }
7023 } else {
7024 let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
7025 let columns = self
7026 .parse_parenthesized_column_list(Optional)
7027 .map_parser_err(StatementKind::Copy)?;
7028 CopyRelation::Named { name, columns }
7029 };
7030 let (direction, target) = match self
7031 .expect_one_of_keywords(&[FROM, TO])
7032 .map_parser_err(StatementKind::Copy)?
7033 {
7034 FROM => {
7035 if let CopyRelation::Named { .. } = relation {
7036 } else {
7038 return parser_err!(
7039 self,
7040 self.peek_prev_pos(),
7041 "queries not allowed in COPY FROM"
7042 )
7043 .map_no_statement_parser_err();
7044 }
7045 if self.parse_keyword(STDIN) {
7046 (CopyDirection::From, CopyTarget::Stdin)
7047 } else {
7048 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
7049 (CopyDirection::From, CopyTarget::Expr(url_expr))
7050 }
7051 }
7052 TO => {
7053 if let Some(into_pos) = maybe_into_pos {
7055 return self
7056 .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
7057 .map_parser_err(StatementKind::Copy);
7058 }
7059
7060 if self.parse_keyword(STDOUT) {
7061 (CopyDirection::To, CopyTarget::Stdout)
7062 } else {
7063 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
7064 (CopyDirection::To, CopyTarget::Expr(url_expr))
7065 }
7066 }
7067 _ => unreachable!(),
7068 };
7069 let has_options = if self.parse_keyword(WITH) {
7073 self.expect_token(&Token::LParen)
7074 .map_parser_err(StatementKind::Copy)?;
7075 true
7076 } else {
7077 self.consume_token(&Token::LParen)
7078 };
7079 let options = if has_options {
7080 let o = self
7081 .parse_comma_separated(Parser::parse_copy_option)
7082 .map_parser_err(StatementKind::Copy)?;
7083 self.expect_token(&Token::RParen)
7084 .map_parser_err(StatementKind::Copy)?;
7085 o
7086 } else {
7087 vec![]
7088 };
7089 Ok(Statement::Copy(CopyStatement {
7090 relation,
7091 direction,
7092 target,
7093 options,
7094 }))
7095 }
7096
7097 fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
7098 let name = match self.expect_one_of_keywords(&[
7099 FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
7100 ])? {
7101 FORMAT => CopyOptionName::Format,
7102 DELIMITER => CopyOptionName::Delimiter,
7103 NULL => CopyOptionName::Null,
7104 ESCAPE => CopyOptionName::Escape,
7105 QUOTE => CopyOptionName::Quote,
7106 HEADER => CopyOptionName::Header,
7107 AWS => {
7108 self.expect_keyword(CONNECTION)?;
7109 return Ok(CopyOption {
7110 name: CopyOptionName::AwsConnection,
7111 value: Some(self.parse_object_option_value()?),
7112 });
7113 }
7114 MAX => {
7115 self.expect_keywords(&[FILE, SIZE])?;
7116 CopyOptionName::MaxFileSize
7117 }
7118 FILES => CopyOptionName::Files,
7119 PATTERN => CopyOptionName::Pattern,
7120 _ => unreachable!(),
7121 };
7122 Ok(CopyOption {
7123 name,
7124 value: self.parse_optional_option_value()?,
7125 })
7126 }
7127
7128 fn parse_value(&mut self) -> Result<Value, ParserError> {
7130 match self.next_token() {
7131 Some(t) => match t {
7132 Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
7133 Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
7134 Token::Keyword(NULL) => Ok(Value::Null),
7135 Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
7136 Token::Keyword(kw) => {
7137 parser_err!(
7138 self,
7139 self.peek_prev_pos(),
7140 format!("No value parser for keyword {}", kw)
7141 )
7142 }
7143 Token::Op(ref op) if op == "-" => match self.next_token() {
7144 Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
7145 other => self.expected(self.peek_prev_pos(), "literal int", other),
7146 },
7147 Token::Number(ref n) => Ok(Value::Number(n.to_string())),
7148 Token::String(ref s) => Ok(Value::String(s.to_string())),
7149 Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
7150 _ => parser_err!(
7151 self,
7152 self.peek_prev_pos(),
7153 format!("Unsupported value: {:?}", t)
7154 ),
7155 },
7156 None => parser_err!(
7157 self,
7158 self.peek_prev_pos(),
7159 "Expecting a value, but found EOF"
7160 ),
7161 }
7162 }
7163
7164 fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
7165 if self.consume_token(&Token::LParen) {
7166 let subquery = self.parse_query()?;
7167 self.expect_token(&Token::RParen)?;
7168 Ok(Expr::ArraySubquery(Box::new(subquery)))
7169 } else {
7170 self.parse_sequence(Self::parse_array).map(Expr::Array)
7171 }
7172 }
7173
7174 fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
7175 if self.consume_token(&Token::LParen) {
7176 let subquery = self.parse_query()?;
7177 self.expect_token(&Token::RParen)?;
7178 Ok(Expr::ListSubquery(Box::new(subquery)))
7179 } else {
7180 self.parse_sequence(Self::parse_list).map(Expr::List)
7181 }
7182 }
7183
7184 fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
7185 if self.consume_token(&Token::LParen) {
7186 let subquery = self.parse_query()?;
7187 self.expect_token(&Token::RParen)?;
7188 return Ok(Expr::MapSubquery(Box::new(subquery)));
7189 }
7190
7191 self.expect_token(&Token::LBracket)?;
7192 let mut exprs = vec![];
7193 loop {
7194 if let Some(Token::RBracket) = self.peek_token() {
7195 break;
7196 }
7197 let key = self.parse_expr()?;
7198 self.expect_token(&Token::Arrow)?;
7199 let value = if let Some(Token::LBracket) = self.peek_token() {
7200 self.parse_map()?
7201 } else {
7202 self.parse_expr()?
7203 };
7204 exprs.push(MapEntry { key, value });
7205 if !self.consume_token(&Token::Comma) {
7206 break;
7207 }
7208 }
7209 self.expect_token(&Token::RBracket)?;
7210 Ok(Expr::Map(exprs))
7211 }
7212
7213 fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
7214 where
7215 F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
7216 {
7217 self.expect_token(&Token::LBracket)?;
7218 let mut exprs = vec![];
7219 loop {
7220 if let Some(Token::RBracket) = self.peek_token() {
7221 break;
7222 }
7223 let expr = if let Some(Token::LBracket) = self.peek_token() {
7224 f(self)?
7225 } else {
7226 self.parse_expr()?
7227 };
7228 exprs.push(expr);
7229 if !self.consume_token(&Token::Comma) {
7230 break;
7231 }
7232 }
7233 self.expect_token(&Token::RBracket)?;
7234 Ok(exprs)
7235 }
7236
7237 fn parse_number_value(&mut self) -> Result<Value, ParserError> {
7238 match self.parse_value()? {
7239 v @ Value::Number(_) => Ok(v),
7240 _ => {
7241 self.prev_token();
7242 self.expected(self.peek_pos(), "literal number", self.peek_token())
7243 }
7244 }
7245 }
7246
7247 fn parse_version(&mut self) -> Result<Version, ParserError> {
7248 let version = self.parse_literal_uint()?;
7249 Ok(Version(version))
7250 }
7251
7252 fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7254 let negative = self.consume_token(&Token::Op("-".into()));
7255 match self.next_token() {
7256 Some(Token::Number(s)) => {
7257 let n = s.parse::<i64>().map_err(|e| {
7258 self.error(
7259 self.peek_prev_pos(),
7260 format!("Could not parse '{}' as i64: {}", s, e),
7261 )
7262 })?;
7263 if negative {
7264 n.checked_neg().ok_or_else(|| {
7265 self.error(
7266 self.peek_prev_pos(),
7267 format!("Could not parse '{}' as i64: overflows i64", s),
7268 )
7269 })
7270 } else {
7271 Ok(n)
7272 }
7273 }
7274 other => self.expected(self.peek_prev_pos(), "literal integer", other),
7275 }
7276 }
7277
7278 fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7280 match self.next_token() {
7281 Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7282 self.error(
7283 self.peek_prev_pos(),
7284 format!("Could not parse '{}' as u64: {}", s, e),
7285 )
7286 }),
7287 other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7288 }
7289 }
7290
7291 fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7293 match self.next_token() {
7294 Some(Token::String(ref s)) => Ok(s.clone()),
7295 other => self.expected(self.peek_prev_pos(), "literal string", other),
7296 }
7297 }
7298
7299 fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7301 let other = |ident| RawDataType::Other {
7302 name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7303 typ_mod: vec![],
7304 };
7305
7306 let mut data_type = match self.next_token() {
7307 Some(Token::Keyword(kw)) => match kw {
7308 CHAR | CHARACTER => {
7310 let name = if self.parse_keyword(VARYING) {
7311 ident!("varchar")
7312 } else {
7313 ident!("bpchar")
7314 };
7315 RawDataType::Other {
7316 name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7317 typ_mod: self.parse_typ_mod()?,
7318 }
7319 }
7320 BPCHAR => RawDataType::Other {
7321 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7322 typ_mod: self.parse_typ_mod()?,
7323 },
7324 VARCHAR => RawDataType::Other {
7325 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7326 typ_mod: self.parse_typ_mod()?,
7327 },
7328 STRING => other(ident!("text")),
7329
7330 BIGINT => other(ident!("int8")),
7332 SMALLINT => other(ident!("int2")),
7333 DEC | DECIMAL => RawDataType::Other {
7334 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7335 typ_mod: self.parse_typ_mod()?,
7336 },
7337 DOUBLE => {
7338 let _ = self.parse_keyword(PRECISION);
7339 other(ident!("float8"))
7340 }
7341 FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7342 v if v == 0 || v > 53 => {
7343 return Err(self.error(
7344 self.peek_prev_pos(),
7345 "precision for type float must be within ([1-53])".into(),
7346 ));
7347 }
7348 v if v < 25 => other(ident!("float4")),
7349 _ => other(ident!("float8")),
7350 },
7351 INT | INTEGER => other(ident!("int4")),
7352 REAL => other(ident!("float4")),
7353
7354 TIME => {
7356 if self.parse_keyword(WITH) {
7357 self.expect_keywords(&[TIME, ZONE])?;
7358 other(ident!("timetz"))
7359 } else {
7360 if self.parse_keyword(WITHOUT) {
7361 self.expect_keywords(&[TIME, ZONE])?;
7362 }
7363 other(ident!("time"))
7364 }
7365 }
7366 TIMESTAMP => {
7367 let typ_mod = self.parse_timestamp_precision()?;
7368 if self.parse_keyword(WITH) {
7369 self.expect_keywords(&[TIME, ZONE])?;
7370 RawDataType::Other {
7371 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7372 "timestamptz"
7373 ))),
7374 typ_mod,
7375 }
7376 } else {
7377 if self.parse_keyword(WITHOUT) {
7378 self.expect_keywords(&[TIME, ZONE])?;
7379 }
7380 RawDataType::Other {
7381 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7382 "timestamp"
7383 ))),
7384 typ_mod,
7385 }
7386 }
7387 }
7388 TIMESTAMPTZ => {
7389 let typ_mod = self.parse_timestamp_precision()?;
7390 RawDataType::Other {
7391 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7392 "timestamptz"
7393 ))),
7394 typ_mod,
7395 }
7396 }
7397
7398 MAP => {
7400 return self.parse_map_type();
7401 }
7402
7403 BOOLEAN => other(ident!("bool")),
7405 BYTES => other(ident!("bytea")),
7406 JSON => other(ident!("jsonb")),
7407
7408 kw if kw.is_sometimes_reserved() => {
7411 return self.expected(
7412 self.peek_prev_pos(),
7413 "a data type name",
7414 Some(Token::Keyword(kw)),
7415 );
7416 }
7417 _ => {
7418 self.prev_token();
7419 RawDataType::Other {
7420 name: RawItemName::Name(self.parse_item_name()?),
7421 typ_mod: self.parse_typ_mod()?,
7422 }
7423 }
7424 },
7425 Some(Token::Ident(_) | Token::LBracket) => {
7426 self.prev_token();
7427 RawDataType::Other {
7428 name: self.parse_raw_name()?,
7429 typ_mod: self.parse_typ_mod()?,
7430 }
7431 }
7432 other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7433 };
7434
7435 loop {
7436 match self.peek_token() {
7437 Some(Token::Keyword(LIST)) => {
7438 self.next_token();
7439 data_type = RawDataType::List(Box::new(data_type));
7440 }
7441 Some(Token::LBracket) => {
7442 self.next_token();
7445 let _ = self.maybe_parse(|parser| parser.parse_number_value());
7446 self.expect_token(&Token::RBracket)?;
7447 if !matches!(data_type, RawDataType::Array(_)) {
7448 data_type = RawDataType::Array(Box::new(data_type));
7449 }
7450 }
7451 _ => break,
7452 }
7453 }
7454 Ok(data_type)
7455 }
7456
7457 fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7458 if self.consume_token(&Token::LParen) {
7459 let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7460 self.expect_token(&Token::RParen)?;
7461 Ok(typ_mod)
7462 } else {
7463 Ok(vec![])
7464 }
7465 }
7466
7467 fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7469 if self.consume_token(&Token::LParen) {
7470 let typ_mod = self.parse_literal_int()?;
7471 self.expect_token(&Token::RParen)?;
7472 Ok(vec![typ_mod])
7473 } else {
7474 Ok(vec![])
7475 }
7476 }
7477
7478 fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7482 where
7483 F: FnOnce(Keyword) -> bool,
7484 {
7485 let after_as = self.parse_keyword(AS);
7486 match self.next_token() {
7487 Some(Token::Keyword(OF)) => {
7490 self.prev_token();
7491 if after_as {
7492 self.prev_token();
7493 }
7494 Ok(None)
7495 }
7496 Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7502 Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7503 not_an_ident => {
7504 if after_as {
7505 return self.expected(
7506 self.peek_prev_pos(),
7507 "an identifier after AS",
7508 not_an_ident,
7509 );
7510 }
7511 self.prev_token();
7512 Ok(None) }
7514 }
7515 }
7516
7517 fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7522 match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7523 Some(name) => {
7524 let columns = self.parse_parenthesized_column_list(Optional)?;
7525 Ok(Some(TableAlias {
7526 name,
7527 columns,
7528 strict: false,
7529 }))
7530 }
7531 None => Ok(None),
7532 }
7533 }
7534
7535 fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7536 Ok(match self.parse_raw_name()? {
7537 named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7538 RawItemName::Name(name) => DeferredItemName::Deferred(name),
7539 })
7540 }
7541
7542 fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7543 if self.consume_token(&Token::LBracket) {
7544 let id = match self.next_token() {
7545 Some(Token::Ident(id)) => id.into_inner(),
7546 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7547 };
7548 self.expect_keyword(AS)?;
7549 let name = self.parse_item_name()?;
7550 if name.0.len() < 2 {
7552 return parser_err!(
7553 self,
7554 self.peek_prev_pos(),
7555 "table name in square brackets must be fully qualified"
7556 );
7557 }
7558
7559 let version = if self.parse_keywords(&[VERSION]) {
7560 let version = self.parse_version()?;
7561 Some(version)
7562 } else {
7563 None
7564 };
7565
7566 self.expect_token(&Token::RBracket)?;
7567 Ok(RawItemName::Id(id, name, version))
7568 } else {
7569 Ok(RawItemName::Name(self.parse_item_name()?))
7570 }
7571 }
7572
7573 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7574 let start = self.peek_pos();
7575 let mut item_name = self.parse_raw_name()?;
7576 let column_name = match &mut item_name {
7577 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7578 if identifiers.len() < 2 {
7579 return Err(ParserError::new(
7580 start,
7581 "need to specify an object and a column",
7582 ));
7583 }
7584 identifiers.pop().unwrap()
7585 }
7586 RawItemName::Id(_, _, _) => {
7587 self.expect_token(&Token::Dot)?;
7588 self.parse_identifier()?
7589 }
7590 };
7591
7592 Ok(ColumnName {
7593 relation: item_name,
7594 column: column_name,
7595 })
7596 }
7597
7598 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7601 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7602 }
7603
7604 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7607 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7608 }
7609
7610 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7613 Ok(UnresolvedItemName(self.parse_identifiers()?))
7614 }
7615
7616 fn parse_object_name(
7618 &mut self,
7619 object_type: ObjectType,
7620 ) -> Result<UnresolvedObjectName, ParserError> {
7621 Ok(match object_type {
7622 ObjectType::Table
7623 | ObjectType::View
7624 | ObjectType::MaterializedView
7625 | ObjectType::Source
7626 | ObjectType::Subsource
7627 | ObjectType::Sink
7628 | ObjectType::MetricSink
7629 | ObjectType::Index
7630 | ObjectType::Type
7631 | ObjectType::Secret
7632 | ObjectType::Connection
7633 | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7634 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7635 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7636 ObjectType::ClusterReplica => {
7637 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7638 }
7639 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7640 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7641 ObjectType::NetworkPolicy => {
7642 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7643 }
7644 })
7645 }
7646
7647 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7649 let mut idents = vec![];
7650 loop {
7651 idents.push(self.parse_identifier()?);
7652 if !self.consume_token(&Token::Dot) {
7653 break;
7654 }
7655 }
7656 Ok(idents)
7657 }
7658
7659 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7661 match self.consume_identifier()? {
7662 Some(id) => {
7663 if id.as_str().is_empty() {
7664 return parser_err!(
7665 self,
7666 self.peek_prev_pos(),
7667 "zero-length delimited identifier",
7668 );
7669 }
7670 Ok(id)
7671 }
7672 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7673 }
7674 }
7675
7676 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7677 match self.peek_token() {
7678 Some(Token::Keyword(kw)) => {
7679 self.next_token();
7680 Ok(Some(kw.into()))
7681 }
7682 Some(Token::Ident(id)) => {
7683 self.next_token();
7684 Ok(Some(self.new_identifier(id)?))
7685 }
7686 _ => Ok(None),
7687 }
7688 }
7689
7690 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7691 let mut id_parts = vec![id];
7692 match self.peek_token() {
7693 Some(Token::LParen) | Some(Token::Dot) => {
7694 let mut ends_with_wildcard = false;
7695 while self.consume_token(&Token::Dot) {
7696 match self.next_token() {
7697 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7698 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7699 Some(Token::Star) => {
7700 ends_with_wildcard = true;
7701 break;
7702 }
7703 unexpected => {
7704 return self.expected(
7705 self.peek_prev_pos(),
7706 "an identifier or a '*' after '.'",
7707 unexpected,
7708 );
7709 }
7710 }
7711 }
7712 if ends_with_wildcard {
7713 Ok(Expr::QualifiedWildcard(id_parts))
7714 } else if self.peek_token() == Some(Token::LParen) {
7715 let function =
7716 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7717 Ok(Expr::Function(function))
7718 } else {
7719 Ok(Expr::Identifier(id_parts))
7720 }
7721 }
7722 _ => Ok(Expr::Identifier(id_parts)),
7723 }
7724 }
7725
7726 fn parse_parenthesized_column_list(
7728 &mut self,
7729 optional: IsOptional,
7730 ) -> Result<Vec<Ident>, ParserError> {
7731 if self.consume_token(&Token::LParen) {
7732 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7733 self.expect_token(&Token::RParen)?;
7734 Ok(cols)
7735 } else if optional == Optional {
7736 Ok(vec![])
7737 } else {
7738 self.expected(
7739 self.peek_pos(),
7740 "a list of columns in parentheses",
7741 self.peek_token(),
7742 )
7743 }
7744 }
7745
7746 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7747 if self.consume_token(&Token::LParen) {
7748 let n = self.parse_literal_uint()?;
7749 self.expect_token(&Token::RParen)?;
7750 Ok(Some(n))
7751 } else {
7752 Ok(None)
7753 }
7754 }
7755
7756 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7757 self.expect_token(&Token::LBracket)?;
7758 let key_type = Box::new(self.parse_data_type()?);
7759 self.expect_token(&Token::Arrow)?;
7760 let value_type = Box::new(self.parse_data_type()?);
7761 self.expect_token(&Token::RBracket)?;
7762 Ok(RawDataType::Map {
7763 key_type,
7764 value_type,
7765 })
7766 }
7767
7768 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7769 self.expect_keyword(FROM)?;
7770 let table_name = RawItemName::Name(self.parse_item_name()?);
7771 let alias = self.parse_optional_table_alias()?;
7772 let using = if self.parse_keyword(USING) {
7773 self.parse_comma_separated(Parser::parse_table_and_joins)?
7774 } else {
7775 vec![]
7776 };
7777 let selection = if self.parse_keyword(WHERE) {
7778 Some(self.parse_expr()?)
7779 } else {
7780 None
7781 };
7782
7783 Ok(Statement::Delete(DeleteStatement {
7784 table_name,
7785 alias,
7786 using,
7787 selection,
7788 }))
7789 }
7790
7791 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7793 Ok(SelectStatement {
7794 query: self.parse_query()?,
7795 as_of: self.parse_optional_as_of()?,
7796 })
7797 }
7798
7799 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7804 self.checked_recur_mut(|parser| {
7805 let cte_block = if parser.parse_keyword(WITH) {
7806 if parser.parse_keyword(MUTUALLY) {
7807 parser.expect_keyword(RECURSIVE)?;
7808 let options = if parser.consume_token(&Token::LParen) {
7809 let options =
7810 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7811 parser.expect_token(&Token::RParen)?;
7812 options
7813 } else {
7814 vec![]
7815 };
7816 CteBlock::MutuallyRecursive(MutRecBlock {
7817 options,
7818 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7819 })
7820 } else {
7821 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7823 }
7824 } else {
7825 CteBlock::empty()
7826 };
7827
7828 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7829
7830 parser.parse_query_tail(cte_block, body)
7831 })
7832 }
7833
7834 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7835 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7836 RECURSION => {
7837 self.expect_keyword(LIMIT)?;
7838 Ok(MutRecBlockOption {
7839 name: MutRecBlockOptionName::RecursionLimit,
7840 value: self.parse_optional_option_value()?,
7841 })
7842 }
7843 RETURN => {
7844 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7845 Ok(MutRecBlockOption {
7846 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7847 value: self.parse_optional_option_value()?,
7848 })
7849 }
7850 ERROR => {
7851 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7852 Ok(MutRecBlockOption {
7853 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7854 value: self.parse_optional_option_value()?,
7855 })
7856 }
7857 _ => unreachable!(),
7858 }
7859 }
7860
7861 fn parse_query_tail(
7862 &mut self,
7863 ctes: CteBlock<Raw>,
7864 body: SetExpr<Raw>,
7865 ) -> Result<Query<Raw>, ParserError> {
7866 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7867 SetExpr::Query(query) => {
7868 let Query {
7869 ctes,
7870 body,
7871 order_by,
7872 limit,
7873 offset,
7874 } = *query;
7875 (ctes, order_by, limit, offset, body)
7876 }
7877 _ => (CteBlock::empty(), vec![], None, None, body),
7878 };
7879
7880 let ctes = if ctes.is_empty() {
7881 inner_ctes
7882 } else if !inner_ctes.is_empty() {
7883 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7884 } else {
7885 ctes
7886 };
7887
7888 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7889 if !inner_order_by.is_empty() {
7890 return parser_err!(
7891 self,
7892 self.peek_prev_pos(),
7893 "multiple ORDER BY clauses not allowed"
7894 );
7895 }
7896 self.parse_comma_separated(Parser::parse_order_by_expr)?
7897 } else {
7898 inner_order_by
7899 };
7900
7901 let mut limit = inner_limit;
7905 let mut offset = inner_offset;
7906 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7907 match parsed_keyword {
7908 LIMIT => {
7909 if limit.is_some() {
7910 return parser_err!(
7911 self,
7912 self.peek_prev_pos(),
7913 "multiple LIMIT/FETCH clauses not allowed"
7914 );
7915 }
7916 limit = if self.parse_keyword(ALL) {
7917 None
7918 } else {
7919 Some(Limit {
7920 with_ties: false,
7921 quantity: self.parse_expr()?,
7922 })
7923 };
7924 }
7925 OFFSET => {
7926 if offset.is_some() {
7927 return parser_err!(
7928 self,
7929 self.peek_prev_pos(),
7930 "multiple OFFSET clauses not allowed"
7931 );
7932 }
7933 let value = self.parse_expr()?;
7934 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7935 offset = Some(value);
7936 }
7937 FETCH => {
7938 if limit.is_some() {
7939 return parser_err!(
7940 self,
7941 self.peek_prev_pos(),
7942 "multiple LIMIT/FETCH clauses not allowed"
7943 );
7944 }
7945 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7946 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7947 Expr::Value(Value::Number('1'.into()))
7948 } else {
7949 let quantity = self.parse_expr()?;
7950 self.expect_one_of_keywords(&[ROW, ROWS])?;
7951 quantity
7952 };
7953 let with_ties = if self.parse_keyword(ONLY) {
7954 false
7955 } else if self.parse_keywords(&[WITH, TIES]) {
7956 true
7957 } else {
7958 return self.expected(
7959 self.peek_pos(),
7960 "one of ONLY or WITH TIES",
7961 self.peek_token(),
7962 );
7963 };
7964 limit = Some(Limit {
7965 with_ties,
7966 quantity,
7967 });
7968 }
7969 _ => unreachable!(),
7970 }
7971 }
7972
7973 Ok(Query {
7974 ctes,
7975 body,
7976 order_by,
7977 limit,
7978 offset,
7979 })
7980 }
7981
7982 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7984 let alias = TableAlias {
7985 name: self.parse_identifier()?,
7986 columns: self.parse_parenthesized_column_list(Optional)?,
7987 strict: false,
7988 };
7989 self.expect_keyword(AS)?;
7990 self.expect_token(&Token::LParen)?;
7991 let query = self.parse_query()?;
7992 self.expect_token(&Token::RParen)?;
7993 Ok(Cte {
7994 alias,
7995 query,
7996 id: (),
7997 })
7998 }
7999
8000 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
8006 let name = self.parse_identifier()?;
8007 self.expect_token(&Token::LParen)?;
8008 let columns = self.parse_comma_separated(|parser| {
8009 Ok(CteMutRecColumnDef {
8010 name: parser.parse_identifier()?,
8011 data_type: parser.parse_data_type()?,
8012 })
8013 })?;
8014 self.expect_token(&Token::RParen)?;
8015 self.expect_keyword(AS)?;
8016 self.expect_token(&Token::LParen)?;
8017 let query = self.parse_query()?;
8018 self.expect_token(&Token::RParen)?;
8019 Ok(CteMutRec {
8020 name,
8021 columns,
8022 query,
8023 id: (),
8024 })
8025 }
8026
8027 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
8036 let expr = if self.parse_keyword(SELECT) {
8039 SetExpr::Select(Box::new(self.parse_select()?))
8040 } else if self.consume_token(&Token::LParen) {
8041 let subquery = self.parse_query()?;
8043 self.expect_token(&Token::RParen)?;
8044 SetExpr::Query(Box::new(subquery))
8045 } else if self.parse_keyword(VALUES) {
8046 SetExpr::Values(self.parse_values()?)
8047 } else if self.parse_keyword(SHOW) {
8048 SetExpr::Show(self.parse_show()?)
8049 } else if self.parse_keyword(TABLE) {
8050 SetExpr::Table(self.parse_raw_name()?)
8051 } else {
8052 return self.expected(
8053 self.peek_pos(),
8054 "SELECT, VALUES, or a subquery in the query body",
8055 self.peek_token(),
8056 );
8057 };
8058
8059 self.parse_query_body_seeded(precedence, expr)
8060 }
8061
8062 fn parse_query_body_seeded(
8063 &mut self,
8064 precedence: SetPrecedence,
8065 mut expr: SetExpr<Raw>,
8066 ) -> Result<SetExpr<Raw>, ParserError> {
8067 loop {
8068 let next_token = self.peek_token();
8070 let op = self.parse_set_operator(&next_token);
8071 let next_precedence = match op {
8072 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
8074 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
8076 None => break,
8078 };
8079 if precedence >= next_precedence {
8080 break;
8081 }
8082 self.next_token(); let all = self.parse_keyword(ALL);
8085 let distinct = self.parse_keyword(DISTINCT);
8086 if all && distinct {
8087 return parser_err!(
8088 self,
8089 self.peek_prev_pos(),
8090 "Cannot specify both ALL and DISTINCT in set operation"
8091 );
8092 }
8093 expr = SetExpr::SetOperation {
8094 left: Box::new(expr),
8095 op: op.unwrap(),
8096 all,
8097 right: Box::new(self.parse_query_body(next_precedence)?),
8098 };
8099 }
8100
8101 Ok(expr)
8102 }
8103
8104 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
8105 match token {
8106 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
8107 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
8108 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
8109 _ => None,
8110 }
8111 }
8112
8113 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
8116 let all = self.parse_keyword(ALL);
8117 let distinct = self.parse_keyword(DISTINCT);
8118 if all && distinct {
8119 return parser_err!(
8120 self,
8121 self.peek_prev_pos(),
8122 "Cannot specify both ALL and DISTINCT in SELECT"
8123 );
8124 }
8125 let distinct = if distinct && self.parse_keyword(ON) {
8126 self.expect_token(&Token::LParen)?;
8127 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
8128 self.expect_token(&Token::RParen)?;
8129 Some(Distinct::On(exprs))
8130 } else if distinct {
8131 Some(Distinct::EntireRow)
8132 } else {
8133 None
8134 };
8135
8136 let projection = match self.peek_token() {
8137 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
8141 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
8142 _ => {
8143 let mut projection = vec![];
8144 loop {
8145 projection.push(self.parse_select_item()?);
8146 if !self.consume_token(&Token::Comma) {
8147 break;
8148 }
8149 if self.peek_keyword(FROM) {
8150 return parser_err!(
8151 self,
8152 self.peek_prev_pos(),
8153 "invalid trailing comma in SELECT list",
8154 );
8155 }
8156 }
8157 projection
8158 }
8159 };
8160
8161 let from = if self.parse_keyword(FROM) {
8167 self.parse_comma_separated(Parser::parse_table_and_joins)?
8168 } else {
8169 vec![]
8170 };
8171
8172 let selection = if self.parse_keyword(WHERE) {
8173 Some(self.parse_expr()?)
8174 } else {
8175 None
8176 };
8177
8178 let group_by = if self.parse_keywords(&[GROUP, BY]) {
8179 self.parse_comma_separated(Parser::parse_expr)?
8180 } else {
8181 vec![]
8182 };
8183
8184 let having = if self.parse_keyword(HAVING) {
8185 Some(self.parse_expr()?)
8186 } else {
8187 None
8188 };
8189
8190 let qualify = if self.parse_keyword(QUALIFY) {
8191 Some(self.parse_expr()?)
8192 } else {
8193 None
8194 };
8195
8196 let options = if self.parse_keyword(OPTIONS) {
8197 self.expect_token(&Token::LParen)?;
8198 let options = self.parse_comma_separated(Self::parse_select_option)?;
8199 self.expect_token(&Token::RParen)?;
8200 options
8201 } else {
8202 vec![]
8203 };
8204
8205 Ok(Select {
8206 distinct,
8207 projection,
8208 from,
8209 selection,
8210 group_by,
8211 having,
8212 qualify,
8213 options,
8214 })
8215 }
8216
8217 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8218 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8219 EXPECTED => {
8220 self.expect_keywords(&[GROUP, SIZE])?;
8221 SelectOptionName::ExpectedGroupSize
8222 }
8223 AGGREGATE => {
8224 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8225 SelectOptionName::AggregateInputGroupSize
8226 }
8227 DISTINCT => {
8228 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8229 SelectOptionName::DistinctOnInputGroupSize
8230 }
8231 LIMIT => {
8232 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8233 SelectOptionName::LimitInputGroupSize
8234 }
8235 _ => unreachable!(),
8236 };
8237 Ok(SelectOption {
8238 name,
8239 value: self.parse_optional_option_value()?,
8240 })
8241 }
8242
8243 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8244 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8245 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8246 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8247 if !normal {
8248 match variable.as_str().parse() {
8249 Ok(TIME) => {
8250 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8251 variable = ident!("timezone");
8252 normal = true;
8253 }
8254 Ok(NAMES) => {
8255 variable = ident!("client_encoding");
8256 normal = true;
8257 }
8258 _ => {}
8259 }
8260 }
8261 if variable.as_str().parse() == Ok(SCHEMA) {
8262 variable = ident!("search_path");
8263 let to = self
8264 .parse_set_schema_to()
8265 .map_parser_err(StatementKind::SetVariable)?;
8266 Ok(Statement::SetVariable(SetVariableStatement {
8267 local: modifier == Some(LOCAL),
8268 variable,
8269 to,
8270 }))
8271 } else if normal {
8272 let to = self
8273 .parse_set_variable_to()
8274 .map_parser_err(StatementKind::SetVariable)?;
8275 Ok(Statement::SetVariable(SetVariableStatement {
8276 local: modifier == Some(LOCAL),
8277 variable,
8278 to,
8279 }))
8280 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8281 Ok(Statement::SetTransaction(SetTransactionStatement {
8283 local: true,
8284 modes: self
8285 .parse_transaction_modes(true)
8286 .map_parser_err(StatementKind::SetTransaction)?,
8287 }))
8288 } else if modifier == Some(SESSION)
8289 && variable.as_str().parse() == Ok(CHARACTERISTICS)
8290 && self.parse_keywords(&[AS, TRANSACTION])
8291 {
8292 Ok(Statement::SetTransaction(SetTransactionStatement {
8294 local: false,
8295 modes: self
8296 .parse_transaction_modes(true)
8297 .map_parser_err(StatementKind::SetTransaction)?,
8298 }))
8299 } else {
8300 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8301 .map_no_statement_parser_err()
8302 }
8303 }
8304
8305 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8306 if self.parse_keyword(DEFAULT) {
8307 Ok(SetVariableTo::Default)
8308 } else {
8309 let to = self.parse_set_variable_value()?;
8310 Ok(SetVariableTo::Values(vec![to]))
8311 }
8312 }
8313
8314 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8315 if self.parse_keyword(DEFAULT) {
8316 Ok(SetVariableTo::Default)
8317 } else {
8318 Ok(SetVariableTo::Values(
8319 self.parse_comma_separated(Parser::parse_set_variable_value)?,
8320 ))
8321 }
8322 }
8323
8324 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8325 if let Some(value) = self.maybe_parse(Parser::parse_value) {
8326 Ok(SetVariableValue::Literal(value))
8327 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8328 Ok(SetVariableValue::Ident(ident))
8329 } else {
8330 self.expected(self.peek_pos(), "variable value", self.peek_token())
8331 }
8332 }
8333
8334 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8335 let mut variable = self.parse_identifier()?;
8336 if variable.as_str().parse() == Ok(SCHEMA) {
8337 variable = ident!("search_path");
8338 }
8339 Ok(Statement::ResetVariable(ResetVariableStatement {
8340 variable,
8341 }))
8342 }
8343
8344 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8345 let redacted = self.parse_keyword(REDACTED);
8346 if redacted && !self.peek_keyword(CREATE) {
8347 return parser_err!(
8348 self,
8349 self.peek_pos(),
8350 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8351 );
8352 }
8353 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8354 self.parse_show_columns()
8355 } else if self.parse_keyword(OBJECTS) {
8356 let from = if self.parse_keywords(&[FROM]) {
8357 Some(self.parse_schema_name()?)
8358 } else {
8359 None
8360 };
8361 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8362 object_type: ShowObjectType::Object,
8363 from,
8364 filter: self.parse_show_statement_filter()?,
8365 }))
8366 } else if let Some(object_type) = self.parse_plural_object_type() {
8367 let from = if object_type.lives_in_schema() {
8368 if self.parse_keywords(&[FROM]) {
8369 Some(self.parse_schema_name()?)
8370 } else {
8371 None
8372 }
8373 } else {
8374 None
8375 };
8376
8377 let show_object_type = match object_type {
8378 ObjectType::Database => ShowObjectType::Database,
8379 ObjectType::Schema => {
8380 let from = if self.parse_keyword(FROM) {
8381 Some(self.parse_database_name()?)
8382 } else {
8383 None
8384 };
8385 ShowObjectType::Schema { from }
8386 }
8387 ObjectType::Table => {
8388 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8389 Some(self.parse_raw_name()?)
8390 } else {
8391 None
8392 };
8393 ShowObjectType::Table { on_source }
8394 }
8395 ObjectType::View => ShowObjectType::View,
8396 ObjectType::Source => {
8397 let in_cluster = self.parse_optional_in_cluster()?;
8398 ShowObjectType::Source { in_cluster }
8399 }
8400 ObjectType::Subsource => {
8401 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8402 Some(self.parse_raw_name()?)
8403 } else {
8404 None
8405 };
8406
8407 if from.is_some() && on_source.is_some() {
8408 return parser_err!(
8409 self,
8410 self.peek_prev_pos(),
8411 "Cannot specify both FROM and ON"
8412 );
8413 }
8414
8415 ShowObjectType::Subsource { on_source }
8416 }
8417 ObjectType::Sink => {
8418 let in_cluster = self.parse_optional_in_cluster()?;
8419 ShowObjectType::Sink { in_cluster }
8420 }
8421 ObjectType::MetricSink => {
8422 let in_cluster = self.parse_optional_in_cluster()?;
8423 ShowObjectType::MetricSink { in_cluster }
8424 }
8425 ObjectType::Type => ShowObjectType::Type,
8426 ObjectType::Role => ShowObjectType::Role,
8427 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8428 ObjectType::Secret => ShowObjectType::Secret,
8429 ObjectType::Connection => ShowObjectType::Connection,
8430 ObjectType::Cluster => ShowObjectType::Cluster,
8431 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8432 ObjectType::MaterializedView => {
8433 let in_cluster = self.parse_optional_in_cluster()?;
8434 ShowObjectType::MaterializedView { in_cluster }
8435 }
8436 ObjectType::Index => {
8437 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8438 Some(self.parse_raw_name()?)
8439 } else {
8440 None
8441 };
8442
8443 if from.is_some() && on_object.is_some() {
8444 return parser_err!(
8445 self,
8446 self.peek_prev_pos(),
8447 "Cannot specify both FROM and ON"
8448 );
8449 }
8450
8451 let in_cluster = self.parse_optional_in_cluster()?;
8452 ShowObjectType::Index {
8453 in_cluster,
8454 on_object,
8455 }
8456 }
8457 ObjectType::Func => {
8458 return parser_err!(
8459 self,
8460 self.peek_prev_pos(),
8461 format!("Unsupported SHOW on {object_type}")
8462 );
8463 }
8464 };
8465 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8466 object_type: show_object_type,
8467 from,
8468 filter: self.parse_show_statement_filter()?,
8469 }))
8470 } else if self.parse_keyword(CLUSTER) {
8471 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8472 variable: ident!("cluster"),
8473 }))
8474 } else if self.parse_keyword(PRIVILEGES) {
8475 self.parse_show_privileges()
8476 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8477 self.parse_show_default_privileges()
8478 } else if self.parse_keyword(ROLE) {
8479 self.expect_keyword(MEMBERSHIP)?;
8480 let role = if self.parse_keyword(FOR) {
8481 Some(self.parse_identifier()?)
8482 } else {
8483 None
8484 };
8485 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8486 object_type: ShowObjectType::RoleMembership { role },
8487 from: None,
8488 filter: self.parse_show_statement_filter()?,
8489 }))
8490 } else if self.parse_keywords(&[CREATE, VIEW]) {
8491 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8492 view_name: self.parse_raw_name()?,
8493 redacted,
8494 }))
8495 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8496 Ok(ShowStatement::ShowCreateMaterializedView(
8497 ShowCreateMaterializedViewStatement {
8498 materialized_view_name: self.parse_raw_name()?,
8499 redacted,
8500 },
8501 ))
8502 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8503 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8504 source_name: self.parse_raw_name()?,
8505 redacted,
8506 }))
8507 } else if self.parse_keywords(&[CREATE, TABLE]) {
8508 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8509 table_name: self.parse_raw_name()?,
8510 redacted,
8511 }))
8512 } else if self.parse_keywords(&[CREATE, SINK]) {
8513 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8514 sink_name: self.parse_raw_name()?,
8515 redacted,
8516 }))
8517 } else if self.parse_keywords(&[CREATE, METRIC, SINK]) {
8518 Ok(ShowStatement::ShowCreateMetricSink(
8519 ShowCreateMetricSinkStatement {
8520 metric_sink_name: self.parse_raw_name()?,
8521 redacted,
8522 },
8523 ))
8524 } else if self.parse_keywords(&[CREATE, INDEX]) {
8525 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8526 index_name: self.parse_raw_name()?,
8527 redacted,
8528 }))
8529 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8530 Ok(ShowStatement::ShowCreateConnection(
8531 ShowCreateConnectionStatement {
8532 connection_name: self.parse_raw_name()?,
8533 redacted,
8534 },
8535 ))
8536 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8537 if redacted {
8538 return parser_err!(
8539 self,
8540 self.peek_prev_pos(),
8541 "SHOW REDACTED CREATE CLUSTER is not supported"
8542 );
8543 }
8544 Ok(ShowStatement::ShowCreateCluster(
8545 ShowCreateClusterStatement {
8546 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8547 },
8548 ))
8549 } else if self.parse_keywords(&[CREATE, TYPE]) {
8550 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8551 type_name: self.parse_data_type()?,
8552 redacted,
8553 }))
8554 } else {
8555 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8556 ident!("transaction_isolation")
8557 } else if self.parse_keywords(&[TIME, ZONE]) {
8558 ident!("timezone")
8559 } else {
8560 self.parse_identifier()?
8561 };
8562 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8563 variable,
8564 }))
8565 }
8566 }
8567
8568 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8569 self.expect_one_of_keywords(&[FROM, IN])?;
8570 let table_name = self.parse_raw_name()?;
8571 let filter = self.parse_show_statement_filter()?;
8575 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8576 table_name,
8577 filter,
8578 }))
8579 }
8580
8581 fn parse_show_statement_filter(
8582 &mut self,
8583 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8584 if self.parse_keyword(LIKE) {
8585 Ok(Some(ShowStatementFilter::Like(
8586 self.parse_literal_string()?,
8587 )))
8588 } else if self.parse_keyword(WHERE) {
8589 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8590 } else {
8591 Ok(None)
8592 }
8593 }
8594
8595 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8596 let object_type = if self.parse_keyword(ON) {
8597 Some(self.expect_plural_system_object_type_for_privileges()?)
8598 } else {
8599 None
8600 };
8601 let role = if self.parse_keyword(FOR) {
8602 Some(self.parse_identifier()?)
8603 } else {
8604 None
8605 };
8606 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8607 object_type: ShowObjectType::Privileges { object_type, role },
8608 from: None,
8609 filter: self.parse_show_statement_filter()?,
8610 }))
8611 }
8612
8613 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8614 let object_type = if self.parse_keyword(ON) {
8615 Some(self.expect_plural_object_type_for_privileges()?)
8616 } else {
8617 None
8618 };
8619 let role = if self.parse_keyword(FOR) {
8620 Some(self.parse_identifier()?)
8621 } else {
8622 None
8623 };
8624 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8625 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8626 from: None,
8627 filter: self.parse_show_statement_filter()?,
8628 }))
8629 }
8630
8631 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8632 self.expect_keyword(SHARD)?;
8633 let id = self.parse_literal_string()?;
8634 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8635 }
8636
8637 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8638 let relation = self.parse_table_factor()?;
8639
8640 let mut joins = vec![];
8644 loop {
8645 let join = if self.parse_keyword(CROSS) {
8646 self.expect_keyword(JOIN)?;
8647 Join {
8648 relation: self.parse_table_factor()?,
8649 join_operator: JoinOperator::CrossJoin,
8650 }
8651 } else {
8652 let natural = self.parse_keyword(NATURAL);
8653 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8654 Some(kw)
8655 } else {
8656 None
8657 };
8658
8659 let join_operator_type = match peek_keyword {
8660 Some(INNER) | Some(JOIN) => {
8661 let _ = self.parse_keyword(INNER);
8662 self.expect_keyword(JOIN)?;
8663 JoinOperator::Inner
8664 }
8665 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8666 let _ = self.next_token();
8667 let _ = self.parse_keyword(OUTER);
8668 self.expect_keyword(JOIN)?;
8669 match kw {
8670 LEFT => JoinOperator::LeftOuter,
8671 RIGHT => JoinOperator::RightOuter,
8672 FULL => JoinOperator::FullOuter,
8673 _ => unreachable!(),
8674 }
8675 }
8676 Some(OUTER) => {
8677 return self.expected(
8678 self.peek_pos(),
8679 "LEFT, RIGHT, or FULL",
8680 self.peek_token(),
8681 );
8682 }
8683 None if natural => {
8684 return self.expected(
8685 self.peek_pos(),
8686 "a join type after NATURAL",
8687 self.peek_token(),
8688 );
8689 }
8690 _ => break,
8691 };
8692 let relation = self.parse_table_factor()?;
8693 let join_constraint = self.parse_join_constraint(natural)?;
8694 Join {
8695 relation,
8696 join_operator: join_operator_type(join_constraint),
8697 }
8698 };
8699 joins.push(join);
8700 }
8701 Ok(TableWithJoins { relation, joins })
8702 }
8703
8704 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8706 self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8713 }
8714
8715 fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8716 if self.parse_keyword(LATERAL) {
8717 if self.consume_token(&Token::LParen) {
8719 return self.parse_derived_table_factor(Lateral);
8720 } else if self.parse_keywords(&[ROWS, FROM]) {
8721 return self.parse_rows_from();
8722 } else {
8723 let name = self.parse_raw_name()?;
8724 self.expect_token(&Token::LParen)?;
8725 let args = self.parse_optional_args(false)?;
8726 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8727 return Ok(TableFactor::Function {
8728 function: Function {
8729 name,
8730 args,
8731 filter: None,
8732 over: None,
8733 distinct: false,
8734 },
8735 alias,
8736 with_ordinality,
8737 });
8738 }
8739 }
8740
8741 if self.consume_token(&Token::LParen) {
8742 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8764
8765 let table_and_joins = self.parse_table_and_joins()?;
8776 match table_and_joins.relation {
8777 TableFactor::NestedJoin { .. } => (),
8778 _ => {
8779 if table_and_joins.joins.is_empty() {
8780 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8783 }
8784 }
8785 }
8786 self.expect_token(&Token::RParen)?;
8787 Ok(TableFactor::NestedJoin {
8788 join: Box::new(table_and_joins),
8789 alias: self.parse_optional_table_alias()?,
8790 })
8791 } else if self.parse_keywords(&[ROWS, FROM]) {
8792 Ok(self.parse_rows_from()?)
8793 } else {
8794 let name = self.parse_raw_name()?;
8795 if self.consume_token(&Token::LParen) {
8796 let args = self.parse_optional_args(false)?;
8797 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8798 Ok(TableFactor::Function {
8799 function: Function {
8800 name,
8801 args,
8802 filter: None,
8803 over: None,
8804 distinct: false,
8805 },
8806 alias,
8807 with_ordinality,
8808 })
8809 } else {
8810 Ok(TableFactor::Table {
8811 name,
8812 alias: self.parse_optional_table_alias()?,
8813 })
8814 }
8815 }
8816 }
8817
8818 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8819 self.expect_token(&Token::LParen)?;
8820 let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8821 self.expect_token(&Token::RParen)?;
8822 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8823 Ok(TableFactor::RowsFrom {
8824 functions,
8825 alias,
8826 with_ordinality,
8827 })
8828 }
8829
8830 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8837 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8838 let alias = self.parse_optional_table_alias()?;
8839 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8840 if with_ordinality_1 && with_ordinality_2 {
8841 return parser_err!(
8842 self,
8843 self.peek_prev_pos(),
8844 "WITH ORDINALITY specified twice"
8845 );
8846 }
8847 Ok((with_ordinality_1 || with_ordinality_2, alias))
8848 }
8849
8850 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8851 let name = self.parse_raw_name()?;
8852 self.parse_function(name)
8853 }
8854
8855 fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8860 let name = self.parse_raw_name()?;
8861 self.expect_token(&Token::LParen)?;
8862 let args = self.parse_optional_args(false)?;
8863 Ok(Function {
8864 name,
8865 args,
8866 filter: None,
8867 over: None,
8868 distinct: false,
8869 })
8870 }
8871
8872 fn parse_derived_table_factor(
8873 &mut self,
8874 lateral: IsLateral,
8875 ) -> Result<TableFactor<Raw>, ParserError> {
8876 let subquery = Box::new(self.parse_query()?);
8877 self.expect_token(&Token::RParen)?;
8878 let alias = self.parse_optional_table_alias()?;
8879 Ok(TableFactor::Derived {
8880 lateral: match lateral {
8881 Lateral => true,
8882 NotLateral => false,
8883 },
8884 subquery,
8885 alias,
8886 })
8887 }
8888
8889 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8890 if natural {
8891 Ok(JoinConstraint::Natural)
8892 } else if self.parse_keyword(ON) {
8893 let constraint = self.parse_expr()?;
8894 Ok(JoinConstraint::On(constraint))
8895 } else if self.parse_keyword(USING) {
8896 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8897 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8898
8899 Ok(JoinConstraint::Using { columns, alias })
8900 } else {
8901 self.expected(
8902 self.peek_pos(),
8903 "ON, or USING after JOIN",
8904 self.peek_token(),
8905 )
8906 }
8907 }
8908
8909 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8911 self.expect_keyword(INTO)?;
8912 let table_name = self.parse_raw_name()?;
8913 let columns = self.parse_parenthesized_column_list(Optional)?;
8914 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8915 InsertSource::DefaultValues
8916 } else {
8917 InsertSource::Query(self.parse_query()?)
8918 };
8919 let returning = self.parse_returning()?;
8920 Ok(Statement::Insert(InsertStatement {
8921 table_name,
8922 columns,
8923 source,
8924 returning,
8925 }))
8926 }
8927
8928 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8929 Ok(if self.parse_keyword(RETURNING) {
8930 self.parse_comma_separated(Parser::parse_select_item)?
8931 } else {
8932 Vec::new()
8933 })
8934 }
8935
8936 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8937 let table_name = RawItemName::Name(self.parse_item_name()?);
8938 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8940 let alias = alias.map(|name| TableAlias {
8941 name,
8942 columns: Vec::new(),
8943 strict: false,
8944 });
8945
8946 self.expect_keyword(SET)?;
8947 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8948 let selection = if self.parse_keyword(WHERE) {
8949 Some(self.parse_expr()?)
8950 } else {
8951 None
8952 };
8953
8954 Ok(Statement::Update(UpdateStatement {
8955 table_name,
8956 alias,
8957 assignments,
8958 selection,
8959 }))
8960 }
8961
8962 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8964 let id = self.parse_identifier()?;
8965 self.expect_token(&Token::Eq)?;
8966 let value = self.parse_expr()?;
8967 Ok(Assignment { id, value })
8968 }
8969
8970 fn parse_optional_args(
8971 &mut self,
8972 allow_order_by: bool,
8973 ) -> Result<FunctionArgs<Raw>, ParserError> {
8974 if self.consume_token(&Token::Star) {
8975 self.expect_token(&Token::RParen)?;
8976 Ok(FunctionArgs::Star)
8977 } else if self.consume_token(&Token::RParen) {
8978 Ok(FunctionArgs::args(vec![]))
8979 } else {
8980 let args = self.parse_comma_separated(Parser::parse_expr)?;
8981 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8985 self.parse_comma_separated(Parser::parse_order_by_expr)?
8986 } else {
8987 vec![]
8988 };
8989 self.expect_token(&Token::RParen)?;
8990 Ok(FunctionArgs::Args { args, order_by })
8991 }
8992 }
8993
8994 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8996 if self.parse_keyword(AS) {
8997 self.expect_keyword(OF)?;
8998 if self.parse_keywords(&[AT, LEAST]) {
8999 match self.parse_expr() {
9000 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
9001 Err(e) => self.expected(
9002 e.pos,
9003 "a timestamp value after 'AS OF AT LEAST'",
9004 self.peek_token(),
9005 ),
9006 }
9007 } else {
9008 match self.parse_expr() {
9009 Ok(expr) => Ok(Some(AsOf::At(expr))),
9010 Err(e) => {
9011 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
9012 }
9013 }
9014 }
9015 } else {
9016 Ok(None)
9017 }
9018 }
9019
9020 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
9022 if self.parse_keyword(UP) {
9023 self.expect_keyword(TO)?;
9024 self.parse_expr().map(Some)
9025 } else {
9026 Ok(None)
9027 }
9028 }
9029
9030 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
9035 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
9036 let value = parser.parse_value().ok()?;
9037 let Value::Number(s) = value else { return None };
9038 s.parse().ok()
9039 }
9040
9041 if self.parse_keywords(&[AS, OF]) {
9042 match try_parse_u64(self) {
9043 Some(time) => Ok(Some(time)),
9044 None => {
9045 self.prev_token();
9046 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
9047 }
9048 }
9049 } else {
9050 Ok(None)
9051 }
9052 }
9053
9054 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
9056 if self.consume_token(&Token::Star) {
9057 return Ok(SelectItem::Wildcard);
9058 }
9059 Ok(SelectItem::Expr {
9060 expr: self.parse_expr()?,
9061 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
9062 })
9063 }
9064
9065 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
9068 let expr = self.parse_expr()?;
9069
9070 let asc = if self.parse_keyword(ASC) {
9071 Some(true)
9072 } else if self.parse_keyword(DESC) {
9073 Some(false)
9074 } else {
9075 None
9076 };
9077
9078 let nulls_last = if self.parse_keyword(NULLS) {
9079 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
9080 Some(last)
9081 } else {
9082 None
9083 };
9084
9085 Ok(OrderByExpr {
9086 expr,
9087 asc,
9088 nulls_last,
9089 })
9090 }
9091
9092 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
9093 let values = self.parse_comma_separated(|parser| {
9094 parser.expect_token(&Token::LParen)?;
9095 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
9096 parser.expect_token(&Token::RParen)?;
9097 Ok(exprs)
9098 })?;
9099 Ok(Values(values))
9100 }
9101
9102 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
9103 self.expect_keyword(TRANSACTION)?;
9104 Ok(Statement::StartTransaction(StartTransactionStatement {
9105 modes: self.parse_transaction_modes(false)?,
9106 }))
9107 }
9108
9109 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
9110 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9111 Ok(Statement::StartTransaction(StartTransactionStatement {
9112 modes: self.parse_transaction_modes(false)?,
9113 }))
9114 }
9115
9116 fn parse_transaction_modes(
9117 &mut self,
9118 mut required: bool,
9119 ) -> Result<Vec<TransactionMode>, ParserError> {
9120 let mut modes = vec![];
9121 loop {
9122 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
9123 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
9124 TransactionIsolationLevel::ReadUncommitted
9125 } else if self.parse_keywords(&[READ, COMMITTED]) {
9126 TransactionIsolationLevel::ReadCommitted
9127 } else if self.parse_keywords(&[REPEATABLE, READ]) {
9128 TransactionIsolationLevel::RepeatableRead
9129 } else if self.parse_keyword(SERIALIZABLE) {
9130 TransactionIsolationLevel::Serializable
9131 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
9132 TransactionIsolationLevel::StrongSessionSerializable
9133 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
9134 TransactionIsolationLevel::StrictSerializable
9135 } else {
9136 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
9137 };
9138 TransactionMode::IsolationLevel(iso_level)
9139 } else if self.parse_keywords(&[READ, ONLY]) {
9140 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
9141 } else if self.parse_keywords(&[READ, WRITE]) {
9142 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
9143 } else if required {
9144 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
9145 } else {
9146 break;
9147 };
9148 modes.push(mode);
9149 required = self.consume_token(&Token::Comma);
9154 }
9155 Ok(modes)
9156 }
9157
9158 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
9159 Ok(Statement::Commit(CommitStatement {
9160 chain: self.parse_commit_rollback_chain()?,
9161 }))
9162 }
9163
9164 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9165 Ok(Statement::Rollback(RollbackStatement {
9166 chain: self.parse_commit_rollback_chain()?,
9167 }))
9168 }
9169
9170 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9171 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9172 if self.parse_keyword(AND) {
9173 let chain = !self.parse_keyword(NO);
9174 self.expect_keyword(CHAIN)?;
9175 Ok(chain)
9176 } else {
9177 Ok(false)
9178 }
9179 }
9180
9181 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9182 parser_err!(
9183 self,
9184 self.peek_prev_pos(),
9185 "TAIL has been renamed to SUBSCRIBE"
9186 )
9187 }
9188
9189 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9190 let _ = self.parse_keyword(TO);
9191 let relation = if self.consume_token(&Token::LParen) {
9192 let query = self.parse_query()?;
9193 self.expect_token(&Token::RParen)?;
9194 SubscribeRelation::Query(query)
9195 } else {
9196 SubscribeRelation::Name(self.parse_raw_name()?)
9197 };
9198 let mut output = self.parse_subscribe_output()?;
9199 let options = if self.parse_keyword(WITH) {
9200 self.expect_token(&Token::LParen)?;
9201 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9202 self.expect_token(&Token::RParen)?;
9203 options
9204 } else {
9205 vec![]
9206 };
9207 let as_of = self.parse_optional_as_of()?;
9208 let up_to = self.parse_optional_up_to()?;
9209 if output == SubscribeOutput::Diffs {
9216 output = self.parse_subscribe_output()?;
9217 }
9218 Ok(Statement::Subscribe(SubscribeStatement {
9219 relation,
9220 options,
9221 as_of,
9222 up_to,
9223 output,
9224 }))
9225 }
9226
9227 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9228 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9229 PROGRESS => SubscribeOptionName::Progress,
9230 SNAPSHOT => SubscribeOptionName::Snapshot,
9231 _ => unreachable!(),
9232 };
9233 Ok(SubscribeOption {
9234 name,
9235 value: self.parse_optional_option_value()?,
9236 })
9237 }
9238
9239 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9240 if self.parse_keywords(&[ENVELOPE]) {
9241 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9242 self.expect_token(&Token::LParen)?;
9243 self.expect_keyword(KEY)?;
9244 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9245 let output = match keyword {
9246 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9247 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9248 _ => unreachable!("no other keyword allowed"),
9249 };
9250 self.expect_token(&Token::RParen)?;
9251 Ok(output)
9252 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9253 Ok(SubscribeOutput::WithinTimestampOrderBy {
9254 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9255 })
9256 } else {
9257 Ok(SubscribeOutput::Diffs)
9258 }
9259 }
9260
9261 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9264 if self.parse_keyword(TIMESTAMP) {
9265 self.parse_explain_timestamp()
9266 .map_parser_err(StatementKind::ExplainTimestamp)
9267 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9268 self.parse_explain_pushdown()
9269 .map_parser_err(StatementKind::ExplainPushdown)
9270 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9271 self.parse_explain_analyze()
9272 .map_parser_err(StatementKind::ExplainAnalyzeObject)
9273 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9274 self.parse_explain_schema()
9275 .map_parser_err(StatementKind::ExplainSinkSchema)
9276 } else {
9277 self.parse_explain_plan()
9278 .map_parser_err(StatementKind::ExplainPlan)
9279 }
9280 }
9281
9282 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9283 let explainee = if self.parse_keyword(VIEW) {
9284 Explainee::View(self.parse_raw_name()?)
9286 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9287 Explainee::MaterializedView(self.parse_raw_name()?)
9289 } else if self.parse_keyword(INDEX) {
9290 Explainee::Index(self.parse_raw_name()?)
9292 } else if self.parse_keywords(&[REPLAN, VIEW]) {
9293 Explainee::ReplanView(self.parse_raw_name()?)
9295 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9296 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9298 } else if self.parse_keywords(&[REPLAN, INDEX]) {
9299 Explainee::ReplanIndex(self.parse_raw_name()?)
9301 } else {
9302 let broken = self.parse_keyword(BROKEN);
9303
9304 if self.peek_keywords(&[CREATE, VIEW])
9305 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9306 {
9307 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
9310 Statement::CreateView(stmt) => stmt,
9311 _ => panic!("Unexpected statement type return after parsing"),
9312 };
9313
9314 Explainee::CreateView(Box::new(stmt), broken)
9315 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9316 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9317 {
9318 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
9321 Statement::CreateMaterializedView(stmt) => stmt,
9322 _ => panic!("Unexpected statement type return after parsing"),
9323 };
9324
9325 Explainee::CreateMaterializedView(Box::new(stmt), broken)
9326 } else if self.peek_keywords(&[CREATE, INDEX])
9327 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9328 {
9329 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
9332 Statement::CreateIndex(stmt) => stmt,
9333 _ => panic!("Unexpected statement type return after parsing"),
9334 };
9335
9336 Explainee::CreateIndex(Box::new(stmt), broken)
9337 } else if self.peek_keyword(SUBSCRIBE) {
9338 let _ = self.parse_keyword(SUBSCRIBE); let stmt = match self.parse_subscribe()? {
9341 Statement::Subscribe(stmt) => stmt,
9342 _ => panic!("Unexpected statement type return after parsing"),
9343 };
9344 Explainee::Subscribe(Box::new(stmt), broken)
9345 } else {
9346 let query = self.parse_select_statement()?;
9348 Explainee::Select(Box::new(query), broken)
9349 }
9350 };
9351 Ok(explainee)
9352 }
9353
9354 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9357 let start = self.peek_pos();
9358 let (has_stage, stage) = match self.parse_one_of_keywords(&[
9359 RAW,
9360 DECORRELATED,
9361 LOCALLY,
9362 OPTIMIZED,
9363 PHYSICAL,
9364 OPTIMIZER,
9365 PLAN,
9366 ]) {
9367 Some(RAW) => {
9368 self.expect_keyword(PLAN)?;
9369 (true, Some(ExplainStage::RawPlan))
9370 }
9371 Some(DECORRELATED) => {
9372 self.expect_keyword(PLAN)?;
9373 (true, Some(ExplainStage::DecorrelatedPlan))
9374 }
9375 Some(LOCALLY) => {
9376 self.expect_keywords(&[OPTIMIZED, PLAN])?;
9377 (true, Some(ExplainStage::LocalPlan))
9378 }
9379 Some(OPTIMIZED) => {
9380 self.expect_keyword(PLAN)?;
9381 (true, Some(ExplainStage::GlobalPlan))
9382 }
9383 Some(PHYSICAL) => {
9384 self.expect_keyword(PLAN)?;
9385 (true, Some(ExplainStage::PhysicalPlan))
9386 }
9387 Some(OPTIMIZER) => {
9388 self.expect_keyword(TRACE)?;
9389 (true, Some(ExplainStage::Trace))
9390 }
9391 Some(PLAN) => {
9392 if self.parse_keyword(INSIGHTS) {
9393 (true, Some(ExplainStage::PlanInsights))
9394 } else {
9395 (true, None)
9397 }
9398 }
9399 None => {
9400 (false, None)
9402 }
9403 _ => unreachable!(),
9404 };
9405
9406 let with_options = if self.parse_keyword(WITH) {
9407 if self.consume_token(&Token::LParen) {
9408 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9409 self.expect_token(&Token::RParen)?;
9410 options
9411 } else {
9412 self.prev_token(); vec![]
9414 }
9415 } else {
9416 vec![]
9417 };
9418
9419 let format = if self.parse_keyword(AS) {
9420 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9421 Some(TEXT) => Some(ExplainFormat::Text),
9422 Some(JSON) => Some(ExplainFormat::Json),
9423 Some(DOT) => Some(ExplainFormat::Dot),
9424 Some(VERBOSE) => {
9425 self.expect_keyword(TEXT)?;
9426 Some(ExplainFormat::VerboseText)
9427 }
9428 None => return Err(ParserError::new(self.index, "expected a format")),
9429 _ => unreachable!(),
9430 }
9431 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9432 Some(ExplainFormat::VerboseText)
9434 } else {
9435 None
9436 };
9437
9438 if has_stage {
9439 self.expect_keyword(FOR)?;
9440 }
9441
9442 let explainee = self.parse_explainee()?;
9443
9444 if matches!((explainee.is_view(), &stage), (true, None)) {
9447 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9448 return Err(self.error(start, msg));
9449 }
9450
9451 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9452 stage,
9453 with_options,
9454 format,
9455 explainee,
9456 }))
9457 }
9458
9459 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9460 Ok(ExplainPlanOption {
9461 name: self.parse_explain_plan_option_name()?,
9462 value: self.parse_optional_option_value()?,
9463 })
9464 }
9465
9466 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9469 self.expect_keyword(FOR)?;
9470
9471 let explainee = self.parse_explainee()?;
9472
9473 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9474 explainee,
9475 }))
9476 }
9477
9478 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9479 if self.parse_keyword(CLUSTER) {
9481 let properties = self.parse_explain_analyze_computation_properties()?;
9482 let as_sql = self.parse_keywords(&[AS, SQL]);
9483 return Ok(Statement::ExplainAnalyzeCluster(
9484 ExplainAnalyzeClusterStatement { properties, as_sql },
9485 ));
9486 }
9487
9488 let properties = if self.parse_keyword(HINTS) {
9491 ExplainAnalyzeProperty::Hints
9492 } else {
9493 ExplainAnalyzeProperty::Computation(
9494 self.parse_explain_analyze_computation_properties()?,
9495 )
9496 };
9497
9498 self.expect_keyword(FOR)?;
9499
9500 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9501 INDEX => Explainee::Index(self.parse_raw_name()?),
9502 MATERIALIZED => {
9503 self.expect_keyword(VIEW)?;
9504 Explainee::MaterializedView(self.parse_raw_name()?)
9505 }
9506 _ => unreachable!(),
9507 };
9508
9509 let as_sql = self.parse_keywords(&[AS, SQL]);
9510
9511 Ok(Statement::ExplainAnalyzeObject(
9512 ExplainAnalyzeObjectStatement {
9513 properties,
9514 explainee,
9515 as_sql,
9516 },
9517 ))
9518 }
9519
9520 fn parse_explain_analyze_computation_properties(
9521 &mut self,
9522 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9523 let mut computation_properties = vec![CPU, MEMORY];
9524 let (kw, property) =
9525 self.parse_explain_analyze_computation_property(&computation_properties)?;
9526 let mut properties = vec![property];
9527 computation_properties.retain(|p| p != &kw);
9528
9529 while self.consume_token(&Token::Comma) {
9530 let (kw, property) =
9531 self.parse_explain_analyze_computation_property(&computation_properties)?;
9532 computation_properties.retain(|p| p != &kw);
9533 properties.push(property);
9534 }
9535
9536 let skew = self.parse_keywords(&[WITH, SKEW]);
9537
9538 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9539 }
9540
9541 fn parse_explain_analyze_computation_property(
9542 &mut self,
9543 properties: &[Keyword],
9544 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9545 if properties.is_empty() {
9546 return Err(ParserError::new(
9547 self.peek_pos(),
9548 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9549 ));
9550 }
9551
9552 match self.expect_one_of_keywords(properties)? {
9553 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9554 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9555 _ => unreachable!(),
9556 }
9557 }
9558
9559 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9562 let format = if self.parse_keyword(AS) {
9563 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9564 Some(TEXT) => Some(ExplainFormat::Text),
9565 Some(JSON) => Some(ExplainFormat::Json),
9566 Some(DOT) => Some(ExplainFormat::Dot),
9567 None => return Err(ParserError::new(self.index, "expected a format")),
9568 _ => unreachable!(),
9569 }
9570 } else {
9571 None
9572 };
9573
9574 self.expect_keyword(FOR)?;
9575
9576 let query = self.parse_select_statement()?;
9577
9578 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9579 format,
9580 select: query,
9581 }))
9582 }
9583 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9586 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9587 KEY => ExplainSinkSchemaFor::Key,
9588 VALUE => ExplainSinkSchemaFor::Value,
9589 _ => unreachable!(),
9590 };
9591
9592 self.expect_keyword(SCHEMA)?;
9593
9594 let format = if self.parse_keyword(AS) {
9595 self.expect_keyword(JSON)?;
9597 Some(ExplainFormat::Json)
9598 } else {
9599 None
9600 };
9601
9602 self.expect_keywords(&[FOR, CREATE])?;
9603
9604 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9605 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9606 schema_for,
9607 format,
9608 statement,
9609 }))
9610 } else {
9611 unreachable!("only create sink can be returned here");
9612 }
9613 }
9614
9615 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9618 let name = self
9619 .parse_identifier()
9620 .map_parser_err(StatementKind::Declare)?;
9621 self.expect_keyword(CURSOR)
9622 .map_parser_err(StatementKind::Declare)?;
9623 if self.parse_keyword(WITH) {
9624 let err = parser_err!(
9625 self,
9626 self.peek_prev_pos(),
9627 "WITH HOLD is unsupported for cursors"
9628 )
9629 .map_parser_err(StatementKind::Declare);
9630 self.expect_keyword(HOLD)
9631 .map_parser_err(StatementKind::Declare)?;
9632 return err;
9633 }
9634 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9636 self.expect_keyword(FOR)
9637 .map_parser_err(StatementKind::Declare)?;
9638 let StatementParseResult { ast, sql } = self.parse_statement()?;
9639 Ok(Statement::Declare(DeclareStatement {
9640 name,
9641 stmt: Box::new(ast),
9642 sql: sql.to_string(),
9643 }))
9644 }
9645
9646 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9649 let name = self.parse_identifier()?;
9650 Ok(Statement::Close(CloseStatement { name }))
9651 }
9652
9653 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9656 let name = self
9657 .parse_identifier()
9658 .map_parser_err(StatementKind::Prepare)?;
9659 self.expect_keyword(AS)
9660 .map_parser_err(StatementKind::Prepare)?;
9661 let pos = self.peek_pos();
9662 let StatementParseResult { ast, sql } = self.parse_statement()?;
9664 if !matches!(
9665 ast,
9666 Statement::Select(_)
9667 | Statement::Insert(_)
9668 | Statement::Delete(_)
9669 | Statement::Update(_)
9670 | Statement::Fetch(_),
9671 ) {
9672 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9673 }
9674 Ok(Statement::Prepare(PrepareStatement {
9675 name,
9676 stmt: Box::new(ast),
9677 sql: sql.to_string(),
9678 }))
9679 }
9680
9681 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9684 if self.parse_keywords(&[UNIT, TEST]) {
9686 return self.parse_execute_unit_test();
9687 }
9688
9689 let name = self.parse_identifier()?;
9691 let params = if self.consume_token(&Token::LParen) {
9692 let params = self.parse_comma_separated(Parser::parse_expr)?;
9693 self.expect_token(&Token::RParen)?;
9694 params
9695 } else {
9696 Vec::new()
9697 };
9698 Ok(Statement::Execute(ExecuteStatement { name, params }))
9699 }
9700
9701 fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9704 let name = self.parse_identifier()?;
9706
9707 self.expect_keyword(FOR)?;
9709
9710 let target = self.parse_raw_name()?;
9712
9713 let at_time = if self.parse_keywords(&[AT, TIME]) {
9715 Some(self.parse_expr()?)
9716 } else {
9717 None
9718 };
9719
9720 let mut mocks = Vec::new();
9724 if self.parse_keyword(MOCK) {
9725 mocks.push(self.parse_mock_view_def()?);
9726 while self.consume_token(&Token::Comma) {
9727 self.expect_keyword(MOCK)?;
9728 mocks.push(self.parse_mock_view_def()?);
9729 }
9730 }
9731
9732 self.expect_keyword(EXPECTED)?;
9733
9734 self.expect_token(&Token::LParen)?;
9735 let expected_columns = self.parse_comma_separated(|parser| {
9736 Ok(ColumnDef {
9737 name: parser.parse_identifier()?,
9738 data_type: parser.parse_data_type()?,
9739 collation: None,
9740 options: vec![],
9741 })
9742 })?;
9743 self.expect_token(&Token::RParen)?;
9744
9745 self.expect_keyword(AS)?;
9746 self.expect_token(&Token::LParen)?;
9747 let expected_query = self.parse_query()?;
9748 self.expect_token(&Token::RParen)?;
9749
9750 let expected = ExpectedResultDef {
9751 columns: expected_columns,
9752 query: expected_query,
9753 };
9754
9755 Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9756 name,
9757 target,
9758 at_time,
9759 mocks,
9760 expected,
9761 }))
9762 }
9763
9764 fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9767 let name = self.parse_raw_name()?;
9768
9769 self.expect_token(&Token::LParen)?;
9770 let columns = self.parse_comma_separated(|parser| {
9771 Ok(ColumnDef {
9772 name: parser.parse_identifier()?,
9773 data_type: parser.parse_data_type()?,
9774 collation: None,
9775 options: vec![],
9776 })
9777 })?;
9778 self.expect_token(&Token::RParen)?;
9779
9780 self.expect_keyword(AS)?;
9781 self.expect_token(&Token::LParen)?;
9782 let query = self.parse_query()?;
9783 self.expect_token(&Token::RParen)?;
9784
9785 Ok(MockViewDef {
9786 name,
9787 columns,
9788 query,
9789 })
9790 }
9791
9792 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9795 let _ = self.parse_keyword(PREPARE);
9796 let name = if self.parse_keyword(ALL) {
9797 None
9798 } else {
9799 Some(self.parse_identifier()?)
9800 };
9801 Ok(Statement::Deallocate(DeallocateStatement { name }))
9802 }
9803
9804 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9807 let _ = self.parse_keyword(FORWARD);
9808 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9809 Some(FetchDirection::ForwardCount(count))
9810 } else if self.parse_keyword(ALL) {
9811 Some(FetchDirection::ForwardAll)
9812 } else {
9813 None
9814 };
9815 let _ = self.parse_keyword(FROM);
9816 let name = self.parse_identifier()?;
9817 let options = if self.parse_keyword(WITH) {
9818 self.expect_token(&Token::LParen)?;
9819 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9820 self.expect_token(&Token::RParen)?;
9821 options
9822 } else {
9823 vec![]
9824 };
9825 Ok(Statement::Fetch(FetchStatement {
9826 name,
9827 count,
9828 options,
9829 }))
9830 }
9831
9832 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9833 self.expect_keyword(TIMEOUT)?;
9834 Ok(FetchOption {
9835 name: FetchOptionName::Timeout,
9836 value: self.parse_optional_option_value()?,
9837 })
9838 }
9839
9840 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9843 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9844 Some(DEBUG) => NoticeSeverity::Debug,
9845 Some(INFO) => NoticeSeverity::Info,
9846 Some(LOG) => NoticeSeverity::Log,
9847 Some(NOTICE) => NoticeSeverity::Notice,
9848 Some(WARNING) => NoticeSeverity::Warning,
9849 Some(_) => unreachable!(),
9850 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9851 };
9852
9853 Ok(Statement::Raise(RaiseStatement { severity }))
9854 }
9855
9856 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9859 match self.parse_privilege_specification() {
9860 Some(privileges) => self
9861 .parse_grant_privilege(privileges)
9862 .map_parser_err(StatementKind::GrantPrivileges),
9863 None => self
9864 .parse_grant_role()
9865 .map_parser_err(StatementKind::GrantRole),
9866 }
9867 }
9868
9869 fn parse_grant_privilege(
9872 &mut self,
9873 privileges: PrivilegeSpecification,
9874 ) -> Result<Statement<Raw>, ParserError> {
9875 self.expect_keyword(ON)?;
9876 let target = self.expect_grant_target_specification("GRANT")?;
9877 self.expect_keyword(TO)?;
9878 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9879 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9880 privileges,
9881 target,
9882 roles,
9883 }))
9884 }
9885
9886 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9889 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9890 self.expect_keyword(TO)?;
9891 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9892 Ok(Statement::GrantRole(GrantRoleStatement {
9893 role_names,
9894 member_names,
9895 }))
9896 }
9897
9898 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9901 match self.parse_privilege_specification() {
9902 Some(privileges) => self
9903 .parse_revoke_privilege(privileges)
9904 .map_parser_err(StatementKind::RevokePrivileges),
9905 None => self
9906 .parse_revoke_role()
9907 .map_parser_err(StatementKind::RevokeRole),
9908 }
9909 }
9910
9911 fn parse_revoke_privilege(
9914 &mut self,
9915 privileges: PrivilegeSpecification,
9916 ) -> Result<Statement<Raw>, ParserError> {
9917 self.expect_keyword(ON)?;
9918 let target = self.expect_grant_target_specification("REVOKE")?;
9919 self.expect_keyword(FROM)?;
9920 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9921 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9922 privileges,
9923 target,
9924 roles,
9925 }))
9926 }
9927
9928 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9931 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9932 self.expect_keyword(FROM)?;
9933 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9934 Ok(Statement::RevokeRole(RevokeRoleStatement {
9935 role_names,
9936 member_names,
9937 }))
9938 }
9939
9940 fn expect_grant_target_specification(
9941 &mut self,
9942 statement_type: &str,
9943 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9944 if self.parse_keyword(SYSTEM) {
9945 return Ok(GrantTargetSpecification::System);
9946 }
9947
9948 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9949 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9950 let object_spec_inner = if self.parse_keyword(IN) {
9951 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9952 return parser_err!(
9953 self,
9954 self.peek_prev_pos(),
9955 format!("IN invalid for {object_type}S")
9956 );
9957 }
9958 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9959 DATABASE => GrantTargetSpecificationInner::All(
9960 GrantTargetAllSpecification::AllDatabases {
9961 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9962 },
9963 ),
9964 SCHEMA => {
9965 if object_type == ObjectType::Schema {
9966 self.prev_token();
9967 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9968 }
9969 GrantTargetSpecificationInner::All(
9970 GrantTargetAllSpecification::AllSchemas {
9971 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9972 },
9973 )
9974 }
9975 _ => unreachable!(),
9976 }
9977 } else {
9978 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9979 };
9980 (object_type, object_spec_inner)
9981 } else {
9982 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9983 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9984 names: self
9985 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9986 };
9987 (object_type, object_spec_inner)
9988 };
9989
9990 Ok(GrantTargetSpecification::Object {
9991 object_type,
9992 object_spec_inner,
9993 })
9994 }
9995
9996 fn expect_grant_revoke_object_type(
9999 &mut self,
10000 statement_type: &str,
10001 ) -> Result<ObjectType, ParserError> {
10002 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
10004 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
10005 }
10006
10007 fn expect_grant_revoke_plural_object_type(
10010 &mut self,
10011 statement_type: &str,
10012 ) -> Result<ObjectType, ParserError> {
10013 let object_type = self.expect_plural_object_type().map_err(|_| {
10014 self.expected::<_, ObjectType>(
10016 self.peek_pos(),
10017 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
10018 self.peek_token(),
10019 )
10020 .unwrap_err()
10021 })?;
10022 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
10023 Ok(object_type)
10024 }
10025
10026 fn expect_grant_revoke_object_type_inner(
10027 &self,
10028 statement_type: &str,
10029 object_type: ObjectType,
10030 ) -> Result<ObjectType, ParserError> {
10031 match object_type {
10032 ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
10033 parser_err!(
10034 self,
10035 self.peek_prev_pos(),
10036 format!(
10037 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
10038 )
10039 )
10040 }
10041 ObjectType::Sink
10042 | ObjectType::MetricSink
10043 | ObjectType::Index
10044 | ObjectType::ClusterReplica
10045 | ObjectType::Role
10046 | ObjectType::Func
10047 | ObjectType::Subsource => {
10048 parser_err!(
10049 self,
10050 self.peek_prev_pos(),
10051 format!("Unsupported {statement_type} on {object_type}")
10052 )
10053 }
10054 ObjectType::Table
10055 | ObjectType::Type
10056 | ObjectType::Cluster
10057 | ObjectType::Secret
10058 | ObjectType::Connection
10059 | ObjectType::Database
10060 | ObjectType::Schema
10061 | ObjectType::NetworkPolicy => Ok(object_type),
10062 }
10063 }
10064
10065 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
10067 Ok(
10068 match self.expect_one_of_keywords(&[
10069 TABLE,
10070 VIEW,
10071 MATERIALIZED,
10072 SOURCE,
10073 SINK,
10074 METRIC,
10075 INDEX,
10076 TYPE,
10077 ROLE,
10078 USER,
10079 CLUSTER,
10080 SECRET,
10081 CONNECTION,
10082 DATABASE,
10083 SCHEMA,
10084 FUNCTION,
10085 NETWORK,
10086 ])? {
10087 TABLE => ObjectType::Table,
10088 VIEW => ObjectType::View,
10089 MATERIALIZED => {
10090 if let Err(e) = self.expect_keyword(VIEW) {
10091 self.prev_token();
10092 return Err(e);
10093 }
10094 ObjectType::MaterializedView
10095 }
10096 SOURCE => ObjectType::Source,
10097 SINK => ObjectType::Sink,
10098 METRIC => {
10099 if let Err(e) = self.expect_keyword(SINK) {
10100 self.prev_token();
10101 return Err(e);
10102 }
10103 ObjectType::MetricSink
10104 }
10105 INDEX => ObjectType::Index,
10106 TYPE => ObjectType::Type,
10107 ROLE | USER => ObjectType::Role,
10108 CLUSTER => {
10109 if self.parse_keyword(REPLICA) {
10110 ObjectType::ClusterReplica
10111 } else {
10112 ObjectType::Cluster
10113 }
10114 }
10115 SECRET => ObjectType::Secret,
10116 CONNECTION => ObjectType::Connection,
10117 DATABASE => ObjectType::Database,
10118 SCHEMA => ObjectType::Schema,
10119 FUNCTION => ObjectType::Func,
10120 NETWORK => {
10121 if let Err(e) = self.expect_keyword(POLICY) {
10122 self.prev_token();
10123 return Err(e);
10124 }
10125 ObjectType::NetworkPolicy
10126 }
10127 _ => unreachable!(),
10128 },
10129 )
10130 }
10131
10132 fn parse_object_type(&mut self) -> Option<ObjectType> {
10134 Some(
10135 match self.parse_one_of_keywords(&[
10136 TABLE,
10137 VIEW,
10138 MATERIALIZED,
10139 SOURCE,
10140 SINK,
10141 METRIC,
10142 INDEX,
10143 TYPE,
10144 ROLE,
10145 USER,
10146 CLUSTER,
10147 SECRET,
10148 CONNECTION,
10149 DATABASE,
10150 SCHEMA,
10151 FUNCTION,
10152 NETWORK,
10153 ])? {
10154 TABLE => ObjectType::Table,
10155 VIEW => ObjectType::View,
10156 MATERIALIZED => {
10157 if self.parse_keyword(VIEW) {
10158 ObjectType::MaterializedView
10159 } else {
10160 self.prev_token();
10161 return None;
10162 }
10163 }
10164 SOURCE => ObjectType::Source,
10165 SINK => ObjectType::Sink,
10166 METRIC => {
10167 if self.parse_keyword(SINK) {
10168 ObjectType::MetricSink
10169 } else {
10170 self.prev_token();
10171 return None;
10172 }
10173 }
10174 INDEX => ObjectType::Index,
10175 TYPE => ObjectType::Type,
10176 ROLE | USER => ObjectType::Role,
10177 CLUSTER => {
10178 if self.parse_keyword(REPLICA) {
10179 ObjectType::ClusterReplica
10180 } else {
10181 ObjectType::Cluster
10182 }
10183 }
10184 SECRET => ObjectType::Secret,
10185 CONNECTION => ObjectType::Connection,
10186 DATABASE => ObjectType::Database,
10187 SCHEMA => ObjectType::Schema,
10188 FUNCTION => ObjectType::Func,
10189 NETWORK => {
10190 if self.parse_keyword(POLICY) {
10191 ObjectType::NetworkPolicy
10192 } else {
10193 self.prev_token();
10194 return None;
10195 }
10196 }
10197 _ => unreachable!(),
10198 },
10199 )
10200 }
10201
10202 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10204 Ok(
10205 match self.expect_one_of_keywords(&[
10206 TABLES,
10207 VIEWS,
10208 MATERIALIZED,
10209 SOURCES,
10210 SINKS,
10211 INDEXES,
10212 TYPES,
10213 ROLES,
10214 USERS,
10215 CLUSTER,
10216 CLUSTERS,
10217 SECRETS,
10218 CONNECTIONS,
10219 DATABASES,
10220 SCHEMAS,
10221 POLICIES,
10222 ])? {
10223 TABLES => ObjectType::Table,
10224 VIEWS => ObjectType::View,
10225 MATERIALIZED => {
10226 if let Err(e) = self.expect_keyword(VIEWS) {
10227 self.prev_token();
10228 return Err(e);
10229 }
10230 ObjectType::MaterializedView
10231 }
10232 SOURCES => ObjectType::Source,
10233 SINKS => ObjectType::Sink,
10234 INDEXES => ObjectType::Index,
10235 TYPES => ObjectType::Type,
10236 ROLES | USERS => ObjectType::Role,
10237 CLUSTER => {
10238 if let Err(e) = self.expect_keyword(REPLICAS) {
10239 self.prev_token();
10240 return Err(e);
10241 }
10242 ObjectType::ClusterReplica
10243 }
10244 CLUSTERS => ObjectType::Cluster,
10245 SECRETS => ObjectType::Secret,
10246 CONNECTIONS => ObjectType::Connection,
10247 DATABASES => ObjectType::Database,
10248 SCHEMAS => ObjectType::Schema,
10249 POLICIES => ObjectType::NetworkPolicy,
10250 _ => unreachable!(),
10251 },
10252 )
10253 }
10254
10255 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10257 Some(
10258 match self.parse_one_of_keywords(&[
10259 TABLES,
10260 VIEWS,
10261 MATERIALIZED,
10262 SOURCES,
10263 SINKS,
10264 METRIC,
10265 INDEXES,
10266 TYPES,
10267 ROLES,
10268 USERS,
10269 CLUSTER,
10270 CLUSTERS,
10271 SECRETS,
10272 CONNECTIONS,
10273 DATABASES,
10274 SCHEMAS,
10275 SUBSOURCES,
10276 NETWORK,
10277 ])? {
10278 TABLES => ObjectType::Table,
10279 VIEWS => ObjectType::View,
10280 MATERIALIZED => {
10281 if self.parse_keyword(VIEWS) {
10282 ObjectType::MaterializedView
10283 } else {
10284 self.prev_token();
10285 return None;
10286 }
10287 }
10288 SOURCES => ObjectType::Source,
10289 SINKS => ObjectType::Sink,
10290 METRIC => {
10291 if self.parse_keyword(SINKS) {
10292 ObjectType::MetricSink
10293 } else {
10294 self.prev_token();
10295 return None;
10296 }
10297 }
10298 INDEXES => ObjectType::Index,
10299 TYPES => ObjectType::Type,
10300 ROLES | USERS => ObjectType::Role,
10301 CLUSTER => {
10302 if self.parse_keyword(REPLICAS) {
10303 ObjectType::ClusterReplica
10304 } else {
10305 self.prev_token();
10306 return None;
10307 }
10308 }
10309 CLUSTERS => ObjectType::Cluster,
10310 SECRETS => ObjectType::Secret,
10311 CONNECTIONS => ObjectType::Connection,
10312 DATABASES => ObjectType::Database,
10313 SCHEMAS => ObjectType::Schema,
10314 SUBSOURCES => ObjectType::Subsource,
10315 NETWORK => {
10316 if self.parse_keyword(POLICIES) {
10317 ObjectType::NetworkPolicy
10318 } else {
10319 self.prev_token();
10320 return None;
10321 }
10322 }
10323 _ => unreachable!(),
10324 },
10325 )
10326 }
10327
10328 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10331 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10332 return parser_err!(
10333 self,
10334 self.peek_prev_pos(),
10335 format!("For object type {object_type}, you must specify 'TABLES'")
10336 );
10337 }
10338 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10339 self.prev_token();
10340 return parser_err!(
10341 self,
10342 self.peek_prev_pos(),
10343 "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10344 );
10345 }
10346
10347 Ok(
10348 match self.expect_one_of_keywords(&[
10349 TABLES,
10350 TYPES,
10351 CLUSTERS,
10352 SECRETS,
10353 CONNECTIONS,
10354 DATABASES,
10355 SCHEMAS,
10356 ])? {
10357 TABLES => ObjectType::Table,
10358 TYPES => ObjectType::Type,
10359 CLUSTERS => ObjectType::Cluster,
10360 SECRETS => ObjectType::Secret,
10361 CONNECTIONS => ObjectType::Connection,
10362 DATABASES => ObjectType::Database,
10363 SCHEMAS => ObjectType::Schema,
10364 _ => unreachable!(),
10365 },
10366 )
10367 }
10368
10369 fn expect_plural_system_object_type_for_privileges(
10372 &mut self,
10373 ) -> Result<SystemObjectType, ParserError> {
10374 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10375 return parser_err!(
10376 self,
10377 self.peek_prev_pos(),
10378 format!("For object type {object_type}, you must specify 'TABLES'")
10379 );
10380 }
10381 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10382 self.prev_token();
10383 return parser_err!(
10384 self,
10385 self.peek_prev_pos(),
10386 "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10387 );
10388 }
10389
10390 Ok(
10391 match self.expect_one_of_keywords(&[
10392 SYSTEM,
10393 TABLES,
10394 TYPES,
10395 CLUSTERS,
10396 SECRETS,
10397 CONNECTIONS,
10398 DATABASES,
10399 SCHEMAS,
10400 ])? {
10401 SYSTEM => SystemObjectType::System,
10402 TABLES => SystemObjectType::Object(ObjectType::Table),
10403 TYPES => SystemObjectType::Object(ObjectType::Type),
10404 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10405 SECRETS => SystemObjectType::Object(ObjectType::Secret),
10406 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10407 DATABASES => SystemObjectType::Object(ObjectType::Database),
10408 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10409 _ => unreachable!(),
10410 },
10411 )
10412 }
10413
10414 fn parse_privilege(&mut self) -> Option<Privilege> {
10416 Some(
10417 match self.parse_one_of_keywords(&[
10418 INSERT,
10419 SELECT,
10420 UPDATE,
10421 DELETE,
10422 USAGE,
10423 CREATE,
10424 CREATEROLE,
10425 CREATEDB,
10426 CREATECLUSTER,
10427 CREATENETWORKPOLICY,
10428 ])? {
10429 INSERT => Privilege::INSERT,
10430 SELECT => Privilege::SELECT,
10431 UPDATE => Privilege::UPDATE,
10432 DELETE => Privilege::DELETE,
10433 USAGE => Privilege::USAGE,
10434 CREATE => Privilege::CREATE,
10435 CREATEROLE => Privilege::CREATEROLE,
10436 CREATEDB => Privilege::CREATEDB,
10437 CREATECLUSTER => Privilege::CREATECLUSTER,
10438 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10439 _ => unreachable!(),
10440 },
10441 )
10442 }
10443
10444 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10446 if self.parse_keyword(ALL) {
10447 let _ = self.parse_keyword(PRIVILEGES);
10448 return Some(PrivilegeSpecification::All);
10449 }
10450
10451 let mut privileges = Vec::new();
10452 while let Some(privilege) = self.parse_privilege() {
10453 privileges.push(privilege);
10454 if !self.consume_token(&Token::Comma) {
10455 break;
10456 }
10457 }
10458
10459 if privileges.is_empty() {
10460 None
10461 } else {
10462 Some(PrivilegeSpecification::Privileges(privileges))
10463 }
10464 }
10465
10466 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10468 let _ = self.parse_keyword(GROUP);
10469 self.parse_identifier()
10470 }
10471
10472 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10475 self.expect_keywords(&[OWNED, BY])?;
10476 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10477 self.expect_keyword(TO)?;
10478 let new_role = self.parse_identifier()?;
10479 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10480 old_roles,
10481 new_role,
10482 }))
10483 }
10484
10485 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10486 self.expect_keyword(ON)?;
10487
10488 let object = match self.expect_one_of_keywords(&[
10489 TABLE,
10490 VIEW,
10491 COLUMN,
10492 MATERIALIZED,
10493 SOURCE,
10494 SINK,
10495 INDEX,
10496 FUNCTION,
10497 CONNECTION,
10498 TYPE,
10499 SECRET,
10500 ROLE,
10501 DATABASE,
10502 SCHEMA,
10503 CLUSTER,
10504 NETWORK,
10505 ])? {
10506 TABLE => {
10507 let name = self.parse_raw_name()?;
10508 CommentObjectType::Table { name }
10509 }
10510 VIEW => {
10511 let name = self.parse_raw_name()?;
10512 CommentObjectType::View { name }
10513 }
10514 MATERIALIZED => {
10515 self.expect_keyword(VIEW)?;
10516 let name = self.parse_raw_name()?;
10517 CommentObjectType::MaterializedView { name }
10518 }
10519 SOURCE => {
10520 let name = self.parse_raw_name()?;
10521 CommentObjectType::Source { name }
10522 }
10523 SINK => {
10524 let name = self.parse_raw_name()?;
10525 CommentObjectType::Sink { name }
10526 }
10527 INDEX => {
10528 let name = self.parse_raw_name()?;
10529 CommentObjectType::Index { name }
10530 }
10531 FUNCTION => {
10532 let name = self.parse_raw_name()?;
10533 CommentObjectType::Func { name }
10534 }
10535 CONNECTION => {
10536 let name = self.parse_raw_name()?;
10537 CommentObjectType::Connection { name }
10538 }
10539 TYPE => {
10540 let ty = self.parse_data_type()?;
10541 CommentObjectType::Type { ty }
10542 }
10543 SECRET => {
10544 let name = self.parse_raw_name()?;
10545 CommentObjectType::Secret { name }
10546 }
10547 ROLE => {
10548 let name = self.parse_identifier()?;
10549 CommentObjectType::Role { name }
10550 }
10551 DATABASE => {
10552 let name = self.parse_database_name()?;
10553 CommentObjectType::Database { name }
10554 }
10555 SCHEMA => {
10556 let name = self.parse_schema_name()?;
10557 CommentObjectType::Schema { name }
10558 }
10559 CLUSTER => {
10560 if self.parse_keyword(REPLICA) {
10561 let name = self.parse_cluster_replica_name()?;
10562 CommentObjectType::ClusterReplica { name }
10563 } else {
10564 let name = self.parse_raw_ident()?;
10565 CommentObjectType::Cluster { name }
10566 }
10567 }
10568 COLUMN => {
10569 let name = self.parse_column_name()?;
10570 CommentObjectType::Column { name }
10571 }
10572 NETWORK => {
10573 self.expect_keyword(POLICY)?;
10574 let name = self.parse_raw_network_policy_name()?;
10575 CommentObjectType::NetworkPolicy { name }
10576 }
10577 _ => unreachable!(),
10578 };
10579
10580 self.expect_keyword(IS)?;
10581 let comment = match self.next_token() {
10582 Some(Token::Keyword(NULL)) => None,
10583 Some(Token::String(s)) => Some(s),
10584 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10585 };
10586
10587 Ok(Statement::Comment(CommentStatement { object, comment }))
10588 }
10589
10590 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10591 where
10592 S: TryInto<IdentString>,
10593 <S as TryInto<IdentString>>::Error: fmt::Display,
10594 {
10595 Ident::new(s).map_err(|e| ParserError {
10596 pos: self.peek_prev_pos(),
10597 message: e.to_string(),
10598 })
10599 }
10600}
10601
10602impl CheckedRecursion for Parser<'_> {
10603 fn recursion_guard(&self) -> &RecursionGuard {
10604 &self.recursion_guard
10605 }
10606}
10607
10608enum ParenthesizedFragment {
10612 Query(Query<Raw>),
10613 Exprs(Vec<Expr<Raw>>),
10614}
10615
10616impl ParenthesizedFragment {
10617 fn into_expr(self) -> Expr<Raw> {
10619 match self {
10620 ParenthesizedFragment::Exprs(exprs) => {
10621 if exprs.len() == 1 {
10624 Expr::Nested(Box::new(exprs.into_element()))
10627 } else {
10628 Expr::Row { exprs }
10631 }
10632 }
10633 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10635 }
10636 }
10637}
10638
10639include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));