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 keywords = [DETAILS, PUBLICATION, FAILOVER, TEXT, EXCLUDE];
3862 let name = match self.expect_one_of_keywords(&keywords)? {
3863 DETAILS => PgConfigOptionName::Details,
3864 PUBLICATION => PgConfigOptionName::Publication,
3865 FAILOVER => PgConfigOptionName::Failover,
3866 TEXT => {
3867 self.expect_keyword(COLUMNS)?;
3868
3869 let _ = self.consume_token(&Token::Eq);
3870
3871 let value = self
3872 .parse_option_sequence(Parser::parse_item_name)?
3873 .map(|inner| {
3874 WithOptionValue::Sequence(
3875 inner
3876 .into_iter()
3877 .map(WithOptionValue::UnresolvedItemName)
3878 .collect_vec(),
3879 )
3880 });
3881
3882 return Ok(PgConfigOption {
3883 name: PgConfigOptionName::TextColumns,
3884 value,
3885 });
3886 }
3887 EXCLUDE => {
3888 self.expect_keyword(COLUMNS)?;
3889
3890 let _ = self.consume_token(&Token::Eq);
3891
3892 let value = self
3893 .parse_option_sequence(Parser::parse_item_name)?
3894 .map(|inner| {
3895 WithOptionValue::Sequence(
3896 inner
3897 .into_iter()
3898 .map(WithOptionValue::UnresolvedItemName)
3899 .collect_vec(),
3900 )
3901 });
3902
3903 return Ok(PgConfigOption {
3904 name: PgConfigOptionName::ExcludeColumns,
3905 value,
3906 });
3907 }
3908 _ => unreachable!(),
3909 };
3910 Ok(PgConfigOption {
3911 name,
3912 value: self.parse_optional_option_value()?,
3913 })
3914 }
3915
3916 fn parse_mysql_connection_option(&mut self) -> Result<MySqlConfigOption<Raw>, ParserError> {
3917 match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE, IGNORE])? {
3918 DETAILS => Ok(MySqlConfigOption {
3919 name: MySqlConfigOptionName::Details,
3920 value: self.parse_optional_option_value()?,
3921 }),
3922 TEXT => {
3923 self.expect_keyword(COLUMNS)?;
3924
3925 let _ = self.consume_token(&Token::Eq);
3926
3927 let value = self
3928 .parse_option_sequence(Parser::parse_item_name)?
3929 .map(|inner| {
3930 WithOptionValue::Sequence(
3931 inner
3932 .into_iter()
3933 .map(WithOptionValue::UnresolvedItemName)
3934 .collect_vec(),
3935 )
3936 });
3937
3938 Ok(MySqlConfigOption {
3939 name: MySqlConfigOptionName::TextColumns,
3940 value,
3941 })
3942 }
3943 EXCLUDE | IGNORE => {
3945 self.expect_keyword(COLUMNS)?;
3946
3947 let _ = self.consume_token(&Token::Eq);
3948
3949 let value = self
3950 .parse_option_sequence(Parser::parse_item_name)?
3951 .map(|inner| {
3952 WithOptionValue::Sequence(
3953 inner
3954 .into_iter()
3955 .map(WithOptionValue::UnresolvedItemName)
3956 .collect_vec(),
3957 )
3958 });
3959
3960 Ok(MySqlConfigOption {
3961 name: MySqlConfigOptionName::ExcludeColumns,
3962 value,
3963 })
3964 }
3965 _ => unreachable!(),
3966 }
3967 }
3968
3969 fn parse_sql_server_connection_option(
3970 &mut self,
3971 ) -> Result<SqlServerConfigOption<Raw>, ParserError> {
3972 match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE])? {
3973 DETAILS => Ok(SqlServerConfigOption {
3974 name: SqlServerConfigOptionName::Details,
3975 value: self.parse_optional_option_value()?,
3976 }),
3977 TEXT => {
3978 self.expect_keyword(COLUMNS)?;
3979
3980 let _ = self.consume_token(&Token::Eq);
3981
3982 let value = self
3983 .parse_option_sequence(Parser::parse_item_name)?
3984 .map(|inner| {
3985 WithOptionValue::Sequence(
3986 inner
3987 .into_iter()
3988 .map(WithOptionValue::UnresolvedItemName)
3989 .collect_vec(),
3990 )
3991 });
3992
3993 Ok(SqlServerConfigOption {
3994 name: SqlServerConfigOptionName::TextColumns,
3995 value,
3996 })
3997 }
3998 EXCLUDE => {
3999 self.expect_keyword(COLUMNS)?;
4000
4001 let _ = self.consume_token(&Token::Eq);
4002
4003 let value = self
4004 .parse_option_sequence(Parser::parse_item_name)?
4005 .map(|inner| {
4006 WithOptionValue::Sequence(
4007 inner
4008 .into_iter()
4009 .map(WithOptionValue::UnresolvedItemName)
4010 .collect_vec(),
4011 )
4012 });
4013
4014 Ok(SqlServerConfigOption {
4015 name: SqlServerConfigOptionName::ExcludeColumns,
4016 value,
4017 })
4018 }
4019 _ => unreachable!(),
4020 }
4021 }
4022
4023 fn parse_load_generator_option(&mut self) -> Result<LoadGeneratorOption<Raw>, ParserError> {
4024 let name = match self.expect_one_of_keywords(&[
4025 AS,
4026 UP,
4027 SCALE,
4028 TICK,
4029 MAX,
4030 KEYS,
4031 SNAPSHOT,
4032 TRANSACTIONAL,
4033 VALUE,
4034 SEED,
4035 PARTITIONS,
4036 BATCH,
4037 ])? {
4038 AS => {
4039 self.expect_keyword(OF)?;
4040 LoadGeneratorOptionName::AsOf
4041 }
4042 UP => {
4043 self.expect_keyword(TO)?;
4044 LoadGeneratorOptionName::UpTo
4045 }
4046 SCALE => {
4047 self.expect_keyword(FACTOR)?;
4048 LoadGeneratorOptionName::ScaleFactor
4049 }
4050 TICK => {
4051 self.expect_keyword(INTERVAL)?;
4052 LoadGeneratorOptionName::TickInterval
4053 }
4054 MAX => {
4055 self.expect_keyword(CARDINALITY)?;
4056 LoadGeneratorOptionName::MaxCardinality
4057 }
4058 KEYS => LoadGeneratorOptionName::Keys,
4059 SNAPSHOT => {
4060 self.expect_keyword(ROUNDS)?;
4061 LoadGeneratorOptionName::SnapshotRounds
4062 }
4063 TRANSACTIONAL => {
4064 self.expect_keyword(SNAPSHOT)?;
4065 LoadGeneratorOptionName::TransactionalSnapshot
4066 }
4067 VALUE => {
4068 self.expect_keyword(SIZE)?;
4069 LoadGeneratorOptionName::ValueSize
4070 }
4071 SEED => LoadGeneratorOptionName::Seed,
4072 PARTITIONS => LoadGeneratorOptionName::Partitions,
4073 BATCH => {
4074 self.expect_keyword(SIZE)?;
4075 LoadGeneratorOptionName::BatchSize
4076 }
4077 _ => unreachable!(),
4078 };
4079
4080 let _ = self.consume_token(&Token::Eq);
4081 Ok(LoadGeneratorOption {
4082 name,
4083 value: self.parse_optional_option_value()?,
4084 })
4085 }
4086
4087 fn parse_create_kafka_sink_connection(
4088 &mut self,
4089 ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4090 self.expect_keyword(CONNECTION)?;
4091
4092 let connection = self.parse_raw_name()?;
4093
4094 let options = if self.consume_token(&Token::LParen) {
4095 let options = self.parse_comma_separated(Parser::parse_kafka_sink_config_option)?;
4096 self.expect_token(&Token::RParen)?;
4097 options
4098 } else {
4099 vec![]
4100 };
4101
4102 let key =
4106 if self.peek_keyword(KEY) && self.peek_nth_token(1) != Some(Token::Keyword(FORMAT)) {
4107 let _ = self.expect_keyword(KEY);
4108 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4109
4110 let not_enforced = if self.peek_keywords(&[NOT, ENFORCED]) {
4111 self.expect_keywords(&[NOT, ENFORCED])?;
4112 true
4113 } else {
4114 false
4115 };
4116 Some(SinkKey {
4117 key_columns,
4118 not_enforced,
4119 })
4120 } else {
4121 None
4122 };
4123
4124 let headers = if self.parse_keyword(HEADERS) {
4125 Some(self.parse_identifier()?)
4126 } else {
4127 None
4128 };
4129
4130 Ok(CreateSinkConnection::Kafka {
4131 connection,
4132 options,
4133 key,
4134 headers,
4135 })
4136 }
4137
4138 fn parse_create_iceberg_sink_connection(
4139 &mut self,
4140 ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4141 self.expect_keyword(CONNECTION)?;
4142 let catalog_connection = self.parse_raw_name()?;
4143
4144 let options = if self.consume_token(&Token::LParen) {
4145 let options = self.parse_comma_separated(Parser::parse_iceberg_sink_config_option)?;
4146 self.expect_token(&Token::RParen)?;
4147 options
4148 } else {
4149 vec![]
4150 };
4151
4152 let aws_connection = if self.parse_keywords(&[USING, AWS, CONNECTION]) {
4153 Some(self.parse_raw_name()?)
4154 } else {
4155 None
4156 };
4157
4158 let key = if self.parse_keyword(KEY) {
4159 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4160
4161 let not_enforced = self.parse_keywords(&[NOT, ENFORCED]);
4162 Some(SinkKey {
4163 key_columns,
4164 not_enforced,
4165 })
4166 } else {
4167 None
4168 };
4169
4170 Ok(CreateSinkConnection::Iceberg {
4171 catalog_connection,
4172 aws_connection,
4173 key,
4174 options,
4175 })
4176 }
4177
4178 fn parse_create_sink_connection(&mut self) -> Result<CreateSinkConnection<Raw>, ParserError> {
4179 match self.expect_one_of_keywords(&[KAFKA, ICEBERG])? {
4180 KAFKA => self.parse_create_kafka_sink_connection(),
4181 ICEBERG => {
4182 self.expect_keyword(CATALOG)?;
4183 self.parse_create_iceberg_sink_connection()
4184 }
4185 _ => unreachable!(),
4186 }
4187 }
4188
4189 fn parse_create_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4190 let mut if_exists = if self.parse_keyword(OR) {
4191 self.expect_keyword(REPLACE)?;
4192 IfExistsBehavior::Replace
4193 } else {
4194 IfExistsBehavior::Error
4195 };
4196 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
4197 self.expect_keyword(VIEW)?;
4198 if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4199 if_exists = IfExistsBehavior::Skip;
4200 }
4201
4202 let definition = self.parse_view_definition()?;
4203 Ok(Statement::CreateView(CreateViewStatement {
4204 temporary,
4205 if_exists,
4206 definition,
4207 }))
4208 }
4209
4210 fn parse_view_definition(&mut self) -> Result<ViewDefinition<Raw>, ParserError> {
4211 let name = self.parse_item_name()?;
4213 let columns = self.parse_parenthesized_column_list(Optional)?;
4214 self.expect_keyword(AS)?;
4216 let query = self.parse_query()?;
4217 Ok(ViewDefinition {
4219 name,
4220 columns,
4221 query,
4222 })
4223 }
4224
4225 fn parse_create_materialized_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4226 let mut if_exists = if self.parse_keyword(OR) {
4227 self.expect_keyword(REPLACE)?;
4228 IfExistsBehavior::Replace
4229 } else {
4230 IfExistsBehavior::Error
4231 };
4232 let replacement = self.parse_keyword(REPLACEMENT);
4233 self.expect_keywords(&[MATERIALIZED, VIEW])?;
4234 if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4235 if_exists = IfExistsBehavior::Skip;
4236 }
4237
4238 let name = self.parse_item_name()?;
4239 let columns = self.parse_parenthesized_column_list(Optional)?;
4240 let replacement_for = if replacement {
4241 self.expect_keyword(FOR)?;
4242 Some(self.parse_raw_name()?)
4243 } else {
4244 None
4245 };
4246 let (in_cluster, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
4247 let cluster = self.parse_raw_ident()?;
4248 let replica = if self.parse_keyword(REPLICA) {
4249 Some(self.parse_identifier()?)
4250 } else {
4251 None
4252 };
4253 (Some(cluster), replica)
4254 } else if self.parse_keywords(&[IN, REPLICA]) {
4255 let replica = self.parse_identifier()?;
4256 (None, Some(replica))
4257 } else {
4258 (None, None)
4259 };
4260
4261 let with_options = if self.parse_keyword(WITH) {
4262 self.expect_token(&Token::LParen)?;
4263 let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
4264 self.expect_token(&Token::RParen)?;
4265 options
4266 } else {
4267 vec![]
4268 };
4269
4270 self.expect_keyword(AS)?;
4271 let query = self.parse_query()?;
4272 let as_of = self.parse_optional_internal_as_of()?;
4273
4274 Ok(Statement::CreateMaterializedView(
4275 CreateMaterializedViewStatement {
4276 if_exists,
4277 name,
4278 columns,
4279 replacement_for,
4280 in_cluster,
4281 in_cluster_replica,
4282 query,
4283 as_of,
4284 with_options,
4285 },
4286 ))
4287 }
4288
4289 fn parse_materialized_view_option_name(
4290 &mut self,
4291 ) -> Result<MaterializedViewOptionName, ParserError> {
4292 let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4293 let name = match option {
4294 ASSERT => {
4295 self.expect_keywords(&[NOT, NULL])?;
4296 MaterializedViewOptionName::AssertNotNull
4297 }
4298 PARTITION => {
4299 self.expect_keyword(BY)?;
4300 MaterializedViewOptionName::PartitionBy
4301 }
4302 RETAIN => {
4303 self.expect_keyword(HISTORY)?;
4304 MaterializedViewOptionName::RetainHistory
4305 }
4306 REFRESH => MaterializedViewOptionName::Refresh,
4307 _ => unreachable!(),
4308 };
4309 Ok(name)
4310 }
4311
4312 fn parse_materialized_view_option(
4313 &mut self,
4314 ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4315 let name = self.parse_materialized_view_option_name()?;
4316 let value = match name {
4317 MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4318 MaterializedViewOptionName::Refresh => {
4319 Some(self.parse_materialized_view_refresh_option_value()?)
4320 }
4321 _ => self.parse_optional_option_value()?,
4322 };
4323 Ok(MaterializedViewOption { name, value })
4324 }
4325
4326 fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4327 Ok(Some(self.parse_retain_history()?))
4328 }
4329
4330 fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4331 let _ = self.consume_token(&Token::Eq);
4332 self.expect_keyword(FOR)?;
4333 let value = self.parse_value()?;
4334 Ok(WithOptionValue::RetainHistoryFor(value))
4335 }
4336
4337 fn parse_materialized_view_refresh_option_value(
4338 &mut self,
4339 ) -> Result<WithOptionValue<Raw>, ParserError> {
4340 let _ = self.consume_token(&Token::Eq);
4341
4342 match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4343 ON => {
4344 self.expect_keyword(COMMIT)?;
4345 Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4346 }
4347 AT => {
4348 if self.parse_keyword(CREATION) {
4349 Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4350 } else {
4351 Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4352 RefreshAtOptionValue {
4353 time: self.parse_expr()?,
4354 },
4355 )))
4356 }
4357 }
4358 EVERY => {
4359 let interval = self.parse_interval_value()?;
4360 let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4361 Some(self.parse_expr()?)
4362 } else {
4363 None
4364 };
4365 Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4366 RefreshEveryOptionValue {
4367 interval,
4368 aligned_to,
4369 },
4370 )))
4371 }
4372 _ => unreachable!(),
4373 }
4374 }
4375
4376 fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4377 let default_index = self.parse_keyword(DEFAULT);
4378 self.expect_keyword(INDEX)?;
4379
4380 let if_not_exists = self.parse_if_not_exists()?;
4381 let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4382 if if_not_exists && !default_index {
4383 return self.expected(self.peek_pos(), "index name", self.peek_token());
4384 }
4385 None
4386 } else {
4387 Some(self.parse_identifier()?)
4388 };
4389 let in_cluster = self.parse_optional_in_cluster()?;
4390 self.expect_keyword(ON)?;
4391 let on_name = self.parse_raw_name()?;
4392
4393 if self.parse_keyword(USING) {
4395 self.expect_keyword(ARRANGEMENT)?;
4396 }
4397
4398 let key_parts = if default_index {
4399 None
4400 } else {
4401 self.expect_token(&Token::LParen)?;
4402 if self.consume_token(&Token::RParen) {
4403 Some(vec![])
4404 } else {
4405 let key_parts = self
4406 .parse_comma_separated(Parser::parse_order_by_expr)?
4407 .into_iter()
4408 .map(|x| x.expr)
4409 .collect::<Vec<_>>();
4410 self.expect_token(&Token::RParen)?;
4411 Some(key_parts)
4412 }
4413 };
4414
4415 let with_options = if self.parse_keyword(WITH) {
4416 self.expect_token(&Token::LParen)?;
4417 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4418 vec![]
4419 } else {
4420 self.parse_comma_separated(Parser::parse_index_option)?
4421 };
4422 self.expect_token(&Token::RParen)?;
4423 o
4424 } else {
4425 vec![]
4426 };
4427
4428 Ok(Statement::CreateIndex(CreateIndexStatement {
4429 name,
4430 in_cluster,
4431 on_name,
4432 key_parts,
4433 with_options,
4434 if_not_exists,
4435 }))
4436 }
4437
4438 fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4439 if self.parse_keyword(REDACTED) {
4442 return Ok(TableOptionName::RedactedTest);
4443 }
4444 let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4445 PARTITION => {
4446 self.expect_keyword(BY)?;
4447 TableOptionName::PartitionBy
4448 }
4449 RETAIN => {
4450 self.expect_keyword(HISTORY)?;
4451 TableOptionName::RetainHistory
4452 }
4453 _ => unreachable!(),
4454 };
4455 Ok(name)
4456 }
4457
4458 fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4459 let name = self.parse_table_option_name()?;
4460 let value = match name {
4461 TableOptionName::PartitionBy => self.parse_optional_option_value(),
4462 TableOptionName::RetainHistory => self.parse_option_retain_history(),
4463 TableOptionName::RedactedTest => self.parse_optional_option_value(),
4464 }?;
4465 Ok(TableOption { name, value })
4466 }
4467
4468 fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4469 self.expect_keywords(&[RETAIN, HISTORY])?;
4470 Ok(IndexOptionName::RetainHistory)
4471 }
4472
4473 fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4474 let name = self.parse_index_option_name()?;
4475 let value = match name {
4476 IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4477 }?;
4478 Ok(IndexOption { name, value })
4479 }
4480
4481 fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4482 if self.consume_token(&Token::LBracket) {
4483 let id = self.parse_raw_ident_str()?;
4484 self.expect_token(&Token::RBracket)?;
4485 Ok(RawClusterName::Resolved(id))
4486 } else {
4487 Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4488 }
4489 }
4490
4491 fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4492 if self.consume_token(&Token::LBracket) {
4493 let id = self.parse_raw_ident_str()?;
4494 self.expect_token(&Token::RBracket)?;
4495 Ok(RawNetworkPolicyName::Resolved(id))
4496 } else {
4497 Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4498 }
4499 }
4500
4501 fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4502 let id = match self.next_token() {
4503 Some(Token::Ident(id)) => id.into_inner(),
4504 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4505 };
4506 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 => {
7358 if self.parse_keywords(&[WITH, TIME, ZONE]) {
7359 other(ident!("timetz"))
7360 } else {
7361 if self.parse_keyword(WITHOUT) {
7362 self.expect_keywords(&[TIME, ZONE])?;
7363 }
7364 other(ident!("time"))
7365 }
7366 }
7367 TIMESTAMP => {
7368 let typ_mod = self.parse_timestamp_precision()?;
7369 if self.parse_keywords(&[WITH, 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 = self.parse_raw_ident_str()?;
7545 self.expect_keyword(AS)?;
7546 let name = self.parse_item_name()?;
7547 if name.0.len() < 2 {
7549 return parser_err!(
7550 self,
7551 self.peek_prev_pos(),
7552 "table name in square brackets must be fully qualified"
7553 );
7554 }
7555
7556 let version = if self.parse_keywords(&[VERSION]) {
7557 let version = self.parse_version()?;
7558 Some(version)
7559 } else {
7560 None
7561 };
7562
7563 self.expect_token(&Token::RBracket)?;
7564 Ok(RawItemName::Id(id, name, version))
7565 } else {
7566 Ok(RawItemName::Name(self.parse_item_name()?))
7567 }
7568 }
7569
7570 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7571 let start = self.peek_pos();
7572 let mut item_name = self.parse_raw_name()?;
7573 let column_name = match &mut item_name {
7574 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7575 if identifiers.len() < 2 {
7576 return Err(ParserError::new(
7577 start,
7578 "need to specify an object and a column",
7579 ));
7580 }
7581 identifiers.pop().unwrap()
7582 }
7583 RawItemName::Id(_, _, _) => {
7584 self.expect_token(&Token::Dot)?;
7585 self.parse_identifier()?
7586 }
7587 };
7588
7589 Ok(ColumnName {
7590 relation: item_name,
7591 column: column_name,
7592 })
7593 }
7594
7595 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7598 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7599 }
7600
7601 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7604 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7605 }
7606
7607 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7610 Ok(UnresolvedItemName(self.parse_identifiers()?))
7611 }
7612
7613 fn parse_object_name(
7615 &mut self,
7616 object_type: ObjectType,
7617 ) -> Result<UnresolvedObjectName, ParserError> {
7618 Ok(match object_type {
7619 ObjectType::Table
7620 | ObjectType::View
7621 | ObjectType::MaterializedView
7622 | ObjectType::Source
7623 | ObjectType::Subsource
7624 | ObjectType::Sink
7625 | ObjectType::MetricSink
7626 | ObjectType::Index
7627 | ObjectType::Type
7628 | ObjectType::Secret
7629 | ObjectType::Connection
7630 | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7631 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7632 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7633 ObjectType::ClusterReplica => {
7634 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7635 }
7636 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7637 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7638 ObjectType::NetworkPolicy => {
7639 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7640 }
7641 })
7642 }
7643
7644 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7646 let mut idents = vec![];
7647 loop {
7648 idents.push(self.parse_identifier()?);
7649 if !self.consume_token(&Token::Dot) {
7650 break;
7651 }
7652 }
7653 Ok(idents)
7654 }
7655
7656 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7658 match self.consume_identifier()? {
7659 Some(id) => {
7660 if id.as_str().is_empty() {
7661 return parser_err!(
7662 self,
7663 self.peek_prev_pos(),
7664 "zero-length delimited identifier",
7665 );
7666 }
7667 Ok(id)
7668 }
7669 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7670 }
7671 }
7672
7673 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7674 match self.peek_token() {
7675 Some(Token::Keyword(kw)) => {
7676 self.next_token();
7677 Ok(Some(kw.into()))
7678 }
7679 Some(Token::Ident(id)) => {
7680 self.next_token();
7681 Ok(Some(self.new_identifier(id)?))
7682 }
7683 _ => Ok(None),
7684 }
7685 }
7686
7687 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7688 let mut id_parts = vec![id];
7689 match self.peek_token() {
7690 Some(Token::LParen) | Some(Token::Dot) => {
7691 let mut ends_with_wildcard = false;
7692 while self.consume_token(&Token::Dot) {
7693 match self.next_token() {
7694 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7695 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7696 Some(Token::Star) => {
7697 ends_with_wildcard = true;
7698 break;
7699 }
7700 unexpected => {
7701 return self.expected(
7702 self.peek_prev_pos(),
7703 "an identifier or a '*' after '.'",
7704 unexpected,
7705 );
7706 }
7707 }
7708 }
7709 if ends_with_wildcard {
7710 Ok(Expr::QualifiedWildcard(id_parts))
7711 } else if self.peek_token() == Some(Token::LParen) {
7712 let function =
7713 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7714 Ok(Expr::Function(function))
7715 } else {
7716 Ok(Expr::Identifier(id_parts))
7717 }
7718 }
7719 _ => Ok(Expr::Identifier(id_parts)),
7720 }
7721 }
7722
7723 fn parse_parenthesized_column_list(
7725 &mut self,
7726 optional: IsOptional,
7727 ) -> Result<Vec<Ident>, ParserError> {
7728 if self.consume_token(&Token::LParen) {
7729 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7730 self.expect_token(&Token::RParen)?;
7731 Ok(cols)
7732 } else if optional == Optional {
7733 Ok(vec![])
7734 } else {
7735 self.expected(
7736 self.peek_pos(),
7737 "a list of columns in parentheses",
7738 self.peek_token(),
7739 )
7740 }
7741 }
7742
7743 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7744 if self.consume_token(&Token::LParen) {
7745 let n = self.parse_literal_uint()?;
7746 self.expect_token(&Token::RParen)?;
7747 Ok(Some(n))
7748 } else {
7749 Ok(None)
7750 }
7751 }
7752
7753 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7754 self.expect_token(&Token::LBracket)?;
7755 let key_type = Box::new(self.parse_data_type()?);
7756 self.expect_token(&Token::Arrow)?;
7757 let value_type = Box::new(self.parse_data_type()?);
7758 self.expect_token(&Token::RBracket)?;
7759 Ok(RawDataType::Map {
7760 key_type,
7761 value_type,
7762 })
7763 }
7764
7765 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7766 self.expect_keyword(FROM)?;
7767 let table_name = RawItemName::Name(self.parse_item_name()?);
7768 let alias = self.parse_optional_table_alias()?;
7769 let using = if self.parse_keyword(USING) {
7770 self.parse_comma_separated(Parser::parse_table_and_joins)?
7771 } else {
7772 vec![]
7773 };
7774 let selection = if self.parse_keyword(WHERE) {
7775 Some(self.parse_expr()?)
7776 } else {
7777 None
7778 };
7779
7780 Ok(Statement::Delete(DeleteStatement {
7781 table_name,
7782 alias,
7783 using,
7784 selection,
7785 }))
7786 }
7787
7788 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7790 Ok(SelectStatement {
7791 query: self.parse_query()?,
7792 as_of: self.parse_optional_as_of()?,
7793 })
7794 }
7795
7796 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7801 self.checked_recur_mut(|parser| {
7802 let cte_block = if parser.parse_keyword(WITH) {
7803 if parser.parse_keyword(MUTUALLY) {
7804 parser.expect_keyword(RECURSIVE)?;
7805 let options = if parser.consume_token(&Token::LParen) {
7806 let options =
7807 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7808 parser.expect_token(&Token::RParen)?;
7809 options
7810 } else {
7811 vec![]
7812 };
7813 CteBlock::MutuallyRecursive(MutRecBlock {
7814 options,
7815 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7816 })
7817 } else {
7818 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7820 }
7821 } else {
7822 CteBlock::empty()
7823 };
7824
7825 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7826
7827 parser.parse_query_tail(cte_block, body)
7828 })
7829 }
7830
7831 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7832 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7833 RECURSION => {
7834 self.expect_keyword(LIMIT)?;
7835 Ok(MutRecBlockOption {
7836 name: MutRecBlockOptionName::RecursionLimit,
7837 value: self.parse_optional_option_value()?,
7838 })
7839 }
7840 RETURN => {
7841 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7842 Ok(MutRecBlockOption {
7843 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7844 value: self.parse_optional_option_value()?,
7845 })
7846 }
7847 ERROR => {
7848 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7849 Ok(MutRecBlockOption {
7850 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7851 value: self.parse_optional_option_value()?,
7852 })
7853 }
7854 _ => unreachable!(),
7855 }
7856 }
7857
7858 fn parse_query_tail(
7859 &mut self,
7860 ctes: CteBlock<Raw>,
7861 body: SetExpr<Raw>,
7862 ) -> Result<Query<Raw>, ParserError> {
7863 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7864 SetExpr::Query(query) => {
7865 let Query {
7866 ctes,
7867 body,
7868 order_by,
7869 limit,
7870 offset,
7871 } = *query;
7872 (ctes, order_by, limit, offset, body)
7873 }
7874 _ => (CteBlock::empty(), vec![], None, None, body),
7875 };
7876
7877 let ctes = if ctes.is_empty() {
7878 inner_ctes
7879 } else if !inner_ctes.is_empty() {
7880 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7881 } else {
7882 ctes
7883 };
7884
7885 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7886 if !inner_order_by.is_empty() {
7887 return parser_err!(
7888 self,
7889 self.peek_prev_pos(),
7890 "multiple ORDER BY clauses not allowed"
7891 );
7892 }
7893 self.parse_comma_separated(Parser::parse_order_by_expr)?
7894 } else {
7895 inner_order_by
7896 };
7897
7898 let mut limit = inner_limit;
7902 let mut offset = inner_offset;
7903 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7904 match parsed_keyword {
7905 LIMIT => {
7906 if limit.is_some() {
7907 return parser_err!(
7908 self,
7909 self.peek_prev_pos(),
7910 "multiple LIMIT/FETCH clauses not allowed"
7911 );
7912 }
7913 limit = if self.parse_keyword(ALL) {
7914 None
7915 } else {
7916 Some(Limit {
7917 with_ties: false,
7918 quantity: self.parse_expr()?,
7919 })
7920 };
7921 }
7922 OFFSET => {
7923 if offset.is_some() {
7924 return parser_err!(
7925 self,
7926 self.peek_prev_pos(),
7927 "multiple OFFSET clauses not allowed"
7928 );
7929 }
7930 let value = self.parse_expr()?;
7931 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7932 offset = Some(value);
7933 }
7934 FETCH => {
7935 if limit.is_some() {
7936 return parser_err!(
7937 self,
7938 self.peek_prev_pos(),
7939 "multiple LIMIT/FETCH clauses not allowed"
7940 );
7941 }
7942 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7943 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7944 Expr::Value(Value::Number('1'.into()))
7945 } else {
7946 let quantity = self.parse_expr()?;
7947 self.expect_one_of_keywords(&[ROW, ROWS])?;
7948 quantity
7949 };
7950 let with_ties = if self.parse_keyword(ONLY) {
7951 false
7952 } else if self.parse_keywords(&[WITH, TIES]) {
7953 true
7954 } else {
7955 return self.expected(
7956 self.peek_pos(),
7957 "one of ONLY or WITH TIES",
7958 self.peek_token(),
7959 );
7960 };
7961 limit = Some(Limit {
7962 with_ties,
7963 quantity,
7964 });
7965 }
7966 _ => unreachable!(),
7967 }
7968 }
7969
7970 Ok(Query {
7971 ctes,
7972 body,
7973 order_by,
7974 limit,
7975 offset,
7976 })
7977 }
7978
7979 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7981 let alias = TableAlias {
7982 name: self.parse_identifier()?,
7983 columns: self.parse_parenthesized_column_list(Optional)?,
7984 strict: false,
7985 };
7986 self.expect_keyword(AS)?;
7987 self.expect_token(&Token::LParen)?;
7988 let query = self.parse_query()?;
7989 self.expect_token(&Token::RParen)?;
7990 Ok(Cte {
7991 alias,
7992 query,
7993 id: (),
7994 })
7995 }
7996
7997 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
8003 let name = self.parse_identifier()?;
8004 self.expect_token(&Token::LParen)?;
8005 let columns = self.parse_comma_separated(|parser| {
8006 Ok(CteMutRecColumnDef {
8007 name: parser.parse_identifier()?,
8008 data_type: parser.parse_data_type()?,
8009 })
8010 })?;
8011 self.expect_token(&Token::RParen)?;
8012 self.expect_keyword(AS)?;
8013 self.expect_token(&Token::LParen)?;
8014 let query = self.parse_query()?;
8015 self.expect_token(&Token::RParen)?;
8016 Ok(CteMutRec {
8017 name,
8018 columns,
8019 query,
8020 id: (),
8021 })
8022 }
8023
8024 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
8033 let expr = if self.parse_keyword(SELECT) {
8036 SetExpr::Select(Box::new(self.parse_select()?))
8037 } else if self.consume_token(&Token::LParen) {
8038 let subquery = self.parse_query()?;
8040 self.expect_token(&Token::RParen)?;
8041 SetExpr::Query(Box::new(subquery))
8042 } else if self.parse_keyword(VALUES) {
8043 SetExpr::Values(self.parse_values()?)
8044 } else if self.parse_keyword(SHOW) {
8045 SetExpr::Show(self.parse_show()?)
8046 } else if self.parse_keyword(TABLE) {
8047 SetExpr::Table(self.parse_raw_name()?)
8048 } else {
8049 return self.expected(
8050 self.peek_pos(),
8051 "SELECT, VALUES, or a subquery in the query body",
8052 self.peek_token(),
8053 );
8054 };
8055
8056 self.parse_query_body_seeded(precedence, expr)
8057 }
8058
8059 fn parse_query_body_seeded(
8060 &mut self,
8061 precedence: SetPrecedence,
8062 mut expr: SetExpr<Raw>,
8063 ) -> Result<SetExpr<Raw>, ParserError> {
8064 loop {
8065 let next_token = self.peek_token();
8067 let op = self.parse_set_operator(&next_token);
8068 let next_precedence = match op {
8069 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
8071 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
8073 None => break,
8075 };
8076 if precedence >= next_precedence {
8077 break;
8078 }
8079 self.next_token(); let all = self.parse_keyword(ALL);
8082 let distinct = self.parse_keyword(DISTINCT);
8083 if all && distinct {
8084 return parser_err!(
8085 self,
8086 self.peek_prev_pos(),
8087 "Cannot specify both ALL and DISTINCT in set operation"
8088 );
8089 }
8090 expr = SetExpr::SetOperation {
8091 left: Box::new(expr),
8092 op: op.unwrap(),
8093 all,
8094 right: Box::new(self.parse_query_body(next_precedence)?),
8095 };
8096 }
8097
8098 Ok(expr)
8099 }
8100
8101 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
8102 match token {
8103 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
8104 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
8105 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
8106 _ => None,
8107 }
8108 }
8109
8110 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
8113 let all = self.parse_keyword(ALL);
8114 let distinct = self.parse_keyword(DISTINCT);
8115 if all && distinct {
8116 return parser_err!(
8117 self,
8118 self.peek_prev_pos(),
8119 "Cannot specify both ALL and DISTINCT in SELECT"
8120 );
8121 }
8122 let distinct = if distinct && self.parse_keyword(ON) {
8123 self.expect_token(&Token::LParen)?;
8124 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
8125 self.expect_token(&Token::RParen)?;
8126 Some(Distinct::On(exprs))
8127 } else if distinct {
8128 Some(Distinct::EntireRow)
8129 } else {
8130 None
8131 };
8132
8133 let projection = match self.peek_token() {
8134 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
8138 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
8139 _ => {
8140 let mut projection = vec![];
8141 loop {
8142 projection.push(self.parse_select_item()?);
8143 if !self.consume_token(&Token::Comma) {
8144 break;
8145 }
8146 if self.peek_keyword(FROM) {
8147 return parser_err!(
8148 self,
8149 self.peek_prev_pos(),
8150 "invalid trailing comma in SELECT list",
8151 );
8152 }
8153 }
8154 projection
8155 }
8156 };
8157
8158 let from = if self.parse_keyword(FROM) {
8164 self.parse_comma_separated(Parser::parse_table_and_joins)?
8165 } else {
8166 vec![]
8167 };
8168
8169 let selection = if self.parse_keyword(WHERE) {
8170 Some(self.parse_expr()?)
8171 } else {
8172 None
8173 };
8174
8175 let group_by = if self.parse_keywords(&[GROUP, BY]) {
8176 self.parse_comma_separated(Parser::parse_expr)?
8177 } else {
8178 vec![]
8179 };
8180
8181 let having = if self.parse_keyword(HAVING) {
8182 Some(self.parse_expr()?)
8183 } else {
8184 None
8185 };
8186
8187 let qualify = if self.parse_keyword(QUALIFY) {
8188 Some(self.parse_expr()?)
8189 } else {
8190 None
8191 };
8192
8193 let options = if self.parse_keyword(OPTIONS) {
8194 self.expect_token(&Token::LParen)?;
8195 let options = self.parse_comma_separated(Self::parse_select_option)?;
8196 self.expect_token(&Token::RParen)?;
8197 options
8198 } else {
8199 vec![]
8200 };
8201
8202 Ok(Select {
8203 distinct,
8204 projection,
8205 from,
8206 selection,
8207 group_by,
8208 having,
8209 qualify,
8210 options,
8211 })
8212 }
8213
8214 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8215 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8216 EXPECTED => {
8217 self.expect_keywords(&[GROUP, SIZE])?;
8218 SelectOptionName::ExpectedGroupSize
8219 }
8220 AGGREGATE => {
8221 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8222 SelectOptionName::AggregateInputGroupSize
8223 }
8224 DISTINCT => {
8225 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8226 SelectOptionName::DistinctOnInputGroupSize
8227 }
8228 LIMIT => {
8229 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8230 SelectOptionName::LimitInputGroupSize
8231 }
8232 _ => unreachable!(),
8233 };
8234 Ok(SelectOption {
8235 name,
8236 value: self.parse_optional_option_value()?,
8237 })
8238 }
8239
8240 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8241 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8242 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8243 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8244 if !normal {
8245 match variable.as_str().parse() {
8246 Ok(TIME) => {
8247 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8248 variable = ident!("timezone");
8249 normal = true;
8250 }
8251 Ok(NAMES) => {
8252 variable = ident!("client_encoding");
8253 normal = true;
8254 }
8255 _ => {}
8256 }
8257 }
8258 if variable.as_str().parse() == Ok(SCHEMA) {
8259 variable = ident!("search_path");
8260 let to = self
8261 .parse_set_schema_to()
8262 .map_parser_err(StatementKind::SetVariable)?;
8263 Ok(Statement::SetVariable(SetVariableStatement {
8264 local: modifier == Some(LOCAL),
8265 variable,
8266 to,
8267 }))
8268 } else if normal {
8269 let to = self
8270 .parse_set_variable_to()
8271 .map_parser_err(StatementKind::SetVariable)?;
8272 Ok(Statement::SetVariable(SetVariableStatement {
8273 local: modifier == Some(LOCAL),
8274 variable,
8275 to,
8276 }))
8277 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8278 Ok(Statement::SetTransaction(SetTransactionStatement {
8280 local: true,
8281 modes: self
8282 .parse_transaction_modes(true)
8283 .map_parser_err(StatementKind::SetTransaction)?,
8284 }))
8285 } else if modifier == Some(SESSION)
8286 && variable.as_str().parse() == Ok(CHARACTERISTICS)
8287 && self.parse_keywords(&[AS, TRANSACTION])
8288 {
8289 Ok(Statement::SetTransaction(SetTransactionStatement {
8291 local: false,
8292 modes: self
8293 .parse_transaction_modes(true)
8294 .map_parser_err(StatementKind::SetTransaction)?,
8295 }))
8296 } else {
8297 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8298 .map_no_statement_parser_err()
8299 }
8300 }
8301
8302 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8303 if self.parse_keyword(DEFAULT) {
8304 Ok(SetVariableTo::Default)
8305 } else {
8306 let to = self.parse_set_variable_value()?;
8307 Ok(SetVariableTo::Values(vec![to]))
8308 }
8309 }
8310
8311 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8312 if self.parse_keyword(DEFAULT) {
8313 Ok(SetVariableTo::Default)
8314 } else {
8315 Ok(SetVariableTo::Values(
8316 self.parse_comma_separated(Parser::parse_set_variable_value)?,
8317 ))
8318 }
8319 }
8320
8321 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8322 if let Some(value) = self.maybe_parse(Parser::parse_value) {
8323 Ok(SetVariableValue::Literal(value))
8324 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8325 Ok(SetVariableValue::Ident(ident))
8326 } else {
8327 self.expected(self.peek_pos(), "variable value", self.peek_token())
8328 }
8329 }
8330
8331 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8332 let mut variable = self.parse_identifier()?;
8333 if variable.as_str().parse() == Ok(SCHEMA) {
8334 variable = ident!("search_path");
8335 }
8336 Ok(Statement::ResetVariable(ResetVariableStatement {
8337 variable,
8338 }))
8339 }
8340
8341 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8342 let redacted = self.parse_keyword(REDACTED);
8343 if redacted && !self.peek_keyword(CREATE) {
8344 return parser_err!(
8345 self,
8346 self.peek_pos(),
8347 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8348 );
8349 }
8350 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8351 self.parse_show_columns()
8352 } else if self.parse_keyword(OBJECTS) {
8353 let from = if self.parse_keywords(&[FROM]) {
8354 Some(self.parse_schema_name()?)
8355 } else {
8356 None
8357 };
8358 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8359 object_type: ShowObjectType::Object,
8360 from,
8361 filter: self.parse_show_statement_filter()?,
8362 }))
8363 } else if let Some(object_type) = self.parse_plural_object_type() {
8364 let from = if object_type.lives_in_schema() {
8365 if self.parse_keywords(&[FROM]) {
8366 Some(self.parse_schema_name()?)
8367 } else {
8368 None
8369 }
8370 } else {
8371 None
8372 };
8373
8374 let show_object_type = match object_type {
8375 ObjectType::Database => ShowObjectType::Database,
8376 ObjectType::Schema => {
8377 let from = if self.parse_keyword(FROM) {
8378 Some(self.parse_database_name()?)
8379 } else {
8380 None
8381 };
8382 ShowObjectType::Schema { from }
8383 }
8384 ObjectType::Table => {
8385 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8386 Some(self.parse_raw_name()?)
8387 } else {
8388 None
8389 };
8390 ShowObjectType::Table { on_source }
8391 }
8392 ObjectType::View => ShowObjectType::View,
8393 ObjectType::Source => {
8394 let in_cluster = self.parse_optional_in_cluster()?;
8395 ShowObjectType::Source { in_cluster }
8396 }
8397 ObjectType::Subsource => {
8398 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8399 Some(self.parse_raw_name()?)
8400 } else {
8401 None
8402 };
8403
8404 if from.is_some() && on_source.is_some() {
8405 return parser_err!(
8406 self,
8407 self.peek_prev_pos(),
8408 "Cannot specify both FROM and ON"
8409 );
8410 }
8411
8412 ShowObjectType::Subsource { on_source }
8413 }
8414 ObjectType::Sink => {
8415 let in_cluster = self.parse_optional_in_cluster()?;
8416 ShowObjectType::Sink { in_cluster }
8417 }
8418 ObjectType::MetricSink => {
8419 let in_cluster = self.parse_optional_in_cluster()?;
8420 ShowObjectType::MetricSink { in_cluster }
8421 }
8422 ObjectType::Type => ShowObjectType::Type,
8423 ObjectType::Role => ShowObjectType::Role,
8424 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8425 ObjectType::Secret => ShowObjectType::Secret,
8426 ObjectType::Connection => ShowObjectType::Connection,
8427 ObjectType::Cluster => ShowObjectType::Cluster,
8428 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8429 ObjectType::MaterializedView => {
8430 let in_cluster = self.parse_optional_in_cluster()?;
8431 ShowObjectType::MaterializedView { in_cluster }
8432 }
8433 ObjectType::Index => {
8434 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8435 Some(self.parse_raw_name()?)
8436 } else {
8437 None
8438 };
8439
8440 if from.is_some() && on_object.is_some() {
8441 return parser_err!(
8442 self,
8443 self.peek_prev_pos(),
8444 "Cannot specify both FROM and ON"
8445 );
8446 }
8447
8448 let in_cluster = self.parse_optional_in_cluster()?;
8449 ShowObjectType::Index {
8450 in_cluster,
8451 on_object,
8452 }
8453 }
8454 ObjectType::Func => {
8455 return parser_err!(
8456 self,
8457 self.peek_prev_pos(),
8458 format!("Unsupported SHOW on {object_type}")
8459 );
8460 }
8461 };
8462 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8463 object_type: show_object_type,
8464 from,
8465 filter: self.parse_show_statement_filter()?,
8466 }))
8467 } else if self.parse_keyword(CLUSTER) {
8468 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8469 variable: ident!("cluster"),
8470 }))
8471 } else if self.parse_keyword(PRIVILEGES) {
8472 self.parse_show_privileges()
8473 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8474 self.parse_show_default_privileges()
8475 } else if self.parse_keyword(ROLE) {
8476 self.expect_keyword(MEMBERSHIP)?;
8477 let role = if self.parse_keyword(FOR) {
8478 Some(self.parse_identifier()?)
8479 } else {
8480 None
8481 };
8482 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8483 object_type: ShowObjectType::RoleMembership { role },
8484 from: None,
8485 filter: self.parse_show_statement_filter()?,
8486 }))
8487 } else if self.parse_keywords(&[CREATE, VIEW]) {
8488 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8489 view_name: self.parse_raw_name()?,
8490 redacted,
8491 }))
8492 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8493 Ok(ShowStatement::ShowCreateMaterializedView(
8494 ShowCreateMaterializedViewStatement {
8495 materialized_view_name: self.parse_raw_name()?,
8496 redacted,
8497 },
8498 ))
8499 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8500 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8501 source_name: self.parse_raw_name()?,
8502 redacted,
8503 }))
8504 } else if self.parse_keywords(&[CREATE, TABLE]) {
8505 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8506 table_name: self.parse_raw_name()?,
8507 redacted,
8508 }))
8509 } else if self.parse_keywords(&[CREATE, SINK]) {
8510 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8511 sink_name: self.parse_raw_name()?,
8512 redacted,
8513 }))
8514 } else if self.parse_keywords(&[CREATE, METRIC, SINK]) {
8515 Ok(ShowStatement::ShowCreateMetricSink(
8516 ShowCreateMetricSinkStatement {
8517 metric_sink_name: self.parse_raw_name()?,
8518 redacted,
8519 },
8520 ))
8521 } else if self.parse_keywords(&[CREATE, INDEX]) {
8522 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8523 index_name: self.parse_raw_name()?,
8524 redacted,
8525 }))
8526 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8527 Ok(ShowStatement::ShowCreateConnection(
8528 ShowCreateConnectionStatement {
8529 connection_name: self.parse_raw_name()?,
8530 redacted,
8531 },
8532 ))
8533 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8534 if redacted {
8535 return parser_err!(
8536 self,
8537 self.peek_prev_pos(),
8538 "SHOW REDACTED CREATE CLUSTER is not supported"
8539 );
8540 }
8541 Ok(ShowStatement::ShowCreateCluster(
8542 ShowCreateClusterStatement {
8543 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8544 },
8545 ))
8546 } else if self.parse_keywords(&[CREATE, TYPE]) {
8547 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8548 type_name: self.parse_data_type()?,
8549 redacted,
8550 }))
8551 } else {
8552 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8553 ident!("transaction_isolation")
8554 } else if self.parse_keywords(&[TIME, ZONE]) {
8555 ident!("timezone")
8556 } else {
8557 self.parse_identifier()?
8558 };
8559 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8560 variable,
8561 }))
8562 }
8563 }
8564
8565 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8566 self.expect_one_of_keywords(&[FROM, IN])?;
8567 let table_name = self.parse_raw_name()?;
8568 let filter = self.parse_show_statement_filter()?;
8572 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8573 table_name,
8574 filter,
8575 }))
8576 }
8577
8578 fn parse_show_statement_filter(
8579 &mut self,
8580 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8581 if self.parse_keyword(LIKE) {
8582 Ok(Some(ShowStatementFilter::Like(
8583 self.parse_literal_string()?,
8584 )))
8585 } else if self.parse_keyword(WHERE) {
8586 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8587 } else {
8588 Ok(None)
8589 }
8590 }
8591
8592 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8593 let object_type = if self.parse_keyword(ON) {
8594 Some(self.expect_plural_system_object_type_for_privileges()?)
8595 } else {
8596 None
8597 };
8598 let role = if self.parse_keyword(FOR) {
8599 Some(self.parse_identifier()?)
8600 } else {
8601 None
8602 };
8603 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8604 object_type: ShowObjectType::Privileges { object_type, role },
8605 from: None,
8606 filter: self.parse_show_statement_filter()?,
8607 }))
8608 }
8609
8610 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8611 let object_type = if self.parse_keyword(ON) {
8612 Some(self.expect_plural_object_type_for_privileges()?)
8613 } else {
8614 None
8615 };
8616 let role = if self.parse_keyword(FOR) {
8617 Some(self.parse_identifier()?)
8618 } else {
8619 None
8620 };
8621 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8622 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8623 from: None,
8624 filter: self.parse_show_statement_filter()?,
8625 }))
8626 }
8627
8628 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8629 self.expect_keyword(SHARD)?;
8630 let id = self.parse_literal_string()?;
8631 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8632 }
8633
8634 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8635 let relation = self.parse_table_factor()?;
8636
8637 let mut joins = vec![];
8641 loop {
8642 let join = if self.parse_keyword(CROSS) {
8643 self.expect_keyword(JOIN)?;
8644 Join {
8645 relation: self.parse_table_factor()?,
8646 join_operator: JoinOperator::CrossJoin,
8647 }
8648 } else {
8649 let natural = self.parse_keyword(NATURAL);
8650 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8651 Some(kw)
8652 } else {
8653 None
8654 };
8655
8656 let join_operator_type = match peek_keyword {
8657 Some(INNER) | Some(JOIN) => {
8658 let _ = self.parse_keyword(INNER);
8659 self.expect_keyword(JOIN)?;
8660 JoinOperator::Inner
8661 }
8662 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8663 let _ = self.next_token();
8664 let _ = self.parse_keyword(OUTER);
8665 self.expect_keyword(JOIN)?;
8666 match kw {
8667 LEFT => JoinOperator::LeftOuter,
8668 RIGHT => JoinOperator::RightOuter,
8669 FULL => JoinOperator::FullOuter,
8670 _ => unreachable!(),
8671 }
8672 }
8673 Some(OUTER) => {
8674 return self.expected(
8675 self.peek_pos(),
8676 "LEFT, RIGHT, or FULL",
8677 self.peek_token(),
8678 );
8679 }
8680 None if natural => {
8681 return self.expected(
8682 self.peek_pos(),
8683 "a join type after NATURAL",
8684 self.peek_token(),
8685 );
8686 }
8687 _ => break,
8688 };
8689 let relation = self.parse_table_factor()?;
8690 let join_constraint = self.parse_join_constraint(natural)?;
8691 Join {
8692 relation,
8693 join_operator: join_operator_type(join_constraint),
8694 }
8695 };
8696 joins.push(join);
8697 }
8698 Ok(TableWithJoins { relation, joins })
8699 }
8700
8701 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8703 self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8710 }
8711
8712 fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8713 if self.parse_keyword(LATERAL) {
8714 if self.consume_token(&Token::LParen) {
8716 return self.parse_derived_table_factor(Lateral);
8717 } else if self.parse_keywords(&[ROWS, FROM]) {
8718 return self.parse_rows_from();
8719 } else {
8720 let name = self.parse_raw_name()?;
8721 self.expect_token(&Token::LParen)?;
8722 let args = self.parse_optional_args(false)?;
8723 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8724 return Ok(TableFactor::Function {
8725 function: Function {
8726 name,
8727 args,
8728 filter: None,
8729 over: None,
8730 distinct: false,
8731 },
8732 alias,
8733 with_ordinality,
8734 });
8735 }
8736 }
8737
8738 if self.consume_token(&Token::LParen) {
8739 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8761
8762 let table_and_joins = self.parse_table_and_joins()?;
8773 match table_and_joins.relation {
8774 TableFactor::NestedJoin { .. } => (),
8775 _ => {
8776 if table_and_joins.joins.is_empty() {
8777 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8780 }
8781 }
8782 }
8783 self.expect_token(&Token::RParen)?;
8784 Ok(TableFactor::NestedJoin {
8785 join: Box::new(table_and_joins),
8786 alias: self.parse_optional_table_alias()?,
8787 })
8788 } else if self.parse_keywords(&[ROWS, FROM]) {
8789 Ok(self.parse_rows_from()?)
8790 } else {
8791 let name = self.parse_raw_name()?;
8792 if self.consume_token(&Token::LParen) {
8793 let args = self.parse_optional_args(false)?;
8794 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8795 Ok(TableFactor::Function {
8796 function: Function {
8797 name,
8798 args,
8799 filter: None,
8800 over: None,
8801 distinct: false,
8802 },
8803 alias,
8804 with_ordinality,
8805 })
8806 } else {
8807 Ok(TableFactor::Table {
8808 name,
8809 alias: self.parse_optional_table_alias()?,
8810 })
8811 }
8812 }
8813 }
8814
8815 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8816 self.expect_token(&Token::LParen)?;
8817 let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8818 self.expect_token(&Token::RParen)?;
8819 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8820 Ok(TableFactor::RowsFrom {
8821 functions,
8822 alias,
8823 with_ordinality,
8824 })
8825 }
8826
8827 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8834 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8835 let alias = self.parse_optional_table_alias()?;
8836 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8837 if with_ordinality_1 && with_ordinality_2 {
8838 return parser_err!(
8839 self,
8840 self.peek_prev_pos(),
8841 "WITH ORDINALITY specified twice"
8842 );
8843 }
8844 Ok((with_ordinality_1 || with_ordinality_2, alias))
8845 }
8846
8847 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8848 let name = self.parse_raw_name()?;
8849 self.parse_function(name)
8850 }
8851
8852 fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8857 let name = self.parse_raw_name()?;
8858 self.expect_token(&Token::LParen)?;
8859 let args = self.parse_optional_args(false)?;
8860 Ok(Function {
8861 name,
8862 args,
8863 filter: None,
8864 over: None,
8865 distinct: false,
8866 })
8867 }
8868
8869 fn parse_derived_table_factor(
8870 &mut self,
8871 lateral: IsLateral,
8872 ) -> Result<TableFactor<Raw>, ParserError> {
8873 let subquery = Box::new(self.parse_query()?);
8874 self.expect_token(&Token::RParen)?;
8875 let alias = self.parse_optional_table_alias()?;
8876 Ok(TableFactor::Derived {
8877 lateral: match lateral {
8878 Lateral => true,
8879 NotLateral => false,
8880 },
8881 subquery,
8882 alias,
8883 })
8884 }
8885
8886 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8887 if natural {
8888 Ok(JoinConstraint::Natural)
8889 } else if self.parse_keyword(ON) {
8890 let constraint = self.parse_expr()?;
8891 Ok(JoinConstraint::On(constraint))
8892 } else if self.parse_keyword(USING) {
8893 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8894 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8895
8896 Ok(JoinConstraint::Using { columns, alias })
8897 } else {
8898 self.expected(
8899 self.peek_pos(),
8900 "ON, or USING after JOIN",
8901 self.peek_token(),
8902 )
8903 }
8904 }
8905
8906 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8908 self.expect_keyword(INTO)?;
8909 let table_name = self.parse_raw_name()?;
8910 let columns = self.parse_parenthesized_column_list(Optional)?;
8911 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8912 InsertSource::DefaultValues
8913 } else {
8914 InsertSource::Query(self.parse_query()?)
8915 };
8916 let returning = self.parse_returning()?;
8917 Ok(Statement::Insert(InsertStatement {
8918 table_name,
8919 columns,
8920 source,
8921 returning,
8922 }))
8923 }
8924
8925 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8926 Ok(if self.parse_keyword(RETURNING) {
8927 self.parse_comma_separated(Parser::parse_select_item)?
8928 } else {
8929 Vec::new()
8930 })
8931 }
8932
8933 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8934 let table_name = RawItemName::Name(self.parse_item_name()?);
8935 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8937 let alias = alias.map(|name| TableAlias {
8938 name,
8939 columns: Vec::new(),
8940 strict: false,
8941 });
8942
8943 self.expect_keyword(SET)?;
8944 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8945 let selection = if self.parse_keyword(WHERE) {
8946 Some(self.parse_expr()?)
8947 } else {
8948 None
8949 };
8950
8951 Ok(Statement::Update(UpdateStatement {
8952 table_name,
8953 alias,
8954 assignments,
8955 selection,
8956 }))
8957 }
8958
8959 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8961 let id = self.parse_identifier()?;
8962 self.expect_token(&Token::Eq)?;
8963 let value = self.parse_expr()?;
8964 Ok(Assignment { id, value })
8965 }
8966
8967 fn parse_optional_args(
8968 &mut self,
8969 allow_order_by: bool,
8970 ) -> Result<FunctionArgs<Raw>, ParserError> {
8971 if self.consume_token(&Token::Star) {
8972 self.expect_token(&Token::RParen)?;
8973 Ok(FunctionArgs::Star)
8974 } else if self.consume_token(&Token::RParen) {
8975 Ok(FunctionArgs::args(vec![]))
8976 } else {
8977 let args = self.parse_comma_separated(Parser::parse_expr)?;
8978 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8982 self.parse_comma_separated(Parser::parse_order_by_expr)?
8983 } else {
8984 vec![]
8985 };
8986 self.expect_token(&Token::RParen)?;
8987 Ok(FunctionArgs::Args { args, order_by })
8988 }
8989 }
8990
8991 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8993 if self.parse_keyword(AS) {
8994 self.expect_keyword(OF)?;
8995 if self.parse_keywords(&[AT, LEAST]) {
8996 match self.parse_expr() {
8997 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8998 Err(e) => self.expected(
8999 e.pos,
9000 "a timestamp value after 'AS OF AT LEAST'",
9001 self.peek_token(),
9002 ),
9003 }
9004 } else {
9005 match self.parse_expr() {
9006 Ok(expr) => Ok(Some(AsOf::At(expr))),
9007 Err(e) => {
9008 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
9009 }
9010 }
9011 }
9012 } else {
9013 Ok(None)
9014 }
9015 }
9016
9017 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
9019 if self.parse_keyword(UP) {
9020 self.expect_keyword(TO)?;
9021 self.parse_expr().map(Some)
9022 } else {
9023 Ok(None)
9024 }
9025 }
9026
9027 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
9032 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
9033 let value = parser.parse_value().ok()?;
9034 let Value::Number(s) = value else { return None };
9035 s.parse().ok()
9036 }
9037
9038 if self.parse_keywords(&[AS, OF]) {
9039 match try_parse_u64(self) {
9040 Some(time) => Ok(Some(time)),
9041 None => {
9042 self.prev_token();
9043 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
9044 }
9045 }
9046 } else {
9047 Ok(None)
9048 }
9049 }
9050
9051 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
9053 if self.consume_token(&Token::Star) {
9054 return Ok(SelectItem::Wildcard);
9055 }
9056 Ok(SelectItem::Expr {
9057 expr: self.parse_expr()?,
9058 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
9059 })
9060 }
9061
9062 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
9065 let expr = self.parse_expr()?;
9066
9067 let asc = if self.parse_keyword(ASC) {
9068 Some(true)
9069 } else if self.parse_keyword(DESC) {
9070 Some(false)
9071 } else {
9072 None
9073 };
9074
9075 let nulls_last = if self.parse_keyword(NULLS) {
9076 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
9077 Some(last)
9078 } else {
9079 None
9080 };
9081
9082 Ok(OrderByExpr {
9083 expr,
9084 asc,
9085 nulls_last,
9086 })
9087 }
9088
9089 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
9090 let values = self.parse_comma_separated(|parser| {
9091 parser.expect_token(&Token::LParen)?;
9092 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
9093 parser.expect_token(&Token::RParen)?;
9094 Ok(exprs)
9095 })?;
9096 Ok(Values(values))
9097 }
9098
9099 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
9100 self.expect_keyword(TRANSACTION)?;
9101 Ok(Statement::StartTransaction(StartTransactionStatement {
9102 modes: self.parse_transaction_modes(false)?,
9103 }))
9104 }
9105
9106 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
9107 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9108 Ok(Statement::StartTransaction(StartTransactionStatement {
9109 modes: self.parse_transaction_modes(false)?,
9110 }))
9111 }
9112
9113 fn parse_transaction_modes(
9114 &mut self,
9115 mut required: bool,
9116 ) -> Result<Vec<TransactionMode>, ParserError> {
9117 let mut modes = vec![];
9118 loop {
9119 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
9120 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
9121 TransactionIsolationLevel::ReadUncommitted
9122 } else if self.parse_keywords(&[READ, COMMITTED]) {
9123 TransactionIsolationLevel::ReadCommitted
9124 } else if self.parse_keywords(&[REPEATABLE, READ]) {
9125 TransactionIsolationLevel::RepeatableRead
9126 } else if self.parse_keyword(SERIALIZABLE) {
9127 TransactionIsolationLevel::Serializable
9128 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
9129 TransactionIsolationLevel::StrongSessionSerializable
9130 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
9131 TransactionIsolationLevel::StrictSerializable
9132 } else {
9133 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
9134 };
9135 TransactionMode::IsolationLevel(iso_level)
9136 } else if self.parse_keywords(&[READ, ONLY]) {
9137 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
9138 } else if self.parse_keywords(&[READ, WRITE]) {
9139 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
9140 } else if required {
9141 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
9142 } else {
9143 break;
9144 };
9145 modes.push(mode);
9146 required = self.consume_token(&Token::Comma);
9151 }
9152 Ok(modes)
9153 }
9154
9155 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
9156 Ok(Statement::Commit(CommitStatement {
9157 chain: self.parse_commit_rollback_chain()?,
9158 }))
9159 }
9160
9161 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9162 Ok(Statement::Rollback(RollbackStatement {
9163 chain: self.parse_commit_rollback_chain()?,
9164 }))
9165 }
9166
9167 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9168 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9169 if self.parse_keyword(AND) {
9170 let chain = !self.parse_keyword(NO);
9171 self.expect_keyword(CHAIN)?;
9172 Ok(chain)
9173 } else {
9174 Ok(false)
9175 }
9176 }
9177
9178 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9179 parser_err!(
9180 self,
9181 self.peek_prev_pos(),
9182 "TAIL has been renamed to SUBSCRIBE"
9183 )
9184 }
9185
9186 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9187 let _ = self.parse_keyword(TO);
9188 let relation = if self.consume_token(&Token::LParen) {
9189 let query = self.parse_query()?;
9190 self.expect_token(&Token::RParen)?;
9191 SubscribeRelation::Query(query)
9192 } else {
9193 SubscribeRelation::Name(self.parse_raw_name()?)
9194 };
9195 let mut output = self.parse_subscribe_output()?;
9196 let options = if self.parse_keyword(WITH) {
9197 self.expect_token(&Token::LParen)?;
9198 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9199 self.expect_token(&Token::RParen)?;
9200 options
9201 } else {
9202 vec![]
9203 };
9204 let as_of = self.parse_optional_as_of()?;
9205 let up_to = self.parse_optional_up_to()?;
9206 if output == SubscribeOutput::Diffs {
9213 output = self.parse_subscribe_output()?;
9214 }
9215 Ok(Statement::Subscribe(SubscribeStatement {
9216 relation,
9217 options,
9218 as_of,
9219 up_to,
9220 output,
9221 }))
9222 }
9223
9224 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9225 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9226 PROGRESS => SubscribeOptionName::Progress,
9227 SNAPSHOT => SubscribeOptionName::Snapshot,
9228 _ => unreachable!(),
9229 };
9230 Ok(SubscribeOption {
9231 name,
9232 value: self.parse_optional_option_value()?,
9233 })
9234 }
9235
9236 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9237 if self.parse_keywords(&[ENVELOPE]) {
9238 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9239 self.expect_token(&Token::LParen)?;
9240 self.expect_keyword(KEY)?;
9241 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9242 let output = match keyword {
9243 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9244 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9245 _ => unreachable!("no other keyword allowed"),
9246 };
9247 self.expect_token(&Token::RParen)?;
9248 Ok(output)
9249 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9250 Ok(SubscribeOutput::WithinTimestampOrderBy {
9251 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9252 })
9253 } else {
9254 Ok(SubscribeOutput::Diffs)
9255 }
9256 }
9257
9258 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9261 if self.parse_keyword(TIMESTAMP) {
9262 self.parse_explain_timestamp()
9263 .map_parser_err(StatementKind::ExplainTimestamp)
9264 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9265 self.parse_explain_pushdown()
9266 .map_parser_err(StatementKind::ExplainPushdown)
9267 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9268 self.parse_explain_analyze()
9269 .map_parser_err(StatementKind::ExplainAnalyzeObject)
9270 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9271 self.parse_explain_schema()
9272 .map_parser_err(StatementKind::ExplainSinkSchema)
9273 } else {
9274 self.parse_explain_plan()
9275 .map_parser_err(StatementKind::ExplainPlan)
9276 }
9277 }
9278
9279 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9280 let explainee = if self.parse_keyword(VIEW) {
9281 Explainee::View(self.parse_raw_name()?)
9283 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9284 Explainee::MaterializedView(self.parse_raw_name()?)
9286 } else if self.parse_keyword(INDEX) {
9287 Explainee::Index(self.parse_raw_name()?)
9289 } else if self.parse_keywords(&[REPLAN, VIEW]) {
9290 Explainee::ReplanView(self.parse_raw_name()?)
9292 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9293 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9295 } else if self.parse_keywords(&[REPLAN, INDEX]) {
9296 Explainee::ReplanIndex(self.parse_raw_name()?)
9298 } else {
9299 let broken = self.parse_keyword(BROKEN);
9300
9301 if self.peek_keywords(&[CREATE, VIEW])
9302 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9303 {
9304 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
9307 Statement::CreateView(stmt) => stmt,
9308 _ => panic!("Unexpected statement type return after parsing"),
9309 };
9310
9311 Explainee::CreateView(Box::new(stmt), broken)
9312 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9313 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9314 {
9315 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
9318 Statement::CreateMaterializedView(stmt) => stmt,
9319 _ => panic!("Unexpected statement type return after parsing"),
9320 };
9321
9322 Explainee::CreateMaterializedView(Box::new(stmt), broken)
9323 } else if self.peek_keywords(&[CREATE, INDEX])
9324 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9325 {
9326 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
9329 Statement::CreateIndex(stmt) => stmt,
9330 _ => panic!("Unexpected statement type return after parsing"),
9331 };
9332
9333 Explainee::CreateIndex(Box::new(stmt), broken)
9334 } else if self.peek_keyword(SUBSCRIBE) {
9335 let _ = self.parse_keyword(SUBSCRIBE); let stmt = match self.parse_subscribe()? {
9338 Statement::Subscribe(stmt) => stmt,
9339 _ => panic!("Unexpected statement type return after parsing"),
9340 };
9341 Explainee::Subscribe(Box::new(stmt), broken)
9342 } else {
9343 let query = self.parse_select_statement()?;
9345 Explainee::Select(Box::new(query), broken)
9346 }
9347 };
9348 Ok(explainee)
9349 }
9350
9351 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9354 let start = self.peek_pos();
9355 let (has_stage, stage) = match self.parse_one_of_keywords(&[
9356 RAW,
9357 DECORRELATED,
9358 LOCALLY,
9359 OPTIMIZED,
9360 PHYSICAL,
9361 OPTIMIZER,
9362 PLAN,
9363 ]) {
9364 Some(RAW) => {
9365 self.expect_keyword(PLAN)?;
9366 (true, Some(ExplainStage::RawPlan))
9367 }
9368 Some(DECORRELATED) => {
9369 self.expect_keyword(PLAN)?;
9370 (true, Some(ExplainStage::DecorrelatedPlan))
9371 }
9372 Some(LOCALLY) => {
9373 self.expect_keywords(&[OPTIMIZED, PLAN])?;
9374 (true, Some(ExplainStage::LocalPlan))
9375 }
9376 Some(OPTIMIZED) => {
9377 self.expect_keyword(PLAN)?;
9378 (true, Some(ExplainStage::GlobalPlan))
9379 }
9380 Some(PHYSICAL) => {
9381 self.expect_keyword(PLAN)?;
9382 (true, Some(ExplainStage::PhysicalPlan))
9383 }
9384 Some(OPTIMIZER) => {
9385 self.expect_keyword(TRACE)?;
9386 (true, Some(ExplainStage::Trace))
9387 }
9388 Some(PLAN) => {
9389 if self.parse_keyword(INSIGHTS) {
9390 (true, Some(ExplainStage::PlanInsights))
9391 } else {
9392 (true, None)
9394 }
9395 }
9396 None => {
9397 (false, None)
9399 }
9400 _ => unreachable!(),
9401 };
9402
9403 let with_options = if self.parse_keyword(WITH) {
9404 if self.consume_token(&Token::LParen) {
9405 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9406 self.expect_token(&Token::RParen)?;
9407 options
9408 } else {
9409 self.prev_token(); vec![]
9411 }
9412 } else {
9413 vec![]
9414 };
9415
9416 let format = if self.parse_keyword(AS) {
9417 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9418 Some(TEXT) => Some(ExplainFormat::Text),
9419 Some(JSON) => Some(ExplainFormat::Json),
9420 Some(DOT) => Some(ExplainFormat::Dot),
9421 Some(VERBOSE) => {
9422 self.expect_keyword(TEXT)?;
9423 Some(ExplainFormat::VerboseText)
9424 }
9425 None => return Err(ParserError::new(self.index, "expected a format")),
9426 _ => unreachable!(),
9427 }
9428 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9429 Some(ExplainFormat::VerboseText)
9431 } else {
9432 None
9433 };
9434
9435 if has_stage {
9436 self.expect_keyword(FOR)?;
9437 }
9438
9439 let explainee = self.parse_explainee()?;
9440
9441 if matches!((explainee.is_view(), &stage), (true, None)) {
9444 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9445 return Err(self.error(start, msg));
9446 }
9447
9448 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9449 stage,
9450 with_options,
9451 format,
9452 explainee,
9453 }))
9454 }
9455
9456 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9457 Ok(ExplainPlanOption {
9458 name: self.parse_explain_plan_option_name()?,
9459 value: self.parse_optional_option_value()?,
9460 })
9461 }
9462
9463 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9466 self.expect_keyword(FOR)?;
9467
9468 let explainee = self.parse_explainee()?;
9469
9470 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9471 explainee,
9472 }))
9473 }
9474
9475 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9476 if self.parse_keyword(CLUSTER) {
9478 let properties = self.parse_explain_analyze_computation_properties()?;
9479 let as_sql = self.parse_keywords(&[AS, SQL]);
9480 return Ok(Statement::ExplainAnalyzeCluster(
9481 ExplainAnalyzeClusterStatement { properties, as_sql },
9482 ));
9483 }
9484
9485 let properties = if self.parse_keyword(HINTS) {
9488 ExplainAnalyzeProperty::Hints
9489 } else {
9490 ExplainAnalyzeProperty::Computation(
9491 self.parse_explain_analyze_computation_properties()?,
9492 )
9493 };
9494
9495 self.expect_keyword(FOR)?;
9496
9497 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9498 INDEX => Explainee::Index(self.parse_raw_name()?),
9499 MATERIALIZED => {
9500 self.expect_keyword(VIEW)?;
9501 Explainee::MaterializedView(self.parse_raw_name()?)
9502 }
9503 _ => unreachable!(),
9504 };
9505
9506 let as_sql = self.parse_keywords(&[AS, SQL]);
9507
9508 Ok(Statement::ExplainAnalyzeObject(
9509 ExplainAnalyzeObjectStatement {
9510 properties,
9511 explainee,
9512 as_sql,
9513 },
9514 ))
9515 }
9516
9517 fn parse_explain_analyze_computation_properties(
9518 &mut self,
9519 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9520 let mut computation_properties = vec![CPU, MEMORY];
9521 let (kw, property) =
9522 self.parse_explain_analyze_computation_property(&computation_properties)?;
9523 let mut properties = vec![property];
9524 computation_properties.retain(|p| p != &kw);
9525
9526 while self.consume_token(&Token::Comma) {
9527 let (kw, property) =
9528 self.parse_explain_analyze_computation_property(&computation_properties)?;
9529 computation_properties.retain(|p| p != &kw);
9530 properties.push(property);
9531 }
9532
9533 let skew = self.parse_keywords(&[WITH, SKEW]);
9534
9535 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9536 }
9537
9538 fn parse_explain_analyze_computation_property(
9539 &mut self,
9540 properties: &[Keyword],
9541 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9542 if properties.is_empty() {
9543 return Err(ParserError::new(
9544 self.peek_pos(),
9545 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9546 ));
9547 }
9548
9549 match self.expect_one_of_keywords(properties)? {
9550 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9551 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9552 _ => unreachable!(),
9553 }
9554 }
9555
9556 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9559 let format = if self.parse_keyword(AS) {
9560 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9561 Some(TEXT) => Some(ExplainFormat::Text),
9562 Some(JSON) => Some(ExplainFormat::Json),
9563 Some(DOT) => Some(ExplainFormat::Dot),
9564 None => return Err(ParserError::new(self.index, "expected a format")),
9565 _ => unreachable!(),
9566 }
9567 } else {
9568 None
9569 };
9570
9571 self.expect_keyword(FOR)?;
9572
9573 let query = self.parse_select_statement()?;
9574
9575 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9576 format,
9577 select: query,
9578 }))
9579 }
9580 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9583 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9584 KEY => ExplainSinkSchemaFor::Key,
9585 VALUE => ExplainSinkSchemaFor::Value,
9586 _ => unreachable!(),
9587 };
9588
9589 self.expect_keyword(SCHEMA)?;
9590
9591 let format = if self.parse_keyword(AS) {
9592 self.expect_keyword(JSON)?;
9594 Some(ExplainFormat::Json)
9595 } else {
9596 None
9597 };
9598
9599 self.expect_keywords(&[FOR, CREATE])?;
9600
9601 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9602 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9603 schema_for,
9604 format,
9605 statement,
9606 }))
9607 } else {
9608 unreachable!("only create sink can be returned here");
9609 }
9610 }
9611
9612 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9615 let name = self
9616 .parse_identifier()
9617 .map_parser_err(StatementKind::Declare)?;
9618 self.expect_keyword(CURSOR)
9619 .map_parser_err(StatementKind::Declare)?;
9620 if self.parse_keyword(WITH) {
9621 let err = parser_err!(
9622 self,
9623 self.peek_prev_pos(),
9624 "WITH HOLD is unsupported for cursors"
9625 )
9626 .map_parser_err(StatementKind::Declare);
9627 self.expect_keyword(HOLD)
9628 .map_parser_err(StatementKind::Declare)?;
9629 return err;
9630 }
9631 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9633 self.expect_keyword(FOR)
9634 .map_parser_err(StatementKind::Declare)?;
9635 let StatementParseResult { ast, sql } = self.parse_statement()?;
9636 Ok(Statement::Declare(DeclareStatement {
9637 name,
9638 stmt: Box::new(ast),
9639 sql: sql.to_string(),
9640 }))
9641 }
9642
9643 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9646 let name = self.parse_identifier()?;
9647 Ok(Statement::Close(CloseStatement { name }))
9648 }
9649
9650 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9653 let name = self
9654 .parse_identifier()
9655 .map_parser_err(StatementKind::Prepare)?;
9656 self.expect_keyword(AS)
9657 .map_parser_err(StatementKind::Prepare)?;
9658 let pos = self.peek_pos();
9659 let StatementParseResult { ast, sql } = self.parse_statement()?;
9661 if !matches!(
9662 ast,
9663 Statement::Select(_)
9664 | Statement::Insert(_)
9665 | Statement::Delete(_)
9666 | Statement::Update(_)
9667 | Statement::Fetch(_),
9668 ) {
9669 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9670 }
9671 Ok(Statement::Prepare(PrepareStatement {
9672 name,
9673 stmt: Box::new(ast),
9674 sql: sql.to_string(),
9675 }))
9676 }
9677
9678 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9681 if self.parse_keywords(&[UNIT, TEST]) {
9683 return self.parse_execute_unit_test();
9684 }
9685
9686 let name = self.parse_identifier()?;
9688 let params = if self.consume_token(&Token::LParen) {
9689 let params = self.parse_comma_separated(Parser::parse_expr)?;
9690 self.expect_token(&Token::RParen)?;
9691 params
9692 } else {
9693 Vec::new()
9694 };
9695 Ok(Statement::Execute(ExecuteStatement { name, params }))
9696 }
9697
9698 fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9701 let name = self.parse_identifier()?;
9703
9704 self.expect_keyword(FOR)?;
9706
9707 let target = self.parse_raw_name()?;
9709
9710 let at_time = if self.parse_keywords(&[AT, TIME]) {
9712 Some(self.parse_expr()?)
9713 } else {
9714 None
9715 };
9716
9717 let mut mocks = Vec::new();
9721 if self.parse_keyword(MOCK) {
9722 mocks.push(self.parse_mock_view_def()?);
9723 while self.consume_token(&Token::Comma) {
9724 self.expect_keyword(MOCK)?;
9725 mocks.push(self.parse_mock_view_def()?);
9726 }
9727 }
9728
9729 self.expect_keyword(EXPECTED)?;
9730
9731 self.expect_token(&Token::LParen)?;
9732 let expected_columns = self.parse_comma_separated(|parser| {
9733 Ok(ColumnDef {
9734 name: parser.parse_identifier()?,
9735 data_type: parser.parse_data_type()?,
9736 collation: None,
9737 options: vec![],
9738 })
9739 })?;
9740 self.expect_token(&Token::RParen)?;
9741
9742 self.expect_keyword(AS)?;
9743 self.expect_token(&Token::LParen)?;
9744 let expected_query = self.parse_query()?;
9745 self.expect_token(&Token::RParen)?;
9746
9747 let expected = ExpectedResultDef {
9748 columns: expected_columns,
9749 query: expected_query,
9750 };
9751
9752 Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9753 name,
9754 target,
9755 at_time,
9756 mocks,
9757 expected,
9758 }))
9759 }
9760
9761 fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9764 let name = self.parse_raw_name()?;
9765
9766 self.expect_token(&Token::LParen)?;
9767 let columns = self.parse_comma_separated(|parser| {
9768 Ok(ColumnDef {
9769 name: parser.parse_identifier()?,
9770 data_type: parser.parse_data_type()?,
9771 collation: None,
9772 options: vec![],
9773 })
9774 })?;
9775 self.expect_token(&Token::RParen)?;
9776
9777 self.expect_keyword(AS)?;
9778 self.expect_token(&Token::LParen)?;
9779 let query = self.parse_query()?;
9780 self.expect_token(&Token::RParen)?;
9781
9782 Ok(MockViewDef {
9783 name,
9784 columns,
9785 query,
9786 })
9787 }
9788
9789 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9792 let _ = self.parse_keyword(PREPARE);
9793 let name = if self.parse_keyword(ALL) {
9794 None
9795 } else {
9796 Some(self.parse_identifier()?)
9797 };
9798 Ok(Statement::Deallocate(DeallocateStatement { name }))
9799 }
9800
9801 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9804 let _ = self.parse_keyword(FORWARD);
9805 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9806 Some(FetchDirection::ForwardCount(count))
9807 } else if self.parse_keyword(ALL) {
9808 Some(FetchDirection::ForwardAll)
9809 } else {
9810 None
9811 };
9812 let _ = self.parse_keyword(FROM);
9813 let name = self.parse_identifier()?;
9814 let options = if self.parse_keyword(WITH) {
9815 self.expect_token(&Token::LParen)?;
9816 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9817 self.expect_token(&Token::RParen)?;
9818 options
9819 } else {
9820 vec![]
9821 };
9822 Ok(Statement::Fetch(FetchStatement {
9823 name,
9824 count,
9825 options,
9826 }))
9827 }
9828
9829 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9830 self.expect_keyword(TIMEOUT)?;
9831 Ok(FetchOption {
9832 name: FetchOptionName::Timeout,
9833 value: self.parse_optional_option_value()?,
9834 })
9835 }
9836
9837 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9840 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9841 Some(DEBUG) => NoticeSeverity::Debug,
9842 Some(INFO) => NoticeSeverity::Info,
9843 Some(LOG) => NoticeSeverity::Log,
9844 Some(NOTICE) => NoticeSeverity::Notice,
9845 Some(WARNING) => NoticeSeverity::Warning,
9846 Some(_) => unreachable!(),
9847 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9848 };
9849
9850 Ok(Statement::Raise(RaiseStatement { severity }))
9851 }
9852
9853 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9856 match self.parse_privilege_specification() {
9857 Some(privileges) => self
9858 .parse_grant_privilege(privileges)
9859 .map_parser_err(StatementKind::GrantPrivileges),
9860 None => self
9861 .parse_grant_role()
9862 .map_parser_err(StatementKind::GrantRole),
9863 }
9864 }
9865
9866 fn parse_grant_privilege(
9869 &mut self,
9870 privileges: PrivilegeSpecification,
9871 ) -> Result<Statement<Raw>, ParserError> {
9872 self.expect_keyword(ON)?;
9873 let target = self.expect_grant_target_specification("GRANT")?;
9874 self.expect_keyword(TO)?;
9875 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9876 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9877 privileges,
9878 target,
9879 roles,
9880 }))
9881 }
9882
9883 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9886 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9887 self.expect_keyword(TO)?;
9888 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9889 Ok(Statement::GrantRole(GrantRoleStatement {
9890 role_names,
9891 member_names,
9892 }))
9893 }
9894
9895 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9898 match self.parse_privilege_specification() {
9899 Some(privileges) => self
9900 .parse_revoke_privilege(privileges)
9901 .map_parser_err(StatementKind::RevokePrivileges),
9902 None => self
9903 .parse_revoke_role()
9904 .map_parser_err(StatementKind::RevokeRole),
9905 }
9906 }
9907
9908 fn parse_revoke_privilege(
9911 &mut self,
9912 privileges: PrivilegeSpecification,
9913 ) -> Result<Statement<Raw>, ParserError> {
9914 self.expect_keyword(ON)?;
9915 let target = self.expect_grant_target_specification("REVOKE")?;
9916 self.expect_keyword(FROM)?;
9917 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9918 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9919 privileges,
9920 target,
9921 roles,
9922 }))
9923 }
9924
9925 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9928 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9929 self.expect_keyword(FROM)?;
9930 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9931 Ok(Statement::RevokeRole(RevokeRoleStatement {
9932 role_names,
9933 member_names,
9934 }))
9935 }
9936
9937 fn expect_grant_target_specification(
9938 &mut self,
9939 statement_type: &str,
9940 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9941 if self.parse_keyword(SYSTEM) {
9942 return Ok(GrantTargetSpecification::System);
9943 }
9944
9945 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9946 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9947 let object_spec_inner = if self.parse_keyword(IN) {
9948 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9949 return parser_err!(
9950 self,
9951 self.peek_prev_pos(),
9952 format!("IN invalid for {object_type}S")
9953 );
9954 }
9955 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9956 DATABASE => GrantTargetSpecificationInner::All(
9957 GrantTargetAllSpecification::AllDatabases {
9958 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9959 },
9960 ),
9961 SCHEMA => {
9962 if object_type == ObjectType::Schema {
9963 self.prev_token();
9964 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9965 }
9966 GrantTargetSpecificationInner::All(
9967 GrantTargetAllSpecification::AllSchemas {
9968 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9969 },
9970 )
9971 }
9972 _ => unreachable!(),
9973 }
9974 } else {
9975 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9976 };
9977 (object_type, object_spec_inner)
9978 } else {
9979 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9980 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9981 names: self
9982 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9983 };
9984 (object_type, object_spec_inner)
9985 };
9986
9987 Ok(GrantTargetSpecification::Object {
9988 object_type,
9989 object_spec_inner,
9990 })
9991 }
9992
9993 fn expect_grant_revoke_object_type(
9996 &mut self,
9997 statement_type: &str,
9998 ) -> Result<ObjectType, ParserError> {
9999 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
10001 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
10002 }
10003
10004 fn expect_grant_revoke_plural_object_type(
10007 &mut self,
10008 statement_type: &str,
10009 ) -> Result<ObjectType, ParserError> {
10010 let object_type = self.expect_plural_object_type().map_err(|_| {
10011 self.expected::<_, ObjectType>(
10013 self.peek_pos(),
10014 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
10015 self.peek_token(),
10016 )
10017 .unwrap_err()
10018 })?;
10019 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
10020 Ok(object_type)
10021 }
10022
10023 fn expect_grant_revoke_object_type_inner(
10024 &self,
10025 statement_type: &str,
10026 object_type: ObjectType,
10027 ) -> Result<ObjectType, ParserError> {
10028 match object_type {
10029 ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
10030 parser_err!(
10031 self,
10032 self.peek_prev_pos(),
10033 format!(
10034 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
10035 )
10036 )
10037 }
10038 ObjectType::Sink
10039 | ObjectType::MetricSink
10040 | ObjectType::Index
10041 | ObjectType::ClusterReplica
10042 | ObjectType::Role
10043 | ObjectType::Func
10044 | ObjectType::Subsource => {
10045 parser_err!(
10046 self,
10047 self.peek_prev_pos(),
10048 format!("Unsupported {statement_type} on {object_type}")
10049 )
10050 }
10051 ObjectType::Table
10052 | ObjectType::Type
10053 | ObjectType::Cluster
10054 | ObjectType::Secret
10055 | ObjectType::Connection
10056 | ObjectType::Database
10057 | ObjectType::Schema
10058 | ObjectType::NetworkPolicy => Ok(object_type),
10059 }
10060 }
10061
10062 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
10064 Ok(
10065 match self.expect_one_of_keywords(&[
10066 TABLE,
10067 VIEW,
10068 MATERIALIZED,
10069 SOURCE,
10070 SINK,
10071 METRIC,
10072 INDEX,
10073 TYPE,
10074 ROLE,
10075 USER,
10076 CLUSTER,
10077 SECRET,
10078 CONNECTION,
10079 DATABASE,
10080 SCHEMA,
10081 FUNCTION,
10082 NETWORK,
10083 ])? {
10084 TABLE => ObjectType::Table,
10085 VIEW => ObjectType::View,
10086 MATERIALIZED => {
10087 if let Err(e) = self.expect_keyword(VIEW) {
10088 self.prev_token();
10089 return Err(e);
10090 }
10091 ObjectType::MaterializedView
10092 }
10093 SOURCE => ObjectType::Source,
10094 SINK => ObjectType::Sink,
10095 METRIC => {
10096 if let Err(e) = self.expect_keyword(SINK) {
10097 self.prev_token();
10098 return Err(e);
10099 }
10100 ObjectType::MetricSink
10101 }
10102 INDEX => ObjectType::Index,
10103 TYPE => ObjectType::Type,
10104 ROLE | USER => ObjectType::Role,
10105 CLUSTER => {
10106 if self.parse_keyword(REPLICA) {
10107 ObjectType::ClusterReplica
10108 } else {
10109 ObjectType::Cluster
10110 }
10111 }
10112 SECRET => ObjectType::Secret,
10113 CONNECTION => ObjectType::Connection,
10114 DATABASE => ObjectType::Database,
10115 SCHEMA => ObjectType::Schema,
10116 FUNCTION => ObjectType::Func,
10117 NETWORK => {
10118 if let Err(e) = self.expect_keyword(POLICY) {
10119 self.prev_token();
10120 return Err(e);
10121 }
10122 ObjectType::NetworkPolicy
10123 }
10124 _ => unreachable!(),
10125 },
10126 )
10127 }
10128
10129 fn parse_object_type(&mut self) -> Option<ObjectType> {
10131 Some(
10132 match self.parse_one_of_keywords(&[
10133 TABLE,
10134 VIEW,
10135 MATERIALIZED,
10136 SOURCE,
10137 SINK,
10138 METRIC,
10139 INDEX,
10140 TYPE,
10141 ROLE,
10142 USER,
10143 CLUSTER,
10144 SECRET,
10145 CONNECTION,
10146 DATABASE,
10147 SCHEMA,
10148 FUNCTION,
10149 NETWORK,
10150 ])? {
10151 TABLE => ObjectType::Table,
10152 VIEW => ObjectType::View,
10153 MATERIALIZED => {
10154 if self.parse_keyword(VIEW) {
10155 ObjectType::MaterializedView
10156 } else {
10157 self.prev_token();
10158 return None;
10159 }
10160 }
10161 SOURCE => ObjectType::Source,
10162 SINK => ObjectType::Sink,
10163 METRIC => {
10164 if self.parse_keyword(SINK) {
10165 ObjectType::MetricSink
10166 } else {
10167 self.prev_token();
10168 return None;
10169 }
10170 }
10171 INDEX => ObjectType::Index,
10172 TYPE => ObjectType::Type,
10173 ROLE | USER => ObjectType::Role,
10174 CLUSTER => {
10175 if self.parse_keyword(REPLICA) {
10176 ObjectType::ClusterReplica
10177 } else {
10178 ObjectType::Cluster
10179 }
10180 }
10181 SECRET => ObjectType::Secret,
10182 CONNECTION => ObjectType::Connection,
10183 DATABASE => ObjectType::Database,
10184 SCHEMA => ObjectType::Schema,
10185 FUNCTION => ObjectType::Func,
10186 NETWORK => {
10187 if self.parse_keyword(POLICY) {
10188 ObjectType::NetworkPolicy
10189 } else {
10190 self.prev_token();
10191 return None;
10192 }
10193 }
10194 _ => unreachable!(),
10195 },
10196 )
10197 }
10198
10199 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10201 Ok(
10202 match self.expect_one_of_keywords(&[
10203 TABLES,
10204 VIEWS,
10205 MATERIALIZED,
10206 SOURCES,
10207 SINKS,
10208 INDEXES,
10209 TYPES,
10210 ROLES,
10211 USERS,
10212 CLUSTER,
10213 CLUSTERS,
10214 SECRETS,
10215 CONNECTIONS,
10216 DATABASES,
10217 SCHEMAS,
10218 POLICIES,
10219 ])? {
10220 TABLES => ObjectType::Table,
10221 VIEWS => ObjectType::View,
10222 MATERIALIZED => {
10223 if let Err(e) = self.expect_keyword(VIEWS) {
10224 self.prev_token();
10225 return Err(e);
10226 }
10227 ObjectType::MaterializedView
10228 }
10229 SOURCES => ObjectType::Source,
10230 SINKS => ObjectType::Sink,
10231 INDEXES => ObjectType::Index,
10232 TYPES => ObjectType::Type,
10233 ROLES | USERS => ObjectType::Role,
10234 CLUSTER => {
10235 if let Err(e) = self.expect_keyword(REPLICAS) {
10236 self.prev_token();
10237 return Err(e);
10238 }
10239 ObjectType::ClusterReplica
10240 }
10241 CLUSTERS => ObjectType::Cluster,
10242 SECRETS => ObjectType::Secret,
10243 CONNECTIONS => ObjectType::Connection,
10244 DATABASES => ObjectType::Database,
10245 SCHEMAS => ObjectType::Schema,
10246 POLICIES => ObjectType::NetworkPolicy,
10247 _ => unreachable!(),
10248 },
10249 )
10250 }
10251
10252 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10254 Some(
10255 match self.parse_one_of_keywords(&[
10256 TABLES,
10257 VIEWS,
10258 MATERIALIZED,
10259 SOURCES,
10260 SINKS,
10261 METRIC,
10262 INDEXES,
10263 TYPES,
10264 ROLES,
10265 USERS,
10266 CLUSTER,
10267 CLUSTERS,
10268 SECRETS,
10269 CONNECTIONS,
10270 DATABASES,
10271 SCHEMAS,
10272 SUBSOURCES,
10273 NETWORK,
10274 ])? {
10275 TABLES => ObjectType::Table,
10276 VIEWS => ObjectType::View,
10277 MATERIALIZED => {
10278 if self.parse_keyword(VIEWS) {
10279 ObjectType::MaterializedView
10280 } else {
10281 self.prev_token();
10282 return None;
10283 }
10284 }
10285 SOURCES => ObjectType::Source,
10286 SINKS => ObjectType::Sink,
10287 METRIC => {
10288 if self.parse_keyword(SINKS) {
10289 ObjectType::MetricSink
10290 } else {
10291 self.prev_token();
10292 return None;
10293 }
10294 }
10295 INDEXES => ObjectType::Index,
10296 TYPES => ObjectType::Type,
10297 ROLES | USERS => ObjectType::Role,
10298 CLUSTER => {
10299 if self.parse_keyword(REPLICAS) {
10300 ObjectType::ClusterReplica
10301 } else {
10302 self.prev_token();
10303 return None;
10304 }
10305 }
10306 CLUSTERS => ObjectType::Cluster,
10307 SECRETS => ObjectType::Secret,
10308 CONNECTIONS => ObjectType::Connection,
10309 DATABASES => ObjectType::Database,
10310 SCHEMAS => ObjectType::Schema,
10311 SUBSOURCES => ObjectType::Subsource,
10312 NETWORK => {
10313 if self.parse_keyword(POLICIES) {
10314 ObjectType::NetworkPolicy
10315 } else {
10316 self.prev_token();
10317 return None;
10318 }
10319 }
10320 _ => unreachable!(),
10321 },
10322 )
10323 }
10324
10325 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10328 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10329 return parser_err!(
10330 self,
10331 self.peek_prev_pos(),
10332 format!("For object type {object_type}, you must specify 'TABLES'")
10333 );
10334 }
10335 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10336 self.prev_token();
10337 return parser_err!(
10338 self,
10339 self.peek_prev_pos(),
10340 "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10341 );
10342 }
10343
10344 Ok(
10345 match self.expect_one_of_keywords(&[
10346 TABLES,
10347 TYPES,
10348 CLUSTERS,
10349 SECRETS,
10350 CONNECTIONS,
10351 DATABASES,
10352 SCHEMAS,
10353 ])? {
10354 TABLES => ObjectType::Table,
10355 TYPES => ObjectType::Type,
10356 CLUSTERS => ObjectType::Cluster,
10357 SECRETS => ObjectType::Secret,
10358 CONNECTIONS => ObjectType::Connection,
10359 DATABASES => ObjectType::Database,
10360 SCHEMAS => ObjectType::Schema,
10361 _ => unreachable!(),
10362 },
10363 )
10364 }
10365
10366 fn expect_plural_system_object_type_for_privileges(
10369 &mut self,
10370 ) -> Result<SystemObjectType, ParserError> {
10371 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10372 return parser_err!(
10373 self,
10374 self.peek_prev_pos(),
10375 format!("For object type {object_type}, you must specify 'TABLES'")
10376 );
10377 }
10378 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10379 self.prev_token();
10380 return parser_err!(
10381 self,
10382 self.peek_prev_pos(),
10383 "For object type MATERIALIZED VIEWS, you must specify 'TABLES'"
10384 );
10385 }
10386
10387 Ok(
10388 match self.expect_one_of_keywords(&[
10389 SYSTEM,
10390 TABLES,
10391 TYPES,
10392 CLUSTERS,
10393 SECRETS,
10394 CONNECTIONS,
10395 DATABASES,
10396 SCHEMAS,
10397 ])? {
10398 SYSTEM => SystemObjectType::System,
10399 TABLES => SystemObjectType::Object(ObjectType::Table),
10400 TYPES => SystemObjectType::Object(ObjectType::Type),
10401 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10402 SECRETS => SystemObjectType::Object(ObjectType::Secret),
10403 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10404 DATABASES => SystemObjectType::Object(ObjectType::Database),
10405 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10406 _ => unreachable!(),
10407 },
10408 )
10409 }
10410
10411 fn parse_privilege(&mut self) -> Option<Privilege> {
10413 Some(
10414 match self.parse_one_of_keywords(&[
10415 INSERT,
10416 SELECT,
10417 UPDATE,
10418 DELETE,
10419 USAGE,
10420 CREATE,
10421 CREATEROLE,
10422 CREATEDB,
10423 CREATECLUSTER,
10424 CREATENETWORKPOLICY,
10425 ])? {
10426 INSERT => Privilege::INSERT,
10427 SELECT => Privilege::SELECT,
10428 UPDATE => Privilege::UPDATE,
10429 DELETE => Privilege::DELETE,
10430 USAGE => Privilege::USAGE,
10431 CREATE => Privilege::CREATE,
10432 CREATEROLE => Privilege::CREATEROLE,
10433 CREATEDB => Privilege::CREATEDB,
10434 CREATECLUSTER => Privilege::CREATECLUSTER,
10435 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10436 _ => unreachable!(),
10437 },
10438 )
10439 }
10440
10441 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10443 if self.parse_keyword(ALL) {
10444 let _ = self.parse_keyword(PRIVILEGES);
10445 return Some(PrivilegeSpecification::All);
10446 }
10447
10448 let mut privileges = Vec::new();
10449 while let Some(privilege) = self.parse_privilege() {
10450 privileges.push(privilege);
10451 if !self.consume_token(&Token::Comma) {
10452 break;
10453 }
10454 }
10455
10456 if privileges.is_empty() {
10457 None
10458 } else {
10459 Some(PrivilegeSpecification::Privileges(privileges))
10460 }
10461 }
10462
10463 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10465 let _ = self.parse_keyword(GROUP);
10466 self.parse_identifier()
10467 }
10468
10469 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10472 self.expect_keywords(&[OWNED, BY])?;
10473 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10474 self.expect_keyword(TO)?;
10475 let new_role = self.parse_identifier()?;
10476 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10477 old_roles,
10478 new_role,
10479 }))
10480 }
10481
10482 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10483 self.expect_keyword(ON)?;
10484
10485 let object = match self.expect_one_of_keywords(&[
10486 TABLE,
10487 VIEW,
10488 COLUMN,
10489 MATERIALIZED,
10490 SOURCE,
10491 SINK,
10492 INDEX,
10493 FUNCTION,
10494 CONNECTION,
10495 TYPE,
10496 SECRET,
10497 ROLE,
10498 DATABASE,
10499 SCHEMA,
10500 CLUSTER,
10501 NETWORK,
10502 ])? {
10503 TABLE => {
10504 let name = self.parse_raw_name()?;
10505 CommentObjectType::Table { name }
10506 }
10507 VIEW => {
10508 let name = self.parse_raw_name()?;
10509 CommentObjectType::View { name }
10510 }
10511 MATERIALIZED => {
10512 self.expect_keyword(VIEW)?;
10513 let name = self.parse_raw_name()?;
10514 CommentObjectType::MaterializedView { name }
10515 }
10516 SOURCE => {
10517 let name = self.parse_raw_name()?;
10518 CommentObjectType::Source { name }
10519 }
10520 SINK => {
10521 let name = self.parse_raw_name()?;
10522 CommentObjectType::Sink { name }
10523 }
10524 INDEX => {
10525 let name = self.parse_raw_name()?;
10526 CommentObjectType::Index { name }
10527 }
10528 FUNCTION => {
10529 let name = self.parse_raw_name()?;
10530 CommentObjectType::Func { name }
10531 }
10532 CONNECTION => {
10533 let name = self.parse_raw_name()?;
10534 CommentObjectType::Connection { name }
10535 }
10536 TYPE => {
10537 let ty = self.parse_data_type()?;
10538 CommentObjectType::Type { ty }
10539 }
10540 SECRET => {
10541 let name = self.parse_raw_name()?;
10542 CommentObjectType::Secret { name }
10543 }
10544 ROLE => {
10545 let name = self.parse_identifier()?;
10546 CommentObjectType::Role { name }
10547 }
10548 DATABASE => {
10549 let name = self.parse_database_name()?;
10550 CommentObjectType::Database { name }
10551 }
10552 SCHEMA => {
10553 let name = self.parse_schema_name()?;
10554 CommentObjectType::Schema { name }
10555 }
10556 CLUSTER => {
10557 if self.parse_keyword(REPLICA) {
10558 let name = self.parse_cluster_replica_name()?;
10559 CommentObjectType::ClusterReplica { name }
10560 } else {
10561 let name = self.parse_raw_ident()?;
10562 CommentObjectType::Cluster { name }
10563 }
10564 }
10565 COLUMN => {
10566 let name = self.parse_column_name()?;
10567 CommentObjectType::Column { name }
10568 }
10569 NETWORK => {
10570 self.expect_keyword(POLICY)?;
10571 let name = self.parse_raw_network_policy_name()?;
10572 CommentObjectType::NetworkPolicy { name }
10573 }
10574 _ => unreachable!(),
10575 };
10576
10577 self.expect_keyword(IS)?;
10578 let comment = match self.next_token() {
10579 Some(Token::Keyword(NULL)) => None,
10580 Some(Token::String(s)) => Some(s),
10581 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10582 };
10583
10584 Ok(Statement::Comment(CommentStatement { object, comment }))
10585 }
10586
10587 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10588 where
10589 S: TryInto<IdentString>,
10590 <S as TryInto<IdentString>>::Error: fmt::Display,
10591 {
10592 Ident::new(s).map_err(|e| ParserError {
10593 pos: self.peek_prev_pos(),
10594 message: e.to_string(),
10595 })
10596 }
10597}
10598
10599impl CheckedRecursion for Parser<'_> {
10600 fn recursion_guard(&self) -> &RecursionGuard {
10601 &self.recursion_guard
10602 }
10603}
10604
10605enum ParenthesizedFragment {
10609 Query(Query<Raw>),
10610 Exprs(Vec<Expr<Raw>>),
10611}
10612
10613impl ParenthesizedFragment {
10614 fn into_expr(self) -> Expr<Raw> {
10616 match self {
10617 ParenthesizedFragment::Exprs(exprs) => {
10618 if exprs.len() == 1 {
10621 Expr::Nested(Box::new(exprs.into_element()))
10624 } else {
10625 Expr::Row { exprs }
10628 }
10629 }
10630 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10632 }
10633 }
10634}
10635
10636include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));