Skip to content

Commit 438ba79

Browse files
committed
Add support for procedure parameter default values
1 parent 3c61db5 commit 438ba79

File tree

4 files changed

+64
-6
lines changed

4 files changed

+64
-6
lines changed

src/ast/ddl.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,14 +1458,23 @@ 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+
}
14671472
} else {
1468-
write!(f, "{} {}", self.name, self.data_type)
1473+
if let Some(default) = &self.default {
1474+
write!(f, "{} {} = {}", self.name, self.data_type, default)
1475+
} else {
1476+
write!(f, "{} {}", self.name, self.data_type)
1477+
}
14691478
}
14701479
}
14711480
}

src/parser/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7897,10 +7897,17 @@ impl<'a> Parser<'a> {
78977897
};
78987898
let name = self.parse_identifier()?;
78997899
let data_type = self.parse_data_type()?;
7900+
let default = if self.consume_token(&Token::Eq) {
7901+
Some(self.parse_expr()?)
7902+
} else {
7903+
None
7904+
};
7905+
79007906
Ok(ProcedureParam {
79017907
name,
79027908
data_type,
79037909
mode,
7910+
default,
79047911
})
79057912
}
79067913

tests/sqlparser_common.rs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16497,7 +16497,8 @@ fn parse_create_procedure_with_parameter_modes() {
1649716497
span: fake_span,
1649816498
},
1649916499
data_type: DataType::Integer(None),
16500-
mode: Some(ArgMode::In)
16500+
mode: Some(ArgMode::In),
16501+
default: None,
1650116502
},
1650216503
ProcedureParam {
1650316504
name: Ident {
@@ -16506,7 +16507,8 @@ fn parse_create_procedure_with_parameter_modes() {
1650616507
span: fake_span,
1650716508
},
1650816509
data_type: DataType::Text,
16509-
mode: Some(ArgMode::Out)
16510+
mode: Some(ArgMode::Out),
16511+
default: None,
1651016512
},
1651116513
ProcedureParam {
1651216514
name: Ident {
@@ -16515,7 +16517,8 @@ fn parse_create_procedure_with_parameter_modes() {
1651516517
span: fake_span,
1651616518
},
1651716519
data_type: DataType::Timestamp(None, TimezoneInfo::None),
16518-
mode: Some(ArgMode::InOut)
16520+
mode: Some(ArgMode::InOut),
16521+
default: None,
1651916522
},
1652016523
ProcedureParam {
1652116524
name: Ident {
@@ -16524,7 +16527,44 @@ fn parse_create_procedure_with_parameter_modes() {
1652416527
span: fake_span,
1652516528
},
1652616529
data_type: DataType::Bool,
16527-
mode: None
16530+
mode: None,
16531+
default: None,
16532+
},
16533+
])
16534+
);
16535+
}
16536+
_ => unreachable!(),
16537+
}
16538+
}
16539+
16540+
#[test]
16541+
fn create_procedure_with_parameter_default_value() {
16542+
let sql = r#"CREATE PROCEDURE test_proc (a INT = 42) AS BEGIN SELECT 1; END"#;
16543+
match verified_stmt(sql) {
16544+
Statement::CreateProcedure {
16545+
or_alter,
16546+
name,
16547+
params,
16548+
..
16549+
} => {
16550+
assert_eq!(or_alter, false);
16551+
assert_eq!(name.to_string(), "test_proc");
16552+
let fake_span = Span {
16553+
start: Location { line: 0, column: 0 },
16554+
end: Location { line: 0, column: 0 },
16555+
};
16556+
assert_eq!(
16557+
params,
16558+
Some(vec![
16559+
ProcedureParam {
16560+
name: Ident {
16561+
value: "a".into(),
16562+
quote_style: None,
16563+
span: fake_span,
16564+
},
16565+
data_type: DataType::Int(None),
16566+
mode: None,
16567+
default: Some(Expr::Value((number("42")).with_empty_span())),
1652816568
},
1652916569
])
1653016570
);

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ fn parse_create_procedure() {
156156
},
157157
data_type: DataType::Int(None),
158158
mode: None,
159+
default: None,
159160
},
160161
ProcedureParam {
161162
name: Ident {
@@ -168,6 +169,7 @@ fn parse_create_procedure() {
168169
unit: None
169170
})),
170171
mode: None,
172+
default: None,
171173
}
172174
]),
173175
name: ObjectName::from(vec![Ident {

0 commit comments

Comments
 (0)