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 if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5161 return parser_err!(
5162 self,
5163 self.peek_prev_pos(),
5164 "temporary tables FROM SOURCE are not supported"
5165 );
5166 }
5167 self.expect_keyword(TABLE)?;
5168 let if_not_exists = self.parse_if_not_exists()?;
5169 let table_name = self.parse_item_name()?;
5170
5171 if self.parse_keywords(&[FROM, WEBHOOK]) {
5172 return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5174 }
5175
5176 let (columns, constraints) = self.parse_table_from_source_columns()?;
5177
5178 self.expect_keywords(&[FROM, SOURCE])?;
5179
5180 let source = self.parse_raw_name()?;
5181
5182 let external_reference = if self.consume_token(&Token::LParen) {
5183 self.expect_keyword(REFERENCE)?;
5184 let _ = self.consume_token(&Token::Eq);
5185 let external_reference = self.parse_item_name()?;
5186 self.expect_token(&Token::RParen)?;
5187 Some(external_reference)
5188 } else {
5189 None
5190 };
5191
5192 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5193 Some(KEY) => {
5194 self.expect_keyword(FORMAT)?;
5195 let key = self.parse_format()?;
5196 self.expect_keywords(&[VALUE, FORMAT])?;
5197 let value = self.parse_format()?;
5198 Some(FormatSpecifier::KeyValue { key, value })
5199 }
5200 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5201 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5202 None => None,
5203 };
5204 let include_metadata = self.parse_source_include_metadata()?;
5205
5206 let envelope = if self.parse_keyword(ENVELOPE) {
5207 Some(self.parse_source_envelope()?)
5208 } else {
5209 None
5210 };
5211
5212 let with_options = if self.parse_keyword(WITH) {
5213 self.expect_token(&Token::LParen)?;
5214 let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5215 self.expect_token(&Token::RParen)?;
5216 options
5217 } else {
5218 vec![]
5219 };
5220
5221 Ok(Statement::CreateTableFromSource(
5222 CreateTableFromSourceStatement {
5223 name: table_name,
5224 columns,
5225 constraints,
5226 if_not_exists,
5227 source,
5228 external_reference,
5229 format,
5230 include_metadata,
5231 envelope,
5232 with_options,
5233 },
5234 ))
5235 }
5236
5237 fn parse_table_from_source_option(
5238 &mut self,
5239 ) -> Result<TableFromSourceOption<Raw>, ParserError> {
5240 let option = match self
5241 .expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE, DETAILS, PARTITION, RETAIN])?
5242 {
5243 ref keyword @ (TEXT | EXCLUDE) => {
5244 self.expect_keyword(COLUMNS)?;
5245
5246 let _ = self.consume_token(&Token::Eq);
5247
5248 let value = self
5249 .parse_option_sequence(Parser::parse_identifier)?
5250 .map(|inner| {
5251 WithOptionValue::Sequence(
5252 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5253 )
5254 });
5255
5256 TableFromSourceOption {
5257 name: match *keyword {
5258 TEXT => TableFromSourceOptionName::TextColumns,
5259 EXCLUDE => TableFromSourceOptionName::ExcludeColumns,
5260 _ => unreachable!(),
5261 },
5262 value,
5263 }
5264 }
5265 DETAILS => TableFromSourceOption {
5266 name: TableFromSourceOptionName::Details,
5267 value: self.parse_optional_option_value()?,
5268 },
5269 IGNORE => {
5270 self.expect_keyword(COLUMNS)?;
5271 let _ = self.consume_token(&Token::Eq);
5272
5273 let value = self
5274 .parse_option_sequence(Parser::parse_identifier)?
5275 .map(|inner| {
5276 WithOptionValue::Sequence(
5277 inner.into_iter().map(WithOptionValue::Ident).collect_vec(),
5278 )
5279 });
5280 TableFromSourceOption {
5281 name: TableFromSourceOptionName::ExcludeColumns,
5283 value,
5284 }
5285 }
5286 PARTITION => {
5287 self.expect_keyword(BY)?;
5288 TableFromSourceOption {
5289 name: TableFromSourceOptionName::PartitionBy,
5290 value: self.parse_optional_option_value()?,
5291 }
5292 }
5293 RETAIN => {
5294 self.expect_keyword(HISTORY)?;
5295 TableFromSourceOption {
5296 name: TableFromSourceOptionName::RetainHistory,
5297 value: self.parse_option_retain_history()?,
5298 }
5299 }
5300 _ => unreachable!(),
5301 };
5302 Ok(option)
5303 }
5304
5305 fn parse_table_from_source_columns(
5306 &mut self,
5307 ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5308 let mut constraints = vec![];
5309
5310 if !self.consume_token(&Token::LParen) {
5311 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5312 }
5313 if self.consume_token(&Token::RParen) {
5314 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5316 }
5317
5318 let mut column_names = vec![];
5319 let mut column_defs = vec![];
5320 loop {
5321 if let Some(constraint) = self.parse_optional_table_constraint()? {
5322 constraints.push(constraint);
5323 } else if let Some(column_name) = self.consume_identifier()? {
5324 let next_token = self.peek_token();
5325 match next_token {
5326 Some(Token::Comma) | Some(Token::RParen) => {
5327 column_names.push(column_name);
5328 }
5329 _ => {
5330 let data_type = self.parse_data_type()?;
5331 let collation = if self.parse_keyword(COLLATE) {
5332 Some(self.parse_item_name()?)
5333 } else {
5334 None
5335 };
5336 let mut options = vec![];
5337 loop {
5338 match self.peek_token() {
5339 None | Some(Token::Comma) | Some(Token::RParen) => break,
5340 _ => options.push(self.parse_column_option_def()?),
5341 }
5342 }
5343
5344 column_defs.push(ColumnDef {
5345 name: column_name,
5346 data_type,
5347 collation,
5348 options,
5349 });
5350 }
5351 }
5352 } else {
5353 return self.expected(
5354 self.peek_pos(),
5355 "column name or constraint definition",
5356 self.peek_token(),
5357 );
5358 }
5359 if self.consume_token(&Token::Comma) {
5360 } else if self.consume_token(&Token::RParen) {
5362 break;
5363 } else {
5364 return self.expected(
5365 self.peek_pos(),
5366 "',' or ')' after column definition",
5367 self.peek_token(),
5368 );
5369 }
5370 }
5371 if !column_defs.is_empty() && !column_names.is_empty() {
5372 return parser_err!(
5373 self,
5374 self.peek_prev_pos(),
5375 "cannot mix column definitions and column names"
5376 );
5377 }
5378
5379 let columns = match column_defs.is_empty() {
5380 true => match column_names.is_empty() {
5381 true => TableFromSourceColumns::NotSpecified,
5382 false => TableFromSourceColumns::Named(column_names),
5383 },
5384 false => TableFromSourceColumns::Defined(column_defs),
5385 };
5386
5387 Ok((columns, constraints))
5388 }
5389
5390 fn parse_columns(
5391 &mut self,
5392 optional: IsOptional,
5393 ) -> Result<(Vec<ColumnDef<Raw>>, Vec<TableConstraint<Raw>>), ParserError> {
5394 let mut columns = vec![];
5395 let mut constraints = vec![];
5396
5397 if !self.consume_token(&Token::LParen) {
5398 if optional == Optional {
5399 return Ok((columns, constraints));
5400 } else {
5401 return self.expected(
5402 self.peek_pos(),
5403 "a list of columns in parentheses",
5404 self.peek_token(),
5405 );
5406 }
5407 }
5408 if self.consume_token(&Token::RParen) {
5409 return Ok((columns, constraints));
5411 }
5412
5413 loop {
5414 if let Some(constraint) = self.parse_optional_table_constraint()? {
5415 constraints.push(constraint);
5416 } else if let Some(column_name) = self.consume_identifier()? {
5417 let data_type = self.parse_data_type()?;
5418 let collation = if self.parse_keyword(COLLATE) {
5419 Some(self.parse_item_name()?)
5420 } else {
5421 None
5422 };
5423 let mut options = vec![];
5424 loop {
5425 match self.peek_token() {
5426 None | Some(Token::Comma) | Some(Token::RParen) => break,
5427 _ => options.push(self.parse_column_option_def()?),
5428 }
5429 }
5430
5431 columns.push(ColumnDef {
5432 name: column_name,
5433 data_type,
5434 collation,
5435 options,
5436 });
5437 } else {
5438 return self.expected(
5439 self.peek_pos(),
5440 "column name or constraint definition",
5441 self.peek_token(),
5442 );
5443 }
5444 if self.consume_token(&Token::Comma) {
5445 } else if self.consume_token(&Token::RParen) {
5447 break;
5448 } else {
5449 return self.expected(
5450 self.peek_pos(),
5451 "',' or ')' after column definition",
5452 self.peek_token(),
5453 );
5454 }
5455 }
5456
5457 Ok((columns, constraints))
5458 }
5459
5460 fn parse_column_option_def(&mut self) -> Result<ColumnOptionDef<Raw>, ParserError> {
5461 let name = if self.parse_keyword(CONSTRAINT) {
5462 Some(self.parse_identifier()?)
5463 } else {
5464 None
5465 };
5466
5467 let option = if self.parse_keywords(&[NOT, NULL]) {
5468 ColumnOption::NotNull
5469 } else if self.parse_keyword(NULL) {
5470 ColumnOption::Null
5471 } else if self.parse_keyword(DEFAULT) {
5472 ColumnOption::Default(self.parse_expr()?)
5473 } else if self.parse_keywords(&[PRIMARY, KEY]) {
5474 ColumnOption::Unique { is_primary: true }
5475 } else if self.parse_keyword(UNIQUE) {
5476 ColumnOption::Unique { is_primary: false }
5477 } else if self.parse_keyword(REFERENCES) {
5478 let foreign_table = self.parse_item_name()?;
5479 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5480 ColumnOption::ForeignKey {
5481 foreign_table,
5482 referred_columns,
5483 }
5484 } else if self.parse_keyword(CHECK) {
5485 self.expect_token(&Token::LParen)?;
5486 let expr = self.parse_expr()?;
5487 self.expect_token(&Token::RParen)?;
5488 ColumnOption::Check(expr)
5489 } else if self.parse_keyword(VERSION) {
5490 self.expect_keyword(ADDED)?;
5491 let action = ColumnVersioned::Added;
5492 let version = self.parse_version()?;
5493
5494 ColumnOption::Versioned { action, version }
5495 } else {
5496 return self.expected(self.peek_pos(), "column option", self.peek_token());
5497 };
5498
5499 Ok(ColumnOptionDef { name, option })
5500 }
5501
5502 fn parse_optional_table_constraint(
5503 &mut self,
5504 ) -> Result<Option<TableConstraint<Raw>>, ParserError> {
5505 let name = if self.parse_keyword(CONSTRAINT) {
5506 Some(self.parse_identifier()?)
5507 } else {
5508 None
5509 };
5510 match self.next_token() {
5511 Some(Token::Keyword(PRIMARY)) => {
5512 self.expect_keyword(KEY)?;
5513 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5514 Ok(Some(TableConstraint::Unique {
5515 name,
5516 columns,
5517 is_primary: true,
5518 nulls_not_distinct: false,
5519 }))
5520 }
5521 Some(Token::Keyword(UNIQUE)) => {
5522 let nulls_not_distinct = if self.parse_keyword(NULLS) {
5523 self.expect_keywords(&[NOT, DISTINCT])?;
5524 true
5525 } else {
5526 false
5527 };
5528
5529 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5530 Ok(Some(TableConstraint::Unique {
5531 name,
5532 columns,
5533 is_primary: false,
5534 nulls_not_distinct,
5535 }))
5536 }
5537 Some(Token::Keyword(FOREIGN)) => {
5538 self.expect_keyword(KEY)?;
5539 let columns = self.parse_parenthesized_column_list(Mandatory)?;
5540 self.expect_keyword(REFERENCES)?;
5541 let foreign_table = self.parse_raw_name()?;
5542 let referred_columns = self.parse_parenthesized_column_list(Mandatory)?;
5543 Ok(Some(TableConstraint::ForeignKey {
5544 name,
5545 columns,
5546 foreign_table,
5547 referred_columns,
5548 }))
5549 }
5550 Some(Token::Keyword(CHECK)) => {
5551 self.expect_token(&Token::LParen)?;
5552 let expr = Box::new(self.parse_expr()?);
5553 self.expect_token(&Token::RParen)?;
5554 Ok(Some(TableConstraint::Check { name, expr }))
5555 }
5556 unexpected => {
5557 if name.is_some() {
5558 self.expected(
5559 self.peek_prev_pos(),
5560 "PRIMARY, UNIQUE, FOREIGN, or CHECK",
5561 unexpected,
5562 )
5563 } else {
5564 self.prev_token();
5565 Ok(None)
5566 }
5567 }
5568 }
5569 }
5570
5571 fn parse_object_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5572 let _ = self.consume_token(&Token::Eq);
5573 Ok(WithOptionValue::Item(self.parse_raw_name()?))
5574 }
5575
5576 fn parse_optional_option_value(&mut self) -> Result<Option<WithOptionValue<Raw>>, ParserError> {
5577 match self.peek_token() {
5582 Some(Token::RParen) | Some(Token::Comma) | Some(Token::Semicolon) | None => Ok(None),
5583 _ => {
5584 let _ = self.consume_token(&Token::Eq);
5585 Ok(Some(self.parse_option_value()?))
5586 }
5587 }
5588 }
5589
5590 fn parse_option_sequence<T, F>(&mut self, f: F) -> Result<Option<Vec<T>>, ParserError>
5591 where
5592 F: FnMut(&mut Self) -> Result<T, ParserError>,
5593 {
5594 Ok(if self.consume_token(&Token::LParen) {
5595 let options = if self.consume_token(&Token::RParen) {
5596 vec![]
5597 } else {
5598 let options = self.parse_comma_separated(f)?;
5599 self.expect_token(&Token::RParen)?;
5600 options
5601 };
5602
5603 Some(options)
5604 } else if self.consume_token(&Token::LBracket) {
5605 let options = if self.consume_token(&Token::RBracket) {
5606 vec![]
5607 } else {
5608 let options = self.parse_comma_separated(f)?;
5609
5610 self.expect_token(&Token::RBracket)?;
5611 options
5612 };
5613
5614 Some(options)
5615 } else {
5616 None
5617 })
5618 }
5619
5620 fn parse_option_map(
5621 &mut self,
5622 ) -> Result<Option<BTreeMap<String, WithOptionValue<Raw>>>, ParserError> {
5623 Ok(if self.parse_keyword(MAP) {
5624 self.expect_token(&Token::LBracket)?;
5625 let mut map = BTreeMap::new();
5626 loop {
5627 if let Some(Token::RBracket) = self.peek_token() {
5628 break;
5629 }
5630 let key = match self.next_token() {
5631 Some(Token::String(s)) => s,
5632 token => return self.expected(self.peek_pos(), "string", token),
5633 };
5634 self.expect_token(&Token::Arrow)?;
5635 let value = Parser::parse_option_value(self)?;
5636 map.insert(key, value);
5637 if !self.consume_token(&Token::Comma) {
5638 break;
5639 }
5640 }
5641 self.expect_token(&Token::RBracket)?;
5642 Some(map)
5643 } else {
5644 None
5645 })
5646 }
5647
5648 fn parse_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5649 if let Some(seq) = self.parse_option_sequence(Parser::parse_option_value)? {
5650 Ok(WithOptionValue::Sequence(seq))
5651 } else if let Some(map) = self.parse_option_map()? {
5652 Ok(WithOptionValue::Map(map))
5653 } else if self.parse_keyword(SECRET) {
5654 if let Some(secret) = self.maybe_parse(Parser::parse_raw_name) {
5655 Ok(WithOptionValue::Secret(secret))
5656 } else {
5657 Ok(WithOptionValue::UnresolvedItemName(UnresolvedItemName(
5658 vec![ident!("secret")],
5659 )))
5660 }
5661 } else if let Some(value) = self.maybe_parse(Parser::parse_value) {
5662 Ok(WithOptionValue::Value(value))
5663 } else if let Some(item_name) = self.maybe_parse(Parser::parse_item_name) {
5664 Ok(WithOptionValue::UnresolvedItemName(item_name))
5665 } else {
5666 self.expected(self.peek_pos(), "option value", self.peek_token())
5667 }
5668 }
5669
5670 fn parse_data_type_option_value(&mut self) -> Result<WithOptionValue<Raw>, ParserError> {
5671 let _ = self.consume_token(&Token::Eq);
5672 Ok(WithOptionValue::DataType(self.parse_data_type()?))
5673 }
5674
5675 fn parse_alter(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5676 if self.parse_keyword(SYSTEM) {
5677 self.parse_alter_system()
5678 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
5679 self.parse_alter_default_privileges()
5680 .map_parser_err(StatementKind::AlterDefaultPrivileges)
5681 } else {
5682 self.parse_alter_object()
5683 }
5684 }
5685
5686 fn parse_alter_object(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5687 let object_type = self.expect_object_type().map_no_statement_parser_err()?;
5688
5689 match object_type {
5690 ObjectType::Role => self
5691 .parse_alter_role()
5692 .map_parser_err(StatementKind::AlterRole),
5693 ObjectType::Sink => self.parse_alter_sink(),
5694 ObjectType::Source => self.parse_alter_source(),
5695 ObjectType::Index => self.parse_alter_index(),
5696 ObjectType::Secret => self.parse_alter_secret(),
5697 ObjectType::Connection => self.parse_alter_connection(),
5698 ObjectType::View
5699 | ObjectType::MaterializedView
5700 | ObjectType::Table
5701 | ObjectType::ContinualTask => self.parse_alter_views(object_type),
5702 ObjectType::Type => {
5703 let if_exists = self
5704 .parse_if_exists()
5705 .map_parser_err(StatementKind::AlterOwner)?;
5706 let name = UnresolvedObjectName::Item(
5707 self.parse_item_name()
5708 .map_parser_err(StatementKind::AlterOwner)?,
5709 );
5710 self.expect_keywords(&[OWNER, TO])
5711 .map_parser_err(StatementKind::AlterOwner)?;
5712 let new_owner = self
5713 .parse_identifier()
5714 .map_parser_err(StatementKind::AlterOwner)?;
5715 Ok(Statement::AlterOwner(AlterOwnerStatement {
5716 object_type,
5717 if_exists,
5718 name,
5719 new_owner,
5720 }))
5721 }
5722 ObjectType::Cluster => self.parse_alter_cluster(object_type),
5723 ObjectType::ClusterReplica => {
5724 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5725 let name = UnresolvedObjectName::ClusterReplica(
5726 self.parse_cluster_replica_name()
5727 .map_no_statement_parser_err()?,
5728 );
5729 let action = self
5730 .expect_one_of_keywords(&[OWNER, RENAME])
5731 .map_no_statement_parser_err()?;
5732 self.expect_keyword(TO).map_no_statement_parser_err()?;
5733 match action {
5734 OWNER => {
5735 let new_owner = self
5736 .parse_identifier()
5737 .map_parser_err(StatementKind::AlterOwner)?;
5738 Ok(Statement::AlterOwner(AlterOwnerStatement {
5739 object_type,
5740 if_exists,
5741 name,
5742 new_owner,
5743 }))
5744 }
5745 RENAME => {
5746 let to_item_name = self
5747 .parse_identifier()
5748 .map_parser_err(StatementKind::AlterObjectRename)?;
5749 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5750 object_type,
5751 if_exists,
5752 name,
5753 to_item_name,
5754 }))
5755 }
5756 _ => unreachable!(),
5757 }
5758 }
5759 ObjectType::Database => {
5760 let if_exists = self
5761 .parse_if_exists()
5762 .map_parser_err(StatementKind::AlterOwner)?;
5763 let name = UnresolvedObjectName::Database(
5764 self.parse_database_name()
5765 .map_parser_err(StatementKind::AlterOwner)?,
5766 );
5767 self.expect_keywords(&[OWNER, TO])
5768 .map_parser_err(StatementKind::AlterOwner)?;
5769 let new_owner = self
5770 .parse_identifier()
5771 .map_parser_err(StatementKind::AlterOwner)?;
5772 Ok(Statement::AlterOwner(AlterOwnerStatement {
5773 object_type,
5774 if_exists,
5775 name,
5776 new_owner,
5777 }))
5778 }
5779 ObjectType::Schema => self.parse_alter_schema(object_type),
5780 ObjectType::NetworkPolicy => self
5781 .parse_alter_network_policy()
5782 .map_parser_err(StatementKind::AlterNetworkPolicy),
5783 ObjectType::Func | ObjectType::Subsource => parser_err!(
5784 self,
5785 self.peek_prev_pos(),
5786 format!("Unsupported ALTER on {object_type}")
5787 )
5788 .map_no_statement_parser_err(),
5789 }
5790 }
5791
5792 fn parse_alter_cluster(
5793 &mut self,
5794 object_type: ObjectType,
5795 ) -> Result<Statement<Raw>, ParserStatementError> {
5796 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5797 let name = self.parse_identifier().map_no_statement_parser_err()?;
5798 let action = self
5799 .expect_one_of_keywords(&[OWNER, RENAME, RESET, SET, SWAP])
5800 .map_no_statement_parser_err()?;
5801 match action {
5802 OWNER => {
5803 self.expect_keyword(TO)
5804 .map_parser_err(StatementKind::AlterOwner)?;
5805 let new_owner = self
5806 .parse_identifier()
5807 .map_parser_err(StatementKind::AlterOwner)?;
5808 let name = UnresolvedObjectName::Cluster(name);
5809 Ok(Statement::AlterOwner(AlterOwnerStatement {
5810 object_type,
5811 if_exists,
5812 name,
5813 new_owner,
5814 }))
5815 }
5816 RENAME => {
5817 self.expect_keyword(TO)
5818 .map_parser_err(StatementKind::AlterObjectRename)?;
5819 let to_item_name = self
5820 .parse_identifier()
5821 .map_parser_err(StatementKind::AlterObjectRename)?;
5822 let name = UnresolvedObjectName::Cluster(name);
5823 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
5824 object_type,
5825 if_exists,
5826 name,
5827 to_item_name,
5828 }))
5829 }
5830 RESET => {
5831 self.expect_token(&Token::LParen)
5832 .map_parser_err(StatementKind::AlterCluster)?;
5833 let names = self
5834 .parse_comma_separated(Parser::parse_cluster_option_name)
5835 .map_parser_err(StatementKind::AlterCluster)?;
5836 self.expect_token(&Token::RParen)
5837 .map_parser_err(StatementKind::AlterCluster)?;
5838 Ok(Statement::AlterCluster(AlterClusterStatement {
5839 if_exists,
5840 name,
5841 action: AlterClusterAction::ResetOptions(names),
5842 }))
5843 }
5844 SET => {
5845 self.expect_token(&Token::LParen)
5846 .map_parser_err(StatementKind::AlterCluster)?;
5847 let options = self
5848 .parse_comma_separated(Parser::parse_cluster_option)
5849 .map_parser_err(StatementKind::AlterCluster)?;
5850 self.expect_token(&Token::RParen)
5851 .map_parser_err(StatementKind::AlterCluster)?;
5852 let with_options = if self.parse_keyword(WITH) {
5853 self.expect_token(&Token::LParen)
5854 .map_parser_err(StatementKind::AlterCluster)?;
5855 let options = self
5856 .parse_comma_separated(Parser::parse_alter_cluster_option)
5857 .map_parser_err(StatementKind::AlterCluster)?;
5858 self.expect_token(&Token::RParen)
5859 .map_parser_err(StatementKind::AlterCluster)?;
5860 options
5861 } else {
5862 vec![]
5863 };
5864 Ok(Statement::AlterCluster(AlterClusterStatement {
5865 if_exists,
5866 name,
5867 action: AlterClusterAction::SetOptions {
5868 options,
5869 with_options,
5870 },
5871 }))
5872 }
5873 SWAP => {
5874 self.expect_keyword(WITH)
5875 .map_parser_err(StatementKind::AlterObjectSwap)?;
5876 let name_b = self
5877 .parse_identifier()
5878 .map_parser_err(StatementKind::AlterObjectSwap)?;
5879
5880 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
5881 object_type,
5882 if_exists,
5883 name_a: UnresolvedObjectName::Cluster(name),
5884 name_b,
5885 }))
5886 }
5887 _ => unreachable!(),
5888 }
5889 }
5890
5891 fn parse_alter_source(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
5892 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
5893 let source_name = self.parse_item_name().map_no_statement_parser_err()?;
5894
5895 Ok(
5896 match self
5897 .expect_one_of_keywords(&[ADD, DROP, RESET, SET, RENAME, OWNER, REFRESH])
5898 .map_no_statement_parser_err()?
5899 {
5900 ADD => {
5901 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5902 .map_parser_err(StatementKind::AlterSource)?;
5903
5904 let subsources = self
5906 .parse_comma_separated(Parser::parse_subsource_references)
5907 .map_parser_err(StatementKind::AlterSource)?;
5908
5909 let options = if self.parse_keyword(WITH) {
5910 self.expect_token(&Token::LParen)
5911 .map_parser_err(StatementKind::AlterSource)?;
5912 let options = self
5913 .parse_comma_separated(Parser::parse_alter_source_add_subsource_option)
5914 .map_parser_err(StatementKind::AlterSource)?;
5915 self.expect_token(&Token::RParen)
5916 .map_parser_err(StatementKind::AlterSource)?;
5917 options
5918 } else {
5919 vec![]
5920 };
5921
5922 Statement::AlterSource(AlterSourceStatement {
5923 source_name,
5924 if_exists,
5925 action: AlterSourceAction::AddSubsources {
5926 external_references: subsources,
5927 options,
5928 },
5929 })
5930 }
5931 DROP => {
5932 self.expect_one_of_keywords(&[SUBSOURCE, TABLE])
5933 .map_parser_err(StatementKind::AlterSource)?;
5934
5935 let if_exists_inner = self
5936 .parse_if_exists()
5937 .map_parser_err(StatementKind::AlterSource)?;
5938
5939 let names = self
5940 .parse_comma_separated(Parser::parse_item_name)
5941 .map_parser_err(StatementKind::AlterSource)?;
5942
5943 let cascade = matches!(
5944 self.parse_at_most_one_keyword(&[CASCADE, RESTRICT], "ALTER SOURCE...DROP")
5945 .map_parser_err(StatementKind::AlterSource)?,
5946 Some(CASCADE),
5947 );
5948
5949 Statement::AlterSource(AlterSourceStatement {
5950 source_name,
5951 if_exists,
5952 action: AlterSourceAction::DropSubsources {
5953 if_exists: if_exists_inner,
5954 cascade,
5955 names,
5956 },
5957 })
5958 }
5959 RESET => {
5960 self.expect_token(&Token::LParen)
5961 .map_parser_err(StatementKind::AlterSource)?;
5962 let reset_options = self
5963 .parse_comma_separated(Parser::parse_source_option_name)
5964 .map_parser_err(StatementKind::AlterSource)?;
5965 self.expect_token(&Token::RParen)
5966 .map_parser_err(StatementKind::AlterSource)?;
5967
5968 Statement::AlterSource(AlterSourceStatement {
5969 source_name,
5970 if_exists,
5971 action: AlterSourceAction::ResetOptions(reset_options),
5972 })
5973 }
5974 SET => {
5975 if let Some(stmt) = self.maybe_parse_alter_set_cluster(
5976 if_exists,
5977 &source_name,
5978 ObjectType::Source,
5979 ) {
5980 return stmt;
5981 }
5982 self.expect_token(&Token::LParen)
5983 .map_parser_err(StatementKind::AlterSource)?;
5984 let set_options = self
5985 .parse_comma_separated(Parser::parse_source_option)
5986 .map_parser_err(StatementKind::AlterSource)?;
5987 self.expect_token(&Token::RParen)
5988 .map_parser_err(StatementKind::AlterSource)?;
5989 Statement::AlterSource(AlterSourceStatement {
5990 source_name,
5991 if_exists,
5992 action: AlterSourceAction::SetOptions(set_options),
5993 })
5994 }
5995 RENAME => {
5996 self.expect_keyword(TO)
5997 .map_parser_err(StatementKind::AlterObjectRename)?;
5998 let to_item_name = self
5999 .parse_identifier()
6000 .map_parser_err(StatementKind::AlterObjectRename)?;
6001
6002 Statement::AlterObjectRename(AlterObjectRenameStatement {
6003 object_type: ObjectType::Source,
6004 if_exists,
6005 name: UnresolvedObjectName::Item(source_name),
6006 to_item_name,
6007 })
6008 }
6009 OWNER => {
6010 self.expect_keyword(TO)
6011 .map_parser_err(StatementKind::AlterOwner)?;
6012 let new_owner = self
6013 .parse_identifier()
6014 .map_parser_err(StatementKind::AlterOwner)?;
6015
6016 Statement::AlterOwner(AlterOwnerStatement {
6017 object_type: ObjectType::Source,
6018 if_exists,
6019 name: UnresolvedObjectName::Item(source_name),
6020 new_owner,
6021 })
6022 }
6023 REFRESH => {
6024 self.expect_keyword(REFERENCES)
6025 .map_parser_err(StatementKind::AlterSource)?;
6026 Statement::AlterSource(AlterSourceStatement {
6027 source_name,
6028 if_exists,
6029 action: AlterSourceAction::RefreshReferences,
6030 })
6031 }
6032 _ => unreachable!(),
6033 },
6034 )
6035 }
6036
6037 fn parse_alter_source_add_subsource_option(
6038 &mut self,
6039 ) -> Result<AlterSourceAddSubsourceOption<Raw>, ParserError> {
6040 match self.expect_one_of_keywords(&[TEXT, EXCLUDE, IGNORE])? {
6041 ref keyword @ (TEXT | EXCLUDE | IGNORE) => {
6042 self.expect_keyword(COLUMNS)?;
6043
6044 let _ = self.consume_token(&Token::Eq);
6045
6046 let value = self
6047 .parse_option_sequence(Parser::parse_item_name)?
6048 .map(|inner| {
6049 WithOptionValue::Sequence(
6050 inner
6051 .into_iter()
6052 .map(WithOptionValue::UnresolvedItemName)
6053 .collect_vec(),
6054 )
6055 });
6056
6057 Ok(AlterSourceAddSubsourceOption {
6058 name: match *keyword {
6059 TEXT => AlterSourceAddSubsourceOptionName::TextColumns,
6060 EXCLUDE | IGNORE => AlterSourceAddSubsourceOptionName::ExcludeColumns,
6062 _ => unreachable!(),
6063 },
6064 value,
6065 })
6066 }
6067 _ => unreachable!(),
6068 }
6069 }
6070
6071 fn parse_alter_index(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6072 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6073 let name = self.parse_item_name().map_no_statement_parser_err()?;
6074
6075 Ok(
6076 match self
6077 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6078 .map_no_statement_parser_err()?
6079 {
6080 RESET => {
6081 self.expect_token(&Token::LParen)
6082 .map_parser_err(StatementKind::AlterIndex)?;
6083 let reset_options = self
6084 .parse_comma_separated(Parser::parse_index_option_name)
6085 .map_parser_err(StatementKind::AlterIndex)?;
6086 self.expect_token(&Token::RParen)
6087 .map_parser_err(StatementKind::AlterIndex)?;
6088
6089 Statement::AlterIndex(AlterIndexStatement {
6090 index_name: name,
6091 if_exists,
6092 action: AlterIndexAction::ResetOptions(reset_options),
6093 })
6094 }
6095 SET => {
6096 self.expect_token(&Token::LParen)
6097 .map_parser_err(StatementKind::AlterIndex)?;
6098 let set_options = self
6099 .parse_comma_separated(Parser::parse_index_option)
6100 .map_parser_err(StatementKind::AlterIndex)?;
6101 self.expect_token(&Token::RParen)
6102 .map_parser_err(StatementKind::AlterIndex)?;
6103 Statement::AlterIndex(AlterIndexStatement {
6104 index_name: name,
6105 if_exists,
6106 action: AlterIndexAction::SetOptions(set_options),
6107 })
6108 }
6109 RENAME => {
6110 self.expect_keyword(TO)
6111 .map_parser_err(StatementKind::AlterObjectRename)?;
6112 let to_item_name = self
6113 .parse_identifier()
6114 .map_parser_err(StatementKind::AlterObjectRename)?;
6115
6116 Statement::AlterObjectRename(AlterObjectRenameStatement {
6117 object_type: ObjectType::Index,
6118 if_exists,
6119 name: UnresolvedObjectName::Item(name),
6120 to_item_name,
6121 })
6122 }
6123 OWNER => {
6124 self.expect_keyword(TO)
6125 .map_parser_err(StatementKind::AlterOwner)?;
6126 let new_owner = self
6127 .parse_identifier()
6128 .map_parser_err(StatementKind::AlterOwner)?;
6129
6130 Statement::AlterOwner(AlterOwnerStatement {
6131 object_type: ObjectType::Index,
6132 if_exists,
6133 name: UnresolvedObjectName::Item(name),
6134 new_owner,
6135 })
6136 }
6137 _ => unreachable!(),
6138 },
6139 )
6140 }
6141
6142 fn parse_alter_secret(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6143 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6144 let name = self.parse_item_name().map_no_statement_parser_err()?;
6145
6146 Ok(
6147 match self
6148 .expect_one_of_keywords(&[AS, RENAME, OWNER])
6149 .map_no_statement_parser_err()?
6150 {
6151 AS => {
6152 let value = self
6153 .parse_expr()
6154 .map_parser_err(StatementKind::AlterSecret)?;
6155 Statement::AlterSecret(AlterSecretStatement {
6156 name,
6157 if_exists,
6158 value,
6159 })
6160 }
6161 RENAME => {
6162 self.expect_keyword(TO)
6163 .map_parser_err(StatementKind::AlterObjectRename)?;
6164 let to_item_name = self
6165 .parse_identifier()
6166 .map_parser_err(StatementKind::AlterObjectRename)?;
6167
6168 Statement::AlterObjectRename(AlterObjectRenameStatement {
6169 object_type: ObjectType::Secret,
6170 if_exists,
6171 name: UnresolvedObjectName::Item(name),
6172 to_item_name,
6173 })
6174 }
6175 OWNER => {
6176 self.expect_keyword(TO)
6177 .map_parser_err(StatementKind::AlterOwner)?;
6178 let new_owner = self
6179 .parse_identifier()
6180 .map_parser_err(StatementKind::AlterOwner)?;
6181
6182 Statement::AlterOwner(AlterOwnerStatement {
6183 object_type: ObjectType::Secret,
6184 if_exists,
6185 name: UnresolvedObjectName::Item(name),
6186 new_owner,
6187 })
6188 }
6189 _ => unreachable!(),
6190 },
6191 )
6192 }
6193
6194 fn parse_alter_sink(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6196 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6197 let name = self.parse_item_name().map_no_statement_parser_err()?;
6198
6199 Ok(
6200 match self
6201 .expect_one_of_keywords(&[RESET, SET, RENAME, OWNER])
6202 .map_no_statement_parser_err()?
6203 {
6204 RESET => {
6205 self.expect_token(&Token::LParen)
6206 .map_parser_err(StatementKind::AlterSink)?;
6207 let reset_options = self
6208 .parse_comma_separated(Parser::parse_create_sink_option_name)
6209 .map_parser_err(StatementKind::AlterSink)?;
6210 self.expect_token(&Token::RParen)
6211 .map_parser_err(StatementKind::AlterSink)?;
6212
6213 Statement::AlterSink(AlterSinkStatement {
6214 sink_name: name,
6215 if_exists,
6216 action: AlterSinkAction::ResetOptions(reset_options),
6217 })
6218 }
6219 SET => {
6220 if let Some(result) =
6221 self.maybe_parse_alter_set_cluster(if_exists, &name, ObjectType::Sink)
6222 {
6223 return result;
6224 }
6225
6226 if self.parse_keyword(FROM) {
6227 let from = self
6228 .parse_raw_name()
6229 .map_parser_err(StatementKind::AlterSink)?;
6230
6231 Statement::AlterSink(AlterSinkStatement {
6232 sink_name: name,
6233 if_exists,
6234 action: AlterSinkAction::ChangeRelation(from),
6235 })
6236 } else {
6237 self.expect_token(&Token::LParen)
6238 .map_parser_err(StatementKind::AlterSink)?;
6239 let set_options = self
6240 .parse_comma_separated(Parser::parse_create_sink_option)
6241 .map_parser_err(StatementKind::AlterSink)?;
6242 self.expect_token(&Token::RParen)
6243 .map_parser_err(StatementKind::AlterSink)?;
6244 Statement::AlterSink(AlterSinkStatement {
6245 sink_name: name,
6246 if_exists,
6247 action: AlterSinkAction::SetOptions(set_options),
6248 })
6249 }
6250 }
6251 RENAME => {
6252 self.expect_keyword(TO)
6253 .map_parser_err(StatementKind::AlterObjectRename)?;
6254 let to_item_name = self
6255 .parse_identifier()
6256 .map_parser_err(StatementKind::AlterObjectRename)?;
6257
6258 Statement::AlterObjectRename(AlterObjectRenameStatement {
6259 object_type: ObjectType::Sink,
6260 if_exists,
6261 name: UnresolvedObjectName::Item(name),
6262 to_item_name,
6263 })
6264 }
6265 OWNER => {
6266 self.expect_keyword(TO)
6267 .map_parser_err(StatementKind::AlterOwner)?;
6268 let new_owner = self
6269 .parse_identifier()
6270 .map_parser_err(StatementKind::AlterOwner)?;
6271
6272 Statement::AlterOwner(AlterOwnerStatement {
6273 object_type: ObjectType::Sink,
6274 if_exists,
6275 name: UnresolvedObjectName::Item(name),
6276 new_owner,
6277 })
6278 }
6279 _ => unreachable!(),
6280 },
6281 )
6282 }
6283
6284 fn parse_alter_system(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6286 match self
6287 .expect_one_of_keywords(&[SET, RESET])
6288 .map_no_statement_parser_err()?
6289 {
6290 SET => {
6291 let name = self
6292 .parse_identifier()
6293 .map_parser_err(StatementKind::AlterSystemSet)?;
6294 self.expect_keyword_or_token(TO, &Token::Eq)
6295 .map_parser_err(StatementKind::AlterSystemSet)?;
6296 let to = self
6297 .parse_set_variable_to()
6298 .map_parser_err(StatementKind::AlterSystemSet)?;
6299 Ok(Statement::AlterSystemSet(AlterSystemSetStatement {
6300 name,
6301 to,
6302 }))
6303 }
6304 RESET => {
6305 if self.parse_keyword(ALL) {
6306 Ok(Statement::AlterSystemResetAll(
6307 AlterSystemResetAllStatement {},
6308 ))
6309 } else {
6310 let name = self
6311 .parse_identifier()
6312 .map_parser_err(StatementKind::AlterSystemReset)?;
6313 Ok(Statement::AlterSystemReset(AlterSystemResetStatement {
6314 name,
6315 }))
6316 }
6317 }
6318 _ => unreachable!(),
6319 }
6320 }
6321
6322 fn parse_alter_connection(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6323 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6324 let name = self.parse_item_name().map_no_statement_parser_err()?;
6325
6326 Ok(
6327 match self
6328 .expect_one_of_keywords(&[RENAME, OWNER, ROTATE, SET, RESET, DROP])
6329 .map_no_statement_parser_err()?
6330 {
6331 RENAME => {
6332 self.expect_keyword(TO)
6333 .map_parser_err(StatementKind::AlterObjectRename)?;
6334 let to_item_name = self
6335 .parse_identifier()
6336 .map_parser_err(StatementKind::AlterObjectRename)?;
6337
6338 Statement::AlterObjectRename(AlterObjectRenameStatement {
6339 object_type: ObjectType::Connection,
6340 if_exists,
6341 name: UnresolvedObjectName::Item(name),
6342 to_item_name,
6343 })
6344 }
6345 OWNER => {
6346 self.expect_keyword(TO)
6347 .map_parser_err(StatementKind::AlterOwner)?;
6348 let new_owner = self
6349 .parse_identifier()
6350 .map_parser_err(StatementKind::AlterOwner)?;
6351
6352 Statement::AlterOwner(AlterOwnerStatement {
6353 object_type: ObjectType::Connection,
6354 if_exists,
6355 name: UnresolvedObjectName::Item(name),
6356 new_owner,
6357 })
6358 }
6359 _ => {
6360 self.prev_token();
6361 let actions = self
6362 .parse_comma_separated(Parser::parse_alter_connection_action)
6363 .map_parser_err(StatementKind::AlterConnection)?;
6364
6365 let with_options = if self.parse_keyword(WITH) {
6366 self.expect_token(&Token::LParen)
6367 .map_parser_err(StatementKind::AlterConnection)?;
6368 let options = self
6369 .parse_comma_separated(Parser::parse_alter_connection_option)
6370 .map_parser_err(StatementKind::AlterConnection)?;
6371 self.expect_token(&Token::RParen)
6372 .map_parser_err(StatementKind::AlterConnection)?;
6373 options
6374 } else {
6375 vec![]
6376 };
6377
6378 Statement::AlterConnection(AlterConnectionStatement {
6379 name,
6380 if_exists,
6381 actions,
6382 with_options,
6383 })
6384 }
6385 },
6386 )
6387 }
6388
6389 fn parse_alter_connection_action(&mut self) -> Result<AlterConnectionAction<Raw>, ParserError> {
6390 let r = match self.expect_one_of_keywords(&[ROTATE, SET, RESET, DROP])? {
6391 ROTATE => {
6392 self.expect_keyword(KEYS)?;
6393 AlterConnectionAction::RotateKeys
6394 }
6395 SET => {
6396 self.expect_token(&Token::LParen)?;
6397 let option = self.parse_connection_option_unified()?;
6398 self.expect_token(&Token::RParen)?;
6399 AlterConnectionAction::SetOption(option)
6400 }
6401 DROP | RESET => {
6402 self.expect_token(&Token::LParen)?;
6403 let option = self.parse_connection_option_name()?;
6404 self.expect_token(&Token::RParen)?;
6405 AlterConnectionAction::DropOption(option)
6406 }
6407 _ => unreachable!(),
6408 };
6409
6410 Ok(r)
6411 }
6412
6413 fn parse_alter_connection_option(&mut self) -> Result<AlterConnectionOption<Raw>, ParserError> {
6415 let name = match self.expect_one_of_keywords(&[VALIDATE])? {
6416 VALIDATE => AlterConnectionOptionName::Validate,
6417 _ => unreachable!(),
6418 };
6419
6420 Ok(AlterConnectionOption {
6421 name,
6422 value: self.parse_optional_option_value()?,
6423 })
6424 }
6425
6426 fn parse_alter_role(&mut self) -> Result<Statement<Raw>, ParserError> {
6427 let name = self.parse_identifier()?;
6428
6429 let option = match self.parse_one_of_keywords(&[SET, RESET, WITH]) {
6430 Some(SET) => {
6431 let name = self.parse_identifier()?;
6432 self.expect_keyword_or_token(TO, &Token::Eq)?;
6433 let value = self.parse_set_variable_to()?;
6434 let var = SetRoleVar::Set { name, value };
6435 AlterRoleOption::Variable(var)
6436 }
6437 Some(RESET) => {
6438 let name = self.parse_identifier()?;
6439 let var = SetRoleVar::Reset { name };
6440 AlterRoleOption::Variable(var)
6441 }
6442 Some(WITH) | None => {
6443 let _ = self.parse_keyword(WITH);
6444 let attrs = self.parse_role_attributes()?;
6445 AlterRoleOption::Attributes(attrs)
6446 }
6447 Some(k) => unreachable!("unmatched keyword: {k}"),
6448 };
6449
6450 Ok(Statement::AlterRole(AlterRoleStatement { name, option }))
6451 }
6452
6453 fn parse_alter_default_privileges(&mut self) -> Result<Statement<Raw>, ParserError> {
6454 self.expect_keyword(FOR)?;
6455 let target_roles = match self.expect_one_of_keywords(&[ROLE, USER, ALL])? {
6456 ROLE | USER => TargetRoleSpecification::Roles(
6457 self.parse_comma_separated(Parser::parse_identifier)?,
6458 ),
6459 ALL => {
6460 self.expect_keyword(ROLES)?;
6461 TargetRoleSpecification::AllRoles
6462 }
6463 _ => unreachable!(),
6464 };
6465 let target_objects = if self.parse_keyword(IN) {
6466 match self.expect_one_of_keywords(&[SCHEMA, DATABASE])? {
6467 SCHEMA => GrantTargetAllSpecification::AllSchemas {
6468 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
6469 },
6470 DATABASE => GrantTargetAllSpecification::AllDatabases {
6471 databases: self.parse_comma_separated(Parser::parse_database_name)?,
6472 },
6473 _ => unreachable!(),
6474 }
6475 } else {
6476 GrantTargetAllSpecification::All
6477 };
6478 let is_grant = self.expect_one_of_keywords(&[GRANT, REVOKE])? == GRANT;
6479 let privileges = self.parse_privilege_specification().ok_or_else(|| {
6480 self.expected::<_, PrivilegeSpecification>(
6481 self.peek_pos(),
6482 "ALL or INSERT or SELECT or UPDATE or DELETE or USAGE or CREATE",
6483 self.peek_token(),
6484 )
6485 .expect_err("only returns errors")
6486 })?;
6487 self.expect_keyword(ON)?;
6488 let object_type =
6489 self.expect_grant_revoke_plural_object_type(if is_grant { "GRANT" } else { "REVOKE" })?;
6490 if is_grant {
6491 self.expect_keyword(TO)?;
6492 } else {
6493 self.expect_keyword(FROM)?;
6494 }
6495 let grantees = self.parse_comma_separated(Parser::expect_role_specification)?;
6496
6497 let grant_or_revoke = if is_grant {
6498 AbbreviatedGrantOrRevokeStatement::Grant(AbbreviatedGrantStatement {
6499 privileges,
6500 object_type,
6501 grantees,
6502 })
6503 } else {
6504 AbbreviatedGrantOrRevokeStatement::Revoke(AbbreviatedRevokeStatement {
6505 privileges,
6506 object_type,
6507 revokees: grantees,
6508 })
6509 };
6510
6511 Ok(Statement::AlterDefaultPrivileges(
6512 AlterDefaultPrivilegesStatement {
6513 target_roles,
6514 target_objects,
6515 grant_or_revoke,
6516 },
6517 ))
6518 }
6519
6520 fn parse_alter_views(
6521 &mut self,
6522 object_type: ObjectType,
6523 ) -> Result<Statement<Raw>, ParserStatementError> {
6524 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6525 let name = self.parse_item_name().map_no_statement_parser_err()?;
6526 let keywords: &[_] = match object_type {
6527 ObjectType::Table => &[SET, RENAME, OWNER, RESET, ADD],
6528 ObjectType::MaterializedView => &[SET, RENAME, OWNER, RESET, APPLY],
6529 ObjectType::View | ObjectType::ContinualTask => &[SET, RENAME, OWNER, RESET],
6530 ObjectType::Source
6531 | ObjectType::Sink
6532 | ObjectType::Index
6533 | ObjectType::Type
6534 | ObjectType::Role
6535 | ObjectType::Cluster
6536 | ObjectType::ClusterReplica
6537 | ObjectType::Secret
6538 | ObjectType::Connection
6539 | ObjectType::Database
6540 | ObjectType::Schema
6541 | ObjectType::Func
6542 | ObjectType::Subsource
6543 | ObjectType::NetworkPolicy => {
6544 unreachable!("parse_alter_views called with unsupported object type: {object_type}")
6545 }
6546 };
6547
6548 let action = self
6549 .expect_one_of_keywords(keywords)
6550 .map_no_statement_parser_err()?;
6551 match action {
6552 RENAME => {
6553 self.expect_keyword(TO).map_no_statement_parser_err()?;
6554 let to_item_name = self
6555 .parse_identifier()
6556 .map_parser_err(StatementKind::AlterObjectRename)?;
6557 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6558 object_type,
6559 if_exists,
6560 name: UnresolvedObjectName::Item(name),
6561 to_item_name,
6562 }))
6563 }
6564 SET => {
6565 if self.parse_keyword(CLUSTER) {
6566 self.parse_alter_set_cluster(if_exists, name, object_type)
6567 } else {
6568 self.expect_token(&Token::LParen)
6569 .map_no_statement_parser_err()?;
6570 self.expect_keywords(&[RETAIN, HISTORY])
6571 .map_parser_err(StatementKind::AlterRetainHistory)?;
6572 let history = self
6573 .parse_retain_history()
6574 .map_parser_err(StatementKind::AlterRetainHistory)?;
6575 self.expect_token(&Token::RParen)
6576 .map_parser_err(StatementKind::AlterCluster)?;
6577 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6578 object_type,
6579 if_exists,
6580 name: UnresolvedObjectName::Item(name),
6581 history: Some(history),
6582 }))
6583 }
6584 }
6585 RESET => {
6586 self.expect_token(&Token::LParen)
6587 .map_no_statement_parser_err()?;
6588 self.expect_keywords(&[RETAIN, HISTORY])
6589 .map_parser_err(StatementKind::AlterRetainHistory)?;
6590 self.expect_token(&Token::RParen)
6591 .map_no_statement_parser_err()?;
6592 Ok(Statement::AlterRetainHistory(AlterRetainHistoryStatement {
6593 object_type,
6594 if_exists,
6595 name: UnresolvedObjectName::Item(name),
6596 history: None,
6597 }))
6598 }
6599 OWNER => {
6600 self.expect_keyword(TO).map_no_statement_parser_err()?;
6601 let new_owner = self
6602 .parse_identifier()
6603 .map_parser_err(StatementKind::AlterOwner)?;
6604 Ok(Statement::AlterOwner(AlterOwnerStatement {
6605 object_type,
6606 if_exists,
6607 name: UnresolvedObjectName::Item(name),
6608 new_owner,
6609 }))
6610 }
6611 ADD => {
6612 assert_eq!(object_type, ObjectType::Table, "checked object_type above");
6613
6614 self.expect_keyword(COLUMN)
6615 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6616 let if_col_not_exist = self
6617 .parse_if_not_exists()
6618 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6619 let column_name = self
6620 .parse_identifier()
6621 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6622 let data_type = self
6623 .parse_data_type()
6624 .map_parser_err(StatementKind::AlterTableAddColumn)?;
6625
6626 Ok(Statement::AlterTableAddColumn(
6627 AlterTableAddColumnStatement {
6628 if_exists,
6629 name,
6630 if_col_not_exist,
6631 column_name,
6632 data_type,
6633 },
6634 ))
6635 }
6636 APPLY => {
6637 assert_eq!(
6638 object_type,
6639 ObjectType::MaterializedView,
6640 "checked object_type above",
6641 );
6642
6643 self.expect_keyword(REPLACEMENT)
6644 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6645
6646 let replacement_name = self
6647 .parse_item_name()
6648 .map_parser_err(StatementKind::AlterMaterializedViewApplyReplacement)?;
6649
6650 Ok(Statement::AlterMaterializedViewApplyReplacement(
6651 AlterMaterializedViewApplyReplacementStatement {
6652 if_exists,
6653 name,
6654 replacement_name,
6655 },
6656 ))
6657 }
6658 _ => unreachable!(),
6659 }
6660 }
6661
6662 fn parse_alter_schema(
6663 &mut self,
6664 object_type: ObjectType,
6665 ) -> Result<Statement<Raw>, ParserStatementError> {
6666 let if_exists = self.parse_if_exists().map_no_statement_parser_err()?;
6667 let name = self.parse_schema_name().map_no_statement_parser_err()?;
6668 let name = UnresolvedObjectName::Schema(name);
6669 let action = self
6670 .expect_one_of_keywords(&[OWNER, RENAME, SWAP])
6671 .map_no_statement_parser_err()?;
6672
6673 match action {
6674 OWNER => {
6675 self.expect_keyword(TO)
6676 .map_parser_err(StatementKind::AlterOwner)?;
6677 let new_owner = self
6678 .parse_identifier()
6679 .map_parser_err(StatementKind::AlterOwner)?;
6680
6681 Ok(Statement::AlterOwner(AlterOwnerStatement {
6682 object_type,
6683 if_exists,
6684 name,
6685 new_owner,
6686 }))
6687 }
6688 RENAME => {
6689 self.expect_keyword(TO)
6690 .map_parser_err(StatementKind::AlterObjectRename)?;
6691 let to_item_name = self
6692 .parse_identifier()
6693 .map_parser_err(StatementKind::AlterObjectRename)?;
6694
6695 Ok(Statement::AlterObjectRename(AlterObjectRenameStatement {
6696 object_type,
6697 if_exists,
6698 name,
6699 to_item_name,
6700 }))
6701 }
6702 SWAP => {
6703 self.expect_keyword(WITH)
6704 .map_parser_err(StatementKind::AlterObjectSwap)?;
6705 let name_b = self
6706 .parse_identifier()
6707 .map_parser_err(StatementKind::AlterObjectSwap)?;
6708
6709 Ok(Statement::AlterObjectSwap(AlterObjectSwapStatement {
6710 object_type,
6711 if_exists,
6712 name_a: name,
6713 name_b,
6714 }))
6715 }
6716 k => unreachable!("programming error, unmatched {k}"),
6717 }
6718 }
6719
6720 fn maybe_parse_alter_set_cluster(
6722 &mut self,
6723 if_exists: bool,
6724 name: &UnresolvedItemName,
6725 object_type: ObjectType,
6726 ) -> Option<Result<Statement<Raw>, ParserStatementError>> {
6727 if self.parse_keyword(CLUSTER) {
6728 Some(self.parse_alter_set_cluster(if_exists, name.clone(), object_type))
6729 } else {
6730 None
6731 }
6732 }
6733
6734 fn parse_alter_set_cluster(
6736 &mut self,
6737 if_exists: bool,
6738 name: UnresolvedItemName,
6739 object_type: ObjectType,
6740 ) -> Result<Statement<Raw>, ParserStatementError> {
6741 let set_cluster = self
6742 .parse_raw_ident()
6743 .map_parser_err(StatementKind::AlterSetCluster)?;
6744 Ok(Statement::AlterSetCluster(AlterSetClusterStatement {
6745 name,
6746 if_exists,
6747 set_cluster,
6748 object_type,
6749 }))
6750 }
6751
6752 fn parse_copy(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
6754 let maybe_into_pos = if self.parse_keyword(Keyword::Into) {
6756 Some(self.peek_prev_pos())
6757 } else {
6758 None
6759 };
6760
6761 let relation = if self.consume_token(&Token::LParen) {
6762 let query = self.parse_statement()?.ast;
6763 self.expect_token(&Token::RParen)
6764 .map_parser_err(StatementKind::Copy)?;
6765 match query {
6766 Statement::Select(stmt) => CopyRelation::Select(stmt),
6767 Statement::Subscribe(stmt) => CopyRelation::Subscribe(stmt),
6768 _ => {
6769 return parser_err!(self, self.peek_prev_pos(), "unsupported query in COPY")
6770 .map_parser_err(StatementKind::Copy);
6771 }
6772 }
6773 } else {
6774 let name = self.parse_raw_name().map_parser_err(StatementKind::Copy)?;
6775 let columns = self
6776 .parse_parenthesized_column_list(Optional)
6777 .map_parser_err(StatementKind::Copy)?;
6778 CopyRelation::Named { name, columns }
6779 };
6780 let (direction, target) = match self
6781 .expect_one_of_keywords(&[FROM, TO])
6782 .map_parser_err(StatementKind::Copy)?
6783 {
6784 FROM => {
6785 if let CopyRelation::Named { .. } = relation {
6786 } else {
6788 return parser_err!(
6789 self,
6790 self.peek_prev_pos(),
6791 "queries not allowed in COPY FROM"
6792 )
6793 .map_no_statement_parser_err();
6794 }
6795 if self.parse_keyword(STDIN) {
6796 (CopyDirection::From, CopyTarget::Stdin)
6797 } else {
6798 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6799 (CopyDirection::From, CopyTarget::Expr(url_expr))
6800 }
6801 }
6802 TO => {
6803 if let Some(into_pos) = maybe_into_pos {
6805 return self
6806 .expected(into_pos, "identifier", Some(Token::Keyword(Keyword::Into)))
6807 .map_parser_err(StatementKind::Copy);
6808 }
6809
6810 if self.parse_keyword(STDOUT) {
6811 (CopyDirection::To, CopyTarget::Stdout)
6812 } else {
6813 let url_expr = self.parse_expr().map_parser_err(StatementKind::Copy)?;
6814 (CopyDirection::To, CopyTarget::Expr(url_expr))
6815 }
6816 }
6817 _ => unreachable!(),
6818 };
6819 let has_options = if self.parse_keyword(WITH) {
6823 self.expect_token(&Token::LParen)
6824 .map_parser_err(StatementKind::Copy)?;
6825 true
6826 } else {
6827 self.consume_token(&Token::LParen)
6828 };
6829 let options = if has_options {
6830 let o = self
6831 .parse_comma_separated(Parser::parse_copy_option)
6832 .map_parser_err(StatementKind::Copy)?;
6833 self.expect_token(&Token::RParen)
6834 .map_parser_err(StatementKind::Copy)?;
6835 o
6836 } else {
6837 vec![]
6838 };
6839 Ok(Statement::Copy(CopyStatement {
6840 relation,
6841 direction,
6842 target,
6843 options,
6844 }))
6845 }
6846
6847 fn parse_copy_option(&mut self) -> Result<CopyOption<Raw>, ParserError> {
6848 let name = match self.expect_one_of_keywords(&[
6849 FORMAT, DELIMITER, NULL, ESCAPE, QUOTE, HEADER, AWS, MAX, FILES, PATTERN,
6850 ])? {
6851 FORMAT => CopyOptionName::Format,
6852 DELIMITER => CopyOptionName::Delimiter,
6853 NULL => CopyOptionName::Null,
6854 ESCAPE => CopyOptionName::Escape,
6855 QUOTE => CopyOptionName::Quote,
6856 HEADER => CopyOptionName::Header,
6857 AWS => {
6858 self.expect_keyword(CONNECTION)?;
6859 return Ok(CopyOption {
6860 name: CopyOptionName::AwsConnection,
6861 value: Some(self.parse_object_option_value()?),
6862 });
6863 }
6864 MAX => {
6865 self.expect_keywords(&[FILE, SIZE])?;
6866 CopyOptionName::MaxFileSize
6867 }
6868 FILES => CopyOptionName::Files,
6869 PATTERN => CopyOptionName::Pattern,
6870 _ => unreachable!(),
6871 };
6872 Ok(CopyOption {
6873 name,
6874 value: self.parse_optional_option_value()?,
6875 })
6876 }
6877
6878 fn parse_value(&mut self) -> Result<Value, ParserError> {
6880 match self.next_token() {
6881 Some(t) => match t {
6882 Token::Keyword(TRUE) => Ok(Value::Boolean(true)),
6883 Token::Keyword(FALSE) => Ok(Value::Boolean(false)),
6884 Token::Keyword(NULL) => Ok(Value::Null),
6885 Token::Keyword(INTERVAL) => Ok(Value::Interval(self.parse_interval_value()?)),
6886 Token::Keyword(kw) => {
6887 parser_err!(
6888 self,
6889 self.peek_prev_pos(),
6890 format!("No value parser for keyword {}", kw)
6891 )
6892 }
6893 Token::Op(ref op) if op == "-" => match self.next_token() {
6894 Some(Token::Number(n)) => Ok(Value::Number(format!("-{}", n))),
6895 other => self.expected(self.peek_prev_pos(), "literal int", other),
6896 },
6897 Token::Number(ref n) => Ok(Value::Number(n.to_string())),
6898 Token::String(ref s) => Ok(Value::String(s.to_string())),
6899 Token::HexString(ref s) => Ok(Value::HexString(s.to_string())),
6900 _ => parser_err!(
6901 self,
6902 self.peek_prev_pos(),
6903 format!("Unsupported value: {:?}", t)
6904 ),
6905 },
6906 None => parser_err!(
6907 self,
6908 self.peek_prev_pos(),
6909 "Expecting a value, but found EOF"
6910 ),
6911 }
6912 }
6913
6914 fn parse_array(&mut self) -> Result<Expr<Raw>, ParserError> {
6915 if self.consume_token(&Token::LParen) {
6916 let subquery = self.parse_query()?;
6917 self.expect_token(&Token::RParen)?;
6918 Ok(Expr::ArraySubquery(Box::new(subquery)))
6919 } else {
6920 self.parse_sequence(Self::parse_array).map(Expr::Array)
6921 }
6922 }
6923
6924 fn parse_list(&mut self) -> Result<Expr<Raw>, ParserError> {
6925 if self.consume_token(&Token::LParen) {
6926 let subquery = self.parse_query()?;
6927 self.expect_token(&Token::RParen)?;
6928 Ok(Expr::ListSubquery(Box::new(subquery)))
6929 } else {
6930 self.parse_sequence(Self::parse_list).map(Expr::List)
6931 }
6932 }
6933
6934 fn parse_map(&mut self) -> Result<Expr<Raw>, ParserError> {
6935 if self.consume_token(&Token::LParen) {
6936 let subquery = self.parse_query()?;
6937 self.expect_token(&Token::RParen)?;
6938 return Ok(Expr::MapSubquery(Box::new(subquery)));
6939 }
6940
6941 self.expect_token(&Token::LBracket)?;
6942 let mut exprs = vec![];
6943 loop {
6944 if let Some(Token::RBracket) = self.peek_token() {
6945 break;
6946 }
6947 let key = self.parse_expr()?;
6948 self.expect_token(&Token::Arrow)?;
6949 let value = if let Some(Token::LBracket) = self.peek_token() {
6950 self.parse_map()?
6951 } else {
6952 self.parse_expr()?
6953 };
6954 exprs.push(MapEntry { key, value });
6955 if !self.consume_token(&Token::Comma) {
6956 break;
6957 }
6958 }
6959 self.expect_token(&Token::RBracket)?;
6960 Ok(Expr::Map(exprs))
6961 }
6962
6963 fn parse_sequence<F>(&mut self, mut f: F) -> Result<Vec<Expr<Raw>>, ParserError>
6964 where
6965 F: FnMut(&mut Self) -> Result<Expr<Raw>, ParserError>,
6966 {
6967 self.expect_token(&Token::LBracket)?;
6968 let mut exprs = vec![];
6969 loop {
6970 if let Some(Token::RBracket) = self.peek_token() {
6971 break;
6972 }
6973 let expr = if let Some(Token::LBracket) = self.peek_token() {
6974 f(self)?
6975 } else {
6976 self.parse_expr()?
6977 };
6978 exprs.push(expr);
6979 if !self.consume_token(&Token::Comma) {
6980 break;
6981 }
6982 }
6983 self.expect_token(&Token::RBracket)?;
6984 Ok(exprs)
6985 }
6986
6987 fn parse_number_value(&mut self) -> Result<Value, ParserError> {
6988 match self.parse_value()? {
6989 v @ Value::Number(_) => Ok(v),
6990 _ => {
6991 self.prev_token();
6992 self.expected(self.peek_pos(), "literal number", self.peek_token())
6993 }
6994 }
6995 }
6996
6997 fn parse_version(&mut self) -> Result<Version, ParserError> {
6998 let version = self.parse_literal_uint()?;
6999 Ok(Version(version))
7000 }
7001
7002 fn parse_literal_int(&mut self) -> Result<i64, ParserError> {
7004 let negative = self.consume_token(&Token::Op("-".into()));
7005 match self.next_token() {
7006 Some(Token::Number(s)) => {
7007 let n = s.parse::<i64>().map_err(|e| {
7008 self.error(
7009 self.peek_prev_pos(),
7010 format!("Could not parse '{}' as i64: {}", s, e),
7011 )
7012 })?;
7013 if negative {
7014 n.checked_neg().ok_or_else(|| {
7015 self.error(
7016 self.peek_prev_pos(),
7017 format!("Could not parse '{}' as i64: overflows i64", s),
7018 )
7019 })
7020 } else {
7021 Ok(n)
7022 }
7023 }
7024 other => self.expected(self.peek_prev_pos(), "literal integer", other),
7025 }
7026 }
7027
7028 fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
7030 match self.next_token() {
7031 Some(Token::Number(s)) => s.parse::<u64>().map_err(|e| {
7032 self.error(
7033 self.peek_prev_pos(),
7034 format!("Could not parse '{}' as u64: {}", s, e),
7035 )
7036 }),
7037 other => self.expected(self.peek_prev_pos(), "literal unsigned integer", other),
7038 }
7039 }
7040
7041 fn parse_literal_string(&mut self) -> Result<String, ParserError> {
7043 match self.next_token() {
7044 Some(Token::String(ref s)) => Ok(s.clone()),
7045 other => self.expected(self.peek_prev_pos(), "literal string", other),
7046 }
7047 }
7048
7049 fn parse_data_type(&mut self) -> Result<RawDataType, ParserError> {
7051 let other = |ident| RawDataType::Other {
7052 name: RawItemName::Name(UnresolvedItemName::unqualified(ident)),
7053 typ_mod: vec![],
7054 };
7055
7056 let mut data_type = match self.next_token() {
7057 Some(Token::Keyword(kw)) => match kw {
7058 CHAR | CHARACTER => {
7060 let name = if self.parse_keyword(VARYING) {
7061 ident!("varchar")
7062 } else {
7063 ident!("bpchar")
7064 };
7065 RawDataType::Other {
7066 name: RawItemName::Name(UnresolvedItemName::unqualified(name)),
7067 typ_mod: self.parse_typ_mod()?,
7068 }
7069 }
7070 BPCHAR => RawDataType::Other {
7071 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("bpchar"))),
7072 typ_mod: self.parse_typ_mod()?,
7073 },
7074 VARCHAR => RawDataType::Other {
7075 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("varchar"))),
7076 typ_mod: self.parse_typ_mod()?,
7077 },
7078 STRING => other(ident!("text")),
7079
7080 BIGINT => other(ident!("int8")),
7082 SMALLINT => other(ident!("int2")),
7083 DEC | DECIMAL => RawDataType::Other {
7084 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!("numeric"))),
7085 typ_mod: self.parse_typ_mod()?,
7086 },
7087 DOUBLE => {
7088 let _ = self.parse_keyword(PRECISION);
7089 other(ident!("float8"))
7090 }
7091 FLOAT => match self.parse_optional_precision()?.unwrap_or(53) {
7092 v if v == 0 || v > 53 => {
7093 return Err(self.error(
7094 self.peek_prev_pos(),
7095 "precision for type float must be within ([1-53])".into(),
7096 ));
7097 }
7098 v if v < 25 => other(ident!("float4")),
7099 _ => other(ident!("float8")),
7100 },
7101 INT | INTEGER => other(ident!("int4")),
7102 REAL => other(ident!("float4")),
7103
7104 TIME => {
7106 if self.parse_keyword(WITH) {
7107 self.expect_keywords(&[TIME, ZONE])?;
7108 other(ident!("timetz"))
7109 } else {
7110 if self.parse_keyword(WITHOUT) {
7111 self.expect_keywords(&[TIME, ZONE])?;
7112 }
7113 other(ident!("time"))
7114 }
7115 }
7116 TIMESTAMP => {
7117 let typ_mod = self.parse_timestamp_precision()?;
7118 if self.parse_keyword(WITH) {
7119 self.expect_keywords(&[TIME, ZONE])?;
7120 RawDataType::Other {
7121 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7122 "timestamptz"
7123 ))),
7124 typ_mod,
7125 }
7126 } else {
7127 if self.parse_keyword(WITHOUT) {
7128 self.expect_keywords(&[TIME, ZONE])?;
7129 }
7130 RawDataType::Other {
7131 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7132 "timestamp"
7133 ))),
7134 typ_mod,
7135 }
7136 }
7137 }
7138 TIMESTAMPTZ => {
7139 let typ_mod = self.parse_timestamp_precision()?;
7140 RawDataType::Other {
7141 name: RawItemName::Name(UnresolvedItemName::unqualified(ident!(
7142 "timestamptz"
7143 ))),
7144 typ_mod,
7145 }
7146 }
7147
7148 MAP => {
7150 return self.parse_map_type();
7151 }
7152
7153 BOOLEAN => other(ident!("bool")),
7155 BYTES => other(ident!("bytea")),
7156 JSON => other(ident!("jsonb")),
7157
7158 kw if kw.is_sometimes_reserved() => {
7161 return self.expected(
7162 self.peek_prev_pos(),
7163 "a data type name",
7164 Some(Token::Keyword(kw)),
7165 );
7166 }
7167 _ => {
7168 self.prev_token();
7169 RawDataType::Other {
7170 name: RawItemName::Name(self.parse_item_name()?),
7171 typ_mod: self.parse_typ_mod()?,
7172 }
7173 }
7174 },
7175 Some(Token::Ident(_) | Token::LBracket) => {
7176 self.prev_token();
7177 RawDataType::Other {
7178 name: self.parse_raw_name()?,
7179 typ_mod: self.parse_typ_mod()?,
7180 }
7181 }
7182 other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7183 };
7184
7185 loop {
7186 match self.peek_token() {
7187 Some(Token::Keyword(LIST)) => {
7188 self.next_token();
7189 data_type = RawDataType::List(Box::new(data_type));
7190 }
7191 Some(Token::LBracket) => {
7192 self.next_token();
7195 let _ = self.maybe_parse(|parser| parser.parse_number_value());
7196 self.expect_token(&Token::RBracket)?;
7197 if !matches!(data_type, RawDataType::Array(_)) {
7198 data_type = RawDataType::Array(Box::new(data_type));
7199 }
7200 }
7201 _ => break,
7202 }
7203 }
7204 Ok(data_type)
7205 }
7206
7207 fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7208 if self.consume_token(&Token::LParen) {
7209 let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7210 self.expect_token(&Token::RParen)?;
7211 Ok(typ_mod)
7212 } else {
7213 Ok(vec![])
7214 }
7215 }
7216
7217 fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7219 if self.consume_token(&Token::LParen) {
7220 let typ_mod = self.parse_literal_int()?;
7221 self.expect_token(&Token::RParen)?;
7222 Ok(vec![typ_mod])
7223 } else {
7224 Ok(vec![])
7225 }
7226 }
7227
7228 fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7232 where
7233 F: FnOnce(Keyword) -> bool,
7234 {
7235 let after_as = self.parse_keyword(AS);
7236 match self.next_token() {
7237 Some(Token::Keyword(OF)) => {
7240 self.prev_token();
7241 if after_as {
7242 self.prev_token();
7243 }
7244 Ok(None)
7245 }
7246 Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7252 Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7253 not_an_ident => {
7254 if after_as {
7255 return self.expected(
7256 self.peek_prev_pos(),
7257 "an identifier after AS",
7258 not_an_ident,
7259 );
7260 }
7261 self.prev_token();
7262 Ok(None) }
7264 }
7265 }
7266
7267 fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7272 match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7273 Some(name) => {
7274 let columns = self.parse_parenthesized_column_list(Optional)?;
7275 Ok(Some(TableAlias {
7276 name,
7277 columns,
7278 strict: false,
7279 }))
7280 }
7281 None => Ok(None),
7282 }
7283 }
7284
7285 fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7286 Ok(match self.parse_raw_name()? {
7287 named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7288 RawItemName::Name(name) => DeferredItemName::Deferred(name),
7289 })
7290 }
7291
7292 fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7293 if self.consume_token(&Token::LBracket) {
7294 let id = match self.next_token() {
7295 Some(Token::Ident(id)) => id.into_inner(),
7296 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7297 };
7298 self.expect_keyword(AS)?;
7299 let name = self.parse_item_name()?;
7300 if name.0.len() < 2 {
7302 return parser_err!(
7303 self,
7304 self.peek_prev_pos(),
7305 "table name in square brackets must be fully qualified"
7306 );
7307 }
7308
7309 let version = if self.parse_keywords(&[VERSION]) {
7310 let version = self.parse_version()?;
7311 Some(version)
7312 } else {
7313 None
7314 };
7315
7316 self.expect_token(&Token::RBracket)?;
7317 Ok(RawItemName::Id(id, name, version))
7318 } else {
7319 Ok(RawItemName::Name(self.parse_item_name()?))
7320 }
7321 }
7322
7323 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7324 let start = self.peek_pos();
7325 let mut item_name = self.parse_raw_name()?;
7326 let column_name = match &mut item_name {
7327 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7328 if identifiers.len() < 2 {
7329 return Err(ParserError::new(
7330 start,
7331 "need to specify an object and a column",
7332 ));
7333 }
7334 identifiers.pop().unwrap()
7335 }
7336 RawItemName::Id(_, _, _) => {
7337 self.expect_token(&Token::Dot)?;
7338 self.parse_identifier()?
7339 }
7340 };
7341
7342 Ok(ColumnName {
7343 relation: item_name,
7344 column: column_name,
7345 })
7346 }
7347
7348 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7351 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7352 }
7353
7354 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7357 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7358 }
7359
7360 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7363 Ok(UnresolvedItemName(self.parse_identifiers()?))
7364 }
7365
7366 fn parse_object_name(
7368 &mut self,
7369 object_type: ObjectType,
7370 ) -> Result<UnresolvedObjectName, ParserError> {
7371 Ok(match object_type {
7372 ObjectType::Table
7373 | ObjectType::View
7374 | ObjectType::MaterializedView
7375 | ObjectType::Source
7376 | ObjectType::Subsource
7377 | ObjectType::Sink
7378 | ObjectType::Index
7379 | ObjectType::Type
7380 | ObjectType::Secret
7381 | ObjectType::Connection
7382 | ObjectType::Func
7383 | ObjectType::ContinualTask => UnresolvedObjectName::Item(self.parse_item_name()?),
7384 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7385 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7386 ObjectType::ClusterReplica => {
7387 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7388 }
7389 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7390 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7391 ObjectType::NetworkPolicy => {
7392 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7393 }
7394 })
7395 }
7396
7397 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7399 let mut idents = vec![];
7400 loop {
7401 idents.push(self.parse_identifier()?);
7402 if !self.consume_token(&Token::Dot) {
7403 break;
7404 }
7405 }
7406 Ok(idents)
7407 }
7408
7409 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7411 match self.consume_identifier()? {
7412 Some(id) => {
7413 if id.as_str().is_empty() {
7414 return parser_err!(
7415 self,
7416 self.peek_prev_pos(),
7417 "zero-length delimited identifier",
7418 );
7419 }
7420 Ok(id)
7421 }
7422 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7423 }
7424 }
7425
7426 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7427 match self.peek_token() {
7428 Some(Token::Keyword(kw)) => {
7429 self.next_token();
7430 Ok(Some(kw.into()))
7431 }
7432 Some(Token::Ident(id)) => {
7433 self.next_token();
7434 Ok(Some(self.new_identifier(id)?))
7435 }
7436 _ => Ok(None),
7437 }
7438 }
7439
7440 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7441 let mut id_parts = vec![id];
7442 match self.peek_token() {
7443 Some(Token::LParen) | Some(Token::Dot) => {
7444 let mut ends_with_wildcard = false;
7445 while self.consume_token(&Token::Dot) {
7446 match self.next_token() {
7447 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7448 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7449 Some(Token::Star) => {
7450 ends_with_wildcard = true;
7451 break;
7452 }
7453 unexpected => {
7454 return self.expected(
7455 self.peek_prev_pos(),
7456 "an identifier or a '*' after '.'",
7457 unexpected,
7458 );
7459 }
7460 }
7461 }
7462 if ends_with_wildcard {
7463 Ok(Expr::QualifiedWildcard(id_parts))
7464 } else if self.peek_token() == Some(Token::LParen) {
7465 let function =
7466 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7467 Ok(Expr::Function(function))
7468 } else {
7469 Ok(Expr::Identifier(id_parts))
7470 }
7471 }
7472 _ => Ok(Expr::Identifier(id_parts)),
7473 }
7474 }
7475
7476 fn parse_parenthesized_column_list(
7478 &mut self,
7479 optional: IsOptional,
7480 ) -> Result<Vec<Ident>, ParserError> {
7481 if self.consume_token(&Token::LParen) {
7482 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7483 self.expect_token(&Token::RParen)?;
7484 Ok(cols)
7485 } else if optional == Optional {
7486 Ok(vec![])
7487 } else {
7488 self.expected(
7489 self.peek_pos(),
7490 "a list of columns in parentheses",
7491 self.peek_token(),
7492 )
7493 }
7494 }
7495
7496 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7497 if self.consume_token(&Token::LParen) {
7498 let n = self.parse_literal_uint()?;
7499 self.expect_token(&Token::RParen)?;
7500 Ok(Some(n))
7501 } else {
7502 Ok(None)
7503 }
7504 }
7505
7506 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7507 self.expect_token(&Token::LBracket)?;
7508 let key_type = Box::new(self.parse_data_type()?);
7509 self.expect_token(&Token::Arrow)?;
7510 let value_type = Box::new(self.parse_data_type()?);
7511 self.expect_token(&Token::RBracket)?;
7512 Ok(RawDataType::Map {
7513 key_type,
7514 value_type,
7515 })
7516 }
7517
7518 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7519 self.expect_keyword(FROM)?;
7520 let table_name = RawItemName::Name(self.parse_item_name()?);
7521 let alias = self.parse_optional_table_alias()?;
7522 let using = if self.parse_keyword(USING) {
7523 self.parse_comma_separated(Parser::parse_table_and_joins)?
7524 } else {
7525 vec![]
7526 };
7527 let selection = if self.parse_keyword(WHERE) {
7528 Some(self.parse_expr()?)
7529 } else {
7530 None
7531 };
7532
7533 Ok(Statement::Delete(DeleteStatement {
7534 table_name,
7535 alias,
7536 using,
7537 selection,
7538 }))
7539 }
7540
7541 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7543 Ok(SelectStatement {
7544 query: self.parse_query()?,
7545 as_of: self.parse_optional_as_of()?,
7546 })
7547 }
7548
7549 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7554 self.checked_recur_mut(|parser| {
7555 let cte_block = if parser.parse_keyword(WITH) {
7556 if parser.parse_keyword(MUTUALLY) {
7557 parser.expect_keyword(RECURSIVE)?;
7558 let options = if parser.consume_token(&Token::LParen) {
7559 let options =
7560 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7561 parser.expect_token(&Token::RParen)?;
7562 options
7563 } else {
7564 vec![]
7565 };
7566 CteBlock::MutuallyRecursive(MutRecBlock {
7567 options,
7568 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7569 })
7570 } else {
7571 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7573 }
7574 } else {
7575 CteBlock::empty()
7576 };
7577
7578 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7579
7580 parser.parse_query_tail(cte_block, body)
7581 })
7582 }
7583
7584 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7585 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7586 RECURSION => {
7587 self.expect_keyword(LIMIT)?;
7588 Ok(MutRecBlockOption {
7589 name: MutRecBlockOptionName::RecursionLimit,
7590 value: self.parse_optional_option_value()?,
7591 })
7592 }
7593 RETURN => {
7594 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7595 Ok(MutRecBlockOption {
7596 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7597 value: self.parse_optional_option_value()?,
7598 })
7599 }
7600 ERROR => {
7601 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7602 Ok(MutRecBlockOption {
7603 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7604 value: self.parse_optional_option_value()?,
7605 })
7606 }
7607 _ => unreachable!(),
7608 }
7609 }
7610
7611 fn parse_query_tail(
7612 &mut self,
7613 ctes: CteBlock<Raw>,
7614 body: SetExpr<Raw>,
7615 ) -> Result<Query<Raw>, ParserError> {
7616 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7617 SetExpr::Query(query) => {
7618 let Query {
7619 ctes,
7620 body,
7621 order_by,
7622 limit,
7623 offset,
7624 } = *query;
7625 (ctes, order_by, limit, offset, body)
7626 }
7627 _ => (CteBlock::empty(), vec![], None, None, body),
7628 };
7629
7630 let ctes = if ctes.is_empty() {
7631 inner_ctes
7632 } else if !inner_ctes.is_empty() {
7633 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7634 } else {
7635 ctes
7636 };
7637
7638 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7639 if !inner_order_by.is_empty() {
7640 return parser_err!(
7641 self,
7642 self.peek_prev_pos(),
7643 "multiple ORDER BY clauses not allowed"
7644 );
7645 }
7646 self.parse_comma_separated(Parser::parse_order_by_expr)?
7647 } else {
7648 inner_order_by
7649 };
7650
7651 let mut limit = inner_limit;
7655 let mut offset = inner_offset;
7656 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7657 match parsed_keyword {
7658 LIMIT => {
7659 if limit.is_some() {
7660 return parser_err!(
7661 self,
7662 self.peek_prev_pos(),
7663 "multiple LIMIT/FETCH clauses not allowed"
7664 );
7665 }
7666 limit = if self.parse_keyword(ALL) {
7667 None
7668 } else {
7669 Some(Limit {
7670 with_ties: false,
7671 quantity: self.parse_expr()?,
7672 })
7673 };
7674 }
7675 OFFSET => {
7676 if offset.is_some() {
7677 return parser_err!(
7678 self,
7679 self.peek_prev_pos(),
7680 "multiple OFFSET clauses not allowed"
7681 );
7682 }
7683 let value = self.parse_expr()?;
7684 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7685 offset = Some(value);
7686 }
7687 FETCH => {
7688 if limit.is_some() {
7689 return parser_err!(
7690 self,
7691 self.peek_prev_pos(),
7692 "multiple LIMIT/FETCH clauses not allowed"
7693 );
7694 }
7695 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7696 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7697 Expr::Value(Value::Number('1'.into()))
7698 } else {
7699 let quantity = self.parse_expr()?;
7700 self.expect_one_of_keywords(&[ROW, ROWS])?;
7701 quantity
7702 };
7703 let with_ties = if self.parse_keyword(ONLY) {
7704 false
7705 } else if self.parse_keywords(&[WITH, TIES]) {
7706 true
7707 } else {
7708 return self.expected(
7709 self.peek_pos(),
7710 "one of ONLY or WITH TIES",
7711 self.peek_token(),
7712 );
7713 };
7714 limit = Some(Limit {
7715 with_ties,
7716 quantity,
7717 });
7718 }
7719 _ => unreachable!(),
7720 }
7721 }
7722
7723 Ok(Query {
7724 ctes,
7725 body,
7726 order_by,
7727 limit,
7728 offset,
7729 })
7730 }
7731
7732 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7734 let alias = TableAlias {
7735 name: self.parse_identifier()?,
7736 columns: self.parse_parenthesized_column_list(Optional)?,
7737 strict: false,
7738 };
7739 self.expect_keyword(AS)?;
7740 self.expect_token(&Token::LParen)?;
7741 let query = self.parse_query()?;
7742 self.expect_token(&Token::RParen)?;
7743 Ok(Cte {
7744 alias,
7745 query,
7746 id: (),
7747 })
7748 }
7749
7750 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7756 let name = self.parse_identifier()?;
7757 self.expect_token(&Token::LParen)?;
7758 let columns = self.parse_comma_separated(|parser| {
7759 Ok(CteMutRecColumnDef {
7760 name: parser.parse_identifier()?,
7761 data_type: parser.parse_data_type()?,
7762 })
7763 })?;
7764 self.expect_token(&Token::RParen)?;
7765 self.expect_keyword(AS)?;
7766 self.expect_token(&Token::LParen)?;
7767 let query = self.parse_query()?;
7768 self.expect_token(&Token::RParen)?;
7769 Ok(CteMutRec {
7770 name,
7771 columns,
7772 query,
7773 id: (),
7774 })
7775 }
7776
7777 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7786 let expr = if self.parse_keyword(SELECT) {
7789 SetExpr::Select(Box::new(self.parse_select()?))
7790 } else if self.consume_token(&Token::LParen) {
7791 let subquery = self.parse_query()?;
7793 self.expect_token(&Token::RParen)?;
7794 SetExpr::Query(Box::new(subquery))
7795 } else if self.parse_keyword(VALUES) {
7796 SetExpr::Values(self.parse_values()?)
7797 } else if self.parse_keyword(SHOW) {
7798 SetExpr::Show(self.parse_show()?)
7799 } else if self.parse_keyword(TABLE) {
7800 SetExpr::Table(self.parse_raw_name()?)
7801 } else {
7802 return self.expected(
7803 self.peek_pos(),
7804 "SELECT, VALUES, or a subquery in the query body",
7805 self.peek_token(),
7806 );
7807 };
7808
7809 self.parse_query_body_seeded(precedence, expr)
7810 }
7811
7812 fn parse_query_body_seeded(
7813 &mut self,
7814 precedence: SetPrecedence,
7815 mut expr: SetExpr<Raw>,
7816 ) -> Result<SetExpr<Raw>, ParserError> {
7817 loop {
7818 let next_token = self.peek_token();
7820 let op = self.parse_set_operator(&next_token);
7821 let next_precedence = match op {
7822 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7824 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7826 None => break,
7828 };
7829 if precedence >= next_precedence {
7830 break;
7831 }
7832 self.next_token(); let all = self.parse_keyword(ALL);
7835 let distinct = self.parse_keyword(DISTINCT);
7836 if all && distinct {
7837 return parser_err!(
7838 self,
7839 self.peek_prev_pos(),
7840 "Cannot specify both ALL and DISTINCT in set operation"
7841 );
7842 }
7843 expr = SetExpr::SetOperation {
7844 left: Box::new(expr),
7845 op: op.unwrap(),
7846 all,
7847 right: Box::new(self.parse_query_body(next_precedence)?),
7848 };
7849 }
7850
7851 Ok(expr)
7852 }
7853
7854 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7855 match token {
7856 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
7857 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
7858 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
7859 _ => None,
7860 }
7861 }
7862
7863 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
7866 let all = self.parse_keyword(ALL);
7867 let distinct = self.parse_keyword(DISTINCT);
7868 if all && distinct {
7869 return parser_err!(
7870 self,
7871 self.peek_prev_pos(),
7872 "Cannot specify both ALL and DISTINCT in SELECT"
7873 );
7874 }
7875 let distinct = if distinct && self.parse_keyword(ON) {
7876 self.expect_token(&Token::LParen)?;
7877 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
7878 self.expect_token(&Token::RParen)?;
7879 Some(Distinct::On(exprs))
7880 } else if distinct {
7881 Some(Distinct::EntireRow)
7882 } else {
7883 None
7884 };
7885
7886 let projection = match self.peek_token() {
7887 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
7891 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
7892 _ => {
7893 let mut projection = vec![];
7894 loop {
7895 projection.push(self.parse_select_item()?);
7896 if !self.consume_token(&Token::Comma) {
7897 break;
7898 }
7899 if self.peek_keyword(FROM) {
7900 return parser_err!(
7901 self,
7902 self.peek_prev_pos(),
7903 "invalid trailing comma in SELECT list",
7904 );
7905 }
7906 }
7907 projection
7908 }
7909 };
7910
7911 let from = if self.parse_keyword(FROM) {
7917 self.parse_comma_separated(Parser::parse_table_and_joins)?
7918 } else {
7919 vec![]
7920 };
7921
7922 let selection = if self.parse_keyword(WHERE) {
7923 Some(self.parse_expr()?)
7924 } else {
7925 None
7926 };
7927
7928 let group_by = if self.parse_keywords(&[GROUP, BY]) {
7929 self.parse_comma_separated(Parser::parse_expr)?
7930 } else {
7931 vec![]
7932 };
7933
7934 let having = if self.parse_keyword(HAVING) {
7935 Some(self.parse_expr()?)
7936 } else {
7937 None
7938 };
7939
7940 let qualify = if self.parse_keyword(QUALIFY) {
7941 Some(self.parse_expr()?)
7942 } else {
7943 None
7944 };
7945
7946 let options = if self.parse_keyword(OPTIONS) {
7947 self.expect_token(&Token::LParen)?;
7948 let options = self.parse_comma_separated(Self::parse_select_option)?;
7949 self.expect_token(&Token::RParen)?;
7950 options
7951 } else {
7952 vec![]
7953 };
7954
7955 Ok(Select {
7956 distinct,
7957 projection,
7958 from,
7959 selection,
7960 group_by,
7961 having,
7962 qualify,
7963 options,
7964 })
7965 }
7966
7967 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
7968 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
7969 EXPECTED => {
7970 self.expect_keywords(&[GROUP, SIZE])?;
7971 SelectOptionName::ExpectedGroupSize
7972 }
7973 AGGREGATE => {
7974 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7975 SelectOptionName::AggregateInputGroupSize
7976 }
7977 DISTINCT => {
7978 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
7979 SelectOptionName::DistinctOnInputGroupSize
7980 }
7981 LIMIT => {
7982 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7983 SelectOptionName::LimitInputGroupSize
7984 }
7985 _ => unreachable!(),
7986 };
7987 Ok(SelectOption {
7988 name,
7989 value: self.parse_optional_option_value()?,
7990 })
7991 }
7992
7993 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7994 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
7995 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
7996 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
7997 if !normal {
7998 match variable.as_str().parse() {
7999 Ok(TIME) => {
8000 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
8001 variable = ident!("timezone");
8002 normal = true;
8003 }
8004 Ok(NAMES) => {
8005 variable = ident!("client_encoding");
8006 normal = true;
8007 }
8008 _ => {}
8009 }
8010 }
8011 if variable.as_str().parse() == Ok(SCHEMA) {
8012 variable = ident!("search_path");
8013 let to = self
8014 .parse_set_schema_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 normal {
8022 let to = self
8023 .parse_set_variable_to()
8024 .map_parser_err(StatementKind::SetVariable)?;
8025 Ok(Statement::SetVariable(SetVariableStatement {
8026 local: modifier == Some(LOCAL),
8027 variable,
8028 to,
8029 }))
8030 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
8031 Ok(Statement::SetTransaction(SetTransactionStatement {
8033 local: true,
8034 modes: self
8035 .parse_transaction_modes(true)
8036 .map_parser_err(StatementKind::SetTransaction)?,
8037 }))
8038 } else if modifier == Some(SESSION)
8039 && variable.as_str().parse() == Ok(CHARACTERISTICS)
8040 && self.parse_keywords(&[AS, TRANSACTION])
8041 {
8042 Ok(Statement::SetTransaction(SetTransactionStatement {
8044 local: false,
8045 modes: self
8046 .parse_transaction_modes(true)
8047 .map_parser_err(StatementKind::SetTransaction)?,
8048 }))
8049 } else {
8050 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
8051 .map_no_statement_parser_err()
8052 }
8053 }
8054
8055 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
8056 if self.parse_keyword(DEFAULT) {
8057 Ok(SetVariableTo::Default)
8058 } else {
8059 let to = self.parse_set_variable_value()?;
8060 Ok(SetVariableTo::Values(vec![to]))
8061 }
8062 }
8063
8064 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
8065 if self.parse_keyword(DEFAULT) {
8066 Ok(SetVariableTo::Default)
8067 } else {
8068 Ok(SetVariableTo::Values(
8069 self.parse_comma_separated(Parser::parse_set_variable_value)?,
8070 ))
8071 }
8072 }
8073
8074 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
8075 if let Some(value) = self.maybe_parse(Parser::parse_value) {
8076 Ok(SetVariableValue::Literal(value))
8077 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
8078 Ok(SetVariableValue::Ident(ident))
8079 } else {
8080 self.expected(self.peek_pos(), "variable value", self.peek_token())
8081 }
8082 }
8083
8084 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
8085 let mut variable = self.parse_identifier()?;
8086 if variable.as_str().parse() == Ok(SCHEMA) {
8087 variable = ident!("search_path");
8088 }
8089 Ok(Statement::ResetVariable(ResetVariableStatement {
8090 variable,
8091 }))
8092 }
8093
8094 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8095 let redacted = self.parse_keyword(REDACTED);
8096 if redacted && !self.peek_keyword(CREATE) {
8097 return parser_err!(
8098 self,
8099 self.peek_pos(),
8100 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
8101 );
8102 }
8103 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8104 self.parse_show_columns()
8105 } else if self.parse_keyword(OBJECTS) {
8106 let from = if self.parse_keywords(&[FROM]) {
8107 Some(self.parse_schema_name()?)
8108 } else {
8109 None
8110 };
8111 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8112 object_type: ShowObjectType::Object,
8113 from,
8114 filter: self.parse_show_statement_filter()?,
8115 }))
8116 } else if let Some(object_type) = self.parse_plural_object_type() {
8117 let from = if object_type.lives_in_schema() {
8118 if self.parse_keywords(&[FROM]) {
8119 Some(self.parse_schema_name()?)
8120 } else {
8121 None
8122 }
8123 } else {
8124 None
8125 };
8126
8127 let show_object_type = match object_type {
8128 ObjectType::Database => ShowObjectType::Database,
8129 ObjectType::Schema => {
8130 let from = if self.parse_keyword(FROM) {
8131 Some(self.parse_database_name()?)
8132 } else {
8133 None
8134 };
8135 ShowObjectType::Schema { from }
8136 }
8137 ObjectType::Table => {
8138 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8139 Some(self.parse_raw_name()?)
8140 } else {
8141 None
8142 };
8143 ShowObjectType::Table { on_source }
8144 }
8145 ObjectType::View => ShowObjectType::View,
8146 ObjectType::Source => {
8147 let in_cluster = self.parse_optional_in_cluster()?;
8148 ShowObjectType::Source { in_cluster }
8149 }
8150 ObjectType::Subsource => {
8151 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8152 Some(self.parse_raw_name()?)
8153 } else {
8154 None
8155 };
8156
8157 if from.is_some() && on_source.is_some() {
8158 return parser_err!(
8159 self,
8160 self.peek_prev_pos(),
8161 "Cannot specify both FROM and ON"
8162 );
8163 }
8164
8165 ShowObjectType::Subsource { on_source }
8166 }
8167 ObjectType::Sink => {
8168 let in_cluster = self.parse_optional_in_cluster()?;
8169 ShowObjectType::Sink { in_cluster }
8170 }
8171 ObjectType::Type => ShowObjectType::Type,
8172 ObjectType::Role => ShowObjectType::Role,
8173 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8174 ObjectType::Secret => ShowObjectType::Secret,
8175 ObjectType::Connection => ShowObjectType::Connection,
8176 ObjectType::Cluster => ShowObjectType::Cluster,
8177 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8178 ObjectType::MaterializedView => {
8179 let in_cluster = self.parse_optional_in_cluster()?;
8180 ShowObjectType::MaterializedView { in_cluster }
8181 }
8182 ObjectType::ContinualTask => {
8183 let in_cluster = self.parse_optional_in_cluster()?;
8184 ShowObjectType::ContinualTask { in_cluster }
8185 }
8186 ObjectType::Index => {
8187 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8188 Some(self.parse_raw_name()?)
8189 } else {
8190 None
8191 };
8192
8193 if from.is_some() && on_object.is_some() {
8194 return parser_err!(
8195 self,
8196 self.peek_prev_pos(),
8197 "Cannot specify both FROM and ON"
8198 );
8199 }
8200
8201 let in_cluster = self.parse_optional_in_cluster()?;
8202 ShowObjectType::Index {
8203 in_cluster,
8204 on_object,
8205 }
8206 }
8207 ObjectType::Func => {
8208 return parser_err!(
8209 self,
8210 self.peek_prev_pos(),
8211 format!("Unsupported SHOW on {object_type}")
8212 );
8213 }
8214 };
8215 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8216 object_type: show_object_type,
8217 from,
8218 filter: self.parse_show_statement_filter()?,
8219 }))
8220 } else if self.parse_keyword(CLUSTER) {
8221 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8222 variable: ident!("cluster"),
8223 }))
8224 } else if self.parse_keyword(PRIVILEGES) {
8225 self.parse_show_privileges()
8226 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8227 self.parse_show_default_privileges()
8228 } else if self.parse_keyword(ROLE) {
8229 self.expect_keyword(MEMBERSHIP)?;
8230 let role = if self.parse_keyword(FOR) {
8231 Some(self.parse_identifier()?)
8232 } else {
8233 None
8234 };
8235 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8236 object_type: ShowObjectType::RoleMembership { role },
8237 from: None,
8238 filter: self.parse_show_statement_filter()?,
8239 }))
8240 } else if self.parse_keywords(&[CREATE, VIEW]) {
8241 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8242 view_name: self.parse_raw_name()?,
8243 redacted,
8244 }))
8245 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8246 Ok(ShowStatement::ShowCreateMaterializedView(
8247 ShowCreateMaterializedViewStatement {
8248 materialized_view_name: self.parse_raw_name()?,
8249 redacted,
8250 },
8251 ))
8252 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8253 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8254 source_name: self.parse_raw_name()?,
8255 redacted,
8256 }))
8257 } else if self.parse_keywords(&[CREATE, TABLE]) {
8258 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8259 table_name: self.parse_raw_name()?,
8260 redacted,
8261 }))
8262 } else if self.parse_keywords(&[CREATE, SINK]) {
8263 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8264 sink_name: self.parse_raw_name()?,
8265 redacted,
8266 }))
8267 } else if self.parse_keywords(&[CREATE, INDEX]) {
8268 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8269 index_name: self.parse_raw_name()?,
8270 redacted,
8271 }))
8272 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8273 Ok(ShowStatement::ShowCreateConnection(
8274 ShowCreateConnectionStatement {
8275 connection_name: self.parse_raw_name()?,
8276 redacted,
8277 },
8278 ))
8279 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8280 if redacted {
8281 return parser_err!(
8282 self,
8283 self.peek_prev_pos(),
8284 "SHOW REDACTED CREATE CLUSTER is not supported"
8285 );
8286 }
8287 Ok(ShowStatement::ShowCreateCluster(
8288 ShowCreateClusterStatement {
8289 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8290 },
8291 ))
8292 } else if self.parse_keywords(&[CREATE, TYPE]) {
8293 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8294 type_name: self.parse_data_type()?,
8295 redacted,
8296 }))
8297 } else {
8298 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8299 ident!("transaction_isolation")
8300 } else if self.parse_keywords(&[TIME, ZONE]) {
8301 ident!("timezone")
8302 } else {
8303 self.parse_identifier()?
8304 };
8305 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8306 variable,
8307 }))
8308 }
8309 }
8310
8311 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8312 self.expect_one_of_keywords(&[FROM, IN])?;
8313 let table_name = self.parse_raw_name()?;
8314 let filter = self.parse_show_statement_filter()?;
8318 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8319 table_name,
8320 filter,
8321 }))
8322 }
8323
8324 fn parse_show_statement_filter(
8325 &mut self,
8326 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8327 if self.parse_keyword(LIKE) {
8328 Ok(Some(ShowStatementFilter::Like(
8329 self.parse_literal_string()?,
8330 )))
8331 } else if self.parse_keyword(WHERE) {
8332 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8333 } else {
8334 Ok(None)
8335 }
8336 }
8337
8338 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8339 let object_type = if self.parse_keyword(ON) {
8340 Some(self.expect_plural_system_object_type_for_privileges()?)
8341 } else {
8342 None
8343 };
8344 let role = if self.parse_keyword(FOR) {
8345 Some(self.parse_identifier()?)
8346 } else {
8347 None
8348 };
8349 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8350 object_type: ShowObjectType::Privileges { object_type, role },
8351 from: None,
8352 filter: self.parse_show_statement_filter()?,
8353 }))
8354 }
8355
8356 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8357 let object_type = if self.parse_keyword(ON) {
8358 Some(self.expect_plural_object_type_for_privileges()?)
8359 } else {
8360 None
8361 };
8362 let role = if self.parse_keyword(FOR) {
8363 Some(self.parse_identifier()?)
8364 } else {
8365 None
8366 };
8367 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8368 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8369 from: None,
8370 filter: self.parse_show_statement_filter()?,
8371 }))
8372 }
8373
8374 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8375 self.expect_keyword(SHARD)?;
8376 let id = self.parse_literal_string()?;
8377 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8378 }
8379
8380 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8381 let relation = self.parse_table_factor()?;
8382
8383 let mut joins = vec![];
8387 loop {
8388 let join = if self.parse_keyword(CROSS) {
8389 self.expect_keyword(JOIN)?;
8390 Join {
8391 relation: self.parse_table_factor()?,
8392 join_operator: JoinOperator::CrossJoin,
8393 }
8394 } else {
8395 let natural = self.parse_keyword(NATURAL);
8396 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8397 Some(kw)
8398 } else {
8399 None
8400 };
8401
8402 let join_operator_type = match peek_keyword {
8403 Some(INNER) | Some(JOIN) => {
8404 let _ = self.parse_keyword(INNER);
8405 self.expect_keyword(JOIN)?;
8406 JoinOperator::Inner
8407 }
8408 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8409 let _ = self.next_token();
8410 let _ = self.parse_keyword(OUTER);
8411 self.expect_keyword(JOIN)?;
8412 match kw {
8413 LEFT => JoinOperator::LeftOuter,
8414 RIGHT => JoinOperator::RightOuter,
8415 FULL => JoinOperator::FullOuter,
8416 _ => unreachable!(),
8417 }
8418 }
8419 Some(OUTER) => {
8420 return self.expected(
8421 self.peek_pos(),
8422 "LEFT, RIGHT, or FULL",
8423 self.peek_token(),
8424 );
8425 }
8426 None if natural => {
8427 return self.expected(
8428 self.peek_pos(),
8429 "a join type after NATURAL",
8430 self.peek_token(),
8431 );
8432 }
8433 _ => break,
8434 };
8435 let relation = self.parse_table_factor()?;
8436 let join_constraint = self.parse_join_constraint(natural)?;
8437 Join {
8438 relation,
8439 join_operator: join_operator_type(join_constraint),
8440 }
8441 };
8442 joins.push(join);
8443 }
8444 Ok(TableWithJoins { relation, joins })
8445 }
8446
8447 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8449 if self.parse_keyword(LATERAL) {
8450 if self.consume_token(&Token::LParen) {
8452 return self.parse_derived_table_factor(Lateral);
8453 } else if self.parse_keywords(&[ROWS, FROM]) {
8454 return self.parse_rows_from();
8455 } else {
8456 let name = self.parse_raw_name()?;
8457 self.expect_token(&Token::LParen)?;
8458 let args = self.parse_optional_args(false)?;
8459 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8460 return Ok(TableFactor::Function {
8461 function: Function {
8462 name,
8463 args,
8464 filter: None,
8465 over: None,
8466 distinct: false,
8467 },
8468 alias,
8469 with_ordinality,
8470 });
8471 }
8472 }
8473
8474 if self.consume_token(&Token::LParen) {
8475 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8497
8498 let table_and_joins = self.parse_table_and_joins()?;
8509 match table_and_joins.relation {
8510 TableFactor::NestedJoin { .. } => (),
8511 _ => {
8512 if table_and_joins.joins.is_empty() {
8513 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8516 }
8517 }
8518 }
8519 self.expect_token(&Token::RParen)?;
8520 Ok(TableFactor::NestedJoin {
8521 join: Box::new(table_and_joins),
8522 alias: self.parse_optional_table_alias()?,
8523 })
8524 } else if self.parse_keywords(&[ROWS, FROM]) {
8525 Ok(self.parse_rows_from()?)
8526 } else {
8527 let name = self.parse_raw_name()?;
8528 if self.consume_token(&Token::LParen) {
8529 let args = self.parse_optional_args(false)?;
8530 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8531 Ok(TableFactor::Function {
8532 function: Function {
8533 name,
8534 args,
8535 filter: None,
8536 over: None,
8537 distinct: false,
8538 },
8539 alias,
8540 with_ordinality,
8541 })
8542 } else {
8543 Ok(TableFactor::Table {
8544 name,
8545 alias: self.parse_optional_table_alias()?,
8546 })
8547 }
8548 }
8549 }
8550
8551 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8552 self.expect_token(&Token::LParen)?;
8553 let functions = self.parse_comma_separated(Parser::parse_named_function)?;
8554 self.expect_token(&Token::RParen)?;
8555 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8556 Ok(TableFactor::RowsFrom {
8557 functions,
8558 alias,
8559 with_ordinality,
8560 })
8561 }
8562
8563 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8570 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8571 let alias = self.parse_optional_table_alias()?;
8572 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8573 if with_ordinality_1 && with_ordinality_2 {
8574 return parser_err!(
8575 self,
8576 self.peek_prev_pos(),
8577 "WITH ORDINALITY specified twice"
8578 );
8579 }
8580 Ok((with_ordinality_1 || with_ordinality_2, alias))
8581 }
8582
8583 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8584 let name = self.parse_raw_name()?;
8585 self.parse_function(name)
8586 }
8587
8588 fn parse_derived_table_factor(
8589 &mut self,
8590 lateral: IsLateral,
8591 ) -> Result<TableFactor<Raw>, ParserError> {
8592 let subquery = Box::new(self.parse_query()?);
8593 self.expect_token(&Token::RParen)?;
8594 let alias = self.parse_optional_table_alias()?;
8595 Ok(TableFactor::Derived {
8596 lateral: match lateral {
8597 Lateral => true,
8598 NotLateral => false,
8599 },
8600 subquery,
8601 alias,
8602 })
8603 }
8604
8605 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8606 if natural {
8607 Ok(JoinConstraint::Natural)
8608 } else if self.parse_keyword(ON) {
8609 let constraint = self.parse_expr()?;
8610 Ok(JoinConstraint::On(constraint))
8611 } else if self.parse_keyword(USING) {
8612 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8613 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8614
8615 Ok(JoinConstraint::Using { columns, alias })
8616 } else {
8617 self.expected(
8618 self.peek_pos(),
8619 "ON, or USING after JOIN",
8620 self.peek_token(),
8621 )
8622 }
8623 }
8624
8625 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8627 self.expect_keyword(INTO)?;
8628 let table_name = self.parse_raw_name()?;
8629 let columns = self.parse_parenthesized_column_list(Optional)?;
8630 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8631 InsertSource::DefaultValues
8632 } else {
8633 InsertSource::Query(self.parse_query()?)
8634 };
8635 let returning = self.parse_returning()?;
8636 Ok(Statement::Insert(InsertStatement {
8637 table_name,
8638 columns,
8639 source,
8640 returning,
8641 }))
8642 }
8643
8644 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8645 Ok(if self.parse_keyword(RETURNING) {
8646 self.parse_comma_separated(Parser::parse_select_item)?
8647 } else {
8648 Vec::new()
8649 })
8650 }
8651
8652 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8653 let table_name = RawItemName::Name(self.parse_item_name()?);
8654 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8656 let alias = alias.map(|name| TableAlias {
8657 name,
8658 columns: Vec::new(),
8659 strict: false,
8660 });
8661
8662 self.expect_keyword(SET)?;
8663 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8664 let selection = if self.parse_keyword(WHERE) {
8665 Some(self.parse_expr()?)
8666 } else {
8667 None
8668 };
8669
8670 Ok(Statement::Update(UpdateStatement {
8671 table_name,
8672 alias,
8673 assignments,
8674 selection,
8675 }))
8676 }
8677
8678 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8680 let id = self.parse_identifier()?;
8681 self.expect_token(&Token::Eq)?;
8682 let value = self.parse_expr()?;
8683 Ok(Assignment { id, value })
8684 }
8685
8686 fn parse_optional_args(
8687 &mut self,
8688 allow_order_by: bool,
8689 ) -> Result<FunctionArgs<Raw>, ParserError> {
8690 if self.consume_token(&Token::Star) {
8691 self.expect_token(&Token::RParen)?;
8692 Ok(FunctionArgs::Star)
8693 } else if self.consume_token(&Token::RParen) {
8694 Ok(FunctionArgs::args(vec![]))
8695 } else {
8696 let args = self.parse_comma_separated(Parser::parse_expr)?;
8697 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8701 self.parse_comma_separated(Parser::parse_order_by_expr)?
8702 } else {
8703 vec![]
8704 };
8705 self.expect_token(&Token::RParen)?;
8706 Ok(FunctionArgs::Args { args, order_by })
8707 }
8708 }
8709
8710 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8712 if self.parse_keyword(AS) {
8713 self.expect_keyword(OF)?;
8714 if self.parse_keywords(&[AT, LEAST]) {
8715 match self.parse_expr() {
8716 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8717 Err(e) => self.expected(
8718 e.pos,
8719 "a timestamp value after 'AS OF AT LEAST'",
8720 self.peek_token(),
8721 ),
8722 }
8723 } else {
8724 match self.parse_expr() {
8725 Ok(expr) => Ok(Some(AsOf::At(expr))),
8726 Err(e) => {
8727 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8728 }
8729 }
8730 }
8731 } else {
8732 Ok(None)
8733 }
8734 }
8735
8736 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8738 if self.parse_keyword(UP) {
8739 self.expect_keyword(TO)?;
8740 self.parse_expr().map(Some)
8741 } else {
8742 Ok(None)
8743 }
8744 }
8745
8746 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8751 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8752 let value = parser.parse_value().ok()?;
8753 let Value::Number(s) = value else { return None };
8754 s.parse().ok()
8755 }
8756
8757 if self.parse_keywords(&[AS, OF]) {
8758 match try_parse_u64(self) {
8759 Some(time) => Ok(Some(time)),
8760 None => {
8761 self.prev_token();
8762 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8763 }
8764 }
8765 } else {
8766 Ok(None)
8767 }
8768 }
8769
8770 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8772 if self.consume_token(&Token::Star) {
8773 return Ok(SelectItem::Wildcard);
8774 }
8775 Ok(SelectItem::Expr {
8776 expr: self.parse_expr()?,
8777 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8778 })
8779 }
8780
8781 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8784 let expr = self.parse_expr()?;
8785
8786 let asc = if self.parse_keyword(ASC) {
8787 Some(true)
8788 } else if self.parse_keyword(DESC) {
8789 Some(false)
8790 } else {
8791 None
8792 };
8793
8794 let nulls_last = if self.parse_keyword(NULLS) {
8795 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8796 Some(last)
8797 } else {
8798 None
8799 };
8800
8801 Ok(OrderByExpr {
8802 expr,
8803 asc,
8804 nulls_last,
8805 })
8806 }
8807
8808 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8809 let values = self.parse_comma_separated(|parser| {
8810 parser.expect_token(&Token::LParen)?;
8811 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8812 parser.expect_token(&Token::RParen)?;
8813 Ok(exprs)
8814 })?;
8815 Ok(Values(values))
8816 }
8817
8818 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8819 self.expect_keyword(TRANSACTION)?;
8820 Ok(Statement::StartTransaction(StartTransactionStatement {
8821 modes: self.parse_transaction_modes(false)?,
8822 }))
8823 }
8824
8825 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
8826 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8827 Ok(Statement::StartTransaction(StartTransactionStatement {
8828 modes: self.parse_transaction_modes(false)?,
8829 }))
8830 }
8831
8832 fn parse_transaction_modes(
8833 &mut self,
8834 mut required: bool,
8835 ) -> Result<Vec<TransactionMode>, ParserError> {
8836 let mut modes = vec![];
8837 loop {
8838 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
8839 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
8840 TransactionIsolationLevel::ReadUncommitted
8841 } else if self.parse_keywords(&[READ, COMMITTED]) {
8842 TransactionIsolationLevel::ReadCommitted
8843 } else if self.parse_keywords(&[REPEATABLE, READ]) {
8844 TransactionIsolationLevel::RepeatableRead
8845 } else if self.parse_keyword(SERIALIZABLE) {
8846 TransactionIsolationLevel::Serializable
8847 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
8848 TransactionIsolationLevel::StrongSessionSerializable
8849 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
8850 TransactionIsolationLevel::StrictSerializable
8851 } else {
8852 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
8853 };
8854 TransactionMode::IsolationLevel(iso_level)
8855 } else if self.parse_keywords(&[READ, ONLY]) {
8856 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8857 } else if self.parse_keywords(&[READ, WRITE]) {
8858 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8859 } else if required {
8860 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
8861 } else {
8862 break;
8863 };
8864 modes.push(mode);
8865 required = self.consume_token(&Token::Comma);
8870 }
8871 Ok(modes)
8872 }
8873
8874 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
8875 Ok(Statement::Commit(CommitStatement {
8876 chain: self.parse_commit_rollback_chain()?,
8877 }))
8878 }
8879
8880 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
8881 Ok(Statement::Rollback(RollbackStatement {
8882 chain: self.parse_commit_rollback_chain()?,
8883 }))
8884 }
8885
8886 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8887 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8888 if self.parse_keyword(AND) {
8889 let chain = !self.parse_keyword(NO);
8890 self.expect_keyword(CHAIN)?;
8891 Ok(chain)
8892 } else {
8893 Ok(false)
8894 }
8895 }
8896
8897 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
8898 parser_err!(
8899 self,
8900 self.peek_prev_pos(),
8901 "TAIL has been renamed to SUBSCRIBE"
8902 )
8903 }
8904
8905 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
8906 let _ = self.parse_keyword(TO);
8907 let relation = if self.consume_token(&Token::LParen) {
8908 let query = self.parse_query()?;
8909 self.expect_token(&Token::RParen)?;
8910 SubscribeRelation::Query(query)
8911 } else {
8912 SubscribeRelation::Name(self.parse_raw_name()?)
8913 };
8914 let mut output = self.parse_subscribe_output()?;
8915 let options = if self.parse_keyword(WITH) {
8916 self.expect_token(&Token::LParen)?;
8917 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
8918 self.expect_token(&Token::RParen)?;
8919 options
8920 } else {
8921 vec![]
8922 };
8923 let as_of = self.parse_optional_as_of()?;
8924 let up_to = self.parse_optional_up_to()?;
8925 if output == SubscribeOutput::Diffs {
8932 output = self.parse_subscribe_output()?;
8933 }
8934 Ok(Statement::Subscribe(SubscribeStatement {
8935 relation,
8936 options,
8937 as_of,
8938 up_to,
8939 output,
8940 }))
8941 }
8942
8943 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
8944 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
8945 PROGRESS => SubscribeOptionName::Progress,
8946 SNAPSHOT => SubscribeOptionName::Snapshot,
8947 _ => unreachable!(),
8948 };
8949 Ok(SubscribeOption {
8950 name,
8951 value: self.parse_optional_option_value()?,
8952 })
8953 }
8954
8955 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
8956 if self.parse_keywords(&[ENVELOPE]) {
8957 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
8958 self.expect_token(&Token::LParen)?;
8959 self.expect_keyword(KEY)?;
8960 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
8961 let output = match keyword {
8962 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
8963 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
8964 _ => unreachable!("no other keyword allowed"),
8965 };
8966 self.expect_token(&Token::RParen)?;
8967 Ok(output)
8968 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
8969 Ok(SubscribeOutput::WithinTimestampOrderBy {
8970 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
8971 })
8972 } else {
8973 Ok(SubscribeOutput::Diffs)
8974 }
8975 }
8976
8977 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8980 if self.parse_keyword(TIMESTAMP) {
8981 self.parse_explain_timestamp()
8982 .map_parser_err(StatementKind::ExplainTimestamp)
8983 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
8984 self.parse_explain_pushdown()
8985 .map_parser_err(StatementKind::ExplainPushdown)
8986 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
8987 self.parse_explain_analyze()
8988 .map_parser_err(StatementKind::ExplainAnalyzeObject)
8989 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
8990 self.parse_explain_schema()
8991 .map_parser_err(StatementKind::ExplainSinkSchema)
8992 } else {
8993 self.parse_explain_plan()
8994 .map_parser_err(StatementKind::ExplainPlan)
8995 }
8996 }
8997
8998 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
8999 let explainee = if self.parse_keyword(VIEW) {
9000 Explainee::View(self.parse_raw_name()?)
9002 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
9003 Explainee::MaterializedView(self.parse_raw_name()?)
9005 } else if self.parse_keyword(INDEX) {
9006 Explainee::Index(self.parse_raw_name()?)
9008 } else if self.parse_keywords(&[REPLAN, VIEW]) {
9009 Explainee::ReplanView(self.parse_raw_name()?)
9011 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
9012 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
9014 } else if self.parse_keywords(&[REPLAN, INDEX]) {
9015 Explainee::ReplanIndex(self.parse_raw_name()?)
9017 } else {
9018 let broken = self.parse_keyword(BROKEN);
9019
9020 if self.peek_keywords(&[CREATE, VIEW])
9021 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
9022 {
9023 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
9026 Statement::CreateView(stmt) => stmt,
9027 _ => panic!("Unexpected statement type return after parsing"),
9028 };
9029
9030 Explainee::CreateView(Box::new(stmt), broken)
9031 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
9032 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
9033 {
9034 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
9037 Statement::CreateMaterializedView(stmt) => stmt,
9038 _ => panic!("Unexpected statement type return after parsing"),
9039 };
9040
9041 Explainee::CreateMaterializedView(Box::new(stmt), broken)
9042 } else if self.peek_keywords(&[CREATE, INDEX])
9043 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
9044 {
9045 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
9048 Statement::CreateIndex(stmt) => stmt,
9049 _ => panic!("Unexpected statement type return after parsing"),
9050 };
9051
9052 Explainee::CreateIndex(Box::new(stmt), broken)
9053 } else if self.peek_keyword(SUBSCRIBE) {
9054 let _ = self.parse_keyword(SUBSCRIBE); let stmt = match self.parse_subscribe()? {
9057 Statement::Subscribe(stmt) => stmt,
9058 _ => panic!("Unexpected statement type return after parsing"),
9059 };
9060 Explainee::Subscribe(Box::new(stmt), broken)
9061 } else {
9062 let query = self.parse_select_statement()?;
9064 Explainee::Select(Box::new(query), broken)
9065 }
9066 };
9067 Ok(explainee)
9068 }
9069
9070 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
9073 let start = self.peek_pos();
9074 let (has_stage, stage) = match self.parse_one_of_keywords(&[
9075 RAW,
9076 DECORRELATED,
9077 LOCALLY,
9078 OPTIMIZED,
9079 PHYSICAL,
9080 OPTIMIZER,
9081 PLAN,
9082 ]) {
9083 Some(RAW) => {
9084 self.expect_keyword(PLAN)?;
9085 (true, Some(ExplainStage::RawPlan))
9086 }
9087 Some(DECORRELATED) => {
9088 self.expect_keyword(PLAN)?;
9089 (true, Some(ExplainStage::DecorrelatedPlan))
9090 }
9091 Some(LOCALLY) => {
9092 self.expect_keywords(&[OPTIMIZED, PLAN])?;
9093 (true, Some(ExplainStage::LocalPlan))
9094 }
9095 Some(OPTIMIZED) => {
9096 self.expect_keyword(PLAN)?;
9097 (true, Some(ExplainStage::GlobalPlan))
9098 }
9099 Some(PHYSICAL) => {
9100 self.expect_keyword(PLAN)?;
9101 (true, Some(ExplainStage::PhysicalPlan))
9102 }
9103 Some(OPTIMIZER) => {
9104 self.expect_keyword(TRACE)?;
9105 (true, Some(ExplainStage::Trace))
9106 }
9107 Some(PLAN) => {
9108 if self.parse_keyword(INSIGHTS) {
9109 (true, Some(ExplainStage::PlanInsights))
9110 } else {
9111 (true, None)
9113 }
9114 }
9115 None => {
9116 (false, None)
9118 }
9119 _ => unreachable!(),
9120 };
9121
9122 let with_options = if self.parse_keyword(WITH) {
9123 if self.consume_token(&Token::LParen) {
9124 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9125 self.expect_token(&Token::RParen)?;
9126 options
9127 } else {
9128 self.prev_token(); vec![]
9130 }
9131 } else {
9132 vec![]
9133 };
9134
9135 let format = if self.parse_keyword(AS) {
9136 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9137 Some(TEXT) => Some(ExplainFormat::Text),
9138 Some(JSON) => Some(ExplainFormat::Json),
9139 Some(DOT) => Some(ExplainFormat::Dot),
9140 Some(VERBOSE) => {
9141 self.expect_keyword(TEXT)?;
9142 Some(ExplainFormat::VerboseText)
9143 }
9144 None => return Err(ParserError::new(self.index, "expected a format")),
9145 _ => unreachable!(),
9146 }
9147 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9148 Some(ExplainFormat::VerboseText)
9150 } else {
9151 None
9152 };
9153
9154 if has_stage {
9155 self.expect_keyword(FOR)?;
9156 }
9157
9158 let explainee = self.parse_explainee()?;
9159
9160 if matches!((explainee.is_view(), &stage), (true, None)) {
9163 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9164 return Err(self.error(start, msg));
9165 }
9166
9167 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9168 stage,
9169 with_options,
9170 format,
9171 explainee,
9172 }))
9173 }
9174
9175 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9176 Ok(ExplainPlanOption {
9177 name: self.parse_explain_plan_option_name()?,
9178 value: self.parse_optional_option_value()?,
9179 })
9180 }
9181
9182 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9185 self.expect_keyword(FOR)?;
9186
9187 let explainee = self.parse_explainee()?;
9188
9189 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9190 explainee,
9191 }))
9192 }
9193
9194 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9195 if self.parse_keyword(CLUSTER) {
9197 let properties = self.parse_explain_analyze_computation_properties()?;
9198 let as_sql = self.parse_keywords(&[AS, SQL]);
9199 return Ok(Statement::ExplainAnalyzeCluster(
9200 ExplainAnalyzeClusterStatement { properties, as_sql },
9201 ));
9202 }
9203
9204 let properties = if self.parse_keyword(HINTS) {
9207 ExplainAnalyzeProperty::Hints
9208 } else {
9209 ExplainAnalyzeProperty::Computation(
9210 self.parse_explain_analyze_computation_properties()?,
9211 )
9212 };
9213
9214 self.expect_keyword(FOR)?;
9215
9216 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9217 INDEX => Explainee::Index(self.parse_raw_name()?),
9218 MATERIALIZED => {
9219 self.expect_keyword(VIEW)?;
9220 Explainee::MaterializedView(self.parse_raw_name()?)
9221 }
9222 _ => unreachable!(),
9223 };
9224
9225 let as_sql = self.parse_keywords(&[AS, SQL]);
9226
9227 Ok(Statement::ExplainAnalyzeObject(
9228 ExplainAnalyzeObjectStatement {
9229 properties,
9230 explainee,
9231 as_sql,
9232 },
9233 ))
9234 }
9235
9236 fn parse_explain_analyze_computation_properties(
9237 &mut self,
9238 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9239 let mut computation_properties = vec![CPU, MEMORY];
9240 let (kw, property) =
9241 self.parse_explain_analyze_computation_property(&computation_properties)?;
9242 let mut properties = vec![property];
9243 computation_properties.retain(|p| p != &kw);
9244
9245 while self.consume_token(&Token::Comma) {
9246 let (kw, property) =
9247 self.parse_explain_analyze_computation_property(&computation_properties)?;
9248 computation_properties.retain(|p| p != &kw);
9249 properties.push(property);
9250 }
9251
9252 let skew = self.parse_keywords(&[WITH, SKEW]);
9253
9254 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9255 }
9256
9257 fn parse_explain_analyze_computation_property(
9258 &mut self,
9259 properties: &[Keyword],
9260 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9261 if properties.is_empty() {
9262 return Err(ParserError::new(
9263 self.peek_pos(),
9264 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9265 ));
9266 }
9267
9268 match self.expect_one_of_keywords(properties)? {
9269 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9270 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9271 _ => unreachable!(),
9272 }
9273 }
9274
9275 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9278 let format = if self.parse_keyword(AS) {
9279 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9280 Some(TEXT) => Some(ExplainFormat::Text),
9281 Some(JSON) => Some(ExplainFormat::Json),
9282 None => return Err(ParserError::new(self.index, "expected a format")),
9283 _ => unreachable!(),
9284 }
9285 } else {
9286 None
9287 };
9288
9289 self.expect_keyword(FOR)?;
9290
9291 let query = self.parse_select_statement()?;
9292
9293 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9294 format,
9295 select: query,
9296 }))
9297 }
9298 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9301 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9302 KEY => ExplainSinkSchemaFor::Key,
9303 VALUE => ExplainSinkSchemaFor::Value,
9304 _ => unreachable!(),
9305 };
9306
9307 self.expect_keyword(SCHEMA)?;
9308
9309 let format = if self.parse_keyword(AS) {
9310 self.expect_keyword(JSON)?;
9312 Some(ExplainFormat::Json)
9313 } else {
9314 None
9315 };
9316
9317 self.expect_keywords(&[FOR, CREATE])?;
9318
9319 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9320 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9321 schema_for,
9322 format,
9323 statement,
9324 }))
9325 } else {
9326 unreachable!("only create sink can be returned here");
9327 }
9328 }
9329
9330 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9333 let name = self
9334 .parse_identifier()
9335 .map_parser_err(StatementKind::Declare)?;
9336 self.expect_keyword(CURSOR)
9337 .map_parser_err(StatementKind::Declare)?;
9338 if self.parse_keyword(WITH) {
9339 let err = parser_err!(
9340 self,
9341 self.peek_prev_pos(),
9342 format!("WITH HOLD is unsupported for cursors")
9343 )
9344 .map_parser_err(StatementKind::Declare);
9345 self.expect_keyword(HOLD)
9346 .map_parser_err(StatementKind::Declare)?;
9347 return err;
9348 }
9349 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9351 self.expect_keyword(FOR)
9352 .map_parser_err(StatementKind::Declare)?;
9353 let StatementParseResult { ast, sql } = self.parse_statement()?;
9354 Ok(Statement::Declare(DeclareStatement {
9355 name,
9356 stmt: Box::new(ast),
9357 sql: sql.to_string(),
9358 }))
9359 }
9360
9361 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9364 let name = self.parse_identifier()?;
9365 Ok(Statement::Close(CloseStatement { name }))
9366 }
9367
9368 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9371 let name = self
9372 .parse_identifier()
9373 .map_parser_err(StatementKind::Prepare)?;
9374 self.expect_keyword(AS)
9375 .map_parser_err(StatementKind::Prepare)?;
9376 let pos = self.peek_pos();
9377 let StatementParseResult { ast, sql } = self.parse_statement()?;
9379 if !matches!(
9380 ast,
9381 Statement::Select(_)
9382 | Statement::Insert(_)
9383 | Statement::Delete(_)
9384 | Statement::Update(_)
9385 | Statement::Fetch(_),
9386 ) {
9387 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9388 }
9389 Ok(Statement::Prepare(PrepareStatement {
9390 name,
9391 stmt: Box::new(ast),
9392 sql: sql.to_string(),
9393 }))
9394 }
9395
9396 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9399 let name = self.parse_identifier()?;
9400 let params = if self.consume_token(&Token::LParen) {
9401 let params = self.parse_comma_separated(Parser::parse_expr)?;
9402 self.expect_token(&Token::RParen)?;
9403 params
9404 } else {
9405 Vec::new()
9406 };
9407 Ok(Statement::Execute(ExecuteStatement { name, params }))
9408 }
9409
9410 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9413 let _ = self.parse_keyword(PREPARE);
9414 let name = if self.parse_keyword(ALL) {
9415 None
9416 } else {
9417 Some(self.parse_identifier()?)
9418 };
9419 Ok(Statement::Deallocate(DeallocateStatement { name }))
9420 }
9421
9422 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9425 let _ = self.parse_keyword(FORWARD);
9426 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9427 Some(FetchDirection::ForwardCount(count))
9428 } else if self.parse_keyword(ALL) {
9429 Some(FetchDirection::ForwardAll)
9430 } else {
9431 None
9432 };
9433 let _ = self.parse_keyword(FROM);
9434 let name = self.parse_identifier()?;
9435 let options = if self.parse_keyword(WITH) {
9436 self.expect_token(&Token::LParen)?;
9437 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9438 self.expect_token(&Token::RParen)?;
9439 options
9440 } else {
9441 vec![]
9442 };
9443 Ok(Statement::Fetch(FetchStatement {
9444 name,
9445 count,
9446 options,
9447 }))
9448 }
9449
9450 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9451 self.expect_keyword(TIMEOUT)?;
9452 Ok(FetchOption {
9453 name: FetchOptionName::Timeout,
9454 value: self.parse_optional_option_value()?,
9455 })
9456 }
9457
9458 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9461 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9462 Some(DEBUG) => NoticeSeverity::Debug,
9463 Some(INFO) => NoticeSeverity::Info,
9464 Some(LOG) => NoticeSeverity::Log,
9465 Some(NOTICE) => NoticeSeverity::Notice,
9466 Some(WARNING) => NoticeSeverity::Warning,
9467 Some(_) => unreachable!(),
9468 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9469 };
9470
9471 Ok(Statement::Raise(RaiseStatement { severity }))
9472 }
9473
9474 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9477 match self.parse_privilege_specification() {
9478 Some(privileges) => self
9479 .parse_grant_privilege(privileges)
9480 .map_parser_err(StatementKind::GrantPrivileges),
9481 None => self
9482 .parse_grant_role()
9483 .map_parser_err(StatementKind::GrantRole),
9484 }
9485 }
9486
9487 fn parse_grant_privilege(
9490 &mut self,
9491 privileges: PrivilegeSpecification,
9492 ) -> Result<Statement<Raw>, ParserError> {
9493 self.expect_keyword(ON)?;
9494 let target = self.expect_grant_target_specification("GRANT")?;
9495 self.expect_keyword(TO)?;
9496 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9497 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9498 privileges,
9499 target,
9500 roles,
9501 }))
9502 }
9503
9504 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9507 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9508 self.expect_keyword(TO)?;
9509 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9510 Ok(Statement::GrantRole(GrantRoleStatement {
9511 role_names,
9512 member_names,
9513 }))
9514 }
9515
9516 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9519 match self.parse_privilege_specification() {
9520 Some(privileges) => self
9521 .parse_revoke_privilege(privileges)
9522 .map_parser_err(StatementKind::RevokePrivileges),
9523 None => self
9524 .parse_revoke_role()
9525 .map_parser_err(StatementKind::RevokeRole),
9526 }
9527 }
9528
9529 fn parse_revoke_privilege(
9532 &mut self,
9533 privileges: PrivilegeSpecification,
9534 ) -> Result<Statement<Raw>, ParserError> {
9535 self.expect_keyword(ON)?;
9536 let target = self.expect_grant_target_specification("REVOKE")?;
9537 self.expect_keyword(FROM)?;
9538 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9539 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9540 privileges,
9541 target,
9542 roles,
9543 }))
9544 }
9545
9546 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9549 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9550 self.expect_keyword(FROM)?;
9551 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9552 Ok(Statement::RevokeRole(RevokeRoleStatement {
9553 role_names,
9554 member_names,
9555 }))
9556 }
9557
9558 fn expect_grant_target_specification(
9559 &mut self,
9560 statement_type: &str,
9561 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9562 if self.parse_keyword(SYSTEM) {
9563 return Ok(GrantTargetSpecification::System);
9564 }
9565
9566 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9567 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9568 let object_spec_inner = if self.parse_keyword(IN) {
9569 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9570 return parser_err!(
9571 self,
9572 self.peek_prev_pos(),
9573 format!("IN invalid for {object_type}S")
9574 );
9575 }
9576 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9577 DATABASE => GrantTargetSpecificationInner::All(
9578 GrantTargetAllSpecification::AllDatabases {
9579 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9580 },
9581 ),
9582 SCHEMA => {
9583 if object_type == ObjectType::Schema {
9584 self.prev_token();
9585 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9586 }
9587 GrantTargetSpecificationInner::All(
9588 GrantTargetAllSpecification::AllSchemas {
9589 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9590 },
9591 )
9592 }
9593 _ => unreachable!(),
9594 }
9595 } else {
9596 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9597 };
9598 (object_type, object_spec_inner)
9599 } else {
9600 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9601 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9602 names: self
9603 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9604 };
9605 (object_type, object_spec_inner)
9606 };
9607
9608 Ok(GrantTargetSpecification::Object {
9609 object_type,
9610 object_spec_inner,
9611 })
9612 }
9613
9614 fn expect_grant_revoke_object_type(
9617 &mut self,
9618 statement_type: &str,
9619 ) -> Result<ObjectType, ParserError> {
9620 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9622 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9623 }
9624
9625 fn expect_grant_revoke_plural_object_type(
9628 &mut self,
9629 statement_type: &str,
9630 ) -> Result<ObjectType, ParserError> {
9631 let object_type = self.expect_plural_object_type().map_err(|_| {
9632 self.expected::<_, ObjectType>(
9634 self.peek_pos(),
9635 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9636 self.peek_token(),
9637 )
9638 .unwrap_err()
9639 })?;
9640 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9641 Ok(object_type)
9642 }
9643
9644 fn expect_grant_revoke_object_type_inner(
9645 &self,
9646 statement_type: &str,
9647 object_type: ObjectType,
9648 ) -> Result<ObjectType, ParserError> {
9649 match object_type {
9650 ObjectType::View
9651 | ObjectType::MaterializedView
9652 | ObjectType::Source
9653 | ObjectType::ContinualTask => {
9654 parser_err!(
9655 self,
9656 self.peek_prev_pos(),
9657 format!(
9658 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9659 )
9660 )
9661 }
9662 ObjectType::Sink
9663 | ObjectType::Index
9664 | ObjectType::ClusterReplica
9665 | ObjectType::Role
9666 | ObjectType::Func
9667 | ObjectType::Subsource => {
9668 parser_err!(
9669 self,
9670 self.peek_prev_pos(),
9671 format!("Unsupported {statement_type} on {object_type}")
9672 )
9673 }
9674 ObjectType::Table
9675 | ObjectType::Type
9676 | ObjectType::Cluster
9677 | ObjectType::Secret
9678 | ObjectType::Connection
9679 | ObjectType::Database
9680 | ObjectType::Schema
9681 | ObjectType::NetworkPolicy => Ok(object_type),
9682 }
9683 }
9684
9685 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9687 Ok(
9688 match self.expect_one_of_keywords(&[
9689 TABLE,
9690 VIEW,
9691 MATERIALIZED,
9692 SOURCE,
9693 SINK,
9694 INDEX,
9695 TYPE,
9696 ROLE,
9697 USER,
9698 CLUSTER,
9699 SECRET,
9700 CONNECTION,
9701 DATABASE,
9702 SCHEMA,
9703 FUNCTION,
9704 CONTINUAL,
9705 NETWORK,
9706 ])? {
9707 TABLE => ObjectType::Table,
9708 VIEW => ObjectType::View,
9709 MATERIALIZED => {
9710 if let Err(e) = self.expect_keyword(VIEW) {
9711 self.prev_token();
9712 return Err(e);
9713 }
9714 ObjectType::MaterializedView
9715 }
9716 SOURCE => ObjectType::Source,
9717 SINK => ObjectType::Sink,
9718 INDEX => ObjectType::Index,
9719 TYPE => ObjectType::Type,
9720 ROLE | USER => ObjectType::Role,
9721 CLUSTER => {
9722 if self.parse_keyword(REPLICA) {
9723 ObjectType::ClusterReplica
9724 } else {
9725 ObjectType::Cluster
9726 }
9727 }
9728 SECRET => ObjectType::Secret,
9729 CONNECTION => ObjectType::Connection,
9730 DATABASE => ObjectType::Database,
9731 SCHEMA => ObjectType::Schema,
9732 FUNCTION => ObjectType::Func,
9733 CONTINUAL => {
9734 if let Err(e) = self.expect_keyword(TASK) {
9735 self.prev_token();
9736 return Err(e);
9737 }
9738 ObjectType::ContinualTask
9739 }
9740 NETWORK => {
9741 if let Err(e) = self.expect_keyword(POLICY) {
9742 self.prev_token();
9743 return Err(e);
9744 }
9745 ObjectType::NetworkPolicy
9746 }
9747 _ => unreachable!(),
9748 },
9749 )
9750 }
9751
9752 fn parse_object_type(&mut self) -> Option<ObjectType> {
9754 Some(
9755 match self.parse_one_of_keywords(&[
9756 TABLE,
9757 VIEW,
9758 MATERIALIZED,
9759 SOURCE,
9760 SINK,
9761 INDEX,
9762 TYPE,
9763 ROLE,
9764 USER,
9765 CLUSTER,
9766 SECRET,
9767 CONNECTION,
9768 DATABASE,
9769 SCHEMA,
9770 FUNCTION,
9771 ])? {
9772 TABLE => ObjectType::Table,
9773 VIEW => ObjectType::View,
9774 MATERIALIZED => {
9775 if self.parse_keyword(VIEW) {
9776 ObjectType::MaterializedView
9777 } else {
9778 self.prev_token();
9779 return None;
9780 }
9781 }
9782 SOURCE => ObjectType::Source,
9783 SINK => ObjectType::Sink,
9784 INDEX => ObjectType::Index,
9785 TYPE => ObjectType::Type,
9786 ROLE | USER => ObjectType::Role,
9787 CLUSTER => {
9788 if self.parse_keyword(REPLICA) {
9789 ObjectType::ClusterReplica
9790 } else {
9791 ObjectType::Cluster
9792 }
9793 }
9794 SECRET => ObjectType::Secret,
9795 CONNECTION => ObjectType::Connection,
9796 DATABASE => ObjectType::Database,
9797 SCHEMA => ObjectType::Schema,
9798 FUNCTION => ObjectType::Func,
9799 _ => unreachable!(),
9800 },
9801 )
9802 }
9803
9804 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
9806 Ok(
9807 match self.expect_one_of_keywords(&[
9808 TABLES,
9809 VIEWS,
9810 MATERIALIZED,
9811 SOURCES,
9812 SINKS,
9813 INDEXES,
9814 TYPES,
9815 ROLES,
9816 USERS,
9817 CLUSTER,
9818 CLUSTERS,
9819 SECRETS,
9820 CONNECTIONS,
9821 DATABASES,
9822 SCHEMAS,
9823 POLICIES,
9824 ])? {
9825 TABLES => ObjectType::Table,
9826 VIEWS => ObjectType::View,
9827 MATERIALIZED => {
9828 if let Err(e) = self.expect_keyword(VIEWS) {
9829 self.prev_token();
9830 return Err(e);
9831 }
9832 ObjectType::MaterializedView
9833 }
9834 SOURCES => ObjectType::Source,
9835 SINKS => ObjectType::Sink,
9836 INDEXES => ObjectType::Index,
9837 TYPES => ObjectType::Type,
9838 ROLES | USERS => ObjectType::Role,
9839 CLUSTER => {
9840 if let Err(e) = self.expect_keyword(REPLICAS) {
9841 self.prev_token();
9842 return Err(e);
9843 }
9844 ObjectType::ClusterReplica
9845 }
9846 CLUSTERS => ObjectType::Cluster,
9847 SECRETS => ObjectType::Secret,
9848 CONNECTIONS => ObjectType::Connection,
9849 DATABASES => ObjectType::Database,
9850 SCHEMAS => ObjectType::Schema,
9851 POLICIES => ObjectType::NetworkPolicy,
9852 _ => unreachable!(),
9853 },
9854 )
9855 }
9856
9857 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
9859 Some(
9860 match self.parse_one_of_keywords(&[
9861 TABLES,
9862 VIEWS,
9863 MATERIALIZED,
9864 SOURCES,
9865 SINKS,
9866 INDEXES,
9867 TYPES,
9868 ROLES,
9869 USERS,
9870 CLUSTER,
9871 CLUSTERS,
9872 SECRETS,
9873 CONNECTIONS,
9874 DATABASES,
9875 SCHEMAS,
9876 SUBSOURCES,
9877 CONTINUAL,
9878 NETWORK,
9879 ])? {
9880 TABLES => ObjectType::Table,
9881 VIEWS => ObjectType::View,
9882 MATERIALIZED => {
9883 if self.parse_keyword(VIEWS) {
9884 ObjectType::MaterializedView
9885 } else {
9886 self.prev_token();
9887 return None;
9888 }
9889 }
9890 SOURCES => ObjectType::Source,
9891 SINKS => ObjectType::Sink,
9892 INDEXES => ObjectType::Index,
9893 TYPES => ObjectType::Type,
9894 ROLES | USERS => ObjectType::Role,
9895 CLUSTER => {
9896 if self.parse_keyword(REPLICAS) {
9897 ObjectType::ClusterReplica
9898 } else {
9899 self.prev_token();
9900 return None;
9901 }
9902 }
9903 CLUSTERS => ObjectType::Cluster,
9904 SECRETS => ObjectType::Secret,
9905 CONNECTIONS => ObjectType::Connection,
9906 DATABASES => ObjectType::Database,
9907 SCHEMAS => ObjectType::Schema,
9908 SUBSOURCES => ObjectType::Subsource,
9909 CONTINUAL => {
9910 if self.parse_keyword(TASKS) {
9911 ObjectType::ContinualTask
9912 } else {
9913 self.prev_token();
9914 return None;
9915 }
9916 }
9917 NETWORK => {
9918 if self.parse_keyword(POLICIES) {
9919 ObjectType::NetworkPolicy
9920 } else {
9921 self.prev_token();
9922 return None;
9923 }
9924 }
9925 _ => unreachable!(),
9926 },
9927 )
9928 }
9929
9930 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
9933 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9934 return parser_err!(
9935 self,
9936 self.peek_prev_pos(),
9937 format!("For object type {object_type}, you must specify 'TABLES'")
9938 );
9939 }
9940 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9941 self.prev_token();
9942 return parser_err!(
9943 self,
9944 self.peek_prev_pos(),
9945 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9946 );
9947 }
9948
9949 Ok(
9950 match self.expect_one_of_keywords(&[
9951 TABLES,
9952 TYPES,
9953 CLUSTERS,
9954 SECRETS,
9955 CONNECTIONS,
9956 DATABASES,
9957 SCHEMAS,
9958 ])? {
9959 TABLES => ObjectType::Table,
9960 TYPES => ObjectType::Type,
9961 CLUSTERS => ObjectType::Cluster,
9962 SECRETS => ObjectType::Secret,
9963 CONNECTIONS => ObjectType::Connection,
9964 DATABASES => ObjectType::Database,
9965 SCHEMAS => ObjectType::Schema,
9966 _ => unreachable!(),
9967 },
9968 )
9969 }
9970
9971 fn expect_plural_system_object_type_for_privileges(
9974 &mut self,
9975 ) -> Result<SystemObjectType, ParserError> {
9976 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9977 return parser_err!(
9978 self,
9979 self.peek_prev_pos(),
9980 format!("For object type {object_type}, you must specify 'TABLES'")
9981 );
9982 }
9983 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9984 self.prev_token();
9985 return parser_err!(
9986 self,
9987 self.peek_prev_pos(),
9988 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9989 );
9990 }
9991
9992 Ok(
9993 match self.expect_one_of_keywords(&[
9994 SYSTEM,
9995 TABLES,
9996 TYPES,
9997 CLUSTERS,
9998 SECRETS,
9999 CONNECTIONS,
10000 DATABASES,
10001 SCHEMAS,
10002 ])? {
10003 SYSTEM => SystemObjectType::System,
10004 TABLES => SystemObjectType::Object(ObjectType::Table),
10005 TYPES => SystemObjectType::Object(ObjectType::Type),
10006 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
10007 SECRETS => SystemObjectType::Object(ObjectType::Secret),
10008 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
10009 DATABASES => SystemObjectType::Object(ObjectType::Database),
10010 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
10011 _ => unreachable!(),
10012 },
10013 )
10014 }
10015
10016 fn parse_privilege(&mut self) -> Option<Privilege> {
10018 Some(
10019 match self.parse_one_of_keywords(&[
10020 INSERT,
10021 SELECT,
10022 UPDATE,
10023 DELETE,
10024 USAGE,
10025 CREATE,
10026 CREATEROLE,
10027 CREATEDB,
10028 CREATECLUSTER,
10029 CREATENETWORKPOLICY,
10030 ])? {
10031 INSERT => Privilege::INSERT,
10032 SELECT => Privilege::SELECT,
10033 UPDATE => Privilege::UPDATE,
10034 DELETE => Privilege::DELETE,
10035 USAGE => Privilege::USAGE,
10036 CREATE => Privilege::CREATE,
10037 CREATEROLE => Privilege::CREATEROLE,
10038 CREATEDB => Privilege::CREATEDB,
10039 CREATECLUSTER => Privilege::CREATECLUSTER,
10040 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
10041 _ => unreachable!(),
10042 },
10043 )
10044 }
10045
10046 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
10048 if self.parse_keyword(ALL) {
10049 let _ = self.parse_keyword(PRIVILEGES);
10050 return Some(PrivilegeSpecification::All);
10051 }
10052
10053 let mut privileges = Vec::new();
10054 while let Some(privilege) = self.parse_privilege() {
10055 privileges.push(privilege);
10056 if !self.consume_token(&Token::Comma) {
10057 break;
10058 }
10059 }
10060
10061 if privileges.is_empty() {
10062 None
10063 } else {
10064 Some(PrivilegeSpecification::Privileges(privileges))
10065 }
10066 }
10067
10068 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
10070 let _ = self.parse_keyword(GROUP);
10071 self.parse_identifier()
10072 }
10073
10074 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
10077 self.expect_keywords(&[OWNED, BY])?;
10078 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
10079 self.expect_keyword(TO)?;
10080 let new_role = self.parse_identifier()?;
10081 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
10082 old_roles,
10083 new_role,
10084 }))
10085 }
10086
10087 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
10088 self.expect_keyword(ON)?;
10089
10090 let object = match self.expect_one_of_keywords(&[
10091 TABLE,
10092 VIEW,
10093 COLUMN,
10094 MATERIALIZED,
10095 SOURCE,
10096 SINK,
10097 INDEX,
10098 FUNCTION,
10099 CONNECTION,
10100 TYPE,
10101 SECRET,
10102 ROLE,
10103 DATABASE,
10104 SCHEMA,
10105 CLUSTER,
10106 CONTINUAL,
10107 NETWORK,
10108 ])? {
10109 TABLE => {
10110 let name = self.parse_raw_name()?;
10111 CommentObjectType::Table { name }
10112 }
10113 VIEW => {
10114 let name = self.parse_raw_name()?;
10115 CommentObjectType::View { name }
10116 }
10117 MATERIALIZED => {
10118 self.expect_keyword(VIEW)?;
10119 let name = self.parse_raw_name()?;
10120 CommentObjectType::MaterializedView { name }
10121 }
10122 SOURCE => {
10123 let name = self.parse_raw_name()?;
10124 CommentObjectType::Source { name }
10125 }
10126 SINK => {
10127 let name = self.parse_raw_name()?;
10128 CommentObjectType::Sink { name }
10129 }
10130 INDEX => {
10131 let name = self.parse_raw_name()?;
10132 CommentObjectType::Index { name }
10133 }
10134 FUNCTION => {
10135 let name = self.parse_raw_name()?;
10136 CommentObjectType::Func { name }
10137 }
10138 CONNECTION => {
10139 let name = self.parse_raw_name()?;
10140 CommentObjectType::Connection { name }
10141 }
10142 TYPE => {
10143 let ty = self.parse_data_type()?;
10144 CommentObjectType::Type { ty }
10145 }
10146 SECRET => {
10147 let name = self.parse_raw_name()?;
10148 CommentObjectType::Secret { name }
10149 }
10150 ROLE => {
10151 let name = self.parse_identifier()?;
10152 CommentObjectType::Role { name }
10153 }
10154 DATABASE => {
10155 let name = self.parse_database_name()?;
10156 CommentObjectType::Database { name }
10157 }
10158 SCHEMA => {
10159 let name = self.parse_schema_name()?;
10160 CommentObjectType::Schema { name }
10161 }
10162 CLUSTER => {
10163 if self.parse_keyword(REPLICA) {
10164 let name = self.parse_cluster_replica_name()?;
10165 CommentObjectType::ClusterReplica { name }
10166 } else {
10167 let name = self.parse_raw_ident()?;
10168 CommentObjectType::Cluster { name }
10169 }
10170 }
10171 COLUMN => {
10172 let name = self.parse_column_name()?;
10173 CommentObjectType::Column { name }
10174 }
10175 CONTINUAL => {
10176 self.expect_keyword(TASK)?;
10177 let name = self.parse_raw_name()?;
10178 CommentObjectType::ContinualTask { name }
10179 }
10180 NETWORK => {
10181 self.expect_keyword(POLICY)?;
10182 let name = self.parse_raw_network_policy_name()?;
10183 CommentObjectType::NetworkPolicy { name }
10184 }
10185 _ => unreachable!(),
10186 };
10187
10188 self.expect_keyword(IS)?;
10189 let comment = match self.next_token() {
10190 Some(Token::Keyword(NULL)) => None,
10191 Some(Token::String(s)) => Some(s),
10192 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10193 };
10194
10195 Ok(Statement::Comment(CommentStatement { object, comment }))
10196 }
10197
10198 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10199 where
10200 S: TryInto<IdentString>,
10201 <S as TryInto<IdentString>>::Error: fmt::Display,
10202 {
10203 Ident::new(s).map_err(|e| ParserError {
10204 pos: self.peek_prev_pos(),
10205 message: e.to_string(),
10206 })
10207 }
10208}
10209
10210impl CheckedRecursion for Parser<'_> {
10211 fn recursion_guard(&self) -> &RecursionGuard {
10212 &self.recursion_guard
10213 }
10214}
10215
10216enum ParenthesizedFragment {
10220 Query(Query<Raw>),
10221 Exprs(Vec<Expr<Raw>>),
10222}
10223
10224impl ParenthesizedFragment {
10225 fn into_expr(self) -> Expr<Raw> {
10227 match self {
10228 ParenthesizedFragment::Exprs(exprs) => {
10229 if exprs.len() == 1 {
10232 Expr::Nested(Box::new(exprs.into_element()))
10235 } else {
10236 Expr::Row { exprs }
10239 }
10240 }
10241 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10243 }
10244 }
10245}
10246
10247include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));