uqa_sql/expr/
diagnostics.rs1use uqa_core::{TemporalValue, Value};
10
11use crate::error::SQLError;
12
13pub fn value_type_name(v: &Value) -> &'static str {
14 match v {
15 Value::Null => "unknown",
16 Value::Void => "void",
17 Value::Bool(_) => "boolean",
18 Value::Int(_) => "integer",
19 Value::Float(_) => "double precision",
20 Value::Str(_) => "text",
21 Value::FixedChar(_) => "character",
22 Value::Bytes(_) => "bytea",
23 Value::Temporal(TemporalValue::Interval { .. }) => "interval",
24 Value::Temporal(_) => "timestamp",
25 Value::Decimal(_) => "numeric",
26 Value::Json(_) => "json",
27 Value::JsonB(_) => "jsonb",
28 Value::Array(_) => "anyarray",
29 Value::List(_) => "anyarray",
30 Value::Row(_) | Value::Record(_) => "record",
31 Value::Map(_) => "jsonb",
32 }
33}
34
35pub fn unknown_function_error(name: &str, args: &[(Option<String>, Value)]) -> SQLError {
38 let types = args
39 .iter()
40 .map(|(arg_name, value)| match arg_name {
41 Some(arg_name) => format!("{arg_name} => {}", value_type_name(value)),
42 None => value_type_name(value).to_string(),
43 })
44 .collect::<Vec<_>>()
45 .join(", ");
46 SQLError::Routine {
47 sqlstate: "42883".into(),
48 message: format!("function {name}({types}) does not exist"),
49 }
50}