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