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::LegacyVector(vector) => vector.kind().type_name(),
30 Value::List(_) => "anyarray",
31 Value::Row(_) | Value::Record(_) => "record",
32 Value::Map(_) => "jsonb",
33 Value::Enum(_) => "anyenum",
35 Value::Datum(value) => super::datums::type_name(value),
36 }
37}
38
39pub fn unknown_function_error(name: &str, args: &[(Option<String>, Value)]) -> SQLError {
42 let types = args
43 .iter()
44 .map(|(arg_name, value)| match arg_name {
45 Some(arg_name) => format!("{arg_name} => {}", value_type_name(value)),
46 None => value_type_name(value).to_string(),
47 })
48 .collect::<Vec<_>>()
49 .join(", ");
50 SQLError::undefined_function_call(&format!("{name}({types})"))
51}