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, in_cluster_replica) = if self.parse_keywords(&[IN, CLUSTER]) {
3916 let cluster = self.parse_raw_ident()?;
3917 let replica = if self.parse_keyword(REPLICA) {
3918 Some(self.parse_identifier()?)
3919 } else {
3920 None
3921 };
3922 (Some(cluster), replica)
3923 } else if self.parse_keywords(&[IN, REPLICA]) {
3924 let replica = self.parse_identifier()?;
3925 (None, Some(replica))
3926 } else {
3927 (None, None)
3928 };
3929
3930 let with_options = if self.parse_keyword(WITH) {
3931 self.expect_token(&Token::LParen)?;
3932 let options = self.parse_comma_separated(Parser::parse_materialized_view_option)?;
3933 self.expect_token(&Token::RParen)?;
3934 options
3935 } else {
3936 vec![]
3937 };
3938
3939 self.expect_keyword(AS)?;
3940 let query = self.parse_query()?;
3941 let as_of = self.parse_optional_internal_as_of()?;
3942
3943 Ok(Statement::CreateMaterializedView(
3944 CreateMaterializedViewStatement {
3945 if_exists,
3946 name,
3947 columns,
3948 replacement_for,
3949 in_cluster,
3950 in_cluster_replica,
3951 query,
3952 as_of,
3953 with_options,
3954 },
3955 ))
3956 }
3957
3958 fn parse_create_continual_task(&mut self) -> Result<Statement<Raw>, ParserError> {
3959 self.expect_keywords(&[CONTINUAL, TASK])?;
3961
3962 let name = RawItemName::Name(self.parse_item_name()?);
3964 let columns = match self.consume_token(&Token::LParen) {
3965 true => {
3966 let columns = self.parse_comma_separated(|parser| {
3967 Ok(CteMutRecColumnDef {
3968 name: parser.parse_identifier()?,
3969 data_type: parser.parse_data_type()?,
3970 })
3971 })?;
3972 self.expect_token(&Token::RParen)?;
3973 Some(columns)
3974 }
3975 false => None,
3976 };
3977 let in_cluster = self.parse_optional_in_cluster()?;
3978 let with_options = self.parse_create_continual_task_with_options()?;
3979
3980 self.expect_keywords(&[ON, INPUT])?;
3982 let input = self.parse_raw_name()?;
3983 let legacy_with_options = self.parse_create_continual_task_with_options()?;
3990 let with_options = match (!with_options.is_empty(), !legacy_with_options.is_empty()) {
3991 (_, false) => with_options,
3992 (false, true) => legacy_with_options,
3993 (true, true) => {
3994 return parser_err!(
3995 self,
3996 self.peek_prev_pos(),
3997 "CREATE CONTINUAL TASK with options in both new and legacy locations"
3998 );
3999 }
4000 };
4001
4002 self.expect_keyword(AS)?;
4003
4004 let mut stmts = Vec::new();
4005 let mut expecting_statement_delimiter = false;
4006 self.expect_token(&Token::LParen)?;
4007 loop {
4009 while self.consume_token(&Token::Semicolon) {
4011 expecting_statement_delimiter = false;
4012 }
4013
4014 if self.consume_token(&Token::RParen) {
4015 break;
4016 } else if expecting_statement_delimiter {
4017 self.expected(self.peek_pos(), "end of statement", self.peek_token())?
4018 }
4019
4020 let stmt = self.parse_statement().map_err(|err| err.error)?.ast;
4021 match stmt {
4022 Statement::Delete(stmt) => stmts.push(ContinualTaskStmt::Delete(stmt)),
4023 Statement::Insert(stmt) => stmts.push(ContinualTaskStmt::Insert(stmt)),
4024 _ => {
4025 return parser_err!(
4026 self,
4027 self.peek_prev_pos(),
4028 "unsupported query in CREATE CONTINUAL TASK"
4029 );
4030 }
4031 }
4032 expecting_statement_delimiter = true;
4033 }
4034
4035 let as_of = self.parse_optional_internal_as_of()?;
4036
4037 Ok(Statement::CreateContinualTask(
4038 CreateContinualTaskStatement {
4039 name,
4040 columns,
4041 in_cluster,
4042 with_options,
4043 input,
4044 stmts,
4045 as_of,
4046 sugar: None,
4047 },
4048 ))
4049 }
4050
4051 fn parse_create_continual_task_from_transform(
4052 &mut self,
4053 ) -> Result<Statement<Raw>, ParserError> {
4054 self.expect_keywords(&[CONTINUAL, TASK])?;
4055 let name = RawItemName::Name(self.parse_item_name()?);
4056 let in_cluster = self.parse_optional_in_cluster()?;
4057 let with_options = self.parse_create_continual_task_with_options()?;
4058
4059 self.expect_keywords(&[FROM, TRANSFORM])?;
4060 let input = self.parse_raw_name()?;
4061
4062 self.expect_keyword(USING)?;
4063 self.expect_token(&Token::LParen)?;
4064 let transform = self.parse_query()?;
4065 self.expect_token(&Token::RParen)?;
4066
4067 let as_of = self.parse_optional_internal_as_of()?;
4068
4069 let insert = InsertStatement {
4071 table_name: name.clone(),
4072 columns: Vec::new(),
4073 source: InsertSource::Query(transform.clone()),
4074 returning: Vec::new(),
4075 };
4076
4077 let stmts = vec![ContinualTaskStmt::Insert(insert)];
4079
4080 Ok(Statement::CreateContinualTask(
4081 CreateContinualTaskStatement {
4082 name,
4083 columns: None,
4084 in_cluster,
4085 with_options,
4086 input,
4087 stmts,
4088 as_of,
4089 sugar: Some(CreateContinualTaskSugar::Transform { transform }),
4090 },
4091 ))
4092 }
4093
4094 fn parse_create_continual_task_from_retain(&mut self) -> Result<Statement<Raw>, ParserError> {
4095 self.expect_keywords(&[CONTINUAL, TASK])?;
4096 let name = RawItemName::Name(self.parse_item_name()?);
4097 let in_cluster = self.parse_optional_in_cluster()?;
4098 let with_options = self.parse_create_continual_task_with_options()?;
4099
4100 self.expect_keywords(&[FROM, RETAIN])?;
4101 let input = self.parse_raw_name()?;
4102
4103 self.expect_keyword(WHILE)?;
4104 self.expect_token(&Token::LParen)?;
4105 let retain = self.parse_expr()?;
4106 self.expect_token(&Token::RParen)?;
4107
4108 let as_of = self.parse_optional_internal_as_of()?;
4109
4110 let insert = InsertStatement {
4112 table_name: name.clone(),
4113 columns: Vec::new(),
4114 source: InsertSource::Query(Query {
4115 ctes: CteBlock::Simple(Vec::new()),
4116 body: SetExpr::Select(Box::new(Select {
4117 from: vec![TableWithJoins {
4118 relation: TableFactor::Table {
4119 name: input.clone(),
4120 alias: None,
4121 },
4122 joins: Vec::new(),
4123 }],
4124 selection: Some(retain.clone()),
4125 distinct: None,
4126 projection: vec![SelectItem::Wildcard],
4127 group_by: Vec::new(),
4128 having: None,
4129 qualify: None,
4130 options: Vec::new(),
4131 })),
4132 order_by: Vec::new(),
4133 limit: None,
4134 offset: None,
4135 }),
4136 returning: Vec::new(),
4137 };
4138
4139 let delete = DeleteStatement {
4141 table_name: name.clone(),
4142 alias: None,
4143 using: Vec::new(),
4144 selection: Some(retain.clone().negate()),
4145 };
4146
4147 let stmts = vec![
4149 ContinualTaskStmt::Insert(insert),
4150 ContinualTaskStmt::Delete(delete),
4151 ];
4152
4153 Ok(Statement::CreateContinualTask(
4154 CreateContinualTaskStatement {
4155 name,
4156 columns: None,
4157 in_cluster,
4158 with_options,
4159 input,
4160 stmts,
4161 as_of,
4162 sugar: Some(CreateContinualTaskSugar::Retain { retain }),
4163 },
4164 ))
4165 }
4166
4167 fn parse_materialized_view_option_name(
4168 &mut self,
4169 ) -> Result<MaterializedViewOptionName, ParserError> {
4170 let option = self.expect_one_of_keywords(&[ASSERT, PARTITION, RETAIN, REFRESH])?;
4171 let name = match option {
4172 ASSERT => {
4173 self.expect_keywords(&[NOT, NULL])?;
4174 MaterializedViewOptionName::AssertNotNull
4175 }
4176 PARTITION => {
4177 self.expect_keyword(BY)?;
4178 MaterializedViewOptionName::PartitionBy
4179 }
4180 RETAIN => {
4181 self.expect_keyword(HISTORY)?;
4182 MaterializedViewOptionName::RetainHistory
4183 }
4184 REFRESH => MaterializedViewOptionName::Refresh,
4185 _ => unreachable!(),
4186 };
4187 Ok(name)
4188 }
4189
4190 fn parse_materialized_view_option(
4191 &mut self,
4192 ) -> Result<MaterializedViewOption<Raw>, ParserError> {
4193 let name = self.parse_materialized_view_option_name()?;
4194 let value = match name {
4195 MaterializedViewOptionName::RetainHistory => self.parse_option_retain_history()?,
4196 MaterializedViewOptionName::Refresh => {
4197 Some(self.parse_materialized_view_refresh_option_value()?)
4198 }
4199 _ => self.parse_optional_option_value()?,
4200 };
4201 Ok(MaterializedViewOption { name, value })
4202 }
4203
4204 fn parse_option_retain_history(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
4205 Ok(Some(self.parse_retain_history()?))
4206 }
4207
4208 fn parse_retain_history(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
4209 let _ = self.consume_token(&Token::Eq);
4210 self.expect_keyword(FOR)?;
4211 let value = self.parse_value()?;
4212 Ok(WithOptionValue::RetainHistoryFor(value))
4213 }
4214
4215 fn parse_materialized_view_refresh_option_value(
4216 &mut self,
4217 ) -> Result<WithOptionValue<Raw>, ParserError> {
4218 let _ = self.consume_token(&Token::Eq);
4219
4220 match self.expect_one_of_keywords(&[ON, AT, EVERY])? {
4221 ON => {
4222 self.expect_keyword(COMMIT)?;
4223 Ok(WithOptionValue::Refresh(RefreshOptionValue::OnCommit))
4224 }
4225 AT => {
4226 if self.parse_keyword(CREATION) {
4227 Ok(WithOptionValue::Refresh(RefreshOptionValue::AtCreation))
4228 } else {
4229 Ok(WithOptionValue::Refresh(RefreshOptionValue::At(
4230 RefreshAtOptionValue {
4231 time: self.parse_expr()?,
4232 },
4233 )))
4234 }
4235 }
4236 EVERY => {
4237 let interval = self.parse_interval_value()?;
4238 let aligned_to = if self.parse_keywords(&[ALIGNED, TO]) {
4239 Some(self.parse_expr()?)
4240 } else {
4241 None
4242 };
4243 Ok(WithOptionValue::Refresh(RefreshOptionValue::Every(
4244 RefreshEveryOptionValue {
4245 interval,
4246 aligned_to,
4247 },
4248 )))
4249 }
4250 _ => unreachable!(),
4251 }
4252 }
4253
4254 fn parse_create_continual_task_with_options(
4255 &mut self,
4256 ) -> Result<Vec<ContinualTaskOption<Raw>>, ParserError> {
4257 if self.parse_keyword(WITH) {
4258 self.expect_token(&Token::LParen)?;
4259 let options = self.parse_comma_separated(Parser::parse_continual_task_option)?;
4260 self.expect_token(&Token::RParen)?;
4261 Ok(options)
4262 } else {
4263 Ok(vec![])
4264 }
4265 }
4266
4267 fn parse_continual_task_option_name(&mut self) -> Result<ContinualTaskOptionName, ParserError> {
4268 let option = self.expect_one_of_keywords(&[SNAPSHOT])?;
4269 let name = match option {
4270 SNAPSHOT => ContinualTaskOptionName::Snapshot,
4271 _ => unreachable!(),
4272 };
4273 Ok(name)
4274 }
4275
4276 fn parse_continual_task_option(&mut self) -> Result<ContinualTaskOption<Raw>, ParserError> {
4277 let name = self.parse_continual_task_option_name()?;
4278 let value = self.parse_optional_option_value()?;
4279 Ok(ContinualTaskOption { name, value })
4280 }
4281
4282 fn parse_create_index(&mut self) -> Result<Statement<Raw>, ParserError> {
4283 let default_index = self.parse_keyword(DEFAULT);
4284 self.expect_keyword(INDEX)?;
4285
4286 let if_not_exists = self.parse_if_not_exists()?;
4287 let name = if self.peek_keyword(IN) || self.peek_keyword(ON) {
4288 if if_not_exists && !default_index {
4289 return self.expected(self.peek_pos(), "index name", self.peek_token());
4290 }
4291 None
4292 } else {
4293 Some(self.parse_identifier()?)
4294 };
4295 let in_cluster = self.parse_optional_in_cluster()?;
4296 self.expect_keyword(ON)?;
4297 let on_name = self.parse_raw_name()?;
4298
4299 if self.parse_keyword(USING) {
4301 self.expect_keyword(ARRANGEMENT)?;
4302 }
4303
4304 let key_parts = if default_index {
4305 None
4306 } else {
4307 self.expect_token(&Token::LParen)?;
4308 if self.consume_token(&Token::RParen) {
4309 Some(vec![])
4310 } else {
4311 let key_parts = self
4312 .parse_comma_separated(Parser::parse_order_by_expr)?
4313 .into_iter()
4314 .map(|x| x.expr)
4315 .collect::<Vec<_>>();
4316 self.expect_token(&Token::RParen)?;
4317 Some(key_parts)
4318 }
4319 };
4320
4321 let with_options = if self.parse_keyword(WITH) {
4322 self.expect_token(&Token::LParen)?;
4323 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
4324 vec![]
4325 } else {
4326 self.parse_comma_separated(Parser::parse_index_option)?
4327 };
4328 self.expect_token(&Token::RParen)?;
4329 o
4330 } else {
4331 vec![]
4332 };
4333
4334 Ok(Statement::CreateIndex(CreateIndexStatement {
4335 name,
4336 in_cluster,
4337 on_name,
4338 key_parts,
4339 with_options,
4340 if_not_exists,
4341 }))
4342 }
4343
4344 fn parse_table_option_name(&mut self) -> Result<TableOptionName, ParserError> {
4345 if self.parse_keyword(REDACTED) {
4348 return Ok(TableOptionName::RedactedTest);
4349 }
4350 let name = match self.expect_one_of_keywords(&[PARTITION, RETAIN])? {
4351 PARTITION => {
4352 self.expect_keyword(BY)?;
4353 TableOptionName::PartitionBy
4354 }
4355 RETAIN => {
4356 self.expect_keyword(HISTORY)?;
4357 TableOptionName::RetainHistory
4358 }
4359 _ => unreachable!(),
4360 };
4361 Ok(name)
4362 }
4363
4364 fn parse_table_option(&mut self) -> Result<TableOption<Raw>, ParserError> {
4365 let name = self.parse_table_option_name()?;
4366 let value = match name {
4367 TableOptionName::PartitionBy => self.parse_optional_option_value(),
4368 TableOptionName::RetainHistory => self.parse_option_retain_history(),
4369 TableOptionName::RedactedTest => self.parse_optional_option_value(),
4370 }?;
4371 Ok(TableOption { name, value })
4372 }
4373
4374 fn parse_index_option_name(&mut self) -> Result<IndexOptionName, ParserError> {
4375 self.expect_keywords(&[RETAIN, HISTORY])?;
4376 Ok(IndexOptionName::RetainHistory)
4377 }
4378
4379 fn parse_index_option(&mut self) -> Result<IndexOption<Raw>, ParserError> {
4380 let name = self.parse_index_option_name()?;
4381 let value = match name {
4382 IndexOptionName::RetainHistory => self.parse_option_retain_history(),
4383 }?;
4384 Ok(IndexOption { name, value })
4385 }
4386
4387 fn parse_raw_ident(&mut self) -> Result<RawClusterName, ParserError> {
4388 if self.consume_token(&Token::LBracket) {
4389 let id = self.parse_raw_ident_str()?;
4390 self.expect_token(&Token::RBracket)?;
4391 Ok(RawClusterName::Resolved(id))
4392 } else {
4393 Ok(RawClusterName::Unresolved(self.parse_identifier()?))
4394 }
4395 }
4396
4397 fn parse_raw_network_policy_name(&mut self) -> Result<RawNetworkPolicyName, ParserError> {
4398 if self.consume_token(&Token::LBracket) {
4399 let id = self.parse_raw_ident_str()?;
4400 self.expect_token(&Token::RBracket)?;
4401 Ok(RawNetworkPolicyName::Resolved(id))
4402 } else {
4403 Ok(RawNetworkPolicyName::Unresolved(self.parse_identifier()?))
4404 }
4405 }
4406
4407 fn parse_raw_ident_str(&mut self) -> Result<String, ParserError> {
4408 match self.next_token() {
4409 Some(Token::Ident(id)) => Ok(id.into_inner()),
4410 Some(Token::Number(n)) => Ok(n),
4411 _ => parser_err!(self, self.peek_prev_pos(), "expected id"),
4412 }
4413 }
4414
4415 fn parse_optional_in_cluster(&mut self) -> Result<Option<RawClusterName>, ParserError> {
4416 if self.parse_keywords(&[IN, CLUSTER]) {
4417 Ok(Some(self.parse_raw_ident()?))
4418 } else {
4419 Ok(None)
4420 }
4421 }
4422
4423 fn parse_create_role(&mut self) -> Result<Statement<Raw>, ParserError> {
4424 self.expect_keyword(ROLE)?;
4425 let name = self.parse_identifier()?;
4426 let _ = self.parse_keyword(WITH);
4427 let options = self.parse_role_attributes()?;
4428 Ok(Statement::CreateRole(CreateRoleStatement { name, options }))
4429 }
4430
4431 fn parse_role_attributes(&mut self) -> Result<Vec<RoleAttribute>, ParserError> {
4432 let mut options = vec![];
4433 loop {
4434 match self.parse_one_of_keywords(&[
4435 SUPERUSER,
4436 NOSUPERUSER,
4437 LOGIN,
4438 NOLOGIN,
4439 INHERIT,
4440 NOINHERIT,
4441 CREATECLUSTER,
4442 NOCREATECLUSTER,
4443 CREATEDB,
4444 NOCREATEDB,
4445 CREATEROLE,
4446 NOCREATEROLE,
4447 PASSWORD,
4448 ]) {
4449 None => break,
4450 Some(SUPERUSER) => options.push(RoleAttribute::SuperUser),
4451 Some(NOSUPERUSER) => options.push(RoleAttribute::NoSuperUser),
4452 Some(LOGIN) => options.push(RoleAttribute::Login),
4453 Some(NOLOGIN) => options.push(RoleAttribute::NoLogin),
4454 Some(INHERIT) => options.push(RoleAttribute::Inherit),
4455 Some(NOINHERIT) => options.push(RoleAttribute::NoInherit),
4456 Some(CREATECLUSTER) => options.push(RoleAttribute::CreateCluster),
4457 Some(NOCREATECLUSTER) => options.push(RoleAttribute::NoCreateCluster),
4458 Some(CREATEDB) => options.push(RoleAttribute::CreateDB),
4459 Some(NOCREATEDB) => options.push(RoleAttribute::NoCreateDB),
4460 Some(CREATEROLE) => options.push(RoleAttribute::CreateRole),
4461 Some(NOCREATEROLE) => options.push(RoleAttribute::NoCreateRole),
4462 Some(PASSWORD) => {
4463 if self.parse_keyword(NULL) {
4464 options.push(RoleAttribute::Password(None));
4465 continue;
4466 }
4467 let password = self.parse_literal_string()?;
4468 options.push(RoleAttribute::Password(Some(password)));
4469 }
4470 Some(_) => unreachable!(),
4471 }
4472 }
4473 Ok(options)
4474 }
4475
4476 fn parse_create_secret(&mut self) -> Result<Statement<Raw>, ParserError> {
4477 self.expect_keyword(SECRET)?;
4478 let if_not_exists = self.parse_if_not_exists()?;
4479 let name = self.parse_item_name()?;
4480 self.expect_keyword(AS)?;
4481 let value = self.parse_expr()?;
4482 Ok(Statement::CreateSecret(CreateSecretStatement {
4483 name,
4484 if_not_exists,
4485 value,
4486 }))
4487 }
4488
4489 fn parse_create_type(&mut self) -> Result<Statement<Raw>, ParserError> {
4490 self.expect_keyword(TYPE)?;
4491 let name = self.parse_item_name()?;
4492 self.expect_keyword(AS)?;
4493
4494 match self.parse_one_of_keywords(&[LIST, MAP]) {
4495 Some(LIST) => {
4496 self.expect_token(&Token::LParen)?;
4497 let options = self.parse_comma_separated(Parser::parse_create_type_list_option)?;
4498 self.expect_token(&Token::RParen)?;
4499 Ok(Statement::CreateType(CreateTypeStatement {
4500 name,
4501 as_type: CreateTypeAs::List { options },
4502 }))
4503 }
4504 Some(MAP) => {
4505 self.expect_token(&Token::LParen)?;
4506 let options = self.parse_comma_separated(Parser::parse_create_type_map_option)?;
4507 self.expect_token(&Token::RParen)?;
4508 Ok(Statement::CreateType(CreateTypeStatement {
4509 name,
4510 as_type: CreateTypeAs::Map { options },
4511 }))
4512 }
4513 None => {
4514 let column_defs = self.parse_composite_type_definition()?;
4515
4516 Ok(Statement::CreateType(CreateTypeStatement {
4517 name,
4518 as_type: CreateTypeAs::Record { column_defs },
4519 }))
4520 }
4521 _ => unreachable!(),
4522 }
4523 }
4524
4525 fn parse_create_type_list_option(&mut self) -> Result<CreateTypeListOption<Raw>, ParserError> {
4526 self.expect_keywords(&[ELEMENT, TYPE])?;
4527 let name = CreateTypeListOptionName::ElementType;
4528 Ok(CreateTypeListOption {
4529 name,
4530 value: Some(self.parse_data_type_option_value()?),
4531 })
4532 }
4533
4534 fn parse_create_type_map_option(&mut self) -> Result<CreateTypeMapOption<Raw>, ParserError> {
4535 let name = match self.expect_one_of_keywords(&[KEY, VALUE])? {
4536 KEY => {
4537 self.expect_keyword(TYPE)?;
4538 CreateTypeMapOptionName::KeyType
4539 }
4540 VALUE => {
4541 self.expect_keyword(TYPE)?;
4542 CreateTypeMapOptionName::ValueType
4543 }
4544 _ => unreachable!(),
4545 };
4546 Ok(CreateTypeMapOption {
4547 name,
4548 value: Some(self.parse_data_type_option_value()?),
4549 })
4550 }
4551
4552 fn parse_create_cluster(&mut self) -> Result<Statement<Raw>, ParserError> {
4553 let name = self.parse_identifier()?;
4554 let paren = self.consume_token(&Token::LParen);
4557 let options = self.parse_comma_separated(Parser::parse_cluster_option)?;
4558 if paren {
4559 self.expect_token(&Token::RParen)?;
4560 }
4561
4562 let features = if self.parse_keywords(&[FEATURES]) {
4563 self.expect_token(&Token::LParen)?;
4564 let features = self.parse_comma_separated(Parser::parse_cluster_feature)?;
4565 self.expect_token(&Token::RParen)?;
4566 features
4567 } else {
4568 Vec::new()
4569 };
4570
4571 Ok(Statement::CreateCluster(CreateClusterStatement {
4572 name,
4573 options,
4574 features,
4575 }))
4576 }
4577
4578 fn parse_cluster_option_name(&mut self) -> Result<ClusterOptionName, ParserError> {
4579 let option = self.expect_one_of_keywords(&[
4580 AVAILABILITY,
4581 DISK,
4582 INTROSPECTION,
4583 MANAGED,
4584 REPLICAS,
4585 REPLICATION,
4586 SIZE,
4587 SCHEDULE,
4588 WORKLOAD,
4589 ])?;
4590 let name = match option {
4591 AVAILABILITY => {
4592 self.expect_keyword(ZONES)?;
4593 ClusterOptionName::AvailabilityZones
4594 }
4595 DISK => ClusterOptionName::Disk,
4596 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4597 DEBUGGING => ClusterOptionName::IntrospectionDebugging,
4598 INTERVAL => ClusterOptionName::IntrospectionInterval,
4599 _ => unreachable!(),
4600 },
4601 MANAGED => ClusterOptionName::Managed,
4602 REPLICAS => ClusterOptionName::Replicas,
4603 REPLICATION => {
4604 self.expect_keyword(FACTOR)?;
4605 ClusterOptionName::ReplicationFactor
4606 }
4607 SIZE => ClusterOptionName::Size,
4608 SCHEDULE => ClusterOptionName::Schedule,
4609 WORKLOAD => {
4610 self.expect_keyword(CLASS)?;
4611 ClusterOptionName::WorkloadClass
4612 }
4613 _ => unreachable!(),
4614 };
4615 Ok(name)
4616 }
4617
4618 fn parse_cluster_option(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4619 let name = self.parse_cluster_option_name()?;
4620
4621 match name {
4622 ClusterOptionName::Replicas => self.parse_cluster_option_replicas(),
4623 ClusterOptionName::Schedule => self.parse_cluster_option_schedule(),
4624 _ => {
4625 let value = self.parse_optional_option_value()?;
4626 Ok(ClusterOption { name, value })
4627 }
4628 }
4629 }
4630
4631 fn parse_alter_cluster_option(&mut self) -> Result<ClusterAlterOption<Raw>, ParserError> {
4632 let (name, value) = match self.expect_one_of_keywords(&[WAIT])? {
4633 WAIT => {
4634 let _ = self.consume_token(&Token::Eq);
4635 let v = match self.expect_one_of_keywords(&[FOR, UNTIL])? {
4636 FOR => Some(WithOptionValue::ClusterAlterStrategy(
4637 ClusterAlterOptionValue::For(self.parse_value()?),
4638 )),
4639 UNTIL => {
4640 self.expect_keyword(READY)?;
4641 let _ = self.consume_token(&Token::Eq);
4642 let _ = self.expect_token(&Token::LParen)?;
4643 let opts = Some(WithOptionValue::ClusterAlterStrategy(
4644 ClusterAlterOptionValue::UntilReady(self.parse_comma_separated(
4645 Parser::parse_cluster_alter_until_ready_option,
4646 )?),
4647 ));
4648 let _ = self.expect_token(&Token::RParen)?;
4649 opts
4650 }
4651 _ => unreachable!(),
4652 };
4653 (ClusterAlterOptionName::Wait, v)
4654 }
4655 _ => unreachable!(),
4656 };
4657 Ok(ClusterAlterOption { name, value })
4658 }
4659
4660 fn parse_cluster_alter_until_ready_option(
4661 &mut self,
4662 ) -> Result<ClusterAlterUntilReadyOption<Raw>, ParserError> {
4663 let name = match self.expect_one_of_keywords(&[TIMEOUT, ON])? {
4664 ON => {
4665 self.expect_keywords(&[TIMEOUT])?;
4666 ClusterAlterUntilReadyOptionName::OnTimeout
4667 }
4668 TIMEOUT => ClusterAlterUntilReadyOptionName::Timeout,
4669 _ => unreachable!(),
4670 };
4671 let value = self.parse_optional_option_value()?;
4672 Ok(ClusterAlterUntilReadyOption { name, value })
4673 }
4674
4675 fn parse_cluster_option_replicas(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4676 let _ = self.consume_token(&Token::Eq);
4677 self.expect_token(&Token::LParen)?;
4678 let replicas = if self.consume_token(&Token::RParen) {
4679 vec![]
4680 } else {
4681 let replicas = self.parse_comma_separated(|parser| {
4682 let name = parser.parse_identifier()?;
4683 parser.expect_token(&Token::LParen)?;
4684 let options = parser.parse_comma_separated(Parser::parse_replica_option)?;
4685 parser.expect_token(&Token::RParen)?;
4686 Ok(ReplicaDefinition { name, options })
4687 })?;
4688 self.expect_token(&Token::RParen)?;
4689 replicas
4690 };
4691 Ok(ClusterOption {
4692 name: ClusterOptionName::Replicas,
4693 value: Some(WithOptionValue::ClusterReplicas(replicas)),
4694 })
4695 }
4696
4697 fn parse_cluster_option_schedule(&mut self) -> Result<ClusterOption<Raw>, ParserError> {
4698 let _ = self.consume_token(&Token::Eq);
4699 let kw = self.expect_one_of_keywords(&[MANUAL, ON])?;
4700 let value = match kw {
4701 MANUAL => ClusterScheduleOptionValue::Manual,
4702 ON => {
4703 self.expect_keyword(REFRESH)?;
4704 let hydration_time_estimate = if self.consume_token(&Token::LParen) {
4706 self.expect_keywords(&[HYDRATION, TIME, ESTIMATE])?;
4707 let _ = self.consume_token(&Token::Eq);
4708 let interval = self.parse_interval_value()?;
4709 self.expect_token(&Token::RParen)?;
4710 Some(interval)
4711 } else {
4712 None
4713 };
4714 ClusterScheduleOptionValue::Refresh {
4715 hydration_time_estimate,
4716 }
4717 }
4718 _ => unreachable!(),
4719 };
4720 Ok(ClusterOption {
4721 name: ClusterOptionName::Schedule,
4722 value: Some(WithOptionValue::ClusterScheduleOptionValue(value)),
4723 })
4724 }
4725
4726 fn parse_replica_option(&mut self) -> Result<ReplicaOption<Raw>, ParserError> {
4727 let name = match self.expect_one_of_keywords(&[
4728 AVAILABILITY,
4729 BILLED,
4730 COMPUTE,
4731 COMPUTECTL,
4732 DISK,
4733 INTERNAL,
4734 INTROSPECTION,
4735 SIZE,
4736 STORAGE,
4737 STORAGECTL,
4738 WORKERS,
4739 ])? {
4740 AVAILABILITY => {
4741 self.expect_keyword(ZONE)?;
4742 ReplicaOptionName::AvailabilityZone
4743 }
4744 BILLED => {
4745 self.expect_keyword(AS)?;
4746 ReplicaOptionName::BilledAs
4747 }
4748 COMPUTE => {
4749 self.expect_keyword(ADDRESSES)?;
4750 ReplicaOptionName::ComputeAddresses
4751 }
4752 COMPUTECTL => {
4753 self.expect_keyword(ADDRESSES)?;
4754 ReplicaOptionName::ComputectlAddresses
4755 }
4756 DISK => ReplicaOptionName::Disk,
4757 INTERNAL => ReplicaOptionName::Internal,
4758 INTROSPECTION => match self.expect_one_of_keywords(&[DEBUGGING, INTERVAL])? {
4759 DEBUGGING => ReplicaOptionName::IntrospectionDebugging,
4760 INTERVAL => ReplicaOptionName::IntrospectionInterval,
4761 _ => unreachable!(),
4762 },
4763 SIZE => ReplicaOptionName::Size,
4764 STORAGE => {
4765 self.expect_keyword(ADDRESSES)?;
4766 ReplicaOptionName::StorageAddresses
4767 }
4768 STORAGECTL => {
4769 self.expect_keyword(ADDRESSES)?;
4770 ReplicaOptionName::StoragectlAddresses
4771 }
4772 WORKERS => ReplicaOptionName::Workers,
4773 _ => unreachable!(),
4774 };
4775 let value = self.parse_optional_option_value()?;
4776 Ok(ReplicaOption { name, value })
4777 }
4778
4779 fn parse_cluster_feature(&mut self) -> Result<ClusterFeature<Raw>, ParserError> {
4780 Ok(ClusterFeature {
4781 name: self.parse_cluster_feature_name()?,
4782 value: self.parse_optional_option_value()?,
4783 })
4784 }
4785
4786 fn parse_create_cluster_replica(&mut self) -> Result<Statement<Raw>, ParserError> {
4787 self.next_token();
4788 let of_cluster = self.parse_identifier()?;
4789 self.expect_token(&Token::Dot)?;
4790 let name = self.parse_identifier()?;
4791 let paren = self.consume_token(&Token::LParen);
4794 let options = self.parse_comma_separated(Parser::parse_replica_option)?;
4795 if paren {
4796 let _ = self.consume_token(&Token::RParen);
4797 }
4798 Ok(Statement::CreateClusterReplica(
4799 CreateClusterReplicaStatement {
4800 of_cluster,
4801 definition: ReplicaDefinition { name, options },
4802 },
4803 ))
4804 }
4805
4806 fn parse_if_exists(&mut self) -> Result<bool, ParserError> {
4807 if self.parse_keyword(IF) {
4808 self.expect_keyword(EXISTS)?;
4809 Ok(true)
4810 } else {
4811 Ok(false)
4812 }
4813 }
4814
4815 fn parse_if_not_exists(&mut self) -> Result<bool, ParserError> {
4816 if self.parse_keyword(IF) {
4817 self.expect_keywords(&[NOT, EXISTS])?;
4818 Ok(true)
4819 } else {
4820 Ok(false)
4821 }
4822 }
4823
4824 fn parse_alias(&mut self) -> Result<Option<Ident>, ParserError> {
4825 self.parse_keyword(AS)
4826 .then(|| self.parse_identifier())
4827 .transpose()
4828 }
4829
4830 fn parse_source_include_metadata(&mut self) -> Result<Vec<SourceIncludeMetadata>, ParserError> {
4831 if self.parse_keyword(INCLUDE) {
4832 self.parse_comma_separated(|parser| {
4833 let metadata = match parser
4834 .expect_one_of_keywords(&[KEY, TIMESTAMP, PARTITION, OFFSET, HEADERS, HEADER])?
4835 {
4836 KEY => SourceIncludeMetadata::Key {
4837 alias: parser.parse_alias()?,
4838 },
4839 TIMESTAMP => SourceIncludeMetadata::Timestamp {
4840 alias: parser.parse_alias()?,
4841 },
4842 PARTITION => SourceIncludeMetadata::Partition {
4843 alias: parser.parse_alias()?,
4844 },
4845 OFFSET => SourceIncludeMetadata::Offset {
4846 alias: parser.parse_alias()?,
4847 },
4848 HEADERS => SourceIncludeMetadata::Headers {
4849 alias: parser.parse_alias()?,
4850 },
4851 HEADER => {
4852 let key: String = parser.parse_literal_string()?;
4853 parser.expect_keyword(AS)?;
4854 let alias = parser.parse_identifier()?;
4855 let use_bytes = parser.parse_keyword(BYTES);
4856 SourceIncludeMetadata::Header {
4857 alias,
4858 key,
4859 use_bytes,
4860 }
4861 }
4862 _ => unreachable!("only explicitly allowed items can be parsed"),
4863 };
4864 Ok(metadata)
4865 })
4866 } else {
4867 Ok(vec![])
4868 }
4869 }
4870
4871 fn parse_discard(&mut self) -> Result<Statement<Raw>, ParserError> {
4872 let target = match self.expect_one_of_keywords(&[ALL, PLANS, SEQUENCES, TEMP, TEMPORARY])? {
4873 ALL => DiscardTarget::All,
4874 PLANS => DiscardTarget::Plans,
4875 SEQUENCES => DiscardTarget::Sequences,
4876 TEMP | TEMPORARY => DiscardTarget::Temp,
4877 _ => unreachable!(),
4878 };
4879 Ok(Statement::Discard(DiscardStatement { target }))
4880 }
4881
4882 fn parse_drop(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
4883 if self.parse_keyword(OWNED) {
4884 self.parse_drop_owned()
4885 .map_parser_err(StatementKind::DropOwned)
4886 } else {
4887 self.parse_drop_objects()
4888 .map_parser_err(StatementKind::DropObjects)
4889 }
4890 }
4891
4892 fn parse_drop_objects(&mut self) -> Result<Statement<Raw>, ParserError> {
4893 let object_type = self.expect_object_type()?;
4894 let if_exists = self.parse_if_exists()?;
4895 match object_type {
4896 ObjectType::Database => {
4897 let name = UnresolvedObjectName::Database(self.parse_database_name()?);
4898 let restrict = matches!(
4899 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4900 Some(RESTRICT),
4901 );
4902 Ok(Statement::DropObjects(DropObjectsStatement {
4903 object_type: ObjectType::Database,
4904 if_exists,
4905 names: vec![name],
4906 cascade: !restrict,
4907 }))
4908 }
4909 ObjectType::Schema => {
4910 let names = self.parse_comma_separated(|parser| {
4911 Ok(UnresolvedObjectName::Schema(parser.parse_schema_name()?))
4912 })?;
4913
4914 let cascade = matches!(
4915 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4916 Some(CASCADE),
4917 );
4918 Ok(Statement::DropObjects(DropObjectsStatement {
4919 object_type: ObjectType::Schema,
4920 if_exists,
4921 names,
4922 cascade,
4923 }))
4924 }
4925 ObjectType::Role => {
4926 let names = self.parse_comma_separated(|parser| {
4927 Ok(UnresolvedObjectName::Role(parser.parse_identifier()?))
4928 })?;
4929 Ok(Statement::DropObjects(DropObjectsStatement {
4930 object_type: ObjectType::Role,
4931 if_exists,
4932 names,
4933 cascade: false,
4934 }))
4935 }
4936 ObjectType::NetworkPolicy => {
4937 let names = self.parse_comma_separated(|parser| {
4938 Ok(UnresolvedObjectName::NetworkPolicy(
4939 parser.parse_identifier()?,
4940 ))
4941 })?;
4942 Ok(Statement::DropObjects(DropObjectsStatement {
4943 object_type: ObjectType::NetworkPolicy,
4944 if_exists,
4945 names,
4946 cascade: false,
4947 }))
4948 }
4949 ObjectType::Cluster => self.parse_drop_clusters(if_exists),
4950 ObjectType::ClusterReplica => self.parse_drop_cluster_replicas(if_exists),
4951 ObjectType::Table
4952 | ObjectType::View
4953 | ObjectType::MaterializedView
4954 | ObjectType::Source
4955 | ObjectType::Sink
4956 | ObjectType::Index
4957 | ObjectType::Type
4958 | ObjectType::Secret
4959 | ObjectType::Connection
4960 | ObjectType::ContinualTask => {
4961 let names = self.parse_comma_separated(|parser| {
4962 Ok(UnresolvedObjectName::Item(parser.parse_item_name()?))
4963 })?;
4964 let cascade = matches!(
4965 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4966 Some(CASCADE),
4967 );
4968 Ok(Statement::DropObjects(DropObjectsStatement {
4969 object_type,
4970 if_exists,
4971 names,
4972 cascade,
4973 }))
4974 }
4975 ObjectType::Func | ObjectType::Subsource => parser_err!(
4976 self,
4977 self.peek_prev_pos(),
4978 format!("Unsupported DROP on {object_type}")
4979 ),
4980 }
4981 }
4982
4983 fn parse_drop_clusters(&mut self, if_exists: bool) -> Result<Statement<Raw>, ParserError> {
4984 let names = self.parse_comma_separated(|parser| {
4985 Ok(UnresolvedObjectName::Cluster(parser.parse_identifier()?))
4986 })?;
4987 let cascade = matches!(
4988 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "DROP")?,
4989 Some(CASCADE),
4990 );
4991 Ok(Statement::DropObjects(DropObjectsStatement {
4992 object_type: ObjectType::Cluster,
4993 if_exists,
4994 names,
4995 cascade,
4996 }))
4997 }
4998
4999 fn parse_drop_cluster_replicas(
5000 &mut self,
5001 if_exists: bool,
5002 ) -> Result<Statement<Raw>, ParserError> {
5003 let names = self.parse_comma_separated(|p| {
5004 Ok(UnresolvedObjectName::ClusterReplica(
5005 p.parse_cluster_replica_name()?,
5006 ))
5007 })?;
5008 Ok(Statement::DropObjects(DropObjectsStatement {
5009 object_type: ObjectType::ClusterReplica,
5010 if_exists,
5011 names,
5012 cascade: false,
5013 }))
5014 }
5015
5016 fn parse_drop_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
5017 self.expect_keyword(BY)?;
5018 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
5019 let cascade = if self.parse_keyword(CASCADE) {
5020 Some(true)
5021 } else if self.parse_keyword(RESTRICT) {
5022 Some(false)
5023 } else {
5024 None
5025 };
5026 Ok(Statement::DropOwned(DropOwnedStatement {
5027 role_names,
5028 cascade,
5029 }))
5030 }
5031
5032 fn parse_cluster_replica_name(&mut self) -> Result<QualifiedReplica, ParserError> {
5033 let cluster = self.parse_identifier()?;
5034 self.expect_token(&Token::Dot)?;
5035 let replica = self.parse_identifier()?;
5036 Ok(QualifiedReplica { cluster, replica })
5037 }
5038
5039 fn parse_alter_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5040 let name = self.parse_identifier()?;
5041 self.expect_keyword(SET)?;
5042 self.expect_token(&Token::LParen)?;
5043 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5044 self.expect_token(&Token::RParen)?;
5045 Ok(Statement::AlterNetworkPolicy(AlterNetworkPolicyStatement {
5046 name,
5047 options,
5048 }))
5049 }
5050
5051 fn parse_create_network_policy(&mut self) -> Result<Statement<Raw>, ParserError> {
5052 self.expect_keywords(&[NETWORK, POLICY])?;
5053 let name = self.parse_identifier()?;
5054 self.expect_token(&Token::LParen)?;
5055 let options = self.parse_comma_separated(Parser::parse_network_policy_option)?;
5056 self.expect_token(&Token::RParen)?;
5057 Ok(Statement::CreateNetworkPolicy(
5058 CreateNetworkPolicyStatement { name, options },
5059 ))
5060 }
5061
5062 fn parse_network_policy_option(&mut self) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5063 let name = match self.expect_one_of_keywords(&[RULES])? {
5064 RULES => NetworkPolicyOptionName::Rules,
5065 v => panic!("found unreachable keyword {}", v),
5066 };
5067 match name {
5068 NetworkPolicyOptionName::Rules => self.parse_network_policy_option_rules(),
5069 }
5070 }
5071
5072 fn parse_network_policy_option_rules(
5073 &mut self,
5074 ) -> Result<NetworkPolicyOption<Raw>, ParserError> {
5075 let _ = self.consume_token(&Token::Eq);
5076 self.expect_token(&Token::LParen)?;
5077 let rules = if self.consume_token(&Token::RParen) {
5078 vec![]
5079 } else {
5080 let rules = self.parse_comma_separated(|parser| {
5081 let name = parser.parse_identifier()?;
5082 parser.expect_token(&Token::LParen)?;
5083 let options =
5084 parser.parse_comma_separated(Parser::parse_network_policy_rule_option)?;
5085 parser.expect_token(&Token::RParen)?;
5086 Ok(NetworkPolicyRuleDefinition { name, options })
5087 })?;
5088 self.expect_token(&Token::RParen)?;
5089 rules
5090 };
5091 Ok(NetworkPolicyOption {
5092 name: NetworkPolicyOptionName::Rules,
5093 value: Some(WithOptionValue::NetworkPolicyRules(rules)),
5094 })
5095 }
5096
5097 fn parse_network_policy_rule_option(
5098 &mut self,
5099 ) -> Result<NetworkPolicyRuleOption<Raw>, ParserError> {
5100 let name = match self.expect_one_of_keywords(&[ACTION, ADDRESS, DIRECTION])? {
5101 ACTION => NetworkPolicyRuleOptionName::Action,
5102 ADDRESS => NetworkPolicyRuleOptionName::Address,
5103 DIRECTION => NetworkPolicyRuleOptionName::Direction,
5104 v => panic!("found unreachable keyword {}", v),
5105 };
5106 let value = self.parse_optional_option_value()?;
5107 Ok(NetworkPolicyRuleOption { name, value })
5108 }
5109
5110 fn parse_create_table(&mut self) -> Result<Statement<Raw>, ParserError> {
5111 let temporary = self.parse_keyword(TEMPORARY) | self.parse_keyword(TEMP);
5112 self.expect_keyword(TABLE)?;
5113 let if_not_exists = self.parse_if_not_exists()?;
5114 let table_name = self.parse_item_name()?;
5115 let (columns, constraints) = self.parse_columns(Mandatory)?;
5117
5118 let with_options = if self.parse_keyword(WITH) {
5119 self.expect_token(&Token::LParen)?;
5120 let o = if matches!(self.peek_token(), Some(Token::RParen)) {
5121 vec![]
5122 } else {
5123 self.parse_comma_separated(Parser::parse_table_option)?
5124 };
5125 self.expect_token(&Token::RParen)?;
5126 o
5127 } else {
5128 vec![]
5129 };
5130
5131 Ok(Statement::CreateTable(CreateTableStatement {
5132 name: table_name,
5133 columns,
5134 constraints,
5135 if_not_exists,
5136 temporary,
5137 with_options,
5138 }))
5139 }
5140
5141 fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5142 self.expect_keyword(TABLE)?;
5143 let if_not_exists = self.parse_if_not_exists()?;
5144 let table_name = self.parse_item_name()?;
5145
5146 if self.parse_keywords(&[FROM, WEBHOOK]) {
5147 return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5149 }
5150
5151 let (columns, constraints) = self.parse_table_from_source_columns()?;
5152
5153 self.expect_keywords(&[FROM, SOURCE])?;
5154
5155 let source = self.parse_raw_name()?;
5156
5157 let external_reference = if self.consume_token(&Token::LParen) {
5158 self.expect_keyword(REFERENCE)?;
5159 let _ = self.consume_token(&Token::Eq);
5160 let external_reference = self.parse_item_name()?;
5161 self.expect_token(&Token::RParen)?;
5162 Some(external_reference)
5163 } else {
5164 None
5165 };
5166
5167 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5168 Some(KEY) => {
5169 self.expect_keyword(FORMAT)?;
5170 let key = self.parse_format()?;
5171 self.expect_keywords(&[VALUE, FORMAT])?;
5172 let value = self.parse_format()?;
5173 Some(FormatSpecifier::KeyValue { key, value })
5174 }
5175 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5176 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5177 None => None,
5178 };
5179 let include_metadata = self.parse_source_include_metadata()?;
5180
5181 let envelope = if self.parse_keyword(ENVELOPE) {
5182 Some(self.parse_source_envelope()?)
5183 } else {
5184 None
5185 };
5186
5187 let with_options = if self.parse_keyword(WITH) {
5188 self.expect_token(&Token::LParen)?;
5189 let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5190 self.expect_token(&Token::RParen)?;
5191 options
5192 } else {
5193 vec![]
5194 };
5195
5196 Ok(Statement::CreateTableFromSource(
5197 CreateTableFromSourceStatement {
5198 name: table_name,
5199 columns,
5200 constraints,
5201 if_not_exists,
5202 source,
5203 external_reference,
5204 format,
5205 include_metadata,
5206 envelope,
5207 with_options,
5208 },
5209 ))
5210 }
5211
5212 fn parse_table_from_source_option(
5213 &mut self,
5214 ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5215 let option = match self
5216 .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5217 {
5218 ref keyword @ (TEXT | EXCLUDE) => {
5219 self.expect_keyword(COLUMNS)?;
5220
5221 let _ = self.consume_token(&Token::Eq);
5222
5223 let value = self
5224 .parse_option_sequence(Parser::parse_identifier)?
5225 .map(|inner| {
5226 WithOptionValue::Sequence(
5227 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5228 )
5229 });
5230
5231 TableFromSourceOption {
5232 name: match *keyword {
5233 TEXT => TableFromSourceOptionName::TextColumns,
5234 EXCLUDE => TableFromSourceOptionName::ExcludeColumns,
5235 _ => unreachable!(),
5236 },
5237 value,
5238 }
5239 }
5240 DETAILS => TableFromSourceOption {
5241 name: TableFromSourceOptionName::Details,
5242 value: self.parse_optional_option_value()?,
5243 },
5244 IGNORE => {
5245 self.expect_keyword(COLUMNS)?;
5246 let _ = self.consume_token(&Token::Eq);
5247
5248 let value = self
5249 .parse_option_sequence(Parser::parse_identifier)?
5250 .map(|inner| {
5251 WithOptionValue::Sequence(
5252 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5253 )
5254 });
5255 TableFromSourceOption {
5256 name: TableFromSourceOptionName::ExcludeColumns,
5258 value,
5259 }
5260 }
5261 PARTITION => {
5262 self.expect_keyword(BY)?;
5263 TableFromSourceOption {
5264 name: TableFromSourceOptionName::PartitionBy,
5265 value: self.parse_optional_option_value()?,
5266 }
5267 }
5268 RETAIN => {
5269 self.expect_keyword(HISTORY)?;
5270 TableFromSourceOption {
5271 name: TableFromSourceOptionName::RetainHistory,
5272 value: self.parse_option_retain_history()?,
5273 }
5274 }
5275 _ => unreachable!(),
5276 };
5277 Ok(option)
5278 }
5279
5280 fn parse_table_from_source_columns(
5281 &mut self,
5282 ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5283 let mut constraints = vec![];
5284
5285 if !self.consume_token(&Token::LParen) {
5286 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5287 }
5288 if self.consume_token(&Token::RParen) {
5289 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5291 }
5292
5293 let mut column_names = vec![];
5294 let mut column_defs = vec![];
5295 loop {
5296 if let Some(constraint) = self.parse_optional_table_constraint()? {
5297 constraints.push(constraint);
5298 } else if let Some(column_name) = self.consume_identifier()? {
5299 let next_token = self.peek_token();
5300 match next_token {
5301 Some(Token::Comma) | Some(Token::RParen) => {
5302 column_names.push(column_name);
5303 }
5304 _ => {
5305 let data_type = self.parse_data_type()?;
5306 let collation = if self.parse_keyword(COLLATE) {
5307 Some(self.parse_item_name()?)
5308 } else {
5309 None
5310 };
5311 let mut options = vec![];
5312 loop {
5313 match self.peek_token() {
5314 None | Some(Token::Comma) | Some(Token::RParen) => break,
5315 _ => options.push(self.parse_column_option_def()?),
5316 }
5317 }
5318
5319 column_defs.push(ColumnDef {
5320 name: column_name,
5321 data_type,
5322 collation,
5323 options,
5324 });
5325 }
5326 }
5327 } else {
5328 return self.expected(
5329 self.peek_pos(),
5330 "column name or constraint definition",
5331 self.peek_token(),
5332 );
5333 }
5334 if self.consume_token(&Token::Comma) {
5335 } else if self.consume_token(&Token::RParen) {
5337 break;
5338 } else {
5339 return self.expected(
5340 self.peek_pos(),
5341 "',' or ')' after column definition",
5342 self.peek_token(),
5343 );
5344 }
5345 }
5346 if !column_defs.is_empty() && !column_names.is_empty() {
5347 return parser_err!(
5348 self,
5349 self.peek_prev_pos(),
5350 "cannot mix column definitions and column names"
5351 );
5352 }
5353
5354 let columns = match column_defs.is_empty() {
5355 true => match column_names.is_empty() {
5356 true => TableFromSourceColumns::NotSpecified,
5357 false => TableFromSourceColumns::Named(column_names),
5358 },
5359 false => TableFromSourceColumns::Defined(column_defs),
5360 };
5361
5362 Ok((columns, constraints))
5363 }
5364
5365 fn parse_columns(
5366 &mut self,
5367 optional: IsOptional,
5368 ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5369 let mut columns = vec![];
5370 let mut constraints = vec![];
5371
5372 if !self.consume_token(&Token::LParen) {
5373 if optional == Optional {
5374 return Ok((columns, constraints));
5375 } else {
5376 return self.expected(
5377 self.peek_pos(),
5378 "a list of columns in parentheses",
5379 self.peek_token(),
5380 );
5381 }
5382 }
5383 if self.consume_token(&Token::RParen) {
5384 return Ok((columns, constraints));
5386 }
5387
5388 loop {
5389 if let Some(constraint) = self.parse_optional_table_constraint()? {
5390 constraints.push(constraint);
5391 } else if let Some(column_name) = self.consume_identifier()? {
5392 let data_type = self.parse_data_type()?;
5393 let collation = if self.parse_keyword(COLLATE) {
5394 Some(self.parse_item_name()?)
5395 } else {
5396 None
5397 };
5398 let mut options = vec![];
5399 loop {
5400 match self.peek_token() {
5401 None | Some(Token::Comma) | Some(Token::RParen) => break,
5402 _ => options.push(self.parse_column_option_def()?),
5403 }
5404 }
5405
5406 columns.push(ColumnDef {
5407 name: column_name,
5408 data_type,
5409 collation,
5410 options,
5411 });
5412 } else {
5413 return self.expected(
5414 self.peek_pos(),
5415 "column name or constraint definition",
5416 self.peek_token(),
5417 );
5418 }
5419 if self.consume_token(&Token::Comma) {
5420 } else if self.consume_token(&Token::RParen) {
5422 break;
5423 } else {
5424 return self.expected(
5425 self.peek_pos(),
5426 "',' or ')' after column definition",
5427 self.peek_token(),
5428 );
5429 }
5430 }
5431
5432 Ok((columns, constraints))
5433 }
5434
5435 fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5436 let name = if self.parse_keyword(CONSTRAINT) {
5437 Some(self.parse_identifier()?)
5438 } else {
5439 None
5440 };
5441
5442 let option = if self.parse_keywords(&[NOT, NULL]) {
5443 ColumnOption::NotNull
5444 } else if self.parse_keyword(NULL) {
5445 ColumnOption::Null
5446 } else if self.parse_keyword(DEFAULT) {
5447 ColumnOption::Default(self.parse_expr()?)
5448 } else if self.parse_keywords(&[PRIMARY, KEY]) {
5449 ColumnOption::Unique { is_primary: true }
5450 } else if self.parse_keyword(UNIQUE) {
5451 ColumnOption::Unique { is_primary: false }
5452 } else if self.parse_keyword(REFERENCES) {
5453 let foreign_table = self.parse_item_name()?;
5454 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5455 ColumnOption::ForeignKey {
5456 foreign_table,
5457 referred_columns,
5458 }
5459 } else if self.parse_keyword(CHECK) {
5460 self.expect_token(&Token::LParen)?;
5461 let expr = self.parse_expr()?;
5462 self.expect_token(&Token::RParen)?;
5463 ColumnOption::Check(expr)
5464 } else if self.parse_keyword(VERSION) {
5465 self.expect_keyword(ADDED)?;
5466 let action = ColumnVersioned::Added;
5467 let version = self.parse_version()?;
5468
5469 ColumnOption::Versioned { action, version }
5470 } else {
5471 return self.expected(self.peek_pos(), "column option", self.peek_token());
5472 };
5473
5474 Ok(ColumnOptionDef { name, option })
5475 }
5476
5477 fn parse_optional_table_constraint(
5478 &mut self,
5479 ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5480 let name = if self.parse_keyword(CONSTRAINT) {
5481 Some(self.parse_identifier()?)
5482 } else {
5483 None
5484 };
5485 match self.next_token() {
5486 Some(Token::Keyword(PRIMARY)) => {
5487 self.expect_keyword(KEY)?;
5488 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5489 Ok(Some(TableConstraint::Unique {
5490 name,
5491 columns,
5492 is_primary: true,
5493 nulls_not_distinct: false,
5494 }))
5495 }
5496 Some(Token::Keyword(UNIQUE)) => {
5497 let nulls_not_distinct = if self.parse_keyword(NULLS) {
5498 self.expect_keywords(&[NOT, DISTINCT])?;
5499 true
5500 } else {
5501 false
5502 };
5503
5504 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5505 Ok(Some(TableConstraint::Unique {
5506 name,
5507 columns,
5508 is_primary: false,
5509 nulls_not_distinct,
5510 }))
5511 }
5512 Some(Token::Keyword(FOREIGN)) => {
5513 self.expect_keyword(KEY)?;
5514 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5515 self.expect_keyword(REFERENCES)?;
5516 let foreign_table = self.parse_raw_name()?;
5517 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5518 Ok(Some(TableConstraint::ForeignKey {
5519 name,
5520 columns,
5521 foreign_table,
5522 referred_columns,
5523 }))
5524 }
5525 Some(Token::Keyword(CHECK)) => {
5526 self.expect_token(&Token::LParen)?;
5527 let expr = Box::new(self.parse_expr()?);
5528 self.expect_token(&Token::RParen)?;
5529 Ok(Some(TableConstraint::Check { name, expr }))
5530 }
5531 unexpected => {
5532 if name.is_some() {
5533 self.expected(
5534 self.peek_prev_pos(),
5535 "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5536 unexpected,
5537 )
5538 } else {
5539 self.prev_token();
5540 Ok(None)
5541 }
5542 }
5543 }
5544 }
5545
5546 fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5547 let _ = self.consume_token(&Token::Eq);
5548 Ok(WithOptionValue::Item(self.parse_raw_name()?))
5549 }
5550
5551 fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5552 match self.peek_token() {
5557 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5558 _ => {
5559 let _ = self.consume_token(&Token::Eq);
5560 Ok(Some(self.parse_option_value()?))
5561 }
5562 }
5563 }
5564
5565 fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5566 where
5567 F: FnMut(&mut Self) -> Result<T, ParserError>,
5568 {
5569 Ok(if self.consume_token(&Token::LParen) {
5570 let options = if self.consume_token(&Token::RParen) {
5571 vec![]
5572 } else {
5573 let options = self.parse_comma_separated(f)?;
5574 self.expect_token(&Token::RParen)?;
5575 options
5576 };
5577
5578 Some(options)
5579 } else if self.consume_token(&Token::LBracket) {
5580 let options = if self.consume_token(&Token::RBracket) {
5581 vec![]
5582 } else {
5583 let options = self.parse_comma_separated(f)?;
5584
5585 self.expect_token(&Token::RBracket)?;
5586 options
5587 };
5588
5589 Some(options)
5590 } else {
5591 None
5592 })
5593 }
5594
5595 fn parse_option_map(
5596 &mut self,
5597 ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5598 Ok(if self.parse_keyword(MAP) {
5599 self.expect_token(&Token::LBracket)?;
5600 let mut map = BTreeMap::new();
5601 loop {
5602 if let Some(Token::RBracket) = self.peek_token() {
5603 break;
5604 }
5605 let key = match self.next_token() {
5606 Some(Token::String(s)) => s,
5607 token => return self.expected(self.peek_pos(), "string", token),
5608 };
5609 self.expect_token(&Token::Arrow)?;
5610 let value = Parser::parse_option_value(self)?;
5611 map.insert(key, value);
5612 if !self.consume_token(&Token::Comma) {
5613 break;
5614 }
5615 }
5616 self.expect_token(&Token::RBracket)?;
5617 Some(map)
5618 } else {
5619 None
5620 })
5621 }
5622
5623 fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5624 if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5625 Ok(WithOptionValue::Sequence(seq))
5626 } else if let Some(map) = self.parse_option_map()? {
5627 Ok(WithOptionValue::Map(map))
5628 } else if self.parse_keyword(SECRET) {
5629 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5630 Ok(WithOptionValue::Secret(secret))
5631 } else {
5632 Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5633 vec![ident!("secret")],
5634 )))
5635 }
5636 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5637 Ok(WithOptionValue::Value(value))
5638 } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5639 Ok(WithOptionValue::UnresolvedItemName(item_name))
5640 } else {
5641 self.expected(self.peek_pos(), "option value", self.peek_token())
5642 }
5643 }
5644
5645 fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5646 let _ = self.consume_token(&Token::Eq);
5647 Ok(WithOptionValue::DataType(self.parse_data_type()?))
5648 }
5649
5650 fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5651 if self.parse_keyword(SYSTEM) {
5652 self.parse_alter_system()
5653 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5654 self.parse_alter_default_privileges()
5655 .map_parser_err(StatementKind::AlterDefaultPrivileges)
5656 } else {
5657 self.parse_alter_object()
5658 }
5659 }
5660
5661 fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5662 let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5663
5664 match object_type {
5665 ObjectType::Role => self
5666 .parse_alter_role()
5667 .map_parser_err(StatementKind::AlterRole),
5668 ObjectType::Sink => self.parse_alter_sink(),
5669 ObjectType::Source => self.parse_alter_source(),
5670 ObjectType::Index => self.parse_alter_index(),
5671 ObjectType::Secret => self.parse_alter_secret(),
5672 ObjectType::Connection => self.parse_alter_connection(),
5673 ObjectType::View
5674 | ObjectType::MaterializedView
5675 | ObjectType::Table
5676 | ObjectType::ContinualTask => self.parse_alter_views(object_type),
5677 ObjectType::Type => {
5678 let if_exists = self
5679 .parse_if_exists()
5680 .map_parser_err(StatementKind::AlterOwner)?;
5681 let name = UnresolvedObjectName::Item(
5682 self.parse_item_name()
5683 .map_parser_err(StatementKind::AlterOwner)?,
5684 );
5685 self.expect_keywords(&[OWNER, TO])
5686 .map_parser_err(StatementKind::AlterOwner)?;
5687 let new_owner = self
5688 .parse_identifier()
5689 .map_parser_err(StatementKind::AlterOwner)?;
5690 Ok(Statement::AlterOwner(AlterOwnerStatement {
5691 object_type,
5692 if_exists,
5693 name,
5694 new_owner,
5695 }))
5696 }
5697 ObjectType::Cluster => self.parse_alter_cluster(object_type),
5698 ObjectType::ClusterReplica => {
5699 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5700 let name = UnresolvedObjectName::ClusterReplica(
5701 self.parse_cluster_replica_name()
5702 .map_no_statement_parser_err()?,
5703 );
5704 let action = self
5705 .expect_one_of_keywords(&[OWNER, RENAME])
5706 .map_no_statement_parser_err()?;
5707 self.expect_keyword(TO).map_no_statement_parser_err()?;
5708 match action {
5709 OWNER => {
5710 let new_owner = self
5711 .parse_identifier()
5712 .map_parser_err(StatementKind::AlterOwner)?;
5713 Ok(Statement::AlterOwner(AlterOwnerStatement {
5714 object_type,
5715 if_exists,
5716 name,
5717 new_owner,
5718 }))
5719 }
5720 RENAME => {
5721 let to_item_name = self
5722 .parse_identifier()
5723 .map_parser_err(StatementKind::AlterObjectRename)?;
5724 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5725 object_type,
5726 if_exists,
5727 name,
5728 to_item_name,
5729 }))
5730 }
5731 _ => unreachable!(),
5732 }
5733 }
5734 ObjectType::Database => {
5735 let if_exists = self
5736 .parse_if_exists()
5737 .map_parser_err(StatementKind::AlterOwner)?;
5738 let name = UnresolvedObjectName::Database(
5739 self.parse_database_name()
5740 .map_parser_err(StatementKind::AlterOwner)?,
5741 );
5742 self.expect_keywords(&[OWNER, TO])
5743 .map_parser_err(StatementKind::AlterOwner)?;
5744 let new_owner = self
5745 .parse_identifier()
5746 .map_parser_err(StatementKind::AlterOwner)?;
5747 Ok(Statement::AlterOwner(AlterOwnerStatement {
5748 object_type,
5749 if_exists,
5750 name,
5751 new_owner,
5752 }))
5753 }
5754 ObjectType::Schema => self.parse_alter_schema(object_type),
5755 ObjectType::NetworkPolicy => self
5756 .parse_alter_network_policy()
5757 .map_parser_err(StatementKind::AlterNetworkPolicy),
5758 ObjectType::Func | ObjectType::Subsource => parser_err!(
5759 self,
5760 self.peek_prev_pos(),
5761 format!("Unsupported ALTER on {object_type}")
5762 )
5763 .map_no_statement_parser_err(),
5764 }
5765 }
5766
5767 fn parse_alter_cluster(
5768 &mut self,
5769 object_type: ObjectType,
5770 ) -> Result<Statement<Raw>, ParserStatementError> {
5771 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5772 let name = self.parse_identifier().map_no_statement_parser_err()?;
5773 let action = self
5774 .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
5775 .map_no_statement_parser_err()?;
5776 match action {
5777 OWNER => {
5778 self.expect_keyword(TO)
5779 .map_parser_err(StatementKind::AlterOwner)?;
5780 let new_owner = self
5781 .parse_identifier()
5782 .map_parser_err(StatementKind::AlterOwner)?;
5783 let name = UnresolvedObjectName::Cluster(name);
5784 Ok(Statement::AlterOwner(AlterOwnerStatement {
5785 object_type,
5786 if_exists,
5787 name,
5788 new_owner,
5789 }))
5790 }
5791 RENAME => {
5792 self.expect_keyword(TO)
5793 .map_parser_err(StatementKind::AlterObjectRename)?;
5794 let to_item_name = self
5795 .parse_identifier()
5796 .map_parser_err(StatementKind::AlterObjectRename)?;
5797 let name = UnresolvedObjectName::Cluster(name);
5798 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5799 object_type,
5800 if_exists,
5801 name,
5802 to_item_name,
5803 }))
5804 }
5805 RESET => {
5806 self.expect_token(&Token::LParen)
5807 .map_parser_err(StatementKind::AlterCluster)?;
5808 let names = self
5809 .parse_comma_separated(Parser::parse_cluster_option_name)
5810 .map_parser_err(StatementKind::AlterCluster)?;
5811 self.expect_token(&Token::RParen)
5812 .map_parser_err(StatementKind::AlterCluster)?;
5813 Ok(Statement::AlterCluster(AlterClusterStatement {
5814 if_exists,
5815 name,
5816 action: AlterClusterAction::ResetOptions(names),
5817 }))
5818 }
5819 SET => {
5820 self.expect_token(&Token::LParen)
5821 .map_parser_err(StatementKind::AlterCluster)?;
5822 let options = self
5823 .parse_comma_separated(Parser::parse_cluster_option)
5824 .map_parser_err(StatementKind::AlterCluster)?;
5825 self.expect_token(&Token::RParen)
5826 .map_parser_err(StatementKind::AlterCluster)?;
5827 let with_options = if self.parse_keyword(WITH) {
5828 self.expect_token(&Token::LParen)
5829 .map_parser_err(StatementKind::AlterCluster)?;
5830 let options = self
5831 .parse_comma_separated(Parser::parse_alter_cluster_option)
5832 .map_parser_err(StatementKind::AlterCluster)?;
5833 self.expect_token(&Token::RParen)
5834 .map_parser_err(StatementKind::AlterCluster)?;
5835 options
5836 } else {
5837 vec![]
5838 };
5839 Ok(Statement::AlterCluster(AlterClusterStatement {
5840 if_exists,
5841 name,
5842 action: AlterClusterAction::SetOptions {
5843 options,
5844 with_options,
5845 },
5846 }))
5847 }
5848 SWAP => {
5849 self.expect_keyword(WITH)
5850 .map_parser_err(StatementKind::AlterObjectSwap)?;
5851 let name_b = self
5852 .parse_identifier()
5853 .map_parser_err(StatementKind::AlterObjectSwap)?;
5854
5855 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
5856 object_type,
5857 name_a: UnresolvedObjectName::Cluster(name),
5858 name_b,
5859 }))
5860 }
5861 _ => unreachable!(),
5862 }
5863 }
5864
5865 fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5866 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5867 let source_name = self.parse_item_name().map_no_statement_parser_err()?;
5868
5869 Ok(
5870 match self
5871 .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
5872 .map_no_statement_parser_err()?
5873 {
5874 ADD => {
5875 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5876 .map_parser_err(StatementKind::AlterSource)?;
5877
5878 let subsources = self
5880 .parse_comma_separated(Parser::parse_subsource_references)
5881 .map_parser_err(StatementKind::AlterSource)?;
5882
5883 let options = if self.parse_keyword(WITH) {
5884 self.expect_token(&Token::LParen)
5885 .map_parser_err(StatementKind::AlterSource)?;
5886 let options = self
5887 .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
5888 .map_parser_err(StatementKind::AlterSource)?;
5889 self.expect_token(&Token::RParen)
5890 .map_parser_err(StatementKind::AlterSource)?;
5891 options
5892 } else {
5893 vec![]
5894 };
5895
5896 Statement::AlterSource(AlterSourceStatement {
5897 source_name,
5898 if_exists,
5899 action: AlterSourceAction::AddSubsources {
5900 external_references: subsources,
5901 options,
5902 },
5903 })
5904 }
5905 DROP => {
5906 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5907 .map_parser_err(StatementKind::AlterSource)?;
5908
5909 let if_exists_inner = self
5910 .parse_if_exists()
5911 .map_parser_err(StatementKind::AlterSource)?;
5912
5913 let names = self
5914 .parse_comma_separated(Parser::parse_item_name)
5915 .map_parser_err(StatementKind::AlterSource)?;
5916
5917 let cascade = matches!(
5918 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
5919 .map_parser_err(StatementKind::AlterSource)?,
5920 Some(CASCADE),
5921 );
5922
5923 Statement::AlterSource(AlterSourceStatement {
5924 source_name,
5925 if_exists,
5926 action: AlterSourceAction::DropSubsources {
5927 if_exists: if_exists_inner,
5928 cascade,
5929 names,
5930 },
5931 })
5932 }
5933 RESET => {
5934 self.expect_token(&Token::LParen)
5935 .map_parser_err(StatementKind::AlterSource)?;
5936 let reset_options = self
5937 .parse_comma_separated(Parser::parse_source_option_name)
5938 .map_parser_err(StatementKind::AlterSource)?;
5939 self.expect_token(&Token::RParen)
5940 .map_parser_err(StatementKind::AlterSource)?;
5941
5942 Statement::AlterSource(AlterSourceStatement {
5943 source_name,
5944 if_exists,
5945 action: AlterSourceAction::ResetOptions(reset_options),
5946 })
5947 }
5948 SET => {
5949 if let Some(stmt) = self.maybe_parse_alter_set_cluster(
5950 if_exists,
5951 &source_name,
5952 ObjectType::Source,
5953 ) {
5954 return stmt;
5955 }
5956 self.expect_token(&Token::LParen)
5957 .map_parser_err(StatementKind::AlterSource)?;
5958 let set_options = self
5959 .parse_comma_separated(Parser::parse_source_option)
5960 .map_parser_err(StatementKind::AlterSource)?;
5961 self.expect_token(&Token::RParen)
5962 .map_parser_err(StatementKind::AlterSource)?;
5963 Statement::AlterSource(AlterSourceStatement {
5964 source_name,
5965 if_exists,
5966 action: AlterSourceAction::SetOptions(set_options),
5967 })
5968 }
5969 RENAME => {
5970 self.expect_keyword(TO)
5971 .map_parser_err(StatementKind::AlterObjectRename)?;
5972 let to_item_name = self
5973 .parse_identifier()
5974 .map_parser_err(StatementKind::AlterObjectRename)?;
5975
5976 Statement::AlterObjectRename(AlterObjectRenameStatement {
5977 object_type: ObjectType::Source,
5978 if_exists,
5979 name: UnresolvedObjectName::Item(source_name),
5980 to_item_name,
5981 })
5982 }
5983 OWNER => {
5984 self.expect_keyword(TO)
5985 .map_parser_err(StatementKind::AlterOwner)?;
5986 let new_owner = self
5987 .parse_identifier()
5988 .map_parser_err(StatementKind::AlterOwner)?;
5989
5990 Statement::AlterOwner(AlterOwnerStatement {
5991 object_type: ObjectType::Source,
5992 if_exists,
5993 name: UnresolvedObjectName::Item(source_name),
5994 new_owner,
5995 })
5996 }
5997 REFRESH => {
5998 self.expect_keyword(REFERENCES)
5999 .map_parser_err(StatementKind::AlterSource)?;
6000 Statement::AlterSource(AlterSourceStatement {
6001 source_name,
6002 if_exists,
6003 action: AlterSourceAction::RefreshReferences,
6004 })
6005 }
6006 _ => unreachable!(),
6007 },
6008 )
6009 }
6010
6011 fn parse_alter_source_add_subsource_option(
6012 &mut self,
6013 ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6014 match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6015 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6016 self.expect_keyword(COLUMNS)?;
6017
6018 let _ = self.consume_token(&Token::Eq);
6019
6020 let value = self
6021 .parse_option_sequence(Parser::parse_item_name)?
6022 .map(|inner| {
6023 WithOptionValue::Sequence(
6024 inner
6025 .into_iter()
6026 .map(WithOptionValue::UnresolvedItemName)
6027 .collect_vec(),
6028 )
6029 });
6030
6031 Ok(AlterSourceAddSubsourceOption {
6032 name: match *keyword {
6033 TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6034 EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6036 _ => unreachable!(),
6037 },
6038 value,
6039 })
6040 }
6041 _ => unreachable!(),
6042 }
6043 }
6044
6045 fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6046 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6047 let name = self.parse_item_name().map_no_statement_parser_err()?;
6048
6049 Ok(
6050 match self
6051 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6052 .map_no_statement_parser_err()?
6053 {
6054 RESET => {
6055 self.expect_token(&Token::LParen)
6056 .map_parser_err(StatementKind::AlterIndex)?;
6057 let reset_options = self
6058 .parse_comma_separated(Parser::parse_index_option_name)
6059 .map_parser_err(StatementKind::AlterIndex)?;
6060 self.expect_token(&Token::RParen)
6061 .map_parser_err(StatementKind::AlterIndex)?;
6062
6063 Statement::AlterIndex(AlterIndexStatement {
6064 index_name: name,
6065 if_exists,
6066 action: AlterIndexAction::ResetOptions(reset_options),
6067 })
6068 }
6069 SET => {
6070 self.expect_token(&Token::LParen)
6071 .map_parser_err(StatementKind::AlterIndex)?;
6072 let set_options = self
6073 .parse_comma_separated(Parser::parse_index_option)
6074 .map_parser_err(StatementKind::AlterIndex)?;
6075 self.expect_token(&Token::RParen)
6076 .map_parser_err(StatementKind::AlterIndex)?;
6077 Statement::AlterIndex(AlterIndexStatement {
6078 index_name: name,
6079 if_exists,
6080 action: AlterIndexAction::SetOptions(set_options),
6081 })
6082 }
6083 RENAME => {
6084 self.expect_keyword(TO)
6085 .map_parser_err(StatementKind::AlterObjectRename)?;
6086 let to_item_name = self
6087 .parse_identifier()
6088 .map_parser_err(StatementKind::AlterObjectRename)?;
6089
6090 Statement::AlterObjectRename(AlterObjectRenameStatement {
6091 object_type: ObjectType::Index,
6092 if_exists,
6093 name: UnresolvedObjectName::Item(name),
6094 to_item_name,
6095 })
6096 }
6097 OWNER => {
6098 self.expect_keyword(TO)
6099 .map_parser_err(StatementKind::AlterOwner)?;
6100 let new_owner = self
6101 .parse_identifier()
6102 .map_parser_err(StatementKind::AlterOwner)?;
6103
6104 Statement::AlterOwner(AlterOwnerStatement {
6105 object_type: ObjectType::Index,
6106 if_exists,
6107 name: UnresolvedObjectName::Item(name),
6108 new_owner,
6109 })
6110 }
6111 _ => unreachable!(),
6112 },
6113 )
6114 }
6115
6116 fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6117 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6118 let name = self.parse_item_name().map_no_statement_parser_err()?;
6119
6120 Ok(
6121 match self
6122 .expect_one_of_keywords(&[AS, RENAME, OWNER])
6123 .map_no_statement_parser_err()?
6124 {
6125 AS => {
6126 let value = self
6127 .parse_expr()
6128 .map_parser_err(StatementKind::AlterSecret)?;
6129 Statement::AlterSecret(AlterSecretStatement {
6130 name,
6131 if_exists,
6132 value,
6133 })
6134 }
6135 RENAME => {
6136 self.expect_keyword(TO)
6137 .map_parser_err(StatementKind::AlterObjectRename)?;
6138 let to_item_name = self
6139 .parse_identifier()
6140 .map_parser_err(StatementKind::AlterObjectRename)?;
6141
6142 Statement::AlterObjectRename(AlterObjectRenameStatement {
6143 object_type: ObjectType::Secret,
6144 if_exists,
6145 name: UnresolvedObjectName::Item(name),
6146 to_item_name,
6147 })
6148 }
6149 OWNER => {
6150 self.expect_keyword(TO)
6151 .map_parser_err(StatementKind::AlterOwner)?;
6152 let new_owner = self
6153 .parse_identifier()
6154 .map_parser_err(StatementKind::AlterOwner)?;
6155
6156 Statement::AlterOwner(AlterOwnerStatement {
6157 object_type: ObjectType::Secret,
6158 if_exists,
6159 name: UnresolvedObjectName::Item(name),
6160 new_owner,
6161 })
6162 }
6163 _ => unreachable!(),
6164 },
6165 )
6166 }
6167
6168 fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6170 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6171 let name = self.parse_item_name().map_no_statement_parser_err()?;
6172
6173 Ok(
6174 match self
6175 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6176 .map_no_statement_parser_err()?
6177 {
6178 RESET => {
6179 self.expect_token(&Token::LParen)
6180 .map_parser_err(StatementKind::AlterSink)?;
6181 let reset_options = self
6182 .parse_comma_separated(Parser::parse_create_sink_option_name)
6183 .map_parser_err(StatementKind::AlterSink)?;
6184 self.expect_token(&Token::RParen)
6185 .map_parser_err(StatementKind::AlterSink)?;
6186
6187 Statement::AlterSink(AlterSinkStatement {
6188 sink_name: name,
6189 if_exists,
6190 action: AlterSinkAction::ResetOptions(reset_options),
6191 })
6192 }
6193 SET => {
6194 if let Some(result) =
6195 self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6196 {
6197 return result;
6198 }
6199
6200 if self.parse_keyword(FROM) {
6201 let from = self
6202 .parse_raw_name()
6203 .map_parser_err(StatementKind::AlterSink)?;
6204
6205 Statement::AlterSink(AlterSinkStatement {
6206 sink_name: name,
6207 if_exists,
6208 action: AlterSinkAction::ChangeRelation(from),
6209 })
6210 } else {
6211 self.expect_token(&Token::LParen)
6212 .map_parser_err(StatementKind::AlterSink)?;
6213 let set_options = self
6214 .parse_comma_separated(Parser::parse_create_sink_option)
6215 .map_parser_err(StatementKind::AlterSink)?;
6216 self.expect_token(&Token::RParen)
6217 .map_parser_err(StatementKind::AlterSink)?;
6218 Statement::AlterSink(AlterSinkStatement {
6219 sink_name: name,
6220 if_exists,
6221 action: AlterSinkAction::SetOptions(set_options),
6222 })
6223 }
6224 }
6225 RENAME => {
6226 self.expect_keyword(TO)
6227 .map_parser_err(StatementKind::AlterObjectRename)?;
6228 let to_item_name = self
6229 .parse_identifier()
6230 .map_parser_err(StatementKind::AlterObjectRename)?;
6231
6232 Statement::AlterObjectRename(AlterObjectRenameStatement {
6233 object_type: ObjectType::Sink,
6234 if_exists,
6235 name: UnresolvedObjectName::Item(name),
6236 to_item_name,
6237 })
6238 }
6239 OWNER => {
6240 self.expect_keyword(TO)
6241 .map_parser_err(StatementKind::AlterOwner)?;
6242 let new_owner = self
6243 .parse_identifier()
6244 .map_parser_err(StatementKind::AlterOwner)?;
6245
6246 Statement::AlterOwner(AlterOwnerStatement {
6247 object_type: ObjectType::Sink,
6248 if_exists,
6249 name: UnresolvedObjectName::Item(name),
6250 new_owner,
6251 })
6252 }
6253 _ => unreachable!(),
6254 },
6255 )
6256 }
6257
6258 fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6260 match self
6261 .expect_one_of_keywords(&[SET, RESET])
6262 .map_no_statement_parser_err()?
6263 {
6264 SET => {
6265 let name = self
6266 .parse_identifier()
6267 .map_parser_err(StatementKind::AlterSystemSet)?;
6268 self.expect_keyword_or_token(TO, &Token::Eq)
6269 .map_parser_err(StatementKind::AlterSystemSet)?;
6270 let to = self
6271 .parse_set_variable_to()
6272 .map_parser_err(StatementKind::AlterSystemSet)?;
6273 Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6274 name,
6275 to,
6276 }))
6277 }
6278 RESET => {
6279 if self.parse_keyword(ALL) {
6280 Ok(Statement::AlterSystemResetAll(
6281 AlterSystemResetAllStatement {},
6282 ))
6283 } else {
6284 let name = self
6285 .parse_identifier()
6286 .map_parser_err(StatementKind::AlterSystemReset)?;
6287 Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6288 name,
6289 }))
6290 }
6291 }
6292 _ => unreachable!(),
6293 }
6294 }
6295
6296 fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6297 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6298 let name = self.parse_item_name().map_no_statement_parser_err()?;
6299
6300 Ok(
6301 match self
6302 .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6303 .map_no_statement_parser_err()?
6304 {
6305 RENAME => {
6306 self.expect_keyword(TO)
6307 .map_parser_err(StatementKind::AlterObjectRename)?;
6308 let to_item_name = self
6309 .parse_identifier()
6310 .map_parser_err(StatementKind::AlterObjectRename)?;
6311
6312 Statement::AlterObjectRename(AlterObjectRenameStatement {
6313 object_type: ObjectType::Connection,
6314 if_exists,
6315 name: UnresolvedObjectName::Item(name),
6316 to_item_name,
6317 })
6318 }
6319 OWNER => {
6320 self.expect_keyword(TO)
6321 .map_parser_err(StatementKind::AlterOwner)?;
6322 let new_owner = self
6323 .parse_identifier()
6324 .map_parser_err(StatementKind::AlterOwner)?;
6325
6326 Statement::AlterOwner(AlterOwnerStatement {
6327 object_type: ObjectType::Connection,
6328 if_exists,
6329 name: UnresolvedObjectName::Item(name),
6330 new_owner,
6331 })
6332 }
6333 _ => {
6334 self.prev_token();
6335 let actions = self
6336 .parse_comma_separated(Parser::parse_alter_connection_action)
6337 .map_parser_err(StatementKind::AlterConnection)?;
6338
6339 let with_options = if self.parse_keyword(WITH) {
6340 self.expect_token(&Token::LParen)
6341 .map_parser_err(StatementKind::AlterConnection)?;
6342 let options = self
6343 .parse_comma_separated(Parser::parse_alter_connection_option)
6344 .map_parser_err(StatementKind::AlterConnection)?;
6345 self.expect_token(&Token::RParen)
6346 .map_parser_err(StatementKind::AlterConnection)?;
6347 options
6348 } else {
6349 vec![]
6350 };
6351
6352 Statement::AlterConnection(AlterConnectionStatement {
6353 name,
6354 if_exists,
6355 actions,
6356 with_options,
6357 })
6358 }
6359 },
6360 )
6361 }
6362
6363 fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6364 let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6365 ROTATE => {
6366 self.expect_keyword(KEYS)?;
6367 AlterConnectionAction::RotateKeys
6368 }
6369 SET => {
6370 self.expect_token(&Token::LParen)?;
6371 let option = self.parse_connection_option_unified()?;
6372 self.expect_token(&Token::RParen)?;
6373 AlterConnectionAction::SetOption(option)
6374 }
6375 DROP | RESET => {
6376 self.expect_token(&Token::LParen)?;
6377 let option = self.parse_connection_option_name()?;
6378 self.expect_token(&Token::RParen)?;
6379 AlterConnectionAction::DropOption(option)
6380 }
6381 _ => unreachable!(),
6382 };
6383
6384 Ok(r)
6385 }
6386
6387 fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6389 let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6390 VALIDATE => AlterConnectionOptionName::Validate,
6391 _ => unreachable!(),
6392 };
6393
6394 Ok(AlterConnectionOption {
6395 name,
6396 value: self.parse_optional_option_value()?,
6397 })
6398 }
6399
6400 fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6401 let name = self.parse_identifier()?;
6402
6403 let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6404 Some(SET) => {
6405 let name = self.parse_identifier()?;
6406 self.expect_keyword_or_token(TO, &Token::Eq)?;
6407 let value = self.parse_set_variable_to()?;
6408 let var = SetRoleVar::Set { name, value };
6409 AlterRoleOption::Variable(var)
6410 }
6411 Some(RESET) => {
6412 let name = self.parse_identifier()?;
6413 let var = SetRoleVar::Reset { name };
6414 AlterRoleOption::Variable(var)
6415 }
6416 Some(WITH) | None => {
6417 let _ = self.parse_keyword(WITH);
6418 let attrs = self.parse_role_attributes()?;
6419 AlterRoleOption::Attributes(attrs)
6420 }
6421 Some(k) => unreachable!("unmatched keyword: {k}"),
6422 };
6423
6424 Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6425 }
6426
6427 fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6428 self.expect_keyword(FOR)?;
6429 let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6430 ROLE | USER => TargetRoleSpecification::Roles(
6431 self.parse_comma_separated(Parser::parse_identifier)?,
6432 ),
6433 ALL => {
6434 self.expect_keyword(ROLES)?;
6435 TargetRoleSpecification::AllRoles
6436 }
6437 _ => unreachable!(),
6438 };
6439 let target_objects = if self.parse_keyword(IN) {
6440 match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6441 SCHEMA => GrantTargetAllSpecification::AllSchemas {
6442 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6443 },
6444 DATABASE => GrantTargetAllSpecification::AllDatabases {
6445 databases: self.parse_comma_separated(Parser::parse_database_name)?,
6446 },
6447 _ => unreachable!(),
6448 }
6449 } else {
6450 GrantTargetAllSpecification::All
6451 };
6452 let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6453 let privileges = self.parse_privilege_specification().ok_or_else(|| {
6454 self.expected::<_, PrivilegeSpecification>(
6455 self.peek_pos(),
6456 "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6457 self.peek_token(),
6458 )
6459 .expect_err("only returns errors")
6460 })?;
6461 self.expect_keyword(ON)?;
6462 let object_type =
6463 self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6464 if is_grant {
6465 self.expect_keyword(TO)?;
6466 } else {
6467 self.expect_keyword(FROM)?;
6468 }
6469 let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6470
6471 let grant_or_revoke = if is_grant {
6472 AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6473 privileges,
6474 object_type,
6475 grantees,
6476 })
6477 } else {
6478 AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6479 privileges,
6480 object_type,
6481 revokees: grantees,
6482 })
6483 };
6484
6485 Ok(Statement::AlterDefaultPrivileges(
6486 AlterDefaultPrivilegesStatement {
6487 target_roles,
6488 target_objects,
6489 grant_or_revoke,
6490 },
6491 ))
6492 }
6493
6494 fn parse_alter_views(
6495 &mut self,
6496 object_type: ObjectType,
6497 ) -> Result<Statement<Raw>, ParserStatementError> {
6498 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6499 let name = self.parse_item_name().map_no_statement_parser_err()?;
6500 let keywords: &[_] = match object_type {
6501 ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6502 ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6503 _ => &[SET, RENAME, OWNER, RESET],
6504 };
6505
6506 let action = self
6507 .expect_one_of_keywords(keywords)
6508 .map_no_statement_parser_err()?;
6509 match action {
6510 RENAME => {
6511 self.expect_keyword(TO).map_no_statement_parser_err()?;
6512 let to_item_name = self
6513 .parse_identifier()
6514 .map_parser_err(StatementKind::AlterObjectRename)?;
6515 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6516 object_type,
6517 if_exists,
6518 name: UnresolvedObjectName::Item(name),
6519 to_item_name,
6520 }))
6521 }
6522 SET => {
6523 if self.parse_keyword(CLUSTER) {
6524 self.parse_alter_set_cluster(if_exists, name, object_type)
6525 } else {
6526 self.expect_token(&Token::LParen)
6527 .map_no_statement_parser_err()?;
6528 self.expect_keywords(&[RETAIN, HISTORY])
6529 .map_parser_err(StatementKind::AlterRetainHistory)?;
6530 let history = self
6531 .parse_retain_history()
6532 .map_parser_err(StatementKind::AlterRetainHistory)?;
6533 self.expect_token(&Token::RParen)
6534 .map_parser_err(StatementKind::AlterCluster)?;
6535 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6536 object_type,
6537 if_exists,
6538 name: UnresolvedObjectName::Item(name),
6539 history: Some(history),
6540 }))
6541 }
6542 }
6543 RESET => {
6544 self.expect_token(&Token::LParen)
6545 .map_no_statement_parser_err()?;
6546 self.expect_keywords(&[RETAIN, HISTORY])
6547 .map_parser_err(StatementKind::AlterRetainHistory)?;
6548 self.expect_token(&Token::RParen)
6549 .map_no_statement_parser_err()?;
6550 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6551 object_type,
6552 if_exists,
6553 name: UnresolvedObjectName::Item(name),
6554 history: None,
6555 }))
6556 }
6557 OWNER => {
6558 self.expect_keyword(TO).map_no_statement_parser_err()?;
6559 let new_owner = self
6560 .parse_identifier()
6561 .map_parser_err(StatementKind::AlterOwner)?;
6562 Ok(Statement::AlterOwner(AlterOwnerStatement {
6563 object_type,
6564 if_exists,
6565 name: UnresolvedObjectName::Item(name),
6566 new_owner,
6567 }))
6568 }
6569 ADD => {
6570 assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6571
6572 self.expect_keyword(COLUMN)
6573 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6574 let if_col_not_exist = self
6575 .parse_if_not_exists()
6576 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6577 let column_name = self
6578 .parse_identifier()
6579 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6580 let data_type = self
6581 .parse_data_type()
6582 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6583
6584 Ok(Statement::AlterTableAddColumn(
6585 AlterTableAddColumnStatement {
6586 if_exists,
6587 name,
6588 if_col_not_exist,
6589 column_name,
6590 data_type,
6591 },
6592 ))
6593 }
6594 APPLY => {
6595 assert_eq!(
6596 object_type,
6597 ObjectType::MaterializedView,
6598 "checked object_type above",
6599 );
6600
6601 self.expect_keyword(REPLACEMENT)
6602 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6603
6604 let replacement_name = self
6605 .parse_item_name()
6606 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6607
6608 Ok(Statement::AlterMaterializedViewApplyReplacement(
6609 AlterMaterializedViewApplyReplacementStatement {
6610 if_exists,
6611 name,
6612 replacement_name,
6613 },
6614 ))
6615 }
6616 _ => unreachable!(),
6617 }
6618 }
6619
6620 fn parse_alter_schema(
6621 &mut self,
6622 object_type: ObjectType,
6623 ) -> Result<Statement<Raw>, ParserStatementError> {
6624 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6625 let name = self.parse_schema_name().map_no_statement_parser_err()?;
6626 let name = UnresolvedObjectName::Schema(name);
6627 let action = self
6628 .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6629 .map_no_statement_parser_err()?;
6630
6631 match action {
6632 OWNER => {
6633 self.expect_keyword(TO)
6634 .map_parser_err(StatementKind::AlterOwner)?;
6635 let new_owner = self
6636 .parse_identifier()
6637 .map_parser_err(StatementKind::AlterOwner)?;
6638
6639 Ok(Statement::AlterOwner(AlterOwnerStatement {
6640 object_type,
6641 if_exists,
6642 name,
6643 new_owner,
6644 }))
6645 }
6646 RENAME => {
6647 self.expect_keyword(TO)
6648 .map_parser_err(StatementKind::AlterObjectRename)?;
6649 let to_item_name = self
6650 .parse_identifier()
6651 .map_parser_err(StatementKind::AlterObjectRename)?;
6652
6653 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6654 object_type,
6655 if_exists,
6656 name,
6657 to_item_name,
6658 }))
6659 }
6660 SWAP => {
6661 self.expect_keyword(WITH)
6662 .map_parser_err(StatementKind::AlterObjectSwap)?;
6663 let name_b = self
6664 .parse_identifier()
6665 .map_parser_err(StatementKind::AlterObjectSwap)?;
6666
6667 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6668 object_type,
6669 name_a: name,
6670 name_b,
6671 }))
6672 }
6673 k => unreachable!("programming error, unmatched {k}"),
6674 }
6675 }
6676
6677 fn maybe_parse_alter_set_cluster(
6679 &mut self,
6680 if_exists: bool,
6681 name: &UnresolvedItemName,
6682 object_type: ObjectType,
6683 ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6684 if self.parse_keyword(CLUSTER) {
6685 Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6686 } else {
6687 None
6688 }
6689 }
6690
6691 fn parse_alter_set_cluster(
6693 &mut self,
6694 if_exists: bool,
6695 name: UnresolvedItemName,
6696 object_type: ObjectType,
6697 ) -> Result<Statement<Raw>, ParserStatementError> {
6698 let set_cluster = self
6699 .parse_raw_ident()
6700 .map_parser_err(StatementKind::AlterSetCluster)?;
6701 Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6702 name,
6703 if_exists,
6704 set_cluster,
6705 object_type,
6706 }))
6707 }
6708
6709 fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6711 let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6713 Some(self.peek_prev_pos())
6714 } else {
6715 None
6716 };
6717
6718 let relation = if self.consume_token(&Token::LParen) {
6719 let query = self.parse_statement()?.ast;
6720 self.expect_token(&Token::RParen)
6721 .map_parser_err(StatementKind::Copy)?;
6722 match query {
6723 Statement::Select(stmt) => CopyRelation::Select(stmt),
6724 Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6725 _ => {
6726 return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
6727 .map_parser_err(StatementKind::Copy);
6728 }
6729 }
6730 } else {
6731 let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
6732 let columns = self
6733 .parse_parenthesized_column_list(Optional)
6734 .map_parser_err(StatementKind::Copy)?;
6735 CopyRelation::Named { name, columns }
6736 };
6737 let (direction, target) = match self
6738 .expect_one_of_keywords(&[FROM, TO])
6739 .map_parser_err(StatementKind::Copy)?
6740 {
6741 FROM => {
6742 if let CopyRelation::Named { .. } = relation {
6743 } else {
6745 return parser_err!(
6746 self,
6747 self.peek_prev_pos(),
6748 "queries not allowed in COPY FROM"
6749 )
6750 .map_no_statement_parser_err();
6751 }
6752 if self.parse_keyword(STDIN) {
6753 (CopyDirection::From, CopyTarget::Stdin)
6754 } else {
6755 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6756 (CopyDirection::From, CopyTarget::Expr(url_expr))
6757 }
6758 }
6759 TO => {
6760 if let Some(into_pos) = maybe_into_pos {
6762 return self
6763 .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
6764 .map_parser_err(StatementKind::Copy);
6765 }
6766
6767 if self.parse_keyword(STDOUT) {
6768 (CopyDirection::To, CopyTarget::Stdout)
6769 } else {
6770 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6771 (CopyDirection::To, CopyTarget::Expr(url_expr))
6772 }
6773 }
6774 _ => unreachable!(),
6775 };
6776 let has_options = if self.parse_keyword(WITH) {
6780 self.expect_token(&Token::LParen)
6781 .map_parser_err(StatementKind::Copy)?;
6782 true
6783 } else {
6784 self.consume_token(&Token::LParen)
6785 };
6786 let options = if has_options {
6787 let o = self
6788 .parse_comma_separated(Parser::parse_copy_option)
6789 .map_parser_err(StatementKind::Copy)?;
6790 self.expect_token(&Token::RParen)
6791 .map_parser_err(StatementKind::Copy)?;
6792 o
6793 } else {
6794 vec![]
6795 };
6796 Ok(Statement::Copy(CopyStatement {
6797 relation,
6798 direction,
6799 target,
6800 options,
6801 }))
6802 }
6803
6804 fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
6805 let name = match self.expect_one_of_keywords(&[
6806 FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
6807 ])? {
6808 FORMAT => CopyOptionName::Format,
6809 DELIMITER => CopyOptionName::Delimiter,
6810 NULL => CopyOptionName::Null,
6811 ESCAPE => CopyOptionName::Escape,
6812 QUOTE => CopyOptionName::Quote,
6813 HEADER => CopyOptionName::Header,
6814 AWS => {
6815 self.expect_keyword(CONNECTION)?;
6816 return Ok(CopyOption {
6817 name: CopyOptionName::AwsConnection,
6818 value: Some(self.parse_object_option_value()?),
6819 });
6820 }
6821 MAX => {
6822 self.expect_keywords(&[FILE, SIZE])?;
6823 CopyOptionName::MaxFileSize
6824 }
6825 FILES => CopyOptionName::Files,
6826 PATTERN => CopyOptionName::Pattern,
6827 _ => unreachable!(),
6828 };
6829 Ok(CopyOption {
6830 name,
6831 value: self.parse_optional_option_value()?,
6832 })
6833 }
6834
6835 fn parse_value(&mut self) -> Result<Value, ParserError> {
6837 match self.next_token() {
6838 Some(t) => match t {
6839 Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
6840 Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
6841 Token::Keyword(NULL) => Ok(Value::Null),
6842 Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
6843 Token::Keyword(kw) => {
6844 parser_err!(
6845 self,
6846 self.peek_prev_pos(),
6847 format!("No value parser for keyword {}", kw)
6848 )
6849 }
6850 Token::Op(ref op) if op == "-" => match self.next_token() {
6851 Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
6852 other => self.expected(self.peek_prev_pos(), "literal int", other),
6853 },
6854 Token::Number(ref n) => Ok(Value::Number(n.to_string())),
6855 Token::String(ref s) => Ok(Value::String(s.to_string())),
6856 Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
6857 _ => parser_err!(
6858 self,
6859 self.peek_prev_pos(),
6860 format!("Unsupported value: {:?}", t)
6861 ),
6862 },
6863 None => parser_err!(
6864 self,
6865 self.peek_prev_pos(),
6866 "Expecting a value, but found EOF"
6867 ),
6868 }
6869 }
6870
6871 fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
6872 if self.consume_token(&Token::LParen) {
6873 let subquery = self.parse_query()?;
6874 self.expect_token(&Token::RParen)?;
6875 Ok(Expr::ArraySubquery(Box::new(subquery)))
6876 } else {
6877 self.parse_sequence(Self::parse_array).map(Expr::Array)
6878 }
6879 }
6880
6881 fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
6882 if self.consume_token(&Token::LParen) {
6883 let subquery = self.parse_query()?;
6884 self.expect_token(&Token::RParen)?;
6885 Ok(Expr::ListSubquery(Box::new(subquery)))
6886 } else {
6887 self.parse_sequence(Self::parse_list).map(Expr::List)
6888 }
6889 }
6890
6891 fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
6892 if self.consume_token(&Token::LParen) {
6893 let subquery = self.parse_query()?;
6894 self.expect_token(&Token::RParen)?;
6895 return Ok(Expr::MapSubquery(Box::new(subquery)));
6896 }
6897
6898 self.expect_token(&Token::LBracket)?;
6899 let mut exprs = vec![];
6900 loop {
6901 if let Some(Token::RBracket) = self.peek_token() {
6902 break;
6903 }
6904 let key = self.parse_expr()?;
6905 self.expect_token(&Token::Arrow)?;
6906 let value = if let Some(Token::LBracket) = self.peek_token() {
6907 self.parse_map()?
6908 } else {
6909 self.parse_expr()?
6910 };
6911 exprs.push(MapEntry { key, value });
6912 if !self.consume_token(&Token::Comma) {
6913 break;
6914 }
6915 }
6916 self.expect_token(&Token::RBracket)?;
6917 Ok(Expr::Map(exprs))
6918 }
6919
6920 fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
6921 where
6922 F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
6923 {
6924 self.expect_token(&Token::LBracket)?;
6925 let mut exprs = vec![];
6926 loop {
6927 if let Some(Token::RBracket) = self.peek_token() {
6928 break;
6929 }
6930 let expr = if let Some(Token::LBracket) = self.peek_token() {
6931 f(self)?
6932 } else {
6933 self.parse_expr()?
6934 };
6935 exprs.push(expr);
6936 if !self.consume_token(&Token::Comma) {
6937 break;
6938 }
6939 }
6940 self.expect_token(&Token::RBracket)?;
6941 Ok(exprs)
6942 }
6943
6944 fn parse_number_value(&mut self) -> Result<Value, ParserError> {
6945 match self.parse_value()? {
6946 v @ Value::Number(_) => Ok(v),
6947 _ => {
6948 self.prev_token();
6949 self.expected(self.peek_pos(), "literal number", self.peek_token())
6950 }
6951 }
6952 }
6953
6954 fn parse_version(&mut self) -> Result<Version, ParserError> {
6955 let version = self.parse_literal_uint()?;
6956 Ok(Version(version))
6957 }
6958
6959 fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
6961 let negative = self.consume_token(&Token::Op("-".into()));
6962 match self.next_token() {
6963 Some(Token::Number(s)) => {
6964 let n = s.parse::<i64>().map_err(|e| {
6965 self.error(
6966 self.peek_prev_pos(),
6967 format!("Could not parse '{}' as i64: {}", s, e),
6968 )
6969 })?;
6970 if negative {
6971 n.checked_neg().ok_or_else(|| {
6972 self.error(
6973 self.peek_prev_pos(),
6974 format!("Could not parse '{}' as i64: overflows i64", s),
6975 )
6976 })
6977 } else {
6978 Ok(n)
6979 }
6980 }
6981 other => self.expected(self.peek_prev_pos(), "literal integer", other),
6982 }
6983 }
6984
6985 fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
6987 match self.next_token() {
6988 Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
6989 self.error(
6990 self.peek_prev_pos(),
6991 format!("Could not parse '{}' as u64: {}", s, e),
6992 )
6993 }),
6994 other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
6995 }
6996 }
6997
6998 fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7000 match self.next_token() {
7001 Some(Token::String(ref s)) => Ok(s.clone()),
7002 other => self.expected(self.peek_prev_pos(), "literal string", other),
7003 }
7004 }
7005
7006 fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7008 let other = |ident| RawDataType::Other {
7009 name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7010 typ_mod: vec![],
7011 };
7012
7013 let mut data_type = match self.next_token() {
7014 Some(Token::Keyword(kw)) => match kw {
7015 CHAR | CHARACTER => {
7017 let name = if self.parse_keyword(VARYING) {
7018 ident!("varchar")
7019 } else {
7020 ident!("bpchar")
7021 };
7022 RawDataType::Other {
7023 name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7024 typ_mod: self.parse_typ_mod()?,
7025 }
7026 }
7027 BPCHAR => RawDataType::Other {
7028 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7029 typ_mod: self.parse_typ_mod()?,
7030 },
7031 VARCHAR => RawDataType::Other {
7032 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7033 typ_mod: self.parse_typ_mod()?,
7034 },
7035 STRING => other(ident!("text")),
7036
7037 BIGINT => other(ident!("int8")),
7039 SMALLINT => other(ident!("int2")),
7040 DEC | DECIMAL => RawDataType::Other {
7041 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7042 typ_mod: self.parse_typ_mod()?,
7043 },
7044 DOUBLE => {
7045 let _ = self.parse_keyword(PRECISION);
7046 other(ident!("float8"))
7047 }
7048 FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7049 v if v == 0 || v > 53 => {
7050 return Err(self.error(
7051 self.peek_prev_pos(),
7052 "precision for type float must be within ([1-53])".into(),
7053 ));
7054 }
7055 v if v < 25 => other(ident!("float4")),
7056 _ => other(ident!("float8")),
7057 },
7058 INT | INTEGER => other(ident!("int4")),
7059 REAL => other(ident!("float4")),
7060
7061 TIME => {
7063 if self.parse_keyword(WITH) {
7064 self.expect_keywords(&[TIME, ZONE])?;
7065 other(ident!("timetz"))
7066 } else {
7067 if self.parse_keyword(WITHOUT) {
7068 self.expect_keywords(&[TIME, ZONE])?;
7069 }
7070 other(ident!("time"))
7071 }
7072 }
7073 TIMESTAMP => {
7074 let typ_mod = self.parse_timestamp_precision()?;
7075 if self.parse_keyword(WITH) {
7076 self.expect_keywords(&[TIME, ZONE])?;
7077 RawDataType::Other {
7078 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7079 "timestamptz"
7080 ))),
7081 typ_mod,
7082 }
7083 } else {
7084 if self.parse_keyword(WITHOUT) {
7085 self.expect_keywords(&[TIME, ZONE])?;
7086 }
7087 RawDataType::Other {
7088 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7089 "timestamp"
7090 ))),
7091 typ_mod,
7092 }
7093 }
7094 }
7095 TIMESTAMPTZ => {
7096 let typ_mod = self.parse_timestamp_precision()?;
7097 RawDataType::Other {
7098 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7099 "timestamptz"
7100 ))),
7101 typ_mod,
7102 }
7103 }
7104
7105 MAP => {
7107 return self.parse_map_type();
7108 }
7109
7110 BOOLEAN => other(ident!("bool")),
7112 BYTES => other(ident!("bytea")),
7113 JSON => other(ident!("jsonb")),
7114
7115 kw if kw.is_sometimes_reserved() => {
7118 return self.expected(
7119 self.peek_prev_pos(),
7120 "a data type name",
7121 Some(Token::Keyword(kw)),
7122 );
7123 }
7124 _ => {
7125 self.prev_token();
7126 RawDataType::Other {
7127 name: RawItemName::Name(self.parse_item_name()?),
7128 typ_mod: self.parse_typ_mod()?,
7129 }
7130 }
7131 },
7132 Some(Token::Ident(_) | Token::LBracket) => {
7133 self.prev_token();
7134 RawDataType::Other {
7135 name: self.parse_raw_name()?,
7136 typ_mod: self.parse_typ_mod()?,
7137 }
7138 }
7139 other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7140 };
7141
7142 loop {
7143 match self.peek_token() {
7144 Some(Token::Keyword(LIST)) => {
7145 self.next_token();
7146 data_type = RawDataType::List(Box::new(data_type));
7147 }
7148 Some(Token::LBracket) => {
7149 self.next_token();
7152 let _ = self.maybe_parse(|parser| parser.parse_number_value());
7153 self.expect_token(&Token::RBracket)?;
7154 if !matches!(data_type, RawDataType::Array(_)) {
7155 data_type = RawDataType::Array(Box::new(data_type));
7156 }
7157 }
7158 _ => break,
7159 }
7160 }
7161 Ok(data_type)
7162 }
7163
7164 fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7165 if self.consume_token(&Token::LParen) {
7166 let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7167 self.expect_token(&Token::RParen)?;
7168 Ok(typ_mod)
7169 } else {
7170 Ok(vec![])
7171 }
7172 }
7173
7174 fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7176 if self.consume_token(&Token::LParen) {
7177 let typ_mod = self.parse_literal_int()?;
7178 self.expect_token(&Token::RParen)?;
7179 Ok(vec![typ_mod])
7180 } else {
7181 Ok(vec![])
7182 }
7183 }
7184
7185 fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7189 where
7190 F: FnOnce(Keyword) -> bool,
7191 {
7192 let after_as = self.parse_keyword(AS);
7193 match self.next_token() {
7194 Some(Token::Keyword(OF)) => {
7197 self.prev_token();
7198 if after_as {
7199 self.prev_token();
7200 }
7201 Ok(None)
7202 }
7203 Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7209 Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7210 not_an_ident => {
7211 if after_as {
7212 return self.expected(
7213 self.peek_prev_pos(),
7214 "an identifier after AS",
7215 not_an_ident,
7216 );
7217 }
7218 self.prev_token();
7219 Ok(None) }
7221 }
7222 }
7223
7224 fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7229 match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7230 Some(name) => {
7231 let columns = self.parse_parenthesized_column_list(Optional)?;
7232 Ok(Some(TableAlias {
7233 name,
7234 columns,
7235 strict: false,
7236 }))
7237 }
7238 None => Ok(None),
7239 }
7240 }
7241
7242 fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7243 Ok(match self.parse_raw_name()? {
7244 named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7245 RawItemName::Name(name) => DeferredItemName::Deferred(name),
7246 })
7247 }
7248
7249 fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7250 if self.consume_token(&Token::LBracket) {
7251 let id = match self.next_token() {
7252 Some(Token::Ident(id)) => id.into_inner(),
7253 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7254 };
7255 self.expect_keyword(AS)?;
7256 let name = self.parse_item_name()?;
7257 if name.0.len() < 2 {
7259 return parser_err!(
7260 self,
7261 self.peek_prev_pos(),
7262 "table name in square brackets must be fully qualified"
7263 );
7264 }
7265
7266 let version = if self.parse_keywords(&[VERSION]) {
7267 let version = self.parse_version()?;
7268 Some(version)
7269 } else {
7270 None
7271 };
7272
7273 self.expect_token(&Token::RBracket)?;
7274 Ok(RawItemName::Id(id, name, version))
7275 } else {
7276 Ok(RawItemName::Name(self.parse_item_name()?))
7277 }
7278 }
7279
7280 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7281 let start = self.peek_pos();
7282 let mut item_name = self.parse_raw_name()?;
7283 let column_name = match &mut item_name {
7284 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7285 if identifiers.len() < 2 {
7286 return Err(ParserError::new(
7287 start,
7288 "need to specify an object and a column",
7289 ));
7290 }
7291 identifiers.pop().unwrap()
7292 }
7293 RawItemName::Id(_, _, _) => {
7294 self.expect_token(&Token::Dot)?;
7295 self.parse_identifier()?
7296 }
7297 };
7298
7299 Ok(ColumnName {
7300 relation: item_name,
7301 column: column_name,
7302 })
7303 }
7304
7305 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7308 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7309 }
7310
7311 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7314 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7315 }
7316
7317 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7320 Ok(UnresolvedItemName(self.parse_identifiers()?))
7321 }
7322
7323 fn parse_object_name(
7325 &mut self,
7326 object_type: ObjectType,
7327 ) -> Result<UnresolvedObjectName, ParserError> {
7328 Ok(match object_type {
7329 ObjectType::Table
7330 | ObjectType::View
7331 | ObjectType::MaterializedView
7332 | ObjectType::Source
7333 | ObjectType::Subsource
7334 | ObjectType::Sink
7335 | ObjectType::Index
7336 | ObjectType::Type
7337 | ObjectType::Secret
7338 | ObjectType::Connection
7339 | ObjectType::Func
7340 | ObjectType::ContinualTask => UnresolvedObjectName::Item(self.parse_item_name()?),
7341 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7342 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7343 ObjectType::ClusterReplica => {
7344 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7345 }
7346 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7347 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7348 ObjectType::NetworkPolicy => {
7349 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7350 }
7351 })
7352 }
7353
7354 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7356 let mut idents = vec![];
7357 loop {
7358 idents.push(self.parse_identifier()?);
7359 if !self.consume_token(&Token::Dot) {
7360 break;
7361 }
7362 }
7363 Ok(idents)
7364 }
7365
7366 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7368 match self.consume_identifier()? {
7369 Some(id) => {
7370 if id.as_str().is_empty() {
7371 return parser_err!(
7372 self,
7373 self.peek_prev_pos(),
7374 "zero-length delimited identifier",
7375 );
7376 }
7377 Ok(id)
7378 }
7379 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7380 }
7381 }
7382
7383 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7384 match self.peek_token() {
7385 Some(Token::Keyword(kw)) => {
7386 self.next_token();
7387 Ok(Some(kw.into()))
7388 }
7389 Some(Token::Ident(id)) => {
7390 self.next_token();
7391 Ok(Some(self.new_identifier(id)?))
7392 }
7393 _ => Ok(None),
7394 }
7395 }
7396
7397 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7398 let mut id_parts = vec![id];
7399 match self.peek_token() {
7400 Some(Token::LParen) | Some(Token::Dot) => {
7401 let mut ends_with_wildcard = false;
7402 while self.consume_token(&Token::Dot) {
7403 match self.next_token() {
7404 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7405 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7406 Some(Token::Star) => {
7407 ends_with_wildcard = true;
7408 break;
7409 }
7410 unexpected => {
7411 return self.expected(
7412 self.peek_prev_pos(),
7413 "an identifier or a '*' after '.'",
7414 unexpected,
7415 );
7416 }
7417 }
7418 }
7419 if ends_with_wildcard {
7420 Ok(Expr::QualifiedWildcard(id_parts))
7421 } else if self.peek_token() == Some(Token::LParen) {
7422 let function =
7423 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7424 Ok(Expr::Function(function))
7425 } else {
7426 Ok(Expr::Identifier(id_parts))
7427 }
7428 }
7429 _ => Ok(Expr::Identifier(id_parts)),
7430 }
7431 }
7432
7433 fn parse_parenthesized_column_list(
7435 &mut self,
7436 optional: IsOptional,
7437 ) -> Result<Vec<Ident>, ParserError> {
7438 if self.consume_token(&Token::LParen) {
7439 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7440 self.expect_token(&Token::RParen)?;
7441 Ok(cols)
7442 } else if optional == Optional {
7443 Ok(vec![])
7444 } else {
7445 self.expected(
7446 self.peek_pos(),
7447 "a list of columns in parentheses",
7448 self.peek_token(),
7449 )
7450 }
7451 }
7452
7453 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7454 if self.consume_token(&Token::LParen) {
7455 let n = self.parse_literal_uint()?;
7456 self.expect_token(&Token::RParen)?;
7457 Ok(Some(n))
7458 } else {
7459 Ok(None)
7460 }
7461 }
7462
7463 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7464 self.expect_token(&Token::LBracket)?;
7465 let key_type = Box::new(self.parse_data_type()?);
7466 self.expect_token(&Token::Arrow)?;
7467 let value_type = Box::new(self.parse_data_type()?);
7468 self.expect_token(&Token::RBracket)?;
7469 Ok(RawDataType::Map {
7470 key_type,
7471 value_type,
7472 })
7473 }
7474
7475 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7476 self.expect_keyword(FROM)?;
7477 let table_name = RawItemName::Name(self.parse_item_name()?);
7478 let alias = self.parse_optional_table_alias()?;
7479 let using = if self.parse_keyword(USING) {
7480 self.parse_comma_separated(Parser::parse_table_and_joins)?
7481 } else {
7482 vec![]
7483 };
7484 let selection = if self.parse_keyword(WHERE) {
7485 Some(self.parse_expr()?)
7486 } else {
7487 None
7488 };
7489
7490 Ok(Statement::Delete(DeleteStatement {
7491 table_name,
7492 alias,
7493 using,
7494 selection,
7495 }))
7496 }
7497
7498 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7500 Ok(SelectStatement {
7501 query: self.parse_query()?,
7502 as_of: self.parse_optional_as_of()?,
7503 })
7504 }
7505
7506 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7511 self.checked_recur_mut(|parser| {
7512 let cte_block = if parser.parse_keyword(WITH) {
7513 if parser.parse_keyword(MUTUALLY) {
7514 parser.expect_keyword(RECURSIVE)?;
7515 let options = if parser.consume_token(&Token::LParen) {
7516 let options =
7517 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7518 parser.expect_token(&Token::RParen)?;
7519 options
7520 } else {
7521 vec![]
7522 };
7523 CteBlock::MutuallyRecursive(MutRecBlock {
7524 options,
7525 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7526 })
7527 } else {
7528 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7530 }
7531 } else {
7532 CteBlock::empty()
7533 };
7534
7535 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7536
7537 parser.parse_query_tail(cte_block, body)
7538 })
7539 }
7540
7541 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7542 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7543 RECURSION => {
7544 self.expect_keyword(LIMIT)?;
7545 Ok(MutRecBlockOption {
7546 name: MutRecBlockOptionName::RecursionLimit,
7547 value: self.parse_optional_option_value()?,
7548 })
7549 }
7550 RETURN => {
7551 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7552 Ok(MutRecBlockOption {
7553 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7554 value: self.parse_optional_option_value()?,
7555 })
7556 }
7557 ERROR => {
7558 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7559 Ok(MutRecBlockOption {
7560 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7561 value: self.parse_optional_option_value()?,
7562 })
7563 }
7564 _ => unreachable!(),
7565 }
7566 }
7567
7568 fn parse_query_tail(
7569 &mut self,
7570 ctes: CteBlock<Raw>,
7571 body: SetExpr<Raw>,
7572 ) -> Result<Query<Raw>, ParserError> {
7573 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7574 SetExpr::Query(query) => {
7575 let Query {
7576 ctes,
7577 body,
7578 order_by,
7579 limit,
7580 offset,
7581 } = *query;
7582 (ctes, order_by, limit, offset, body)
7583 }
7584 _ => (CteBlock::empty(), vec![], None, None, body),
7585 };
7586
7587 let ctes = if ctes.is_empty() {
7588 inner_ctes
7589 } else if !inner_ctes.is_empty() {
7590 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7591 } else {
7592 ctes
7593 };
7594
7595 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7596 if !inner_order_by.is_empty() {
7597 return parser_err!(
7598 self,
7599 self.peek_prev_pos(),
7600 "multiple ORDER BY clauses not allowed"
7601 );
7602 }
7603 self.parse_comma_separated(Parser::parse_order_by_expr)?
7604 } else {
7605 inner_order_by
7606 };
7607
7608 let mut limit = inner_limit;
7612 let mut offset = inner_offset;
7613 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7614 match parsed_keyword {
7615 LIMIT => {
7616 if limit.is_some() {
7617 return parser_err!(
7618 self,
7619 self.peek_prev_pos(),
7620 "multiple LIMIT/FETCH clauses not allowed"
7621 );
7622 }
7623 limit = if self.parse_keyword(ALL) {
7624 None
7625 } else {
7626 Some(Limit {
7627 with_ties: false,
7628 quantity: self.parse_expr()?,
7629 })
7630 };
7631 }
7632 OFFSET => {
7633 if offset.is_some() {
7634 return parser_err!(
7635 self,
7636 self.peek_prev_pos(),
7637 "multiple OFFSET clauses not allowed"
7638 );
7639 }
7640 let value = self.parse_expr()?;
7641 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7642 offset = Some(value);
7643 }
7644 FETCH => {
7645 if limit.is_some() {
7646 return parser_err!(
7647 self,
7648 self.peek_prev_pos(),
7649 "multiple LIMIT/FETCH clauses not allowed"
7650 );
7651 }
7652 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7653 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7654 Expr::Value(Value::Number('1'.into()))
7655 } else {
7656 let quantity = self.parse_expr()?;
7657 self.expect_one_of_keywords(&[ROW, ROWS])?;
7658 quantity
7659 };
7660 let with_ties = if self.parse_keyword(ONLY) {
7661 false
7662 } else if self.parse_keywords(&[WITH, TIES]) {
7663 true
7664 } else {
7665 return self.expected(
7666 self.peek_pos(),
7667 "one of ONLY or WITH TIES",
7668 self.peek_token(),
7669 );
7670 };
7671 limit = Some(Limit {
7672 with_ties,
7673 quantity,
7674 });
7675 }
7676 _ => unreachable!(),
7677 }
7678 }
7679
7680 Ok(Query {
7681 ctes,
7682 body,
7683 order_by,
7684 limit,
7685 offset,
7686 })
7687 }
7688
7689 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7691 let alias = TableAlias {
7692 name: self.parse_identifier()?,
7693 columns: self.parse_parenthesized_column_list(Optional)?,
7694 strict: false,
7695 };
7696 self.expect_keyword(AS)?;
7697 self.expect_token(&Token::LParen)?;
7698 let query = self.parse_query()?;
7699 self.expect_token(&Token::RParen)?;
7700 Ok(Cte {
7701 alias,
7702 query,
7703 id: (),
7704 })
7705 }
7706
7707 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7713 let name = self.parse_identifier()?;
7714 self.expect_token(&Token::LParen)?;
7715 let columns = self.parse_comma_separated(|parser| {
7716 Ok(CteMutRecColumnDef {
7717 name: parser.parse_identifier()?,
7718 data_type: parser.parse_data_type()?,
7719 })
7720 })?;
7721 self.expect_token(&Token::RParen)?;
7722 self.expect_keyword(AS)?;
7723 self.expect_token(&Token::LParen)?;
7724 let query = self.parse_query()?;
7725 self.expect_token(&Token::RParen)?;
7726 Ok(CteMutRec {
7727 name,
7728 columns,
7729 query,
7730 id: (),
7731 })
7732 }
7733
7734 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7743 let expr = if self.parse_keyword(SELECT) {
7746 SetExpr::Select(Box::new(self.parse_select()?))
7747 } else if self.consume_token(&Token::LParen) {
7748 let subquery = self.parse_query()?;
7750 self.expect_token(&Token::RParen)?;
7751 SetExpr::Query(Box::new(subquery))
7752 } else if self.parse_keyword(VALUES) {
7753 SetExpr::Values(self.parse_values()?)
7754 } else if self.parse_keyword(SHOW) {
7755 SetExpr::Show(self.parse_show()?)
7756 } else if self.parse_keyword(TABLE) {
7757 SetExpr::Table(self.parse_raw_name()?)
7758 } else {
7759 return self.expected(
7760 self.peek_pos(),
7761 "SELECT, VALUES, or a subquery in the query body",
7762 self.peek_token(),
7763 );
7764 };
7765
7766 self.parse_query_body_seeded(precedence, expr)
7767 }
7768
7769 fn parse_query_body_seeded(
7770 &mut self,
7771 precedence: SetPrecedence,
7772 mut expr: SetExpr<Raw>,
7773 ) -> Result<SetExpr<Raw>, ParserError> {
7774 loop {
7775 let next_token = self.peek_token();
7777 let op = self.parse_set_operator(&next_token);
7778 let next_precedence = match op {
7779 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7781 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7783 None => break,
7785 };
7786 if precedence >= next_precedence {
7787 break;
7788 }
7789 self.next_token(); let all = self.parse_keyword(ALL);
7792 let distinct = self.parse_keyword(DISTINCT);
7793 if all && distinct {
7794 return parser_err!(
7795 self,
7796 self.peek_prev_pos(),
7797 "Cannot specify both ALL and DISTINCT in set operation"
7798 );
7799 }
7800 expr = SetExpr::SetOperation {
7801 left: Box::new(expr),
7802 op: op.unwrap(),
7803 all,
7804 right: Box::new(self.parse_query_body(next_precedence)?),
7805 };
7806 }
7807
7808 Ok(expr)
7809 }
7810
7811 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7812 match token {
7813 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
7814 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
7815 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
7816 _ => None,
7817 }
7818 }
7819
7820 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
7823 let all = self.parse_keyword(ALL);
7824 let distinct = self.parse_keyword(DISTINCT);
7825 if all && distinct {
7826 return parser_err!(
7827 self,
7828 self.peek_prev_pos(),
7829 "Cannot specify both ALL and DISTINCT in SELECT"
7830 );
7831 }
7832 let distinct = if distinct && self.parse_keyword(ON) {
7833 self.expect_token(&Token::LParen)?;
7834 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
7835 self.expect_token(&Token::RParen)?;
7836 Some(Distinct::On(exprs))
7837 } else if distinct {
7838 Some(Distinct::EntireRow)
7839 } else {
7840 None
7841 };
7842
7843 let projection = match self.peek_token() {
7844 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
7848 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
7849 _ => {
7850 let mut projection = vec![];
7851 loop {
7852 projection.push(self.parse_select_item()?);
7853 if !self.consume_token(&Token::Comma) {
7854 break;
7855 }
7856 if self.peek_keyword(FROM) {
7857 return parser_err!(
7858 self,
7859 self.peek_prev_pos(),
7860 "invalid trailing comma in SELECT list",
7861 );
7862 }
7863 }
7864 projection
7865 }
7866 };
7867
7868 let from = if self.parse_keyword(FROM) {
7874 self.parse_comma_separated(Parser::parse_table_and_joins)?
7875 } else {
7876 vec![]
7877 };
7878
7879 let selection = if self.parse_keyword(WHERE) {
7880 Some(self.parse_expr()?)
7881 } else {
7882 None
7883 };
7884
7885 let group_by = if self.parse_keywords(&[GROUP, BY]) {
7886 self.parse_comma_separated(Parser::parse_expr)?
7887 } else {
7888 vec![]
7889 };
7890
7891 let having = if self.parse_keyword(HAVING) {
7892 Some(self.parse_expr()?)
7893 } else {
7894 None
7895 };
7896
7897 let qualify = if self.parse_keyword(QUALIFY) {
7898 Some(self.parse_expr()?)
7899 } else {
7900 None
7901 };
7902
7903 let options = if self.parse_keyword(OPTIONS) {
7904 self.expect_token(&Token::LParen)?;
7905 let options = self.parse_comma_separated(Self::parse_select_option)?;
7906 self.expect_token(&Token::RParen)?;
7907 options
7908 } else {
7909 vec![]
7910 };
7911
7912 Ok(Select {
7913 distinct,
7914 projection,
7915 from,
7916 selection,
7917 group_by,
7918 having,
7919 qualify,
7920 options,
7921 })
7922 }
7923
7924 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
7925 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
7926 EXPECTED => {
7927 self.expect_keywords(&[GROUP, SIZE])?;
7928 SelectOptionName::ExpectedGroupSize
7929 }
7930 AGGREGATE => {
7931 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7932 SelectOptionName::AggregateInputGroupSize
7933 }
7934 DISTINCT => {
7935 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
7936 SelectOptionName::DistinctOnInputGroupSize
7937 }
7938 LIMIT => {
7939 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7940 SelectOptionName::LimitInputGroupSize
7941 }
7942 _ => unreachable!(),
7943 };
7944 Ok(SelectOption {
7945 name,
7946 value: self.parse_optional_option_value()?,
7947 })
7948 }
7949
7950 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7951 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
7952 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
7953 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
7954 if !normal {
7955 match variable.as_str().parse() {
7956 Ok(TIME) => {
7957 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
7958 variable = ident!("timezone");
7959 normal = true;
7960 }
7961 Ok(NAMES) => {
7962 variable = ident!("client_encoding");
7963 normal = true;
7964 }
7965 _ => {}
7966 }
7967 }
7968 if variable.as_str().parse() == Ok(SCHEMA) {
7969 variable = ident!("search_path");
7970 let to = self
7971 .parse_set_schema_to()
7972 .map_parser_err(StatementKind::SetVariable)?;
7973 Ok(Statement::SetVariable(SetVariableStatement {
7974 local: modifier == Some(LOCAL),
7975 variable,
7976 to,
7977 }))
7978 } else if normal {
7979 let to = self
7980 .parse_set_variable_to()
7981 .map_parser_err(StatementKind::SetVariable)?;
7982 Ok(Statement::SetVariable(SetVariableStatement {
7983 local: modifier == Some(LOCAL),
7984 variable,
7985 to,
7986 }))
7987 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
7988 Ok(Statement::SetTransaction(SetTransactionStatement {
7990 local: true,
7991 modes: self
7992 .parse_transaction_modes(true)
7993 .map_parser_err(StatementKind::SetTransaction)?,
7994 }))
7995 } else if modifier == Some(SESSION)
7996 && variable.as_str().parse() == Ok(CHARACTERISTICS)
7997 && self.parse_keywords(&[AS, TRANSACTION])
7998 {
7999 Ok(Statement::SetTransaction(SetTransactionStatement {
8001 local: false,
8002 modes: self
8003 .parse_transaction_modes(true)
8004 .map_parser_err(StatementKind::SetTransaction)?,
8005 }))
8006 } else {
8007 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8008 .map_no_statement_parser_err()
8009 }
8010 }
8011
8012 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8013 if self.parse_keyword(DEFAULT) {
8014 Ok(SetVariableTo::Default)
8015 } else {
8016 let to = self.parse_set_variable_value()?;
8017 Ok(SetVariableTo::Values(vec![to]))
8018 }
8019 }
8020
8021 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8022 if self.parse_keyword(DEFAULT) {
8023 Ok(SetVariableTo::Default)
8024 } else {
8025 Ok(SetVariableTo::Values(
8026 self.parse_comma_separated(Parser::parse_set_variable_value)?,
8027 ))
8028 }
8029 }
8030
8031 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8032 if let Some(value) = self.maybe_parse(Parser::parse_value) {
8033 Ok(SetVariableValue::Literal(value))
8034 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8035 Ok(SetVariableValue::Ident(ident))
8036 } else {
8037 self.expected(self.peek_pos(), "variable value", self.peek_token())
8038 }
8039 }
8040
8041 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8042 let mut variable = self.parse_identifier()?;
8043 if variable.as_str().parse() == Ok(SCHEMA) {
8044 variable = ident!("search_path");
8045 }
8046 Ok(Statement::ResetVariable(ResetVariableStatement {
8047 variable,
8048 }))
8049 }
8050
8051 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8052 let redacted = self.parse_keyword(REDACTED);
8053 if redacted && !self.peek_keyword(CREATE) {
8054 return parser_err!(
8055 self,
8056 self.peek_pos(),
8057 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8058 );
8059 }
8060 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8061 self.parse_show_columns()
8062 } else if self.parse_keyword(OBJECTS) {
8063 let from = if self.parse_keywords(&[FROM]) {
8064 Some(self.parse_schema_name()?)
8065 } else {
8066 None
8067 };
8068 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8069 object_type: ShowObjectType::Object,
8070 from,
8071 filter: self.parse_show_statement_filter()?,
8072 }))
8073 } else if let Some(object_type) = self.parse_plural_object_type() {
8074 let from = if object_type.lives_in_schema() {
8075 if self.parse_keywords(&[FROM]) {
8076 Some(self.parse_schema_name()?)
8077 } else {
8078 None
8079 }
8080 } else {
8081 None
8082 };
8083
8084 let show_object_type = match object_type {
8085 ObjectType::Database => ShowObjectType::Database,
8086 ObjectType::Schema => {
8087 let from = if self.parse_keyword(FROM) {
8088 Some(self.parse_database_name()?)
8089 } else {
8090 None
8091 };
8092 ShowObjectType::Schema { from }
8093 }
8094 ObjectType::Table => {
8095 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8096 Some(self.parse_raw_name()?)
8097 } else {
8098 None
8099 };
8100 ShowObjectType::Table { on_source }
8101 }
8102 ObjectType::View => ShowObjectType::View,
8103 ObjectType::Source => {
8104 let in_cluster = self.parse_optional_in_cluster()?;
8105 ShowObjectType::Source { in_cluster }
8106 }
8107 ObjectType::Subsource => {
8108 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8109 Some(self.parse_raw_name()?)
8110 } else {
8111 None
8112 };
8113
8114 if from.is_some() && on_source.is_some() {
8115 return parser_err!(
8116 self,
8117 self.peek_prev_pos(),
8118 "Cannot specify both FROM and ON"
8119 );
8120 }
8121
8122 ShowObjectType::Subsource { on_source }
8123 }
8124 ObjectType::Sink => {
8125 let in_cluster = self.parse_optional_in_cluster()?;
8126 ShowObjectType::Sink { in_cluster }
8127 }
8128 ObjectType::Type => ShowObjectType::Type,
8129 ObjectType::Role => ShowObjectType::Role,
8130 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8131 ObjectType::Secret => ShowObjectType::Secret,
8132 ObjectType::Connection => ShowObjectType::Connection,
8133 ObjectType::Cluster => ShowObjectType::Cluster,
8134 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8135 ObjectType::MaterializedView => {
8136 let in_cluster = self.parse_optional_in_cluster()?;
8137 ShowObjectType::MaterializedView { in_cluster }
8138 }
8139 ObjectType::ContinualTask => {
8140 let in_cluster = self.parse_optional_in_cluster()?;
8141 ShowObjectType::ContinualTask { in_cluster }
8142 }
8143 ObjectType::Index => {
8144 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8145 Some(self.parse_raw_name()?)
8146 } else {
8147 None
8148 };
8149
8150 if from.is_some() && on_object.is_some() {
8151 return parser_err!(
8152 self,
8153 self.peek_prev_pos(),
8154 "Cannot specify both FROM and ON"
8155 );
8156 }
8157
8158 let in_cluster = self.parse_optional_in_cluster()?;
8159 ShowObjectType::Index {
8160 in_cluster,
8161 on_object,
8162 }
8163 }
8164 ObjectType::Func => {
8165 return parser_err!(
8166 self,
8167 self.peek_prev_pos(),
8168 format!("Unsupported SHOW on {object_type}")
8169 );
8170 }
8171 };
8172 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8173 object_type: show_object_type,
8174 from,
8175 filter: self.parse_show_statement_filter()?,
8176 }))
8177 } else if self.parse_keyword(CLUSTER) {
8178 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8179 variable: ident!("cluster"),
8180 }))
8181 } else if self.parse_keyword(PRIVILEGES) {
8182 self.parse_show_privileges()
8183 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8184 self.parse_show_default_privileges()
8185 } else if self.parse_keyword(ROLE) {
8186 self.expect_keyword(MEMBERSHIP)?;
8187 let role = if self.parse_keyword(FOR) {
8188 Some(self.parse_identifier()?)
8189 } else {
8190 None
8191 };
8192 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8193 object_type: ShowObjectType::RoleMembership { role },
8194 from: None,
8195 filter: self.parse_show_statement_filter()?,
8196 }))
8197 } else if self.parse_keywords(&[CREATE, VIEW]) {
8198 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8199 view_name: self.parse_raw_name()?,
8200 redacted,
8201 }))
8202 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8203 Ok(ShowStatement::ShowCreateMaterializedView(
8204 ShowCreateMaterializedViewStatement {
8205 materialized_view_name: self.parse_raw_name()?,
8206 redacted,
8207 },
8208 ))
8209 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8210 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8211 source_name: self.parse_raw_name()?,
8212 redacted,
8213 }))
8214 } else if self.parse_keywords(&[CREATE, TABLE]) {
8215 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8216 table_name: self.parse_raw_name()?,
8217 redacted,
8218 }))
8219 } else if self.parse_keywords(&[CREATE, SINK]) {
8220 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8221 sink_name: self.parse_raw_name()?,
8222 redacted,
8223 }))
8224 } else if self.parse_keywords(&[CREATE, INDEX]) {
8225 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8226 index_name: self.parse_raw_name()?,
8227 redacted,
8228 }))
8229 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8230 Ok(ShowStatement::ShowCreateConnection(
8231 ShowCreateConnectionStatement {
8232 connection_name: self.parse_raw_name()?,
8233 redacted,
8234 },
8235 ))
8236 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8237 if redacted {
8238 return parser_err!(
8239 self,
8240 self.peek_prev_pos(),
8241 "SHOW REDACTED CREATE CLUSTER is not supported"
8242 );
8243 }
8244 Ok(ShowStatement::ShowCreateCluster(
8245 ShowCreateClusterStatement {
8246 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8247 },
8248 ))
8249 } else if self.parse_keywords(&[CREATE, TYPE]) {
8250 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8251 type_name: self.parse_data_type()?,
8252 redacted,
8253 }))
8254 } else {
8255 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8256 ident!("transaction_isolation")
8257 } else if self.parse_keywords(&[TIME, ZONE]) {
8258 ident!("timezone")
8259 } else {
8260 self.parse_identifier()?
8261 };
8262 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8263 variable,
8264 }))
8265 }
8266 }
8267
8268 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8269 self.expect_one_of_keywords(&[FROM, IN])?;
8270 let table_name = self.parse_raw_name()?;
8271 let filter = self.parse_show_statement_filter()?;
8275 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8276 table_name,
8277 filter,
8278 }))
8279 }
8280
8281 fn parse_show_statement_filter(
8282 &mut self,
8283 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8284 if self.parse_keyword(LIKE) {
8285 Ok(Some(ShowStatementFilter::Like(
8286 self.parse_literal_string()?,
8287 )))
8288 } else if self.parse_keyword(WHERE) {
8289 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8290 } else {
8291 Ok(None)
8292 }
8293 }
8294
8295 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8296 let object_type = if self.parse_keyword(ON) {
8297 Some(self.expect_plural_system_object_type_for_privileges()?)
8298 } else {
8299 None
8300 };
8301 let role = if self.parse_keyword(FOR) {
8302 Some(self.parse_identifier()?)
8303 } else {
8304 None
8305 };
8306 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8307 object_type: ShowObjectType::Privileges { object_type, role },
8308 from: None,
8309 filter: self.parse_show_statement_filter()?,
8310 }))
8311 }
8312
8313 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8314 let object_type = if self.parse_keyword(ON) {
8315 Some(self.expect_plural_object_type_for_privileges()?)
8316 } else {
8317 None
8318 };
8319 let role = if self.parse_keyword(FOR) {
8320 Some(self.parse_identifier()?)
8321 } else {
8322 None
8323 };
8324 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8325 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8326 from: None,
8327 filter: self.parse_show_statement_filter()?,
8328 }))
8329 }
8330
8331 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8332 self.expect_keyword(SHARD)?;
8333 let id = self.parse_literal_string()?;
8334 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8335 }
8336
8337 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8338 let relation = self.parse_table_factor()?;
8339
8340 let mut joins = vec![];
8344 loop {
8345 let join = if self.parse_keyword(CROSS) {
8346 self.expect_keyword(JOIN)?;
8347 Join {
8348 relation: self.parse_table_factor()?,
8349 join_operator: JoinOperator::CrossJoin,
8350 }
8351 } else {
8352 let natural = self.parse_keyword(NATURAL);
8353 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8354 Some(kw)
8355 } else {
8356 None
8357 };
8358
8359 let join_operator_type = match peek_keyword {
8360 Some(INNER) | Some(JOIN) => {
8361 let _ = self.parse_keyword(INNER);
8362 self.expect_keyword(JOIN)?;
8363 JoinOperator::Inner
8364 }
8365 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8366 let _ = self.next_token();
8367 let _ = self.parse_keyword(OUTER);
8368 self.expect_keyword(JOIN)?;
8369 match kw {
8370 LEFT => JoinOperator::LeftOuter,
8371 RIGHT => JoinOperator::RightOuter,
8372 FULL => JoinOperator::FullOuter,
8373 _ => unreachable!(),
8374 }
8375 }
8376 Some(OUTER) => {
8377 return self.expected(
8378 self.peek_pos(),
8379 "LEFT, RIGHT, or FULL",
8380 self.peek_token(),
8381 );
8382 }
8383 None if natural => {
8384 return self.expected(
8385 self.peek_pos(),
8386 "a join type after NATURAL",
8387 self.peek_token(),
8388 );
8389 }
8390 _ => break,
8391 };
8392 let relation = self.parse_table_factor()?;
8393 let join_constraint = self.parse_join_constraint(natural)?;
8394 Join {
8395 relation,
8396 join_operator: join_operator_type(join_constraint),
8397 }
8398 };
8399 joins.push(join);
8400 }
8401 Ok(TableWithJoins { relation, joins })
8402 }
8403
8404 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8406 if self.parse_keyword(LATERAL) {
8407 if self.consume_token(&Token::LParen) {
8409 return self.parse_derived_table_factor(Lateral);
8410 } else if self.parse_keywords(&[ROWS, FROM]) {
8411 return self.parse_rows_from();
8412 } else {
8413 let name = self.parse_raw_name()?;
8414 self.expect_token(&Token::LParen)?;
8415 let args = self.parse_optional_args(false)?;
8416 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8417 return Ok(TableFactor::Function {
8418 function: Function {
8419 name,
8420 args,
8421 filter: None,
8422 over: None,
8423 distinct: false,
8424 },
8425 alias,
8426 with_ordinality,
8427 });
8428 }
8429 }
8430
8431 if self.consume_token(&Token::LParen) {
8432 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8454
8455 let table_and_joins = self.parse_table_and_joins()?;
8466 match table_and_joins.relation {
8467 TableFactor::NestedJoin { .. } => (),
8468 _ => {
8469 if table_and_joins.joins.is_empty() {
8470 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8473 }
8474 }
8475 }
8476 self.expect_token(&Token::RParen)?;
8477 Ok(TableFactor::NestedJoin {
8478 join: Box::new(table_and_joins),
8479 alias: self.parse_optional_table_alias()?,
8480 })
8481 } else if self.parse_keywords(&[ROWS, FROM]) {
8482 Ok(self.parse_rows_from()?)
8483 } else {
8484 let name = self.parse_raw_name()?;
8485 if self.consume_token(&Token::LParen) {
8486 let args = self.parse_optional_args(false)?;
8487 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8488 Ok(TableFactor::Function {
8489 function: Function {
8490 name,
8491 args,
8492 filter: None,
8493 over: None,
8494 distinct: false,
8495 },
8496 alias,
8497 with_ordinality,
8498 })
8499 } else {
8500 Ok(TableFactor::Table {
8501 name,
8502 alias: self.parse_optional_table_alias()?,
8503 })
8504 }
8505 }
8506 }
8507
8508 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8509 self.expect_token(&Token::LParen)?;
8510 let functions = self.parse_comma_separated(Parser::parse_named_function)?;
8511 self.expect_token(&Token::RParen)?;
8512 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8513 Ok(TableFactor::RowsFrom {
8514 functions,
8515 alias,
8516 with_ordinality,
8517 })
8518 }
8519
8520 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8527 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8528 let alias = self.parse_optional_table_alias()?;
8529 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8530 if with_ordinality_1 && with_ordinality_2 {
8531 return parser_err!(
8532 self,
8533 self.peek_prev_pos(),
8534 "WITH ORDINALITY specified twice"
8535 );
8536 }
8537 Ok((with_ordinality_1 || with_ordinality_2, alias))
8538 }
8539
8540 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8541 let name = self.parse_raw_name()?;
8542 self.parse_function(name)
8543 }
8544
8545 fn parse_derived_table_factor(
8546 &mut self,
8547 lateral: IsLateral,
8548 ) -> Result<TableFactor<Raw>, ParserError> {
8549 let subquery = Box::new(self.parse_query()?);
8550 self.expect_token(&Token::RParen)?;
8551 let alias = self.parse_optional_table_alias()?;
8552 Ok(TableFactor::Derived {
8553 lateral: match lateral {
8554 Lateral => true,
8555 NotLateral => false,
8556 },
8557 subquery,
8558 alias,
8559 })
8560 }
8561
8562 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8563 if natural {
8564 Ok(JoinConstraint::Natural)
8565 } else if self.parse_keyword(ON) {
8566 let constraint = self.parse_expr()?;
8567 Ok(JoinConstraint::On(constraint))
8568 } else if self.parse_keyword(USING) {
8569 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8570 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8571
8572 Ok(JoinConstraint::Using { columns, alias })
8573 } else {
8574 self.expected(
8575 self.peek_pos(),
8576 "ON, or USING after JOIN",
8577 self.peek_token(),
8578 )
8579 }
8580 }
8581
8582 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8584 self.expect_keyword(INTO)?;
8585 let table_name = self.parse_raw_name()?;
8586 let columns = self.parse_parenthesized_column_list(Optional)?;
8587 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8588 InsertSource::DefaultValues
8589 } else {
8590 InsertSource::Query(self.parse_query()?)
8591 };
8592 let returning = self.parse_returning()?;
8593 Ok(Statement::Insert(InsertStatement {
8594 table_name,
8595 columns,
8596 source,
8597 returning,
8598 }))
8599 }
8600
8601 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8602 Ok(if self.parse_keyword(RETURNING) {
8603 self.parse_comma_separated(Parser::parse_select_item)?
8604 } else {
8605 Vec::new()
8606 })
8607 }
8608
8609 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8610 let table_name = RawItemName::Name(self.parse_item_name()?);
8611 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8613 let alias = alias.map(|name| TableAlias {
8614 name,
8615 columns: Vec::new(),
8616 strict: false,
8617 });
8618
8619 self.expect_keyword(SET)?;
8620 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8621 let selection = if self.parse_keyword(WHERE) {
8622 Some(self.parse_expr()?)
8623 } else {
8624 None
8625 };
8626
8627 Ok(Statement::Update(UpdateStatement {
8628 table_name,
8629 alias,
8630 assignments,
8631 selection,
8632 }))
8633 }
8634
8635 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8637 let id = self.parse_identifier()?;
8638 self.expect_token(&Token::Eq)?;
8639 let value = self.parse_expr()?;
8640 Ok(Assignment { id, value })
8641 }
8642
8643 fn parse_optional_args(
8644 &mut self,
8645 allow_order_by: bool,
8646 ) -> Result<FunctionArgs<Raw>, ParserError> {
8647 if self.consume_token(&Token::Star) {
8648 self.expect_token(&Token::RParen)?;
8649 Ok(FunctionArgs::Star)
8650 } else if self.consume_token(&Token::RParen) {
8651 Ok(FunctionArgs::args(vec![]))
8652 } else {
8653 let args = self.parse_comma_separated(Parser::parse_expr)?;
8654 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8658 self.parse_comma_separated(Parser::parse_order_by_expr)?
8659 } else {
8660 vec![]
8661 };
8662 self.expect_token(&Token::RParen)?;
8663 Ok(FunctionArgs::Args { args, order_by })
8664 }
8665 }
8666
8667 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8669 if self.parse_keyword(AS) {
8670 self.expect_keyword(OF)?;
8671 if self.parse_keywords(&[AT, LEAST]) {
8672 match self.parse_expr() {
8673 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8674 Err(e) => self.expected(
8675 e.pos,
8676 "a timestamp value after 'AS OF AT LEAST'",
8677 self.peek_token(),
8678 ),
8679 }
8680 } else {
8681 match self.parse_expr() {
8682 Ok(expr) => Ok(Some(AsOf::At(expr))),
8683 Err(e) => {
8684 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8685 }
8686 }
8687 }
8688 } else {
8689 Ok(None)
8690 }
8691 }
8692
8693 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8695 if self.parse_keyword(UP) {
8696 self.expect_keyword(TO)?;
8697 self.parse_expr().map(Some)
8698 } else {
8699 Ok(None)
8700 }
8701 }
8702
8703 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8708 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8709 let value = parser.parse_value().ok()?;
8710 let Value::Number(s) = value else { return None };
8711 s.parse().ok()
8712 }
8713
8714 if self.parse_keywords(&[AS, OF]) {
8715 match try_parse_u64(self) {
8716 Some(time) => Ok(Some(time)),
8717 None => {
8718 self.prev_token();
8719 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8720 }
8721 }
8722 } else {
8723 Ok(None)
8724 }
8725 }
8726
8727 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8729 if self.consume_token(&Token::Star) {
8730 return Ok(SelectItem::Wildcard);
8731 }
8732 Ok(SelectItem::Expr {
8733 expr: self.parse_expr()?,
8734 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8735 })
8736 }
8737
8738 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8741 let expr = self.parse_expr()?;
8742
8743 let asc = if self.parse_keyword(ASC) {
8744 Some(true)
8745 } else if self.parse_keyword(DESC) {
8746 Some(false)
8747 } else {
8748 None
8749 };
8750
8751 let nulls_last = if self.parse_keyword(NULLS) {
8752 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8753 Some(last)
8754 } else {
8755 None
8756 };
8757
8758 Ok(OrderByExpr {
8759 expr,
8760 asc,
8761 nulls_last,
8762 })
8763 }
8764
8765 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8766 let values = self.parse_comma_separated(|parser| {
8767 parser.expect_token(&Token::LParen)?;
8768 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8769 parser.expect_token(&Token::RParen)?;
8770 Ok(exprs)
8771 })?;
8772 Ok(Values(values))
8773 }
8774
8775 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8776 self.expect_keyword(TRANSACTION)?;
8777 Ok(Statement::StartTransaction(StartTransactionStatement {
8778 modes: self.parse_transaction_modes(false)?,
8779 }))
8780 }
8781
8782 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
8783 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8784 Ok(Statement::StartTransaction(StartTransactionStatement {
8785 modes: self.parse_transaction_modes(false)?,
8786 }))
8787 }
8788
8789 fn parse_transaction_modes(
8790 &mut self,
8791 mut required: bool,
8792 ) -> Result<Vec<TransactionMode>, ParserError> {
8793 let mut modes = vec![];
8794 loop {
8795 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
8796 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
8797 TransactionIsolationLevel::ReadUncommitted
8798 } else if self.parse_keywords(&[READ, COMMITTED]) {
8799 TransactionIsolationLevel::ReadCommitted
8800 } else if self.parse_keywords(&[REPEATABLE, READ]) {
8801 TransactionIsolationLevel::RepeatableRead
8802 } else if self.parse_keyword(SERIALIZABLE) {
8803 TransactionIsolationLevel::Serializable
8804 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
8805 TransactionIsolationLevel::StrongSessionSerializable
8806 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
8807 TransactionIsolationLevel::StrictSerializable
8808 } else {
8809 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
8810 };
8811 TransactionMode::IsolationLevel(iso_level)
8812 } else if self.parse_keywords(&[READ, ONLY]) {
8813 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8814 } else if self.parse_keywords(&[READ, WRITE]) {
8815 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8816 } else if required {
8817 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
8818 } else {
8819 break;
8820 };
8821 modes.push(mode);
8822 required = self.consume_token(&Token::Comma);
8827 }
8828 Ok(modes)
8829 }
8830
8831 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
8832 Ok(Statement::Commit(CommitStatement {
8833 chain: self.parse_commit_rollback_chain()?,
8834 }))
8835 }
8836
8837 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
8838 Ok(Statement::Rollback(RollbackStatement {
8839 chain: self.parse_commit_rollback_chain()?,
8840 }))
8841 }
8842
8843 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8844 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8845 if self.parse_keyword(AND) {
8846 let chain = !self.parse_keyword(NO);
8847 self.expect_keyword(CHAIN)?;
8848 Ok(chain)
8849 } else {
8850 Ok(false)
8851 }
8852 }
8853
8854 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
8855 parser_err!(
8856 self,
8857 self.peek_prev_pos(),
8858 "TAIL has been renamed to SUBSCRIBE"
8859 )
8860 }
8861
8862 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
8863 let _ = self.parse_keyword(TO);
8864 let relation = if self.consume_token(&Token::LParen) {
8865 let query = self.parse_query()?;
8866 self.expect_token(&Token::RParen)?;
8867 SubscribeRelation::Query(query)
8868 } else {
8869 SubscribeRelation::Name(self.parse_raw_name()?)
8870 };
8871 let mut output = self.parse_subscribe_output()?;
8872 let options = if self.parse_keyword(WITH) {
8873 self.expect_token(&Token::LParen)?;
8874 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
8875 self.expect_token(&Token::RParen)?;
8876 options
8877 } else {
8878 vec![]
8879 };
8880 let as_of = self.parse_optional_as_of()?;
8881 let up_to = self.parse_optional_up_to()?;
8882 if output == SubscribeOutput::Diffs {
8889 output = self.parse_subscribe_output()?;
8890 }
8891 Ok(Statement::Subscribe(SubscribeStatement {
8892 relation,
8893 options,
8894 as_of,
8895 up_to,
8896 output,
8897 }))
8898 }
8899
8900 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
8901 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
8902 PROGRESS => SubscribeOptionName::Progress,
8903 SNAPSHOT => SubscribeOptionName::Snapshot,
8904 _ => unreachable!(),
8905 };
8906 Ok(SubscribeOption {
8907 name,
8908 value: self.parse_optional_option_value()?,
8909 })
8910 }
8911
8912 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
8913 if self.parse_keywords(&[ENVELOPE]) {
8914 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
8915 self.expect_token(&Token::LParen)?;
8916 self.expect_keyword(KEY)?;
8917 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
8918 let output = match keyword {
8919 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
8920 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
8921 _ => unreachable!("no other keyword allowed"),
8922 };
8923 self.expect_token(&Token::RParen)?;
8924 Ok(output)
8925 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
8926 Ok(SubscribeOutput::WithinTimestampOrderBy {
8927 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
8928 })
8929 } else {
8930 Ok(SubscribeOutput::Diffs)
8931 }
8932 }
8933
8934 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8937 if self.parse_keyword(TIMESTAMP) {
8938 self.parse_explain_timestamp()
8939 .map_parser_err(StatementKind::ExplainTimestamp)
8940 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
8941 self.parse_explain_pushdown()
8942 .map_parser_err(StatementKind::ExplainPushdown)
8943 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
8944 self.parse_explain_analyze()
8945 .map_parser_err(StatementKind::ExplainAnalyzeObject)
8946 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
8947 self.parse_explain_schema()
8948 .map_parser_err(StatementKind::ExplainSinkSchema)
8949 } else {
8950 self.parse_explain_plan()
8951 .map_parser_err(StatementKind::ExplainPlan)
8952 }
8953 }
8954
8955 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
8956 let explainee = if self.parse_keyword(VIEW) {
8957 Explainee::View(self.parse_raw_name()?)
8959 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
8960 Explainee::MaterializedView(self.parse_raw_name()?)
8962 } else if self.parse_keyword(INDEX) {
8963 Explainee::Index(self.parse_raw_name()?)
8965 } else if self.parse_keywords(&[REPLAN, VIEW]) {
8966 Explainee::ReplanView(self.parse_raw_name()?)
8968 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
8969 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
8971 } else if self.parse_keywords(&[REPLAN, INDEX]) {
8972 Explainee::ReplanIndex(self.parse_raw_name()?)
8974 } else {
8975 let broken = self.parse_keyword(BROKEN);
8976
8977 if self.peek_keywords(&[CREATE, VIEW])
8978 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
8979 {
8980 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
8983 Statement::CreateView(stmt) => stmt,
8984 _ => panic!("Unexpected statement type return after parsing"),
8985 };
8986
8987 Explainee::CreateView(Box::new(stmt), broken)
8988 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
8989 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
8990 {
8991 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
8994 Statement::CreateMaterializedView(stmt) => stmt,
8995 _ => panic!("Unexpected statement type return after parsing"),
8996 };
8997
8998 Explainee::CreateMaterializedView(Box::new(stmt), broken)
8999 } else if self.peek_keywords(&[CREATE, INDEX])
9000 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9001 {
9002 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
9005 Statement::CreateIndex(stmt) => stmt,
9006 _ => panic!("Unexpected statement type return after parsing"),
9007 };
9008
9009 Explainee::CreateIndex(Box::new(stmt), broken)
9010 } else if self.peek_keyword(SUBSCRIBE) {
9011 let _ = self.parse_keyword(SUBSCRIBE); let stmt = match self.parse_subscribe()? {
9014 Statement::Subscribe(stmt) => stmt,
9015 _ => panic!("Unexpected statement type return after parsing"),
9016 };
9017 Explainee::Subscribe(Box::new(stmt), broken)
9018 } else {
9019 let query = self.parse_select_statement()?;
9021 Explainee::Select(Box::new(query), broken)
9022 }
9023 };
9024 Ok(explainee)
9025 }
9026
9027 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9030 let start = self.peek_pos();
9031 let (has_stage, stage) = match self.parse_one_of_keywords(&[
9032 RAW,
9033 DECORRELATED,
9034 LOCALLY,
9035 OPTIMIZED,
9036 PHYSICAL,
9037 OPTIMIZER,
9038 PLAN,
9039 ]) {
9040 Some(RAW) => {
9041 self.expect_keyword(PLAN)?;
9042 (true, Some(ExplainStage::RawPlan))
9043 }
9044 Some(DECORRELATED) => {
9045 self.expect_keyword(PLAN)?;
9046 (true, Some(ExplainStage::DecorrelatedPlan))
9047 }
9048 Some(LOCALLY) => {
9049 self.expect_keywords(&[OPTIMIZED, PLAN])?;
9050 (true, Some(ExplainStage::LocalPlan))
9051 }
9052 Some(OPTIMIZED) => {
9053 self.expect_keyword(PLAN)?;
9054 (true, Some(ExplainStage::GlobalPlan))
9055 }
9056 Some(PHYSICAL) => {
9057 self.expect_keyword(PLAN)?;
9058 (true, Some(ExplainStage::PhysicalPlan))
9059 }
9060 Some(OPTIMIZER) => {
9061 self.expect_keyword(TRACE)?;
9062 (true, Some(ExplainStage::Trace))
9063 }
9064 Some(PLAN) => {
9065 if self.parse_keyword(INSIGHTS) {
9066 (true, Some(ExplainStage::PlanInsights))
9067 } else {
9068 (true, None)
9070 }
9071 }
9072 None => {
9073 (false, None)
9075 }
9076 _ => unreachable!(),
9077 };
9078
9079 let with_options = if self.parse_keyword(WITH) {
9080 if self.consume_token(&Token::LParen) {
9081 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9082 self.expect_token(&Token::RParen)?;
9083 options
9084 } else {
9085 self.prev_token(); vec![]
9087 }
9088 } else {
9089 vec![]
9090 };
9091
9092 let format = if self.parse_keyword(AS) {
9093 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9094 Some(TEXT) => Some(ExplainFormat::Text),
9095 Some(JSON) => Some(ExplainFormat::Json),
9096 Some(DOT) => Some(ExplainFormat::Dot),
9097 Some(VERBOSE) => {
9098 self.expect_keyword(TEXT)?;
9099 Some(ExplainFormat::VerboseText)
9100 }
9101 None => return Err(ParserError::new(self.index, "expected a format")),
9102 _ => unreachable!(),
9103 }
9104 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9105 Some(ExplainFormat::VerboseText)
9107 } else {
9108 None
9109 };
9110
9111 if has_stage {
9112 self.expect_keyword(FOR)?;
9113 }
9114
9115 let explainee = self.parse_explainee()?;
9116
9117 if matches!((explainee.is_view(), &stage), (true, None)) {
9120 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9121 return Err(self.error(start, msg));
9122 }
9123
9124 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9125 stage,
9126 with_options,
9127 format,
9128 explainee,
9129 }))
9130 }
9131
9132 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9133 Ok(ExplainPlanOption {
9134 name: self.parse_explain_plan_option_name()?,
9135 value: self.parse_optional_option_value()?,
9136 })
9137 }
9138
9139 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9142 self.expect_keyword(FOR)?;
9143
9144 let explainee = self.parse_explainee()?;
9145
9146 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9147 explainee,
9148 }))
9149 }
9150
9151 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9152 if self.parse_keyword(CLUSTER) {
9154 let properties = self.parse_explain_analyze_computation_properties()?;
9155 let as_sql = self.parse_keywords(&[AS, SQL]);
9156 return Ok(Statement::ExplainAnalyzeCluster(
9157 ExplainAnalyzeClusterStatement { properties, as_sql },
9158 ));
9159 }
9160
9161 let properties = if self.parse_keyword(HINTS) {
9164 ExplainAnalyzeProperty::Hints
9165 } else {
9166 ExplainAnalyzeProperty::Computation(
9167 self.parse_explain_analyze_computation_properties()?,
9168 )
9169 };
9170
9171 self.expect_keyword(FOR)?;
9172
9173 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9174 INDEX => Explainee::Index(self.parse_raw_name()?),
9175 MATERIALIZED => {
9176 self.expect_keyword(VIEW)?;
9177 Explainee::MaterializedView(self.parse_raw_name()?)
9178 }
9179 _ => unreachable!(),
9180 };
9181
9182 let as_sql = self.parse_keywords(&[AS, SQL]);
9183
9184 Ok(Statement::ExplainAnalyzeObject(
9185 ExplainAnalyzeObjectStatement {
9186 properties,
9187 explainee,
9188 as_sql,
9189 },
9190 ))
9191 }
9192
9193 fn parse_explain_analyze_computation_properties(
9194 &mut self,
9195 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9196 let mut computation_properties = vec![CPU, MEMORY];
9197 let (kw, property) =
9198 self.parse_explain_analyze_computation_property(&computation_properties)?;
9199 let mut properties = vec![property];
9200 computation_properties.retain(|p| p != &kw);
9201
9202 while self.consume_token(&Token::Comma) {
9203 let (kw, property) =
9204 self.parse_explain_analyze_computation_property(&computation_properties)?;
9205 computation_properties.retain(|p| p != &kw);
9206 properties.push(property);
9207 }
9208
9209 let skew = self.parse_keywords(&[WITH, SKEW]);
9210
9211 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9212 }
9213
9214 fn parse_explain_analyze_computation_property(
9215 &mut self,
9216 properties: &[Keyword],
9217 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9218 if properties.is_empty() {
9219 return Err(ParserError::new(
9220 self.peek_pos(),
9221 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9222 ));
9223 }
9224
9225 match self.expect_one_of_keywords(properties)? {
9226 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9227 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9228 _ => unreachable!(),
9229 }
9230 }
9231
9232 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9235 let format = if self.parse_keyword(AS) {
9236 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9237 Some(TEXT) => Some(ExplainFormat::Text),
9238 Some(JSON) => Some(ExplainFormat::Json),
9239 None => return Err(ParserError::new(self.index, "expected a format")),
9240 _ => unreachable!(),
9241 }
9242 } else {
9243 None
9244 };
9245
9246 self.expect_keyword(FOR)?;
9247
9248 let query = self.parse_select_statement()?;
9249
9250 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9251 format,
9252 select: query,
9253 }))
9254 }
9255 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9258 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9259 KEY => ExplainSinkSchemaFor::Key,
9260 VALUE => ExplainSinkSchemaFor::Value,
9261 _ => unreachable!(),
9262 };
9263
9264 self.expect_keyword(SCHEMA)?;
9265
9266 let format = if self.parse_keyword(AS) {
9267 self.expect_keyword(JSON)?;
9269 Some(ExplainFormat::Json)
9270 } else {
9271 None
9272 };
9273
9274 self.expect_keywords(&[FOR, CREATE])?;
9275
9276 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9277 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9278 schema_for,
9279 format,
9280 statement,
9281 }))
9282 } else {
9283 unreachable!("only create sink can be returned here");
9284 }
9285 }
9286
9287 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9290 let name = self
9291 .parse_identifier()
9292 .map_parser_err(StatementKind::Declare)?;
9293 self.expect_keyword(CURSOR)
9294 .map_parser_err(StatementKind::Declare)?;
9295 if self.parse_keyword(WITH) {
9296 let err = parser_err!(
9297 self,
9298 self.peek_prev_pos(),
9299 format!("WITH HOLD is unsupported for cursors")
9300 )
9301 .map_parser_err(StatementKind::Declare);
9302 self.expect_keyword(HOLD)
9303 .map_parser_err(StatementKind::Declare)?;
9304 return err;
9305 }
9306 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9308 self.expect_keyword(FOR)
9309 .map_parser_err(StatementKind::Declare)?;
9310 let StatementParseResult { ast, sql } = self.parse_statement()?;
9311 Ok(Statement::Declare(DeclareStatement {
9312 name,
9313 stmt: Box::new(ast),
9314 sql: sql.to_string(),
9315 }))
9316 }
9317
9318 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9321 let name = self.parse_identifier()?;
9322 Ok(Statement::Close(CloseStatement { name }))
9323 }
9324
9325 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9328 let name = self
9329 .parse_identifier()
9330 .map_parser_err(StatementKind::Prepare)?;
9331 self.expect_keyword(AS)
9332 .map_parser_err(StatementKind::Prepare)?;
9333 let pos = self.peek_pos();
9334 let StatementParseResult { ast, sql } = self.parse_statement()?;
9336 if !matches!(
9337 ast,
9338 Statement::Select(_)
9339 | Statement::Insert(_)
9340 | Statement::Delete(_)
9341 | Statement::Update(_)
9342 | Statement::Fetch(_),
9343 ) {
9344 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9345 }
9346 Ok(Statement::Prepare(PrepareStatement {
9347 name,
9348 stmt: Box::new(ast),
9349 sql: sql.to_string(),
9350 }))
9351 }
9352
9353 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9356 let name = self.parse_identifier()?;
9357 let params = if self.consume_token(&Token::LParen) {
9358 let params = self.parse_comma_separated(Parser::parse_expr)?;
9359 self.expect_token(&Token::RParen)?;
9360 params
9361 } else {
9362 Vec::new()
9363 };
9364 Ok(Statement::Execute(ExecuteStatement { name, params }))
9365 }
9366
9367 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9370 let _ = self.parse_keyword(PREPARE);
9371 let name = if self.parse_keyword(ALL) {
9372 None
9373 } else {
9374 Some(self.parse_identifier()?)
9375 };
9376 Ok(Statement::Deallocate(DeallocateStatement { name }))
9377 }
9378
9379 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9382 let _ = self.parse_keyword(FORWARD);
9383 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9384 Some(FetchDirection::ForwardCount(count))
9385 } else if self.parse_keyword(ALL) {
9386 Some(FetchDirection::ForwardAll)
9387 } else {
9388 None
9389 };
9390 let _ = self.parse_keyword(FROM);
9391 let name = self.parse_identifier()?;
9392 let options = if self.parse_keyword(WITH) {
9393 self.expect_token(&Token::LParen)?;
9394 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9395 self.expect_token(&Token::RParen)?;
9396 options
9397 } else {
9398 vec![]
9399 };
9400 Ok(Statement::Fetch(FetchStatement {
9401 name,
9402 count,
9403 options,
9404 }))
9405 }
9406
9407 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9408 self.expect_keyword(TIMEOUT)?;
9409 Ok(FetchOption {
9410 name: FetchOptionName::Timeout,
9411 value: self.parse_optional_option_value()?,
9412 })
9413 }
9414
9415 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9418 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9419 Some(DEBUG) => NoticeSeverity::Debug,
9420 Some(INFO) => NoticeSeverity::Info,
9421 Some(LOG) => NoticeSeverity::Log,
9422 Some(NOTICE) => NoticeSeverity::Notice,
9423 Some(WARNING) => NoticeSeverity::Warning,
9424 Some(_) => unreachable!(),
9425 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9426 };
9427
9428 Ok(Statement::Raise(RaiseStatement { severity }))
9429 }
9430
9431 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9434 match self.parse_privilege_specification() {
9435 Some(privileges) => self
9436 .parse_grant_privilege(privileges)
9437 .map_parser_err(StatementKind::GrantPrivileges),
9438 None => self
9439 .parse_grant_role()
9440 .map_parser_err(StatementKind::GrantRole),
9441 }
9442 }
9443
9444 fn parse_grant_privilege(
9447 &mut self,
9448 privileges: PrivilegeSpecification,
9449 ) -> Result<Statement<Raw>, ParserError> {
9450 self.expect_keyword(ON)?;
9451 let target = self.expect_grant_target_specification("GRANT")?;
9452 self.expect_keyword(TO)?;
9453 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9454 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9455 privileges,
9456 target,
9457 roles,
9458 }))
9459 }
9460
9461 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9464 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9465 self.expect_keyword(TO)?;
9466 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9467 Ok(Statement::GrantRole(GrantRoleStatement {
9468 role_names,
9469 member_names,
9470 }))
9471 }
9472
9473 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9476 match self.parse_privilege_specification() {
9477 Some(privileges) => self
9478 .parse_revoke_privilege(privileges)
9479 .map_parser_err(StatementKind::RevokePrivileges),
9480 None => self
9481 .parse_revoke_role()
9482 .map_parser_err(StatementKind::RevokeRole),
9483 }
9484 }
9485
9486 fn parse_revoke_privilege(
9489 &mut self,
9490 privileges: PrivilegeSpecification,
9491 ) -> Result<Statement<Raw>, ParserError> {
9492 self.expect_keyword(ON)?;
9493 let target = self.expect_grant_target_specification("REVOKE")?;
9494 self.expect_keyword(FROM)?;
9495 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9496 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9497 privileges,
9498 target,
9499 roles,
9500 }))
9501 }
9502
9503 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9506 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9507 self.expect_keyword(FROM)?;
9508 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9509 Ok(Statement::RevokeRole(RevokeRoleStatement {
9510 role_names,
9511 member_names,
9512 }))
9513 }
9514
9515 fn expect_grant_target_specification(
9516 &mut self,
9517 statement_type: &str,
9518 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9519 if self.parse_keyword(SYSTEM) {
9520 return Ok(GrantTargetSpecification::System);
9521 }
9522
9523 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9524 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9525 let object_spec_inner = if self.parse_keyword(IN) {
9526 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9527 return parser_err!(
9528 self,
9529 self.peek_prev_pos(),
9530 format!("IN invalid for {object_type}S")
9531 );
9532 }
9533 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9534 DATABASE => GrantTargetSpecificationInner::All(
9535 GrantTargetAllSpecification::AllDatabases {
9536 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9537 },
9538 ),
9539 SCHEMA => {
9540 if object_type == ObjectType::Schema {
9541 self.prev_token();
9542 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9543 }
9544 GrantTargetSpecificationInner::All(
9545 GrantTargetAllSpecification::AllSchemas {
9546 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9547 },
9548 )
9549 }
9550 _ => unreachable!(),
9551 }
9552 } else {
9553 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9554 };
9555 (object_type, object_spec_inner)
9556 } else {
9557 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9558 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9559 names: self
9560 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9561 };
9562 (object_type, object_spec_inner)
9563 };
9564
9565 Ok(GrantTargetSpecification::Object {
9566 object_type,
9567 object_spec_inner,
9568 })
9569 }
9570
9571 fn expect_grant_revoke_object_type(
9574 &mut self,
9575 statement_type: &str,
9576 ) -> Result<ObjectType, ParserError> {
9577 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9579 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9580 }
9581
9582 fn expect_grant_revoke_plural_object_type(
9585 &mut self,
9586 statement_type: &str,
9587 ) -> Result<ObjectType, ParserError> {
9588 let object_type = self.expect_plural_object_type().map_err(|_| {
9589 self.expected::<_, ObjectType>(
9591 self.peek_pos(),
9592 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9593 self.peek_token(),
9594 )
9595 .unwrap_err()
9596 })?;
9597 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9598 Ok(object_type)
9599 }
9600
9601 fn expect_grant_revoke_object_type_inner(
9602 &self,
9603 statement_type: &str,
9604 object_type: ObjectType,
9605 ) -> Result<ObjectType, ParserError> {
9606 match object_type {
9607 ObjectType::View
9608 | ObjectType::MaterializedView
9609 | ObjectType::Source
9610 | ObjectType::ContinualTask => {
9611 parser_err!(
9612 self,
9613 self.peek_prev_pos(),
9614 format!(
9615 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9616 )
9617 )
9618 }
9619 ObjectType::Sink
9620 | ObjectType::Index
9621 | ObjectType::ClusterReplica
9622 | ObjectType::Role
9623 | ObjectType::Func
9624 | ObjectType::Subsource => {
9625 parser_err!(
9626 self,
9627 self.peek_prev_pos(),
9628 format!("Unsupported {statement_type} on {object_type}")
9629 )
9630 }
9631 ObjectType::Table
9632 | ObjectType::Type
9633 | ObjectType::Cluster
9634 | ObjectType::Secret
9635 | ObjectType::Connection
9636 | ObjectType::Database
9637 | ObjectType::Schema
9638 | ObjectType::NetworkPolicy => Ok(object_type),
9639 }
9640 }
9641
9642 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9644 Ok(
9645 match self.expect_one_of_keywords(&[
9646 TABLE,
9647 VIEW,
9648 MATERIALIZED,
9649 SOURCE,
9650 SINK,
9651 INDEX,
9652 TYPE,
9653 ROLE,
9654 USER,
9655 CLUSTER,
9656 SECRET,
9657 CONNECTION,
9658 DATABASE,
9659 SCHEMA,
9660 FUNCTION,
9661 CONTINUAL,
9662 NETWORK,
9663 ])? {
9664 TABLE => ObjectType::Table,
9665 VIEW => ObjectType::View,
9666 MATERIALIZED => {
9667 if let Err(e) = self.expect_keyword(VIEW) {
9668 self.prev_token();
9669 return Err(e);
9670 }
9671 ObjectType::MaterializedView
9672 }
9673 SOURCE => ObjectType::Source,
9674 SINK => ObjectType::Sink,
9675 INDEX => ObjectType::Index,
9676 TYPE => ObjectType::Type,
9677 ROLE | USER => ObjectType::Role,
9678 CLUSTER => {
9679 if self.parse_keyword(REPLICA) {
9680 ObjectType::ClusterReplica
9681 } else {
9682 ObjectType::Cluster
9683 }
9684 }
9685 SECRET => ObjectType::Secret,
9686 CONNECTION => ObjectType::Connection,
9687 DATABASE => ObjectType::Database,
9688 SCHEMA => ObjectType::Schema,
9689 FUNCTION => ObjectType::Func,
9690 CONTINUAL => {
9691 if let Err(e) = self.expect_keyword(TASK) {
9692 self.prev_token();
9693 return Err(e);
9694 }
9695 ObjectType::ContinualTask
9696 }
9697 NETWORK => {
9698 if let Err(e) = self.expect_keyword(POLICY) {
9699 self.prev_token();
9700 return Err(e);
9701 }
9702 ObjectType::NetworkPolicy
9703 }
9704 _ => unreachable!(),
9705 },
9706 )
9707 }
9708
9709 fn parse_object_type(&mut self) -> Option<ObjectType> {
9711 Some(
9712 match self.parse_one_of_keywords(&[
9713 TABLE,
9714 VIEW,
9715 MATERIALIZED,
9716 SOURCE,
9717 SINK,
9718 INDEX,
9719 TYPE,
9720 ROLE,
9721 USER,
9722 CLUSTER,
9723 SECRET,
9724 CONNECTION,
9725 DATABASE,
9726 SCHEMA,
9727 FUNCTION,
9728 ])? {
9729 TABLE => ObjectType::Table,
9730 VIEW => ObjectType::View,
9731 MATERIALIZED => {
9732 if self.parse_keyword(VIEW) {
9733 ObjectType::MaterializedView
9734 } else {
9735 self.prev_token();
9736 return None;
9737 }
9738 }
9739 SOURCE => ObjectType::Source,
9740 SINK => ObjectType::Sink,
9741 INDEX => ObjectType::Index,
9742 TYPE => ObjectType::Type,
9743 ROLE | USER => ObjectType::Role,
9744 CLUSTER => {
9745 if self.parse_keyword(REPLICA) {
9746 ObjectType::ClusterReplica
9747 } else {
9748 ObjectType::Cluster
9749 }
9750 }
9751 SECRET => ObjectType::Secret,
9752 CONNECTION => ObjectType::Connection,
9753 DATABASE => ObjectType::Database,
9754 SCHEMA => ObjectType::Schema,
9755 FUNCTION => ObjectType::Func,
9756 _ => unreachable!(),
9757 },
9758 )
9759 }
9760
9761 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
9763 Ok(
9764 match self.expect_one_of_keywords(&[
9765 TABLES,
9766 VIEWS,
9767 MATERIALIZED,
9768 SOURCES,
9769 SINKS,
9770 INDEXES,
9771 TYPES,
9772 ROLES,
9773 USERS,
9774 CLUSTER,
9775 CLUSTERS,
9776 SECRETS,
9777 CONNECTIONS,
9778 DATABASES,
9779 SCHEMAS,
9780 POLICIES,
9781 ])? {
9782 TABLES => ObjectType::Table,
9783 VIEWS => ObjectType::View,
9784 MATERIALIZED => {
9785 if let Err(e) = self.expect_keyword(VIEWS) {
9786 self.prev_token();
9787 return Err(e);
9788 }
9789 ObjectType::MaterializedView
9790 }
9791 SOURCES => ObjectType::Source,
9792 SINKS => ObjectType::Sink,
9793 INDEXES => ObjectType::Index,
9794 TYPES => ObjectType::Type,
9795 ROLES | USERS => ObjectType::Role,
9796 CLUSTER => {
9797 if let Err(e) = self.expect_keyword(REPLICAS) {
9798 self.prev_token();
9799 return Err(e);
9800 }
9801 ObjectType::ClusterReplica
9802 }
9803 CLUSTERS => ObjectType::Cluster,
9804 SECRETS => ObjectType::Secret,
9805 CONNECTIONS => ObjectType::Connection,
9806 DATABASES => ObjectType::Database,
9807 SCHEMAS => ObjectType::Schema,
9808 POLICIES => ObjectType::NetworkPolicy,
9809 _ => unreachable!(),
9810 },
9811 )
9812 }
9813
9814 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
9816 Some(
9817 match self.parse_one_of_keywords(&[
9818 TABLES,
9819 VIEWS,
9820 MATERIALIZED,
9821 SOURCES,
9822 SINKS,
9823 INDEXES,
9824 TYPES,
9825 ROLES,
9826 USERS,
9827 CLUSTER,
9828 CLUSTERS,
9829 SECRETS,
9830 CONNECTIONS,
9831 DATABASES,
9832 SCHEMAS,
9833 SUBSOURCES,
9834 CONTINUAL,
9835 NETWORK,
9836 ])? {
9837 TABLES => ObjectType::Table,
9838 VIEWS => ObjectType::View,
9839 MATERIALIZED => {
9840 if self.parse_keyword(VIEWS) {
9841 ObjectType::MaterializedView
9842 } else {
9843 self.prev_token();
9844 return None;
9845 }
9846 }
9847 SOURCES => ObjectType::Source,
9848 SINKS => ObjectType::Sink,
9849 INDEXES => ObjectType::Index,
9850 TYPES => ObjectType::Type,
9851 ROLES | USERS => ObjectType::Role,
9852 CLUSTER => {
9853 if self.parse_keyword(REPLICAS) {
9854 ObjectType::ClusterReplica
9855 } else {
9856 self.prev_token();
9857 return None;
9858 }
9859 }
9860 CLUSTERS => ObjectType::Cluster,
9861 SECRETS => ObjectType::Secret,
9862 CONNECTIONS => ObjectType::Connection,
9863 DATABASES => ObjectType::Database,
9864 SCHEMAS => ObjectType::Schema,
9865 SUBSOURCES => ObjectType::Subsource,
9866 CONTINUAL => {
9867 if self.parse_keyword(TASKS) {
9868 ObjectType::ContinualTask
9869 } else {
9870 self.prev_token();
9871 return None;
9872 }
9873 }
9874 NETWORK => {
9875 if self.parse_keyword(POLICIES) {
9876 ObjectType::NetworkPolicy
9877 } else {
9878 self.prev_token();
9879 return None;
9880 }
9881 }
9882 _ => unreachable!(),
9883 },
9884 )
9885 }
9886
9887 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
9890 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9891 return parser_err!(
9892 self,
9893 self.peek_prev_pos(),
9894 format!("For object type {object_type}, you must specify 'TABLES'")
9895 );
9896 }
9897 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9898 self.prev_token();
9899 return parser_err!(
9900 self,
9901 self.peek_prev_pos(),
9902 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9903 );
9904 }
9905
9906 Ok(
9907 match self.expect_one_of_keywords(&[
9908 TABLES,
9909 TYPES,
9910 CLUSTERS,
9911 SECRETS,
9912 CONNECTIONS,
9913 DATABASES,
9914 SCHEMAS,
9915 ])? {
9916 TABLES => ObjectType::Table,
9917 TYPES => ObjectType::Type,
9918 CLUSTERS => ObjectType::Cluster,
9919 SECRETS => ObjectType::Secret,
9920 CONNECTIONS => ObjectType::Connection,
9921 DATABASES => ObjectType::Database,
9922 SCHEMAS => ObjectType::Schema,
9923 _ => unreachable!(),
9924 },
9925 )
9926 }
9927
9928 fn expect_plural_system_object_type_for_privileges(
9931 &mut self,
9932 ) -> Result<SystemObjectType, ParserError> {
9933 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9934 return parser_err!(
9935 self,
9936 self.peek_prev_pos(),
9937 format!("For object type {object_type}, you must specify 'TABLES'")
9938 );
9939 }
9940 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9941 self.prev_token();
9942 return parser_err!(
9943 self,
9944 self.peek_prev_pos(),
9945 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9946 );
9947 }
9948
9949 Ok(
9950 match self.expect_one_of_keywords(&[
9951 SYSTEM,
9952 TABLES,
9953 TYPES,
9954 CLUSTERS,
9955 SECRETS,
9956 CONNECTIONS,
9957 DATABASES,
9958 SCHEMAS,
9959 ])? {
9960 SYSTEM => SystemObjectType::System,
9961 TABLES => SystemObjectType::Object(ObjectType::Table),
9962 TYPES => SystemObjectType::Object(ObjectType::Type),
9963 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
9964 SECRETS => SystemObjectType::Object(ObjectType::Secret),
9965 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
9966 DATABASES => SystemObjectType::Object(ObjectType::Database),
9967 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
9968 _ => unreachable!(),
9969 },
9970 )
9971 }
9972
9973 fn parse_privilege(&mut self) -> Option<Privilege> {
9975 Some(
9976 match self.parse_one_of_keywords(&[
9977 INSERT,
9978 SELECT,
9979 UPDATE,
9980 DELETE,
9981 USAGE,
9982 CREATE,
9983 CREATEROLE,
9984 CREATEDB,
9985 CREATECLUSTER,
9986 CREATENETWORKPOLICY,
9987 ])? {
9988 INSERT => Privilege::INSERT,
9989 SELECT => Privilege::SELECT,
9990 UPDATE => Privilege::UPDATE,
9991 DELETE => Privilege::DELETE,
9992 USAGE => Privilege::USAGE,
9993 CREATE => Privilege::CREATE,
9994 CREATEROLE => Privilege::CREATEROLE,
9995 CREATEDB => Privilege::CREATEDB,
9996 CREATECLUSTER => Privilege::CREATECLUSTER,
9997 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
9998 _ => unreachable!(),
9999 },
10000 )
10001 }
10002
10003 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10005 if self.parse_keyword(ALL) {
10006 let _ = self.parse_keyword(PRIVILEGES);
10007 return Some(PrivilegeSpecification::All);
10008 }
10009
10010 let mut privileges = Vec::new();
10011 while let Some(privilege) = self.parse_privilege() {
10012 privileges.push(privilege);
10013 if !self.consume_token(&Token::Comma) {
10014 break;
10015 }
10016 }
10017
10018 if privileges.is_empty() {
10019 None
10020 } else {
10021 Some(PrivilegeSpecification::Privileges(privileges))
10022 }
10023 }
10024
10025 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10027 let _ = self.parse_keyword(GROUP);
10028 self.parse_identifier()
10029 }
10030
10031 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10034 self.expect_keywords(&[OWNED, BY])?;
10035 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10036 self.expect_keyword(TO)?;
10037 let new_role = self.parse_identifier()?;
10038 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10039 old_roles,
10040 new_role,
10041 }))
10042 }
10043
10044 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10045 self.expect_keyword(ON)?;
10046
10047 let object = match self.expect_one_of_keywords(&[
10048 TABLE,
10049 VIEW,
10050 COLUMN,
10051 MATERIALIZED,
10052 SOURCE,
10053 SINK,
10054 INDEX,
10055 FUNCTION,
10056 CONNECTION,
10057 TYPE,
10058 SECRET,
10059 ROLE,
10060 DATABASE,
10061 SCHEMA,
10062 CLUSTER,
10063 CONTINUAL,
10064 NETWORK,
10065 ])? {
10066 TABLE => {
10067 let name = self.parse_raw_name()?;
10068 CommentObjectType::Table { name }
10069 }
10070 VIEW => {
10071 let name = self.parse_raw_name()?;
10072 CommentObjectType::View { name }
10073 }
10074 MATERIALIZED => {
10075 self.expect_keyword(VIEW)?;
10076 let name = self.parse_raw_name()?;
10077 CommentObjectType::MaterializedView { name }
10078 }
10079 SOURCE => {
10080 let name = self.parse_raw_name()?;
10081 CommentObjectType::Source { name }
10082 }
10083 SINK => {
10084 let name = self.parse_raw_name()?;
10085 CommentObjectType::Sink { name }
10086 }
10087 INDEX => {
10088 let name = self.parse_raw_name()?;
10089 CommentObjectType::Index { name }
10090 }
10091 FUNCTION => {
10092 let name = self.parse_raw_name()?;
10093 CommentObjectType::Func { name }
10094 }
10095 CONNECTION => {
10096 let name = self.parse_raw_name()?;
10097 CommentObjectType::Connection { name }
10098 }
10099 TYPE => {
10100 let ty = self.parse_data_type()?;
10101 CommentObjectType::Type { ty }
10102 }
10103 SECRET => {
10104 let name = self.parse_raw_name()?;
10105 CommentObjectType::Secret { name }
10106 }
10107 ROLE => {
10108 let name = self.parse_identifier()?;
10109 CommentObjectType::Role { name }
10110 }
10111 DATABASE => {
10112 let name = self.parse_database_name()?;
10113 CommentObjectType::Database { name }
10114 }
10115 SCHEMA => {
10116 let name = self.parse_schema_name()?;
10117 CommentObjectType::Schema { name }
10118 }
10119 CLUSTER => {
10120 if self.parse_keyword(REPLICA) {
10121 let name = self.parse_cluster_replica_name()?;
10122 CommentObjectType::ClusterReplica { name }
10123 } else {
10124 let name = self.parse_raw_ident()?;
10125 CommentObjectType::Cluster { name }
10126 }
10127 }
10128 COLUMN => {
10129 let name = self.parse_column_name()?;
10130 CommentObjectType::Column { name }
10131 }
10132 CONTINUAL => {
10133 self.expect_keyword(TASK)?;
10134 let name = self.parse_raw_name()?;
10135 CommentObjectType::ContinualTask { name }
10136 }
10137 NETWORK => {
10138 self.expect_keyword(POLICY)?;
10139 let name = self.parse_raw_network_policy_name()?;
10140 CommentObjectType::NetworkPolicy { name }
10141 }
10142 _ => unreachable!(),
10143 };
10144
10145 self.expect_keyword(IS)?;
10146 let comment = match self.next_token() {
10147 Some(Token::Keyword(NULL)) => None,
10148 Some(Token::String(s)) => Some(s),
10149 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10150 };
10151
10152 Ok(Statement::Comment(CommentStatement { object, comment }))
10153 }
10154
10155 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10156 where
10157 S: TryInto<IdentString>,
10158 <S as TryInto<IdentString>>::Error: fmt::Display,
10159 {
10160 Ident::new(s).map_err(|e| ParserError {
10161 pos: self.peek_prev_pos(),
10162 message: e.to_string(),
10163 })
10164 }
10165}
10166
10167impl CheckedRecursion for Parser<'_> {
10168 fn recursion_guard(&self) -> &RecursionGuard {
10169 &self.recursion_guard
10170 }
10171}
10172
10173enum ParenthesizedFragment {
10177 Query(Query<Raw>),
10178 Exprs(Vec<Expr<Raw>>),
10179}
10180
10181impl ParenthesizedFragment {
10182 fn into_expr(self) -> Expr<Raw> {
10184 match self {
10185 ParenthesizedFragment::Exprs(exprs) => {
10186 if exprs.len() == 1 {
10189 Expr::Nested(Box::new(exprs.into_element()))
10192 } else {
10193 Expr::Row { exprs }
10196 }
10197 }
10198 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10200 }
10201 }
10202}
10203
10204include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));