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