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 = super::compilation::with_parser_context(parsers, || {
28 crate::plpgsql::parse_do_block_with_catalog(body, &catalog)
29 })?;
30 crate::routines::declaration::resolve_plpgsql_datum_types(types, &mut parsed)?;
31 let def = CreateFunction {
32 object_id: None,
33 catalog_revision: None,
34 catalog_oid: None,
35 name: "inline_code_block".into(),
36 or_replace: false,
37 is_procedure: false,
38 params: Vec::new(),
39 returns: FunctionReturns::Scalar {
40 type_name: "void".into(),
41 },
42 return_type_reference: None,
43 return_written_type: None,
44 language: "plpgsql".into(),
45 body: crate::ast::FunctionBody::Source(body.to_string()),
46 sql_body_form: None,
47 creation_search_path: Vec::new(),
48 volatility: crate::ast::FunctionVolatility::Volatile,
49 strict: false,
50 owner: None,
51 security: crate::ast::RoutineSecurityAttributes::default(),
52 parallel: crate::ast::FunctionParallel::Unsafe,
53 support: None,
54 cost: None,
55 rows: None,
56 config: Vec::new(),
57 config_actions: Vec::new(),
58 attribute_clauses: crate::ast::RoutineAttributeClauses::default(),
59 execute_acl: None,
60 };
61 Ok((def, parsed))
62}