Skip to main content

vibesql_executor/advanced_objects/
triggers.rs

1//! Executor for TRIGGER objects (SQL:1999)
2
3use vibesql_ast::*;
4use vibesql_storage::Database;
5
6use crate::errors::ExecutorError;
7
8/// Execute CREATE TRIGGER statement.
9///
10/// Delegates to [`crate::TriggerExecutor::create_trigger`] so that every
11/// CREATE TRIGGER entry point (CLI, consensus, WASM) shares one validation path
12/// — IF NOT EXISTS handling, system-table rejection, and the
13/// view/table/INSTEAD-OF target checks (with SQLite-exact error wording). The
14/// success message is discarded here since this entry point returns `()`.
15pub fn execute_create_trigger(
16    stmt: &CreateTriggerStmt,
17    db: &mut Database,
18) -> Result<(), ExecutorError> {
19    crate::TriggerExecutor::create_trigger(db, stmt).map(|_| ())
20}
21
22/// Execute ALTER TRIGGER statement
23pub fn execute_alter_trigger(
24    stmt: &AlterTriggerStmt,
25    db: &mut Database,
26) -> Result<(), ExecutorError> {
27    use vibesql_ast::AlterTriggerAction;
28
29    // Get the trigger (verify it exists)
30    let mut trigger = db
31        .catalog
32        .get_trigger(&stmt.trigger_name)
33        .ok_or_else(|| ExecutorError::TriggerNotFound(stmt.trigger_name.clone()))?
34        .clone();
35
36    // Apply the action
37    match stmt.action {
38        AlterTriggerAction::Enable => {
39            trigger.enable();
40        }
41        AlterTriggerAction::Disable => {
42            trigger.disable();
43        }
44    }
45
46    // Update in catalog
47    db.catalog.update_trigger(trigger)?;
48    Ok(())
49}
50
51/// Execute DROP TRIGGER statement
52pub fn execute_drop_trigger(
53    stmt: &DropTriggerStmt,
54    db: &mut Database,
55) -> Result<(), ExecutorError> {
56    // `DROP TRIGGER IF EXISTS` on a missing trigger is a no-op (SQLite /
57    // SQL:2008); a bare DROP TRIGGER errors with TriggerNotFound.
58    if stmt.if_exists && db.catalog.get_trigger(&stmt.trigger_name).is_none() {
59        return Ok(());
60    }
61    db.catalog.drop_trigger(&stmt.trigger_name)?;
62    Ok(())
63}