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}