@@ -11508,6 +11508,13 @@ impl<'a> Parser<'a> {
11508
11508
Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
11509
11509
}
11510
11510
11511
+ /// Parse a MERGE statement, returning a `Box`ed SetExpr
11512
+ ///
11513
+ /// This is used to reduce the size of the stack frames in debug builds
11514
+ fn parse_merge_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
11515
+ Ok(Box::new(SetExpr::Merge(self.parse_merge()?)))
11516
+ }
11517
+
11511
11518
pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
11512
11519
let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
11513
11520
// `FROM` keyword is optional in BigQuery SQL.
@@ -11719,6 +11726,20 @@ impl<'a> Parser<'a> {
11719
11726
pipe_operators: vec![],
11720
11727
}
11721
11728
.into())
11729
+ } else if self.parse_keyword(Keyword::MERGE) {
11730
+ Ok(Query {
11731
+ with,
11732
+ body: self.parse_merge_setexpr_boxed()?,
11733
+ limit_clause: None,
11734
+ order_by: None,
11735
+ fetch: None,
11736
+ locks: vec![],
11737
+ for_clause: None,
11738
+ settings: None,
11739
+ format_clause: None,
11740
+ pipe_operators: vec![],
11741
+ }
11742
+ .into())
11722
11743
} else {
11723
11744
let body = self.parse_query_body(self.dialect.prec_unknown())?;
11724
11745
@@ -16571,15 +16592,22 @@ impl<'a> Parser<'a> {
16571
16592
Ok(clauses)
16572
16593
}
16573
16594
16574
- fn parse_output(&mut self) -> Result<OutputClause, ParserError> {
16575
- self.expect_keyword_is(Keyword::OUTPUT)?;
16595
+ fn parse_output(&mut self, start_keyword: Keyword) -> Result<OutputClause, ParserError> {
16576
16596
let select_items = self.parse_projection()?;
16577
- self.expect_keyword_is(Keyword::INTO)?;
16578
- let into_table = self.parse_select_into()?;
16597
+ let into_table = if start_keyword == Keyword::OUTPUT && self.peek_keyword(Keyword::INTO) {
16598
+ self.expect_keyword_is(Keyword::INTO)?;
16599
+ Some(self.parse_select_into()?)
16600
+ } else {
16601
+ None
16602
+ };
16579
16603
16580
- Ok(OutputClause {
16581
- select_items,
16582
- into_table,
16604
+ Ok(if start_keyword == Keyword::OUTPUT {
16605
+ OutputClause::Output {
16606
+ select_items,
16607
+ into_table,
16608
+ }
16609
+ } else {
16610
+ OutputClause::Returning { select_items }
16583
16611
})
16584
16612
}
16585
16613
@@ -16609,10 +16637,9 @@ impl<'a> Parser<'a> {
16609
16637
self.expect_keyword_is(Keyword::ON)?;
16610
16638
let on = self.parse_expr()?;
16611
16639
let clauses = self.parse_merge_clauses()?;
16612
- let output = if self.peek_keyword(Keyword::OUTPUT) {
16613
- Some(self.parse_output()?)
16614
- } else {
16615
- None
16640
+ let output = match self.parse_one_of_keywords(&[Keyword::OUTPUT, Keyword::RETURNING]) {
16641
+ Some(start_keyword) => Some(self.parse_output(start_keyword)?),
16642
+ None => None,
16616
16643
};
16617
16644
16618
16645
Ok(Statement::Merge {
0 commit comments