Skip to content

Commit 9b9ffe4

Browse files
authored
MSSQL: Add support for EXEC output and default keywords (#1940)
1 parent 750a7aa commit 9b9ffe4

File tree

4 files changed

+47
-4
lines changed

4 files changed

+47
-4
lines changed

src/ast/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff 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 {

src/parser/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff 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

tests/sqlparser_common.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff 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");

tests/sqlparser_postgres.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff 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
}

0 commit comments

Comments
 (0)