Skip to content

Commit 6e18938

Browse files
committed
Add support for procedure parameter default values
1 parent 3c61db5 commit 6e18938

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
@@ -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: 42 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,8 @@ 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,
1652816532
},
1652916533
])
1653016534
);
@@ -16533,6 +16537,40 @@ fn parse_create_procedure_with_parameter_modes() {
1653316537
}
1653416538
}
1653516539

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![ProcedureParam {
16559+
name: Ident {
16560+
value: "a".into(),
16561+
quote_style: None,
16562+
span: fake_span,
16563+
},
16564+
data_type: DataType::Int(None),
16565+
mode: None,
16566+
default: Some(Expr::Value((number("42")).with_empty_span())),
16567+
},])
16568+
);
16569+
}
16570+
_ => unreachable!(),
16571+
}
16572+
}
16573+
1653616574
#[test]
1653716575
fn parse_not_null() {
1653816576
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
@@ -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)