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_always_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 kw if kw.is_sometimes_reserved() => {
7058 return self.expected(
7059 self.peek_prev_pos(),
7060 "a data type name",
7061 Some(Token::Keyword(kw)),
7062 );
7063 }
7064 _ => {
7065 self.prev_token();
7066 RawDataType::Other {
7067 name: RawItemName::Name(self.parse_item_name()?),
7068 typ_mod: self.parse_typ_mod()?,
7069 }
7070 }
7071 },
7072 Some(Token::Ident(_) | Token::LBracket) => {
7073 self.prev_token();
7074 RawDataType::Other {
7075 name: self.parse_raw_name()?,
7076 typ_mod: self.parse_typ_mod()?,
7077 }
7078 }
7079 other => self.expected(self.peek_prev_pos(), "a data type name", other)?,
7080 };
7081
7082 loop {
7083 match self.peek_token() {
7084 Some(Token::Keyword(LIST)) => {
7085 self.next_token();
7086 data_type = RawDataType::List(Box::new(data_type));
7087 }
7088 Some(Token::LBracket) => {
7089 self.next_token();
7092 let _ = self.maybe_parse(|parser| parser.parse_number_value());
7093 self.expect_token(&Token::RBracket)?;
7094 if !matches!(data_type, RawDataType::Array(_)) {
7095 data_type = RawDataType::Array(Box::new(data_type));
7096 }
7097 }
7098 _ => break,
7099 }
7100 }
7101 Ok(data_type)
7102 }
7103
7104 fn parse_typ_mod(&mut self) -> Result<Vec<i64>, ParserError> {
7105 if self.consume_token(&Token::LParen) {
7106 let typ_mod = self.parse_comma_separated(Parser::parse_literal_int)?;
7107 self.expect_token(&Token::RParen)?;
7108 Ok(typ_mod)
7109 } else {
7110 Ok(vec![])
7111 }
7112 }
7113
7114 fn parse_timestamp_precision(&mut self) -> Result<Vec<i64>, ParserError> {
7116 if self.consume_token(&Token::LParen) {
7117 let typ_mod = self.parse_literal_int()?;
7118 self.expect_token(&Token::RParen)?;
7119 Ok(vec![typ_mod])
7120 } else {
7121 Ok(vec![])
7122 }
7123 }
7124
7125 fn parse_optional_alias<F>(&mut self, is_reserved: F) -> Result<Option<Ident>, ParserError>
7129 where
7130 F: FnOnce(Keyword) -> bool,
7131 {
7132 let after_as = self.parse_keyword(AS);
7133 match self.next_token() {
7134 Some(Token::Keyword(OF)) => {
7137 self.prev_token();
7138 if after_as {
7139 self.prev_token();
7140 }
7141 Ok(None)
7142 }
7143 Some(Token::Keyword(kw)) if after_as || !is_reserved(kw) => Ok(Some(kw.into())),
7149 Some(Token::Ident(id)) => Ok(Some(self.new_identifier(id)?)),
7150 not_an_ident => {
7151 if after_as {
7152 return self.expected(
7153 self.peek_prev_pos(),
7154 "an identifier after AS",
7155 not_an_ident,
7156 );
7157 }
7158 self.prev_token();
7159 Ok(None) }
7161 }
7162 }
7163
7164 fn parse_optional_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
7169 match self.parse_optional_alias(Keyword::is_reserved_in_table_alias)? {
7170 Some(name) => {
7171 let columns = self.parse_parenthesized_column_list(Optional)?;
7172 Ok(Some(TableAlias {
7173 name,
7174 columns,
7175 strict: false,
7176 }))
7177 }
7178 None => Ok(None),
7179 }
7180 }
7181
7182 fn parse_deferred_item_name(&mut self) -> Result<DeferredItemName<Raw>, ParserError> {
7183 Ok(match self.parse_raw_name()? {
7184 named @ RawItemName::Id(..) => DeferredItemName::Named(named),
7185 RawItemName::Name(name) => DeferredItemName::Deferred(name),
7186 })
7187 }
7188
7189 fn parse_raw_name(&mut self) -> Result<RawItemName, ParserError> {
7190 if self.consume_token(&Token::LBracket) {
7191 let id = match self.next_token() {
7192 Some(Token::Ident(id)) => id.into_inner(),
7193 _ => return parser_err!(self, self.peek_prev_pos(), "expected id"),
7194 };
7195 self.expect_keyword(AS)?;
7196 let name = self.parse_item_name()?;
7197 if name.0.len() < 2 {
7199 return parser_err!(
7200 self,
7201 self.peek_prev_pos(),
7202 "table name in square brackets must be fully qualified"
7203 );
7204 }
7205
7206 let version = if self.parse_keywords(&[VERSION]) {
7207 let version = self.parse_version()?;
7208 Some(version)
7209 } else {
7210 None
7211 };
7212
7213 self.expect_token(&Token::RBracket)?;
7214 Ok(RawItemName::Id(id, name, version))
7215 } else {
7216 Ok(RawItemName::Name(self.parse_item_name()?))
7217 }
7218 }
7219
7220 fn parse_column_name(&mut self) -> Result<ColumnName<Raw>, ParserError> {
7221 let start = self.peek_pos();
7222 let mut item_name = self.parse_raw_name()?;
7223 let column_name = match &mut item_name {
7224 RawItemName::Name(UnresolvedItemName(identifiers)) => {
7225 if identifiers.len() < 2 {
7226 return Err(ParserError::new(
7227 start,
7228 "need to specify an object and a column",
7229 ));
7230 }
7231 identifiers.pop().unwrap()
7232 }
7233 RawItemName::Id(_, _, _) => {
7234 self.expect_token(&Token::Dot)?;
7235 self.parse_identifier()?
7236 }
7237 };
7238
7239 Ok(ColumnName {
7240 relation: item_name,
7241 column: column_name,
7242 })
7243 }
7244
7245 fn parse_database_name(&mut self) -> Result<UnresolvedDatabaseName, ParserError> {
7248 Ok(UnresolvedDatabaseName(self.parse_identifier()?))
7249 }
7250
7251 fn parse_schema_name(&mut self) -> Result<UnresolvedSchemaName, ParserError> {
7254 Ok(UnresolvedSchemaName(self.parse_identifiers()?))
7255 }
7256
7257 fn parse_item_name(&mut self) -> Result<UnresolvedItemName, ParserError> {
7260 Ok(UnresolvedItemName(self.parse_identifiers()?))
7261 }
7262
7263 fn parse_object_name(
7265 &mut self,
7266 object_type: ObjectType,
7267 ) -> Result<UnresolvedObjectName, ParserError> {
7268 Ok(match object_type {
7269 ObjectType::Table
7270 | ObjectType::View
7271 | ObjectType::MaterializedView
7272 | ObjectType::Source
7273 | ObjectType::Subsource
7274 | ObjectType::Sink
7275 | ObjectType::Index
7276 | ObjectType::Type
7277 | ObjectType::Secret
7278 | ObjectType::Connection
7279 | ObjectType::Func
7280 | ObjectType::ContinualTask => UnresolvedObjectName::Item(self.parse_item_name()?),
7281 ObjectType::Role => UnresolvedObjectName::Role(self.parse_identifier()?),
7282 ObjectType::Cluster => UnresolvedObjectName::Cluster(self.parse_identifier()?),
7283 ObjectType::ClusterReplica => {
7284 UnresolvedObjectName::ClusterReplica(self.parse_cluster_replica_name()?)
7285 }
7286 ObjectType::Database => UnresolvedObjectName::Database(self.parse_database_name()?),
7287 ObjectType::Schema => UnresolvedObjectName::Schema(self.parse_schema_name()?),
7288 ObjectType::NetworkPolicy => {
7289 UnresolvedObjectName::NetworkPolicy(self.parse_identifier()?)
7290 }
7291 })
7292 }
7293
7294 fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
7296 let mut idents = vec![];
7297 loop {
7298 idents.push(self.parse_identifier()?);
7299 if !self.consume_token(&Token::Dot) {
7300 break;
7301 }
7302 }
7303 Ok(idents)
7304 }
7305
7306 fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
7308 match self.consume_identifier()? {
7309 Some(id) => {
7310 if id.as_str().is_empty() {
7311 return parser_err!(
7312 self,
7313 self.peek_prev_pos(),
7314 "zero-length delimited identifier",
7315 );
7316 }
7317 Ok(id)
7318 }
7319 None => self.expected(self.peek_pos(), "identifier", self.peek_token()),
7320 }
7321 }
7322
7323 fn consume_identifier(&mut self) -> Result<Option<Ident>, ParserError> {
7324 match self.peek_token() {
7325 Some(Token::Keyword(kw)) => {
7326 self.next_token();
7327 Ok(Some(kw.into()))
7328 }
7329 Some(Token::Ident(id)) => {
7330 self.next_token();
7331 Ok(Some(self.new_identifier(id)?))
7332 }
7333 _ => Ok(None),
7334 }
7335 }
7336
7337 fn parse_qualified_identifier(&mut self, id: Ident) -> Result<Expr<Raw>, ParserError> {
7338 let mut id_parts = vec![id];
7339 match self.peek_token() {
7340 Some(Token::LParen) | Some(Token::Dot) => {
7341 let mut ends_with_wildcard = false;
7342 while self.consume_token(&Token::Dot) {
7343 match self.next_token() {
7344 Some(Token::Keyword(kw)) => id_parts.push(kw.into()),
7345 Some(Token::Ident(id)) => id_parts.push(self.new_identifier(id)?),
7346 Some(Token::Star) => {
7347 ends_with_wildcard = true;
7348 break;
7349 }
7350 unexpected => {
7351 return self.expected(
7352 self.peek_prev_pos(),
7353 "an identifier or a '*' after '.'",
7354 unexpected,
7355 );
7356 }
7357 }
7358 }
7359 if ends_with_wildcard {
7360 Ok(Expr::QualifiedWildcard(id_parts))
7361 } else if self.peek_token() == Some(Token::LParen) {
7362 let function =
7363 self.parse_function(RawItemName::Name(UnresolvedItemName(id_parts)))?;
7364 Ok(Expr::Function(function))
7365 } else {
7366 Ok(Expr::Identifier(id_parts))
7367 }
7368 }
7369 _ => Ok(Expr::Identifier(id_parts)),
7370 }
7371 }
7372
7373 fn parse_parenthesized_column_list(
7375 &mut self,
7376 optional: IsOptional,
7377 ) -> Result<Vec<Ident>, ParserError> {
7378 if self.consume_token(&Token::LParen) {
7379 let cols = self.parse_comma_separated(Parser::parse_identifier)?;
7380 self.expect_token(&Token::RParen)?;
7381 Ok(cols)
7382 } else if optional == Optional {
7383 Ok(vec![])
7384 } else {
7385 self.expected(
7386 self.peek_pos(),
7387 "a list of columns in parentheses",
7388 self.peek_token(),
7389 )
7390 }
7391 }
7392
7393 fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
7394 if self.consume_token(&Token::LParen) {
7395 let n = self.parse_literal_uint()?;
7396 self.expect_token(&Token::RParen)?;
7397 Ok(Some(n))
7398 } else {
7399 Ok(None)
7400 }
7401 }
7402
7403 fn parse_map_type(&mut self) -> Result<RawDataType, ParserError> {
7404 self.expect_token(&Token::LBracket)?;
7405 let key_type = Box::new(self.parse_data_type()?);
7406 self.expect_token(&Token::Arrow)?;
7407 let value_type = Box::new(self.parse_data_type()?);
7408 self.expect_token(&Token::RBracket)?;
7409 Ok(RawDataType::Map {
7410 key_type,
7411 value_type,
7412 })
7413 }
7414
7415 fn parse_delete(&mut self) -> Result<Statement<Raw>, ParserError> {
7416 self.expect_keyword(FROM)?;
7417 let table_name = RawItemName::Name(self.parse_item_name()?);
7418 let alias = self.parse_optional_table_alias()?;
7419 let using = if self.parse_keyword(USING) {
7420 self.parse_comma_separated(Parser::parse_table_and_joins)?
7421 } else {
7422 vec![]
7423 };
7424 let selection = if self.parse_keyword(WHERE) {
7425 Some(self.parse_expr()?)
7426 } else {
7427 None
7428 };
7429
7430 Ok(Statement::Delete(DeleteStatement {
7431 table_name,
7432 alias,
7433 using,
7434 selection,
7435 }))
7436 }
7437
7438 fn parse_select_statement(&mut self) -> Result<SelectStatement<Raw>, ParserError> {
7440 Ok(SelectStatement {
7441 query: self.parse_query()?,
7442 as_of: self.parse_optional_as_of()?,
7443 })
7444 }
7445
7446 fn parse_query(&mut self) -> Result<Query<Raw>, ParserError> {
7451 self.checked_recur_mut(|parser| {
7452 let cte_block = if parser.parse_keyword(WITH) {
7453 if parser.parse_keyword(MUTUALLY) {
7454 parser.expect_keyword(RECURSIVE)?;
7455 let options = if parser.consume_token(&Token::LParen) {
7456 let options =
7457 parser.parse_comma_separated(Self::parse_mut_rec_block_option)?;
7458 parser.expect_token(&Token::RParen)?;
7459 options
7460 } else {
7461 vec![]
7462 };
7463 CteBlock::MutuallyRecursive(MutRecBlock {
7464 options,
7465 ctes: parser.parse_comma_separated(Parser::parse_cte_mut_rec)?,
7466 })
7467 } else {
7468 CteBlock::Simple(parser.parse_comma_separated(Parser::parse_cte)?)
7470 }
7471 } else {
7472 CteBlock::empty()
7473 };
7474
7475 let body = parser.parse_query_body(SetPrecedence::Zero)?;
7476
7477 parser.parse_query_tail(cte_block, body)
7478 })
7479 }
7480
7481 fn parse_mut_rec_block_option(&mut self) -> Result<MutRecBlockOption<Raw>, ParserError> {
7482 match self.expect_one_of_keywords(&[RECURSION, RETURN, ERROR])? {
7483 RECURSION => {
7484 self.expect_keyword(LIMIT)?;
7485 Ok(MutRecBlockOption {
7486 name: MutRecBlockOptionName::RecursionLimit,
7487 value: self.parse_optional_option_value()?,
7488 })
7489 }
7490 RETURN => {
7491 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7492 Ok(MutRecBlockOption {
7493 name: MutRecBlockOptionName::ReturnAtRecursionLimit,
7494 value: self.parse_optional_option_value()?,
7495 })
7496 }
7497 ERROR => {
7498 self.expect_keywords(&[AT, RECURSION, LIMIT])?;
7499 Ok(MutRecBlockOption {
7500 name: MutRecBlockOptionName::ErrorAtRecursionLimit,
7501 value: self.parse_optional_option_value()?,
7502 })
7503 }
7504 _ => unreachable!(),
7505 }
7506 }
7507
7508 fn parse_query_tail(
7509 &mut self,
7510 ctes: CteBlock<Raw>,
7511 body: SetExpr<Raw>,
7512 ) -> Result<Query<Raw>, ParserError> {
7513 let (inner_ctes, inner_order_by, inner_limit, inner_offset, body) = match body {
7514 SetExpr::Query(query) => {
7515 let Query {
7516 ctes,
7517 body,
7518 order_by,
7519 limit,
7520 offset,
7521 } = *query;
7522 (ctes, order_by, limit, offset, body)
7523 }
7524 _ => (CteBlock::empty(), vec![], None, None, body),
7525 };
7526
7527 let ctes = if ctes.is_empty() {
7528 inner_ctes
7529 } else if !inner_ctes.is_empty() {
7530 return parser_err!(self, self.peek_pos(), "multiple WITH clauses not allowed");
7531 } else {
7532 ctes
7533 };
7534
7535 let order_by = if self.parse_keywords(&[ORDER, BY]) {
7536 if !inner_order_by.is_empty() {
7537 return parser_err!(
7538 self,
7539 self.peek_prev_pos(),
7540 "multiple ORDER BY clauses not allowed"
7541 );
7542 }
7543 self.parse_comma_separated(Parser::parse_order_by_expr)?
7544 } else {
7545 inner_order_by
7546 };
7547
7548 let mut limit = inner_limit;
7552 let mut offset = inner_offset;
7553 while let Some(parsed_keyword) = self.parse_one_of_keywords(&[LIMIT, OFFSET, FETCH]) {
7554 match parsed_keyword {
7555 LIMIT => {
7556 if limit.is_some() {
7557 return parser_err!(
7558 self,
7559 self.peek_prev_pos(),
7560 "multiple LIMIT/FETCH clauses not allowed"
7561 );
7562 }
7563 limit = if self.parse_keyword(ALL) {
7564 None
7565 } else {
7566 Some(Limit {
7567 with_ties: false,
7568 quantity: self.parse_expr()?,
7569 })
7570 };
7571 }
7572 OFFSET => {
7573 if offset.is_some() {
7574 return parser_err!(
7575 self,
7576 self.peek_prev_pos(),
7577 "multiple OFFSET clauses not allowed"
7578 );
7579 }
7580 let value = self.parse_expr()?;
7581 let _ = self.parse_one_of_keywords(&[ROW, ROWS]);
7582 offset = Some(value);
7583 }
7584 FETCH => {
7585 if limit.is_some() {
7586 return parser_err!(
7587 self,
7588 self.peek_prev_pos(),
7589 "multiple LIMIT/FETCH clauses not allowed"
7590 );
7591 }
7592 self.expect_one_of_keywords(&[FIRST, NEXT])?;
7593 let quantity = if self.parse_one_of_keywords(&[ROW, ROWS]).is_some() {
7594 Expr::Value(Value::Number('1'.into()))
7595 } else {
7596 let quantity = self.parse_expr()?;
7597 self.expect_one_of_keywords(&[ROW, ROWS])?;
7598 quantity
7599 };
7600 let with_ties = if self.parse_keyword(ONLY) {
7601 false
7602 } else if self.parse_keywords(&[WITH, TIES]) {
7603 true
7604 } else {
7605 return self.expected(
7606 self.peek_pos(),
7607 "one of ONLY or WITH TIES",
7608 self.peek_token(),
7609 );
7610 };
7611 limit = Some(Limit {
7612 with_ties,
7613 quantity,
7614 });
7615 }
7616 _ => unreachable!(),
7617 }
7618 }
7619
7620 Ok(Query {
7621 ctes,
7622 body,
7623 order_by,
7624 limit,
7625 offset,
7626 })
7627 }
7628
7629 fn parse_cte(&mut self) -> Result<Cte<Raw>, ParserError> {
7631 let alias = TableAlias {
7632 name: self.parse_identifier()?,
7633 columns: self.parse_parenthesized_column_list(Optional)?,
7634 strict: false,
7635 };
7636 self.expect_keyword(AS)?;
7637 self.expect_token(&Token::LParen)?;
7638 let query = self.parse_query()?;
7639 self.expect_token(&Token::RParen)?;
7640 Ok(Cte {
7641 alias,
7642 query,
7643 id: (),
7644 })
7645 }
7646
7647 fn parse_cte_mut_rec(&mut self) -> Result<CteMutRec<Raw>, ParserError> {
7653 let name = self.parse_identifier()?;
7654 self.expect_token(&Token::LParen)?;
7655 let columns = self.parse_comma_separated(|parser| {
7656 Ok(CteMutRecColumnDef {
7657 name: parser.parse_identifier()?,
7658 data_type: parser.parse_data_type()?,
7659 })
7660 })?;
7661 self.expect_token(&Token::RParen)?;
7662 self.expect_keyword(AS)?;
7663 self.expect_token(&Token::LParen)?;
7664 let query = self.parse_query()?;
7665 self.expect_token(&Token::RParen)?;
7666 Ok(CteMutRec {
7667 name,
7668 columns,
7669 query,
7670 id: (),
7671 })
7672 }
7673
7674 fn parse_query_body(&mut self, precedence: SetPrecedence) -> Result<SetExpr<Raw>, ParserError> {
7683 let expr = if self.parse_keyword(SELECT) {
7686 SetExpr::Select(Box::new(self.parse_select()?))
7687 } else if self.consume_token(&Token::LParen) {
7688 let subquery = self.parse_query()?;
7690 self.expect_token(&Token::RParen)?;
7691 SetExpr::Query(Box::new(subquery))
7692 } else if self.parse_keyword(VALUES) {
7693 SetExpr::Values(self.parse_values()?)
7694 } else if self.parse_keyword(SHOW) {
7695 SetExpr::Show(self.parse_show()?)
7696 } else if self.parse_keyword(TABLE) {
7697 SetExpr::Table(self.parse_raw_name()?)
7698 } else {
7699 return self.expected(
7700 self.peek_pos(),
7701 "SELECT, VALUES, or a subquery in the query body",
7702 self.peek_token(),
7703 );
7704 };
7705
7706 self.parse_query_body_seeded(precedence, expr)
7707 }
7708
7709 fn parse_query_body_seeded(
7710 &mut self,
7711 precedence: SetPrecedence,
7712 mut expr: SetExpr<Raw>,
7713 ) -> Result<SetExpr<Raw>, ParserError> {
7714 loop {
7715 let next_token = self.peek_token();
7717 let op = self.parse_set_operator(&next_token);
7718 let next_precedence = match op {
7719 Some(SetOperator::Union) | Some(SetOperator::Except) => SetPrecedence::UnionExcept,
7721 Some(SetOperator::Intersect) => SetPrecedence::Intersect,
7723 None => break,
7725 };
7726 if precedence >= next_precedence {
7727 break;
7728 }
7729 self.next_token(); let all = self.parse_keyword(ALL);
7732 let distinct = self.parse_keyword(DISTINCT);
7733 if all && distinct {
7734 return parser_err!(
7735 self,
7736 self.peek_prev_pos(),
7737 "Cannot specify both ALL and DISTINCT in set operation"
7738 );
7739 }
7740 expr = SetExpr::SetOperation {
7741 left: Box::new(expr),
7742 op: op.unwrap(),
7743 all,
7744 right: Box::new(self.parse_query_body(next_precedence)?),
7745 };
7746 }
7747
7748 Ok(expr)
7749 }
7750
7751 fn parse_set_operator(&self, token: &Option<Token>) -> Option<SetOperator> {
7752 match token {
7753 Some(Token::Keyword(UNION)) => Some(SetOperator::Union),
7754 Some(Token::Keyword(EXCEPT)) => Some(SetOperator::Except),
7755 Some(Token::Keyword(INTERSECT)) => Some(SetOperator::Intersect),
7756 _ => None,
7757 }
7758 }
7759
7760 fn parse_select(&mut self) -> Result<Select<Raw>, ParserError> {
7763 let all = self.parse_keyword(ALL);
7764 let distinct = self.parse_keyword(DISTINCT);
7765 if all && distinct {
7766 return parser_err!(
7767 self,
7768 self.peek_prev_pos(),
7769 "Cannot specify both ALL and DISTINCT in SELECT"
7770 );
7771 }
7772 let distinct = if distinct && self.parse_keyword(ON) {
7773 self.expect_token(&Token::LParen)?;
7774 let exprs = self.parse_comma_separated(Parser::parse_expr)?;
7775 self.expect_token(&Token::RParen)?;
7776 Some(Distinct::On(exprs))
7777 } else if distinct {
7778 Some(Distinct::EntireRow)
7779 } else {
7780 None
7781 };
7782
7783 let projection = match self.peek_token() {
7784 Some(Token::Keyword(kw)) if kw.is_always_reserved() || kw == AS => vec![],
7788 Some(Token::Semicolon) | Some(Token::RParen) | None => vec![],
7789 _ => {
7790 let mut projection = vec![];
7791 loop {
7792 projection.push(self.parse_select_item()?);
7793 if !self.consume_token(&Token::Comma) {
7794 break;
7795 }
7796 if self.peek_keyword(FROM) {
7797 return parser_err!(
7798 self,
7799 self.peek_prev_pos(),
7800 "invalid trailing comma in SELECT list",
7801 );
7802 }
7803 }
7804 projection
7805 }
7806 };
7807
7808 let from = if self.parse_keyword(FROM) {
7814 self.parse_comma_separated(Parser::parse_table_and_joins)?
7815 } else {
7816 vec![]
7817 };
7818
7819 let selection = if self.parse_keyword(WHERE) {
7820 Some(self.parse_expr()?)
7821 } else {
7822 None
7823 };
7824
7825 let group_by = if self.parse_keywords(&[GROUP, BY]) {
7826 self.parse_comma_separated(Parser::parse_expr)?
7827 } else {
7828 vec![]
7829 };
7830
7831 let having = if self.parse_keyword(HAVING) {
7832 Some(self.parse_expr()?)
7833 } else {
7834 None
7835 };
7836
7837 let qualify = if self.parse_keyword(QUALIFY) {
7838 Some(self.parse_expr()?)
7839 } else {
7840 None
7841 };
7842
7843 let options = if self.parse_keyword(OPTIONS) {
7844 self.expect_token(&Token::LParen)?;
7845 let options = self.parse_comma_separated(Self::parse_select_option)?;
7846 self.expect_token(&Token::RParen)?;
7847 options
7848 } else {
7849 vec![]
7850 };
7851
7852 Ok(Select {
7853 distinct,
7854 projection,
7855 from,
7856 selection,
7857 group_by,
7858 having,
7859 qualify,
7860 options,
7861 })
7862 }
7863
7864 fn parse_select_option(&mut self) -> Result<SelectOption<Raw>, ParserError> {
7865 let name = match self.expect_one_of_keywords(&[EXPECTED, AGGREGATE, DISTINCT, LIMIT])? {
7866 EXPECTED => {
7867 self.expect_keywords(&[GROUP, SIZE])?;
7868 SelectOptionName::ExpectedGroupSize
7869 }
7870 AGGREGATE => {
7871 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7872 SelectOptionName::AggregateInputGroupSize
7873 }
7874 DISTINCT => {
7875 self.expect_keywords(&[ON, INPUT, GROUP, SIZE])?;
7876 SelectOptionName::DistinctOnInputGroupSize
7877 }
7878 LIMIT => {
7879 self.expect_keywords(&[INPUT, GROUP, SIZE])?;
7880 SelectOptionName::LimitInputGroupSize
7881 }
7882 _ => unreachable!(),
7883 };
7884 Ok(SelectOption {
7885 name,
7886 value: self.parse_optional_option_value()?,
7887 })
7888 }
7889
7890 fn parse_set(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
7891 let modifier = self.parse_one_of_keywords(&[SESSION, LOCAL]);
7892 let mut variable = self.parse_identifier().map_no_statement_parser_err()?;
7893 let mut normal = self.consume_token(&Token::Eq) || self.parse_keyword(TO);
7894 if !normal {
7895 match variable.as_str().parse() {
7896 Ok(TIME) => {
7897 self.expect_keyword(ZONE).map_no_statement_parser_err()?;
7898 variable = ident!("timezone");
7899 normal = true;
7900 }
7901 Ok(NAMES) => {
7902 variable = ident!("client_encoding");
7903 normal = true;
7904 }
7905 _ => {}
7906 }
7907 }
7908 if variable.as_str().parse() == Ok(SCHEMA) {
7909 variable = ident!("search_path");
7910 let to = self
7911 .parse_set_schema_to()
7912 .map_parser_err(StatementKind::SetVariable)?;
7913 Ok(Statement::SetVariable(SetVariableStatement {
7914 local: modifier == Some(LOCAL),
7915 variable,
7916 to,
7917 }))
7918 } else if normal {
7919 let to = self
7920 .parse_set_variable_to()
7921 .map_parser_err(StatementKind::SetVariable)?;
7922 Ok(Statement::SetVariable(SetVariableStatement {
7923 local: modifier == Some(LOCAL),
7924 variable,
7925 to,
7926 }))
7927 } else if variable.as_str().parse() == Ok(TRANSACTION) && modifier.is_none() {
7928 Ok(Statement::SetTransaction(SetTransactionStatement {
7930 local: true,
7931 modes: self
7932 .parse_transaction_modes(true)
7933 .map_parser_err(StatementKind::SetTransaction)?,
7934 }))
7935 } else if modifier == Some(SESSION)
7936 && variable.as_str().parse() == Ok(CHARACTERISTICS)
7937 && self.parse_keywords(&[AS, TRANSACTION])
7938 {
7939 Ok(Statement::SetTransaction(SetTransactionStatement {
7941 local: false,
7942 modes: self
7943 .parse_transaction_modes(true)
7944 .map_parser_err(StatementKind::SetTransaction)?,
7945 }))
7946 } else {
7947 self.expected(self.peek_pos(), "equals sign or TO", self.peek_token())
7948 .map_no_statement_parser_err()
7949 }
7950 }
7951
7952 fn parse_set_schema_to(&mut self) -> Result<SetVariableTo, ParserError> {
7953 if self.parse_keyword(DEFAULT) {
7954 Ok(SetVariableTo::Default)
7955 } else {
7956 let to = self.parse_set_variable_value()?;
7957 Ok(SetVariableTo::Values(vec![to]))
7958 }
7959 }
7960
7961 fn parse_set_variable_to(&mut self) -> Result<SetVariableTo, ParserError> {
7962 if self.parse_keyword(DEFAULT) {
7963 Ok(SetVariableTo::Default)
7964 } else {
7965 Ok(SetVariableTo::Values(
7966 self.parse_comma_separated(Parser::parse_set_variable_value)?,
7967 ))
7968 }
7969 }
7970
7971 fn parse_set_variable_value(&mut self) -> Result<SetVariableValue, ParserError> {
7972 if let Some(value) = self.maybe_parse(Parser::parse_value) {
7973 Ok(SetVariableValue::Literal(value))
7974 } else if let Some(ident) = self.maybe_parse(Parser::parse_identifier) {
7975 Ok(SetVariableValue::Ident(ident))
7976 } else {
7977 self.expected(self.peek_pos(), "variable value", self.peek_token())
7978 }
7979 }
7980
7981 fn parse_reset(&mut self) -> Result<Statement<Raw>, ParserError> {
7982 let mut variable = self.parse_identifier()?;
7983 if variable.as_str().parse() == Ok(SCHEMA) {
7984 variable = ident!("search_path");
7985 }
7986 Ok(Statement::ResetVariable(ResetVariableStatement {
7987 variable,
7988 }))
7989 }
7990
7991 fn parse_show(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
7992 let redacted = self.parse_keyword(REDACTED);
7993 if redacted && !self.peek_keyword(CREATE) {
7994 return parser_err!(
7995 self,
7996 self.peek_pos(),
7997 "SHOW REDACTED is only supported for SHOW REDACTED CREATE ..."
7998 );
7999 }
8000 if self.parse_one_of_keywords(&[COLUMNS, FIELDS]).is_some() {
8001 self.parse_show_columns()
8002 } else if self.parse_keyword(OBJECTS) {
8003 let from = if self.parse_keywords(&[FROM]) {
8004 Some(self.parse_schema_name()?)
8005 } else {
8006 None
8007 };
8008 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8009 object_type: ShowObjectType::Object,
8010 from,
8011 filter: self.parse_show_statement_filter()?,
8012 }))
8013 } else if let Some(object_type) = self.parse_plural_object_type() {
8014 let from = if object_type.lives_in_schema() {
8015 if self.parse_keywords(&[FROM]) {
8016 Some(self.parse_schema_name()?)
8017 } else {
8018 None
8019 }
8020 } else {
8021 None
8022 };
8023
8024 let show_object_type = match object_type {
8025 ObjectType::Database => ShowObjectType::Database,
8026 ObjectType::Schema => {
8027 let from = if self.parse_keyword(FROM) {
8028 Some(self.parse_database_name()?)
8029 } else {
8030 None
8031 };
8032 ShowObjectType::Schema { from }
8033 }
8034 ObjectType::Table => {
8035 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8036 Some(self.parse_raw_name()?)
8037 } else {
8038 None
8039 };
8040 ShowObjectType::Table { on_source }
8041 }
8042 ObjectType::View => ShowObjectType::View,
8043 ObjectType::Source => {
8044 let in_cluster = self.parse_optional_in_cluster()?;
8045 ShowObjectType::Source { in_cluster }
8046 }
8047 ObjectType::Subsource => {
8048 let on_source = if self.parse_one_of_keywords(&[ON]).is_some() {
8049 Some(self.parse_raw_name()?)
8050 } else {
8051 None
8052 };
8053
8054 if from.is_some() && on_source.is_some() {
8055 return parser_err!(
8056 self,
8057 self.peek_prev_pos(),
8058 "Cannot specify both FROM and ON"
8059 );
8060 }
8061
8062 ShowObjectType::Subsource { on_source }
8063 }
8064 ObjectType::Sink => {
8065 let in_cluster = self.parse_optional_in_cluster()?;
8066 ShowObjectType::Sink { in_cluster }
8067 }
8068 ObjectType::Type => ShowObjectType::Type,
8069 ObjectType::Role => ShowObjectType::Role,
8070 ObjectType::ClusterReplica => ShowObjectType::ClusterReplica,
8071 ObjectType::Secret => ShowObjectType::Secret,
8072 ObjectType::Connection => ShowObjectType::Connection,
8073 ObjectType::Cluster => ShowObjectType::Cluster,
8074 ObjectType::NetworkPolicy => ShowObjectType::NetworkPolicy,
8075 ObjectType::MaterializedView => {
8076 let in_cluster = self.parse_optional_in_cluster()?;
8077 ShowObjectType::MaterializedView { in_cluster }
8078 }
8079 ObjectType::ContinualTask => {
8080 let in_cluster = self.parse_optional_in_cluster()?;
8081 ShowObjectType::ContinualTask { in_cluster }
8082 }
8083 ObjectType::Index => {
8084 let on_object = if self.parse_one_of_keywords(&[ON]).is_some() {
8085 Some(self.parse_raw_name()?)
8086 } else {
8087 None
8088 };
8089
8090 if from.is_some() && on_object.is_some() {
8091 return parser_err!(
8092 self,
8093 self.peek_prev_pos(),
8094 "Cannot specify both FROM and ON"
8095 );
8096 }
8097
8098 let in_cluster = self.parse_optional_in_cluster()?;
8099 ShowObjectType::Index {
8100 in_cluster,
8101 on_object,
8102 }
8103 }
8104 ObjectType::Func => {
8105 return parser_err!(
8106 self,
8107 self.peek_prev_pos(),
8108 format!("Unsupported SHOW on {object_type}")
8109 );
8110 }
8111 };
8112 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8113 object_type: show_object_type,
8114 from,
8115 filter: self.parse_show_statement_filter()?,
8116 }))
8117 } else if self.parse_keyword(CLUSTER) {
8118 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8119 variable: ident!("cluster"),
8120 }))
8121 } else if self.parse_keyword(PRIVILEGES) {
8122 self.parse_show_privileges()
8123 } else if self.parse_keywords(&[DEFAULT, PRIVILEGES]) {
8124 self.parse_show_default_privileges()
8125 } else if self.parse_keyword(ROLE) {
8126 self.expect_keyword(MEMBERSHIP)?;
8127 let role = if self.parse_keyword(FOR) {
8128 Some(self.parse_identifier()?)
8129 } else {
8130 None
8131 };
8132 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8133 object_type: ShowObjectType::RoleMembership { role },
8134 from: None,
8135 filter: self.parse_show_statement_filter()?,
8136 }))
8137 } else if self.parse_keywords(&[CREATE, VIEW]) {
8138 Ok(ShowStatement::ShowCreateView(ShowCreateViewStatement {
8139 view_name: self.parse_raw_name()?,
8140 redacted,
8141 }))
8142 } else if self.parse_keywords(&[CREATE, MATERIALIZED, VIEW]) {
8143 Ok(ShowStatement::ShowCreateMaterializedView(
8144 ShowCreateMaterializedViewStatement {
8145 materialized_view_name: self.parse_raw_name()?,
8146 redacted,
8147 },
8148 ))
8149 } else if self.parse_keywords(&[CREATE, SOURCE]) {
8150 Ok(ShowStatement::ShowCreateSource(ShowCreateSourceStatement {
8151 source_name: self.parse_raw_name()?,
8152 redacted,
8153 }))
8154 } else if self.parse_keywords(&[CREATE, TABLE]) {
8155 Ok(ShowStatement::ShowCreateTable(ShowCreateTableStatement {
8156 table_name: self.parse_raw_name()?,
8157 redacted,
8158 }))
8159 } else if self.parse_keywords(&[CREATE, SINK]) {
8160 Ok(ShowStatement::ShowCreateSink(ShowCreateSinkStatement {
8161 sink_name: self.parse_raw_name()?,
8162 redacted,
8163 }))
8164 } else if self.parse_keywords(&[CREATE, INDEX]) {
8165 Ok(ShowStatement::ShowCreateIndex(ShowCreateIndexStatement {
8166 index_name: self.parse_raw_name()?,
8167 redacted,
8168 }))
8169 } else if self.parse_keywords(&[CREATE, CONNECTION]) {
8170 Ok(ShowStatement::ShowCreateConnection(
8171 ShowCreateConnectionStatement {
8172 connection_name: self.parse_raw_name()?,
8173 redacted,
8174 },
8175 ))
8176 } else if self.parse_keywords(&[CREATE, CLUSTER]) {
8177 if redacted {
8178 return parser_err!(
8179 self,
8180 self.peek_prev_pos(),
8181 "SHOW REDACTED CREATE CLUSTER is not supported"
8182 );
8183 }
8184 Ok(ShowStatement::ShowCreateCluster(
8185 ShowCreateClusterStatement {
8186 cluster_name: RawClusterName::Unresolved(self.parse_identifier()?),
8187 },
8188 ))
8189 } else if self.parse_keywords(&[CREATE, TYPE]) {
8190 Ok(ShowStatement::ShowCreateType(ShowCreateTypeStatement {
8191 type_name: self.parse_data_type()?,
8192 redacted,
8193 }))
8194 } else {
8195 let variable = if self.parse_keywords(&[TRANSACTION, ISOLATION, LEVEL]) {
8196 ident!("transaction_isolation")
8197 } else if self.parse_keywords(&[TIME, ZONE]) {
8198 ident!("timezone")
8199 } else {
8200 self.parse_identifier()?
8201 };
8202 Ok(ShowStatement::ShowVariable(ShowVariableStatement {
8203 variable,
8204 }))
8205 }
8206 }
8207
8208 fn parse_show_columns(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8209 self.expect_one_of_keywords(&[FROM, IN])?;
8210 let table_name = self.parse_raw_name()?;
8211 let filter = self.parse_show_statement_filter()?;
8215 Ok(ShowStatement::ShowColumns(ShowColumnsStatement {
8216 table_name,
8217 filter,
8218 }))
8219 }
8220
8221 fn parse_show_statement_filter(
8222 &mut self,
8223 ) -> Result<Option<ShowStatementFilter<Raw>>, ParserError> {
8224 if self.parse_keyword(LIKE) {
8225 Ok(Some(ShowStatementFilter::Like(
8226 self.parse_literal_string()?,
8227 )))
8228 } else if self.parse_keyword(WHERE) {
8229 Ok(Some(ShowStatementFilter::Where(self.parse_expr()?)))
8230 } else {
8231 Ok(None)
8232 }
8233 }
8234
8235 fn parse_show_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8236 let object_type = if self.parse_keyword(ON) {
8237 Some(self.expect_plural_system_object_type_for_privileges()?)
8238 } else {
8239 None
8240 };
8241 let role = if self.parse_keyword(FOR) {
8242 Some(self.parse_identifier()?)
8243 } else {
8244 None
8245 };
8246 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8247 object_type: ShowObjectType::Privileges { object_type, role },
8248 from: None,
8249 filter: self.parse_show_statement_filter()?,
8250 }))
8251 }
8252
8253 fn parse_show_default_privileges(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8254 let object_type = if self.parse_keyword(ON) {
8255 Some(self.expect_plural_object_type_for_privileges()?)
8256 } else {
8257 None
8258 };
8259 let role = if self.parse_keyword(FOR) {
8260 Some(self.parse_identifier()?)
8261 } else {
8262 None
8263 };
8264 Ok(ShowStatement::ShowObjects(ShowObjectsStatement {
8265 object_type: ShowObjectType::DefaultPrivileges { object_type, role },
8266 from: None,
8267 filter: self.parse_show_statement_filter()?,
8268 }))
8269 }
8270
8271 fn parse_inspect(&mut self) -> Result<ShowStatement<Raw>, ParserError> {
8272 self.expect_keyword(SHARD)?;
8273 let id = self.parse_literal_string()?;
8274 Ok(ShowStatement::InspectShard(InspectShardStatement { id }))
8275 }
8276
8277 fn parse_table_and_joins(&mut self) -> Result<TableWithJoins<Raw>, ParserError> {
8278 let relation = self.parse_table_factor()?;
8279
8280 let mut joins = vec![];
8284 loop {
8285 let join = if self.parse_keyword(CROSS) {
8286 self.expect_keyword(JOIN)?;
8287 Join {
8288 relation: self.parse_table_factor()?,
8289 join_operator: JoinOperator::CrossJoin,
8290 }
8291 } else {
8292 let natural = self.parse_keyword(NATURAL);
8293 let peek_keyword = if let Some(Token::Keyword(kw)) = self.peek_token() {
8294 Some(kw)
8295 } else {
8296 None
8297 };
8298
8299 let join_operator_type = match peek_keyword {
8300 Some(INNER) | Some(JOIN) => {
8301 let _ = self.parse_keyword(INNER);
8302 self.expect_keyword(JOIN)?;
8303 JoinOperator::Inner
8304 }
8305 Some(kw @ LEFT) | Some(kw @ RIGHT) | Some(kw @ FULL) => {
8306 let _ = self.next_token();
8307 let _ = self.parse_keyword(OUTER);
8308 self.expect_keyword(JOIN)?;
8309 match kw {
8310 LEFT => JoinOperator::LeftOuter,
8311 RIGHT => JoinOperator::RightOuter,
8312 FULL => JoinOperator::FullOuter,
8313 _ => unreachable!(),
8314 }
8315 }
8316 Some(OUTER) => {
8317 return self.expected(
8318 self.peek_pos(),
8319 "LEFT, RIGHT, or FULL",
8320 self.peek_token(),
8321 );
8322 }
8323 None if natural => {
8324 return self.expected(
8325 self.peek_pos(),
8326 "a join type after NATURAL",
8327 self.peek_token(),
8328 );
8329 }
8330 _ => break,
8331 };
8332 let relation = self.parse_table_factor()?;
8333 let join_constraint = self.parse_join_constraint(natural)?;
8334 Join {
8335 relation,
8336 join_operator: join_operator_type(join_constraint),
8337 }
8338 };
8339 joins.push(join);
8340 }
8341 Ok(TableWithJoins { relation, joins })
8342 }
8343
8344 fn parse_table_factor(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8346 if self.parse_keyword(LATERAL) {
8347 if self.consume_token(&Token::LParen) {
8349 return self.parse_derived_table_factor(Lateral);
8350 } else if self.parse_keywords(&[ROWS, FROM]) {
8351 return self.parse_rows_from();
8352 } else {
8353 let name = self.parse_raw_name()?;
8354 self.expect_token(&Token::LParen)?;
8355 let args = self.parse_optional_args(false)?;
8356 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8357 return Ok(TableFactor::Function {
8358 function: Function {
8359 name,
8360 args,
8361 filter: None,
8362 over: None,
8363 distinct: false,
8364 },
8365 alias,
8366 with_ordinality,
8367 });
8368 }
8369 }
8370
8371 if self.consume_token(&Token::LParen) {
8372 maybe!(self.maybe_parse(|parser| parser.parse_derived_table_factor(NotLateral)));
8394
8395 let table_and_joins = self.parse_table_and_joins()?;
8406 match table_and_joins.relation {
8407 TableFactor::NestedJoin { .. } => (),
8408 _ => {
8409 if table_and_joins.joins.is_empty() {
8410 self.expected(self.peek_pos(), "joined table", self.peek_token())?
8413 }
8414 }
8415 }
8416 self.expect_token(&Token::RParen)?;
8417 Ok(TableFactor::NestedJoin {
8418 join: Box::new(table_and_joins),
8419 alias: self.parse_optional_table_alias()?,
8420 })
8421 } else if self.parse_keywords(&[ROWS, FROM]) {
8422 Ok(self.parse_rows_from()?)
8423 } else {
8424 let name = self.parse_raw_name()?;
8425 if self.consume_token(&Token::LParen) {
8426 let args = self.parse_optional_args(false)?;
8427 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8428 Ok(TableFactor::Function {
8429 function: Function {
8430 name,
8431 args,
8432 filter: None,
8433 over: None,
8434 distinct: false,
8435 },
8436 alias,
8437 with_ordinality,
8438 })
8439 } else {
8440 Ok(TableFactor::Table {
8441 name,
8442 alias: self.parse_optional_table_alias()?,
8443 })
8444 }
8445 }
8446 }
8447
8448 fn parse_rows_from(&mut self) -> Result<TableFactor<Raw>, ParserError> {
8449 self.expect_token(&Token::LParen)?;
8450 let functions = self.parse_comma_separated(Parser::parse_named_function)?;
8451 self.expect_token(&Token::RParen)?;
8452 let (with_ordinality, alias) = self.parse_table_function_suffix()?;
8453 Ok(TableFactor::RowsFrom {
8454 functions,
8455 alias,
8456 with_ordinality,
8457 })
8458 }
8459
8460 fn parse_table_function_suffix(&mut self) -> Result<(bool, Option<TableAlias>), ParserError> {
8467 let with_ordinality_1 = self.parse_keywords(&[WITH, ORDINALITY]);
8468 let alias = self.parse_optional_table_alias()?;
8469 let with_ordinality_2 = self.parse_keywords(&[WITH, ORDINALITY]);
8470 if with_ordinality_1 && with_ordinality_2 {
8471 return parser_err!(
8472 self,
8473 self.peek_prev_pos(),
8474 "WITH ORDINALITY specified twice"
8475 );
8476 }
8477 Ok((with_ordinality_1 || with_ordinality_2, alias))
8478 }
8479
8480 fn parse_named_function(&mut self) -> Result<Function<Raw>, ParserError> {
8481 let name = self.parse_raw_name()?;
8482 self.parse_function(name)
8483 }
8484
8485 fn parse_derived_table_factor(
8486 &mut self,
8487 lateral: IsLateral,
8488 ) -> Result<TableFactor<Raw>, ParserError> {
8489 let subquery = Box::new(self.parse_query()?);
8490 self.expect_token(&Token::RParen)?;
8491 let alias = self.parse_optional_table_alias()?;
8492 Ok(TableFactor::Derived {
8493 lateral: match lateral {
8494 Lateral => true,
8495 NotLateral => false,
8496 },
8497 subquery,
8498 alias,
8499 })
8500 }
8501
8502 fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint<Raw>, ParserError> {
8503 if natural {
8504 Ok(JoinConstraint::Natural)
8505 } else if self.parse_keyword(ON) {
8506 let constraint = self.parse_expr()?;
8507 Ok(JoinConstraint::On(constraint))
8508 } else if self.parse_keyword(USING) {
8509 let columns = self.parse_parenthesized_column_list(Mandatory)?;
8510 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8511
8512 Ok(JoinConstraint::Using { columns, alias })
8513 } else {
8514 self.expected(
8515 self.peek_pos(),
8516 "ON, or USING after JOIN",
8517 self.peek_token(),
8518 )
8519 }
8520 }
8521
8522 fn parse_insert(&mut self) -> Result<Statement<Raw>, ParserError> {
8524 self.expect_keyword(INTO)?;
8525 let table_name = self.parse_raw_name()?;
8526 let columns = self.parse_parenthesized_column_list(Optional)?;
8527 let source = if self.parse_keywords(&[DEFAULT, VALUES]) {
8528 InsertSource::DefaultValues
8529 } else {
8530 InsertSource::Query(self.parse_query()?)
8531 };
8532 let returning = self.parse_returning()?;
8533 Ok(Statement::Insert(InsertStatement {
8534 table_name,
8535 columns,
8536 source,
8537 returning,
8538 }))
8539 }
8540
8541 fn parse_returning(&mut self) -> Result<Vec<SelectItem<Raw>>, ParserError> {
8542 Ok(if self.parse_keyword(RETURNING) {
8543 self.parse_comma_separated(Parser::parse_select_item)?
8544 } else {
8545 Vec::new()
8546 })
8547 }
8548
8549 fn parse_update(&mut self) -> Result<Statement<Raw>, ParserError> {
8550 let table_name = RawItemName::Name(self.parse_item_name()?);
8551 let alias = self.parse_optional_alias(Keyword::is_reserved_in_table_alias)?;
8553 let alias = alias.map(|name| TableAlias {
8554 name,
8555 columns: Vec::new(),
8556 strict: false,
8557 });
8558
8559 self.expect_keyword(SET)?;
8560 let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
8561 let selection = if self.parse_keyword(WHERE) {
8562 Some(self.parse_expr()?)
8563 } else {
8564 None
8565 };
8566
8567 Ok(Statement::Update(UpdateStatement {
8568 table_name,
8569 alias,
8570 assignments,
8571 selection,
8572 }))
8573 }
8574
8575 fn parse_assignment(&mut self) -> Result<Assignment<Raw>, ParserError> {
8577 let id = self.parse_identifier()?;
8578 self.expect_token(&Token::Eq)?;
8579 let value = self.parse_expr()?;
8580 Ok(Assignment { id, value })
8581 }
8582
8583 fn parse_optional_args(
8584 &mut self,
8585 allow_order_by: bool,
8586 ) -> Result<FunctionArgs<Raw>, ParserError> {
8587 if self.consume_token(&Token::Star) {
8588 self.expect_token(&Token::RParen)?;
8589 Ok(FunctionArgs::Star)
8590 } else if self.consume_token(&Token::RParen) {
8591 Ok(FunctionArgs::args(vec![]))
8592 } else {
8593 let args = self.parse_comma_separated(Parser::parse_expr)?;
8594 let order_by = if allow_order_by && self.parse_keywords(&[ORDER, BY]) {
8598 self.parse_comma_separated(Parser::parse_order_by_expr)?
8599 } else {
8600 vec![]
8601 };
8602 self.expect_token(&Token::RParen)?;
8603 Ok(FunctionArgs::Args { args, order_by })
8604 }
8605 }
8606
8607 fn parse_optional_as_of(&mut self) -> Result<Option<AsOf<Raw>>, ParserError> {
8609 if self.parse_keyword(AS) {
8610 self.expect_keyword(OF)?;
8611 if self.parse_keywords(&[AT, LEAST]) {
8612 match self.parse_expr() {
8613 Ok(expr) => Ok(Some(AsOf::AtLeast(expr))),
8614 Err(e) => self.expected(
8615 e.pos,
8616 "a timestamp value after 'AS OF AT LEAST'",
8617 self.peek_token(),
8618 ),
8619 }
8620 } else {
8621 match self.parse_expr() {
8622 Ok(expr) => Ok(Some(AsOf::At(expr))),
8623 Err(e) => {
8624 self.expected(e.pos, "a timestamp value after 'AS OF'", self.peek_token())
8625 }
8626 }
8627 }
8628 } else {
8629 Ok(None)
8630 }
8631 }
8632
8633 fn parse_optional_up_to(&mut self) -> Result<Option<Expr<Raw>>, ParserError> {
8635 if self.parse_keyword(UP) {
8636 self.expect_keyword(TO)?;
8637 self.parse_expr().map(Some)
8638 } else {
8639 Ok(None)
8640 }
8641 }
8642
8643 fn parse_optional_internal_as_of(&mut self) -> Result<Option<u64>, ParserError> {
8648 fn try_parse_u64(parser: &mut Parser) -> Option<u64> {
8649 let value = parser.parse_value().ok()?;
8650 let Value::Number(s) = value else { return None };
8651 s.parse().ok()
8652 }
8653
8654 if self.parse_keywords(&[AS, OF]) {
8655 match try_parse_u64(self) {
8656 Some(time) => Ok(Some(time)),
8657 None => {
8658 self.prev_token();
8659 self.expected(self.peek_pos(), "`u64` literal", self.peek_token())
8660 }
8661 }
8662 } else {
8663 Ok(None)
8664 }
8665 }
8666
8667 fn parse_select_item(&mut self) -> Result<SelectItem<Raw>, ParserError> {
8669 if self.consume_token(&Token::Star) {
8670 return Ok(SelectItem::Wildcard);
8671 }
8672 Ok(SelectItem::Expr {
8673 expr: self.parse_expr()?,
8674 alias: self.parse_optional_alias(Keyword::is_reserved_in_column_alias)?,
8675 })
8676 }
8677
8678 fn parse_order_by_expr(&mut self) -> Result<OrderByExpr<Raw>, ParserError> {
8681 let expr = self.parse_expr()?;
8682
8683 let asc = if self.parse_keyword(ASC) {
8684 Some(true)
8685 } else if self.parse_keyword(DESC) {
8686 Some(false)
8687 } else {
8688 None
8689 };
8690
8691 let nulls_last = if self.parse_keyword(NULLS) {
8692 let last = self.expect_one_of_keywords(&[FIRST, LAST])? == LAST;
8693 Some(last)
8694 } else {
8695 None
8696 };
8697
8698 Ok(OrderByExpr {
8699 expr,
8700 asc,
8701 nulls_last,
8702 })
8703 }
8704
8705 fn parse_values(&mut self) -> Result<Values<Raw>, ParserError> {
8706 let values = self.parse_comma_separated(|parser| {
8707 parser.expect_token(&Token::LParen)?;
8708 let exprs = parser.parse_comma_separated(Parser::parse_expr)?;
8709 parser.expect_token(&Token::RParen)?;
8710 Ok(exprs)
8711 })?;
8712 Ok(Values(values))
8713 }
8714
8715 fn parse_start_transaction(&mut self) -> Result<Statement<Raw>, ParserError> {
8716 self.expect_keyword(TRANSACTION)?;
8717 Ok(Statement::StartTransaction(StartTransactionStatement {
8718 modes: self.parse_transaction_modes(false)?,
8719 }))
8720 }
8721
8722 fn parse_begin(&mut self) -> Result<Statement<Raw>, ParserError> {
8723 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8724 Ok(Statement::StartTransaction(StartTransactionStatement {
8725 modes: self.parse_transaction_modes(false)?,
8726 }))
8727 }
8728
8729 fn parse_transaction_modes(
8730 &mut self,
8731 mut required: bool,
8732 ) -> Result<Vec<TransactionMode>, ParserError> {
8733 let mut modes = vec![];
8734 loop {
8735 let mode = if self.parse_keywords(&[ISOLATION, LEVEL]) {
8736 let iso_level = if self.parse_keywords(&[READ, UNCOMMITTED]) {
8737 TransactionIsolationLevel::ReadUncommitted
8738 } else if self.parse_keywords(&[READ, COMMITTED]) {
8739 TransactionIsolationLevel::ReadCommitted
8740 } else if self.parse_keywords(&[REPEATABLE, READ]) {
8741 TransactionIsolationLevel::RepeatableRead
8742 } else if self.parse_keyword(SERIALIZABLE) {
8743 TransactionIsolationLevel::Serializable
8744 } else if self.parse_keywords(&[STRONG, SESSION, SERIALIZABLE]) {
8745 TransactionIsolationLevel::StrongSessionSerializable
8746 } else if self.parse_keywords(&[STRICT, SERIALIZABLE]) {
8747 TransactionIsolationLevel::StrictSerializable
8748 } else {
8749 self.expected(self.peek_pos(), "isolation level", self.peek_token())?
8750 };
8751 TransactionMode::IsolationLevel(iso_level)
8752 } else if self.parse_keywords(&[READ, ONLY]) {
8753 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
8754 } else if self.parse_keywords(&[READ, WRITE]) {
8755 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
8756 } else if required {
8757 self.expected(self.peek_pos(), "transaction mode", self.peek_token())?
8758 } else {
8759 break;
8760 };
8761 modes.push(mode);
8762 required = self.consume_token(&Token::Comma);
8767 }
8768 Ok(modes)
8769 }
8770
8771 fn parse_commit(&mut self) -> Result<Statement<Raw>, ParserError> {
8772 Ok(Statement::Commit(CommitStatement {
8773 chain: self.parse_commit_rollback_chain()?,
8774 }))
8775 }
8776
8777 fn parse_rollback(&mut self) -> Result<Statement<Raw>, ParserError> {
8778 Ok(Statement::Rollback(RollbackStatement {
8779 chain: self.parse_commit_rollback_chain()?,
8780 }))
8781 }
8782
8783 fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> {
8784 let _ = self.parse_one_of_keywords(&[TRANSACTION, WORK]);
8785 if self.parse_keyword(AND) {
8786 let chain = !self.parse_keyword(NO);
8787 self.expect_keyword(CHAIN)?;
8788 Ok(chain)
8789 } else {
8790 Ok(false)
8791 }
8792 }
8793
8794 fn parse_tail(&self) -> Result<Statement<Raw>, ParserError> {
8795 parser_err!(
8796 self,
8797 self.peek_prev_pos(),
8798 "TAIL has been renamed to SUBSCRIBE"
8799 )
8800 }
8801
8802 fn parse_subscribe(&mut self) -> Result<Statement<Raw>, ParserError> {
8803 let _ = self.parse_keyword(TO);
8804 let relation = if self.consume_token(&Token::LParen) {
8805 let query = self.parse_query()?;
8806 self.expect_token(&Token::RParen)?;
8807 SubscribeRelation::Query(query)
8808 } else {
8809 SubscribeRelation::Name(self.parse_raw_name()?)
8810 };
8811 let mut output = self.parse_subscribe_output()?;
8812 let options = if self.parse_keyword(WITH) {
8813 self.expect_token(&Token::LParen)?;
8814 let options = self.parse_comma_separated(Self::parse_subscribe_option)?;
8815 self.expect_token(&Token::RParen)?;
8816 options
8817 } else {
8818 vec![]
8819 };
8820 let as_of = self.parse_optional_as_of()?;
8821 let up_to = self.parse_optional_up_to()?;
8822 if output == SubscribeOutput::Diffs {
8829 output = self.parse_subscribe_output()?;
8830 }
8831 Ok(Statement::Subscribe(SubscribeStatement {
8832 relation,
8833 options,
8834 as_of,
8835 up_to,
8836 output,
8837 }))
8838 }
8839
8840 fn parse_subscribe_option(&mut self) -> Result<SubscribeOption<Raw>, ParserError> {
8841 let name = match self.expect_one_of_keywords(&[PROGRESS, SNAPSHOT])? {
8842 PROGRESS => SubscribeOptionName::Progress,
8843 SNAPSHOT => SubscribeOptionName::Snapshot,
8844 _ => unreachable!(),
8845 };
8846 Ok(SubscribeOption {
8847 name,
8848 value: self.parse_optional_option_value()?,
8849 })
8850 }
8851
8852 fn parse_subscribe_output(&mut self) -> Result<SubscribeOutput<Raw>, ParserError> {
8853 if self.parse_keywords(&[ENVELOPE]) {
8854 let keyword = self.expect_one_of_keywords(&[UPSERT, DEBEZIUM])?;
8855 self.expect_token(&Token::LParen)?;
8856 self.expect_keyword(KEY)?;
8857 let key_columns = self.parse_parenthesized_column_list(Mandatory)?;
8858 let output = match keyword {
8859 UPSERT => SubscribeOutput::EnvelopeUpsert { key_columns },
8860 DEBEZIUM => SubscribeOutput::EnvelopeDebezium { key_columns },
8861 _ => unreachable!("no other keyword allowed"),
8862 };
8863 self.expect_token(&Token::RParen)?;
8864 Ok(output)
8865 } else if self.parse_keywords(&[WITHIN, TIMESTAMP, ORDER, BY]) {
8866 Ok(SubscribeOutput::WithinTimestampOrderBy {
8867 order_by: self.parse_comma_separated(Parser::parse_order_by_expr)?,
8868 })
8869 } else {
8870 Ok(SubscribeOutput::Diffs)
8871 }
8872 }
8873
8874 fn parse_explain(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
8877 if self.parse_keyword(TIMESTAMP) {
8878 self.parse_explain_timestamp()
8879 .map_parser_err(StatementKind::ExplainTimestamp)
8880 } else if self.parse_keywords(&[FILTER, PUSHDOWN]) {
8881 self.parse_explain_pushdown()
8882 .map_parser_err(StatementKind::ExplainPushdown)
8883 } else if self.parse_keyword(ANALYZE) || self.parse_keyword(ANALYSE) {
8884 self.parse_explain_analyze()
8885 .map_parser_err(StatementKind::ExplainAnalyzeObject)
8886 } else if self.peek_keyword(KEY) || self.peek_keyword(VALUE) {
8887 self.parse_explain_schema()
8888 .map_parser_err(StatementKind::ExplainSinkSchema)
8889 } else {
8890 self.parse_explain_plan()
8891 .map_parser_err(StatementKind::ExplainPlan)
8892 }
8893 }
8894
8895 fn parse_explainee(&mut self) -> Result<Explainee<Raw>, ParserError> {
8896 let explainee = if self.parse_keyword(VIEW) {
8897 Explainee::View(self.parse_raw_name()?)
8899 } else if self.parse_keywords(&[MATERIALIZED, VIEW]) {
8900 Explainee::MaterializedView(self.parse_raw_name()?)
8902 } else if self.parse_keyword(INDEX) {
8903 Explainee::Index(self.parse_raw_name()?)
8905 } else if self.parse_keywords(&[REPLAN, VIEW]) {
8906 Explainee::ReplanView(self.parse_raw_name()?)
8908 } else if self.parse_keywords(&[REPLAN, MATERIALIZED, VIEW]) {
8909 Explainee::ReplanMaterializedView(self.parse_raw_name()?)
8911 } else if self.parse_keywords(&[REPLAN, INDEX]) {
8912 Explainee::ReplanIndex(self.parse_raw_name()?)
8914 } else {
8915 let broken = self.parse_keyword(BROKEN);
8916
8917 if self.peek_keywords(&[CREATE, VIEW])
8918 || self.peek_keywords(&[CREATE, OR, REPLACE, VIEW])
8919 {
8920 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_view()? {
8923 Statement::CreateView(stmt) => stmt,
8924 _ => panic!("Unexpected statement type return after parsing"),
8925 };
8926
8927 Explainee::CreateView(Box::new(stmt), broken)
8928 } else if self.peek_keywords(&[CREATE, MATERIALIZED, VIEW])
8929 || self.peek_keywords(&[CREATE, OR, REPLACE, MATERIALIZED, VIEW])
8930 {
8931 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_materialized_view()? {
8934 Statement::CreateMaterializedView(stmt) => stmt,
8935 _ => panic!("Unexpected statement type return after parsing"),
8936 };
8937
8938 Explainee::CreateMaterializedView(Box::new(stmt), broken)
8939 } else if self.peek_keywords(&[CREATE, INDEX])
8940 || self.peek_keywords(&[CREATE, DEFAULT, INDEX])
8941 {
8942 let _ = self.parse_keyword(CREATE); let stmt = match self.parse_create_index()? {
8945 Statement::CreateIndex(stmt) => stmt,
8946 _ => panic!("Unexpected statement type return after parsing"),
8947 };
8948
8949 Explainee::CreateIndex(Box::new(stmt), broken)
8950 } else {
8951 let query = self.parse_select_statement()?;
8953 Explainee::Select(Box::new(query), broken)
8954 }
8955 };
8956 Ok(explainee)
8957 }
8958
8959 fn parse_explain_plan(&mut self) -> Result<Statement<Raw>, ParserError> {
8962 let start = self.peek_pos();
8963 let (has_stage, stage) = match self.parse_one_of_keywords(&[
8964 RAW,
8965 DECORRELATED,
8966 LOCALLY,
8967 OPTIMIZED,
8968 PHYSICAL,
8969 OPTIMIZER,
8970 PLAN,
8971 ]) {
8972 Some(RAW) => {
8973 self.expect_keyword(PLAN)?;
8974 (true, Some(ExplainStage::RawPlan))
8975 }
8976 Some(DECORRELATED) => {
8977 self.expect_keyword(PLAN)?;
8978 (true, Some(ExplainStage::DecorrelatedPlan))
8979 }
8980 Some(LOCALLY) => {
8981 self.expect_keywords(&[OPTIMIZED, PLAN])?;
8982 (true, Some(ExplainStage::LocalPlan))
8983 }
8984 Some(OPTIMIZED) => {
8985 self.expect_keyword(PLAN)?;
8986 (true, Some(ExplainStage::GlobalPlan))
8987 }
8988 Some(PHYSICAL) => {
8989 self.expect_keyword(PLAN)?;
8990 (true, Some(ExplainStage::PhysicalPlan))
8991 }
8992 Some(OPTIMIZER) => {
8993 self.expect_keyword(TRACE)?;
8994 (true, Some(ExplainStage::Trace))
8995 }
8996 Some(PLAN) => {
8997 if self.parse_keyword(INSIGHTS) {
8998 (true, Some(ExplainStage::PlanInsights))
8999 } else {
9000 (true, None)
9002 }
9003 }
9004 None => {
9005 (false, None)
9007 }
9008 _ => unreachable!(),
9009 };
9010
9011 let with_options = if self.parse_keyword(WITH) {
9012 if self.consume_token(&Token::LParen) {
9013 let options = self.parse_comma_separated(Parser::parse_explain_plan_option)?;
9014 self.expect_token(&Token::RParen)?;
9015 options
9016 } else {
9017 self.prev_token(); vec![]
9019 }
9020 } else {
9021 vec![]
9022 };
9023
9024 let format = if self.parse_keyword(AS) {
9025 match self.parse_one_of_keywords(&[TEXT, JSON, DOT, VERBOSE]) {
9026 Some(TEXT) => Some(ExplainFormat::Text),
9027 Some(JSON) => Some(ExplainFormat::Json),
9028 Some(DOT) => Some(ExplainFormat::Dot),
9029 Some(VERBOSE) => {
9030 self.expect_keyword(TEXT)?;
9031 Some(ExplainFormat::VerboseText)
9032 }
9033 None => return Err(ParserError::new(self.index, "expected a format")),
9034 _ => unreachable!(),
9035 }
9036 } else if has_stage && stage == Some(ExplainStage::PhysicalPlan) {
9037 Some(ExplainFormat::VerboseText)
9039 } else {
9040 None
9041 };
9042
9043 if has_stage {
9044 self.expect_keyword(FOR)?;
9045 }
9046
9047 let explainee = self.parse_explainee()?;
9048
9049 if matches!((explainee.is_view(), &stage), (true, None)) {
9052 let msg = "EXPLAIN statement for a view needs an explicit stage".to_string();
9053 return Err(self.error(start, msg));
9054 }
9055
9056 Ok(Statement::ExplainPlan(ExplainPlanStatement {
9057 stage,
9058 with_options,
9059 format,
9060 explainee,
9061 }))
9062 }
9063
9064 fn parse_explain_plan_option(&mut self) -> Result<ExplainPlanOption<Raw>, ParserError> {
9065 Ok(ExplainPlanOption {
9066 name: self.parse_explain_plan_option_name()?,
9067 value: self.parse_optional_option_value()?,
9068 })
9069 }
9070
9071 fn parse_explain_pushdown(&mut self) -> Result<Statement<Raw>, ParserError> {
9074 self.expect_keyword(FOR)?;
9075
9076 let explainee = self.parse_explainee()?;
9077
9078 Ok(Statement::ExplainPushdown(ExplainPushdownStatement {
9079 explainee,
9080 }))
9081 }
9082
9083 fn parse_explain_analyze(&mut self) -> Result<Statement<Raw>, ParserError> {
9084 if self.parse_keyword(CLUSTER) {
9086 let properties = self.parse_explain_analyze_computation_properties()?;
9087 let as_sql = self.parse_keywords(&[AS, SQL]);
9088 return Ok(Statement::ExplainAnalyzeCluster(
9089 ExplainAnalyzeClusterStatement { properties, as_sql },
9090 ));
9091 }
9092
9093 let properties = if self.parse_keyword(HINTS) {
9096 ExplainAnalyzeProperty::Hints
9097 } else {
9098 ExplainAnalyzeProperty::Computation(
9099 self.parse_explain_analyze_computation_properties()?,
9100 )
9101 };
9102
9103 self.expect_keyword(FOR)?;
9104
9105 let explainee = match self.expect_one_of_keywords(&[INDEX, MATERIALIZED])? {
9106 INDEX => Explainee::Index(self.parse_raw_name()?),
9107 MATERIALIZED => {
9108 self.expect_keyword(VIEW)?;
9109 Explainee::MaterializedView(self.parse_raw_name()?)
9110 }
9111 _ => unreachable!(),
9112 };
9113
9114 let as_sql = self.parse_keywords(&[AS, SQL]);
9115
9116 Ok(Statement::ExplainAnalyzeObject(
9117 ExplainAnalyzeObjectStatement {
9118 properties,
9119 explainee,
9120 as_sql,
9121 },
9122 ))
9123 }
9124
9125 fn parse_explain_analyze_computation_properties(
9126 &mut self,
9127 ) -> Result<ExplainAnalyzeComputationProperties, ParserError> {
9128 let mut computation_properties = vec![CPU, MEMORY];
9129 let (kw, property) =
9130 self.parse_explain_analyze_computation_property(&computation_properties)?;
9131 let mut properties = vec![property];
9132 computation_properties.retain(|p| p != &kw);
9133
9134 while self.consume_token(&Token::Comma) {
9135 let (kw, property) =
9136 self.parse_explain_analyze_computation_property(&computation_properties)?;
9137 computation_properties.retain(|p| p != &kw);
9138 properties.push(property);
9139 }
9140
9141 let skew = self.parse_keywords(&[WITH, SKEW]);
9142
9143 Ok(ExplainAnalyzeComputationProperties { properties, skew })
9144 }
9145
9146 fn parse_explain_analyze_computation_property(
9147 &mut self,
9148 properties: &[Keyword],
9149 ) -> Result<(Keyword, ExplainAnalyzeComputationProperty), ParserError> {
9150 if properties.is_empty() {
9151 return Err(ParserError::new(
9152 self.peek_pos(),
9153 "both CPU and MEMORY were specified, expected WITH SKEW or FOR",
9154 ));
9155 }
9156
9157 match self.expect_one_of_keywords(properties)? {
9158 CPU => Ok((CPU, ExplainAnalyzeComputationProperty::Cpu)),
9159 MEMORY => Ok((MEMORY, ExplainAnalyzeComputationProperty::Memory)),
9160 _ => unreachable!(),
9161 }
9162 }
9163
9164 fn parse_explain_timestamp(&mut self) -> Result<Statement<Raw>, ParserError> {
9167 let format = if self.parse_keyword(AS) {
9168 match self.parse_one_of_keywords(&[TEXT, JSON, DOT]) {
9169 Some(TEXT) => Some(ExplainFormat::Text),
9170 Some(JSON) => Some(ExplainFormat::Json),
9171 None => return Err(ParserError::new(self.index, "expected a format")),
9172 _ => unreachable!(),
9173 }
9174 } else {
9175 None
9176 };
9177
9178 self.expect_keyword(FOR)?;
9179
9180 let query = self.parse_select_statement()?;
9181
9182 Ok(Statement::ExplainTimestamp(ExplainTimestampStatement {
9183 format,
9184 select: query,
9185 }))
9186 }
9187 fn parse_explain_schema(&mut self) -> Result<Statement<Raw>, ParserError> {
9190 let schema_for = match self.expect_one_of_keywords(&[KEY, VALUE])? {
9191 KEY => ExplainSinkSchemaFor::Key,
9192 VALUE => ExplainSinkSchemaFor::Value,
9193 _ => unreachable!(),
9194 };
9195
9196 self.expect_keyword(SCHEMA)?;
9197
9198 let format = if self.parse_keyword(AS) {
9199 self.expect_keyword(JSON)?;
9201 Some(ExplainFormat::Json)
9202 } else {
9203 None
9204 };
9205
9206 self.expect_keywords(&[FOR, CREATE])?;
9207
9208 if let Statement::CreateSink(statement) = self.parse_create_sink()? {
9209 Ok(Statement::ExplainSinkSchema(ExplainSinkSchemaStatement {
9210 schema_for,
9211 format,
9212 statement,
9213 }))
9214 } else {
9215 unreachable!("only create sink can be returned here");
9216 }
9217 }
9218
9219 fn parse_declare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9222 let name = self
9223 .parse_identifier()
9224 .map_parser_err(StatementKind::Declare)?;
9225 self.expect_keyword(CURSOR)
9226 .map_parser_err(StatementKind::Declare)?;
9227 if self.parse_keyword(WITH) {
9228 let err = parser_err!(
9229 self,
9230 self.peek_prev_pos(),
9231 format!("WITH HOLD is unsupported for cursors")
9232 )
9233 .map_parser_err(StatementKind::Declare);
9234 self.expect_keyword(HOLD)
9235 .map_parser_err(StatementKind::Declare)?;
9236 return err;
9237 }
9238 let _ = self.parse_keywords(&[WITHOUT, HOLD]);
9240 self.expect_keyword(FOR)
9241 .map_parser_err(StatementKind::Declare)?;
9242 let StatementParseResult { ast, sql } = self.parse_statement()?;
9243 Ok(Statement::Declare(DeclareStatement {
9244 name,
9245 stmt: Box::new(ast),
9246 sql: sql.to_string(),
9247 }))
9248 }
9249
9250 fn parse_close(&mut self) -> Result<Statement<Raw>, ParserError> {
9253 let name = self.parse_identifier()?;
9254 Ok(Statement::Close(CloseStatement { name }))
9255 }
9256
9257 fn parse_prepare(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9260 let name = self
9261 .parse_identifier()
9262 .map_parser_err(StatementKind::Prepare)?;
9263 self.expect_keyword(AS)
9264 .map_parser_err(StatementKind::Prepare)?;
9265 let pos = self.peek_pos();
9266 let StatementParseResult { ast, sql } = self.parse_statement()?;
9268 if !matches!(
9269 ast,
9270 Statement::Select(_)
9271 | Statement::Insert(_)
9272 | Statement::Delete(_)
9273 | Statement::Update(_)
9274 | Statement::Fetch(_),
9275 ) {
9276 return parser_err!(self, pos, "unpreparable statement").map_no_statement_parser_err();
9277 }
9278 Ok(Statement::Prepare(PrepareStatement {
9279 name,
9280 stmt: Box::new(ast),
9281 sql: sql.to_string(),
9282 }))
9283 }
9284
9285 fn parse_execute(&mut self) -> Result<Statement<Raw>, ParserError> {
9288 let name = self.parse_identifier()?;
9289 let params = if self.consume_token(&Token::LParen) {
9290 let params = self.parse_comma_separated(Parser::parse_expr)?;
9291 self.expect_token(&Token::RParen)?;
9292 params
9293 } else {
9294 Vec::new()
9295 };
9296 Ok(Statement::Execute(ExecuteStatement { name, params }))
9297 }
9298
9299 fn parse_deallocate(&mut self) -> Result<Statement<Raw>, ParserError> {
9302 let _ = self.parse_keyword(PREPARE);
9303 let name = if self.parse_keyword(ALL) {
9304 None
9305 } else {
9306 Some(self.parse_identifier()?)
9307 };
9308 Ok(Statement::Deallocate(DeallocateStatement { name }))
9309 }
9310
9311 fn parse_fetch(&mut self) -> Result<Statement<Raw>, ParserError> {
9314 let _ = self.parse_keyword(FORWARD);
9315 let count = if let Some(count) = self.maybe_parse(Parser::parse_literal_uint) {
9316 Some(FetchDirection::ForwardCount(count))
9317 } else if self.parse_keyword(ALL) {
9318 Some(FetchDirection::ForwardAll)
9319 } else {
9320 None
9321 };
9322 let _ = self.parse_keyword(FROM);
9323 let name = self.parse_identifier()?;
9324 let options = if self.parse_keyword(WITH) {
9325 self.expect_token(&Token::LParen)?;
9326 let options = self.parse_comma_separated(Self::parse_fetch_option)?;
9327 self.expect_token(&Token::RParen)?;
9328 options
9329 } else {
9330 vec![]
9331 };
9332 Ok(Statement::Fetch(FetchStatement {
9333 name,
9334 count,
9335 options,
9336 }))
9337 }
9338
9339 fn parse_fetch_option(&mut self) -> Result<FetchOption<Raw>, ParserError> {
9340 self.expect_keyword(TIMEOUT)?;
9341 Ok(FetchOption {
9342 name: FetchOptionName::Timeout,
9343 value: self.parse_optional_option_value()?,
9344 })
9345 }
9346
9347 fn parse_raise(&mut self) -> Result<Statement<Raw>, ParserError> {
9350 let severity = match self.parse_one_of_keywords(&[DEBUG, INFO, LOG, NOTICE, WARNING]) {
9351 Some(DEBUG) => NoticeSeverity::Debug,
9352 Some(INFO) => NoticeSeverity::Info,
9353 Some(LOG) => NoticeSeverity::Log,
9354 Some(NOTICE) => NoticeSeverity::Notice,
9355 Some(WARNING) => NoticeSeverity::Warning,
9356 Some(_) => unreachable!(),
9357 None => self.expected(self.peek_pos(), "severity level", self.peek_token())?,
9358 };
9359
9360 Ok(Statement::Raise(RaiseStatement { severity }))
9361 }
9362
9363 fn parse_grant(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9366 match self.parse_privilege_specification() {
9367 Some(privileges) => self
9368 .parse_grant_privilege(privileges)
9369 .map_parser_err(StatementKind::GrantPrivileges),
9370 None => self
9371 .parse_grant_role()
9372 .map_parser_err(StatementKind::GrantRole),
9373 }
9374 }
9375
9376 fn parse_grant_privilege(
9379 &mut self,
9380 privileges: PrivilegeSpecification,
9381 ) -> Result<Statement<Raw>, ParserError> {
9382 self.expect_keyword(ON)?;
9383 let target = self.expect_grant_target_specification("GRANT")?;
9384 self.expect_keyword(TO)?;
9385 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9386 Ok(Statement::GrantPrivileges(GrantPrivilegesStatement {
9387 privileges,
9388 target,
9389 roles,
9390 }))
9391 }
9392
9393 fn parse_grant_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9396 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9397 self.expect_keyword(TO)?;
9398 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9399 Ok(Statement::GrantRole(GrantRoleStatement {
9400 role_names,
9401 member_names,
9402 }))
9403 }
9404
9405 fn parse_revoke(&mut self) -> Result<Statement<Raw>, ParserStatementError> {
9408 match self.parse_privilege_specification() {
9409 Some(privileges) => self
9410 .parse_revoke_privilege(privileges)
9411 .map_parser_err(StatementKind::RevokePrivileges),
9412 None => self
9413 .parse_revoke_role()
9414 .map_parser_err(StatementKind::RevokeRole),
9415 }
9416 }
9417
9418 fn parse_revoke_privilege(
9421 &mut self,
9422 privileges: PrivilegeSpecification,
9423 ) -> Result<Statement<Raw>, ParserError> {
9424 self.expect_keyword(ON)?;
9425 let target = self.expect_grant_target_specification("REVOKE")?;
9426 self.expect_keyword(FROM)?;
9427 let roles = self.parse_comma_separated(Parser::expect_role_specification)?;
9428 Ok(Statement::RevokePrivileges(RevokePrivilegesStatement {
9429 privileges,
9430 target,
9431 roles,
9432 }))
9433 }
9434
9435 fn parse_revoke_role(&mut self) -> Result<Statement<Raw>, ParserError> {
9438 let role_names = self.parse_comma_separated(Parser::parse_identifier)?;
9439 self.expect_keyword(FROM)?;
9440 let member_names = self.parse_comma_separated(Parser::expect_role_specification)?;
9441 Ok(Statement::RevokeRole(RevokeRoleStatement {
9442 role_names,
9443 member_names,
9444 }))
9445 }
9446
9447 fn expect_grant_target_specification(
9448 &mut self,
9449 statement_type: &str,
9450 ) -> Result<GrantTargetSpecification<Raw>, ParserError> {
9451 if self.parse_keyword(SYSTEM) {
9452 return Ok(GrantTargetSpecification::System);
9453 }
9454
9455 let (object_type, object_spec_inner) = if self.parse_keyword(ALL) {
9456 let object_type = self.expect_grant_revoke_plural_object_type(statement_type)?;
9457 let object_spec_inner = if self.parse_keyword(IN) {
9458 if !object_type.lives_in_schema() && object_type != ObjectType::Schema {
9459 return parser_err!(
9460 self,
9461 self.peek_prev_pos(),
9462 format!("IN invalid for {object_type}S")
9463 );
9464 }
9465 match self.expect_one_of_keywords(&[DATABASE, SCHEMA])? {
9466 DATABASE => GrantTargetSpecificationInner::All(
9467 GrantTargetAllSpecification::AllDatabases {
9468 databases: self.parse_comma_separated(Parser::parse_database_name)?,
9469 },
9470 ),
9471 SCHEMA => {
9472 if object_type == ObjectType::Schema {
9473 self.prev_token();
9474 self.expected(self.peek_pos(), DATABASE, self.peek_token())?;
9475 }
9476 GrantTargetSpecificationInner::All(
9477 GrantTargetAllSpecification::AllSchemas {
9478 schemas: self.parse_comma_separated(Parser::parse_schema_name)?,
9479 },
9480 )
9481 }
9482 _ => unreachable!(),
9483 }
9484 } else {
9485 GrantTargetSpecificationInner::All(GrantTargetAllSpecification::All)
9486 };
9487 (object_type, object_spec_inner)
9488 } else {
9489 let object_type = self.expect_grant_revoke_object_type(statement_type)?;
9490 let object_spec_inner = GrantTargetSpecificationInner::Objects {
9491 names: self
9492 .parse_comma_separated(|parser| parser.parse_object_name(object_type))?,
9493 };
9494 (object_type, object_spec_inner)
9495 };
9496
9497 Ok(GrantTargetSpecification::Object {
9498 object_type,
9499 object_spec_inner,
9500 })
9501 }
9502
9503 fn expect_grant_revoke_object_type(
9506 &mut self,
9507 statement_type: &str,
9508 ) -> Result<ObjectType, ParserError> {
9509 let object_type = self.parse_object_type().unwrap_or(ObjectType::Table);
9511 self.expect_grant_revoke_object_type_inner(statement_type, object_type)
9512 }
9513
9514 fn expect_grant_revoke_plural_object_type(
9517 &mut self,
9518 statement_type: &str,
9519 ) -> Result<ObjectType, ParserError> {
9520 let object_type = self.expect_plural_object_type().map_err(|_| {
9521 self.expected::<_, ObjectType>(
9523 self.peek_pos(),
9524 "one of TABLES or TYPES or SECRETS or CONNECTIONS or SCHEMAS or DATABASES or CLUSTERS",
9525 self.peek_token(),
9526 )
9527 .unwrap_err()
9528 })?;
9529 self.expect_grant_revoke_object_type_inner(statement_type, object_type)?;
9530 Ok(object_type)
9531 }
9532
9533 fn expect_grant_revoke_object_type_inner(
9534 &self,
9535 statement_type: &str,
9536 object_type: ObjectType,
9537 ) -> Result<ObjectType, ParserError> {
9538 match object_type {
9539 ObjectType::View
9540 | ObjectType::MaterializedView
9541 | ObjectType::Source
9542 | ObjectType::ContinualTask => {
9543 parser_err!(
9544 self,
9545 self.peek_prev_pos(),
9546 format!(
9547 "For object type {object_type}, you must specify 'TABLE' or omit the object type"
9548 )
9549 )
9550 }
9551 ObjectType::Sink
9552 | ObjectType::Index
9553 | ObjectType::ClusterReplica
9554 | ObjectType::Role
9555 | ObjectType::Func
9556 | ObjectType::Subsource => {
9557 parser_err!(
9558 self,
9559 self.peek_prev_pos(),
9560 format!("Unsupported {statement_type} on {object_type}")
9561 )
9562 }
9563 ObjectType::Table
9564 | ObjectType::Type
9565 | ObjectType::Cluster
9566 | ObjectType::Secret
9567 | ObjectType::Connection
9568 | ObjectType::Database
9569 | ObjectType::Schema
9570 | ObjectType::NetworkPolicy => Ok(object_type),
9571 }
9572 }
9573
9574 fn expect_object_type(&mut self) -> Result<ObjectType, ParserError> {
9576 Ok(
9577 match self.expect_one_of_keywords(&[
9578 TABLE,
9579 VIEW,
9580 MATERIALIZED,
9581 SOURCE,
9582 SINK,
9583 INDEX,
9584 TYPE,
9585 ROLE,
9586 USER,
9587 CLUSTER,
9588 SECRET,
9589 CONNECTION,
9590 DATABASE,
9591 SCHEMA,
9592 FUNCTION,
9593 CONTINUAL,
9594 NETWORK,
9595 ])? {
9596 TABLE => ObjectType::Table,
9597 VIEW => ObjectType::View,
9598 MATERIALIZED => {
9599 if let Err(e) = self.expect_keyword(VIEW) {
9600 self.prev_token();
9601 return Err(e);
9602 }
9603 ObjectType::MaterializedView
9604 }
9605 SOURCE => ObjectType::Source,
9606 SINK => ObjectType::Sink,
9607 INDEX => ObjectType::Index,
9608 TYPE => ObjectType::Type,
9609 ROLE | USER => ObjectType::Role,
9610 CLUSTER => {
9611 if self.parse_keyword(REPLICA) {
9612 ObjectType::ClusterReplica
9613 } else {
9614 ObjectType::Cluster
9615 }
9616 }
9617 SECRET => ObjectType::Secret,
9618 CONNECTION => ObjectType::Connection,
9619 DATABASE => ObjectType::Database,
9620 SCHEMA => ObjectType::Schema,
9621 FUNCTION => ObjectType::Func,
9622 CONTINUAL => {
9623 if let Err(e) = self.expect_keyword(TASK) {
9624 self.prev_token();
9625 return Err(e);
9626 }
9627 ObjectType::ContinualTask
9628 }
9629 NETWORK => {
9630 if let Err(e) = self.expect_keyword(POLICY) {
9631 self.prev_token();
9632 return Err(e);
9633 }
9634 ObjectType::NetworkPolicy
9635 }
9636 _ => unreachable!(),
9637 },
9638 )
9639 }
9640
9641 fn parse_object_type(&mut self) -> Option<ObjectType> {
9643 Some(
9644 match self.parse_one_of_keywords(&[
9645 TABLE,
9646 VIEW,
9647 MATERIALIZED,
9648 SOURCE,
9649 SINK,
9650 INDEX,
9651 TYPE,
9652 ROLE,
9653 USER,
9654 CLUSTER,
9655 SECRET,
9656 CONNECTION,
9657 DATABASE,
9658 SCHEMA,
9659 FUNCTION,
9660 ])? {
9661 TABLE => ObjectType::Table,
9662 VIEW => ObjectType::View,
9663 MATERIALIZED => {
9664 if self.parse_keyword(VIEW) {
9665 ObjectType::MaterializedView
9666 } else {
9667 self.prev_token();
9668 return None;
9669 }
9670 }
9671 SOURCE => ObjectType::Source,
9672 SINK => ObjectType::Sink,
9673 INDEX => ObjectType::Index,
9674 TYPE => ObjectType::Type,
9675 ROLE | USER => ObjectType::Role,
9676 CLUSTER => {
9677 if self.parse_keyword(REPLICA) {
9678 ObjectType::ClusterReplica
9679 } else {
9680 ObjectType::Cluster
9681 }
9682 }
9683 SECRET => ObjectType::Secret,
9684 CONNECTION => ObjectType::Connection,
9685 DATABASE => ObjectType::Database,
9686 SCHEMA => ObjectType::Schema,
9687 FUNCTION => ObjectType::Func,
9688 _ => unreachable!(),
9689 },
9690 )
9691 }
9692
9693 fn expect_plural_object_type(&mut self) -> Result<ObjectType, ParserError> {
9695 Ok(
9696 match self.expect_one_of_keywords(&[
9697 TABLES,
9698 VIEWS,
9699 MATERIALIZED,
9700 SOURCES,
9701 SINKS,
9702 INDEXES,
9703 TYPES,
9704 ROLES,
9705 USERS,
9706 CLUSTER,
9707 CLUSTERS,
9708 SECRETS,
9709 CONNECTIONS,
9710 DATABASES,
9711 SCHEMAS,
9712 POLICIES,
9713 ])? {
9714 TABLES => ObjectType::Table,
9715 VIEWS => ObjectType::View,
9716 MATERIALIZED => {
9717 if let Err(e) = self.expect_keyword(VIEWS) {
9718 self.prev_token();
9719 return Err(e);
9720 }
9721 ObjectType::MaterializedView
9722 }
9723 SOURCES => ObjectType::Source,
9724 SINKS => ObjectType::Sink,
9725 INDEXES => ObjectType::Index,
9726 TYPES => ObjectType::Type,
9727 ROLES | USERS => ObjectType::Role,
9728 CLUSTER => {
9729 if let Err(e) = self.expect_keyword(REPLICAS) {
9730 self.prev_token();
9731 return Err(e);
9732 }
9733 ObjectType::ClusterReplica
9734 }
9735 CLUSTERS => ObjectType::Cluster,
9736 SECRETS => ObjectType::Secret,
9737 CONNECTIONS => ObjectType::Connection,
9738 DATABASES => ObjectType::Database,
9739 SCHEMAS => ObjectType::Schema,
9740 POLICIES => ObjectType::NetworkPolicy,
9741 _ => unreachable!(),
9742 },
9743 )
9744 }
9745
9746 fn parse_plural_object_type(&mut self) -> Option<ObjectType> {
9748 Some(
9749 match self.parse_one_of_keywords(&[
9750 TABLES,
9751 VIEWS,
9752 MATERIALIZED,
9753 SOURCES,
9754 SINKS,
9755 INDEXES,
9756 TYPES,
9757 ROLES,
9758 USERS,
9759 CLUSTER,
9760 CLUSTERS,
9761 SECRETS,
9762 CONNECTIONS,
9763 DATABASES,
9764 SCHEMAS,
9765 SUBSOURCES,
9766 CONTINUAL,
9767 NETWORK,
9768 ])? {
9769 TABLES => ObjectType::Table,
9770 VIEWS => ObjectType::View,
9771 MATERIALIZED => {
9772 if self.parse_keyword(VIEWS) {
9773 ObjectType::MaterializedView
9774 } else {
9775 self.prev_token();
9776 return None;
9777 }
9778 }
9779 SOURCES => ObjectType::Source,
9780 SINKS => ObjectType::Sink,
9781 INDEXES => ObjectType::Index,
9782 TYPES => ObjectType::Type,
9783 ROLES | USERS => ObjectType::Role,
9784 CLUSTER => {
9785 if self.parse_keyword(REPLICAS) {
9786 ObjectType::ClusterReplica
9787 } else {
9788 self.prev_token();
9789 return None;
9790 }
9791 }
9792 CLUSTERS => ObjectType::Cluster,
9793 SECRETS => ObjectType::Secret,
9794 CONNECTIONS => ObjectType::Connection,
9795 DATABASES => ObjectType::Database,
9796 SCHEMAS => ObjectType::Schema,
9797 SUBSOURCES => ObjectType::Subsource,
9798 CONTINUAL => {
9799 if self.parse_keyword(TASKS) {
9800 ObjectType::ContinualTask
9801 } else {
9802 self.prev_token();
9803 return None;
9804 }
9805 }
9806 NETWORK => {
9807 if self.parse_keyword(POLICIES) {
9808 ObjectType::NetworkPolicy
9809 } else {
9810 self.prev_token();
9811 return None;
9812 }
9813 }
9814 _ => unreachable!(),
9815 },
9816 )
9817 }
9818
9819 fn expect_plural_object_type_for_privileges(&mut self) -> Result<ObjectType, ParserError> {
9822 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9823 return parser_err!(
9824 self,
9825 self.peek_prev_pos(),
9826 format!("For object type {object_type}, you must specify 'TABLES'")
9827 );
9828 }
9829 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9830 self.prev_token();
9831 return parser_err!(
9832 self,
9833 self.peek_prev_pos(),
9834 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9835 );
9836 }
9837
9838 Ok(
9839 match self.expect_one_of_keywords(&[
9840 TABLES,
9841 TYPES,
9842 CLUSTERS,
9843 SECRETS,
9844 CONNECTIONS,
9845 DATABASES,
9846 SCHEMAS,
9847 ])? {
9848 TABLES => ObjectType::Table,
9849 TYPES => ObjectType::Type,
9850 CLUSTERS => ObjectType::Cluster,
9851 SECRETS => ObjectType::Secret,
9852 CONNECTIONS => ObjectType::Connection,
9853 DATABASES => ObjectType::Database,
9854 SCHEMAS => ObjectType::Schema,
9855 _ => unreachable!(),
9856 },
9857 )
9858 }
9859
9860 fn expect_plural_system_object_type_for_privileges(
9863 &mut self,
9864 ) -> Result<SystemObjectType, ParserError> {
9865 if let Some(object_type) = self.parse_one_of_keywords(&[VIEWS, SOURCES]) {
9866 return parser_err!(
9867 self,
9868 self.peek_prev_pos(),
9869 format!("For object type {object_type}, you must specify 'TABLES'")
9870 );
9871 }
9872 if self.parse_keywords(&[MATERIALIZED, VIEWS]) {
9873 self.prev_token();
9874 return parser_err!(
9875 self,
9876 self.peek_prev_pos(),
9877 format!("For object type MATERIALIZED VIEWS, you must specify 'TABLES'")
9878 );
9879 }
9880
9881 Ok(
9882 match self.expect_one_of_keywords(&[
9883 SYSTEM,
9884 TABLES,
9885 TYPES,
9886 CLUSTERS,
9887 SECRETS,
9888 CONNECTIONS,
9889 DATABASES,
9890 SCHEMAS,
9891 ])? {
9892 SYSTEM => SystemObjectType::System,
9893 TABLES => SystemObjectType::Object(ObjectType::Table),
9894 TYPES => SystemObjectType::Object(ObjectType::Type),
9895 CLUSTERS => SystemObjectType::Object(ObjectType::Cluster),
9896 SECRETS => SystemObjectType::Object(ObjectType::Secret),
9897 CONNECTIONS => SystemObjectType::Object(ObjectType::Connection),
9898 DATABASES => SystemObjectType::Object(ObjectType::Database),
9899 SCHEMAS => SystemObjectType::Object(ObjectType::Schema),
9900 _ => unreachable!(),
9901 },
9902 )
9903 }
9904
9905 fn parse_privilege(&mut self) -> Option<Privilege> {
9907 Some(
9908 match self.parse_one_of_keywords(&[
9909 INSERT,
9910 SELECT,
9911 UPDATE,
9912 DELETE,
9913 USAGE,
9914 CREATE,
9915 CREATEROLE,
9916 CREATEDB,
9917 CREATECLUSTER,
9918 CREATENETWORKPOLICY,
9919 ])? {
9920 INSERT => Privilege::INSERT,
9921 SELECT => Privilege::SELECT,
9922 UPDATE => Privilege::UPDATE,
9923 DELETE => Privilege::DELETE,
9924 USAGE => Privilege::USAGE,
9925 CREATE => Privilege::CREATE,
9926 CREATEROLE => Privilege::CREATEROLE,
9927 CREATEDB => Privilege::CREATEDB,
9928 CREATECLUSTER => Privilege::CREATECLUSTER,
9929 CREATENETWORKPOLICY => Privilege::CREATENETWORKPOLICY,
9930 _ => unreachable!(),
9931 },
9932 )
9933 }
9934
9935 fn parse_privilege_specification(&mut self) -> Option<PrivilegeSpecification> {
9937 if self.parse_keyword(ALL) {
9938 let _ = self.parse_keyword(PRIVILEGES);
9939 return Some(PrivilegeSpecification::All);
9940 }
9941
9942 let mut privileges = Vec::new();
9943 while let Some(privilege) = self.parse_privilege() {
9944 privileges.push(privilege);
9945 if !self.consume_token(&Token::Comma) {
9946 break;
9947 }
9948 }
9949
9950 if privileges.is_empty() {
9951 None
9952 } else {
9953 Some(PrivilegeSpecification::Privileges(privileges))
9954 }
9955 }
9956
9957 fn expect_role_specification(&mut self) -> Result<Ident, ParserError> {
9959 let _ = self.parse_keyword(GROUP);
9960 self.parse_identifier()
9961 }
9962
9963 fn parse_reassign_owned(&mut self) -> Result<Statement<Raw>, ParserError> {
9966 self.expect_keywords(&[OWNED, BY])?;
9967 let old_roles = self.parse_comma_separated(Parser::parse_identifier)?;
9968 self.expect_keyword(TO)?;
9969 let new_role = self.parse_identifier()?;
9970 Ok(Statement::ReassignOwned(ReassignOwnedStatement {
9971 old_roles,
9972 new_role,
9973 }))
9974 }
9975
9976 fn parse_comment(&mut self) -> Result<Statement<Raw>, ParserError> {
9977 self.expect_keyword(ON)?;
9978
9979 let object = match self.expect_one_of_keywords(&[
9980 TABLE,
9981 VIEW,
9982 COLUMN,
9983 MATERIALIZED,
9984 SOURCE,
9985 SINK,
9986 INDEX,
9987 FUNCTION,
9988 CONNECTION,
9989 TYPE,
9990 SECRET,
9991 ROLE,
9992 DATABASE,
9993 SCHEMA,
9994 CLUSTER,
9995 CONTINUAL,
9996 NETWORK,
9997 ])? {
9998 TABLE => {
9999 let name = self.parse_raw_name()?;
10000 CommentObjectType::Table { name }
10001 }
10002 VIEW => {
10003 let name = self.parse_raw_name()?;
10004 CommentObjectType::View { name }
10005 }
10006 MATERIALIZED => {
10007 self.expect_keyword(VIEW)?;
10008 let name = self.parse_raw_name()?;
10009 CommentObjectType::MaterializedView { name }
10010 }
10011 SOURCE => {
10012 let name = self.parse_raw_name()?;
10013 CommentObjectType::Source { name }
10014 }
10015 SINK => {
10016 let name = self.parse_raw_name()?;
10017 CommentObjectType::Sink { name }
10018 }
10019 INDEX => {
10020 let name = self.parse_raw_name()?;
10021 CommentObjectType::Index { name }
10022 }
10023 FUNCTION => {
10024 let name = self.parse_raw_name()?;
10025 CommentObjectType::Func { name }
10026 }
10027 CONNECTION => {
10028 let name = self.parse_raw_name()?;
10029 CommentObjectType::Connection { name }
10030 }
10031 TYPE => {
10032 let ty = self.parse_data_type()?;
10033 CommentObjectType::Type { ty }
10034 }
10035 SECRET => {
10036 let name = self.parse_raw_name()?;
10037 CommentObjectType::Secret { name }
10038 }
10039 ROLE => {
10040 let name = self.parse_identifier()?;
10041 CommentObjectType::Role { name }
10042 }
10043 DATABASE => {
10044 let name = self.parse_database_name()?;
10045 CommentObjectType::Database { name }
10046 }
10047 SCHEMA => {
10048 let name = self.parse_schema_name()?;
10049 CommentObjectType::Schema { name }
10050 }
10051 CLUSTER => {
10052 if self.parse_keyword(REPLICA) {
10053 let name = self.parse_cluster_replica_name()?;
10054 CommentObjectType::ClusterReplica { name }
10055 } else {
10056 let name = self.parse_raw_ident()?;
10057 CommentObjectType::Cluster { name }
10058 }
10059 }
10060 COLUMN => {
10061 let name = self.parse_column_name()?;
10062 CommentObjectType::Column { name }
10063 }
10064 CONTINUAL => {
10065 self.expect_keyword(TASK)?;
10066 let name = self.parse_raw_name()?;
10067 CommentObjectType::ContinualTask { name }
10068 }
10069 NETWORK => {
10070 self.expect_keyword(POLICY)?;
10071 let name = self.parse_raw_network_policy_name()?;
10072 CommentObjectType::NetworkPolicy { name }
10073 }
10074 _ => unreachable!(),
10075 };
10076
10077 self.expect_keyword(IS)?;
10078 let comment = match self.next_token() {
10079 Some(Token::Keyword(NULL)) => None,
10080 Some(Token::String(s)) => Some(s),
10081 other => return self.expected(self.peek_prev_pos(), "NULL or literal string", other),
10082 };
10083
10084 Ok(Statement::Comment(CommentStatement { object, comment }))
10085 }
10086
10087 pub fn new_identifier<S>(&self, s: S) -> Result<Ident, ParserError>
10088 where
10089 S: TryInto<IdentString>,
10090 <S as TryInto<IdentString>>::Error: fmt::Display,
10091 {
10092 Ident::new(s).map_err(|e| ParserError {
10093 pos: self.peek_prev_pos(),
10094 message: e.to_string(),
10095 })
10096 }
10097}
10098
10099impl CheckedRecursion for Parser<'_> {
10100 fn recursion_guard(&self) -> &RecursionGuard {
10101 &self.recursion_guard
10102 }
10103}
10104
10105enum ParenthesizedFragment {
10109 Query(Query<Raw>),
10110 Exprs(Vec<Expr<Raw>>),
10111}
10112
10113impl ParenthesizedFragment {
10114 fn into_expr(self) -> Expr<Raw> {
10116 match self {
10117 ParenthesizedFragment::Exprs(exprs) => {
10118 if exprs.len() == 1 {
10121 Expr::Nested(Box::new(exprs.into_element()))
10124 } else {
10125 Expr::Row { exprs }
10128 }
10129 }
10130 ParenthesizedFragment::Query(query) => Expr::Subquery(Box::new(query)),
10132 }
10133 }
10134}
10135
10136include!(concat!(env!("OUT_DIR"), "/parse.simple_options.rs"));