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