Skip to main content
Rust SDK 仓库中随附了两个参考扩展——一个仅包含函数的最小示例,以及一个包含算术运算、排序和哈希的完整自定义类型。 源码: vsql-rust-sdk 中的 examples/

vsql_rot13 — 仅包含函数的扩展

最简单的 Rust 扩展:一个接受 STRING 并返回 STRING 的 VDF。 用法:

目录结构

实现

文件:src/lib.rs
关键模式:
  • VDF 接收 &[InValue] 并返回 VdfReturn——两者都是安全的 Rust 枚举
  • NULL 在两端都是一等变体;直接对其进行模式匹配
  • extension! 宏生成服务器在加载时调用的 C 入口点
  • func! 声明 SQL 签名;参数和返回类型使用 villagesql::Type::*

清单

文件:manifest.json

vsql_rational — 带算术运算的自定义类型

一个完整的自定义类型:以约分形式 (numerator, denominator) 存储有理数,并带有算术函数、排序和哈希。 用法:

二进制存储格式

rational 存储 16 字节(小端序):
  • 字节 0–7:分子(i64
  • 字节 8–15:分母(i64
值始终以约分形式(GCD = 1)存储,且分母为正。

类型系统函数

文件:src/lib.rs 该类型注册了四个操作:编码(字符串 → 字节)、解码(字节 → 字符串)、比较(用于 ORDER BY)和哈希(用于索引)。

VDF 实现

接受自定义类型的 VDF 会接收 InValue::Custom(&[u8]),并自行解码这些字节:

注册

extension! 宏在单个声明中同时注册类型及其函数:
关键模式:
  • villagesql::custom!("name") 用于以参数或返回值的形式引用自定义类型
  • custom_type! 注册类型及其 encode/decode/compare/hash 函数
  • default: "0/1" 是内建默认值——服务器在类型初始化时会对该字符串调用 encode(),因此它必须是一个有效值
  • persisted_length 必须与 encode() 返回的字节长度匹配
  • deterministic: true 让优化器可以折叠常量调用

关键实现模式


测试

这两个示例都像 C++ 扩展一样使用 MTR(MySQL Test Runner):
使用 --record 生成或更新预期结果。

后续步骤

在 Rust 中创建扩展

SDK 安装、构建以及 extension! 宏

Rust 自定义类型

深入了解 encode、decode、compare 和 hash

Rust API 参考

InValue、VdfReturn 以及宏接口

示例源码

vsql_rot13 和 vsql_rational 的完整源码