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