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