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 = 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}