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