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