@@ -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