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