Skip to content

Commit 95d16e3

Browse files
authored
Add support for LANGUAGE clause in CREATE PROCEDURE (apache#1903)
1 parent 1bbc05c commit 95d16e3

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

src/ast/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3945,6 +3945,7 @@ pub enum Statement {
39453945
or_alter: bool,
39463946
name: ObjectName,
39473947
params: Option<Vec<ProcedureParam>>,
3948+
language: Option<Ident>,
39483949
body: ConditionalStatements,
39493950
},
39503951
/// ```sql
@@ -4848,6 +4849,7 @@ impl fmt::Display for Statement {
48484849
name,
48494850
or_alter,
48504851
params,
4852+
language,
48514853
body,
48524854
} => {
48534855
write!(
@@ -4863,6 +4865,10 @@ impl fmt::Display for Statement {
48634865
}
48644866
}
48654867

4868+
if let Some(language) = language {
4869+
write!(f, " LANGUAGE {language}")?;
4870+
}
4871+
48664872
write!(f, " AS {body}")
48674873
}
48684874
Statement::CreateMacro {

src/parser/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15802,6 +15802,13 @@ impl<'a> Parser<'a> {
1580215802
pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
1580315803
let name = self.parse_object_name(false)?;
1580415804
let params = self.parse_optional_procedure_parameters()?;
15805+
15806+
let language = if self.parse_keyword(Keyword::LANGUAGE) {
15807+
Some(self.parse_identifier()?)
15808+
} else {
15809+
None
15810+
};
15811+
1580515812
self.expect_keyword_is(Keyword::AS)?;
1580615813

1580715814
let body = self.parse_conditional_statements(&[Keyword::END])?;
@@ -15810,6 +15817,7 @@ impl<'a> Parser<'a> {
1581015817
name,
1581115818
or_alter,
1581215819
params,
15820+
language,
1581315821
body,
1581415822
})
1581515823
}

tests/sqlparser_common.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15357,6 +15357,36 @@ fn check_enforced() {
1535715357
);
1535815358
}
1535915359

15360+
#[test]
15361+
fn parse_create_procedure_with_language() {
15362+
let sql = r#"CREATE PROCEDURE test_proc LANGUAGE sql AS BEGIN SELECT 1; END"#;
15363+
match verified_stmt(sql) {
15364+
Statement::CreateProcedure {
15365+
or_alter,
15366+
name,
15367+
params,
15368+
language,
15369+
..
15370+
} => {
15371+
assert_eq!(or_alter, false);
15372+
assert_eq!(name.to_string(), "test_proc");
15373+
assert_eq!(params, Some(vec![]));
15374+
assert_eq!(
15375+
language,
15376+
Some(Ident {
15377+
value: "sql".into(),
15378+
quote_style: None,
15379+
span: Span {
15380+
start: Location::empty(),
15381+
end: Location::empty()
15382+
}
15383+
})
15384+
);
15385+
}
15386+
_ => unreachable!(),
15387+
}
15388+
}
15389+
1536015390
#[test]
1536115391
fn parse_create_procedure_with_parameter_modes() {
1536215392
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)