pub mod constraints;
pub mod core;
pub mod triggers;
use vibesql_ast::TruncateTableStmt;
use vibesql_storage::Database;
use self::{
constraints::validate_truncate_allowed,
core::{execute_truncate, execute_truncate_cascade},
};
use crate::{errors::ExecutorError, privilege_checker::PrivilegeChecker};
pub struct TruncateTableExecutor;
impl TruncateTableExecutor {
pub fn execute(
stmt: &TruncateTableStmt,
database: &mut Database,
) -> Result<usize, ExecutorError> {
let mut tables_to_truncate = Vec::new();
for table_name in &stmt.table_names {
if !database.catalog.table_exists(table_name) {
if stmt.if_exists {
continue;
} else {
return Err(ExecutorError::TableNotFound(table_name.clone()));
}
}
tables_to_truncate.push(table_name.as_str());
}
if tables_to_truncate.is_empty() {
return Ok(0);
}
for table_name in &tables_to_truncate {
PrivilegeChecker::check_delete(database, table_name)?;
}
let cascade_mode = &stmt.cascade;
match cascade_mode {
Some(vibesql_ast::TruncateCascadeOption::Cascade) => {
let mut total_rows = 0;
for table_name in &tables_to_truncate {
total_rows += execute_truncate_cascade(database, table_name)?;
}
Ok(total_rows)
}
_ => {
for table_name in &tables_to_truncate {
validate_truncate_allowed(database, table_name)?;
}
let mut total_rows = 0;
for table_name in &tables_to_truncate {
total_rows += execute_truncate(database, table_name)?;
}
Ok(total_rows)
}
}
}
}