Skip to main content

uqa_sql/routines/
anonymous_block.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Compile an anonymous procedural block against the caller's current catalog.
8use 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}