uqa_sql/semantics/
catalog_mutation.rs1use 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}