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
9pub fn execute_create_trigger(
10    stmt: &CreateTriggerStmt,
11    db: &mut Database,
12) -> Result<(), ExecutorError> {
13    use vibesql_catalog::TriggerDefinition;
14
15    let trigger = TriggerDefinition::new(
16        stmt.trigger_name.clone(),
17        stmt.timing.clone(),
18        stmt.event.clone(),
19        stmt.table_name.clone(),
20        stmt.granularity.clone(),
21        stmt.when_condition.clone(),
22        stmt.triggered_action.clone(),
23    );
24
25    db.catalog.create_trigger(trigger)?;
26    Ok(())
27}
28
29/// Execute ALTER TRIGGER statement
30pub fn execute_alter_trigger(
31    stmt: &AlterTriggerStmt,
32    db: &mut Database,
33) -> Result<(), ExecutorError> {
34    use vibesql_ast::AlterTriggerAction;
35
36    // Get the trigger (verify it exists)
37    let mut trigger = db
38        .catalog
39        .get_trigger(&stmt.trigger_name)
40        .ok_or_else(|| ExecutorError::TriggerNotFound(stmt.trigger_name.clone()))?
41        .clone();
42
43    // Apply the action
44    match stmt.action {
45        AlterTriggerAction::Enable => {
46            trigger.enable();
47        }
48        AlterTriggerAction::Disable => {
49            trigger.disable();
50        }
51    }
52
53    // Update in catalog
54    db.catalog.update_trigger(trigger)?;
55    Ok(())
56}
57
58/// Execute DROP TRIGGER statement
59pub fn execute_drop_trigger(
60    stmt: &DropTriggerStmt,
61    db: &mut Database,
62) -> Result<(), ExecutorError> {
63    db.catalog.drop_trigger(&stmt.trigger_name)?;
64    Ok(())
65}