sqlparser_mysql/dds/
drop_trigger.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::sequence::tuple;
8use nom::IResult;
9
10use base::error::ParseSQLError;
11use base::trigger::Trigger;
12use base::CommonParser;
13
14/// parse `DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name`
15#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
16pub struct DropTriggerStatement {
17    pub if_exists: bool,
18    pub trigger_name: Trigger,
19}
20
21impl DropTriggerStatement {
22    pub fn parse(i: &str) -> IResult<&str, DropTriggerStatement, ParseSQLError<&str>> {
23        let mut parser = tuple((
24            tag_no_case("DROP "),
25            multispace0,
26            tag_no_case("TRIGGER "),
27            CommonParser::parse_if_exists,
28            multispace0,
29            Trigger::parse,
30            multispace0,
31            CommonParser::statement_terminator,
32        ));
33        let (remaining_input, (_, _, _, opt_if_exists, _, trigger_name, _, _)) = parser(i)?;
34
35        Ok((
36            remaining_input,
37            DropTriggerStatement {
38                if_exists: opt_if_exists.is_some(),
39                trigger_name,
40            },
41        ))
42    }
43}
44
45impl fmt::Display for DropTriggerStatement {
46    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
47        write!(f, "DROP TRIGGER")?;
48        if self.if_exists {
49            write!(f, " IF EXISTS")?;
50        }
51        write!(f, " {}", self.trigger_name)?;
52        Ok(())
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use base::Trigger;
59    use dds::drop_trigger::DropTriggerStatement;
60
61    #[test]
62    fn test_drop_trigger() {
63        let sqls = [
64            "DROP TRIGGER trigger_name;",
65            "DROP TRIGGER db_name.trigger_name;",
66            "DROP TRIGGER IF EXISTS trigger_name;",
67            "DROP TRIGGER IF EXISTS db_name.trigger_name;",
68        ];
69
70        let exp_statements = [
71            DropTriggerStatement {
72                if_exists: false,
73                trigger_name: Trigger {
74                    name: "trigger_name".to_string(),
75                    schema: None,
76                },
77            },
78            DropTriggerStatement {
79                if_exists: false,
80                trigger_name: Trigger {
81                    name: "trigger_name".to_string(),
82                    schema: Some("db_name".to_string()),
83                },
84            },
85            DropTriggerStatement {
86                if_exists: true,
87                trigger_name: Trigger {
88                    name: "trigger_name".to_string(),
89                    schema: None,
90                },
91            },
92            DropTriggerStatement {
93                if_exists: true,
94                trigger_name: Trigger {
95                    name: "trigger_name".to_string(),
96                    schema: Some("db_name".to_string()),
97                },
98            },
99        ];
100
101        for i in 0..sqls.len() {
102            let res = DropTriggerStatement::parse(sqls[i]);
103            assert!(res.is_ok());
104            assert_eq!(res.unwrap().1, exp_statements[i])
105        }
106    }
107}