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