sqlparser_mysql/dds/
truncate_table.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::combinator::opt;
8use nom::sequence::tuple;
9use nom::IResult;
10
11use base::error::ParseSQLError;
12use base::table::Table;
13use base::CommonParser;
14
15/// parse `TRUNCATE [TABLE] tbl_name`
16#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
17pub struct TruncateTableStatement {
18    pub table: Table,
19}
20
21impl TruncateTableStatement {
22    pub fn parse(i: &str) -> IResult<&str, TruncateTableStatement, ParseSQLError<&str>> {
23        let mut parser = tuple((
24            tag_no_case("TRUNCATE "),
25            multispace0,
26            opt(tag_no_case("TABLE ")),
27            multispace0,
28            Table::without_alias,
29            CommonParser::statement_terminator,
30        ));
31        let (remaining_input, (_, _, _, _, table, _)) = parser(i)?;
32
33        Ok((remaining_input, TruncateTableStatement { table }))
34    }
35}
36
37impl fmt::Display for TruncateTableStatement {
38    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
39        write!(f, "TRUNCATE TABLE ")?;
40        if self.table.schema.is_some() {
41            write!(f, "{}.", self.table.schema.clone().unwrap())?;
42        }
43        write!(f, " {}", self.table.name.clone())?;
44        Ok(())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use base::table::Table;
51    use dds::truncate_table::TruncateTableStatement;
52
53    #[test]
54    fn parse_truncate_table() {
55        let sqls = [
56            "TRUNCATE table_name",
57            "TRUNCATE     db_name.table_name",
58            "TRUNCATE   TABLE db_name.table_name",
59            "TRUNCATE TABLE table_name",
60        ];
61
62        let table_name = Table::from("table_name");
63        let table_name_with_schema = Table::from(("db_name", "table_name"));
64
65        let exp_statements = vec![
66            TruncateTableStatement {
67                table: table_name.clone(),
68            },
69            TruncateTableStatement {
70                table: table_name_with_schema.clone(),
71            },
72            TruncateTableStatement {
73                table: table_name_with_schema.clone(),
74            },
75            TruncateTableStatement {
76                table: table_name.clone(),
77            },
78        ];
79
80        for i in 0..sqls.len() {
81            let res = TruncateTableStatement::parse(sqls[i]);
82            assert!(res.is_ok());
83            assert_eq!(res.unwrap().1, exp_statements[i]);
84        }
85    }
86}