sqlparser_mysql/dds/
drop_tablespace.rs1use core::fmt;
2use std::fmt::Formatter;
3use std::str;
4
5use nom::bytes::complete::tag_no_case;
6use nom::character::complete::multispace0;
7use nom::combinator::{map, opt};
8use nom::sequence::tuple;
9use nom::IResult;
10
11use base::error::ParseSQLError;
12use base::CommonParser;
13
14#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
16pub struct DropTablespaceStatement {
17 pub undo: bool,
18 pub tablespace_name: String,
19 pub engine_name: Option<String>,
20}
21
22impl DropTablespaceStatement {
23 pub fn parse(i: &str) -> IResult<&str, DropTablespaceStatement, ParseSQLError<&str>> {
24 let mut parser = tuple((
25 tag_no_case("DROP "),
26 multispace0,
27 opt(tag_no_case("UNDO")),
28 multispace0,
29 tag_no_case("TABLESPACE "),
30 multispace0,
31 map(CommonParser::sql_identifier, String::from),
32 multispace0,
33 opt(|x| CommonParser::parse_string_value_with_key(x, "ENGINE".to_string())),
34 CommonParser::statement_terminator,
35 ));
36 let (remaining_input, (_, _, opt_undo, _, _, _, tablespace_name, _, engine_name, _)) =
37 parser(i)?;
38
39 Ok((
40 remaining_input,
41 DropTablespaceStatement {
42 undo: opt_undo.is_some(),
43 tablespace_name,
44 engine_name,
45 },
46 ))
47 }
48}
49
50impl fmt::Display for DropTablespaceStatement {
51 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
52 write!(f, "DROP")?;
53 if self.undo {
54 write!(f, " UNDO")?;
55 }
56 write!(f, " TABLESPACE")?;
57 write!(f, " {}", self.tablespace_name)?;
58 if let Some(ref engine_name) = self.engine_name {
59 write!(f, " ENGINE = {}", engine_name)?;
60 }
61 Ok(())
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use dds::drop_tablespace::DropTablespaceStatement;
68
69 #[test]
70 fn parse_drop_tablespace() {
71 let sqls = [
72 "DROP TABLESPACE tablespace_name;",
73 "DROP UNDO TABLESPACE tablespace_name;",
74 "DROP TABLESPACE tablespace_name ENGINE = demo;",
75 "DROP UNDO TABLESPACE tablespace_name ENGINE = demo;",
76 ];
77
78 let exp_statements = [
79 DropTablespaceStatement {
80 undo: false,
81 tablespace_name: "tablespace_name".to_string(),
82 engine_name: None,
83 },
84 DropTablespaceStatement {
85 undo: true,
86 tablespace_name: "tablespace_name".to_string(),
87 engine_name: None,
88 },
89 DropTablespaceStatement {
90 undo: false,
91 tablespace_name: "tablespace_name".to_string(),
92 engine_name: Some("demo".to_string()),
93 },
94 DropTablespaceStatement {
95 undo: true,
96 tablespace_name: "tablespace_name".to_string(),
97 engine_name: Some("demo".to_string()),
98 },
99 ];
100
101 for i in 0..sqls.len() {
102 let res = DropTablespaceStatement::parse(sqls[i]);
103 assert!(res.is_ok());
104 assert_eq!(res.unwrap().1, exp_statements[i])
105 }
106 }
107}