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