@@ -11508,6 +11508,13 @@ impl<'a> Parser<'a> {
1150811508        Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
1150911509    }
1151011510
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+ 
1151111518    pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
1151211519        let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
1151311520            // `FROM` keyword is optional in BigQuery SQL.
@@ -11719,6 +11726,20 @@ impl<'a> Parser<'a> {
1171911726                pipe_operators: vec![],
1172011727            }
1172111728            .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())
1172211743        } else {
1172311744            let body = self.parse_query_body(self.dialect.prec_unknown())?;
1172411745
@@ -16571,15 +16592,22 @@ impl<'a> Parser<'a> {
1657116592        Ok(clauses)
1657216593    }
1657316594
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> {
1657616596        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+         };
1657916603
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 }
1658316611        })
1658416612    }
1658516613
@@ -16609,10 +16637,9 @@ impl<'a> Parser<'a> {
1660916637        self.expect_keyword_is(Keyword::ON)?;
1661016638        let on = self.parse_expr()?;
1661116639        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,
1661616643        };
1661716644
1661816645        Ok(Statement::Merge {
0 commit comments