File tree Expand file tree Collapse file tree 4 files changed +47
-4
lines changed Expand file tree Collapse file tree 4 files changed +47
-4
lines changed Original file line number Diff line number Diff line change @@ -4059,6 +4059,12 @@ pub enum Statement {
40594059 immediate : bool ,
40604060 into : Vec < Ident > ,
40614061 using : Vec < ExprWithAlias > ,
4062+ /// Whether the last parameter is the return value of the procedure
4063+ /// MSSQL: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-ver17#output>
4064+ output : bool ,
4065+ /// Whether to invoke the procedure with the default parameter values
4066+ /// MSSQL: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-ver17#default>
4067+ default : bool ,
40624068 } ,
40634069 /// ```sql
40644070 /// PREPARE name [ ( data_type [, ...] ) ] AS statement
@@ -5815,6 +5821,8 @@ impl fmt::Display for Statement {
58155821 immediate,
58165822 into,
58175823 using,
5824+ output,
5825+ default,
58185826 } => {
58195827 let ( open, close) = if * has_parentheses {
58205828 ( "(" , ")" )
@@ -5835,6 +5843,12 @@ impl fmt::Display for Statement {
58355843 if !using. is_empty ( ) {
58365844 write ! ( f, " USING {}" , display_comma_separated( using) ) ?;
58375845 } ;
5846+ if * output {
5847+ write ! ( f, " OUTPUT" ) ?;
5848+ }
5849+ if * default {
5850+ write ! ( f, " DEFAULT" ) ?;
5851+ }
58385852 Ok ( ( ) )
58395853 }
58405854 Statement :: Prepare {
Original file line number Diff line number Diff line change @@ -15734,10 +15734,11 @@ impl<'a> Parser<'a> {
1573415734
1573515735 let has_parentheses = self.consume_token(&Token::LParen);
1573615736
15737+ let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
1573715738 let end_token = match (has_parentheses, self.peek_token().token) {
1573815739 (true, _) => Token::RParen,
1573915740 (false, Token::EOF) => Token::EOF,
15740- (false, Token::Word(w)) if w.keyword == Keyword::USING => Token::Word(w),
15741+ (false, Token::Word(w)) if end_kws.contains(& w.keyword) => Token::Word(w),
1574115742 (false, _) => Token::SemiColon,
1574215743 };
1574315744
@@ -15759,13 +15760,19 @@ impl<'a> Parser<'a> {
1575915760 vec![]
1576015761 };
1576115762
15763+ let output = self.parse_keyword(Keyword::OUTPUT);
15764+
15765+ let default = self.parse_keyword(Keyword::DEFAULT);
15766+
1576215767 Ok(Statement::Execute {
1576315768 immediate: name.is_none(),
1576415769 name,
1576515770 parameters,
1576615771 has_parentheses,
1576715772 into,
1576815773 using,
15774+ output,
15775+ default,
1576915776 })
1577015777 }
1577115778
Original file line number Diff line number Diff line change @@ -11393,6 +11393,8 @@ fn parse_execute_stored_procedure() {
1139311393 immediate: false,
1139411394 using: vec![],
1139511395 into: vec![],
11396+ output: false,
11397+ default: false,
1139611398 };
1139711399 assert_eq!(
1139811400 // Microsoft SQL Server does not use parentheses around arguments for EXECUTE
@@ -11407,6 +11409,18 @@ fn parse_execute_stored_procedure() {
1140711409 ),
1140811410 expected
1140911411 );
11412+ match ms_and_generic().verified_stmt("EXECUTE dbo.proc1 @ReturnVal = @X OUTPUT") {
11413+ Statement::Execute { output, .. } => {
11414+ assert!(output);
11415+ }
11416+ _ => unreachable!(),
11417+ }
11418+ match ms_and_generic().verified_stmt("EXECUTE dbo.proc1 DEFAULT") {
11419+ Statement::Execute { default, .. } => {
11420+ assert!(default);
11421+ }
11422+ _ => unreachable!(),
11423+ }
1141011424}
1141111425
1141211426#[test]
@@ -11425,6 +11439,8 @@ fn parse_execute_immediate() {
1142511439 into: vec![Ident::new("a")],
1142611440 name: None,
1142711441 has_parentheses: false,
11442+ output: false,
11443+ default: false,
1142811444 };
1142911445
1143011446 let stmt = dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a USING 1 AS b");
Original file line number Diff line number Diff line change @@ -1666,7 +1666,9 @@ fn parse_execute() {
16661666 has_parentheses: false ,
16671667 using: vec![ ] ,
16681668 immediate: false ,
1669- into: vec![ ]
1669+ into: vec![ ] ,
1670+ output: false ,
1671+ default : false ,
16701672 }
16711673 ) ;
16721674
@@ -1682,7 +1684,9 @@ fn parse_execute() {
16821684 has_parentheses: true ,
16831685 using: vec![ ] ,
16841686 immediate: false ,
1685- into: vec![ ]
1687+ into: vec![ ] ,
1688+ output: false ,
1689+ default : false ,
16861690 }
16871691 ) ;
16881692
@@ -1719,7 +1723,9 @@ fn parse_execute() {
17191723 } ,
17201724 ] ,
17211725 immediate: false ,
1722- into: vec![ ]
1726+ into: vec![ ] ,
1727+ output: false ,
1728+ default : false ,
17231729 }
17241730 ) ;
17251731}
You can’t perform that action at this time.
0 commit comments