Skip to content

Commit b9365b3

Browse files
authored
Support procedure argmode (apache#1901)
1 parent 44f3be3 commit b9365b3

File tree

4 files changed

+87
-5
lines changed

4 files changed

+87
-5
lines changed

src/ast/ddl.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use sqlparser_derive::{Visit, VisitMut};
3030

3131
use crate::ast::value::escape_single_quote_string;
3232
use crate::ast::{
33-
display_comma_separated, display_separated, CommentDef, CreateFunctionBody,
33+
display_comma_separated, display_separated, ArgMode, CommentDef, CreateFunctionBody,
3434
CreateFunctionUsing, DataType, Expr, FunctionBehavior, FunctionCalledOnNull,
3535
FunctionDeterminismSpecifier, FunctionParallel, Ident, IndexColumn, MySQLColumnPosition,
3636
ObjectName, OperateFunctionArg, OrderByExpr, ProjectionSelect, SequenceOptions, SqlOption, Tag,
@@ -1367,11 +1367,16 @@ impl fmt::Display for NullsDistinctOption {
13671367
pub struct ProcedureParam {
13681368
pub name: Ident,
13691369
pub data_type: DataType,
1370+
pub mode: Option<ArgMode>,
13701371
}
13711372

13721373
impl fmt::Display for ProcedureParam {
13731374
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1374-
write!(f, "{} {}", self.name, self.data_type)
1375+
if let Some(mode) = &self.mode {
1376+
write!(f, "{mode} {} {}", self.name, self.data_type)
1377+
} else {
1378+
write!(f, "{} {}", self.name, self.data_type)
1379+
}
13751380
}
13761381
}
13771382

src/parser/mod.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7624,9 +7624,22 @@ impl<'a> Parser<'a> {
76247624
}
76257625

76267626
pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
7627+
let mode = if self.parse_keyword(Keyword::IN) {
7628+
Some(ArgMode::In)
7629+
} else if self.parse_keyword(Keyword::OUT) {
7630+
Some(ArgMode::Out)
7631+
} else if self.parse_keyword(Keyword::INOUT) {
7632+
Some(ArgMode::InOut)
7633+
} else {
7634+
None
7635+
};
76277636
let name = self.parse_identifier()?;
76287637
let data_type = self.parse_data_type()?;
7629-
Ok(ProcedureParam { name, data_type })
7638+
Ok(ProcedureParam {
7639+
name,
7640+
data_type,
7641+
mode,
7642+
})
76307643
}
76317644

76327645
pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {

tests/sqlparser_common.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15356,3 +15356,65 @@ fn check_enforced() {
1535615356
"CREATE TABLE t (a INT, b INT, c INT, CHECK (a > 0) NOT ENFORCED, CHECK (b > 0) ENFORCED, CHECK (c > 0))",
1535715357
);
1535815358
}
15359+
15360+
#[test]
15361+
fn parse_create_procedure_with_parameter_modes() {
15362+
let sql = r#"CREATE PROCEDURE test_proc (IN a INTEGER, OUT b TEXT, INOUT c TIMESTAMP, d BOOL) AS BEGIN SELECT 1; END"#;
15363+
match verified_stmt(sql) {
15364+
Statement::CreateProcedure {
15365+
or_alter,
15366+
name,
15367+
params,
15368+
..
15369+
} => {
15370+
assert_eq!(or_alter, false);
15371+
assert_eq!(name.to_string(), "test_proc");
15372+
let fake_span = Span {
15373+
start: Location { line: 0, column: 0 },
15374+
end: Location { line: 0, column: 0 },
15375+
};
15376+
assert_eq!(
15377+
params,
15378+
Some(vec![
15379+
ProcedureParam {
15380+
name: Ident {
15381+
value: "a".into(),
15382+
quote_style: None,
15383+
span: fake_span,
15384+
},
15385+
data_type: DataType::Integer(None),
15386+
mode: Some(ArgMode::In)
15387+
},
15388+
ProcedureParam {
15389+
name: Ident {
15390+
value: "b".into(),
15391+
quote_style: None,
15392+
span: fake_span,
15393+
},
15394+
data_type: DataType::Text,
15395+
mode: Some(ArgMode::Out)
15396+
},
15397+
ProcedureParam {
15398+
name: Ident {
15399+
value: "c".into(),
15400+
quote_style: None,
15401+
span: fake_span,
15402+
},
15403+
data_type: DataType::Timestamp(None, TimezoneInfo::None),
15404+
mode: Some(ArgMode::InOut)
15405+
},
15406+
ProcedureParam {
15407+
name: Ident {
15408+
value: "d".into(),
15409+
quote_style: None,
15410+
span: fake_span,
15411+
},
15412+
data_type: DataType::Bool,
15413+
mode: None
15414+
},
15415+
])
15416+
);
15417+
}
15418+
_ => unreachable!(),
15419+
}
15420+
}

tests/sqlparser_mssql.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ fn parse_create_procedure() {
153153
quote_style: None,
154154
span: Span::empty(),
155155
},
156-
data_type: DataType::Int(None)
156+
data_type: DataType::Int(None),
157+
mode: None,
157158
},
158159
ProcedureParam {
159160
name: Ident {
@@ -164,7 +165,8 @@ fn parse_create_procedure() {
164165
data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
165166
length: 256,
166167
unit: None
167-
}))
168+
})),
169+
mode: None,
168170
}
169171
]),
170172
name: ObjectName::from(vec![Ident {

0 commit comments

Comments
 (0)