uqa_sql/routines/
anonymous_block.rs1use crate::{
9 ast::{CreateFunction, FunctionReturns},
10 plpgsql::PLpgSQLFunction,
11 routines::{compilation::RoutineParserCatalog, declaration::RoutineTypeCatalog},
12 SQLError,
13};
14pub fn compile_do_block(
15 types: &dyn RoutineTypeCatalog,
16 parsers: &dyn RoutineParserCatalog,
17 language: &str,
18 body: &str,
19) -> Result<(CreateFunction, PLpgSQLFunction), SQLError> {
20 if language != "plpgsql" {
21 return Err(SQLError::Routine {
22 sqlstate: "42704".into(),
23 message: format!("language \"{language}\" does not exist"),
24 });
25 }
26 let catalog = parsers.plpgsql_catalog()?;
27 let mut parsed = crate::plpgsql::parse_do_block_with_catalog(body, &catalog)?;
28 crate::routines::declaration::resolve_plpgsql_datum_types(types, &mut parsed)?;
29 let def = CreateFunction {
30 object_id: None,
31 name: "inline_code_block".into(),
32 or_replace: false,
33 is_procedure: false,
34 params: Vec::new(),
35 returns: FunctionReturns::Scalar {
36 type_name: "void".into(),
37 },
38 return_type_reference: None,
39 language: "plpgsql".into(),
40 body: crate::ast::FunctionBody::Source(body.to_string()),
41 creation_search_path: Vec::new(),
42 volatility: crate::ast::FunctionVolatility::Volatile,
43 strict: false,
44 owner: String::new(),
45 security: crate::ast::RoutineSecurityAttributes::default(),
46 parallel: crate::ast::FunctionParallel::Unsafe,
47 support: None,
48 config: Vec::new(),
49 config_actions: Vec::new(),
50 execute_acl: None,
51 };
52 Ok((def, parsed))
53}