Skip to main content

uqa_sql/semantics/
catalog_mutation.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Mutation rules for SQL virtual catalog relations.
8
9use crate::catalog::resolution::RelationNameResolution;
10use crate::plan::{CommandPlan, MergeWhenPlan};
11use crate::SQLError;
12
13pub fn virtual_relation_mutation_error(
14    resolution: &RelationNameResolution,
15    command: &CommandPlan,
16) -> Option<SQLError> {
17    let target = command.mutation_target()?;
18    if crate::catalog::resolve_virtual_relation(resolution.search_path(), target)
19        != Some(crate::catalog::VirtualRelation::PgPreparedStatements)
20    {
21        return None;
22    }
23    let action = match command {
24        CommandPlan::Insert(_) => "insert into",
25        CommandPlan::Update(_) => "update",
26        CommandPlan::Delete(_) => "delete from",
27        CommandPlan::Merge(merge) => merge.when_clauses.iter().find_map(|clause| match clause {
28            MergeWhenPlan::InsertNotMatched { .. } => Some("insert into"),
29            MergeWhenPlan::UpdateMatched { .. }
30            | MergeWhenPlan::UpdateNotMatchedBySource { .. } => Some("update"),
31            MergeWhenPlan::DeleteMatched { .. }
32            | MergeWhenPlan::DeleteNotMatchedBySource { .. } => Some("delete from"),
33            _ => None,
34        })?,
35        _ => return None,
36    };
37    Some(SQLError::Routine {
38        sqlstate: "55000".into(),
39        message: format!("cannot {action} view \"pg_prepared_statements\""),
40    })
41}