Skip to main content

uqa_sql/catalog/index/
output.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Unique-key diagnostics use the default B-tree operator class input type, which can differ from the declared column type.
8
9use crate::{expr::EngineHook, result::format_postgres_text, ColumnType, SQLError};
10use uqa_core::Value;
11
12pub fn format_key_value(
13    value: &Value,
14    ty: &ColumnType,
15    resolver: Option<&dyn EngineHook>,
16) -> Result<String, SQLError> {
17    match ty {
18        ColumnType::Domain { base, .. } => format_key_value(value, base, resolver),
19        ColumnType::Regproc
20        | ColumnType::Regprocedure
21        | ColumnType::Regclass
22        | ColumnType::Regcollation
23        | ColumnType::Regnamespace
24        | ColumnType::Regrole
25        | ColumnType::Regtype => format_postgres_text(value, &ColumnType::Oid, resolver),
26        ColumnType::Int2Vector => format_postgres_text(
27            value,
28            &ColumnType::Array(Box::new(ColumnType::SmallInteger)),
29            resolver,
30        ),
31        _ => format_postgres_text(value, ty, resolver),
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38    use uqa_core::{LegacyVectorKind, LegacyVectorValue};
39
40    #[test]
41    fn default_btree_input_types_preserve_alias_and_vector_output() {
42        assert_eq!(
43            format_key_value(&Value::Int(42), &ColumnType::Regclass, None).unwrap(),
44            "42"
45        );
46        for (kind, ty, expected) in [
47            (
48                LegacyVectorKind::SmallInteger,
49                ColumnType::Int2Vector,
50                "[0:1]={1,2}",
51            ),
52            (LegacyVectorKind::Oid, ColumnType::OidVector, "1 2"),
53        ] {
54            let value = Value::LegacyVector(
55                LegacyVectorValue::try_new(kind, vec![Value::Int(1), Value::Int(2)]).unwrap(),
56            );
57            assert_eq!(format_key_value(&value, &ty, None).unwrap(), expected);
58        }
59    }
60}