sqlparser_mysql/dds/
drop_spatial_reference_system.rs

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