@@ -11539,6 +11539,13 @@ impl<'a> Parser<'a> {
1153911539 Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
1154011540 }
1154111541
11542+ /// Parse a MERGE statement, returning a `Box`ed SetExpr
11543+ ///
11544+ /// This is used to reduce the size of the stack frames in debug builds
11545+ fn parse_merge_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
11546+ Ok(Box::new(SetExpr::Merge(self.parse_merge()?)))
11547+ }
11548+
1154211549 pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
1154311550 let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
1154411551 // `FROM` keyword is optional in BigQuery SQL.
@@ -11750,6 +11757,20 @@ impl<'a> Parser<'a> {
1175011757 pipe_operators: vec![],
1175111758 }
1175211759 .into())
11760+ } else if self.parse_keyword(Keyword::MERGE) {
11761+ Ok(Query {
11762+ with,
11763+ body: self.parse_merge_setexpr_boxed()?,
11764+ limit_clause: None,
11765+ order_by: None,
11766+ fetch: None,
11767+ locks: vec![],
11768+ for_clause: None,
11769+ settings: None,
11770+ format_clause: None,
11771+ pipe_operators: vec![],
11772+ }
11773+ .into())
1175311774 } else {
1175411775 let body = self.parse_query_body(self.dialect.prec_unknown())?;
1175511776
@@ -16603,15 +16624,22 @@ impl<'a> Parser<'a> {
1660316624 Ok(clauses)
1660416625 }
1660516626
16606- fn parse_output(&mut self) -> Result<OutputClause, ParserError> {
16607- self.expect_keyword_is(Keyword::OUTPUT)?;
16627+ fn parse_output(&mut self, start_keyword: Keyword) -> Result<OutputClause, ParserError> {
1660816628 let select_items = self.parse_projection()?;
16609- self.expect_keyword_is(Keyword::INTO)?;
16610- let into_table = self.parse_select_into()?;
16629+ let into_table = if start_keyword == Keyword::OUTPUT && self.peek_keyword(Keyword::INTO) {
16630+ self.expect_keyword_is(Keyword::INTO)?;
16631+ Some(self.parse_select_into()?)
16632+ } else {
16633+ None
16634+ };
1661116635
16612- Ok(OutputClause {
16613- select_items,
16614- into_table,
16636+ Ok(if start_keyword == Keyword::OUTPUT {
16637+ OutputClause::Output {
16638+ select_items,
16639+ into_table,
16640+ }
16641+ } else {
16642+ OutputClause::Returning { select_items }
1661516643 })
1661616644 }
1661716645
@@ -16641,10 +16669,9 @@ impl<'a> Parser<'a> {
1664116669 self.expect_keyword_is(Keyword::ON)?;
1664216670 let on = self.parse_expr()?;
1664316671 let clauses = self.parse_merge_clauses()?;
16644- let output = if self.peek_keyword(Keyword::OUTPUT) {
16645- Some(self.parse_output()?)
16646- } else {
16647- None
16672+ let output = match self.parse_one_of_keywords(&[Keyword::OUTPUT, Keyword::RETURNING]) {
16673+ Some(start_keyword) => Some(self.parse_output(start_keyword)?),
16674+ None => None,
1664816675 };
1664916676
1665016677 Ok(Statement::Merge {
0 commit comments