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