sqlparser_mysql/dds/
drop_tablespace.rs

1use 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/// parse `DROP [UNDO] TABLESPACE tablespace_name [ENGINE [=] engine_name]`
15#[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}