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