sqlparser_mysql/dds/
truncate_table.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::combinator::opt;
8use nom::sequence::tuple;
9use nom::IResult;
10
11use base::error::ParseSQLError;
12use base::table::Table;
13use base::CommonParser;
14
15#[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}