RATIONAL、VECTOR 或 INET——这些类型可以与 ORDER BY、索引和聚合函数一起使用。Rust SDK 通过 custom_type! 宏支持此功能。
本页假设您已经完成了 使用 Rust 构建扩展 的相关步骤。设置(Cargo.toml、manifest.json、cargo-vsql)与之前相同。
何时使用自定义类型
在以下情况下使用自定义类型:- 您需要一种二进制的磁盘布局,而标准的 SQL 类型无法表达这种布局(打包的浮点数、固定宽度的整数、二进制标识符)
- 您的类型具有其自身的排序语义,该语义与词法字符串排序不同
- 您希望服务器正确地索引和哈希值,以便进行
ORDER BY、COUNT(DISTINCT)和集合操作
STRING、INT 或 REAL 列中,则不需要自定义类型。
custom_type! 宏
每个自定义类型都需要 4 个回调函数(编码、解码、比较、哈希)和一个默认值。以下是完整的宏签名:
type_name、persisted_length、max_decode_buffer_length、encode、decode 和 compare 是必需的。hash 和 default 是可选的,但建议使用——hash 对于正确的 COUNT(DISTINCT) 和集合操作是必需的,default 用于类型初始化验证。
接收和返回二进制值
接受或返回自定义类型的函数使用原始字节。 输入——InValue::Custom(b) 携带存储的二进制数据,类型为 &[u8]:
VdfReturn::Binary(bytes) 将二进制字节发送回服务器:
func! 声明中引用自定义类型,请使用 villagesql::custom!("type_name"):
示例:有理数类型
SDK 仓库中的examples/vsql_rational 是一个可运行的扩展示例,它实现了 RATIONAL 类型。它以小端字节顺序存储一个有理数,作为 16 字节的 i64 值对(分子、分母),并提供算术函数。
以下是核心的编码、解码、比较和哈希实现:
custom_type! 注册和算术 VDF(rational_add、rational_sub 等)都在完整的源代码 examples/vsql_rational/src/lib.rs 中。
安装扩展后:
rational_to_real(r RATIONAL) -> REAL 将 RATIONAL 值转换为 64 位浮点近似值,方法是将分子除以分母。当您需要用于显示或比较的近似十进制数,但又不想在列中存储有损表示形式时,此函数很有用。
包含类型和函数的 extension! 块
在注册函数和类型时,extension! 块有两个部分:
funcs:;仅包含函数的扩展会省略 types:。
后续步骤
Rust API 参考
关于
InValue、VdfReturn 和所有宏的完整参考。用 Rust 构建扩展
入门——Cargo 设置、第一个函数、打包和测试。
C++ 自定义类型
C++ 中的自定义类型——
make_type<>、编码/解码/比较/哈希、ALTER TABLE 规则。扩展架构
自定义类型是如何解析、缓存和存储的。

