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 PASSWORD,
2978 PORT,
2979 PUBLIC,
2980 PROGRESS,
2981 REGION,
2982 REGISTRY,
2983 SASL,
2984 SCOPE,
2985 SECRET,
2986 SECURITY,
2987 SERVICE,
2988 SESSION,
2989 SSH,
2990 SSL,
2991 URL,
2992 USER,
2993 USERNAME,
2994 WAREHOUSE,
2995 ])? {
2996 ACCESS => {
2997 self.expect_keywords(&[KEY, ID])?;
2998 ConnectionOptionName::AccessKeyId
2999 }
3000 ASSUME => {
3001 self.expect_keyword(ROLE)?;
3002 match self.expect_one_of_keywords(&[ARN, SESSION])? {
3003 ARN => ConnectionOptionName::AssumeRoleArn,
3004 SESSION => {
3005 self.expect_keyword(NAME)?;
3006 ConnectionOptionName::AssumeRoleSessionName
3007 }
3008 _ => unreachable!(),
3009 }
3010 }
3011 AVAILABILITY => {
3012 self.expect_keyword(ZONES)?;
3013 ConnectionOptionName::AvailabilityZones
3014 }
3015 AWS => match self.expect_one_of_keywords(&[CONNECTION, PRIVATELINK])? {
3016 CONNECTION => ConnectionOptionName::AwsConnection,
3017 PRIVATELINK => ConnectionOptionName::AwsPrivatelink,
3018 _ => unreachable!(),
3019 },
3020 BROKER => ConnectionOptionName::Broker,
3021 BROKERS => ConnectionOptionName::Brokers,
3022 CATALOG => {
3023 self.expect_keyword(TYPE)?;
3024 ConnectionOptionName::CatalogType
3025 }
3026 CREDENTIAL => ConnectionOptionName::Credential,
3027 DATABASE => ConnectionOptionName::Database,
3028 ENDPOINT => ConnectionOptionName::Endpoint,
3029 GCP => {
3030 self.expect_keyword(CONNECTION)?;
3031 ConnectionOptionName::GcpConnection
3032 }
3033 HOST => ConnectionOptionName::Host,
3034 PASSWORD => ConnectionOptionName::Password,
3035 PORT => ConnectionOptionName::Port,
3036 PUBLIC => {
3037 self.expect_keyword(KEY)?;
3038 match self.next_token() {
3039 Some(Token::Number(n)) if n == "1" => ConnectionOptionName::PublicKey1,
3040 Some(Token::Number(n)) if n == "2" => ConnectionOptionName::PublicKey2,
3041 t => self.expected(self.peek_prev_pos(), "1 or 2 after PUBLIC KEY", t)?,
3042 }
3043 }
3044 PROGRESS => {
3045 self.expect_keyword(TOPIC)?;
3046 match self.parse_keywords(&[REPLICATION, FACTOR]) {
3047 true => ConnectionOptionName::ProgressTopicReplicationFactor,
3048 false => ConnectionOptionName::ProgressTopic,
3049 }
3050 }
3051 SECURITY => {
3052 self.expect_keyword(PROTOCOL)?;
3053 ConnectionOptionName::SecurityProtocol
3054 }
3055 REGION => ConnectionOptionName::Region,
3056 REGISTRY => ConnectionOptionName::Registry,
3057 SASL => match self.expect_one_of_keywords(&[MECHANISMS, PASSWORD, USERNAME])? {
3058 MECHANISMS => ConnectionOptionName::SaslMechanisms,
3059 PASSWORD => ConnectionOptionName::SaslPassword,
3060 USERNAME => ConnectionOptionName::SaslUsername,
3061 _ => unreachable!(),
3062 },
3063 SCOPE => ConnectionOptionName::Scope,
3064 SECRET => {
3065 self.expect_keywords(&[ACCESS, KEY])?;
3066 ConnectionOptionName::SecretAccessKey
3067 }
3068 SERVICE => match self.expect_one_of_keywords(&[ACCOUNT, NAME])? {
3069 ACCOUNT => {
3070 self.expect_keyword(KEY)?;
3071 ConnectionOptionName::ServiceAccountKey
3072 }
3073 NAME => ConnectionOptionName::ServiceName,
3074 _ => unreachable!(),
3075 },
3076 SESSION => {
3077 self.expect_keyword(TOKEN)?;
3078 ConnectionOptionName::SessionToken
3079 }
3080 SSH => {
3081 self.expect_keyword(TUNNEL)?;
3082 ConnectionOptionName::SshTunnel
3083 }
3084 SSL => match self.expect_one_of_keywords(&[CERTIFICATE, MODE, KEY])? {
3085 CERTIFICATE => {
3086 if self.parse_keyword(AUTHORITY) {
3087 ConnectionOptionName::SslCertificateAuthority
3088 } else {
3089 ConnectionOptionName::SslCertificate
3090 }
3091 }
3092 KEY => ConnectionOptionName::SslKey,
3093 MODE => ConnectionOptionName::SslMode,
3094 _ => unreachable!(),
3095 },
3096 URL => ConnectionOptionName::Url,
3097 WAREHOUSE => ConnectionOptionName::Warehouse,
3099 USER | USERNAME => ConnectionOptionName::User,
3100 _ => unreachable!(),
3101 },
3102 )
3103 }
3104
3105 fn parse_connection_option_unified(&mut self) -> Result<ConnectionOption<Raw>, ParserError> {
3106 let name = self.parse_connection_option_name()?;
3107 let value = match name {
3108 ConnectionOptionName::AwsConnection => Some(self.parse_object_option_value()?),
3109 ConnectionOptionName::AwsPrivatelink => Some(self.parse_default_aws_privatelink()?),
3110 ConnectionOptionName::Broker => Some(self.parse_kafka_broker()?),
3111 ConnectionOptionName::Brokers => Some(WithOptionValue::Sequence(
3112 self.parse_list_value(Parser::parse_kafka_broker_or_matching_rule)?,
3113 )),
3114 ConnectionOptionName::GcpConnection => Some(self.parse_object_option_value()?),
3115 ConnectionOptionName::SshTunnel => Some(self.parse_object_option_value()?),
3116 _ if name.value_contains_sensitive_data() => {
3117 self.parse_optional_connection_credential_option_value()?
3118 }
3119 _ => self.parse_optional_option_value()?,
3120 };
3121 Ok(ConnectionOption { name, value })
3122 }
3123
3124 fn parse_create_subsource(&mut self) -> Result<Statement<Raw>, ParserError> {
3125 self.expect_keyword(SUBSOURCE)?;
3126 let if_not_exists = self.parse_if_not_exists()?;
3127 let name = self.parse_item_name()?;
3128
3129 let (columns, constraints) = self.parse_columns(Mandatory)?;
3130
3131 let of_source = if self.parse_keyword(OF) {
3132 self.expect_keyword(SOURCE)?;
3133 Some(self.parse_raw_name()?)
3134 } else {
3135 None
3136 };
3137
3138 let with_options = if self.parse_keyword(WITH) {
3139 self.expect_token(&Token::LParen)?;
3140 let options = self.parse_comma_separated(Parser::parse_create_subsource_option)?;
3141 self.expect_token(&Token::RParen)?;
3142 options
3143 } else {
3144 vec![]
3145 };
3146
3147 Ok(Statement::CreateSubsource(CreateSubsourceStatement {
3148 name,
3149 if_not_exists,
3150 columns,
3151 of_source,
3152 constraints,
3153 with_options,
3154 }))
3155 }
3156
3157 fn parse_create_subsource_option(&mut self) -> Result<CreateSubsourceOption<Raw>, ParserError> {
3158 let option = match self
3159 .expect_one_of_keywords(&[EXTERNAL, PROGRESS, TEXT, EXCLUDE, IGNORE, DETAILS, RETAIN])?
3160 {
3161 EXTERNAL => {
3162 self.expect_keyword(REFERENCE)?;
3163 CreateSubsourceOption {
3164 name: CreateSubsourceOptionName::ExternalReference,
3165 value: self.parse_optional_option_value()?,
3166 }
3167 }
3168 PROGRESS => CreateSubsourceOption {
3169 name: CreateSubsourceOptionName::Progress,
3170 value: self.parse_optional_option_value()?,
3171 },
3172 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
3173 self.expect_keyword(COLUMNS)?;
3174
3175 let _ = self.consume_token(&Token::Eq);
3176
3177 let value = self
3178 .parse_option_sequence(Parser::parse_identifier)?
3179 .map(|inner| {
3180 WithOptionValue::Sequence(
3181 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
3182 )
3183 });
3184
3185 CreateSubsourceOption {
3186 name: match *keyword {
3187 TEXT => CreateSubsourceOptionName::TextColumns,
3188 EXCLUDE | IGNORE => CreateSubsourceOptionName::ExcludeColumns,
3190 _ => unreachable!(),
3191 },
3192 value,
3193 }
3194 }
3195 DETAILS => CreateSubsourceOption {
3196 name: CreateSubsourceOptionName::Details,
3197 value: self.parse_optional_option_value()?,
3198 },
3199 RETAIN => {
3200 self.expect_keyword(HISTORY)?;
3201 CreateSubsourceOption {
3202 name: CreateSubsourceOptionName::RetainHistory,
3203 value: self.parse_option_retain_history()?,
3204 }
3205 }
3206 _ => unreachable!(),
3207 };
3208 Ok(option)
3209 }
3210
3211 fn parse_create_source(&mut self) -> Result<Statement<Raw>, ParserError> {
3212 self.expect_keyword(SOURCE)?;
3213 let if_not_exists = self.parse_if_not_exists()?;
3214 let name = self.parse_item_name()?;
3215
3216 let (col_names, key_constraint) = self.parse_source_columns()?;
3217
3218 let in_cluster = self.parse_optional_in_cluster()?;
3219 self.expect_keyword(FROM)?;
3220
3221 if self.parse_keyword(WEBHOOK) {
3223 return self.parse_create_webhook_source(name, if_not_exists, in_cluster, false);
3224 }
3225
3226 let connection = self.parse_create_source_connection()?;
3227 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
3228 Some(KEY) => {
3229 self.expect_keyword(FORMAT)?;
3230 let key = self.parse_format()?;
3231 self.expect_keywords(&[VALUE, FORMAT])?;
3232 let value = self.parse_format()?;
3233 Some(FormatSpecifier::KeyValue { key, value })
3234 }
3235 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3236 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3237 None => None,
3238 };
3239 let include_metadata = self.parse_source_include_metadata()?;
3240
3241 let envelope = if self.parse_keyword(ENVELOPE) {
3242 Some(self.parse_source_envelope()?)
3243 } else {
3244 None
3245 };
3246
3247 let referenced_subsources = if self.parse_keywords(&[FOR, TABLES]) {
3248 self.expect_token(&Token::LParen)?;
3249 let subsources = self.parse_comma_separated(Parser::parse_subsource_references)?;
3250 self.expect_token(&Token::RParen)?;
3251 Some(ExternalReferences::SubsetTables(subsources))
3252 } else if self.parse_keywords(&[FOR, SCHEMAS]) {
3253 self.expect_token(&Token::LParen)?;
3254 let schemas = self.parse_comma_separated(Parser::parse_identifier)?;
3255 self.expect_token(&Token::RParen)?;
3256 Some(ExternalReferences::SubsetSchemas(schemas))
3257 } else if self.parse_keywords(&[FOR, ALL, TABLES]) {
3258 Some(ExternalReferences::All)
3259 } else {
3260 None
3261 };
3262
3263 let progress_subsource = if self.parse_keywords(&[EXPOSE, PROGRESS, AS]) {
3264 Some(self.parse_deferred_item_name()?)
3265 } else {
3266 None
3267 };
3268
3269 let with_options = if self.parse_keyword(WITH) {
3271 self.expect_token(&Token::LParen)?;
3272 let options = self.parse_comma_separated(Parser::parse_source_option)?;
3273 self.expect_token(&Token::RParen)?;
3274 options
3275 } else {
3276 vec![]
3277 };
3278
3279 Ok(Statement::CreateSource(CreateSourceStatement {
3280 name,
3281 in_cluster,
3282 col_names,
3283 connection,
3284 format,
3285 include_metadata,
3286 envelope,
3287 if_not_exists,
3288 key_constraint,
3289 external_references: referenced_subsources,
3290 progress_subsource,
3291 with_options,
3292 }))
3293 }
3294
3295 fn parse_subsource_references(&mut self) -> Result<ExternalReferenceExport, ParserError> {
3296 let reference = self.parse_item_name()?;
3297 let subsource = if self.parse_one_of_keywords(&[AS, INTO]).is_some() {
3298 Some(self.parse_item_name()?)
3299 } else {
3300 None
3301 };
3302
3303 Ok(ExternalReferenceExport {
3304 reference,
3305 alias: subsource,
3306 })
3307 }
3308
3309 fn parse_source_columns(&mut self) -> Result<(Vec<Ident>, Option<KeyConstraint>), ParserError> {
3315 if self.consume_token(&Token::LParen) {
3316 let mut columns = vec![];
3317 let mut key_constraints = vec![];
3318 loop {
3319 let pos = self.peek_pos();
3320 if let Some(key_constraint) = self.parse_key_constraint()? {
3321 if !key_constraints.is_empty() {
3322 return parser_err!(self, pos, "Multiple key constraints not allowed");
3323 }
3324 key_constraints.push(key_constraint);
3325 } else {
3326 columns.push(self.parse_identifier()?);
3327 }
3328 if !self.consume_token(&Token::Comma) {
3329 break;
3330 }
3331 }
3332 self.expect_token(&Token::RParen)?;
3333 Ok((columns, key_constraints.into_iter().next()))
3334 } else {
3335 Ok((vec![], None))
3336 }
3337 }
3338
3339 fn parse_key_constraint(&mut self) -> Result<Option<KeyConstraint>, ParserError> {
3341 if self.parse_keywords(&[PRIMARY, KEY]) {
3343 let columns = self.parse_parenthesized_column_list(Mandatory)?;
3344 self.expect_keywords(&[NOT, ENFORCED])?;
3345 Ok(Some(KeyConstraint::PrimaryKeyNotEnforced { columns }))
3346 } else {
3347 Ok(None)
3348 }
3349 }
3350
3351 fn parse_source_option_name(&mut self) -> Result<CreateSourceOptionName, ParserError> {
3352 let name = match self.expect_one_of_keywords(&[TIMESTAMP, RETAIN])? {
3353 TIMESTAMP => {
3354 self.expect_keyword(INTERVAL)?;
3355 CreateSourceOptionName::TimestampInterval
3356 }
3357 RETAIN => {
3358 self.expect_keyword(HISTORY)?;
3359 CreateSourceOptionName::RetainHistory
3360 }
3361 _ => unreachable!(),
3362 };
3363 Ok(name)
3364 }
3365
3366 fn parse_source_option(&mut self) -> Result<CreateSourceOption<Raw>, ParserError> {
3368 let name = self.parse_source_option_name()?;
3369 if name == CreateSourceOptionName::RetainHistory {
3370 let _ = self.consume_token(&Token::Eq);
3371 return Ok(CreateSourceOption {
3372 name,
3373 value: self.parse_option_retain_history()?,
3374 });
3375 }
3376 Ok(CreateSourceOption {
3377 name,
3378 value: self.parse_optional_option_value()?,
3379 })
3380 }
3381
3382 fn parse_create_webhook_source(
3383 &mut self,
3384 name: UnresolvedItemName,
3385 if_not_exists: bool,
3386 in_cluster: Option<RawClusterName>,
3387 is_table: bool,
3388 ) -> Result<Statement<Raw>, ParserError> {
3389 self.expect_keywords(&[BODY, FORMAT])?;
3390
3391 let body_format = match self.expect_one_of_keywords(&[JSON, TEXT, BYTES])? {
3394 JSON => {
3395 let array = self.parse_keyword(ARRAY);
3396 Format::Json { array }
3397 }
3398 TEXT => Format::Text,
3399 BYTES => Format::Bytes,
3400 _ => unreachable!(),
3401 };
3402
3403 let mut include_headers = CreateWebhookSourceIncludeHeaders::default();
3404 while self.parse_keyword(INCLUDE) {
3405 match self.expect_one_of_keywords(&[HEADER, HEADERS])? {
3406 HEADER => {
3407 let header_name = self.parse_literal_string()?;
3408 self.expect_keyword(AS)?;
3409 let column_name = self.parse_identifier()?;
3410 let use_bytes = self.parse_keyword(BYTES);
3411
3412 include_headers.mappings.push(CreateWebhookSourceMapHeader {
3413 header_name,
3414 column_name,
3415 use_bytes,
3416 });
3417 }
3418 HEADERS => {
3419 let header_filters = include_headers.column.get_or_insert_with(Vec::default);
3420 if self.consume_token(&Token::LParen) {
3421 let filters = self.parse_comma_separated(|f| {
3422 let block = f.parse_keyword(NOT);
3423 let header_name = f.parse_literal_string()?;
3424 Ok(CreateWebhookSourceFilterHeader { block, header_name })
3425 })?;
3426 header_filters.extend(filters);
3427
3428 self.expect_token(&Token::RParen)?;
3429 }
3430 }
3431 k => unreachable!("programming error, didn't expect {k}"),
3432 }
3433 }
3434
3435 let validate_using = if self.parse_keyword(CHECK) {
3436 self.expect_token(&Token::LParen)?;
3437
3438 let options = if self.parse_keyword(WITH) {
3439 self.expect_token(&Token::LParen)?;
3440 let options = self.parse_create_webhook_check_options()?;
3441 self.expect_token(&Token::RParen)?;
3442
3443 Some(options)
3444 } else {
3445 None
3446 };
3447
3448 let using = self.parse_expr()?;
3449 self.expect_token(&Token::RParen)?;
3450
3451 Some(CreateWebhookSourceCheck { options, using })
3452 } else {
3453 None
3454 };
3455
3456 Ok(Statement::CreateWebhookSource(
3457 CreateWebhookSourceStatement {
3458 name,
3459 is_table,
3460 if_not_exists,
3461 body_format,
3462 include_headers,
3463 validate_using,
3464 in_cluster,
3465 },
3466 ))
3467 }
3468
3469 fn parse_create_webhook_check_options(
3470 &mut self,
3471 ) -> Result<CreateWebhookSourceCheckOptions<Raw>, ParserError> {
3472 let mut secrets = vec![];
3473 let mut headers = vec![];
3474 let mut bodies = vec![];
3475
3476 fn parse_alias(parser: &mut Parser<'_>) -> Result<Option<Ident>, ParserError> {
3477 parser
3478 .parse_keyword(AS)
3479 .then(|| parser.parse_identifier())
3480 .transpose()
3481 }
3482
3483 self.parse_comma_separated(|f| {
3484 match f.expect_one_of_keywords(&[SECRET, HEADERS, BODY])? {
3485 SECRET => {
3486 let secret = f.parse_raw_name()?;
3487 let alias = parse_alias(f)?;
3488 let use_bytes = f.parse_keyword(Keyword::Bytes);
3489
3490 secrets.push(CreateWebhookSourceSecret {
3491 secret,
3492 alias,
3493 use_bytes,
3494 });
3495
3496 Ok(())
3497 }
3498 HEADERS => {
3499 let alias = parse_alias(f)?;
3501 let use_bytes = f.parse_keyword(Keyword::Bytes);
3502 headers.push(CreateWebhookSourceHeader { alias, use_bytes });
3503
3504 Ok(())
3505 }
3506 BODY => {
3507 let alias = parse_alias(f)?;
3508 let use_bytes = f.parse_keyword(Keyword::Bytes);
3509 bodies.push(CreateWebhookSourceBody { alias, use_bytes });
3510
3511 Ok(())
3512 }
3513 k => unreachable!("Unexpected keyword! {k}"),
3514 }
3515 })?;
3516
3517 Ok(CreateWebhookSourceCheckOptions {
3518 secrets,
3519 headers,
3520 bodies,
3521 })
3522 }
3523
3524 fn parse_create_iceberg_sink(
3525 &mut self,
3526 name: Option<UnresolvedItemName>,
3527 in_cluster: Option<RawClusterName>,
3528 from: RawItemName,
3529 if_not_exists: bool,
3530 connection: CreateSinkConnection<Raw>,
3531 ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3532 let mode = if self.parse_keyword(MODE) {
3533 Some(self.parse_iceberg_sink_mode()?)
3534 } else {
3535 None
3536 };
3537
3538 let with_options = if self.parse_keyword(WITH) {
3539 self.expect_token(&Token::LParen)?;
3540 let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3541 self.expect_token(&Token::RParen)?;
3542 options
3543 } else {
3544 vec![]
3545 };
3546
3547 Ok(CreateSinkStatement {
3548 name,
3549 in_cluster,
3550 from,
3551 connection,
3552 format: None,
3553 envelope: None,
3554 mode,
3555 if_not_exists,
3556 with_options,
3557 })
3558 }
3559
3560 fn parse_create_kafka_sink(
3561 &mut self,
3562 name: Option<UnresolvedItemName>,
3563 in_cluster: Option<RawClusterName>,
3564 from: RawItemName,
3565 if_not_exists: bool,
3566 connection: CreateSinkConnection<Raw>,
3567 ) -> Result<CreateSinkStatement<Raw>, ParserError> {
3568 let format = match &self.parse_one_of_keywords(&[KEY, FORMAT]) {
3569 Some(KEY) => {
3570 self.expect_keyword(FORMAT)?;
3571 let key = self.parse_format()?;
3572 self.expect_keywords(&[VALUE, FORMAT])?;
3573 let value = self.parse_format()?;
3574 Some(FormatSpecifier::KeyValue { key, value })
3575 }
3576 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
3577 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
3578 None => None,
3579 };
3580 let envelope = if self.parse_keyword(ENVELOPE) {
3581 Some(self.parse_sink_envelope()?)
3582 } else {
3583 None
3584 };
3585
3586 let with_options = if self.parse_keyword(WITH) {
3587 self.expect_token(&Token::LParen)?;
3588 let options = self.parse_comma_separated(Parser::parse_create_sink_option)?;
3589 self.expect_token(&Token::RParen)?;
3590 options
3591 } else {
3592 vec![]
3593 };
3594
3595 Ok(CreateSinkStatement {
3596 name,
3597 in_cluster,
3598 from,
3599 connection,
3600 format,
3601 envelope,
3602 mode: None,
3603 if_not_exists,
3604 with_options,
3605 })
3606 }
3607
3608 fn parse_create_sink(&mut self) -> Result<Statement<Raw>, ParserError> {
3609 self.expect_keyword(SINK)?;
3610 let if_not_exists = self.parse_if_not_exists()?;
3611
3612 let mut name = Some(self.parse_item_name()?);
3613
3614 if (name == Some(UnresolvedItemName::unqualified(ident!("in")))
3621 && self.peek_keyword(CLUSTER))
3622 || (name == Some(UnresolvedItemName::unqualified(ident!("from")))
3623 && !self.peek_keyword(FROM))
3624 {
3625 name = None;
3626 self.prev_token();
3627 }
3628
3629 let in_cluster = self.parse_optional_in_cluster()?;
3630 self.expect_keyword(FROM)?;
3631 let from = self.parse_raw_name()?;
3632 self.expect_keyword(INTO)?;
3633 let connection = self.parse_create_sink_connection()?;
3634
3635 let statement = match connection {
3636 conn @ CreateSinkConnection::Kafka { .. } => {
3637 self.parse_create_kafka_sink(name, in_cluster, from, if_not_exists, conn)
3638 }
3639 conn @ CreateSinkConnection::Iceberg { .. } => {
3640 self.parse_create_iceberg_sink(name, in_cluster, from, if_not_exists, conn)
3641 }
3642 }?;
3643
3644 Ok(Statement::CreateSink(statement))
3645 }
3646
3647 fn parse_create_metric_sink(&mut self) -> Result<Statement<Raw>, ParserError> {
3648 self.expect_keywords(&[METRIC, SINK])?;
3649 let if_not_exists = self.parse_if_not_exists()?;
3650 let name = self.parse_item_name()?;
3651 let in_cluster = self.parse_optional_in_cluster()?;
3652 self.expect_keyword(FROM)?;
3653 let from = self.parse_raw_name()?;
3654 let with_options = if self.parse_keyword(WITH) {
3655 self.expect_token(&Token::LParen)?;
3656 let options = self.parse_comma_separated(Parser::parse_create_metric_sink_option)?;
3657 self.expect_token(&Token::RParen)?;
3658 options
3659 } else {
3660 vec![]
3661 };
3662 Ok(Statement::CreateMetricSink(CreateMetricSinkStatement {
3663 name,
3664 in_cluster,
3665 if_not_exists,
3666 from,
3667 with_options,
3668 }))
3669 }
3670
3671 fn parse_create_metric_sink_option(
3673 &mut self,
3674 ) -> Result<CreateMetricSinkOption<Raw>, ParserError> {
3675 self.expect_keyword(PREFIX)?;
3676 Ok(CreateMetricSinkOption {
3677 name: CreateMetricSinkOptionName::Prefix,
3678 value: self.parse_optional_option_value()?,
3679 })
3680 }
3681
3682 fn parse_create_sink_option_name(&mut self) -> Result<CreateSinkOptionName, ParserError> {
3684 let name = match self.expect_one_of_keywords(&[PARTITION, SNAPSHOT, VERSION, COMMIT])? {
3685 SNAPSHOT => CreateSinkOptionName::Snapshot,
3686 VERSION => CreateSinkOptionName::Version,
3687 PARTITION => {
3688 self.expect_keyword(STRATEGY)?;
3689 CreateSinkOptionName::PartitionStrategy
3690 }
3691 COMMIT => {
3692 self.expect_keyword(INTERVAL)?;
3693 CreateSinkOptionName::CommitInterval
3694 }
3695 _ => unreachable!(),
3696 };
3697 Ok(name)
3698 }
3699
3700 fn parse_create_sink_option(&mut self) -> Result<CreateSinkOption<Raw>, ParserError> {
3702 Ok(CreateSinkOption {
3703 name: self.parse_create_sink_option_name()?,
3704 value: self.parse_optional_option_value()?,
3705 })
3706 }
3707
3708 fn parse_create_source_connection(
3709 &mut self,
3710 ) -> Result<CreateSourceConnection<Raw>, ParserError> {
3711 match self.expect_one_of_keywords(&[KAFKA, POSTGRES, SQL, MYSQL, LOAD])? {
3712 POSTGRES => {
3713 self.expect_keyword(CONNECTION)?;
3714 let connection = self.parse_raw_name()?;
3715
3716 let options = if self.consume_token(&Token::LParen) {
3717 let options = self.parse_comma_separated(Parser::parse_pg_connection_option)?;
3718 self.expect_token(&Token::RParen)?;
3719 options
3720 } else {
3721 vec![]
3722 };
3723
3724 Ok(CreateSourceConnection::Postgres {
3725 connection,
3726 options,
3727 })
3728 }
3729 SQL => {
3730 self.expect_keywords(&[SERVER, CONNECTION])?;
3731 let connection = self.parse_raw_name()?;
3732
3733 let options = if self.consume_token(&Token::LParen) {
3734 let options =
3735 self.parse_comma_separated(Parser::parse_sql_server_connection_option)?;
3736 self.expect_token(&Token::RParen)?;
3737 options
3738 } else {
3739 vec![]
3740 };
3741
3742 Ok(CreateSourceConnection::SqlServer {
3743 connection,
3744 options,
3745 })
3746 }
3747 MYSQL => {
3748 self.expect_keyword(CONNECTION)?;
3749 let connection = self.parse_raw_name()?;
3750
3751 let options = if self.consume_token(&Token::LParen) {
3752 let options =
3753 self.parse_comma_separated(Parser::parse_mysql_connection_option)?;
3754 self.expect_token(&Token::RParen)?;
3755 options
3756 } else {
3757 vec![]
3758 };
3759
3760 Ok(CreateSourceConnection::MySql {
3761 connection,
3762 options,
3763 })
3764 }
3765 KAFKA => {
3766 self.expect_keyword(CONNECTION)?;
3767 let connection = self.parse_raw_name()?;
3768
3769 let options = if self.consume_token(&Token::LParen) {
3770 let options =
3771 self.parse_comma_separated(Parser::parse_kafka_source_config_option)?;
3772 self.expect_token(&Token::RParen)?;
3773 options
3774 } else {
3775 vec![]
3776 };
3777
3778 Ok(CreateSourceConnection::Kafka {
3779 connection,
3780 options,
3781 })
3782 }
3783 LOAD => {
3784 self.expect_keyword(GENERATOR)?;
3785 let generator = match self.expect_one_of_keywords(&[
3786 CLOCK, COUNTER, MARKETING, AUCTION, TPCH, DATUMS, KEY,
3787 ])? {
3788 CLOCK => LoadGenerator::Clock,
3789 COUNTER => LoadGenerator::Counter,
3790 AUCTION => LoadGenerator::Auction,
3791 TPCH => LoadGenerator::Tpch,
3792 DATUMS => LoadGenerator::Datums,
3793 MARKETING => LoadGenerator::Marketing,
3794 KEY => {
3795 self.expect_keyword(VALUE)?;
3796 LoadGenerator::KeyValue
3797 }
3798 _ => unreachable!(),
3799 };
3800 let options = if self.consume_token(&Token::LParen) {
3801 let options =
3802 self.parse_comma_separated(Parser::parse_load_generator_option)?;
3803 self.expect_token(&Token::RParen)?;
3804 options
3805 } else {
3806 vec![]
3807 };
3808 Ok(CreateSourceConnection::LoadGenerator { generator, options })
3809 }
3810 _ => unreachable!(),
3811 }
3812 }
3813
3814 fn parse_pg_connection_option(&mut self) -> Result<PgConfigOption<Raw>, ParserError> {
3815 let name = match self.expect_one_of_keywords(&[DETAILS, PUBLICATION, TEXT, EXCLUDE])? {
3816 DETAILS => PgConfigOptionName::Details,
3817 PUBLICATION => PgConfigOptionName::Publication,
3818 TEXT => {
3819 self.expect_keyword(COLUMNS)?;
3820
3821 let _ = self.consume_token(&Token::Eq);
3822
3823 let value = self
3824 .parse_option_sequence(Parser::parse_item_name)?
3825 .map(|inner| {
3826 WithOptionValue::Sequence(
3827 inner
3828 .into_iter()
3829 .map(WithOptionValue::UnresolvedItemName)
3830 .collect_vec(),
3831 )
3832 });
3833
3834 return Ok(PgConfigOption {
3835 name: PgConfigOptionName::TextColumns,
3836 value,
3837 });
3838 }
3839 EXCLUDE => {
3840 self.expect_keyword(COLUMNS)?;
3841
3842 let _ = self.consume_token(&Token::Eq);
3843
3844 let value = self
3845 .parse_option_sequence(Parser::parse_item_name)?
3846 .map(|inner| {
3847 WithOptionValue::Sequence(
3848 inner
3849 .into_iter()
3850 .map(WithOptionValue::UnresolvedItemName)
3851 .collect_vec(),
3852 )
3853 });
3854
3855 return Ok(PgConfigOption {
3856 name: PgConfigOptionName::ExcludeColumns,
3857 value,
3858 });
3859 }
3860 _ => unreachable!(),
3861 };
3862 Ok(PgConfigOption {
3863 name,
3864 value: self.parse_optional_option_value()?,
3865 })
3866 }
3867
3868 fn parse_mysql_connection_option(&mut self) -> Result<MySqlConfigOption<Raw>, ParserError> {
3869 match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE, IGNORE])? {
3870 DETAILS => Ok(MySqlConfigOption {
3871 name: MySqlConfigOptionName::Details,
3872 value: self.parse_optional_option_value()?,
3873 }),
3874 TEXT => {
3875 self.expect_keyword(COLUMNS)?;
3876
3877 let _ = self.consume_token(&Token::Eq);
3878
3879 let value = self
3880 .parse_option_sequence(Parser::parse_item_name)?
3881 .map(|inner| {
3882 WithOptionValue::Sequence(
3883 inner
3884 .into_iter()
3885 .map(WithOptionValue::UnresolvedItemName)
3886 .collect_vec(),
3887 )
3888 });
3889
3890 Ok(MySqlConfigOption {
3891 name: MySqlConfigOptionName::TextColumns,
3892 value,
3893 })
3894 }
3895 EXCLUDE | IGNORE => {
3897 self.expect_keyword(COLUMNS)?;
3898
3899 let _ = self.consume_token(&Token::Eq);
3900
3901 let value = self
3902 .parse_option_sequence(Parser::parse_item_name)?
3903 .map(|inner| {
3904 WithOptionValue::Sequence(
3905 inner
3906 .into_iter()
3907 .map(WithOptionValue::UnresolvedItemName)
3908 .collect_vec(),
3909 )
3910 });
3911
3912 Ok(MySqlConfigOption {
3913 name: MySqlConfigOptionName::ExcludeColumns,
3914 value,
3915 })
3916 }
3917 _ => unreachable!(),
3918 }
3919 }
3920
3921 fn parse_sql_server_connection_option(
3922 &mut self,
3923 ) -> Result<SqlServerConfigOption<Raw>, ParserError> {
3924 match self.expect_one_of_keywords(&[DETAILS, TEXT, EXCLUDE])? {
3925 DETAILS => Ok(SqlServerConfigOption {
3926 name: SqlServerConfigOptionName::Details,
3927 value: self.parse_optional_option_value()?,
3928 }),
3929 TEXT => {
3930 self.expect_keyword(COLUMNS)?;
3931
3932 let _ = self.consume_token(&Token::Eq);
3933
3934 let value = self
3935 .parse_option_sequence(Parser::parse_item_name)?
3936 .map(|inner| {
3937 WithOptionValue::Sequence(
3938 inner
3939 .into_iter()
3940 .map(WithOptionValue::UnresolvedItemName)
3941 .collect_vec(),
3942 )
3943 });
3944
3945 Ok(SqlServerConfigOption {
3946 name: SqlServerConfigOptionName::TextColumns,
3947 value,
3948 })
3949 }
3950 EXCLUDE => {
3951 self.expect_keyword(COLUMNS)?;
3952
3953 let _ = self.consume_token(&Token::Eq);
3954
3955 let value = self
3956 .parse_option_sequence(Parser::parse_item_name)?
3957 .map(|inner| {
3958 WithOptionValue::Sequence(
3959 inner
3960 .into_iter()
3961 .map(WithOptionValue::UnresolvedItemName)
3962 .collect_vec(),
3963 )
3964 });
3965
3966 Ok(SqlServerConfigOption {
3967 name: SqlServerConfigOptionName::ExcludeColumns,
3968 value,
3969 })
3970 }
3971 _ => unreachable!(),
3972 }
3973 }
3974
3975 fn parse_load_generator_option(&mut self) -> Result<LoadGeneratorOption<Raw>, ParserError> {
3976 let name = match self.expect_one_of_keywords(&[
3977 AS,
3978 UP,
3979 SCALE,
3980 TICK,
3981 MAX,
3982 KEYS,
3983 SNAPSHOT,
3984 TRANSACTIONAL,
3985 VALUE,
3986 SEED,
3987 PARTITIONS,
3988 BATCH,
3989 ])? {
3990 AS => {
3991 self.expect_keyword(OF)?;
3992 LoadGeneratorOptionName::AsOf
3993 }
3994 UP => {
3995 self.expect_keyword(TO)?;
3996 LoadGeneratorOptionName::UpTo
3997 }
3998 SCALE => {
3999 self.expect_keyword(FACTOR)?;
4000 LoadGeneratorOptionName::ScaleFactor
4001 }
4002 TICK => {
4003 self.expect_keyword(INTERVAL)?;
4004 LoadGeneratorOptionName::TickInterval
4005 }
4006 MAX => {
4007 self.expect_keyword(CARDINALITY)?;
4008 LoadGeneratorOptionName::MaxCardinality
4009 }
4010 KEYS => LoadGeneratorOptionName::Keys,
4011 SNAPSHOT => {
4012 self.expect_keyword(ROUNDS)?;
4013 LoadGeneratorOptionName::SnapshotRounds
4014 }
4015 TRANSACTIONAL => {
4016 self.expect_keyword(SNAPSHOT)?;
4017 LoadGeneratorOptionName::TransactionalSnapshot
4018 }
4019 VALUE => {
4020 self.expect_keyword(SIZE)?;
4021 LoadGeneratorOptionName::ValueSize
4022 }
4023 SEED => LoadGeneratorOptionName::Seed,
4024 PARTITIONS => LoadGeneratorOptionName::Partitions,
4025 BATCH => {
4026 self.expect_keyword(SIZE)?;
4027 LoadGeneratorOptionName::BatchSize
4028 }
4029 _ => unreachable!(),
4030 };
4031
4032 let _ = self.consume_token(&Token::Eq);
4033 Ok(LoadGeneratorOption {
4034 name,
4035 value: self.parse_optional_option_value()?,
4036 })
4037 }
4038
4039 fn parse_create_kafka_sink_connection(
4040 &mut self,
4041 ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4042 self.expect_keyword(CONNECTION)?;
4043
4044 let connection = self.parse_raw_name()?;
4045
4046 let options = if self.consume_token(&Token::LParen) {
4047 let options = self.parse_comma_separated(Parser::parse_kafka_sink_config_option)?;
4048 self.expect_token(&Token::RParen)?;
4049 options
4050 } else {
4051 vec![]
4052 };
4053
4054 let key =
4058 if self.peek_keyword(KEY) && self.peek_nth_token(1) != Some(Token::Keyword(FORMAT)) {
4059 let _ = self.expect_keyword(KEY);
4060 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4061
4062 let not_enforced = if self.peek_keywords(&[NOT, ENFORCED]) {
4063 self.expect_keywords(&[NOT, ENFORCED])?;
4064 true
4065 } else {
4066 false
4067 };
4068 Some(SinkKey {
4069 key_columns,
4070 not_enforced,
4071 })
4072 } else {
4073 None
4074 };
4075
4076 let headers = if self.parse_keyword(HEADERS) {
4077 Some(self.parse_identifier()?)
4078 } else {
4079 None
4080 };
4081
4082 Ok(CreateSinkConnection::Kafka {
4083 connection,
4084 options,
4085 key,
4086 headers,
4087 })
4088 }
4089
4090 fn parse_create_iceberg_sink_connection(
4091 &mut self,
4092 ) -> Result<CreateSinkConnection<Raw>, ParserError> {
4093 self.expect_keyword(CONNECTION)?;
4094 let catalog_connection = self.parse_raw_name()?;
4095
4096 let options = if self.consume_token(&Token::LParen) {
4097 let options = self.parse_comma_separated(Parser::parse_iceberg_sink_config_option)?;
4098 self.expect_token(&Token::RParen)?;
4099 options
4100 } else {
4101 vec![]
4102 };
4103
4104 let aws_connection = if self.parse_keywords(&[USING, AWS, CONNECTION]) {
4105 Some(self.parse_raw_name()?)
4106 } else {
4107 None
4108 };
4109
4110 let key = if self.parse_keyword(KEY) {
4111 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
4112
4113 let not_enforced = self.parse_keywords(&[NOT, ENFORCED]);
4114 Some(SinkKey {
4115 key_columns,
4116 not_enforced,
4117 })
4118 } else {
4119 None
4120 };
4121
4122 Ok(CreateSinkConnection::Iceberg {
4123 catalog_connection,
4124 aws_connection,
4125 key,
4126 options,
4127 })
4128 }
4129
4130 fn parse_create_sink_connection(&mut self) -> Result<CreateSinkConnection<Raw>, ParserError> {
4131 match self.expect_one_of_keywords(&[KAFKA, ICEBERG])? {
4132 KAFKA => self.parse_create_kafka_sink_connection(),
4133 ICEBERG => {
4134 self.expect_keyword(CATALOG)?;
4135 self.parse_create_iceberg_sink_connection()
4136 }
4137 _ => unreachable!(),
4138 }
4139 }
4140
4141 fn parse_create_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4142 let mut if_exists = if self.parse_keyword(OR) {
4143 self.expect_keyword(REPLACE)?;
4144 IfExistsBehavior::Replace
4145 } else {
4146 IfExistsBehavior::Error
4147 };
4148 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
4149 self.expect_keyword(VIEW)?;
4150 if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4151 if_exists = IfExistsBehavior::Skip;
4152 }
4153
4154 let definition = self.parse_view_definition()?;
4155 Ok(Statement::CreateView(CreateViewStatement {
4156 temporary,
4157 if_exists,
4158 definition,
4159 }))
4160 }
4161
4162 fn parse_view_definition(&mut self) -> Result<ViewDefinition<Raw>, ParserError> {
4163 let name = self.parse_item_name()?;
4165 let columns = self.parse_parenthesized_column_list(Optional)?;
4166 self.expect_keyword(AS)?;
4168 let query = self.parse_query()?;
4169 Ok(ViewDefinition {
4171 name,
4172 columns,
4173 query,
4174 })
4175 }
4176
4177 fn parse_create_materialized_view(&mut self) -> Result<Statement<Raw>, ParserError> {
4178 let mut if_exists = if self.parse_keyword(OR) {
4179 self.expect_keyword(REPLACE)?;
4180 IfExistsBehavior::Replace
4181 } else {
4182 IfExistsBehavior::Error
4183 };
4184 let replacement = self.parse_keyword(REPLACEMENT);
4185 self.expect_keywords(&[MATERIALIZED, VIEW])?;
4186 if if_exists == IfExistsBehavior::Error && self.parse_if_not_exists()? {
4187 if_exists = IfExistsBehavior::Skip;
4188 }
4189
4190 let name = self.parse_item_name()?;
4191 let columns = self.parse_parenthesized_column_list(Optional)?;
4192 let replacement_for = if replacement {
4193 self.expect_keyword(FOR)?;
4194 Some(self.parse_raw_name()?)
4195 } else {
4196 None
4197 };
4198 let (in_cluster, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
4199 let cluster = self.parse_raw_ident()?;
4200 let replica = if self.parse_keyword(REPLICA) {
4201 Some(self.parse_identifier()?)
4202 } else {
4203 None
4204 };
4205 (Some(cluster), replica)
4206 } else if self.parse_keywords(&[IN, REPLICA]) {
4207 let replica = self.parse_identifier()?;
4208 (None, Some(replica))
4209 } else {
4210 (None, None)
4211 };
4212
4213 let with_options = if self.parse_keyword(WITH) {
4214 self.expect_token(&Token::LParen)?;
4215 let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
4216 self.expect_token(&Token::RParen)?;
4217 options
4218 } else {
4219 vec![]
4220 };
4221
4222 self.expect_keyword(AS)?;
4223 let query = self.parse_query()?;
4224 let as_of = self.parse_optional_internal_as_of()?;
4225
4226 Ok(Statement::CreateMaterializedView(
4227 CreateMaterializedViewStatement {
4228 if_exists,
4229 name,
4230 columns,
4231 replacement_for,
4232 in_cluster,
4233 in_cluster_replica,
4234 query,
4235 as_of,
4236 with_options,
4237 },
4238 ))
4239 }
4240
4241 fn parse_materialized_view_option_name(
4242 &mut self,
4243 ) -> Result<MaterializedViewOptionName, ParserError> {
4244 let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4245 let name = match option {
4246 ASSERT => {
4247 self.expect_keywords(&[NOT, NULL])?;
4248 MaterializedViewOptionName::AssertNotNull
4249 }
4250 PARTITION => {
4251 self.expect_keyword(BY)?;
4252 MaterializedViewOptionName::PartitionBy
4253 }
4254 RETAIN => {
4255 self.expect_keyword(HISTORY)?;
4256 MaterializedViewOptionName::RetainHistory
4257 }
4258 REFRESH => MaterializedViewOptionName::Refresh,
4259 _ => unreachable!(),
4260 };
4261 Ok(name)
4262 }
4263
4264 fn parse_materialized_view_option(
4265 &mut self,
4266 ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4267 let name = self.parse_materialized_view_option_name()?;
4268 let value = match name {
4269 MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4270 MaterializedViewOptionName::Refresh => {
4271 Some(self.parse_materialized_view_refresh_option_value()?)
4272 }
4273 _ => self.parse_optional_option_value()?,
4274 };
4275 Ok(MaterializedViewOption { name, value })
4276 }
4277
4278 fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4279 Ok(Some(self.parse_retain_history()?))
4280 }
4281
4282 fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4283 let _ = self.consume_token(&Token::Eq);
4284 self.expect_keyword(FOR)?;
4285 let value = self.parse_value()?;
4286 Ok(WithOptionValue::RetainHistoryFor(value))
4287 }
4288
4289 fn parse_materialized_view_refresh_option_value(
4290 &mut self,
4291 ) -> Result<WithOptionValue<Raw>, ParserError> {
4292 let _ = self.consume_token(&Token::Eq);
4293
4294 match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4295 ON => {
4296 self.expect_keyword(COMMIT)?;
4297 Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4298 }
4299 AT => {
4300 if self.parse_keyword(CREATION) {
4301 Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4302 } else {
4303 Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4304 RefreshAtOptionValue {
4305 time: self.parse_expr()?,
4306 },
4307 )))
4308 }
4309 }
4310 EVERY => {
4311 let interval = self.parse_interval_value()?;
4312 let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4313 Some(self.parse_expr()?)
4314 } else {
4315 None
4316 };
4317 Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4318 RefreshEveryOptionValue {
4319 interval,
4320 aligned_to,
4321 },
4322 )))
4323 }
4324 _ => unreachable!(),
4325 }
4326 }
4327
4328 fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4329 let default_index = self.parse_keyword(DEFAULT);
4330 self.expect_keyword(INDEX)?;
4331
4332 let if_not_exists = self.parse_if_not_exists()?;
4333 let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4334 if if_not_exists && !default_index {
4335 return self.expected(self.peek_pos(), "index name", self.peek_token());
4336 }
4337 None
4338 } else {
4339 Some(self.parse_identifier()?)
4340 };
4341 let in_cluster = self.parse_optional_in_cluster()?;
4342 self.expect_keyword(ON)?;
4343 let on_name = self.parse_raw_name()?;
4344
4345 if self.parse_keyword(USING) {
4347 self.expect_keyword(ARRANGEMENT)?;
4348 }
4349
4350 let key_parts = if default_index {
4351 None
4352 } else {
4353 self.expect_token(&Token::LParen)?;
4354 if self.consume_token(&Token::RParen) {
4355 Some(vec![])
4356 } else {
4357 let key_parts = self
4358 .parse_comma_separated(Parser::parse_order_by_expr)?
4359 .into_iter()
4360 .map(|x| x.expr)
4361 .collect::<Vec<_>>();
4362 self.expect_token(&Token::RParen)?;
4363 Some(key_parts)
4364 }
4365 };
4366
4367 let with_options = if self.parse_keyword(WITH) {
4368 self.expect_token(&Token::LParen)?;
4369 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4370 vec![]
4371 } else {
4372 self.parse_comma_separated(Parser::parse_index_option)?
4373 };
4374 self.expect_token(&Token::RParen)?;
4375 o
4376 } else {
4377 vec![]
4378 };
4379
4380 Ok(Statement::CreateIndex(CreateIndexStatement {
4381 name,
4382 in_cluster,
4383 on_name,
4384 key_parts,
4385 with_options,
4386 if_not_exists,
4387 }))
4388 }
4389
4390 fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4391 if self.parse_keyword(REDACTED) {
4394 return Ok(TableOptionName::RedactedTest);
4395 }
4396 let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4397 PARTITION => {
4398 self.expect_keyword(BY)?;
4399 TableOptionName::PartitionBy
4400 }
4401 RETAIN => {
4402 self.expect_keyword(HISTORY)?;
4403 TableOptionName::RetainHistory
4404 }
4405 _ => unreachable!(),
4406 };
4407 Ok(name)
4408 }
4409
4410 fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4411 let name = self.parse_table_option_name()?;
4412 let value = match name {
4413 TableOptionName::PartitionBy => self.parse_optional_option_value(),
4414 TableOptionName::RetainHistory => self.parse_option_retain_history(),
4415 TableOptionName::RedactedTest => self.parse_optional_option_value(),
4416 }?;
4417 Ok(TableOption { name, value })
4418 }
4419
4420 fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4421 self.expect_keywords(&[RETAIN, HISTORY])?;
4422 Ok(IndexOptionName::RetainHistory)
4423 }
4424
4425 fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4426 let name = self.parse_index_option_name()?;
4427 let value = match name {
4428 IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4429 }?;
4430 Ok(IndexOption { name, value })
4431 }
4432
4433 fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4434 if self.consume_token(&Token::LBracket) {
4435 let id = self.parse_raw_ident_str()?;
4436 self.expect_token(&Token::RBracket)?;
4437 Ok(RawClusterName::Resolved(id))
4438 } else {
4439 Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4440 }
4441 }
4442
4443 fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4444 if self.consume_token(&Token::LBracket) {
4445 let id = self.parse_raw_ident_str()?;
4446 self.expect_token(&Token::RBracket)?;
4447 Ok(RawNetworkPolicyName::Resolved(id))
4448 } else {
4449 Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4450 }
4451 }
4452
4453 fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4454 let id = match self.next_token() {
4455 Some(Token::Ident(id)) => id.into_inner(),
4456 Some(Token::Number(n)) => n,
4457 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
4458 };
4459 if id.is_empty() {
4462 return parser_err!(self, self.peek_prev_pos(), "expected id");
4463 }
4464 Ok(id)
4465 }
4466
4467 fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4468 if self.parse_keywords(&[IN, CLUSTER]) {
4469 Ok(Some(self.parse_raw_ident()?))
4470 } else {
4471 Ok(None)
4472 }
4473 }
4474
4475 fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4476 self.expect_keyword(ROLE)?;
4477 let name = self.parse_identifier()?;
4478 let _ = self.parse_keyword(WITH);
4479 let options = self.parse_role_attributes()?;
4480 Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4481 }
4482
4483 fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4484 let mut options = vec![];
4485 loop {
4486 match self.parse_one_of_keywords(&[
4487 SUPERUSER,
4488 NOSUPERUSER,
4489 LOGIN,
4490 NOLOGIN,
4491 INHERIT,
4492 NOINHERIT,
4493 CREATECLUSTER,
4494 NOCREATECLUSTER,
4495 CREATEDB,
4496 NOCREATEDB,
4497 CREATEROLE,
4498 NOCREATEROLE,
4499 PASSWORD,
4500 ]) {
4501 None => break,
4502 Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4503 Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4504 Some(LOGIN) => options.push(RoleAttribute::Login),
4505 Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4506 Some(INHERIT) => options.push(RoleAttribute::Inherit),
4507 Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4508 Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4509 Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4510 Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4511 Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4512 Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4513 Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4514 Some(PASSWORD) => {
4515 if self.parse_keyword(NULL) {
4516 options.push(RoleAttribute::Password(None));
4517 continue;
4518 }
4519 let password = self.parse_literal_string()?;
4520 options.push(RoleAttribute::Password(Some(password)));
4521 }
4522 Some(_) => unreachable!(),
4523 }
4524 }
4525 Ok(options)
4526 }
4527
4528 fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4529 self.expect_keyword(SECRET)?;
4530 let if_not_exists = self.parse_if_not_exists()?;
4531 let name = self.parse_item_name()?;
4532 self.expect_keyword(AS)?;
4533 let value = self.parse_expr()?;
4534 Ok(Statement::CreateSecret(CreateSecretStatement {
4535 name,
4536 if_not_exists,
4537 value,
4538 }))
4539 }
4540
4541 fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4542 self.expect_keyword(TYPE)?;
4543 let name = self.parse_item_name()?;
4544 self.expect_keyword(AS)?;
4545
4546 match self.parse_one_of_keywords(&[LIST, MAP]) {
4547 Some(LIST) => {
4548 self.expect_token(&Token::LParen)?;
4549 let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4550 self.expect_token(&Token::RParen)?;
4551 Ok(Statement::CreateType(CreateTypeStatement {
4552 name,
4553 as_type: CreateTypeAs::List { options },
4554 }))
4555 }
4556 Some(MAP) => {
4557 self.expect_token(&Token::LParen)?;
4558 let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4559 self.expect_token(&Token::RParen)?;
4560 Ok(Statement::CreateType(CreateTypeStatement {
4561 name,
4562 as_type: CreateTypeAs::Map { options },
4563 }))
4564 }
4565 None => {
4566 let column_defs = self.parse_composite_type_definition()?;
4567
4568 Ok(Statement::CreateType(CreateTypeStatement {
4569 name,
4570 as_type: CreateTypeAs::Record { column_defs },
4571 }))
4572 }
4573 _ => unreachable!(),
4574 }
4575 }
4576
4577 fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4578 self.expect_keywords(&[ELEMENT, TYPE])?;
4579 let name = CreateTypeListOptionName::ElementType;
4580 Ok(CreateTypeListOption {
4581 name,
4582 value: Some(self.parse_data_type_option_value()?),
4583 })
4584 }
4585
4586 fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4587 let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4588 KEY => {
4589 self.expect_keyword(TYPE)?;
4590 CreateTypeMapOptionName::KeyType
4591 }
4592 VALUE => {
4593 self.expect_keyword(TYPE)?;
4594 CreateTypeMapOptionName::ValueType
4595 }
4596 _ => unreachable!(),
4597 };
4598 Ok(CreateTypeMapOption {
4599 name,
4600 value: Some(self.parse_data_type_option_value()?),
4601 })
4602 }
4603
4604 fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4605 let if_not_exists = self.parse_if_not_exists()?;
4606 let name = self.parse_identifier()?;
4607 let paren = self.consume_token(&Token::LParen);
4610 let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4611 if paren {
4612 self.expect_token(&Token::RParen)?;
4613 }
4614
4615 let features = if self.parse_keywords(&[FEATURES]) {
4616 self.expect_token(&Token::LParen)?;
4617 let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4618 self.expect_token(&Token::RParen)?;
4619 features
4620 } else {
4621 Vec::new()
4622 };
4623
4624 Ok(Statement::CreateCluster(CreateClusterStatement {
4625 name,
4626 options,
4627 features,
4628 if_not_exists,
4629 }))
4630 }
4631
4632 fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4633 let option = self.expect_one_of_keywords(&[
4634 AUTO,
4635 AVAILABILITY,
4636 DISK,
4637 EXPERIMENTAL,
4638 INTROSPECTION,
4639 MANAGED,
4640 REPLICAS,
4641 REPLICATION,
4642 SIZE,
4643 SCHEDULE,
4644 WORKLOAD,
4645 ])?;
4646 let name = match option {
4647 AUTO => {
4648 self.expect_keywords(&[SCALING, STRATEGY])?;
4649 ClusterOptionName::AutoScalingStrategy
4650 }
4651 AVAILABILITY => {
4652 self.expect_keyword(ZONES)?;
4653 ClusterOptionName::AvailabilityZones
4654 }
4655 DISK => ClusterOptionName::Disk,
4656 EXPERIMENTAL => {
4657 self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4658 ClusterOptionName::ExperimentalArrangementCompression
4659 }
4660 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4661 DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4662 INTERVAL => ClusterOptionName::IntrospectionInterval,
4663 _ => unreachable!(),
4664 },
4665 MANAGED => ClusterOptionName::Managed,
4666 REPLICAS => ClusterOptionName::Replicas,
4667 REPLICATION => {
4668 self.expect_keyword(FACTOR)?;
4669 ClusterOptionName::ReplicationFactor
4670 }
4671 SIZE => ClusterOptionName::Size,
4672 SCHEDULE => ClusterOptionName::Schedule,
4673 WORKLOAD => {
4674 self.expect_keyword(CLASS)?;
4675 ClusterOptionName::WorkloadClass
4676 }
4677 _ => unreachable!(),
4678 };
4679 Ok(name)
4680 }
4681
4682 fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4683 let name = self.parse_cluster_option_name()?;
4684
4685 match name {
4686 ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4687 ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4688 ClusterOptionName::AutoScalingStrategy => {
4689 self.parse_cluster_option_auto_scaling_strategy()
4690 }
4691 _ => {
4692 let value = self.parse_optional_option_value()?;
4693 Ok(ClusterOption { name, value })
4694 }
4695 }
4696 }
4697
4698 fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4699 let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4700 WAIT => {
4701 let _ = self.consume_token(&Token::Eq);
4702 let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4703 FOR => Some(WithOptionValue::ClusterAlterStrategy(
4704 ClusterAlterOptionValue::For(self.parse_value()?),
4705 )),
4706 UNTIL => {
4707 self.expect_keyword(READY)?;
4708 let _ = self.consume_token(&Token::Eq);
4709 self.expect_token(&Token::LParen)?;
4710 let opts = Some(WithOptionValue::ClusterAlterStrategy(
4711 ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4712 Parser::parse_cluster_alter_until_ready_option,
4713 )?),
4714 ));
4715 self.expect_token(&Token::RParen)?;
4716 opts
4717 }
4718 _ => unreachable!(),
4719 };
4720 (ClusterAlterOptionName::Wait, v)
4721 }
4722 _ => unreachable!(),
4723 };
4724 Ok(ClusterAlterOption { name, value })
4725 }
4726
4727 fn parse_cluster_alter_until_ready_option(
4728 &mut self,
4729 ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4730 let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4731 ON => {
4732 self.expect_keywords(&[TIMEOUT])?;
4733 ClusterAlterUntilReadyOptionName::OnTimeout
4734 }
4735 TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4736 _ => unreachable!(),
4737 };
4738 let value = self.parse_optional_option_value()?;
4739 Ok(ClusterAlterUntilReadyOption { name, value })
4740 }
4741
4742 fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4743 let _ = self.consume_token(&Token::Eq);
4744 self.expect_token(&Token::LParen)?;
4745 let replicas = if self.consume_token(&Token::RParen) {
4746 vec![]
4747 } else {
4748 let replicas = self.parse_comma_separated(|parser| {
4749 let name = parser.parse_identifier()?;
4750 parser.expect_token(&Token::LParen)?;
4751 let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4752 parser.expect_token(&Token::RParen)?;
4753 Ok(ReplicaDefinition { name, options })
4754 })?;
4755 self.expect_token(&Token::RParen)?;
4756 replicas
4757 };
4758 Ok(ClusterOption {
4759 name: ClusterOptionName::Replicas,
4760 value: Some(WithOptionValue::ClusterReplicas(replicas)),
4761 })
4762 }
4763
4764 fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4765 let _ = self.consume_token(&Token::Eq);
4766 let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4767 let value = match kw {
4768 MANUAL => ClusterScheduleOptionValue::Manual,
4769 ON => {
4770 self.expect_keyword(REFRESH)?;
4771 let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4773 self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4774 let _ = self.consume_token(&Token::Eq);
4775 let interval = self.parse_interval_value()?;
4776 self.expect_token(&Token::RParen)?;
4777 Some(interval)
4778 } else {
4779 None
4780 };
4781 ClusterScheduleOptionValue::Refresh {
4782 hydration_time_estimate,
4783 }
4784 }
4785 _ => unreachable!(),
4786 };
4787 Ok(ClusterOption {
4788 name: ClusterOptionName::Schedule,
4789 value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4790 })
4791 }
4792
4793 fn parse_cluster_option_auto_scaling_strategy(
4798 &mut self,
4799 ) -> Result<ClusterOption<Raw>, ParserError> {
4800 let _ = self.consume_token(&Token::Eq);
4801 self.expect_token(&Token::LParen)?;
4802 let mut value = ClusterAutoScalingStrategyOptionValue { on_hydration: None };
4803 if !self.consume_token(&Token::RParen) {
4804 loop {
4807 self.expect_keywords(&[ON, HYDRATION])?;
4808 self.expect_token(&Token::LParen)?;
4809 self.expect_keywords(&[HYDRATION, SIZE])?;
4810 let _ = self.consume_token(&Token::Eq);
4811 let hydration_size = self.parse_value()?;
4812 let linger_duration = if self.consume_token(&Token::Comma) {
4813 self.expect_keywords(&[LINGER, DURATION])?;
4814 let _ = self.consume_token(&Token::Eq);
4815 Some(self.parse_value()?)
4816 } else {
4817 None
4818 };
4819 self.expect_token(&Token::RParen)?;
4820 if value.on_hydration.is_some() {
4823 return parser_err!(
4824 self,
4825 self.peek_prev_pos(),
4826 "ON HYDRATION specified more than once"
4827 );
4828 }
4829 value.on_hydration = Some(OnHydrationOptionValue {
4830 hydration_size,
4831 linger_duration,
4832 });
4833 if !self.consume_token(&Token::Comma) {
4834 break;
4835 }
4836 }
4837 self.expect_token(&Token::RParen)?;
4838 }
4839 Ok(ClusterOption {
4840 name: ClusterOptionName::AutoScalingStrategy,
4841 value: Some(WithOptionValue::ClusterAutoScalingStrategyOptionValue(
4842 value,
4843 )),
4844 })
4845 }
4846
4847 fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4848 let name = match self.expect_one_of_keywords(&[
4849 AVAILABILITY,
4850 BILLED,
4851 COMPUTE,
4852 COMPUTECTL,
4853 DISK,
4854 EXPERIMENTAL,
4855 INTERNAL,
4856 INTROSPECTION,
4857 SIZE,
4858 STORAGE,
4859 STORAGECTL,
4860 WORKERS,
4861 ])? {
4862 AVAILABILITY => {
4863 self.expect_keyword(ZONE)?;
4864 ReplicaOptionName::AvailabilityZone
4865 }
4866 BILLED => {
4867 self.expect_keyword(AS)?;
4868 ReplicaOptionName::BilledAs
4869 }
4870 COMPUTE => {
4871 self.expect_keyword(ADDRESSES)?;
4872 ReplicaOptionName::ComputeAddresses
4873 }
4874 COMPUTECTL => {
4875 self.expect_keyword(ADDRESSES)?;
4876 ReplicaOptionName::ComputectlAddresses
4877 }
4878 DISK => ReplicaOptionName::Disk,
4879 EXPERIMENTAL => {
4880 self.expect_keywords(&[ARRANGEMENT, COMPRESSION])?;
4881 ReplicaOptionName::ExperimentalArrangementCompression
4882 }
4883 INTERNAL => ReplicaOptionName::Internal,
4884 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4885 DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4886 INTERVAL => ReplicaOptionName::IntrospectionInterval,
4887 _ => unreachable!(),
4888 },
4889 SIZE => ReplicaOptionName::Size,
4890 STORAGE => {
4891 self.expect_keyword(ADDRESSES)?;
4892 ReplicaOptionName::StorageAddresses
4893 }
4894 STORAGECTL => {
4895 self.expect_keyword(ADDRESSES)?;
4896 ReplicaOptionName::StoragectlAddresses
4897 }
4898 WORKERS => ReplicaOptionName::Workers,
4899 _ => unreachable!(),
4900 };
4901 let value = self.parse_optional_option_value()?;
4902 Ok(ReplicaOption { name, value })
4903 }
4904
4905 fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4906 Ok(ClusterFeature {
4907 name: self.parse_cluster_feature_name()?,
4908 value: self.parse_optional_option_value()?,
4909 })
4910 }
4911
4912 fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4913 self.next_token();
4914 let if_not_exists = self.parse_if_not_exists()?;
4915 let of_cluster = self.parse_identifier()?;
4916 self.expect_token(&Token::Dot)?;
4917 let name = self.parse_identifier()?;
4918 let paren = self.consume_token(&Token::LParen);
4921 let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4922 if paren {
4923 let _ = self.consume_token(&Token::RParen);
4924 }
4925 Ok(Statement::CreateClusterReplica(
4926 CreateClusterReplicaStatement {
4927 of_cluster,
4928 definition: ReplicaDefinition { name, options },
4929 if_not_exists,
4930 },
4931 ))
4932 }
4933
4934 fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4935 if self.parse_keyword(IF) {
4936 self.expect_keyword(EXISTS)?;
4937 Ok(true)
4938 } else {
4939 Ok(false)
4940 }
4941 }
4942
4943 fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4944 if self.parse_keyword(IF) {
4945 self.expect_keywords(&[NOT, EXISTS])?;
4946 Ok(true)
4947 } else {
4948 Ok(false)
4949 }
4950 }
4951
4952 fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4953 self.parse_keyword(AS)
4954 .then(|| self.parse_identifier())
4955 .transpose()
4956 }
4957
4958 fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
4959 if self.parse_keyword(INCLUDE) {
4960 self.parse_comma_separated(|parser| {
4961 let metadata = match parser
4962 .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
4963 {
4964 KEY => SourceIncludeMetadata::Key {
4965 alias: parser.parse_alias()?,
4966 },
4967 TIMESTAMP => SourceIncludeMetadata::Timestamp {
4968 alias: parser.parse_alias()?,
4969 },
4970 PARTITION => SourceIncludeMetadata::Partition {
4971 alias: parser.parse_alias()?,
4972 },
4973 OFFSET => SourceIncludeMetadata::Offset {
4974 alias: parser.parse_alias()?,
4975 },
4976 HEADERS => SourceIncludeMetadata::Headers {
4977 alias: parser.parse_alias()?,
4978 },
4979 HEADER => {
4980 let key: String = parser.parse_literal_string()?;
4981 parser.expect_keyword(AS)?;
4982 let alias = parser.parse_identifier()?;
4983 let use_bytes = parser.parse_keyword(BYTES);
4984 SourceIncludeMetadata::Header {
4985 alias,
4986 key,
4987 use_bytes,
4988 }
4989 }
4990 _ => unreachable!("only explicitly allowed items can be parsed"),
4991 };
4992 Ok(metadata)
4993 })
4994 } else {
4995 Ok(vec![])
4996 }
4997 }
4998
4999 fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
5000 let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
5001 ALL => DiscardTarget::All,
5002 PLANS => DiscardTarget::Plans,
5003 SEQUENCES => DiscardTarget::Sequences,
5004 TEMP | TEMPORARY => DiscardTarget::Temp,
5005 _ => unreachable!(),
5006 };
5007 Ok(Statement::Discard(DiscardStatement { target }))
5008 }
5009
5010 fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5011 if self.parse_keyword(OWNED) {
5012 self.parse_drop_owned()
5013 .map_parser_err(StatementKind::DropOwned)
5014 } else {
5015 self.parse_drop_objects()
5016 .map_parser_err(StatementKind::DropObjects)
5017 }
5018 }
5019
5020 fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
5021 let object_type = self.expect_object_type()?;
5022 let if_exists = self.parse_if_exists()?;
5023 match object_type {
5024 ObjectType::Database => {
5025 let name = UnresolvedObjectName::Database(self.parse_database_name()?);
5026 let restrict = matches!(
5027 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5028 Some(RESTRICT),
5029 );
5030 Ok(Statement::DropObjects(DropObjectsStatement {
5031 object_type: ObjectType::Database,
5032 if_exists,
5033 names: vec![name],
5034 cascade: !restrict,
5035 }))
5036 }
5037 ObjectType::Schema => {
5038 let names = self.parse_comma_separated(|parser| {
5039 Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
5040 })?;
5041
5042 let cascade = matches!(
5043 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5044 Some(CASCADE),
5045 );
5046 Ok(Statement::DropObjects(DropObjectsStatement {
5047 object_type: ObjectType::Schema,
5048 if_exists,
5049 names,
5050 cascade,
5051 }))
5052 }
5053 ObjectType::Role => {
5054 let names = self.parse_comma_separated(|parser| {
5055 Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
5056 })?;
5057 Ok(Statement::DropObjects(DropObjectsStatement {
5058 object_type: ObjectType::Role,
5059 if_exists,
5060 names,
5061 cascade: false,
5062 }))
5063 }
5064 ObjectType::NetworkPolicy => {
5065 let names = self.parse_comma_separated(|parser| {
5066 Ok(UnresolvedObjectName::NetworkPolicy(
5067 parser.parse_identifier()?,
5068 ))
5069 })?;
5070 Ok(Statement::DropObjects(DropObjectsStatement {
5071 object_type: ObjectType::NetworkPolicy,
5072 if_exists,
5073 names,
5074 cascade: false,
5075 }))
5076 }
5077 ObjectType::Cluster => self.parse_drop_clusters(if_exists),
5078 ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
5079 ObjectType::Table
5080 | ObjectType::View
5081 | ObjectType::MaterializedView
5082 | ObjectType::Source
5083 | ObjectType::Sink
5084 | ObjectType::MetricSink
5085 | ObjectType::Index
5086 | ObjectType::Type
5087 | ObjectType::Secret
5088 | ObjectType::Connection => {
5089 let names = self.parse_comma_separated(|parser| {
5090 Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
5091 })?;
5092 let cascade = matches!(
5093 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5094 Some(CASCADE),
5095 );
5096 Ok(Statement::DropObjects(DropObjectsStatement {
5097 object_type,
5098 if_exists,
5099 names,
5100 cascade,
5101 }))
5102 }
5103 ObjectType::Func | ObjectType::Subsource => parser_err!(
5104 self,
5105 self.peek_prev_pos(),
5106 format!("Unsupported DROP on {object_type}")
5107 ),
5108 }
5109 }
5110
5111 fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
5112 let names = self.parse_comma_separated(|parser| {
5113 Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
5114 })?;
5115 let cascade = matches!(
5116 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
5117 Some(CASCADE),
5118 );
5119 Ok(Statement::DropObjects(DropObjectsStatement {
5120 object_type: ObjectType::Cluster,
5121 if_exists,
5122 names,
5123 cascade,
5124 }))
5125 }
5126
5127 fn parse_drop_cluster_replicas(
5128 &mut self,
5129 if_exists: bool,
5130 ) -> Result<Statement<Raw>, ParserError> {
5131 let names = self.parse_comma_separated(|p| {
5132 Ok(UnresolvedObjectName::ClusterReplica(
5133 p.parse_cluster_replica_name()?,
5134 ))
5135 })?;
5136 Ok(Statement::DropObjects(DropObjectsStatement {
5137 object_type: ObjectType::ClusterReplica,
5138 if_exists,
5139 names,
5140 cascade: false,
5141 }))
5142 }
5143
5144 fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5145 self.expect_keyword(BY)?;
5146 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5147 let cascade = if self.parse_keyword(CASCADE) {
5148 Some(true)
5149 } else if self.parse_keyword(RESTRICT) {
5150 Some(false)
5151 } else {
5152 None
5153 };
5154 Ok(Statement::DropOwned(DropOwnedStatement {
5155 role_names,
5156 cascade,
5157 }))
5158 }
5159
5160 fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5161 let cluster = self.parse_identifier()?;
5162 self.expect_token(&Token::Dot)?;
5163 let replica = self.parse_identifier()?;
5164 Ok(QualifiedReplica { cluster, replica })
5165 }
5166
5167 fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5168 let name = self.parse_identifier()?;
5169 self.expect_keyword(SET)?;
5170 self.expect_token(&Token::LParen)?;
5171 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5172 self.expect_token(&Token::RParen)?;
5173 Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5174 name,
5175 options,
5176 }))
5177 }
5178
5179 fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5180 self.expect_keywords(&[NETWORK, POLICY])?;
5181 let name = self.parse_identifier()?;
5182 self.expect_token(&Token::LParen)?;
5183 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5184 self.expect_token(&Token::RParen)?;
5185 Ok(Statement::CreateNetworkPolicy(
5186 CreateNetworkPolicyStatement { name, options },
5187 ))
5188 }
5189
5190 fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5191 let name = match self.expect_one_of_keywords(&[RULES])? {
5192 RULES => NetworkPolicyOptionName::Rules,
5193 v => panic!("found unreachable keyword {}", v),
5194 };
5195 match name {
5196 NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5197 }
5198 }
5199
5200 fn parse_network_policy_option_rules(
5201 &mut self,
5202 ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5203 let _ = self.consume_token(&Token::Eq);
5204 self.expect_token(&Token::LParen)?;
5205 let rules = if self.consume_token(&Token::RParen) {
5206 vec![]
5207 } else {
5208 let rules = self.parse_comma_separated(|parser| {
5209 let name = parser.parse_identifier()?;
5210 parser.expect_token(&Token::LParen)?;
5211 let options =
5212 parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5213 parser.expect_token(&Token::RParen)?;
5214 Ok(NetworkPolicyRuleDefinition { name, options })
5215 })?;
5216 self.expect_token(&Token::RParen)?;
5217 rules
5218 };
5219 Ok(NetworkPolicyOption {
5220 name: NetworkPolicyOptionName::Rules,
5221 value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5222 })
5223 }
5224
5225 fn parse_network_policy_rule_option(
5226 &mut self,
5227 ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5228 let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5229 ACTION => NetworkPolicyRuleOptionName::Action,
5230 ADDRESS => NetworkPolicyRuleOptionName::Address,
5231 DIRECTION => NetworkPolicyRuleOptionName::Direction,
5232 v => panic!("found unreachable keyword {}", v),
5233 };
5234 let value = self.parse_optional_option_value()?;
5235 Ok(NetworkPolicyRuleOption { name, value })
5236 }
5237
5238 fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5239 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5240 self.expect_keyword(TABLE)?;
5241 let if_not_exists = self.parse_if_not_exists()?;
5242 let table_name = self.parse_item_name()?;
5243 let (columns, constraints) = self.parse_columns(Mandatory)?;
5245
5246 let with_options = if self.parse_keyword(WITH) {
5247 self.expect_token(&Token::LParen)?;
5248 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5249 vec![]
5250 } else {
5251 self.parse_comma_separated(Parser::parse_table_option)?
5252 };
5253 self.expect_token(&Token::RParen)?;
5254 o
5255 } else {
5256 vec![]
5257 };
5258
5259 Ok(Statement::CreateTable(CreateTableStatement {
5260 name: table_name,
5261 columns,
5262 constraints,
5263 if_not_exists,
5264 temporary,
5265 with_options,
5266 }))
5267 }
5268
5269 fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5270 if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5271 return parser_err!(
5272 self,
5273 self.peek_prev_pos(),
5274 "temporary tables FROM SOURCE are not supported"
5275 );
5276 }
5277 self.expect_keyword(TABLE)?;
5278 let if_not_exists = self.parse_if_not_exists()?;
5279 let table_name = self.parse_item_name()?;
5280
5281 if self.parse_keywords(&[FROM, WEBHOOK]) {
5282 return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5284 }
5285
5286 let (columns, constraints) = self.parse_table_from_source_columns()?;
5287
5288 self.expect_keywords(&[FROM, SOURCE])?;
5289
5290 let source = self.parse_raw_name()?;
5291
5292 let external_reference = if self.consume_token(&Token::LParen) {
5293 self.expect_keyword(REFERENCE)?;
5294 let _ = self.consume_token(&Token::Eq);
5295 let external_reference = self.parse_item_name()?;
5296 self.expect_token(&Token::RParen)?;
5297 Some(external_reference)
5298 } else {
5299 None
5300 };
5301
5302 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5303 Some(KEY) => {
5304 self.expect_keyword(FORMAT)?;
5305 let key = self.parse_format()?;
5306 self.expect_keywords(&[VALUE, FORMAT])?;
5307 let value = self.parse_format()?;
5308 Some(FormatSpecifier::KeyValue { key, value })
5309 }
5310 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5311 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5312 None => None,
5313 };
5314 let include_metadata = self.parse_source_include_metadata()?;
5315
5316 let envelope = if self.parse_keyword(ENVELOPE) {
5317 Some(self.parse_source_envelope()?)
5318 } else {
5319 None
5320 };
5321
5322 let with_options = if self.parse_keyword(WITH) {
5323 self.expect_token(&Token::LParen)?;
5324 let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5325 self.expect_token(&Token::RParen)?;
5326 options
5327 } else {
5328 vec![]
5329 };
5330
5331 Ok(Statement::CreateTableFromSource(
5332 CreateTableFromSourceStatement {
5333 name: table_name,
5334 columns,
5335 constraints,
5336 if_not_exists,
5337 source,
5338 external_reference,
5339 format,
5340 include_metadata,
5341 envelope,
5342 with_options,
5343 },
5344 ))
5345 }
5346
5347 fn parse_table_from_source_option(
5348 &mut self,
5349 ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5350 let option = match self
5351 .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5352 {
5353 ref keyword @ (TEXT | EXCLUDE) => {
5354 self.expect_keyword(COLUMNS)?;
5355
5356 let _ = self.consume_token(&Token::Eq);
5357
5358 let value = self
5359 .parse_option_sequence(Parser::parse_identifier)?
5360 .map(|inner| {
5361 WithOptionValue::Sequence(
5362 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5363 )
5364 });
5365
5366 TableFromSourceOption {
5367 name: match *keyword {
5368 TEXT => TableFromSourceOptionName::TextColumns,
5369 EXCLUDE => TableFromSourceOptionName::ExcludeColumns,
5370 _ => unreachable!(),
5371 },
5372 value,
5373 }
5374 }
5375 DETAILS => TableFromSourceOption {
5376 name: TableFromSourceOptionName::Details,
5377 value: self.parse_optional_option_value()?,
5378 },
5379 IGNORE => {
5380 self.expect_keyword(COLUMNS)?;
5381 let _ = self.consume_token(&Token::Eq);
5382
5383 let value = self
5384 .parse_option_sequence(Parser::parse_identifier)?
5385 .map(|inner| {
5386 WithOptionValue::Sequence(
5387 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5388 )
5389 });
5390 TableFromSourceOption {
5391 name: TableFromSourceOptionName::ExcludeColumns,
5393 value,
5394 }
5395 }
5396 PARTITION => {
5397 self.expect_keyword(BY)?;
5398 TableFromSourceOption {
5399 name: TableFromSourceOptionName::PartitionBy,
5400 value: self.parse_optional_option_value()?,
5401 }
5402 }
5403 RETAIN => {
5404 self.expect_keyword(HISTORY)?;
5405 TableFromSourceOption {
5406 name: TableFromSourceOptionName::RetainHistory,
5407 value: self.parse_option_retain_history()?,
5408 }
5409 }
5410 _ => unreachable!(),
5411 };
5412 Ok(option)
5413 }
5414
5415 fn parse_table_from_source_columns(
5416 &mut self,
5417 ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5418 let mut constraints = vec![];
5419
5420 if !self.consume_token(&Token::LParen) {
5421 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5422 }
5423 if self.consume_token(&Token::RParen) {
5424 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5426 }
5427
5428 let mut column_names = vec![];
5429 let mut column_defs = vec![];
5430 loop {
5431 if let Some(constraint) = self.parse_optional_table_constraint()? {
5432 constraints.push(constraint);
5433 } else if let Some(column_name) = self.consume_identifier()? {
5434 let next_token = self.peek_token();
5435 match next_token {
5436 Some(Token::Comma) | Some(Token::RParen) => {
5437 column_names.push(column_name);
5438 }
5439 _ => {
5440 let data_type = self.parse_data_type()?;
5441 let collation = if self.parse_keyword(COLLATE) {
5442 Some(self.parse_item_name()?)
5443 } else {
5444 None
5445 };
5446 let mut options = vec![];
5447 loop {
5448 match self.peek_token() {
5449 None | Some(Token::Comma) | Some(Token::RParen) => break,
5450 _ => options.push(self.parse_column_option_def()?),
5451 }
5452 }
5453
5454 column_defs.push(ColumnDef {
5455 name: column_name,
5456 data_type,
5457 collation,
5458 options,
5459 });
5460 }
5461 }
5462 } else {
5463 return self.expected(
5464 self.peek_pos(),
5465 "column name or constraint definition",
5466 self.peek_token(),
5467 );
5468 }
5469 if self.consume_token(&Token::Comma) {
5470 } else if self.consume_token(&Token::RParen) {
5472 break;
5473 } else {
5474 return self.expected(
5475 self.peek_pos(),
5476 "',' or ')' after column definition",
5477 self.peek_token(),
5478 );
5479 }
5480 }
5481 if !column_defs.is_empty() && !column_names.is_empty() {
5482 return parser_err!(
5483 self,
5484 self.peek_prev_pos(),
5485 "cannot mix column definitions and column names"
5486 );
5487 }
5488
5489 let columns = match column_defs.is_empty() {
5490 true => match column_names.is_empty() {
5491 true => TableFromSourceColumns::NotSpecified,
5492 false => TableFromSourceColumns::Named(column_names),
5493 },
5494 false => TableFromSourceColumns::Defined(column_defs),
5495 };
5496
5497 Ok((columns, constraints))
5498 }
5499
5500 fn parse_columns(
5501 &mut self,
5502 optional: IsOptional,
5503 ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5504 let mut columns = vec![];
5505 let mut constraints = vec![];
5506
5507 if !self.consume_token(&Token::LParen) {
5508 if optional == Optional {
5509 return Ok((columns, constraints));
5510 } else {
5511 return self.expected(
5512 self.peek_pos(),
5513 "a list of columns in parentheses",
5514 self.peek_token(),
5515 );
5516 }
5517 }
5518 if self.consume_token(&Token::RParen) {
5519 return Ok((columns, constraints));
5521 }
5522
5523 loop {
5524 if let Some(constraint) = self.parse_optional_table_constraint()? {
5525 constraints.push(constraint);
5526 } else if let Some(column_name) = self.consume_identifier()? {
5527 let data_type = self.parse_data_type()?;
5528 let collation = if self.parse_keyword(COLLATE) {
5529 Some(self.parse_item_name()?)
5530 } else {
5531 None
5532 };
5533 let mut options = vec![];
5534 loop {
5535 match self.peek_token() {
5536 None | Some(Token::Comma) | Some(Token::RParen) => break,
5537 _ => options.push(self.parse_column_option_def()?),
5538 }
5539 }
5540
5541 columns.push(ColumnDef {
5542 name: column_name,
5543 data_type,
5544 collation,
5545 options,
5546 });
5547 } else {
5548 return self.expected(
5549 self.peek_pos(),
5550 "column name or constraint definition",
5551 self.peek_token(),
5552 );
5553 }
5554 if self.consume_token(&Token::Comma) {
5555 } else if self.consume_token(&Token::RParen) {
5557 break;
5558 } else {
5559 return self.expected(
5560 self.peek_pos(),
5561 "',' or ')' after column definition",
5562 self.peek_token(),
5563 );
5564 }
5565 }
5566
5567 Ok((columns, constraints))
5568 }
5569
5570 fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5571 let name = if self.parse_keyword(CONSTRAINT) {
5572 Some(self.parse_identifier()?)
5573 } else {
5574 None
5575 };
5576
5577 let option = if self.parse_keywords(&[NOT, NULL]) {
5578 ColumnOption::NotNull
5579 } else if self.parse_keyword(NULL) {
5580 ColumnOption::Null
5581 } else if self.parse_keyword(DEFAULT) {
5582 ColumnOption::Default(self.parse_expr()?)
5583 } else if self.parse_keywords(&[PRIMARY, KEY]) {
5584 ColumnOption::Unique { is_primary: true }
5585 } else if self.parse_keyword(UNIQUE) {
5586 ColumnOption::Unique { is_primary: false }
5587 } else if self.parse_keyword(REFERENCES) {
5588 let foreign_table = self.parse_item_name()?;
5589 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5590 ColumnOption::ForeignKey {
5591 foreign_table,
5592 referred_columns,
5593 }
5594 } else if self.parse_keyword(CHECK) {
5595 self.expect_token(&Token::LParen)?;
5596 let expr = self.parse_expr()?;
5597 self.expect_token(&Token::RParen)?;
5598 ColumnOption::Check(expr)
5599 } else if self.parse_keyword(VERSION) {
5600 self.expect_keyword(ADDED)?;
5601 let action = ColumnVersioned::Added;
5602 let version = self.parse_version()?;
5603
5604 ColumnOption::Versioned { action, version }
5605 } else {
5606 return self.expected(self.peek_pos(), "column option", self.peek_token());
5607 };
5608
5609 Ok(ColumnOptionDef { name, option })
5610 }
5611
5612 fn parse_optional_table_constraint(
5613 &mut self,
5614 ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5615 let name = if self.parse_keyword(CONSTRAINT) {
5616 Some(self.parse_identifier()?)
5617 } else {
5618 None
5619 };
5620 match self.next_token() {
5621 Some(Token::Keyword(PRIMARY)) => {
5622 self.expect_keyword(KEY)?;
5623 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5624 Ok(Some(TableConstraint::Unique {
5625 name,
5626 columns,
5627 is_primary: true,
5628 nulls_not_distinct: false,
5629 }))
5630 }
5631 Some(Token::Keyword(UNIQUE)) => {
5632 let nulls_not_distinct = if self.parse_keyword(NULLS) {
5633 self.expect_keywords(&[NOT, DISTINCT])?;
5634 true
5635 } else {
5636 false
5637 };
5638
5639 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5640 Ok(Some(TableConstraint::Unique {
5641 name,
5642 columns,
5643 is_primary: false,
5644 nulls_not_distinct,
5645 }))
5646 }
5647 Some(Token::Keyword(FOREIGN)) => {
5648 self.expect_keyword(KEY)?;
5649 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5650 self.expect_keyword(REFERENCES)?;
5651 let foreign_table = self.parse_raw_name()?;
5652 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5653 Ok(Some(TableConstraint::ForeignKey {
5654 name,
5655 columns,
5656 foreign_table,
5657 referred_columns,
5658 }))
5659 }
5660 Some(Token::Keyword(CHECK)) => {
5661 self.expect_token(&Token::LParen)?;
5662 let expr = Box::new(self.parse_expr()?);
5663 self.expect_token(&Token::RParen)?;
5664 Ok(Some(TableConstraint::Check { name, expr }))
5665 }
5666 unexpected => {
5667 if name.is_some() {
5668 self.expected(
5669 self.peek_prev_pos(),
5670 "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5671 unexpected,
5672 )
5673 } else {
5674 self.prev_token();
5675 Ok(None)
5676 }
5677 }
5678 }
5679 }
5680
5681 fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5682 let _ = self.consume_token(&Token::Eq);
5683 Ok(WithOptionValue::Item(self.parse_raw_name()?))
5684 }
5685
5686 fn parse_optional_connection_credential_option_value(
5687 &mut self,
5688 ) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5689 match self.peek_token() {
5690 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5691 _ => {
5692 let _ = self.consume_token(&Token::Eq);
5693 Ok(Some(self.parse_connection_credential_option_value()?))
5694 }
5695 }
5696 }
5697
5698 fn parse_connection_credential_option_value(
5699 &mut self,
5700 ) -> Result<WithOptionValue<Raw>, ParserError> {
5701 if self.parse_keyword(SECRET) {
5702 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5703 Ok(WithOptionValue::Secret(secret))
5704 } else {
5705 Ok(WithOptionValue::Value(Value::String("secret".to_string())))
5706 }
5707 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5708 Ok(WithOptionValue::Value(value))
5709 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
5710 Ok(WithOptionValue::Value(Value::String(ident.into_string())))
5711 } else {
5712 self.expected(
5713 self.peek_pos(),
5714 "connection credential value",
5715 self.peek_token(),
5716 )
5717 }
5718 }
5719
5720 fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5721 match self.peek_token() {
5726 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5727 _ => {
5728 let _ = self.consume_token(&Token::Eq);
5729 Ok(Some(self.parse_option_value()?))
5730 }
5731 }
5732 }
5733
5734 fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5735 where
5736 F: FnMut(&mut Self) -> Result<T, ParserError>,
5737 {
5738 Ok(if self.consume_token(&Token::LParen) {
5739 let options = if self.consume_token(&Token::RParen) {
5740 vec![]
5741 } else {
5742 let options = self.parse_comma_separated(f)?;
5743 self.expect_token(&Token::RParen)?;
5744 options
5745 };
5746
5747 Some(options)
5748 } else if self.consume_token(&Token::LBracket) {
5749 let options = if self.consume_token(&Token::RBracket) {
5750 vec![]
5751 } else {
5752 let options = self.parse_comma_separated(f)?;
5753
5754 self.expect_token(&Token::RBracket)?;
5755 options
5756 };
5757
5758 Some(options)
5759 } else {
5760 None
5761 })
5762 }
5763
5764 fn parse_option_map(
5765 &mut self,
5766 ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5767 if !(self.peek_keyword(MAP) && self.peek_nth_token(1) == Some(Token::LBracket)) {
5774 return Ok(None);
5775 }
5776 Ok(if self.parse_keyword(MAP) {
5777 self.expect_token(&Token::LBracket)?;
5778 let mut map = BTreeMap::new();
5779 loop {
5780 if let Some(Token::RBracket) = self.peek_token() {
5781 break;
5782 }
5783 let key = match self.next_token() {
5784 Some(Token::String(s)) => s,
5785 token => return self.expected(self.peek_pos(), "string", token),
5786 };
5787 self.expect_token(&Token::Arrow)?;
5788 let value = Parser::parse_option_value(self)?;
5789 map.insert(key, value);
5790 if !self.consume_token(&Token::Comma) {
5791 break;
5792 }
5793 }
5794 self.expect_token(&Token::RBracket)?;
5795 Some(map)
5796 } else {
5797 None
5798 })
5799 }
5800
5801 fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5802 if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5803 Ok(WithOptionValue::Sequence(seq))
5804 } else if let Some(map) = self.parse_option_map()? {
5805 Ok(WithOptionValue::Map(map))
5806 } else if self.parse_keyword(SECRET) {
5807 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5808 Ok(WithOptionValue::Secret(secret))
5809 } else {
5810 Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5811 vec![ident!("secret")],
5812 )))
5813 }
5814 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5815 Ok(WithOptionValue::Value(value))
5816 } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5817 Ok(WithOptionValue::UnresolvedItemName(item_name))
5818 } else {
5819 self.expected(self.peek_pos(), "option value", self.peek_token())
5820 }
5821 }
5822
5823 fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5824 let _ = self.consume_token(&Token::Eq);
5825 Ok(WithOptionValue::DataType(self.parse_data_type()?))
5826 }
5827
5828 fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5829 if self.parse_keyword(SYSTEM) {
5830 self.parse_alter_system()
5831 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5832 self.parse_alter_default_privileges()
5833 .map_parser_err(StatementKind::AlterDefaultPrivileges)
5834 } else {
5835 self.parse_alter_object()
5836 }
5837 }
5838
5839 fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5840 let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5841
5842 match object_type {
5843 ObjectType::Role => self
5844 .parse_alter_role()
5845 .map_parser_err(StatementKind::AlterRole),
5846 ObjectType::Sink => self.parse_alter_sink(),
5847 ObjectType::Source => self.parse_alter_source(),
5848 ObjectType::Index => self.parse_alter_index(),
5849 ObjectType::Secret => self.parse_alter_secret(),
5850 ObjectType::Connection => self.parse_alter_connection(),
5851 ObjectType::View | ObjectType::MaterializedView | ObjectType::Table => {
5852 self.parse_alter_views(object_type)
5853 }
5854 ObjectType::Type => {
5855 let if_exists = self
5856 .parse_if_exists()
5857 .map_parser_err(StatementKind::AlterOwner)?;
5858 let name = UnresolvedObjectName::Item(
5859 self.parse_item_name()
5860 .map_parser_err(StatementKind::AlterOwner)?,
5861 );
5862 self.expect_keywords(&[OWNER, TO])
5863 .map_parser_err(StatementKind::AlterOwner)?;
5864 let new_owner = self
5865 .parse_identifier()
5866 .map_parser_err(StatementKind::AlterOwner)?;
5867 Ok(Statement::AlterOwner(AlterOwnerStatement {
5868 object_type,
5869 if_exists,
5870 name,
5871 new_owner,
5872 }))
5873 }
5874 ObjectType::Cluster => self.parse_alter_cluster(object_type),
5875 ObjectType::ClusterReplica => {
5876 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5877 let name = UnresolvedObjectName::ClusterReplica(
5878 self.parse_cluster_replica_name()
5879 .map_no_statement_parser_err()?,
5880 );
5881 let action = self
5882 .expect_one_of_keywords(&[OWNER, RENAME])
5883 .map_no_statement_parser_err()?;
5884 self.expect_keyword(TO).map_no_statement_parser_err()?;
5885 match action {
5886 OWNER => {
5887 let new_owner = self
5888 .parse_identifier()
5889 .map_parser_err(StatementKind::AlterOwner)?;
5890 Ok(Statement::AlterOwner(AlterOwnerStatement {
5891 object_type,
5892 if_exists,
5893 name,
5894 new_owner,
5895 }))
5896 }
5897 RENAME => {
5898 let to_item_name = self
5899 .parse_identifier()
5900 .map_parser_err(StatementKind::AlterObjectRename)?;
5901 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5902 object_type,
5903 if_exists,
5904 name,
5905 to_item_name,
5906 }))
5907 }
5908 _ => unreachable!(),
5909 }
5910 }
5911 ObjectType::Database => {
5912 let if_exists = self
5913 .parse_if_exists()
5914 .map_parser_err(StatementKind::AlterOwner)?;
5915 let name = UnresolvedObjectName::Database(
5916 self.parse_database_name()
5917 .map_parser_err(StatementKind::AlterOwner)?,
5918 );
5919 self.expect_keywords(&[OWNER, TO])
5920 .map_parser_err(StatementKind::AlterOwner)?;
5921 let new_owner = self
5922 .parse_identifier()
5923 .map_parser_err(StatementKind::AlterOwner)?;
5924 Ok(Statement::AlterOwner(AlterOwnerStatement {
5925 object_type,
5926 if_exists,
5927 name,
5928 new_owner,
5929 }))
5930 }
5931 ObjectType::Schema => self.parse_alter_schema(object_type),
5932 ObjectType::NetworkPolicy => self
5933 .parse_alter_network_policy()
5934 .map_parser_err(StatementKind::AlterNetworkPolicy),
5935 ObjectType::Func | ObjectType::Subsource | ObjectType::MetricSink => parser_err!(
5939 self,
5940 self.peek_prev_pos(),
5941 format!("Unsupported ALTER on {object_type}")
5942 )
5943 .map_no_statement_parser_err(),
5944 }
5945 }
5946
5947 fn parse_alter_cluster(
5948 &mut self,
5949 object_type: ObjectType,
5950 ) -> Result<Statement<Raw>, ParserStatementError> {
5951 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5952 let name = self.parse_identifier().map_no_statement_parser_err()?;
5953 let action = self
5954 .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
5955 .map_no_statement_parser_err()?;
5956 match action {
5957 OWNER => {
5958 self.expect_keyword(TO)
5959 .map_parser_err(StatementKind::AlterOwner)?;
5960 let new_owner = self
5961 .parse_identifier()
5962 .map_parser_err(StatementKind::AlterOwner)?;
5963 let name = UnresolvedObjectName::Cluster(name);
5964 Ok(Statement::AlterOwner(AlterOwnerStatement {
5965 object_type,
5966 if_exists,
5967 name,
5968 new_owner,
5969 }))
5970 }
5971 RENAME => {
5972 self.expect_keyword(TO)
5973 .map_parser_err(StatementKind::AlterObjectRename)?;
5974 let to_item_name = self
5975 .parse_identifier()
5976 .map_parser_err(StatementKind::AlterObjectRename)?;
5977 let name = UnresolvedObjectName::Cluster(name);
5978 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5979 object_type,
5980 if_exists,
5981 name,
5982 to_item_name,
5983 }))
5984 }
5985 RESET => {
5986 self.expect_token(&Token::LParen)
5987 .map_parser_err(StatementKind::AlterCluster)?;
5988 let names = self
5989 .parse_comma_separated(Parser::parse_cluster_option_name)
5990 .map_parser_err(StatementKind::AlterCluster)?;
5991 self.expect_token(&Token::RParen)
5992 .map_parser_err(StatementKind::AlterCluster)?;
5993 Ok(Statement::AlterCluster(AlterClusterStatement {
5994 if_exists,
5995 name,
5996 action: AlterClusterAction::ResetOptions(names),
5997 }))
5998 }
5999 SET => {
6000 self.expect_token(&Token::LParen)
6001 .map_parser_err(StatementKind::AlterCluster)?;
6002 let options = self
6003 .parse_comma_separated(Parser::parse_cluster_option)
6004 .map_parser_err(StatementKind::AlterCluster)?;
6005 self.expect_token(&Token::RParen)
6006 .map_parser_err(StatementKind::AlterCluster)?;
6007 let with_options = if self.parse_keyword(WITH) {
6008 self.expect_token(&Token::LParen)
6009 .map_parser_err(StatementKind::AlterCluster)?;
6010 let options = self
6011 .parse_comma_separated(Parser::parse_alter_cluster_option)
6012 .map_parser_err(StatementKind::AlterCluster)?;
6013 self.expect_token(&Token::RParen)
6014 .map_parser_err(StatementKind::AlterCluster)?;
6015 options
6016 } else {
6017 vec![]
6018 };
6019 Ok(Statement::AlterCluster(AlterClusterStatement {
6020 if_exists,
6021 name,
6022 action: AlterClusterAction::SetOptions {
6023 options,
6024 with_options,
6025 },
6026 }))
6027 }
6028 SWAP => {
6029 self.expect_keyword(WITH)
6030 .map_parser_err(StatementKind::AlterObjectSwap)?;
6031 let name_b = self
6032 .parse_identifier()
6033 .map_parser_err(StatementKind::AlterObjectSwap)?;
6034
6035 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6036 object_type,
6037 if_exists,
6038 name_a: UnresolvedObjectName::Cluster(name),
6039 name_b,
6040 }))
6041 }
6042 _ => unreachable!(),
6043 }
6044 }
6045
6046 fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6047 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6048 let source_name = self.parse_item_name().map_no_statement_parser_err()?;
6049
6050 Ok(
6051 match self
6052 .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
6053 .map_no_statement_parser_err()?
6054 {
6055 ADD => {
6056 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6057 .map_parser_err(StatementKind::AlterSource)?;
6058
6059 let subsources = self
6061 .parse_comma_separated(Parser::parse_subsource_references)
6062 .map_parser_err(StatementKind::AlterSource)?;
6063
6064 let options = if self.parse_keyword(WITH) {
6065 self.expect_token(&Token::LParen)
6066 .map_parser_err(StatementKind::AlterSource)?;
6067 let options = self
6068 .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
6069 .map_parser_err(StatementKind::AlterSource)?;
6070 self.expect_token(&Token::RParen)
6071 .map_parser_err(StatementKind::AlterSource)?;
6072 options
6073 } else {
6074 vec![]
6075 };
6076
6077 Statement::AlterSource(AlterSourceStatement {
6078 source_name,
6079 if_exists,
6080 action: AlterSourceAction::AddSubsources {
6081 external_references: subsources,
6082 options,
6083 },
6084 })
6085 }
6086 DROP => {
6087 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
6088 .map_parser_err(StatementKind::AlterSource)?;
6089
6090 let if_exists_inner = self
6091 .parse_if_exists()
6092 .map_parser_err(StatementKind::AlterSource)?;
6093
6094 let names = self
6095 .parse_comma_separated(Parser::parse_item_name)
6096 .map_parser_err(StatementKind::AlterSource)?;
6097
6098 let cascade = matches!(
6099 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
6100 .map_parser_err(StatementKind::AlterSource)?,
6101 Some(CASCADE),
6102 );
6103
6104 Statement::AlterSource(AlterSourceStatement {
6105 source_name,
6106 if_exists,
6107 action: AlterSourceAction::DropSubsources {
6108 if_exists: if_exists_inner,
6109 cascade,
6110 names,
6111 },
6112 })
6113 }
6114 RESET => {
6115 self.expect_token(&Token::LParen)
6116 .map_parser_err(StatementKind::AlterSource)?;
6117 let reset_options = self
6118 .parse_comma_separated(Parser::parse_source_option_name)
6119 .map_parser_err(StatementKind::AlterSource)?;
6120 self.expect_token(&Token::RParen)
6121 .map_parser_err(StatementKind::AlterSource)?;
6122
6123 Statement::AlterSource(AlterSourceStatement {
6124 source_name,
6125 if_exists,
6126 action: AlterSourceAction::ResetOptions(reset_options),
6127 })
6128 }
6129 SET => {
6130 if let Some(stmt) = self.maybe_parse_alter_set_cluster(
6131 if_exists,
6132 &source_name,
6133 ObjectType::Source,
6134 ) {
6135 return stmt;
6136 }
6137 self.expect_token(&Token::LParen)
6138 .map_parser_err(StatementKind::AlterSource)?;
6139 let set_options = self
6140 .parse_comma_separated(Parser::parse_source_option)
6141 .map_parser_err(StatementKind::AlterSource)?;
6142 self.expect_token(&Token::RParen)
6143 .map_parser_err(StatementKind::AlterSource)?;
6144 Statement::AlterSource(AlterSourceStatement {
6145 source_name,
6146 if_exists,
6147 action: AlterSourceAction::SetOptions(set_options),
6148 })
6149 }
6150 RENAME => {
6151 self.expect_keyword(TO)
6152 .map_parser_err(StatementKind::AlterObjectRename)?;
6153 let to_item_name = self
6154 .parse_identifier()
6155 .map_parser_err(StatementKind::AlterObjectRename)?;
6156
6157 Statement::AlterObjectRename(AlterObjectRenameStatement {
6158 object_type: ObjectType::Source,
6159 if_exists,
6160 name: UnresolvedObjectName::Item(source_name),
6161 to_item_name,
6162 })
6163 }
6164 OWNER => {
6165 self.expect_keyword(TO)
6166 .map_parser_err(StatementKind::AlterOwner)?;
6167 let new_owner = self
6168 .parse_identifier()
6169 .map_parser_err(StatementKind::AlterOwner)?;
6170
6171 Statement::AlterOwner(AlterOwnerStatement {
6172 object_type: ObjectType::Source,
6173 if_exists,
6174 name: UnresolvedObjectName::Item(source_name),
6175 new_owner,
6176 })
6177 }
6178 REFRESH => {
6179 self.expect_keyword(REFERENCES)
6180 .map_parser_err(StatementKind::AlterSource)?;
6181 Statement::AlterSource(AlterSourceStatement {
6182 source_name,
6183 if_exists,
6184 action: AlterSourceAction::RefreshReferences,
6185 })
6186 }
6187 _ => unreachable!(),
6188 },
6189 )
6190 }
6191
6192 fn parse_alter_source_add_subsource_option(
6193 &mut self,
6194 ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6195 match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6196 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6197 self.expect_keyword(COLUMNS)?;
6198
6199 let _ = self.consume_token(&Token::Eq);
6200
6201 let value = self
6202 .parse_option_sequence(Parser::parse_item_name)?
6203 .map(|inner| {
6204 WithOptionValue::Sequence(
6205 inner
6206 .into_iter()
6207 .map(WithOptionValue::UnresolvedItemName)
6208 .collect_vec(),
6209 )
6210 });
6211
6212 Ok(AlterSourceAddSubsourceOption {
6213 name: match *keyword {
6214 TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6215 EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6217 _ => unreachable!(),
6218 },
6219 value,
6220 })
6221 }
6222 _ => unreachable!(),
6223 }
6224 }
6225
6226 fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6227 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6228 let name = self.parse_item_name().map_no_statement_parser_err()?;
6229
6230 Ok(
6231 match self
6232 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6233 .map_no_statement_parser_err()?
6234 {
6235 RESET => {
6236 self.expect_token(&Token::LParen)
6237 .map_parser_err(StatementKind::AlterIndex)?;
6238 let reset_options = self
6239 .parse_comma_separated(Parser::parse_index_option_name)
6240 .map_parser_err(StatementKind::AlterIndex)?;
6241 self.expect_token(&Token::RParen)
6242 .map_parser_err(StatementKind::AlterIndex)?;
6243
6244 Statement::AlterIndex(AlterIndexStatement {
6245 index_name: name,
6246 if_exists,
6247 action: AlterIndexAction::ResetOptions(reset_options),
6248 })
6249 }
6250 SET => {
6251 self.expect_token(&Token::LParen)
6252 .map_parser_err(StatementKind::AlterIndex)?;
6253 let set_options = self
6254 .parse_comma_separated(Parser::parse_index_option)
6255 .map_parser_err(StatementKind::AlterIndex)?;
6256 self.expect_token(&Token::RParen)
6257 .map_parser_err(StatementKind::AlterIndex)?;
6258 Statement::AlterIndex(AlterIndexStatement {
6259 index_name: name,
6260 if_exists,
6261 action: AlterIndexAction::SetOptions(set_options),
6262 })
6263 }
6264 RENAME => {
6265 self.expect_keyword(TO)
6266 .map_parser_err(StatementKind::AlterObjectRename)?;
6267 let to_item_name = self
6268 .parse_identifier()
6269 .map_parser_err(StatementKind::AlterObjectRename)?;
6270
6271 Statement::AlterObjectRename(AlterObjectRenameStatement {
6272 object_type: ObjectType::Index,
6273 if_exists,
6274 name: UnresolvedObjectName::Item(name),
6275 to_item_name,
6276 })
6277 }
6278 OWNER => {
6279 self.expect_keyword(TO)
6280 .map_parser_err(StatementKind::AlterOwner)?;
6281 let new_owner = self
6282 .parse_identifier()
6283 .map_parser_err(StatementKind::AlterOwner)?;
6284
6285 Statement::AlterOwner(AlterOwnerStatement {
6286 object_type: ObjectType::Index,
6287 if_exists,
6288 name: UnresolvedObjectName::Item(name),
6289 new_owner,
6290 })
6291 }
6292 _ => unreachable!(),
6293 },
6294 )
6295 }
6296
6297 fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6298 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6299 let name = self.parse_item_name().map_no_statement_parser_err()?;
6300
6301 Ok(
6302 match self
6303 .expect_one_of_keywords(&[AS, RENAME, OWNER])
6304 .map_no_statement_parser_err()?
6305 {
6306 AS => {
6307 let value = self
6308 .parse_expr()
6309 .map_parser_err(StatementKind::AlterSecret)?;
6310 Statement::AlterSecret(AlterSecretStatement {
6311 name,
6312 if_exists,
6313 value,
6314 })
6315 }
6316 RENAME => {
6317 self.expect_keyword(TO)
6318 .map_parser_err(StatementKind::AlterObjectRename)?;
6319 let to_item_name = self
6320 .parse_identifier()
6321 .map_parser_err(StatementKind::AlterObjectRename)?;
6322
6323 Statement::AlterObjectRename(AlterObjectRenameStatement {
6324 object_type: ObjectType::Secret,
6325 if_exists,
6326 name: UnresolvedObjectName::Item(name),
6327 to_item_name,
6328 })
6329 }
6330 OWNER => {
6331 self.expect_keyword(TO)
6332 .map_parser_err(StatementKind::AlterOwner)?;
6333 let new_owner = self
6334 .parse_identifier()
6335 .map_parser_err(StatementKind::AlterOwner)?;
6336
6337 Statement::AlterOwner(AlterOwnerStatement {
6338 object_type: ObjectType::Secret,
6339 if_exists,
6340 name: UnresolvedObjectName::Item(name),
6341 new_owner,
6342 })
6343 }
6344 _ => unreachable!(),
6345 },
6346 )
6347 }
6348
6349 fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6351 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6352 let name = self.parse_item_name().map_no_statement_parser_err()?;
6353
6354 Ok(
6355 match self
6356 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6357 .map_no_statement_parser_err()?
6358 {
6359 RESET => {
6360 self.expect_token(&Token::LParen)
6361 .map_parser_err(StatementKind::AlterSink)?;
6362 let reset_options = self
6363 .parse_comma_separated(Parser::parse_create_sink_option_name)
6364 .map_parser_err(StatementKind::AlterSink)?;
6365 self.expect_token(&Token::RParen)
6366 .map_parser_err(StatementKind::AlterSink)?;
6367
6368 Statement::AlterSink(AlterSinkStatement {
6369 sink_name: name,
6370 if_exists,
6371 action: AlterSinkAction::ResetOptions(reset_options),
6372 })
6373 }
6374 SET => {
6375 if let Some(result) =
6376 self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6377 {
6378 return result;
6379 }
6380
6381 if self.parse_keyword(FROM) {
6382 let from = self
6383 .parse_raw_name()
6384 .map_parser_err(StatementKind::AlterSink)?;
6385
6386 Statement::AlterSink(AlterSinkStatement {
6387 sink_name: name,
6388 if_exists,
6389 action: AlterSinkAction::ChangeRelation(from),
6390 })
6391 } else {
6392 self.expect_token(&Token::LParen)
6393 .map_parser_err(StatementKind::AlterSink)?;
6394 let set_options = self
6395 .parse_comma_separated(Parser::parse_create_sink_option)
6396 .map_parser_err(StatementKind::AlterSink)?;
6397 self.expect_token(&Token::RParen)
6398 .map_parser_err(StatementKind::AlterSink)?;
6399 Statement::AlterSink(AlterSinkStatement {
6400 sink_name: name,
6401 if_exists,
6402 action: AlterSinkAction::SetOptions(set_options),
6403 })
6404 }
6405 }
6406 RENAME => {
6407 self.expect_keyword(TO)
6408 .map_parser_err(StatementKind::AlterObjectRename)?;
6409 let to_item_name = self
6410 .parse_identifier()
6411 .map_parser_err(StatementKind::AlterObjectRename)?;
6412
6413 Statement::AlterObjectRename(AlterObjectRenameStatement {
6414 object_type: ObjectType::Sink,
6415 if_exists,
6416 name: UnresolvedObjectName::Item(name),
6417 to_item_name,
6418 })
6419 }
6420 OWNER => {
6421 self.expect_keyword(TO)
6422 .map_parser_err(StatementKind::AlterOwner)?;
6423 let new_owner = self
6424 .parse_identifier()
6425 .map_parser_err(StatementKind::AlterOwner)?;
6426
6427 Statement::AlterOwner(AlterOwnerStatement {
6428 object_type: ObjectType::Sink,
6429 if_exists,
6430 name: UnresolvedObjectName::Item(name),
6431 new_owner,
6432 })
6433 }
6434 _ => unreachable!(),
6435 },
6436 )
6437 }
6438
6439 fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6441 match self
6442 .expect_one_of_keywords(&[SET, RESET])
6443 .map_no_statement_parser_err()?
6444 {
6445 SET => {
6446 let name = self
6447 .parse_identifier()
6448 .map_parser_err(StatementKind::AlterSystemSet)?;
6449 self.expect_keyword_or_token(TO, &Token::Eq)
6450 .map_parser_err(StatementKind::AlterSystemSet)?;
6451 let to = self
6452 .parse_set_variable_to()
6453 .map_parser_err(StatementKind::AlterSystemSet)?;
6454 Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6455 name,
6456 to,
6457 }))
6458 }
6459 RESET => {
6460 if self.parse_keyword(ALL) {
6461 Ok(Statement::AlterSystemResetAll(
6462 AlterSystemResetAllStatement {},
6463 ))
6464 } else {
6465 let name = self
6466 .parse_identifier()
6467 .map_parser_err(StatementKind::AlterSystemReset)?;
6468 Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6469 name,
6470 }))
6471 }
6472 }
6473 _ => unreachable!(),
6474 }
6475 }
6476
6477 fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6478 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6479 let name = self.parse_item_name().map_no_statement_parser_err()?;
6480
6481 Ok(
6482 match self
6483 .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6484 .map_no_statement_parser_err()?
6485 {
6486 RENAME => {
6487 self.expect_keyword(TO)
6488 .map_parser_err(StatementKind::AlterObjectRename)?;
6489 let to_item_name = self
6490 .parse_identifier()
6491 .map_parser_err(StatementKind::AlterObjectRename)?;
6492
6493 Statement::AlterObjectRename(AlterObjectRenameStatement {
6494 object_type: ObjectType::Connection,
6495 if_exists,
6496 name: UnresolvedObjectName::Item(name),
6497 to_item_name,
6498 })
6499 }
6500 OWNER => {
6501 self.expect_keyword(TO)
6502 .map_parser_err(StatementKind::AlterOwner)?;
6503 let new_owner = self
6504 .parse_identifier()
6505 .map_parser_err(StatementKind::AlterOwner)?;
6506
6507 Statement::AlterOwner(AlterOwnerStatement {
6508 object_type: ObjectType::Connection,
6509 if_exists,
6510 name: UnresolvedObjectName::Item(name),
6511 new_owner,
6512 })
6513 }
6514 _ => {
6515 self.prev_token();
6516 let actions = self
6517 .parse_comma_separated(Parser::parse_alter_connection_action)
6518 .map_parser_err(StatementKind::AlterConnection)?;
6519
6520 let with_options = if self.parse_keyword(WITH) {
6521 self.expect_token(&Token::LParen)
6522 .map_parser_err(StatementKind::AlterConnection)?;
6523 let options = self
6524 .parse_comma_separated(Parser::parse_alter_connection_option)
6525 .map_parser_err(StatementKind::AlterConnection)?;
6526 self.expect_token(&Token::RParen)
6527 .map_parser_err(StatementKind::AlterConnection)?;
6528 options
6529 } else {
6530 vec![]
6531 };
6532
6533 Statement::AlterConnection(AlterConnectionStatement {
6534 name,
6535 if_exists,
6536 actions,
6537 with_options,
6538 })
6539 }
6540 },
6541 )
6542 }
6543
6544 fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6545 let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6546 ROTATE => {
6547 self.expect_keyword(KEYS)?;
6548 AlterConnectionAction::RotateKeys
6549 }
6550 SET => {
6551 self.expect_token(&Token::LParen)?;
6552 let option = self.parse_connection_option_unified()?;
6553 self.expect_token(&Token::RParen)?;
6554 AlterConnectionAction::SetOption(option)
6555 }
6556 DROP | RESET => {
6557 self.expect_token(&Token::LParen)?;
6558 let option = self.parse_connection_option_name()?;
6559 self.expect_token(&Token::RParen)?;
6560 AlterConnectionAction::DropOption(option)
6561 }
6562 _ => unreachable!(),
6563 };
6564
6565 Ok(r)
6566 }
6567
6568 fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6570 let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6571 VALIDATE => AlterConnectionOptionName::Validate,
6572 _ => unreachable!(),
6573 };
6574
6575 Ok(AlterConnectionOption {
6576 name,
6577 value: self.parse_optional_option_value()?,
6578 })
6579 }
6580
6581 fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6582 let name = self.parse_identifier()?;
6583
6584 let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6585 Some(SET) => {
6586 let name = self.parse_identifier()?;
6587 self.expect_keyword_or_token(TO, &Token::Eq)?;
6588 let value = self.parse_set_variable_to()?;
6589 let var = SetRoleVar::Set { name, value };
6590 AlterRoleOption::Variable(var)
6591 }
6592 Some(RESET) => {
6593 let name = self.parse_identifier()?;
6594 let var = SetRoleVar::Reset { name };
6595 AlterRoleOption::Variable(var)
6596 }
6597 Some(WITH) | None => {
6598 let _ = self.parse_keyword(WITH);
6599 let attrs = self.parse_role_attributes()?;
6600 AlterRoleOption::Attributes(attrs)
6601 }
6602 Some(k) => unreachable!("unmatched keyword: {k}"),
6603 };
6604
6605 Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6606 }
6607
6608 fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6609 self.expect_keyword(FOR)?;
6610 let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6611 ROLE | USER => TargetRoleSpecification::Roles(
6612 self.parse_comma_separated(Parser::parse_identifier)?,
6613 ),
6614 ALL => {
6615 self.expect_keyword(ROLES)?;
6616 TargetRoleSpecification::AllRoles
6617 }
6618 _ => unreachable!(),
6619 };
6620 let target_objects = if self.parse_keyword(IN) {
6621 match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6622 SCHEMA => GrantTargetAllSpecification::AllSchemas {
6623 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6624 },
6625 DATABASE => GrantTargetAllSpecification::AllDatabases {
6626 databases: self.parse_comma_separated(Parser::parse_database_name)?,
6627 },
6628 _ => unreachable!(),
6629 }
6630 } else {
6631 GrantTargetAllSpecification::All
6632 };
6633 let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6634 let privileges = self.parse_privilege_specification().ok_or_else(|| {
6635 self.expected::<_, PrivilegeSpecification>(
6636 self.peek_pos(),
6637 "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6638 self.peek_token(),
6639 )
6640 .expect_err("only returns errors")
6641 })?;
6642 self.expect_keyword(ON)?;
6643 let object_type =
6644 self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6645 if is_grant {
6646 self.expect_keyword(TO)?;
6647 } else {
6648 self.expect_keyword(FROM)?;
6649 }
6650 let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6651
6652 let grant_or_revoke = if is_grant {
6653 AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6654 privileges,
6655 object_type,
6656 grantees,
6657 })
6658 } else {
6659 AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6660 privileges,
6661 object_type,
6662 revokees: grantees,
6663 })
6664 };
6665
6666 Ok(Statement::AlterDefaultPrivileges(
6667 AlterDefaultPrivilegesStatement {
6668 target_roles,
6669 target_objects,
6670 grant_or_revoke,
6671 },
6672 ))
6673 }
6674
6675 fn parse_alter_views(
6676 &mut self,
6677 object_type: ObjectType,
6678 ) -> Result<Statement<Raw>, ParserStatementError> {
6679 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6680 let name = self.parse_item_name().map_no_statement_parser_err()?;
6681 let keywords: &[_] = match object_type {
6682 ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6683 ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6684 ObjectType::View => &[SET, RENAME, OWNER, RESET],
6685 ObjectType::Source
6686 | ObjectType::Sink
6687 | ObjectType::MetricSink
6688 | ObjectType::Index
6689 | ObjectType::Type
6690 | ObjectType::Role
6691 | ObjectType::Cluster
6692 | ObjectType::ClusterReplica
6693 | ObjectType::Secret
6694 | ObjectType::Connection
6695 | ObjectType::Database
6696 | ObjectType::Schema
6697 | ObjectType::Func
6698 | ObjectType::Subsource
6699 | ObjectType::NetworkPolicy => {
6700 unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6701 }
6702 };
6703
6704 let action = self
6705 .expect_one_of_keywords(keywords)
6706 .map_no_statement_parser_err()?;
6707 match action {
6708 RENAME => {
6709 self.expect_keyword(TO).map_no_statement_parser_err()?;
6710 let to_item_name = self
6711 .parse_identifier()
6712 .map_parser_err(StatementKind::AlterObjectRename)?;
6713 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6714 object_type,
6715 if_exists,
6716 name: UnresolvedObjectName::Item(name),
6717 to_item_name,
6718 }))
6719 }
6720 SET => {
6721 if self.parse_keyword(CLUSTER) {
6722 self.parse_alter_set_cluster(if_exists, name, object_type)
6723 } else {
6724 self.expect_token(&Token::LParen)
6725 .map_no_statement_parser_err()?;
6726 self.expect_keywords(&[RETAIN, HISTORY])
6727 .map_parser_err(StatementKind::AlterRetainHistory)?;
6728 let history = self
6729 .parse_retain_history()
6730 .map_parser_err(StatementKind::AlterRetainHistory)?;
6731 self.expect_token(&Token::RParen)
6732 .map_parser_err(StatementKind::AlterCluster)?;
6733 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6734 object_type,
6735 if_exists,
6736 name: UnresolvedObjectName::Item(name),
6737 history: Some(history),
6738 }))
6739 }
6740 }
6741 RESET => {
6742 self.expect_token(&Token::LParen)
6743 .map_no_statement_parser_err()?;
6744 self.expect_keywords(&[RETAIN, HISTORY])
6745 .map_parser_err(StatementKind::AlterRetainHistory)?;
6746 self.expect_token(&Token::RParen)
6747 .map_no_statement_parser_err()?;
6748 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6749 object_type,
6750 if_exists,
6751 name: UnresolvedObjectName::Item(name),
6752 history: None,
6753 }))
6754 }
6755 OWNER => {
6756 self.expect_keyword(TO).map_no_statement_parser_err()?;
6757 let new_owner = self
6758 .parse_identifier()
6759 .map_parser_err(StatementKind::AlterOwner)?;
6760 Ok(Statement::AlterOwner(AlterOwnerStatement {
6761 object_type,
6762 if_exists,
6763 name: UnresolvedObjectName::Item(name),
6764 new_owner,
6765 }))
6766 }
6767 ADD => {
6768 assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6769
6770 self.expect_keyword(COLUMN)
6771 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6772 let if_col_not_exist = self
6773 .parse_if_not_exists()
6774 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6775 let column_name = self
6776 .parse_identifier()
6777 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6778 let data_type = self
6779 .parse_data_type()
6780 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6781
6782 Ok(Statement::AlterTableAddColumn(
6783 AlterTableAddColumnStatement {
6784 if_exists,
6785 name,
6786 if_col_not_exist,
6787 column_name,
6788 data_type,
6789 },
6790 ))
6791 }
6792 APPLY => {
6793 assert_eq!(
6794 object_type,
6795 ObjectType::MaterializedView,
6796 "checked object_type above",
6797 );
6798
6799 self.expect_keyword(REPLACEMENT)
6800 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6801
6802 let replacement_name = self
6803 .parse_item_name()
6804 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6805
6806 Ok(Statement::AlterMaterializedViewApplyReplacement(
6807 AlterMaterializedViewApplyReplacementStatement {
6808 if_exists,
6809 name,
6810 replacement_name,
6811 },
6812 ))
6813 }
6814 _ => unreachable!(),
6815 }
6816 }
6817
6818 fn parse_alter_schema(
6819 &mut self,
6820 object_type: ObjectType,
6821 ) -> Result<Statement<Raw>, ParserStatementError> {
6822 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6823 let name = self.parse_schema_name().map_no_statement_parser_err()?;
6824 let name = UnresolvedObjectName::Schema(name);
6825 let action = self
6826 .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6827 .map_no_statement_parser_err()?;
6828
6829 match action {
6830 OWNER => {
6831 self.expect_keyword(TO)
6832 .map_parser_err(StatementKind::AlterOwner)?;
6833 let new_owner = self
6834 .parse_identifier()
6835 .map_parser_err(StatementKind::AlterOwner)?;
6836
6837 Ok(Statement::AlterOwner(AlterOwnerStatement {
6838 object_type,
6839 if_exists,
6840 name,
6841 new_owner,
6842 }))
6843 }
6844 RENAME => {
6845 self.expect_keyword(TO)
6846 .map_parser_err(StatementKind::AlterObjectRename)?;
6847 let to_item_name = self
6848 .parse_identifier()
6849 .map_parser_err(StatementKind::AlterObjectRename)?;
6850
6851 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6852 object_type,
6853 if_exists,
6854 name,
6855 to_item_name,
6856 }))
6857 }
6858 SWAP => {
6859 self.expect_keyword(WITH)
6860 .map_parser_err(StatementKind::AlterObjectSwap)?;
6861 let name_b = self
6862 .parse_identifier()
6863 .map_parser_err(StatementKind::AlterObjectSwap)?;
6864
6865 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6866 object_type,
6867 if_exists,
6868 name_a: name,
6869 name_b,
6870 }))
6871 }
6872 k => unreachable!("programming error, unmatched {k}"),
6873 }
6874 }
6875
6876 fn maybe_parse_alter_set_cluster(
6878 &mut self,
6879 if_exists: bool,
6880 name: &UnresolvedItemName,
6881 object_type: ObjectType,
6882 ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6883 if self.parse_keyword(CLUSTER) {
6884 Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6885 } else {
6886 None
6887 }
6888 }
6889
6890 fn parse_alter_set_cluster(
6892 &mut self,
6893 if_exists: bool,
6894 name: UnresolvedItemName,
6895 object_type: ObjectType,
6896 ) -> Result<Statement<Raw>, ParserStatementError> {
6897 let set_cluster = self
6898 .parse_raw_ident()
6899 .map_parser_err(StatementKind::AlterSetCluster)?;
6900 Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6901 name,
6902 if_exists,
6903 set_cluster,
6904 object_type,
6905 }))
6906 }
6907
6908 fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6910 let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6912 Some(self.peek_prev_pos())
6913 } else {
6914 None
6915 };
6916
6917 let relation = if self.consume_token(&Token::LParen) {
6918 let query = self.parse_statement()?.ast;
6919 self.expect_token(&Token::RParen)
6920 .map_parser_err(StatementKind::Copy)?;
6921 match query {
6922 Statement::Select(stmt) => CopyRelation::Select(stmt),
6923 Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6924 _ => {
6925 return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
6926 .map_parser_err(StatementKind::Copy);
6927 }
6928 }
6929 } else {
6930 let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
6931 let columns = self
6932 .parse_parenthesized_column_list(Optional)
6933 .map_parser_err(StatementKind::Copy)?;
6934 CopyRelation::Named { name, columns }
6935 };
6936 let (direction, target) = match self
6937 .expect_one_of_keywords(&[FROM, TO])
6938 .map_parser_err(StatementKind::Copy)?
6939 {
6940 FROM => {
6941 if let CopyRelation::Named { .. } = relation {
6942 } else {
6944 return parser_err!(
6945 self,
6946 self.peek_prev_pos(),
6947 "queries not allowed in COPY FROM"
6948 )
6949 .map_no_statement_parser_err();
6950 }
6951 if self.parse_keyword(STDIN) {
6952 (CopyDirection::From, CopyTarget::Stdin)
6953 } else {
6954 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6955 (CopyDirection::From, CopyTarget::Expr(url_expr))
6956 }
6957 }
6958 TO => {
6959 if let Some(into_pos) = maybe_into_pos {
6961 return self
6962 .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
6963 .map_parser_err(StatementKind::Copy);
6964 }
6965
6966 if self.parse_keyword(STDOUT) {
6967 (CopyDirection::To, CopyTarget::Stdout)
6968 } else {
6969 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6970 (CopyDirection::To, CopyTarget::Expr(url_expr))
6971 }
6972 }
6973 _ => unreachable!(),
6974 };
6975 let has_options = if self.parse_keyword(WITH) {
6979 self.expect_token(&Token::LParen)
6980 .map_parser_err(StatementKind::Copy)?;
6981 true
6982 } else {
6983 self.consume_token(&Token::LParen)
6984 };
6985 let options = if has_options {
6986 let o = self
6987 .parse_comma_separated(Parser::parse_copy_option)
6988 .map_parser_err(StatementKind::Copy)?;
6989 self.expect_token(&Token::RParen)
6990 .map_parser_err(StatementKind::Copy)?;
6991 o
6992 } else {
6993 vec![]
6994 };
6995 Ok(Statement::Copy(CopyStatement {
6996 relation,
6997 direction,
6998 target,
6999 options,
7000 }))
7001 }
7002
7003 fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
7004 let name = match self.expect_one_of_keywords(&[
7005 FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
7006 ])? {
7007 FORMAT => CopyOptionName::Format,
7008 DELIMITER => CopyOptionName::Delimiter,
7009 NULL => CopyOptionName::Null,
7010 ESCAPE => CopyOptionName::Escape,
7011 QUOTE => CopyOptionName::Quote,
7012 HEADER => CopyOptionName::Header,
7013 AWS => {
7014 self.expect_keyword(CONNECTION)?;
7015 return Ok(CopyOption {
7016 name: CopyOptionName::AwsConnection,
7017 value: Some(self.parse_object_option_value()?),
7018 });
7019 }
7020 MAX => {
7021 self.expect_keywords(&[FILE, SIZE])?;
7022 CopyOptionName::MaxFileSize
7023 }
7024 FILES => CopyOptionName::Files,
7025 PATTERN => CopyOptionName::Pattern,
7026 _ => unreachable!(),
7027 };
7028 Ok(CopyOption {
7029 name,
7030 value: self.parse_optional_option_value()?,
7031 })
7032 }
7033
7034 fn parse_value(&mut self) -> Result<Value, ParserError> {
7036 match self.next_token() {
7037 Some(t) => match t {
7038 Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
7039 Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
7040 Token::Keyword(NULL) => Ok(Value::Null),
7041 Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
7042 Token::Keyword(kw) => {
7043 parser_err!(
7044 self,
7045 self.peek_prev_pos(),
7046 format!("No value parser for keyword {}", kw)
7047 )
7048 }
7049 Token::Op(ref op) if op == "-" => match self.next_token() {
7050 Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
7051 other => self.expected(self.peek_prev_pos(), "literal int", other),
7052 },
7053 Token::Number(ref n) => Ok(Value::Number(n.to_string())),
7054 Token::String(ref s) => Ok(Value::String(s.to_string())),
7055 Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
7056 _ => parser_err!(
7057 self,
7058 self.peek_prev_pos(),
7059 format!("Unsupported value: {:?}", t)
7060 ),
7061 },
7062 None => parser_err!(
7063 self,
7064 self.peek_prev_pos(),
7065 "Expecting a value, but found EOF"
7066 ),
7067 }
7068 }
7069
7070 fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
7071 if self.consume_token(&Token::LParen) {
7072 let subquery = self.parse_query()?;
7073 self.expect_token(&Token::RParen)?;
7074 Ok(Expr::ArraySubquery(Box::new(subquery)))
7075 } else {
7076 self.parse_sequence(Self::parse_array).map(Expr::Array)
7077 }
7078 }
7079
7080 fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
7081 if self.consume_token(&Token::LParen) {
7082 let subquery = self.parse_query()?;
7083 self.expect_token(&Token::RParen)?;
7084 Ok(Expr::ListSubquery(Box::new(subquery)))
7085 } else {
7086 self.parse_sequence(Self::parse_list).map(Expr::List)
7087 }
7088 }
7089
7090 fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
7091 if self.consume_token(&Token::LParen) {
7092 let subquery = self.parse_query()?;
7093 self.expect_token(&Token::RParen)?;
7094 return Ok(Expr::MapSubquery(Box::new(subquery)));
7095 }
7096
7097 self.expect_token(&Token::LBracket)?;
7098 let mut exprs = vec![];
7099 loop {
7100 if let Some(Token::RBracket) = self.peek_token() {
7101 break;
7102 }
7103 let key = self.parse_expr()?;
7104 self.expect_token(&Token::Arrow)?;
7105 let value = if let Some(Token::LBracket) = self.peek_token() {
7106 self.parse_map()?
7107 } else {
7108 self.parse_expr()?
7109 };
7110 exprs.push(MapEntry { key, value });
7111 if !self.consume_token(&Token::Comma) {
7112 break;
7113 }
7114 }
7115 self.expect_token(&Token::RBracket)?;
7116 Ok(Expr::Map(exprs))
7117 }
7118
7119 fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
7120 where
7121 F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
7122 {
7123 self.expect_token(&Token::LBracket)?;
7124 let mut exprs = vec![];
7125 loop {
7126 if let Some(Token::RBracket) = self.peek_token() {
7127 break;
7128 }
7129 let expr = if let Some(Token::LBracket) = self.peek_token() {
7130 f(self)?
7131 } else {
7132 self.parse_expr()?
7133 };
7134 exprs.push(expr);
7135 if !self.consume_token(&Token::Comma) {
7136 break;
7137 }
7138 }
7139 self.expect_token(&Token::RBracket)?;
7140 Ok(exprs)
7141 }
7142
7143 fn parse_number_value(&mut self) -> Result<Value, ParserError> {
7144 match self.parse_value()? {
7145 v @ Value::Number(_) => Ok(v),
7146 _ => {
7147 self.prev_token();
7148 self.expected(self.peek_pos(), "literal number", self.peek_token())
7149 }
7150 }
7151 }
7152
7153 fn parse_version(&mut self) -> Result<Version, ParserError> {
7154 let version = self.parse_literal_uint()?;
7155 Ok(Version(version))
7156 }
7157
7158 fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7160 let negative = self.consume_token(&Token::Op("-".into()));
7161 match self.next_token() {
7162 Some(Token::Number(s)) => {
7163 let n = s.parse::<i64>().map_err(|e| {
7164 self.error(
7165 self.peek_prev_pos(),
7166 format!("Could not parse '{}' as i64: {}", s, e),
7167 )
7168 })?;
7169 if negative {
7170 n.checked_neg().ok_or_else(|| {
7171 self.error(
7172 self.peek_prev_pos(),
7173 format!("Could not parse '{}' as i64: overflows i64", s),
7174 )
7175 })
7176 } else {
7177 Ok(n)
7178 }
7179 }
7180 other => self.expected(self.peek_prev_pos(), "literal integer", other),
7181 }
7182 }
7183
7184 fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7186 match self.next_token() {
7187 Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7188 self.error(
7189 self.peek_prev_pos(),
7190 format!("Could not parse '{}' as u64: {}", s, e),
7191 )
7192 }),
7193 other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7194 }
7195 }
7196
7197 fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7199 match self.next_token() {
7200 Some(Token::String(ref s)) => Ok(s.clone()),
7201 other => self.expected(self.peek_prev_pos(), "literal string", other),
7202 }
7203 }
7204
7205 fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7207 let other = |ident| RawDataType::Other {
7208 name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7209 typ_mod: vec![],
7210 };
7211
7212 let mut data_type = match self.next_token() {
7213 Some(Token::Keyword(kw)) => match kw {
7214 CHAR | CHARACTER => {
7216 let name = if self.parse_keyword(VARYING) {
7217 ident!("varchar")
7218 } else {
7219 ident!("bpchar")
7220 };
7221 RawDataType::Other {
7222 name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7223 typ_mod: self.parse_typ_mod()?,
7224 }
7225 }
7226 BPCHAR => RawDataType::Other {
7227 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7228 typ_mod: self.parse_typ_mod()?,
7229 },
7230 VARCHAR => RawDataType::Other {
7231 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7232 typ_mod: self.parse_typ_mod()?,
7233 },
7234 STRING => other(ident!("text")),
7235
7236 BIGINT => other(ident!("int8")),
7238 SMALLINT => other(ident!("int2")),
7239 DEC | DECIMAL => RawDataType::Other {
7240 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7241 typ_mod: self.parse_typ_mod()?,
7242 },
7243 DOUBLE => {
7244 let _ = self.parse_keyword(PRECISION);
7245 other(ident!("float8"))
7246 }
7247 FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7248 v if v == 0 || v > 53 => {
7249 return Err(self.error(
7250 self.peek_prev_pos(),
7251 "precision for type float must be within ([1-53])".into(),
7252 ));
7253 }
7254 v if v < 25 => other(ident!("float4")),
7255 _ => other(ident!("float8")),
7256 },
7257 INT | INTEGER => other(ident!("int4")),
7258 REAL => other(ident!("float4")),
7259
7260 TIME => {
7262 if self.parse_keyword(WITH) {
7263 self.expect_keywords(&[TIME, ZONE])?;
7264 other(ident!("timetz"))
7265 } else {
7266 if self.parse_keyword(WITHOUT) {
7267 self.expect_keywords(&[TIME, ZONE])?;
7268 }
7269 other(ident!("time"))
7270 }
7271 }
7272 TIMESTAMP => {
7273 let typ_mod = self.parse_timestamp_precision()?;
7274 if self.parse_keyword(WITH) {
7275 self.expect_keywords(&[TIME, ZONE])?;
7276 RawDataType::Other {
7277 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7278 "timestamptz"
7279 ))),
7280 typ_mod,
7281 }
7282 } else {
7283 if self.parse_keyword(WITHOUT) {
7284 self.expect_keywords(&[TIME, ZONE])?;
7285 }
7286 RawDataType::Other {
7287 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7288 "timestamp"
7289 ))),
7290 typ_mod,
7291 }
7292 }
7293 }
7294 TIMESTAMPTZ => {
7295 let typ_mod = self.parse_timestamp_precision()?;
7296 RawDataType::Other {
7297 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7298 "timestamptz"
7299 ))),
7300 typ_mod,
7301 }
7302 }
7303
7304 MAP => {
7306 return self.parse_map_type();
7307 }
7308
7309 BOOLEAN => other(ident!("bool")),
7311 BYTES => other(ident!("bytea")),
7312 JSON => other(ident!("jsonb")),
7313
7314 kw if kw.is_sometimes_reserved() => {
7317 return self.expected(
7318 self.peek_prev_pos(),
7319 "a data type name",
7320 Some(Token::Keyword(kw)),
7321 );
7322 }
7323 _ => {
7324 self.prev_token();
7325 RawDataType::Other {
7326 name: RawItemName::Name(self.parse_item_name()?),
7327 typ_mod: self.parse_typ_mod()?,
7328 }
7329 }
7330 },
7331 Some(Token::Ident(_) | Token::LBracket) => {
7332 self.prev_token();
7333 RawDataType::Other {
7334 name: self.parse_raw_name()?,
7335 typ_mod: self.parse_typ_mod()?,
7336 }
7337 }
7338 other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7339 };
7340
7341 loop {
7342 match self.peek_token() {
7343 Some(Token::Keyword(LIST)) => {
7344 self.next_token();
7345 data_type = RawDataType::List(Box::new(data_type));
7346 }
7347 Some(Token::LBracket) => {
7348 self.next_token();
7351 let _ = self.maybe_parse(|parser| parser.parse_number_value());
7352 self.expect_token(&Token::RBracket)?;
7353 if !matches!(data_type, RawDataType::Array(_)) {
7354 data_type = RawDataType::Array(Box::new(data_type));
7355 }
7356 }
7357 _ => break,
7358 }
7359 }
7360 Ok(data_type)
7361 }
7362
7363 fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7364 if self.consume_token(&Token::LParen) {
7365 let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7366 self.expect_token(&Token::RParen)?;
7367 Ok(typ_mod)
7368 } else {
7369 Ok(vec![])
7370 }
7371 }
7372
7373 fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7375 if self.consume_token(&Token::LParen) {
7376 let typ_mod = self.parse_literal_int()?;
7377 self.expect_token(&Token::RParen)?;
7378 Ok(vec![typ_mod])
7379 } else {
7380 Ok(vec![])
7381 }
7382 }
7383
7384 fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7388 where
7389 F: FnOnce(Keyword) -> bool,
7390 {
7391 let after_as = self.parse_keyword(AS);
7392 match self.next_token() {
7393 Some(Token::Keyword(OF)) => {
7396 self.prev_token();
7397 if after_as {
7398 self.prev_token();
7399 }
7400 Ok(None)
7401 }
7402 Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7408 Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7409 not_an_ident => {
7410 if after_as {
7411 return self.expected(
7412 self.peek_prev_pos(),
7413 "an identifier after AS",
7414 not_an_ident,
7415 );
7416 }
7417 self.prev_token();
7418 Ok(None) }
7420 }
7421 }
7422
7423 fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7428 match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7429 Some(name) => {
7430 let columns = self.parse_parenthesized_column_list(Optional)?;
7431 Ok(Some(TableAlias {
7432 name,
7433 columns,
7434 strict: false,
7435 }))
7436 }
7437 None => Ok(None),
7438 }
7439 }
7440
7441 fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7442 Ok(match self.parse_raw_name()? {
7443 named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7444 RawItemName::Name(name) => DeferredItemName::Deferred(name),
7445 })
7446 }
7447
7448 fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7449 if self.consume_token(&Token::LBracket) {
7450 let id = match self.next_token() {
7451 Some(Token::Ident(id)) => id.into_inner(),
7452 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7453 };
7454 self.expect_keyword(AS)?;
7455 let name = self.parse_item_name()?;
7456 if name.0.len() < 2 {
7458 return parser_err!(
7459 self,
7460 self.peek_prev_pos(),
7461 "table name in square brackets must be fully qualified"
7462 );
7463 }
7464
7465 let version = if self.parse_keywords(&[VERSION]) {
7466 let version = self.parse_version()?;
7467 Some(version)
7468 } else {
7469 None
7470 };
7471
7472 self.expect_token(&Token::RBracket)?;
7473 Ok(RawItemName::Id(id, name, version))
7474 } else {
7475 Ok(RawItemName::Name(self.parse_item_name()?))
7476 }
7477 }
7478
7479 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7480 let start = self.peek_pos();
7481 let mut item_name = self.parse_raw_name()?;
7482 let column_name = match &mut item_name {
7483 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7484 if identifiers.len() < 2 {
7485 return Err(ParserError::new(
7486 start,
7487 "need to specify an object and a column",
7488 ));
7489 }
7490 identifiers.pop().unwrap()
7491 }
7492 RawItemName::Id(_, _, _) => {
7493 self.expect_token(&Token::Dot)?;
7494 self.parse_identifier()?
7495 }
7496 };
7497
7498 Ok(ColumnName {
7499 relation: item_name,
7500 column: column_name,
7501 })
7502 }
7503
7504 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7507 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7508 }
7509
7510 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7513 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7514 }
7515
7516 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7519 Ok(UnresolvedItemName(self.parse_identifiers()?))
7520 }
7521
7522 fn parse_object_name(
7524 &mut self,
7525 object_type: ObjectType,
7526 ) -> Result<UnresolvedObjectName, ParserError> {
7527 Ok(match object_type {
7528 ObjectType::Table
7529 | ObjectType::View
7530 | ObjectType::MaterializedView
7531 | ObjectType::Source
7532 | ObjectType::Subsource
7533 | ObjectType::Sink
7534 | ObjectType::MetricSink
7535 | ObjectType::Index
7536 | ObjectType::Type
7537 | ObjectType::Secret
7538 | ObjectType::Connection
7539 | ObjectType::Func => UnresolvedObjectName::Item(self.parse_item_name()?),
7540 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7541 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7542 ObjectType::ClusterReplica => {
7543 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7544 }
7545 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7546 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7547 ObjectType::NetworkPolicy => {
7548 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7549 }
7550 })
7551 }
7552
7553 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7555 let mut idents = vec![];
7556 loop {
7557 idents.push(self.parse_identifier()?);
7558 if !self.consume_token(&Token::Dot) {
7559 break;
7560 }
7561 }
7562 Ok(idents)
7563 }
7564
7565 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7567 match self.consume_identifier()? {
7568 Some(id) => {
7569 if id.as_str().is_empty() {
7570 return parser_err!(
7571 self,
7572 self.peek_prev_pos(),
7573 "zero-length delimited identifier",
7574 );
7575 }
7576 Ok(id)
7577 }
7578 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7579 }
7580 }
7581
7582 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7583 match self.peek_token() {
7584 Some(Token::Keyword(kw)) => {
7585 self.next_token();
7586 Ok(Some(kw.into()))
7587 }
7588 Some(Token::Ident(id)) => {
7589 self.next_token();
7590 Ok(Some(self.new_identifier(id)?))
7591 }
7592 _ => Ok(None),
7593 }
7594 }
7595
7596 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7597 let mut id_parts = vec![id];
7598 match self.peek_token() {
7599 Some(Token::LParen) | Some(Token::Dot) => {
7600 let mut ends_with_wildcard = false;
7601 while self.consume_token(&Token::Dot) {
7602 match self.next_token() {
7603 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7604 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7605 Some(Token::Star) => {
7606 ends_with_wildcard = true;
7607 break;
7608 }
7609 unexpected => {
7610 return self.expected(
7611 self.peek_prev_pos(),
7612 "an identifier or a '*' after '.'",
7613 unexpected,
7614 );
7615 }
7616 }
7617 }
7618 if ends_with_wildcard {
7619 Ok(Expr::QualifiedWildcard(id_parts))
7620 } else if self.peek_token() == Some(Token::LParen) {
7621 let function =
7622 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7623 Ok(Expr::Function(function))
7624 } else {
7625 Ok(Expr::Identifier(id_parts))
7626 }
7627 }
7628 _ => Ok(Expr::Identifier(id_parts)),
7629 }
7630 }
7631
7632 fn parse_parenthesized_column_list(
7634 &mut self,
7635 optional: IsOptional,
7636 ) -> Result<Vec<Ident>, ParserError> {
7637 if self.consume_token(&Token::LParen) {
7638 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7639 self.expect_token(&Token::RParen)?;
7640 Ok(cols)
7641 } else if optional == Optional {
7642 Ok(vec![])
7643 } else {
7644 self.expected(
7645 self.peek_pos(),
7646 "a list of columns in parentheses",
7647 self.peek_token(),
7648 )
7649 }
7650 }
7651
7652 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7653 if self.consume_token(&Token::LParen) {
7654 let n = self.parse_literal_uint()?;
7655 self.expect_token(&Token::RParen)?;
7656 Ok(Some(n))
7657 } else {
7658 Ok(None)
7659 }
7660 }
7661
7662 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7663 self.expect_token(&Token::LBracket)?;
7664 let key_type = Box::new(self.parse_data_type()?);
7665 self.expect_token(&Token::Arrow)?;
7666 let value_type = Box::new(self.parse_data_type()?);
7667 self.expect_token(&Token::RBracket)?;
7668 Ok(RawDataType::Map {
7669 key_type,
7670 value_type,
7671 })
7672 }
7673
7674 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7675 self.expect_keyword(FROM)?;
7676 let table_name = RawItemName::Name(self.parse_item_name()?);
7677 let alias = self.parse_optional_table_alias()?;
7678 let using = if self.parse_keyword(USING) {
7679 self.parse_comma_separated(Parser::parse_table_and_joins)?
7680 } else {
7681 vec![]
7682 };
7683 let selection = if self.parse_keyword(WHERE) {
7684 Some(self.parse_expr()?)
7685 } else {
7686 None
7687 };
7688
7689 Ok(Statement::Delete(DeleteStatement {
7690 table_name,
7691 alias,
7692 using,
7693 selection,
7694 }))
7695 }
7696
7697 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7699 Ok(SelectStatement {
7700 query: self.parse_query()?,
7701 as_of: self.parse_optional_as_of()?,
7702 })
7703 }
7704
7705 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7710 self.checked_recur_mut(|parser| {
7711 let cte_block = if parser.parse_keyword(WITH) {
7712 if parser.parse_keyword(MUTUALLY) {
7713 parser.expect_keyword(RECURSIVE)?;
7714 let options = if parser.consume_token(&Token::LParen) {
7715 let options =
7716 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7717 parser.expect_token(&Token::RParen)?;
7718 options
7719 } else {
7720 vec![]
7721 };
7722 CteBlock::MutuallyRecursive(MutRecBlock {
7723 options,
7724 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7725 })
7726 } else {
7727 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7729 }
7730 } else {
7731 CteBlock::empty()
7732 };
7733
7734 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7735
7736 parser.parse_query_tail(cte_block, body)
7737 })
7738 }
7739
7740 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7741 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7742 RECURSION => {
7743 self.expect_keyword(LIMIT)?;
7744 Ok(MutRecBlockOption {
7745 name: MutRecBlockOptionName::RecursionLimit,
7746 value: self.parse_optional_option_value()?,
7747 })
7748 }
7749 RETURN => {
7750 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7751 Ok(MutRecBlockOption {
7752 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7753 value: self.parse_optional_option_value()?,
7754 })
7755 }
7756 ERROR => {
7757 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7758 Ok(MutRecBlockOption {
7759 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7760 value: self.parse_optional_option_value()?,
7761 })
7762 }
7763 _ => unreachable!(),
7764 }
7765 }
7766
7767 fn parse_query_tail(
7768 &mut self,
7769 ctes: CteBlock<Raw>,
7770 body: SetExpr<Raw>,
7771 ) -> Result<Query<Raw>, ParserError> {
7772 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7773 SetExpr::Query(query) => {
7774 let Query {
7775 ctes,
7776 body,
7777 order_by,
7778 limit,
7779 offset,
7780 } = *query;
7781 (ctes, order_by, limit, offset, body)
7782 }
7783 _ => (CteBlock::empty(), vec![], None, None, body),
7784 };
7785
7786 let ctes = if ctes.is_empty() {
7787 inner_ctes
7788 } else if !inner_ctes.is_empty() {
7789 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7790 } else {
7791 ctes
7792 };
7793
7794 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7795 if !inner_order_by.is_empty() {
7796 return parser_err!(
7797 self,
7798 self.peek_prev_pos(),
7799 "multiple ORDER BY clauses not allowed"
7800 );
7801 }
7802 self.parse_comma_separated(Parser::parse_order_by_expr)?
7803 } else {
7804 inner_order_by
7805 };
7806
7807 let mut limit = inner_limit;
7811 let mut offset = inner_offset;
7812 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7813 match parsed_keyword {
7814 LIMIT => {
7815 if limit.is_some() {
7816 return parser_err!(
7817 self,
7818 self.peek_prev_pos(),
7819 "multiple LIMIT/FETCH clauses not allowed"
7820 );
7821 }
7822 limit = if self.parse_keyword(ALL) {
7823 None
7824 } else {
7825 Some(Limit {
7826 with_ties: false,
7827 quantity: self.parse_expr()?,
7828 })
7829 };
7830 }
7831 OFFSET => {
7832 if offset.is_some() {
7833 return parser_err!(
7834 self,
7835 self.peek_prev_pos(),
7836 "multiple OFFSET clauses not allowed"
7837 );
7838 }
7839 let value = self.parse_expr()?;
7840 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7841 offset = Some(value);
7842 }
7843 FETCH => {
7844 if limit.is_some() {
7845 return parser_err!(
7846 self,
7847 self.peek_prev_pos(),
7848 "multiple LIMIT/FETCH clauses not allowed"
7849 );
7850 }
7851 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7852 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7853 Expr::Value(Value::Number('1'.into()))
7854 } else {
7855 let quantity = self.parse_expr()?;
7856 self.expect_one_of_keywords(&[ROW, ROWS])?;
7857 quantity
7858 };
7859 let with_ties = if self.parse_keyword(ONLY) {
7860 false
7861 } else if self.parse_keywords(&[WITH, TIES]) {
7862 true
7863 } else {
7864 return self.expected(
7865 self.peek_pos(),
7866 "one of ONLY or WITH TIES",
7867 self.peek_token(),
7868 );
7869 };
7870 limit = Some(Limit {
7871 with_ties,
7872 quantity,
7873 });
7874 }
7875 _ => unreachable!(),
7876 }
7877 }
7878
7879 Ok(Query {
7880 ctes,
7881 body,
7882 order_by,
7883 limit,
7884 offset,
7885 })
7886 }
7887
7888 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7890 let alias = TableAlias {
7891 name: self.parse_identifier()?,
7892 columns: self.parse_parenthesized_column_list(Optional)?,
7893 strict: false,
7894 };
7895 self.expect_keyword(AS)?;
7896 self.expect_token(&Token::LParen)?;
7897 let query = self.parse_query()?;
7898 self.expect_token(&Token::RParen)?;
7899 Ok(Cte {
7900 alias,
7901 query,
7902 id: (),
7903 })
7904 }
7905
7906 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7912 let name = self.parse_identifier()?;
7913 self.expect_token(&Token::LParen)?;
7914 let columns = self.parse_comma_separated(|parser| {
7915 Ok(CteMutRecColumnDef {
7916 name: parser.parse_identifier()?,
7917 data_type: parser.parse_data_type()?,
7918 })
7919 })?;
7920 self.expect_token(&Token::RParen)?;
7921 self.expect_keyword(AS)?;
7922 self.expect_token(&Token::LParen)?;
7923 let query = self.parse_query()?;
7924 self.expect_token(&Token::RParen)?;
7925 Ok(CteMutRec {
7926 name,
7927 columns,
7928 query,
7929 id: (),
7930 })
7931 }
7932
7933 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7942 let expr = if self.parse_keyword(SELECT) {
7945 SetExpr::Select(Box::new(self.parse_select()?))
7946 } else if self.consume_token(&Token::LParen) {
7947 let subquery = self.parse_query()?;
7949 self.expect_token(&Token::RParen)?;
7950 SetExpr::Query(Box::new(subquery))
7951 } else if self.parse_keyword(VALUES) {
7952 SetExpr::Values(self.parse_values()?)
7953 } else if self.parse_keyword(SHOW) {
7954 SetExpr::Show(self.parse_show()?)
7955 } else if self.parse_keyword(TABLE) {
7956 SetExpr::Table(self.parse_raw_name()?)
7957 } else {
7958 return self.expected(
7959 self.peek_pos(),
7960 "SELECT, VALUES, or a subquery in the query body",
7961 self.peek_token(),
7962 );
7963 };
7964
7965 self.parse_query_body_seeded(precedence, expr)
7966 }
7967
7968 fn parse_query_body_seeded(
7969 &mut self,
7970 precedence: SetPrecedence,
7971 mut expr: SetExpr<Raw>,
7972 ) -> Result<SetExpr<Raw>, ParserError> {
7973 loop {
7974 let next_token = self.peek_token();
7976 let op = self.parse_set_operator(&next_token);
7977 let next_precedence = match op {
7978 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7980 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7982 None => break,
7984 };
7985 if precedence >= next_precedence {
7986 break;
7987 }
7988 self.next_token(); let all = self.parse_keyword(ALL);
7991 let distinct = self.parse_keyword(DISTINCT);
7992 if all && distinct {
7993 return parser_err!(
7994 self,
7995 self.peek_prev_pos(),
7996 "Cannot specify both ALL and DISTINCT in set operation"
7997 );
7998 }
7999 expr = SetExpr::SetOperation {
8000 left: Box::new(expr),
8001 op: op.unwrap(),
8002 all,
8003 right: Box::new(self.parse_query_body(next_precedence)?),
8004 };
8005 }
8006
8007 Ok(expr)
8008 }
8009
8010 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
8011 match token {
8012 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
8013 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
8014 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
8015 _ => None,
8016 }
8017 }
8018
8019 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
8022 let all = self.parse_keyword(ALL);
8023 let distinct = self.parse_keyword(DISTINCT);
8024 if all && distinct {
8025 return parser_err!(
8026 self,
8027 self.peek_prev_pos(),
8028 "Cannot specify both ALL and DISTINCT in SELECT"
8029 );
8030 }
8031 let distinct = if distinct && self.parse_keyword(ON) {
8032 self.expect_token(&Token::LParen)?;
8033 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
8034 self.expect_token(&Token::RParen)?;
8035 Some(Distinct::On(exprs))
8036 } else if distinct {
8037 Some(Distinct::EntireRow)
8038 } else {
8039 None
8040 };
8041
8042 let projection = match self.peek_token() {
8043 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
8047 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
8048 _ => {
8049 let mut projection = vec![];
8050 loop {
8051 projection.push(self.parse_select_item()?);
8052 if !self.consume_token(&Token::Comma) {
8053 break;
8054 }
8055 if self.peek_keyword(FROM) {
8056 return parser_err!(
8057 self,
8058 self.peek_prev_pos(),
8059 "invalid trailing comma in SELECT list",
8060 );
8061 }
8062 }
8063 projection
8064 }
8065 };
8066
8067 let from = if self.parse_keyword(FROM) {
8073 self.parse_comma_separated(Parser::parse_table_and_joins)?
8074 } else {
8075 vec![]
8076 };
8077
8078 let selection = if self.parse_keyword(WHERE) {
8079 Some(self.parse_expr()?)
8080 } else {
8081 None
8082 };
8083
8084 let group_by = if self.parse_keywords(&[GROUP, BY]) {
8085 self.parse_comma_separated(Parser::parse_expr)?
8086 } else {
8087 vec![]
8088 };
8089
8090 let having = if self.parse_keyword(HAVING) {
8091 Some(self.parse_expr()?)
8092 } else {
8093 None
8094 };
8095
8096 let qualify = if self.parse_keyword(QUALIFY) {
8097 Some(self.parse_expr()?)
8098 } else {
8099 None
8100 };
8101
8102 let options = if self.parse_keyword(OPTIONS) {
8103 self.expect_token(&Token::LParen)?;
8104 let options = self.parse_comma_separated(Self::parse_select_option)?;
8105 self.expect_token(&Token::RParen)?;
8106 options
8107 } else {
8108 vec![]
8109 };
8110
8111 Ok(Select {
8112 distinct,
8113 projection,
8114 from,
8115 selection,
8116 group_by,
8117 having,
8118 qualify,
8119 options,
8120 })
8121 }
8122
8123 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
8124 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
8125 EXPECTED => {
8126 self.expect_keywords(&[GROUP, SIZE])?;
8127 SelectOptionName::ExpectedGroupSize
8128 }
8129 AGGREGATE => {
8130 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8131 SelectOptionName::AggregateInputGroupSize
8132 }
8133 DISTINCT => {
8134 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
8135 SelectOptionName::DistinctOnInputGroupSize
8136 }
8137 LIMIT => {
8138 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
8139 SelectOptionName::LimitInputGroupSize
8140 }
8141 _ => unreachable!(),
8142 };
8143 Ok(SelectOption {
8144 name,
8145 value: self.parse_optional_option_value()?,
8146 })
8147 }
8148
8149 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8150 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
8151 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
8152 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
8153 if !normal {
8154 match variable.as_str().parse() {
8155 Ok(TIME) => {
8156 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8157 variable = ident!("timezone");
8158 normal = true;
8159 }
8160 Ok(NAMES) => {
8161 variable = ident!("client_encoding");
8162 normal = true;
8163 }
8164 _ => {}
8165 }
8166 }
8167 if variable.as_str().parse() == Ok(SCHEMA) {
8168 variable = ident!("search_path");
8169 let to = self
8170 .parse_set_schema_to()
8171 .map_parser_err(StatementKind::SetVariable)?;
8172 Ok(Statement::SetVariable(SetVariableStatement {
8173 local: modifier == Some(LOCAL),
8174 variable,
8175 to,
8176 }))
8177 } else if normal {
8178 let to = self
8179 .parse_set_variable_to()
8180 .map_parser_err(StatementKind::SetVariable)?;
8181 Ok(Statement::SetVariable(SetVariableStatement {
8182 local: modifier == Some(LOCAL),
8183 variable,
8184 to,
8185 }))
8186 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8187 Ok(Statement::SetTransaction(SetTransactionStatement {
8189 local: true,
8190 modes: self
8191 .parse_transaction_modes(true)
8192 .map_parser_err(StatementKind::SetTransaction)?,
8193 }))
8194 } else if modifier == Some(SESSION)
8195 && variable.as_str().parse() == Ok(CHARACTERISTICS)
8196 && self.parse_keywords(&[AS, TRANSACTION])
8197 {
8198 Ok(Statement::SetTransaction(SetTransactionStatement {
8200 local: false,
8201 modes: self
8202 .parse_transaction_modes(true)
8203 .map_parser_err(StatementKind::SetTransaction)?,
8204 }))
8205 } else {
8206 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8207 .map_no_statement_parser_err()
8208 }
8209 }
8210
8211 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8212 if self.parse_keyword(DEFAULT) {
8213 Ok(SetVariableTo::Default)
8214 } else {
8215 let to = self.parse_set_variable_value()?;
8216 Ok(SetVariableTo::Values(vec![to]))
8217 }
8218 }
8219
8220 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8221 if self.parse_keyword(DEFAULT) {
8222 Ok(SetVariableTo::Default)
8223 } else {
8224 Ok(SetVariableTo::Values(
8225 self.parse_comma_separated(Parser::parse_set_variable_value)?,
8226 ))
8227 }
8228 }
8229
8230 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8231 if let Some(value) = self.maybe_parse(Parser::parse_value) {
8232 Ok(SetVariableValue::Literal(value))
8233 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8234 Ok(SetVariableValue::Ident(ident))
8235 } else {
8236 self.expected(self.peek_pos(), "variable value", self.peek_token())
8237 }
8238 }
8239
8240 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8241 let mut variable = self.parse_identifier()?;
8242 if variable.as_str().parse() == Ok(SCHEMA) {
8243 variable = ident!("search_path");
8244 }
8245 Ok(Statement::ResetVariable(ResetVariableStatement {
8246 variable,
8247 }))
8248 }
8249
8250 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8251 let redacted = self.parse_keyword(REDACTED);
8252 if redacted && !self.peek_keyword(CREATE) {
8253 return parser_err!(
8254 self,
8255 self.peek_pos(),
8256 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8257 );
8258 }
8259 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8260 self.parse_show_columns()
8261 } else if self.parse_keyword(OBJECTS) {
8262 let from = if self.parse_keywords(&[FROM]) {
8263 Some(self.parse_schema_name()?)
8264 } else {
8265 None
8266 };
8267 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8268 object_type: ShowObjectType::Object,
8269 from,
8270 filter: self.parse_show_statement_filter()?,
8271 }))
8272 } else if let Some(object_type) = self.parse_plural_object_type() {
8273 let from = if object_type.lives_in_schema() {
8274 if self.parse_keywords(&[FROM]) {
8275 Some(self.parse_schema_name()?)
8276 } else {
8277 None
8278 }
8279 } else {
8280 None
8281 };
8282
8283 let show_object_type = match object_type {
8284 ObjectType::Database => ShowObjectType::Database,
8285 ObjectType::Schema => {
8286 let from = if self.parse_keyword(FROM) {
8287 Some(self.parse_database_name()?)
8288 } else {
8289 None
8290 };
8291 ShowObjectType::Schema { from }
8292 }
8293 ObjectType::Table => {
8294 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8295 Some(self.parse_raw_name()?)
8296 } else {
8297 None
8298 };
8299 ShowObjectType::Table { on_source }
8300 }
8301 ObjectType::View => ShowObjectType::View,
8302 ObjectType::Source => {
8303 let in_cluster = self.parse_optional_in_cluster()?;
8304 ShowObjectType::Source { in_cluster }
8305 }
8306 ObjectType::Subsource => {
8307 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8308 Some(self.parse_raw_name()?)
8309 } else {
8310 None
8311 };
8312
8313 if from.is_some() && on_source.is_some() {
8314 return parser_err!(
8315 self,
8316 self.peek_prev_pos(),
8317 "Cannot specify both FROM and ON"
8318 );
8319 }
8320
8321 ShowObjectType::Subsource { on_source }
8322 }
8323 ObjectType::Sink => {
8324 let in_cluster = self.parse_optional_in_cluster()?;
8325 ShowObjectType::Sink { in_cluster }
8326 }
8327 ObjectType::Type => ShowObjectType::Type,
8328 ObjectType::Role => ShowObjectType::Role,
8329 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8330 ObjectType::Secret => ShowObjectType::Secret,
8331 ObjectType::Connection => ShowObjectType::Connection,
8332 ObjectType::Cluster => ShowObjectType::Cluster,
8333 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8334 ObjectType::MaterializedView => {
8335 let in_cluster = self.parse_optional_in_cluster()?;
8336 ShowObjectType::MaterializedView { in_cluster }
8337 }
8338 ObjectType::Index => {
8339 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8340 Some(self.parse_raw_name()?)
8341 } else {
8342 None
8343 };
8344
8345 if from.is_some() && on_object.is_some() {
8346 return parser_err!(
8347 self,
8348 self.peek_prev_pos(),
8349 "Cannot specify both FROM and ON"
8350 );
8351 }
8352
8353 let in_cluster = self.parse_optional_in_cluster()?;
8354 ShowObjectType::Index {
8355 in_cluster,
8356 on_object,
8357 }
8358 }
8359 ObjectType::Func | ObjectType::MetricSink => {
8360 return parser_err!(
8361 self,
8362 self.peek_prev_pos(),
8363 format!("Unsupported SHOW on {object_type}")
8364 );
8365 }
8366 };
8367 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8368 object_type: show_object_type,
8369 from,
8370 filter: self.parse_show_statement_filter()?,
8371 }))
8372 } else if self.parse_keyword(CLUSTER) {
8373 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8374 variable: ident!("cluster"),
8375 }))
8376 } else if self.parse_keyword(PRIVILEGES) {
8377 self.parse_show_privileges()
8378 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8379 self.parse_show_default_privileges()
8380 } else if self.parse_keyword(ROLE) {
8381 self.expect_keyword(MEMBERSHIP)?;
8382 let role = if self.parse_keyword(FOR) {
8383 Some(self.parse_identifier()?)
8384 } else {
8385 None
8386 };
8387 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8388 object_type: ShowObjectType::RoleMembership { role },
8389 from: None,
8390 filter: self.parse_show_statement_filter()?,
8391 }))
8392 } else if self.parse_keywords(&[CREATE, VIEW]) {
8393 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8394 view_name: self.parse_raw_name()?,
8395 redacted,
8396 }))
8397 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8398 Ok(ShowStatement::ShowCreateMaterializedView(
8399 ShowCreateMaterializedViewStatement {
8400 materialized_view_name: self.parse_raw_name()?,
8401 redacted,
8402 },
8403 ))
8404 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8405 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8406 source_name: self.parse_raw_name()?,
8407 redacted,
8408 }))
8409 } else if self.parse_keywords(&[CREATE, TABLE]) {
8410 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8411 table_name: self.parse_raw_name()?,
8412 redacted,
8413 }))
8414 } else if self.parse_keywords(&[CREATE, SINK]) {
8415 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8416 sink_name: self.parse_raw_name()?,
8417 redacted,
8418 }))
8419 } else if self.parse_keywords(&[CREATE, INDEX]) {
8420 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8421 index_name: self.parse_raw_name()?,
8422 redacted,
8423 }))
8424 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8425 Ok(ShowStatement::ShowCreateConnection(
8426 ShowCreateConnectionStatement {
8427 connection_name: self.parse_raw_name()?,
8428 redacted,
8429 },
8430 ))
8431 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8432 if redacted {
8433 return parser_err!(
8434 self,
8435 self.peek_prev_pos(),
8436 "SHOW REDACTED CREATE CLUSTER is not supported"
8437 );
8438 }
8439 Ok(ShowStatement::ShowCreateCluster(
8440 ShowCreateClusterStatement {
8441 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8442 },
8443 ))
8444 } else if self.parse_keywords(&[CREATE, TYPE]) {
8445 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8446 type_name: self.parse_data_type()?,
8447 redacted,
8448 }))
8449 } else {
8450 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8451 ident!("transaction_isolation")
8452 } else if self.parse_keywords(&[TIME, ZONE]) {
8453 ident!("timezone")
8454 } else {
8455 self.parse_identifier()?
8456 };
8457 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8458 variable,
8459 }))
8460 }
8461 }
8462
8463 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8464 self.expect_one_of_keywords(&[FROM, IN])?;
8465 let table_name = self.parse_raw_name()?;
8466 let filter = self.parse_show_statement_filter()?;
8470 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8471 table_name,
8472 filter,
8473 }))
8474 }
8475
8476 fn parse_show_statement_filter(
8477 &mut self,
8478 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8479 if self.parse_keyword(LIKE) {
8480 Ok(Some(ShowStatementFilter::Like(
8481 self.parse_literal_string()?,
8482 )))
8483 } else if self.parse_keyword(WHERE) {
8484 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8485 } else {
8486 Ok(None)
8487 }
8488 }
8489
8490 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8491 let object_type = if self.parse_keyword(ON) {
8492 Some(self.expect_plural_system_object_type_for_privileges()?)
8493 } else {
8494 None
8495 };
8496 let role = if self.parse_keyword(FOR) {
8497 Some(self.parse_identifier()?)
8498 } else {
8499 None
8500 };
8501 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8502 object_type: ShowObjectType::Privileges { object_type, role },
8503 from: None,
8504 filter: self.parse_show_statement_filter()?,
8505 }))
8506 }
8507
8508 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8509 let object_type = if self.parse_keyword(ON) {
8510 Some(self.expect_plural_object_type_for_privileges()?)
8511 } else {
8512 None
8513 };
8514 let role = if self.parse_keyword(FOR) {
8515 Some(self.parse_identifier()?)
8516 } else {
8517 None
8518 };
8519 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8520 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8521 from: None,
8522 filter: self.parse_show_statement_filter()?,
8523 }))
8524 }
8525
8526 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8527 self.expect_keyword(SHARD)?;
8528 let id = self.parse_literal_string()?;
8529 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8530 }
8531
8532 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8533 let relation = self.parse_table_factor()?;
8534
8535 let mut joins = vec![];
8539 loop {
8540 let join = if self.parse_keyword(CROSS) {
8541 self.expect_keyword(JOIN)?;
8542 Join {
8543 relation: self.parse_table_factor()?,
8544 join_operator: JoinOperator::CrossJoin,
8545 }
8546 } else {
8547 let natural = self.parse_keyword(NATURAL);
8548 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8549 Some(kw)
8550 } else {
8551 None
8552 };
8553
8554 let join_operator_type = match peek_keyword {
8555 Some(INNER) | Some(JOIN) => {
8556 let _ = self.parse_keyword(INNER);
8557 self.expect_keyword(JOIN)?;
8558 JoinOperator::Inner
8559 }
8560 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8561 let _ = self.next_token();
8562 let _ = self.parse_keyword(OUTER);
8563 self.expect_keyword(JOIN)?;
8564 match kw {
8565 LEFT => JoinOperator::LeftOuter,
8566 RIGHT => JoinOperator::RightOuter,
8567 FULL => JoinOperator::FullOuter,
8568 _ => unreachable!(),
8569 }
8570 }
8571 Some(OUTER) => {
8572 return self.expected(
8573 self.peek_pos(),
8574 "LEFT, RIGHT, or FULL",
8575 self.peek_token(),
8576 );
8577 }
8578 None if natural => {
8579 return self.expected(
8580 self.peek_pos(),
8581 "a join type after NATURAL",
8582 self.peek_token(),
8583 );
8584 }
8585 _ => break,
8586 };
8587 let relation = self.parse_table_factor()?;
8588 let join_constraint = self.parse_join_constraint(natural)?;
8589 Join {
8590 relation,
8591 join_operator: join_operator_type(join_constraint),
8592 }
8593 };
8594 joins.push(join);
8595 }
8596 Ok(TableWithJoins { relation, joins })
8597 }
8598
8599 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8601 self.checked_recur_mut(|parser| parser.parse_table_factor_inner())
8608 }
8609
8610 fn parse_table_factor_inner(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8611 if self.parse_keyword(LATERAL) {
8612 if self.consume_token(&Token::LParen) {
8614 return self.parse_derived_table_factor(Lateral);
8615 } else if self.parse_keywords(&[ROWS, FROM]) {
8616 return self.parse_rows_from();
8617 } else {
8618 let name = self.parse_raw_name()?;
8619 self.expect_token(&Token::LParen)?;
8620 let args = self.parse_optional_args(false)?;
8621 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8622 return Ok(TableFactor::Function {
8623 function: Function {
8624 name,
8625 args,
8626 filter: None,
8627 over: None,
8628 distinct: false,
8629 },
8630 alias,
8631 with_ordinality,
8632 });
8633 }
8634 }
8635
8636 if self.consume_token(&Token::LParen) {
8637 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8659
8660 let table_and_joins = self.parse_table_and_joins()?;
8671 match table_and_joins.relation {
8672 TableFactor::NestedJoin { .. } => (),
8673 _ => {
8674 if table_and_joins.joins.is_empty() {
8675 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8678 }
8679 }
8680 }
8681 self.expect_token(&Token::RParen)?;
8682 Ok(TableFactor::NestedJoin {
8683 join: Box::new(table_and_joins),
8684 alias: self.parse_optional_table_alias()?,
8685 })
8686 } else if self.parse_keywords(&[ROWS, FROM]) {
8687 Ok(self.parse_rows_from()?)
8688 } else {
8689 let name = self.parse_raw_name()?;
8690 if self.consume_token(&Token::LParen) {
8691 let args = self.parse_optional_args(false)?;
8692 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8693 Ok(TableFactor::Function {
8694 function: Function {
8695 name,
8696 args,
8697 filter: None,
8698 over: None,
8699 distinct: false,
8700 },
8701 alias,
8702 with_ordinality,
8703 })
8704 } else {
8705 Ok(TableFactor::Table {
8706 name,
8707 alias: self.parse_optional_table_alias()?,
8708 })
8709 }
8710 }
8711 }
8712
8713 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8714 self.expect_token(&Token::LParen)?;
8715 let functions = self.parse_comma_separated(Parser::parse_windowless_function)?;
8716 self.expect_token(&Token::RParen)?;
8717 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8718 Ok(TableFactor::RowsFrom {
8719 functions,
8720 alias,
8721 with_ordinality,
8722 })
8723 }
8724
8725 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8732 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8733 let alias = self.parse_optional_table_alias()?;
8734 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8735 if with_ordinality_1 && with_ordinality_2 {
8736 return parser_err!(
8737 self,
8738 self.peek_prev_pos(),
8739 "WITH ORDINALITY specified twice"
8740 );
8741 }
8742 Ok((with_ordinality_1 || with_ordinality_2, alias))
8743 }
8744
8745 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8746 let name = self.parse_raw_name()?;
8747 self.parse_function(name)
8748 }
8749
8750 fn parse_windowless_function(&mut self) -> Result<Function<Raw>, ParserError> {
8755 let name = self.parse_raw_name()?;
8756 self.expect_token(&Token::LParen)?;
8757 let args = self.parse_optional_args(false)?;
8758 Ok(Function {
8759 name,
8760 args,
8761 filter: None,
8762 over: None,
8763 distinct: false,
8764 })
8765 }
8766
8767 fn parse_derived_table_factor(
8768 &mut self,
8769 lateral: IsLateral,
8770 ) -> Result<TableFactor<Raw>, ParserError> {
8771 let subquery = Box::new(self.parse_query()?);
8772 self.expect_token(&Token::RParen)?;
8773 let alias = self.parse_optional_table_alias()?;
8774 Ok(TableFactor::Derived {
8775 lateral: match lateral {
8776 Lateral => true,
8777 NotLateral => false,
8778 },
8779 subquery,
8780 alias,
8781 })
8782 }
8783
8784 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8785 if natural {
8786 Ok(JoinConstraint::Natural)
8787 } else if self.parse_keyword(ON) {
8788 let constraint = self.parse_expr()?;
8789 Ok(JoinConstraint::On(constraint))
8790 } else if self.parse_keyword(USING) {
8791 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8792 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8793
8794 Ok(JoinConstraint::Using { columns, alias })
8795 } else {
8796 self.expected(
8797 self.peek_pos(),
8798 "ON, or USING after JOIN",
8799 self.peek_token(),
8800 )
8801 }
8802 }
8803
8804 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8806 self.expect_keyword(INTO)?;
8807 let table_name = self.parse_raw_name()?;
8808 let columns = self.parse_parenthesized_column_list(Optional)?;
8809 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8810 InsertSource::DefaultValues
8811 } else {
8812 InsertSource::Query(self.parse_query()?)
8813 };
8814 let returning = self.parse_returning()?;
8815 Ok(Statement::Insert(InsertStatement {
8816 table_name,
8817 columns,
8818 source,
8819 returning,
8820 }))
8821 }
8822
8823 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8824 Ok(if self.parse_keyword(RETURNING) {
8825 self.parse_comma_separated(Parser::parse_select_item)?
8826 } else {
8827 Vec::new()
8828 })
8829 }
8830
8831 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8832 let table_name = RawItemName::Name(self.parse_item_name()?);
8833 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8835 let alias = alias.map(|name| TableAlias {
8836 name,
8837 columns: Vec::new(),
8838 strict: false,
8839 });
8840
8841 self.expect_keyword(SET)?;
8842 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8843 let selection = if self.parse_keyword(WHERE) {
8844 Some(self.parse_expr()?)
8845 } else {
8846 None
8847 };
8848
8849 Ok(Statement::Update(UpdateStatement {
8850 table_name,
8851 alias,
8852 assignments,
8853 selection,
8854 }))
8855 }
8856
8857 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8859 let id = self.parse_identifier()?;
8860 self.expect_token(&Token::Eq)?;
8861 let value = self.parse_expr()?;
8862 Ok(Assignment { id, value })
8863 }
8864
8865 fn parse_optional_args(
8866 &mut self,
8867 allow_order_by: bool,
8868 ) -> Result<FunctionArgs<Raw>, ParserError> {
8869 if self.consume_token(&Token::Star) {
8870 self.expect_token(&Token::RParen)?;
8871 Ok(FunctionArgs::Star)
8872 } else if self.consume_token(&Token::RParen) {
8873 Ok(FunctionArgs::args(vec![]))
8874 } else {
8875 let args = self.parse_comma_separated(Parser::parse_expr)?;
8876 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8880 self.parse_comma_separated(Parser::parse_order_by_expr)?
8881 } else {
8882 vec![]
8883 };
8884 self.expect_token(&Token::RParen)?;
8885 Ok(FunctionArgs::Args { args, order_by })
8886 }
8887 }
8888
8889 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8891 if self.parse_keyword(AS) {
8892 self.expect_keyword(OF)?;
8893 if self.parse_keywords(&[AT, LEAST]) {
8894 match self.parse_expr() {
8895 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8896 Err(e) => self.expected(
8897 e.pos,
8898 "a timestamp value after 'AS OF AT LEAST'",
8899 self.peek_token(),
8900 ),
8901 }
8902 } else {
8903 match self.parse_expr() {
8904 Ok(expr) => Ok(Some(AsOf::At(expr))),
8905 Err(e) => {
8906 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8907 }
8908 }
8909 }
8910 } else {
8911 Ok(None)
8912 }
8913 }
8914
8915 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8917 if self.parse_keyword(UP) {
8918 self.expect_keyword(TO)?;
8919 self.parse_expr().map(Some)
8920 } else {
8921 Ok(None)
8922 }
8923 }
8924
8925 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8930 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8931 let value = parser.parse_value().ok()?;
8932 let Value::Number(s) = value else { return None };
8933 s.parse().ok()
8934 }
8935
8936 if self.parse_keywords(&[AS, OF]) {
8937 match try_parse_u64(self) {
8938 Some(time) => Ok(Some(time)),
8939 None => {
8940 self.prev_token();
8941 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8942 }
8943 }
8944 } else {
8945 Ok(None)
8946 }
8947 }
8948
8949 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8951 if self.consume_token(&Token::Star) {
8952 return Ok(SelectItem::Wildcard);
8953 }
8954 Ok(SelectItem::Expr {
8955 expr: self.parse_expr()?,
8956 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8957 })
8958 }
8959
8960 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8963 let expr = self.parse_expr()?;
8964
8965 let asc = if self.parse_keyword(ASC) {
8966 Some(true)
8967 } else if self.parse_keyword(DESC) {
8968 Some(false)
8969 } else {
8970 None
8971 };
8972
8973 let nulls_last = if self.parse_keyword(NULLS) {
8974 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8975 Some(last)
8976 } else {
8977 None
8978 };
8979
8980 Ok(OrderByExpr {
8981 expr,
8982 asc,
8983 nulls_last,
8984 })
8985 }
8986
8987 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8988 let values = self.parse_comma_separated(|parser| {
8989 parser.expect_token(&Token::LParen)?;
8990 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8991 parser.expect_token(&Token::RParen)?;
8992 Ok(exprs)
8993 })?;
8994 Ok(Values(values))
8995 }
8996
8997 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8998 self.expect_keyword(TRANSACTION)?;
8999 Ok(Statement::StartTransaction(StartTransactionStatement {
9000 modes: self.parse_transaction_modes(false)?,
9001 }))
9002 }
9003
9004 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
9005 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9006 Ok(Statement::StartTransaction(StartTransactionStatement {
9007 modes: self.parse_transaction_modes(false)?,
9008 }))
9009 }
9010
9011 fn parse_transaction_modes(
9012 &mut self,
9013 mut required: bool,
9014 ) -> Result<Vec<TransactionMode>, ParserError> {
9015 let mut modes = vec![];
9016 loop {
9017 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
9018 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
9019 TransactionIsolationLevel::ReadUncommitted
9020 } else if self.parse_keywords(&[READ, COMMITTED]) {
9021 TransactionIsolationLevel::ReadCommitted
9022 } else if self.parse_keywords(&[REPEATABLE, READ]) {
9023 TransactionIsolationLevel::RepeatableRead
9024 } else if self.parse_keyword(SERIALIZABLE) {
9025 TransactionIsolationLevel::Serializable
9026 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
9027 TransactionIsolationLevel::StrongSessionSerializable
9028 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
9029 TransactionIsolationLevel::StrictSerializable
9030 } else {
9031 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
9032 };
9033 TransactionMode::IsolationLevel(iso_level)
9034 } else if self.parse_keywords(&[READ, ONLY]) {
9035 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
9036 } else if self.parse_keywords(&[READ, WRITE]) {
9037 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
9038 } else if required {
9039 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
9040 } else {
9041 break;
9042 };
9043 modes.push(mode);
9044 required = self.consume_token(&Token::Comma);
9049 }
9050 Ok(modes)
9051 }
9052
9053 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
9054 Ok(Statement::Commit(CommitStatement {
9055 chain: self.parse_commit_rollback_chain()?,
9056 }))
9057 }
9058
9059 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
9060 Ok(Statement::Rollback(RollbackStatement {
9061 chain: self.parse_commit_rollback_chain()?,
9062 }))
9063 }
9064
9065 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
9066 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
9067 if self.parse_keyword(AND) {
9068 let chain = !self.parse_keyword(NO);
9069 self.expect_keyword(CHAIN)?;
9070 Ok(chain)
9071 } else {
9072 Ok(false)
9073 }
9074 }
9075
9076 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
9077 parser_err!(
9078 self,
9079 self.peek_prev_pos(),
9080 "TAIL has been renamed to SUBSCRIBE"
9081 )
9082 }
9083
9084 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
9085 let _ = self.parse_keyword(TO);
9086 let relation = if self.consume_token(&Token::LParen) {
9087 let query = self.parse_query()?;
9088 self.expect_token(&Token::RParen)?;
9089 SubscribeRelation::Query(query)
9090 } else {
9091 SubscribeRelation::Name(self.parse_raw_name()?)
9092 };
9093 let mut output = self.parse_subscribe_output()?;
9094 let options = if self.parse_keyword(WITH) {
9095 self.expect_token(&Token::LParen)?;
9096 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
9097 self.expect_token(&Token::RParen)?;
9098 options
9099 } else {
9100 vec![]
9101 };
9102 let as_of = self.parse_optional_as_of()?;
9103 let up_to = self.parse_optional_up_to()?;
9104 if output == SubscribeOutput::Diffs {
9111 output = self.parse_subscribe_output()?;
9112 }
9113 Ok(Statement::Subscribe(SubscribeStatement {
9114 relation,
9115 options,
9116 as_of,
9117 up_to,
9118 output,
9119 }))
9120 }
9121
9122 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
9123 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
9124 PROGRESS => SubscribeOptionName::Progress,
9125 SNAPSHOT => SubscribeOptionName::Snapshot,
9126 _ => unreachable!(),
9127 };
9128 Ok(SubscribeOption {
9129 name,
9130 value: self.parse_optional_option_value()?,
9131 })
9132 }
9133
9134 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
9135 if self.parse_keywords(&[ENVELOPE]) {
9136 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
9137 self.expect_token(&Token::LParen)?;
9138 self.expect_keyword(KEY)?;
9139 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
9140 let output = match keyword {
9141 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
9142 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
9143 _ => unreachable!("no other keyword allowed"),
9144 };
9145 self.expect_token(&Token::RParen)?;
9146 Ok(output)
9147 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
9148 Ok(SubscribeOutput::WithinTimestampOrderBy {
9149 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
9150 })
9151 } else {
9152 Ok(SubscribeOutput::Diffs)
9153 }
9154 }
9155
9156 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9159 if self.parse_keyword(TIMESTAMP) {
9160 self.parse_explain_timestamp()
9161 .map_parser_err(StatementKind::ExplainTimestamp)
9162 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
9163 self.parse_explain_pushdown()
9164 .map_parser_err(StatementKind::ExplainPushdown)
9165 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
9166 self.parse_explain_analyze()
9167 .map_parser_err(StatementKind::ExplainAnalyzeObject)
9168 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
9169 self.parse_explain_schema()
9170 .map_parser_err(StatementKind::ExplainSinkSchema)
9171 } else {
9172 self.parse_explain_plan()
9173 .map_parser_err(StatementKind::ExplainPlan)
9174 }
9175 }
9176
9177 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
9178 let explainee = if self.parse_keyword(VIEW) {
9179 Explainee::View(self.parse_raw_name()?)
9181 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9182 Explainee::MaterializedView(self.parse_raw_name()?)
9184 } else if self.parse_keyword(INDEX) {
9185 Explainee::Index(self.parse_raw_name()?)
9187 } else if self.parse_keywords(&[REPLAN, VIEW]) {
9188 Explainee::ReplanView(self.parse_raw_name()?)
9190 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9191 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9193 } else if self.parse_keywords(&[REPLAN, INDEX]) {
9194 Explainee::ReplanIndex(self.parse_raw_name()?)
9196 } else {
9197 let broken = self.parse_keyword(BROKEN);
9198
9199 if self.peek_keywords(&[CREATE, VIEW])
9200 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9201 {
9202 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
9205 Statement::CreateView(stmt) => stmt,
9206 _ => panic!("Unexpected statement type return after parsing"),
9207 };
9208
9209 Explainee::CreateView(Box::new(stmt), broken)
9210 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9211 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9212 {
9213 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
9216 Statement::CreateMaterializedView(stmt) => stmt,
9217 _ => panic!("Unexpected statement type return after parsing"),
9218 };
9219
9220 Explainee::CreateMaterializedView(Box::new(stmt), broken)
9221 } else if self.peek_keywords(&[CREATE, INDEX])
9222 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9223 {
9224 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
9227 Statement::CreateIndex(stmt) => stmt,
9228 _ => panic!("Unexpected statement type return after parsing"),
9229 };
9230
9231 Explainee::CreateIndex(Box::new(stmt), broken)
9232 } else if self.peek_keyword(SUBSCRIBE) {
9233 let _ = self.parse_keyword(SUBSCRIBE); let stmt = match self.parse_subscribe()? {
9236 Statement::Subscribe(stmt) => stmt,
9237 _ => panic!("Unexpected statement type return after parsing"),
9238 };
9239 Explainee::Subscribe(Box::new(stmt), broken)
9240 } else {
9241 let query = self.parse_select_statement()?;
9243 Explainee::Select(Box::new(query), broken)
9244 }
9245 };
9246 Ok(explainee)
9247 }
9248
9249 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9252 let start = self.peek_pos();
9253 let (has_stage, stage) = match self.parse_one_of_keywords(&[
9254 RAW,
9255 DECORRELATED,
9256 LOCALLY,
9257 OPTIMIZED,
9258 PHYSICAL,
9259 OPTIMIZER,
9260 PLAN,
9261 ]) {
9262 Some(RAW) => {
9263 self.expect_keyword(PLAN)?;
9264 (true, Some(ExplainStage::RawPlan))
9265 }
9266 Some(DECORRELATED) => {
9267 self.expect_keyword(PLAN)?;
9268 (true, Some(ExplainStage::DecorrelatedPlan))
9269 }
9270 Some(LOCALLY) => {
9271 self.expect_keywords(&[OPTIMIZED, PLAN])?;
9272 (true, Some(ExplainStage::LocalPlan))
9273 }
9274 Some(OPTIMIZED) => {
9275 self.expect_keyword(PLAN)?;
9276 (true, Some(ExplainStage::GlobalPlan))
9277 }
9278 Some(PHYSICAL) => {
9279 self.expect_keyword(PLAN)?;
9280 (true, Some(ExplainStage::PhysicalPlan))
9281 }
9282 Some(OPTIMIZER) => {
9283 self.expect_keyword(TRACE)?;
9284 (true, Some(ExplainStage::Trace))
9285 }
9286 Some(PLAN) => {
9287 if self.parse_keyword(INSIGHTS) {
9288 (true, Some(ExplainStage::PlanInsights))
9289 } else {
9290 (true, None)
9292 }
9293 }
9294 None => {
9295 (false, None)
9297 }
9298 _ => unreachable!(),
9299 };
9300
9301 let with_options = if self.parse_keyword(WITH) {
9302 if self.consume_token(&Token::LParen) {
9303 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9304 self.expect_token(&Token::RParen)?;
9305 options
9306 } else {
9307 self.prev_token(); vec![]
9309 }
9310 } else {
9311 vec![]
9312 };
9313
9314 let format = if self.parse_keyword(AS) {
9315 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9316 Some(TEXT) => Some(ExplainFormat::Text),
9317 Some(JSON) => Some(ExplainFormat::Json),
9318 Some(DOT) => Some(ExplainFormat::Dot),
9319 Some(VERBOSE) => {
9320 self.expect_keyword(TEXT)?;
9321 Some(ExplainFormat::VerboseText)
9322 }
9323 None => return Err(ParserError::new(self.index, "expected a format")),
9324 _ => unreachable!(),
9325 }
9326 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9327 Some(ExplainFormat::VerboseText)
9329 } else {
9330 None
9331 };
9332
9333 if has_stage {
9334 self.expect_keyword(FOR)?;
9335 }
9336
9337 let explainee = self.parse_explainee()?;
9338
9339 if matches!((explainee.is_view(), &stage), (true, None)) {
9342 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9343 return Err(self.error(start, msg));
9344 }
9345
9346 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9347 stage,
9348 with_options,
9349 format,
9350 explainee,
9351 }))
9352 }
9353
9354 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9355 Ok(ExplainPlanOption {
9356 name: self.parse_explain_plan_option_name()?,
9357 value: self.parse_optional_option_value()?,
9358 })
9359 }
9360
9361 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9364 self.expect_keyword(FOR)?;
9365
9366 let explainee = self.parse_explainee()?;
9367
9368 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9369 explainee,
9370 }))
9371 }
9372
9373 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9374 if self.parse_keyword(CLUSTER) {
9376 let properties = self.parse_explain_analyze_computation_properties()?;
9377 let as_sql = self.parse_keywords(&[AS, SQL]);
9378 return Ok(Statement::ExplainAnalyzeCluster(
9379 ExplainAnalyzeClusterStatement { properties, as_sql },
9380 ));
9381 }
9382
9383 let properties = if self.parse_keyword(HINTS) {
9386 ExplainAnalyzeProperty::Hints
9387 } else {
9388 ExplainAnalyzeProperty::Computation(
9389 self.parse_explain_analyze_computation_properties()?,
9390 )
9391 };
9392
9393 self.expect_keyword(FOR)?;
9394
9395 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9396 INDEX => Explainee::Index(self.parse_raw_name()?),
9397 MATERIALIZED => {
9398 self.expect_keyword(VIEW)?;
9399 Explainee::MaterializedView(self.parse_raw_name()?)
9400 }
9401 _ => unreachable!(),
9402 };
9403
9404 let as_sql = self.parse_keywords(&[AS, SQL]);
9405
9406 Ok(Statement::ExplainAnalyzeObject(
9407 ExplainAnalyzeObjectStatement {
9408 properties,
9409 explainee,
9410 as_sql,
9411 },
9412 ))
9413 }
9414
9415 fn parse_explain_analyze_computation_properties(
9416 &mut self,
9417 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9418 let mut computation_properties = vec![CPU, MEMORY];
9419 let (kw, property) =
9420 self.parse_explain_analyze_computation_property(&computation_properties)?;
9421 let mut properties = vec![property];
9422 computation_properties.retain(|p| p != &kw);
9423
9424 while self.consume_token(&Token::Comma) {
9425 let (kw, property) =
9426 self.parse_explain_analyze_computation_property(&computation_properties)?;
9427 computation_properties.retain(|p| p != &kw);
9428 properties.push(property);
9429 }
9430
9431 let skew = self.parse_keywords(&[WITH, SKEW]);
9432
9433 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9434 }
9435
9436 fn parse_explain_analyze_computation_property(
9437 &mut self,
9438 properties: &[Keyword],
9439 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9440 if properties.is_empty() {
9441 return Err(ParserError::new(
9442 self.peek_pos(),
9443 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9444 ));
9445 }
9446
9447 match self.expect_one_of_keywords(properties)? {
9448 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9449 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9450 _ => unreachable!(),
9451 }
9452 }
9453
9454 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9457 let format = if self.parse_keyword(AS) {
9458 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9459 Some(TEXT) => Some(ExplainFormat::Text),
9460 Some(JSON) => Some(ExplainFormat::Json),
9461 None => return Err(ParserError::new(self.index, "expected a format")),
9462 _ => unreachable!(),
9463 }
9464 } else {
9465 None
9466 };
9467
9468 self.expect_keyword(FOR)?;
9469
9470 let query = self.parse_select_statement()?;
9471
9472 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9473 format,
9474 select: query,
9475 }))
9476 }
9477 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9480 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9481 KEY => ExplainSinkSchemaFor::Key,
9482 VALUE => ExplainSinkSchemaFor::Value,
9483 _ => unreachable!(),
9484 };
9485
9486 self.expect_keyword(SCHEMA)?;
9487
9488 let format = if self.parse_keyword(AS) {
9489 self.expect_keyword(JSON)?;
9491 Some(ExplainFormat::Json)
9492 } else {
9493 None
9494 };
9495
9496 self.expect_keywords(&[FOR, CREATE])?;
9497
9498 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9499 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9500 schema_for,
9501 format,
9502 statement,
9503 }))
9504 } else {
9505 unreachable!("only create sink can be returned here");
9506 }
9507 }
9508
9509 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9512 let name = self
9513 .parse_identifier()
9514 .map_parser_err(StatementKind::Declare)?;
9515 self.expect_keyword(CURSOR)
9516 .map_parser_err(StatementKind::Declare)?;
9517 if self.parse_keyword(WITH) {
9518 let err = parser_err!(
9519 self,
9520 self.peek_prev_pos(),
9521 format!("WITH HOLD is unsupported for cursors")
9522 )
9523 .map_parser_err(StatementKind::Declare);
9524 self.expect_keyword(HOLD)
9525 .map_parser_err(StatementKind::Declare)?;
9526 return err;
9527 }
9528 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9530 self.expect_keyword(FOR)
9531 .map_parser_err(StatementKind::Declare)?;
9532 let StatementParseResult { ast, sql } = self.parse_statement()?;
9533 Ok(Statement::Declare(DeclareStatement {
9534 name,
9535 stmt: Box::new(ast),
9536 sql: sql.to_string(),
9537 }))
9538 }
9539
9540 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9543 let name = self.parse_identifier()?;
9544 Ok(Statement::Close(CloseStatement { name }))
9545 }
9546
9547 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9550 let name = self
9551 .parse_identifier()
9552 .map_parser_err(StatementKind::Prepare)?;
9553 self.expect_keyword(AS)
9554 .map_parser_err(StatementKind::Prepare)?;
9555 let pos = self.peek_pos();
9556 let StatementParseResult { ast, sql } = self.parse_statement()?;
9558 if !matches!(
9559 ast,
9560 Statement::Select(_)
9561 | Statement::Insert(_)
9562 | Statement::Delete(_)
9563 | Statement::Update(_)
9564 | Statement::Fetch(_),
9565 ) {
9566 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9567 }
9568 Ok(Statement::Prepare(PrepareStatement {
9569 name,
9570 stmt: Box::new(ast),
9571 sql: sql.to_string(),
9572 }))
9573 }
9574
9575 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9578 if self.parse_keywords(&[UNIT, TEST]) {
9580 return self.parse_execute_unit_test();
9581 }
9582
9583 let name = self.parse_identifier()?;
9585 let params = if self.consume_token(&Token::LParen) {
9586 let params = self.parse_comma_separated(Parser::parse_expr)?;
9587 self.expect_token(&Token::RParen)?;
9588 params
9589 } else {
9590 Vec::new()
9591 };
9592 Ok(Statement::Execute(ExecuteStatement { name, params }))
9593 }
9594
9595 fn parse_execute_unit_test(&mut self) -> Result<Statement<Raw>, ParserError> {
9598 let name = self.parse_identifier()?;
9600
9601 self.expect_keyword(FOR)?;
9603
9604 let target = self.parse_raw_name()?;
9606
9607 let at_time = if self.parse_keywords(&[AT, TIME]) {
9609 Some(self.parse_expr()?)
9610 } else {
9611 None
9612 };
9613
9614 let mut mocks = Vec::new();
9618 if self.parse_keyword(MOCK) {
9619 mocks.push(self.parse_mock_view_def()?);
9620 while self.consume_token(&Token::Comma) {
9621 self.expect_keyword(MOCK)?;
9622 mocks.push(self.parse_mock_view_def()?);
9623 }
9624 }
9625
9626 self.expect_keyword(EXPECTED)?;
9627
9628 self.expect_token(&Token::LParen)?;
9629 let expected_columns = self.parse_comma_separated(|parser| {
9630 Ok(ColumnDef {
9631 name: parser.parse_identifier()?,
9632 data_type: parser.parse_data_type()?,
9633 collation: None,
9634 options: vec![],
9635 })
9636 })?;
9637 self.expect_token(&Token::RParen)?;
9638
9639 self.expect_keyword(AS)?;
9640 self.expect_token(&Token::LParen)?;
9641 let expected_query = self.parse_query()?;
9642 self.expect_token(&Token::RParen)?;
9643
9644 let expected = ExpectedResultDef {
9645 columns: expected_columns,
9646 query: expected_query,
9647 };
9648
9649 Ok(Statement::ExecuteUnitTest(ExecuteUnitTestStatement {
9650 name,
9651 target,
9652 at_time,
9653 mocks,
9654 expected,
9655 }))
9656 }
9657
9658 fn parse_mock_view_def(&mut self) -> Result<MockViewDef<Raw>, ParserError> {
9661 let name = self.parse_raw_name()?;
9662
9663 self.expect_token(&Token::LParen)?;
9664 let columns = self.parse_comma_separated(|parser| {
9665 Ok(ColumnDef {
9666 name: parser.parse_identifier()?,
9667 data_type: parser.parse_data_type()?,
9668 collation: None,
9669 options: vec![],
9670 })
9671 })?;
9672 self.expect_token(&Token::RParen)?;
9673
9674 self.expect_keyword(AS)?;
9675 self.expect_token(&Token::LParen)?;
9676 let query = self.parse_query()?;
9677 self.expect_token(&Token::RParen)?;
9678
9679 Ok(MockViewDef {
9680 name,
9681 columns,
9682 query,
9683 })
9684 }
9685
9686 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9689 let _ = self.parse_keyword(PREPARE);
9690 let name = if self.parse_keyword(ALL) {
9691 None
9692 } else {
9693 Some(self.parse_identifier()?)
9694 };
9695 Ok(Statement::Deallocate(DeallocateStatement { name }))
9696 }
9697
9698 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9701 let _ = self.parse_keyword(FORWARD);
9702 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9703 Some(FetchDirection::ForwardCount(count))
9704 } else if self.parse_keyword(ALL) {
9705 Some(FetchDirection::ForwardAll)
9706 } else {
9707 None
9708 };
9709 let _ = self.parse_keyword(FROM);
9710 let name = self.parse_identifier()?;
9711 let options = if self.parse_keyword(WITH) {
9712 self.expect_token(&Token::LParen)?;
9713 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9714 self.expect_token(&Token::RParen)?;
9715 options
9716 } else {
9717 vec![]
9718 };
9719 Ok(Statement::Fetch(FetchStatement {
9720 name,
9721 count,
9722 options,
9723 }))
9724 }
9725
9726 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9727 self.expect_keyword(TIMEOUT)?;
9728 Ok(FetchOption {
9729 name: FetchOptionName::Timeout,
9730 value: self.parse_optional_option_value()?,
9731 })
9732 }
9733
9734 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9737 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9738 Some(DEBUG) => NoticeSeverity::Debug,
9739 Some(INFO) => NoticeSeverity::Info,
9740 Some(LOG) => NoticeSeverity::Log,
9741 Some(NOTICE) => NoticeSeverity::Notice,
9742 Some(WARNING) => NoticeSeverity::Warning,
9743 Some(_) => unreachable!(),
9744 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9745 };
9746
9747 Ok(Statement::Raise(RaiseStatement { severity }))
9748 }
9749
9750 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9753 match self.parse_privilege_specification() {
9754 Some(privileges) => self
9755 .parse_grant_privilege(privileges)
9756 .map_parser_err(StatementKind::GrantPrivileges),
9757 None => self
9758 .parse_grant_role()
9759 .map_parser_err(StatementKind::GrantRole),
9760 }
9761 }
9762
9763 fn parse_grant_privilege(
9766 &mut self,
9767 privileges: PrivilegeSpecification,
9768 ) -> Result<Statement<Raw>, ParserError> {
9769 self.expect_keyword(ON)?;
9770 let target = self.expect_grant_target_specification("GRANT")?;
9771 self.expect_keyword(TO)?;
9772 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9773 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9774 privileges,
9775 target,
9776 roles,
9777 }))
9778 }
9779
9780 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9783 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9784 self.expect_keyword(TO)?;
9785 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9786 Ok(Statement::GrantRole(GrantRoleStatement {
9787 role_names,
9788 member_names,
9789 }))
9790 }
9791
9792 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9795 match self.parse_privilege_specification() {
9796 Some(privileges) => self
9797 .parse_revoke_privilege(privileges)
9798 .map_parser_err(StatementKind::RevokePrivileges),
9799 None => self
9800 .parse_revoke_role()
9801 .map_parser_err(StatementKind::RevokeRole),
9802 }
9803 }
9804
9805 fn parse_revoke_privilege(
9808 &mut self,
9809 privileges: PrivilegeSpecification,
9810 ) -> Result<Statement<Raw>, ParserError> {
9811 self.expect_keyword(ON)?;
9812 let target = self.expect_grant_target_specification("REVOKE")?;
9813 self.expect_keyword(FROM)?;
9814 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9815 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9816 privileges,
9817 target,
9818 roles,
9819 }))
9820 }
9821
9822 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9825 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9826 self.expect_keyword(FROM)?;
9827 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9828 Ok(Statement::RevokeRole(RevokeRoleStatement {
9829 role_names,
9830 member_names,
9831 }))
9832 }
9833
9834 fn expect_grant_target_specification(
9835 &mut self,
9836 statement_type: &str,
9837 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9838 if self.parse_keyword(SYSTEM) {
9839 return Ok(GrantTargetSpecification::System);
9840 }
9841
9842 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9843 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9844 let object_spec_inner = if self.parse_keyword(IN) {
9845 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9846 return parser_err!(
9847 self,
9848 self.peek_prev_pos(),
9849 format!("IN invalid for {object_type}S")
9850 );
9851 }
9852 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9853 DATABASE => GrantTargetSpecificationInner::All(
9854 GrantTargetAllSpecification::AllDatabases {
9855 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9856 },
9857 ),
9858 SCHEMA => {
9859 if object_type == ObjectType::Schema {
9860 self.prev_token();
9861 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9862 }
9863 GrantTargetSpecificationInner::All(
9864 GrantTargetAllSpecification::AllSchemas {
9865 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9866 },
9867 )
9868 }
9869 _ => unreachable!(),
9870 }
9871 } else {
9872 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9873 };
9874 (object_type, object_spec_inner)
9875 } else {
9876 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9877 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9878 names: self
9879 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9880 };
9881 (object_type, object_spec_inner)
9882 };
9883
9884 Ok(GrantTargetSpecification::Object {
9885 object_type,
9886 object_spec_inner,
9887 })
9888 }
9889
9890 fn expect_grant_revoke_object_type(
9893 &mut self,
9894 statement_type: &str,
9895 ) -> Result<ObjectType, ParserError> {
9896 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9898 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9899 }
9900
9901 fn expect_grant_revoke_plural_object_type(
9904 &mut self,
9905 statement_type: &str,
9906 ) -> Result<ObjectType, ParserError> {
9907 let object_type = self.expect_plural_object_type().map_err(|_| {
9908 self.expected::<_, ObjectType>(
9910 self.peek_pos(),
9911 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9912 self.peek_token(),
9913 )
9914 .unwrap_err()
9915 })?;
9916 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9917 Ok(object_type)
9918 }
9919
9920 fn expect_grant_revoke_object_type_inner(
9921 &self,
9922 statement_type: &str,
9923 object_type: ObjectType,
9924 ) -> Result<ObjectType, ParserError> {
9925 match object_type {
9926 ObjectType::View | ObjectType::MaterializedView | ObjectType::Source => {
9927 parser_err!(
9928 self,
9929 self.peek_prev_pos(),
9930 format!(
9931 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9932 )
9933 )
9934 }
9935 ObjectType::Sink
9936 | ObjectType::MetricSink
9937 | ObjectType::Index
9938 | ObjectType::ClusterReplica
9939 | ObjectType::Role
9940 | ObjectType::Func
9941 | ObjectType::Subsource => {
9942 parser_err!(
9943 self,
9944 self.peek_prev_pos(),
9945 format!("Unsupported {statement_type} on {object_type}")
9946 )
9947 }
9948 ObjectType::Table
9949 | ObjectType::Type
9950 | ObjectType::Cluster
9951 | ObjectType::Secret
9952 | ObjectType::Connection
9953 | ObjectType::Database
9954 | ObjectType::Schema
9955 | ObjectType::NetworkPolicy => Ok(object_type),
9956 }
9957 }
9958
9959 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9961 Ok(
9962 match self.expect_one_of_keywords(&[
9963 TABLE,
9964 VIEW,
9965 MATERIALIZED,
9966 SOURCE,
9967 SINK,
9968 METRIC,
9969 INDEX,
9970 TYPE,
9971 ROLE,
9972 USER,
9973 CLUSTER,
9974 SECRET,
9975 CONNECTION,
9976 DATABASE,
9977 SCHEMA,
9978 FUNCTION,
9979 NETWORK,
9980 ])? {
9981 TABLE => ObjectType::Table,
9982 VIEW => ObjectType::View,
9983 MATERIALIZED => {
9984 if let Err(e) = self.expect_keyword(VIEW) {
9985 self.prev_token();
9986 return Err(e);
9987 }
9988 ObjectType::MaterializedView
9989 }
9990 SOURCE => ObjectType::Source,
9991 SINK => ObjectType::Sink,
9992 METRIC => {
9993 if let Err(e) = self.expect_keyword(SINK) {
9994 self.prev_token();
9995 return Err(e);
9996 }
9997 ObjectType::MetricSink
9998 }
9999 INDEX => ObjectType::Index,
10000 TYPE => ObjectType::Type,
10001 ROLE | USER => ObjectType::Role,
10002 CLUSTER => {
10003 if self.parse_keyword(REPLICA) {
10004 ObjectType::ClusterReplica
10005 } else {
10006 ObjectType::Cluster
10007 }
10008 }
10009 SECRET => ObjectType::Secret,
10010 CONNECTION => ObjectType::Connection,
10011 DATABASE => ObjectType::Database,
10012 SCHEMA => ObjectType::Schema,
10013 FUNCTION => ObjectType::Func,
10014 NETWORK => {
10015 if let Err(e) = self.expect_keyword(POLICY) {
10016 self.prev_token();
10017 return Err(e);
10018 }
10019 ObjectType::NetworkPolicy
10020 }
10021 _ => unreachable!(),
10022 },
10023 )
10024 }
10025
10026 fn parse_object_type(&mut self) -> Option<ObjectType> {
10028 Some(
10029 match self.parse_one_of_keywords(&[
10030 TABLE,
10031 VIEW,
10032 MATERIALIZED,
10033 SOURCE,
10034 SINK,
10035 METRIC,
10036 INDEX,
10037 TYPE,
10038 ROLE,
10039 USER,
10040 CLUSTER,
10041 SECRET,
10042 CONNECTION,
10043 DATABASE,
10044 SCHEMA,
10045 FUNCTION,
10046 NETWORK,
10047 ])? {
10048 TABLE => ObjectType::Table,
10049 VIEW => ObjectType::View,
10050 MATERIALIZED => {
10051 if self.parse_keyword(VIEW) {
10052 ObjectType::MaterializedView
10053 } else {
10054 self.prev_token();
10055 return None;
10056 }
10057 }
10058 SOURCE => ObjectType::Source,
10059 SINK => ObjectType::Sink,
10060 METRIC => {
10061 if self.parse_keyword(SINK) {
10062 ObjectType::MetricSink
10063 } else {
10064 self.prev_token();
10065 return None;
10066 }
10067 }
10068 INDEX => ObjectType::Index,
10069 TYPE => ObjectType::Type,
10070 ROLE | USER => ObjectType::Role,
10071 CLUSTER => {
10072 if self.parse_keyword(REPLICA) {
10073 ObjectType::ClusterReplica
10074 } else {
10075 ObjectType::Cluster
10076 }
10077 }
10078 SECRET => ObjectType::Secret,
10079 CONNECTION => ObjectType::Connection,
10080 DATABASE => ObjectType::Database,
10081 SCHEMA => ObjectType::Schema,
10082 FUNCTION => ObjectType::Func,
10083 NETWORK => {
10084 if self.parse_keyword(POLICY) {
10085 ObjectType::NetworkPolicy
10086 } else {
10087 self.prev_token();
10088 return None;
10089 }
10090 }
10091 _ => unreachable!(),
10092 },
10093 )
10094 }
10095
10096 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
10098 Ok(
10099 match self.expect_one_of_keywords(&[
10100 TABLES,
10101 VIEWS,
10102 MATERIALIZED,
10103 SOURCES,
10104 SINKS,
10105 INDEXES,
10106 TYPES,
10107 ROLES,
10108 USERS,
10109 CLUSTER,
10110 CLUSTERS,
10111 SECRETS,
10112 CONNECTIONS,
10113 DATABASES,
10114 SCHEMAS,
10115 POLICIES,
10116 ])? {
10117 TABLES => ObjectType::Table,
10118 VIEWS => ObjectType::View,
10119 MATERIALIZED => {
10120 if let Err(e) = self.expect_keyword(VIEWS) {
10121 self.prev_token();
10122 return Err(e);
10123 }
10124 ObjectType::MaterializedView
10125 }
10126 SOURCES => ObjectType::Source,
10127 SINKS => ObjectType::Sink,
10128 INDEXES => ObjectType::Index,
10129 TYPES => ObjectType::Type,
10130 ROLES | USERS => ObjectType::Role,
10131 CLUSTER => {
10132 if let Err(e) = self.expect_keyword(REPLICAS) {
10133 self.prev_token();
10134 return Err(e);
10135 }
10136 ObjectType::ClusterReplica
10137 }
10138 CLUSTERS => ObjectType::Cluster,
10139 SECRETS => ObjectType::Secret,
10140 CONNECTIONS => ObjectType::Connection,
10141 DATABASES => ObjectType::Database,
10142 SCHEMAS => ObjectType::Schema,
10143 POLICIES => ObjectType::NetworkPolicy,
10144 _ => unreachable!(),
10145 },
10146 )
10147 }
10148
10149 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
10151 Some(
10152 match self.parse_one_of_keywords(&[
10153 TABLES,
10154 VIEWS,
10155 MATERIALIZED,
10156 SOURCES,
10157 SINKS,
10158 INDEXES,
10159 TYPES,
10160 ROLES,
10161 USERS,
10162 CLUSTER,
10163 CLUSTERS,
10164 SECRETS,
10165 CONNECTIONS,
10166 DATABASES,
10167 SCHEMAS,
10168 SUBSOURCES,
10169 NETWORK,
10170 ])? {
10171 TABLES => ObjectType::Table,
10172 VIEWS => ObjectType::View,
10173 MATERIALIZED => {
10174 if self.parse_keyword(VIEWS) {
10175 ObjectType::MaterializedView
10176 } else {
10177 self.prev_token();
10178 return None;
10179 }
10180 }
10181 SOURCES => ObjectType::Source,
10182 SINKS => ObjectType::Sink,
10183 INDEXES => ObjectType::Index,
10184 TYPES => ObjectType::Type,
10185 ROLES | USERS => ObjectType::Role,
10186 CLUSTER => {
10187 if self.parse_keyword(REPLICAS) {
10188 ObjectType::ClusterReplica
10189 } else {
10190 self.prev_token();
10191 return None;
10192 }
10193 }
10194 CLUSTERS => ObjectType::Cluster,
10195 SECRETS => ObjectType::Secret,
10196 CONNECTIONS => ObjectType::Connection,
10197 DATABASES => ObjectType::Database,
10198 SCHEMAS => ObjectType::Schema,
10199 SUBSOURCES => ObjectType::Subsource,
10200 NETWORK => {
10201 if self.parse_keyword(POLICIES) {
10202 ObjectType::NetworkPolicy
10203 } else {
10204 self.prev_token();
10205 return None;
10206 }
10207 }
10208 _ => unreachable!(),
10209 },
10210 )
10211 }
10212
10213 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
10216 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10217 return parser_err!(
10218 self,
10219 self.peek_prev_pos(),
10220 format!("For object type {object_type}, you must specify 'TABLES'")
10221 );
10222 }
10223 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10224 self.prev_token();
10225 return parser_err!(
10226 self,
10227 self.peek_prev_pos(),
10228 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
10229 );
10230 }
10231
10232 Ok(
10233 match self.expect_one_of_keywords(&[
10234 TABLES,
10235 TYPES,
10236 CLUSTERS,
10237 SECRETS,
10238 CONNECTIONS,
10239 DATABASES,
10240 SCHEMAS,
10241 ])? {
10242 TABLES => ObjectType::Table,
10243 TYPES => ObjectType::Type,
10244 CLUSTERS => ObjectType::Cluster,
10245 SECRETS => ObjectType::Secret,
10246 CONNECTIONS => ObjectType::Connection,
10247 DATABASES => ObjectType::Database,
10248 SCHEMAS => ObjectType::Schema,
10249 _ => unreachable!(),
10250 },
10251 )
10252 }
10253
10254 fn expect_plural_system_object_type_for_privileges(
10257 &mut self,
10258 ) -> Result<SystemObjectType, ParserError> {
10259 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
10260 return parser_err!(
10261 self,
10262 self.peek_prev_pos(),
10263 format!("For object type {object_type}, you must specify 'TABLES'")
10264 );
10265 }
10266 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
10267 self.prev_token();
10268 return parser_err!(
10269 self,
10270 self.peek_prev_pos(),
10271 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
10272 );
10273 }
10274
10275 Ok(
10276 match self.expect_one_of_keywords(&[
10277 SYSTEM,
10278 TABLES,
10279 TYPES,
10280 CLUSTERS,
10281 SECRETS,
10282 CONNECTIONS,
10283 DATABASES,
10284 SCHEMAS,
10285 ])? {
10286 SYSTEM => SystemObjectType::System,
10287 TABLES => SystemObjectType::Object(ObjectType::Table),
10288 TYPES => SystemObjectType::Object(ObjectType::Type),
10289 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10290 SECRETS => SystemObjectType::Object(ObjectType::Secret),
10291 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10292 DATABASES => SystemObjectType::Object(ObjectType::Database),
10293 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10294 _ => unreachable!(),
10295 },
10296 )
10297 }
10298
10299 fn parse_privilege(&mut self) -> Option<Privilege> {
10301 Some(
10302 match self.parse_one_of_keywords(&[
10303 INSERT,
10304 SELECT,
10305 UPDATE,
10306 DELETE,
10307 USAGE,
10308 CREATE,
10309 CREATEROLE,
10310 CREATEDB,
10311 CREATECLUSTER,
10312 CREATENETWORKPOLICY,
10313 ])? {
10314 INSERT => Privilege::INSERT,
10315 SELECT => Privilege::SELECT,
10316 UPDATE => Privilege::UPDATE,
10317 DELETE => Privilege::DELETE,
10318 USAGE => Privilege::USAGE,
10319 CREATE => Privilege::CREATE,
10320 CREATEROLE => Privilege::CREATEROLE,
10321 CREATEDB => Privilege::CREATEDB,
10322 CREATECLUSTER => Privilege::CREATECLUSTER,
10323 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10324 _ => unreachable!(),
10325 },
10326 )
10327 }
10328
10329 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10331 if self.parse_keyword(ALL) {
10332 let _ = self.parse_keyword(PRIVILEGES);
10333 return Some(PrivilegeSpecification::All);
10334 }
10335
10336 let mut privileges = Vec::new();
10337 while let Some(privilege) = self.parse_privilege() {
10338 privileges.push(privilege);
10339 if !self.consume_token(&Token::Comma) {
10340 break;
10341 }
10342 }
10343
10344 if privileges.is_empty() {
10345 None
10346 } else {
10347 Some(PrivilegeSpecification::Privileges(privileges))
10348 }
10349 }
10350
10351 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10353 let _ = self.parse_keyword(GROUP);
10354 self.parse_identifier()
10355 }
10356
10357 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10360 self.expect_keywords(&[OWNED, BY])?;
10361 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10362 self.expect_keyword(TO)?;
10363 let new_role = self.parse_identifier()?;
10364 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10365 old_roles,
10366 new_role,
10367 }))
10368 }
10369
10370 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10371 self.expect_keyword(ON)?;
10372
10373 let object = match self.expect_one_of_keywords(&[
10374 TABLE,
10375 VIEW,
10376 COLUMN,
10377 MATERIALIZED,
10378 SOURCE,
10379 SINK,
10380 INDEX,
10381 FUNCTION,
10382 CONNECTION,
10383 TYPE,
10384 SECRET,
10385 ROLE,
10386 DATABASE,
10387 SCHEMA,
10388 CLUSTER,
10389 NETWORK,
10390 ])? {
10391 TABLE => {
10392 let name = self.parse_raw_name()?;
10393 CommentObjectType::Table { name }
10394 }
10395 VIEW => {
10396 let name = self.parse_raw_name()?;
10397 CommentObjectType::View { name }
10398 }
10399 MATERIALIZED => {
10400 self.expect_keyword(VIEW)?;
10401 let name = self.parse_raw_name()?;
10402 CommentObjectType::MaterializedView { name }
10403 }
10404 SOURCE => {
10405 let name = self.parse_raw_name()?;
10406 CommentObjectType::Source { name }
10407 }
10408 SINK => {
10409 let name = self.parse_raw_name()?;
10410 CommentObjectType::Sink { name }
10411 }
10412 INDEX => {
10413 let name = self.parse_raw_name()?;
10414 CommentObjectType::Index { name }
10415 }
10416 FUNCTION => {
10417 let name = self.parse_raw_name()?;
10418 CommentObjectType::Func { name }
10419 }
10420 CONNECTION => {
10421 let name = self.parse_raw_name()?;
10422 CommentObjectType::Connection { name }
10423 }
10424 TYPE => {
10425 let ty = self.parse_data_type()?;
10426 CommentObjectType::Type { ty }
10427 }
10428 SECRET => {
10429 let name = self.parse_raw_name()?;
10430 CommentObjectType::Secret { name }
10431 }
10432 ROLE => {
10433 let name = self.parse_identifier()?;
10434 CommentObjectType::Role { name }
10435 }
10436 DATABASE => {
10437 let name = self.parse_database_name()?;
10438 CommentObjectType::Database { name }
10439 }
10440 SCHEMA => {
10441 let name = self.parse_schema_name()?;
10442 CommentObjectType::Schema { name }
10443 }
10444 CLUSTER => {
10445 if self.parse_keyword(REPLICA) {
10446 let name = self.parse_cluster_replica_name()?;
10447 CommentObjectType::ClusterReplica { name }
10448 } else {
10449 let name = self.parse_raw_ident()?;
10450 CommentObjectType::Cluster { name }
10451 }
10452 }
10453 COLUMN => {
10454 let name = self.parse_column_name()?;
10455 CommentObjectType::Column { name }
10456 }
10457 NETWORK => {
10458 self.expect_keyword(POLICY)?;
10459 let name = self.parse_raw_network_policy_name()?;
10460 CommentObjectType::NetworkPolicy { name }
10461 }
10462 _ => unreachable!(),
10463 };
10464
10465 self.expect_keyword(IS)?;
10466 let comment = match self.next_token() {
10467 Some(Token::Keyword(NULL)) => None,
10468 Some(Token::String(s)) => Some(s),
10469 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10470 };
10471
10472 Ok(Statement::Comment(CommentStatement { object, comment }))
10473 }
10474
10475 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10476 where
10477 S: TryInto<IdentString>,
10478 <S as TryInto<IdentString>>::Error: fmt::Display,
10479 {
10480 Ident::new(s).map_err(|e| ParserError {
10481 pos: self.peek_prev_pos(),
10482 message: e.to_string(),
10483 })
10484 }
10485}
10486
10487impl CheckedRecursion for Parser<'_> {
10488 fn recursion_guard(&self) -> &RecursionGuard {
10489 &self.recursion_guard
10490 }
10491}
10492
10493enum ParenthesizedFragment {
10497 Query(Query<Raw>),
10498 Exprs(Vec<Expr<Raw>>),
10499}
10500
10501impl ParenthesizedFragment {
10502 fn into_expr(self) -> Expr<Raw> {
10504 match self {
10505 ParenthesizedFragment::Exprs(exprs) => {
10506 if exprs.len() == 1 {
10509 Expr::Nested(Box::new(exprs.into_element()))
10512 } else {
10513 Expr::Row { exprs }
10516 }
10517 }
10518 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10520 }
10521 }
10522}
10523
10524include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));