-
Notifications
You must be signed in to change notification settings - Fork 664
MSSQL: Add support for functionality MERGE output clause
#1790
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
658ebcd
76f7b2a
3a29477
9ff8e18
4a09db2
9be6b27
89ee390
e392494
ddb163c
afc3c5e
e6989fc
51990f8
62b29ea
01c7db6
445ec39
bde8157
9b27153
8ffca52
6b1bc46
f8e197a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -632,6 +632,7 @@ define_keywords!( | |
| ORGANIZATION, | ||
| OUT, | ||
| OUTER, | ||
| OUTPUT, | ||
| OUTPUTFORMAT, | ||
| OVER, | ||
| OVERFLOW, | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14489,7 +14489,10 @@ impl<'a> Parser<'a> { | |
| pub fn parse_merge_clauses(&mut self) -> Result<Vec<MergeClause>, ParserError> { | ||
| let mut clauses = vec![]; | ||
| loop { | ||
| if self.peek_token() == Token::EOF || self.peek_token() == Token::SemiColon { | ||
| if self.peek_token() == Token::EOF | ||
| || self.peek_token() == Token::SemiColon | ||
| || self.peek_keyword(Keyword::OUTPUT) | ||
iffyio marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| { | ||
| break; | ||
| } | ||
| self.expect_keyword_is(Keyword::WHEN)?; | ||
|
|
@@ -14586,6 +14589,29 @@ impl<'a> Parser<'a> { | |
| Ok(clauses) | ||
| } | ||
|
|
||
| pub fn parse_output(&mut self) -> Result<Output, ParserError> { | ||
dilovancelik marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| self.expect_keyword_is(Keyword::OUTPUT)?; | ||
| let select_items = self.parse_projection()?; | ||
| self.expect_keyword_is(Keyword::INTO)?; | ||
| let temporary = self | ||
| .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY]) | ||
| .is_some(); | ||
| let unlogged = self.parse_keyword(Keyword::UNLOGGED); | ||
| let table = self.parse_keyword(Keyword::TABLE); | ||
| let name = self.parse_object_name(false)?; | ||
| let into_table = SelectInto { | ||
| temporary, | ||
| unlogged, | ||
| table, | ||
| name, | ||
| }; | ||
|
||
|
|
||
| Ok(Output { | ||
| select_items, | ||
| into_table, | ||
| }) | ||
| } | ||
|
|
||
| pub fn parse_merge(&mut self) -> Result<Statement, ParserError> { | ||
| let into = self.parse_keyword(Keyword::INTO); | ||
|
|
||
|
|
@@ -14596,13 +14622,19 @@ impl<'a> Parser<'a> { | |
| self.expect_keyword_is(Keyword::ON)?; | ||
| let on = self.parse_expr()?; | ||
| let clauses = self.parse_merge_clauses()?; | ||
| let output = if self.peek_keyword(Keyword::OUTPUT) { | ||
| Some(self.parse_output()?) | ||
| } else { | ||
| None | ||
| }; | ||
|
|
||
| Ok(Statement::Merge { | ||
| into, | ||
| table, | ||
| source, | ||
| on: Box::new(on), | ||
| clauses, | ||
| output, | ||
| }) | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.