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