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 @@ -11406,6 +11406,8 @@ fn parse_execute_stored_procedure() {
1140611406 immediate: false,
1140711407 using: vec![],
1140811408 into: vec![],
11409+ output: false,
11410+ default: false,
1140911411 };
1141011412 assert_eq!(
1141111413 // Microsoft SQL Server does not use parentheses around arguments for EXECUTE
@@ -11420,6 +11422,18 @@ fn parse_execute_stored_procedure() {
1142011422 ),
1142111423 expected
1142211424 );
11425+ match ms_and_generic().verified_stmt("EXECUTE dbo.proc1 @ReturnVal = @X OUTPUT") {
11426+ Statement::Execute { output, .. } => {
11427+ assert!(output);
11428+ }
11429+ _ => unreachable!(),
11430+ }
11431+ match ms_and_generic().verified_stmt("EXECUTE dbo.proc1 DEFAULT") {
11432+ Statement::Execute { default, .. } => {
11433+ assert!(default);
11434+ }
11435+ _ => unreachable!(),
11436+ }
1142311437}
1142411438
1142511439#[test]
@@ -11438,6 +11452,8 @@ fn parse_execute_immediate() {
1143811452 into: vec![Ident::new("a")],
1143911453 name: None,
1144011454 has_parentheses: false,
11455+ output: false,
11456+ default: false,
1144111457 };
1144211458
1144311459 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