Support basic CREATE PROCEDURE of MSSQL (#900)

Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
This commit is contained in:
delsehi 2023-06-22 17:09:14 +02:00 committed by GitHub
parent 75f18ecfda
commit f72b5a5d9b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 185 additions and 4 deletions

View file

@ -55,6 +55,88 @@ fn parse_mssql_delimited_identifiers() {
);
}
#[test]
fn parse_create_procedure() {
let sql = "CREATE OR ALTER PROCEDURE test (@foo INT, @bar VARCHAR(256)) AS BEGIN SELECT 1 END";
#[cfg(feature = "bigdecimal")]
let one = Value::Number(bigdecimal::BigDecimal::from(1), false);
#[cfg(not(feature = "bigdecimal"))]
let one = Value::Number("1".to_string(), false);
assert_eq!(
ms().verified_stmt(sql),
Statement::CreateProcedure {
or_alter: true,
body: vec![Statement::Query(Box::new(Query {
with: None,
limit: None,
offset: None,
fetch: None,
locks: vec![],
order_by: vec![],
body: Box::new(SetExpr::Select(Box::new(Select {
distinct: None,
top: None,
projection: vec![SelectItem::UnnamedExpr(Expr::Value(one))],
into: None,
from: vec![],
lateral_views: vec![],
selection: None,
group_by: vec![],
cluster_by: vec![],
distribute_by: vec![],
sort_by: vec![],
having: None,
named_window: vec![],
qualify: None
})))
}))],
params: Some(vec![
ProcedureParam {
name: Ident {
value: "@foo".into(),
quote_style: None
},
data_type: DataType::Int(None)
},
ProcedureParam {
name: Ident {
value: "@bar".into(),
quote_style: None
},
data_type: DataType::Varchar(Some(CharacterLength {
length: 256,
unit: None
}))
}
]),
name: ObjectName(vec![Ident {
value: "test".into(),
quote_style: None
}])
}
)
}
#[test]
fn parse_mssql_create_procedure() {
let _ = ms_and_generic().verified_stmt("CREATE OR ALTER PROCEDURE foo AS BEGIN SELECT 1 END");
let _ = ms_and_generic().verified_stmt("CREATE PROCEDURE foo AS BEGIN SELECT 1 END");
let _ = ms().verified_stmt(
"CREATE PROCEDURE foo AS BEGIN SELECT [myColumn] FROM [myschema].[mytable] END",
);
let _ = ms_and_generic().verified_stmt(
"CREATE PROCEDURE foo (@CustomerName NVARCHAR(50)) AS BEGIN SELECT * FROM DEV END",
);
let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN UPDATE bar SET col = 'test' END");
// Test a statement with END in it
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");
}
#[test]
fn parse_mssql_apply_join() {
let _ = ms_and_generic().verified_only_select(