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