mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-12-23 11:12:51 +00:00
Add support for procedure parameter default values (#2041)
Some checks failed
license / Release Audit Tool (RAT) (push) Has been cancelled
Rust / codestyle (push) Has been cancelled
Rust / lint (push) Has been cancelled
Rust / benchmark-lint (push) Has been cancelled
Rust / compile (push) Has been cancelled
Rust / docs (push) Has been cancelled
Rust / compile-no-std (push) Has been cancelled
Rust / test (beta) (push) Has been cancelled
Rust / test (nightly) (push) Has been cancelled
Rust / test (stable) (push) Has been cancelled
Some checks failed
license / Release Audit Tool (RAT) (push) Has been cancelled
Rust / codestyle (push) Has been cancelled
Rust / lint (push) Has been cancelled
Rust / benchmark-lint (push) Has been cancelled
Rust / compile (push) Has been cancelled
Rust / docs (push) Has been cancelled
Rust / compile-no-std (push) Has been cancelled
Rust / test (beta) (push) Has been cancelled
Rust / test (nightly) (push) Has been cancelled
Rust / test (stable) (push) Has been cancelled
This commit is contained in:
parent
8c82fc0a19
commit
0fb3b6b11c
4 changed files with 75 additions and 5 deletions
|
|
@ -1173,12 +1173,19 @@ pub struct ProcedureParam {
|
|||
pub name: Ident,
|
||||
pub data_type: DataType,
|
||||
pub mode: Option<ArgMode>,
|
||||
pub default: Option<Expr>,
|
||||
}
|
||||
|
||||
impl fmt::Display for ProcedureParam {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
if let Some(mode) = &self.mode {
|
||||
write!(f, "{mode} {} {}", self.name, self.data_type)
|
||||
if let Some(default) = &self.default {
|
||||
write!(f, "{mode} {} {} = {}", self.name, self.data_type, default)
|
||||
} else {
|
||||
write!(f, "{mode} {} {}", self.name, self.data_type)
|
||||
}
|
||||
} else if let Some(default) = &self.default {
|
||||
write!(f, "{} {} = {}", self.name, self.data_type, default)
|
||||
} else {
|
||||
write!(f, "{} {}", self.name, self.data_type)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7904,10 +7904,17 @@ impl<'a> Parser<'a> {
|
|||
};
|
||||
let name = self.parse_identifier()?;
|
||||
let data_type = self.parse_data_type()?;
|
||||
let default = if self.consume_token(&Token::Eq) {
|
||||
Some(self.parse_expr()?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
Ok(ProcedureParam {
|
||||
name,
|
||||
data_type,
|
||||
mode,
|
||||
default,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16505,7 +16505,8 @@ fn parse_create_procedure_with_parameter_modes() {
|
|||
span: fake_span,
|
||||
},
|
||||
data_type: DataType::Integer(None),
|
||||
mode: Some(ArgMode::In)
|
||||
mode: Some(ArgMode::In),
|
||||
default: None,
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident {
|
||||
|
|
@ -16514,7 +16515,8 @@ fn parse_create_procedure_with_parameter_modes() {
|
|||
span: fake_span,
|
||||
},
|
||||
data_type: DataType::Text,
|
||||
mode: Some(ArgMode::Out)
|
||||
mode: Some(ArgMode::Out),
|
||||
default: None,
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident {
|
||||
|
|
@ -16523,7 +16525,8 @@ fn parse_create_procedure_with_parameter_modes() {
|
|||
span: fake_span,
|
||||
},
|
||||
data_type: DataType::Timestamp(None, TimezoneInfo::None),
|
||||
mode: Some(ArgMode::InOut)
|
||||
mode: Some(ArgMode::InOut),
|
||||
default: None,
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident {
|
||||
|
|
@ -16532,13 +16535,60 @@ fn parse_create_procedure_with_parameter_modes() {
|
|||
span: fake_span,
|
||||
},
|
||||
data_type: DataType::Bool,
|
||||
mode: None
|
||||
mode: None,
|
||||
default: None,
|
||||
},
|
||||
])
|
||||
);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
||||
// parameters with default values
|
||||
let sql = r#"CREATE PROCEDURE test_proc (IN a INTEGER = 1, OUT b TEXT = '2', INOUT c TIMESTAMP = NULL, d BOOL = 0) AS BEGIN SELECT 1; END"#;
|
||||
match verified_stmt(sql) {
|
||||
Statement::CreateProcedure {
|
||||
or_alter,
|
||||
name,
|
||||
params,
|
||||
..
|
||||
} => {
|
||||
assert_eq!(or_alter, false);
|
||||
assert_eq!(name.to_string(), "test_proc");
|
||||
assert_eq!(
|
||||
params,
|
||||
Some(vec![
|
||||
ProcedureParam {
|
||||
name: Ident::new("a"),
|
||||
data_type: DataType::Integer(None),
|
||||
mode: Some(ArgMode::In),
|
||||
default: Some(Expr::Value((number("1")).with_empty_span())),
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident::new("b"),
|
||||
data_type: DataType::Text,
|
||||
mode: Some(ArgMode::Out),
|
||||
default: Some(Expr::Value(
|
||||
Value::SingleQuotedString("2".into()).with_empty_span()
|
||||
)),
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident::new("c"),
|
||||
data_type: DataType::Timestamp(None, TimezoneInfo::None),
|
||||
mode: Some(ArgMode::InOut),
|
||||
default: Some(Expr::Value(Value::Null.with_empty_span())),
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident::new("d"),
|
||||
data_type: DataType::Bool,
|
||||
mode: None,
|
||||
default: Some(Expr::Value((number("0")).with_empty_span())),
|
||||
}
|
||||
]),
|
||||
);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -156,6 +156,7 @@ fn parse_create_procedure() {
|
|||
},
|
||||
data_type: DataType::Int(None),
|
||||
mode: None,
|
||||
default: None,
|
||||
},
|
||||
ProcedureParam {
|
||||
name: Ident {
|
||||
|
|
@ -168,6 +169,7 @@ fn parse_create_procedure() {
|
|||
unit: None
|
||||
})),
|
||||
mode: None,
|
||||
default: None,
|
||||
}
|
||||
]),
|
||||
name: ObjectName::from(vec![Ident {
|
||||
|
|
@ -196,6 +198,10 @@ fn parse_mssql_create_procedure() {
|
|||
let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN SELECT [foo], CASE WHEN [foo] IS NULL THEN 'empty' ELSE 'notempty' END AS [foo]; END");
|
||||
// Multiple statements
|
||||
let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN UPDATE bar SET col = 'test'; SELECT [foo] FROM BAR WHERE [FOO] > 10; END");
|
||||
|
||||
// parameters with default values
|
||||
let sql = r#"CREATE PROCEDURE foo (IN @a INTEGER = 1, OUT @b TEXT = '2', INOUT @c DATETIME = NULL, @d BOOL = 0) AS BEGIN SELECT 1; END"#;
|
||||
let _ = ms().verified_stmt(sql);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue