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}