sqlparser_mysql/dds/
drop_logfile_group.rs

1use core::fmt;
2use std::fmt::Formatter;
3use std::str;
4
5use nom::bytes::complete::tag_no_case;
6use nom::character::complete::multispace1;
7use nom::combinator::map;
8use nom::sequence::tuple;
9use nom::IResult;
10
11use base::error::ParseSQLError;
12use base::CommonParser;
13
14/// parse `DROP LOGFILE GROUP logfile_group ENGINE [=] engine_name`
15#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
16pub struct DropLogfileGroupStatement {
17    pub logfile_group: String,
18    pub engine_name: String,
19}
20
21impl DropLogfileGroupStatement {
22    pub fn parse(i: &str) -> IResult<&str, DropLogfileGroupStatement, ParseSQLError<&str>> {
23        let mut parser = tuple((
24            tag_no_case("DROP"),
25            multispace1,
26            tag_no_case("LOGFILE"),
27            multispace1,
28            tag_no_case("GROUP"),
29            multispace1,
30            map(CommonParser::sql_identifier, String::from),
31            multispace1,
32            |x| CommonParser::parse_string_value_with_key(x, "ENGINE".to_string()),
33            CommonParser::statement_terminator,
34        ));
35        let (remaining_input, (_, _, _, _, _, _, logfile_group, _, engine_name, _)) = parser(i)?;
36
37        Ok((
38            remaining_input,
39            DropLogfileGroupStatement {
40                logfile_group,
41                engine_name,
42            },
43        ))
44    }
45}
46
47impl fmt::Display for DropLogfileGroupStatement {
48    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
49        write!(f, "DROP LOGFILE GROUP")?;
50        write!(f, " {}", self.logfile_group)?;
51        write!(f, " ENGINE = {}", self.engine_name)?;
52        Ok(())
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use dds::drop_logfile_group::DropLogfileGroupStatement;
59
60    #[test]
61    fn parse_drop_logfile_group_parser() {
62        let sqls = [
63            "DROP LOGFILE GROUP logfile_group ENGINE = demo;",
64            "DROP LOGFILE GROUP logfile_group ENGINE bar;",
65        ];
66        let exp_statements = [
67            DropLogfileGroupStatement {
68                logfile_group: "logfile_group".to_string(),
69                engine_name: "demo".to_string(),
70            },
71            DropLogfileGroupStatement {
72                logfile_group: "logfile_group".to_string(),
73                engine_name: "bar".to_string(),
74            },
75        ];
76
77        for i in 0..sqls.len() {
78            let res = DropLogfileGroupStatement::parse(sqls[i]);
79            assert!(res.is_ok());
80            assert_eq!(res.unwrap().1, exp_statements[i])
81        }
82    }
83}