Skip to content

Commit 6862487

Browse files
ZacJWayman-sigma
authored andcommitted
Add support for LANGUAGE clause in CREATE PROCEDURE (apache#1903)
1 parent 2cd2589 commit 6862487

4 files changed

Lines changed: 46 additions & 1 deletion

File tree

src/ast/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3974,6 +3974,7 @@ pub enum Statement {
39743974
or_alter: bool,
39753975
name: ObjectName,
39763976
params: Option<Vec<ProcedureParam>>,
3977+
language: Option<Ident>,
39773978
body: ConditionalStatements,
39783979
},
39793980
/// ```sql
@@ -4877,6 +4878,7 @@ impl fmt::Display for Statement {
48774878
name,
48784879
or_alter,
48794880
params,
4881+
language,
48804882
body,
48814883
} => {
48824884
write!(
@@ -4892,6 +4894,10 @@ impl fmt::Display for Statement {
48924894
}
48934895
}
48944896

4897+
if let Some(language) = language {
4898+
write!(f, " LANGUAGE {language}")?;
4899+
}
4900+
48954901
write!(f, " AS {body}")
48964902
}
48974903
Statement::CreateMacro {

src/parser/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15834,6 +15834,13 @@ impl<'a> Parser<'a> {
1583415834
pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
1583515835
let name = self.parse_object_name(false)?;
1583615836
let params = self.parse_optional_procedure_parameters()?;
15837+
15838+
let language = if self.parse_keyword(Keyword::LANGUAGE) {
15839+
Some(self.parse_identifier()?)
15840+
} else {
15841+
None
15842+
};
15843+
1583715844
self.expect_keyword_is(Keyword::AS)?;
1583815845

1583915846
let body = self.parse_conditional_statements(&[Keyword::END])?;
@@ -15842,6 +15849,7 @@ impl<'a> Parser<'a> {
1584215849
name,
1584315850
or_alter,
1584415851
params,
15852+
language,
1584515853
body,
1584615854
})
1584715855
}

tests/sqlparser_common.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15383,6 +15383,36 @@ fn check_enforced() {
1538315383
);
1538415384
}
1538515385

15386+
#[test]
15387+
fn parse_create_procedure_with_language() {
15388+
let sql = r#"CREATE PROCEDURE test_proc LANGUAGE sql AS BEGIN SELECT 1; END"#;
15389+
match verified_stmt(sql) {
15390+
Statement::CreateProcedure {
15391+
or_alter,
15392+
name,
15393+
params,
15394+
language,
15395+
..
15396+
} => {
15397+
assert_eq!(or_alter, false);
15398+
assert_eq!(name.to_string(), "test_proc");
15399+
assert_eq!(params, Some(vec![]));
15400+
assert_eq!(
15401+
language,
15402+
Some(Ident {
15403+
value: "sql".into(),
15404+
quote_style: None,
15405+
span: Span {
15406+
start: Location::empty(),
15407+
end: Location::empty()
15408+
}
15409+
})
15410+
);
15411+
}
15412+
_ => unreachable!(),
15413+
}
15414+
}
15415+
1538615416
#[test]
1538715417
fn parse_create_procedure_with_parameter_modes() {
1538815418
let sql = r#"CREATE PROCEDURE test_proc (IN a INTEGER, OUT b TEXT, INOUT c TIMESTAMP, d BOOL) AS BEGIN SELECT 1; END"#;

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ fn parse_create_procedure() {
173173
value: "test".into(),
174174
quote_style: None,
175175
span: Span::empty(),
176-
}])
176+
}]),
177+
language: None,
177178
}
178179
)
179180
}

0 commit comments

Comments
 (0)