sqlparser_mysql/dds/
drop_server.rs1use 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#[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 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}