Skip to content

Commit f055916

Browse files
committed
Squashed merge of mssql-param-default-value
1 parent e48f73d commit f055916

File tree

4 files changed

+59
-5
lines changed

4 files changed

+59
-5
lines changed

src/ast/ddl.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1458,12 +1458,19 @@ pub struct ProcedureParam {
14581458
pub name: Ident,
14591459
pub data_type: DataType,
14601460
pub mode: Option<ArgMode>,
1461+
pub default: Option<Expr>,
14611462
}
14621463

14631464
impl fmt::Display for ProcedureParam {
14641465
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
14651466
if let Some(mode) = &self.mode {
1466-
write!(f, "{mode} {} {}", self.name, self.data_type)
1467+
if let Some(default) = &self.default {
1468+
write!(f, "{mode} {} {} = {}", self.name, self.data_type, default)
1469+
} else {
1470+
write!(f, "{mode} {} {}", self.name, self.data_type)
1471+
}
1472+
} else if let Some(default) = &self.default {
1473+
write!(f, "{} {} = {}", self.name, self.data_type, default)
14671474
} else {
14681475
write!(f, "{} {}", self.name, self.data_type)
14691476
}

src/parser/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7985,10 +7985,17 @@ impl<'a> Parser<'a> {
79857985
};
79867986
let name = self.parse_identifier()?;
79877987
let data_type = self.parse_data_type()?;
7988+
let default = if self.consume_token(&Token::Eq) {
7989+
Some(self.parse_expr()?)
7990+
} else {
7991+
None
7992+
};
7993+
79887994
Ok(ProcedureParam {
79897995
name,
79907996
data_type,
79917997
mode,
7998+
default,
79927999
})
79938000
}
79948001

tests/sqlparser_common.rs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16600,7 +16600,8 @@ fn parse_create_procedure_with_parameter_modes() {
1660016600
span: fake_span,
1660116601
},
1660216602
data_type: DataType::Integer(None),
16603-
mode: Some(ArgMode::In)
16603+
mode: Some(ArgMode::In),
16604+
default: None,
1660416605
},
1660516606
ProcedureParam {
1660616607
name: Ident {
@@ -16609,7 +16610,8 @@ fn parse_create_procedure_with_parameter_modes() {
1660916610
span: fake_span,
1661016611
},
1661116612
data_type: DataType::Text,
16612-
mode: Some(ArgMode::Out)
16613+
mode: Some(ArgMode::Out),
16614+
default: None,
1661316615
},
1661416616
ProcedureParam {
1661516617
name: Ident {
@@ -16618,7 +16620,8 @@ fn parse_create_procedure_with_parameter_modes() {
1661816620
span: fake_span,
1661916621
},
1662016622
data_type: DataType::Timestamp(None, TimezoneInfo::None),
16621-
mode: Some(ArgMode::InOut)
16623+
mode: Some(ArgMode::InOut),
16624+
default: None,
1662216625
},
1662316626
ProcedureParam {
1662416627
name: Ident {
@@ -16627,7 +16630,8 @@ fn parse_create_procedure_with_parameter_modes() {
1662716630
span: fake_span,
1662816631
},
1662916632
data_type: DataType::Bool,
16630-
mode: None
16633+
mode: None,
16634+
default: None,
1663116635
},
1663216636
])
1663316637
);
@@ -16636,6 +16640,40 @@ fn parse_create_procedure_with_parameter_modes() {
1663616640
}
1663716641
}
1663816642

16643+
#[test]
16644+
fn create_procedure_with_parameter_default_value() {
16645+
let sql = r#"CREATE PROCEDURE test_proc (a INT = 42) AS BEGIN SELECT 1; END"#;
16646+
match verified_stmt(sql) {
16647+
Statement::CreateProcedure {
16648+
or_alter,
16649+
name,
16650+
params,
16651+
..
16652+
} => {
16653+
assert_eq!(or_alter, false);
16654+
assert_eq!(name.to_string(), "test_proc");
16655+
let fake_span = Span {
16656+
start: Location { line: 0, column: 0 },
16657+
end: Location { line: 0, column: 0 },
16658+
};
16659+
assert_eq!(
16660+
params,
16661+
Some(vec![ProcedureParam {
16662+
name: Ident {
16663+
value: "a".into(),
16664+
quote_style: None,
16665+
span: fake_span,
16666+
},
16667+
data_type: DataType::Int(None),
16668+
mode: None,
16669+
default: Some(Expr::Value((number("42")).with_empty_span())),
16670+
},])
16671+
);
16672+
}
16673+
_ => unreachable!(),
16674+
}
16675+
}
16676+
1663916677
#[test]
1664016678
fn parse_not_null() {
1664116679
let _ = all_dialects().expr_parses_to("x NOT NULL", "x IS NOT NULL");

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ fn parse_create_procedure() {
159159
},
160160
data_type: DataType::Int(None),
161161
mode: None,
162+
default: None,
162163
},
163164
ProcedureParam {
164165
name: Ident {
@@ -171,6 +172,7 @@ fn parse_create_procedure() {
171172
unit: None
172173
})),
173174
mode: None,
175+
default: None,
174176
}
175177
]),
176178
name: ObjectName::from(vec![Ident {

0 commit comments

Comments
 (0)