radixdb_executor/mutation/
extension.rs1use radixdb_core::Result;
4use radixdb_sql::{CreateExtensionStatement, DropExtensionStatement, Statement};
5use radixdb_storage::traits::{Engine, QueryResult};
6
7use crate::context::ExecutionContext;
8use crate::mutation::host::MutationHost;
9use crate::result::ExecResult;
10
11#[doc(hidden)]
12pub trait ExtensionDdlExecutorExt: MutationHost {
13 fn execute_create_extension(
14 &self,
15 statement: &CreateExtensionStatement,
16 context: &ExecutionContext,
17 ) -> Result<Box<dyn QueryResult>> {
18 execute_binding_statement(self, Statement::CreateExtension(statement.clone()), context)
19 }
20
21 fn execute_drop_extension(
22 &self,
23 statement: &DropExtensionStatement,
24 context: &ExecutionContext,
25 ) -> Result<Box<dyn QueryResult>> {
26 execute_binding_statement(self, Statement::DropExtension(statement.clone()), context)
27 }
28}
29
30pub(super) fn execute_binding_statement<H: MutationHost + ?Sized>(
31 host: &H,
32 statement: Statement,
33 context: &ExecutionContext,
34) -> Result<Box<dyn QueryResult>> {
35 let mutation = host.mutation_stage_catalog_statement_as(
36 statement,
37 context.effective_principal_id(),
38 context.current_database(),
39 )?;
40 if let Some(mutation) = mutation {
41 let mut transaction = host.mutation_engine().begin_transaction()?;
42 transaction.stage_catalog_mutation(mutation)?;
43 transaction.commit()?;
44 }
45 host.mutation_invalidate_authorization_caches();
46 Ok(Box::new(ExecResult::empty()))
47}
48
49impl<T: MutationHost + ?Sized> ExtensionDdlExecutorExt for T {}