sqlparser_mysql/dds/
drop_server.rs

1use core::fmt;
2use std::fmt::Formatter;
3
4use nom::bytes::complete::tag_no_case;
5use nom::character::complete::{multispace0, multispace1};
6use nom::combinator::map;
7use nom::sequence::{terminated, tuple};
8use nom::IResult;
9
10use base::error::ParseSQLError;
11use base::CommonParser;
12
13/// parse `DROP SERVER [ IF EXISTS ] server_name`
14#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
15pub struct DropServerStatement {
16    pub if_exists: bool,
17    pub server_name: String,
18}
19
20impl DropServerStatement {
21    /// DROP SERVER [ IF EXISTS ] server_name
22    pub fn parse(i: &str) -> IResult<&str, DropServerStatement, ParseSQLError<&str>> {
23        map(
24            tuple((
25                terminated(tag_no_case("DROP"), multispace1),
26                terminated(tag_no_case("SERVER"), multispace1),
27                CommonParser::parse_if_exists,
28                map(CommonParser::sql_identifier, String::from),
29                multispace0,
30                CommonParser::statement_terminator,
31            )),
32            |x| DropServerStatement {
33                if_exists: x.2.is_some(),
34                server_name: x.3,
35            },
36        )(i)
37    }
38}
39
40impl fmt::Display for DropServerStatement {
41    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
42        write!(f, "DROP SERVER")?;
43        if self.if_exists {
44            write!(f, " IF EXISTS")?;
45        }
46        write!(f, " {}", self.server_name)?;
47        Ok(())
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use dds::drop_server::DropServerStatement;
54
55    #[test]
56    fn test_drop_server() {
57        let sqls = [
58            "DROP SERVER server_name;",
59            "DROP SERVER IF EXISTS server_name;",
60        ];
61        for i in 0..sqls.len() {
62            println!("{}/{}", i + 1, sqls.len());
63            let res = DropServerStatement::parse(sqls[i]);
64            assert!(res.is_ok());
65            println!("{:?}", res);
66        }
67    }
68}