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