vibesql_executor/
domain_ddl.rs

1//! Domain DDL executor
2
3use vibesql_ast::*;
4use vibesql_catalog::{DomainConstraintDef, DomainDefinition};
5use vibesql_storage::Database;
6
7use crate::errors::ExecutorError;
8
9/// Executor for domain DDL statements
10pub struct DomainExecutor;
11
12impl DomainExecutor {
13    /// Execute CREATE DOMAIN
14    pub fn execute_create_domain(
15        stmt: &CreateDomainStmt,
16        database: &mut Database,
17    ) -> Result<String, ExecutorError> {
18        // Convert AST domain constraints to catalog domain constraints
19        let constraints = stmt
20            .constraints
21            .iter()
22            .map(|c| DomainConstraintDef { name: c.name.clone(), check: c.check.clone() })
23            .collect();
24
25        let domain = DomainDefinition::new(
26            stmt.domain_name.clone(),
27            stmt.data_type.clone(),
28            stmt.default.clone(),
29            constraints,
30        );
31
32        database
33            .catalog
34            .create_domain(domain)
35            .map_err(|e| ExecutorError::StorageError(format!("Catalog error: {:?}", e)))?;
36
37        Ok(format!("Domain '{}' created", stmt.domain_name))
38    }
39
40    /// Execute DROP DOMAIN
41    pub fn execute_drop_domain(
42        stmt: &DropDomainStmt,
43        database: &mut Database,
44    ) -> Result<String, ExecutorError> {
45        database
46            .catalog
47            .drop_domain(&stmt.domain_name, stmt.cascade)
48            .map_err(|e| ExecutorError::StorageError(format!("Catalog error: {:?}", e)))?;
49
50        Ok(format!("Domain '{}' dropped", stmt.domain_name))
51    }
52}