sql_parse/truncate.rs
1use crate::{
2 keywords::Keyword,
3 parser::{ParseError, Parser},
4 qualified_name::parse_qualified_name,
5 QualifiedName, Span, Spanned,
6};
7
8/// Represent a truncate table statement
9/// ```
10/// # use sql_parse::{SQLDialect, SQLArguments, ParseOptions, parse_statements, TruncateTable, Statement, Issues};
11/// # let options = ParseOptions::new().dialect(SQLDialect::MariaDB);
12/// #
13/// let sql = "TRUNCATE TABLE `t1`;";
14/// let mut issues = Issues::new(sql);
15/// let mut stmts = parse_statements(sql, &mut issues, &options);
16///
17/// # assert!(issues.is_ok(), "Issues: {}", issues);
18/// #
19/// let truncate_table: TruncateTable = match stmts.pop() {
20/// Some(Statement::TruncateTable(c)) => c,
21/// _ => panic!("We should get a truncate table statement")
22/// };
23///
24/// assert!(truncate_table.table_name.identifier.as_str() == "t1");
25///
26/// ```
27
28#[derive(Debug, Clone)]
29pub struct TruncateTable<'a> {
30 /// Span of "TRUNCATE"
31 pub truncate_span: Span,
32 /// Span of "TABLE" if specified
33 pub table_span: Option<Span>,
34 pub table_name: QualifiedName<'a>,
35}
36
37impl<'a> Spanned for TruncateTable<'a> {
38 fn span(&self) -> Span {
39 self.truncate_span
40 .join_span(&self.table_span)
41 .join_span(&self.table_name)
42 }
43}
44
45pub(crate) fn parse_truncate_table<'a>(
46 parser: &mut Parser<'a, '_>,
47) -> Result<TruncateTable<'a>, ParseError> {
48 let truncate_span = parser.consume_keyword(Keyword::TRUNCATE)?;
49 let table_span = parser.skip_keyword(Keyword::TABLE);
50 let table_name = parse_qualified_name(parser)?;
51 Ok(TruncateTable {
52 truncate_span,
53 table_span,
54 table_name,
55 })
56}