vsql_complex 扩展是 VillageSQL 使用 C++ SDK 的自定义类型的参考实现,展示了生产就绪的扩展模式。
**源代码:**位于 VillageSQL 仓库 的 villagesql/examples/vsql-complex/ 目录中。
vsql_complex 提供的功能
COMPLEX 类型用于表示复数(a + bi),并提供算术运算、工具函数和聚合功能。 用法示例:目录结构
VEF 注册模式
文件:src/complex.cc
vsql_complex 使用 C++ SDK,并使用 VEF_GENERATE_ENTRY_POINTS():
- 单个宏调用注册所有内容,无需手动编写 SQL
- 类型对象是使用
vsql::make_type<kName>()构建的constexpr变量,其中kName是用作非类型模板参数的static constexpr const char[] - 类型操作(
.from_string<>()、.to_string<>()、.compare<>()、.hash<>())嵌入在类型对象中,无需为它们进行单独的.func()调用 .compare()启用 ORDER BY 和索引;.hash()是可选的.intrinsic_default_str("(0,0)")设置了当 INSERT IGNORE 或 UPDATE IGNORE 将 NULL 赋值给此类型的 NOT NULL 列时写入的默认值- 函数注册使用
make_func<&impl>("name"),并使用.build() - 聚合注册使用
make_aggregate_func<State, &result_fn>("name"),并使用.clear<&fn>()和.accumulate<&fn>();结果函数具有签名void(const State&, ResultType)
二进制存储格式
COMPLEX 存储 16 字节(小端字节序):- 字节 0-7:实部(double)
- 字节 8-15:虚部(double)
参数和结果类型
实现使用类型化的参数和结果类型,而不是原始协议结构: 算术示例(来自 complex.cc):测试策略
测试文件(test/t/complex_create.test):关键实现模式
清单文件
文件:manifest.json
使用自定义类型导出和导入数据
VillageSQL 支持针对自定义类型的SELECT INTO OUTFILE 和 LOAD DATA INFILE 操作,允许您导出和导入数据,同时保留自定义类型的值。
SELECT INTO OUTFILE
自定义类型在导出时序列化为它们的字符串表示形式:/tmp/signals_export.txt):
LOAD DATA INFILE
将导出的数据加载回表中:使用自定义分隔符导出
您可以使用自定义字段和行终止符:使用 VDF 函数导出
使用扩展函数导出计算值:自定义类型以其字符串表示形式导出。目前不支持使用
SELECT INTO DUMPFILE 进行自定义类型的二进制导出。后续步骤
创建扩展
构建您自己的扩展
扩展架构
了解内部结构
vsql_complex 源代码
查看完整的源代码
可用扩展
浏览扩展目录

