Skip to main content

qusql_parse/
truncate.rs

1use crate::{
2    QualifiedName, Span, Spanned,
3    keywords::Keyword,
4    parser::{ParseError, Parser},
5    qualified_name::parse_qualified_name,
6};
7
8/// Represent a truncate table statement
9/// ```
10/// # use qusql_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    /// Name of the truncated table
35    pub table_name: QualifiedName<'a>,
36}
37
38impl<'a> Spanned for TruncateTable<'a> {
39    fn span(&self) -> Span {
40        self.truncate_span
41            .join_span(&self.table_span)
42            .join_span(&self.table_name)
43    }
44}
45
46pub(crate) fn parse_truncate_table<'a>(
47    parser: &mut Parser<'a, '_>,
48) -> Result<TruncateTable<'a>, ParseError> {
49    let truncate_span = parser.consume_keyword(Keyword::TRUNCATE)?;
50    let table_span = parser.skip_keyword(Keyword::TABLE);
51    let table_name = parse_qualified_name(parser)?;
52    Ok(TruncateTable {
53        truncate_span,
54        table_span,
55        table_name,
56    })
57}