Skip to main content
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):
使用与平台无关的字节序函数,以实现跨平台兼容性。

参数和结果类型

实现使用类型化的参数和结果类型,而不是原始协议结构: 算术示例(来自 complex.cc):
工具函数(来自 complex.cc):

测试策略

测试文件(test/t/complex_create.test):
生成结果:
运行测试:

关键实现模式


清单文件

文件:manifest.json

使用自定义类型导出和导入数据

VillageSQL 支持针对自定义类型的 SELECT INTO OUTFILELOAD DATA INFILE 操作,允许您导出和导入数据,同时保留自定义类型的值。

SELECT INTO OUTFILE

自定义类型在导出时序列化为它们的字符串表示形式:
文件内容(/tmp/signals_export.txt):

LOAD DATA INFILE

将导出的数据加载回表中:

使用自定义分隔符导出

您可以使用自定义字段和行终止符:
输出:

使用 VDF 函数导出

使用扩展函数导出计算值:
自定义类型以其字符串表示形式导出。目前不支持使用 SELECT INTO DUMPFILE 进行自定义类型的二进制导出。

后续步骤

创建扩展

构建您自己的扩展

扩展架构

了解内部结构

vsql_complex 源代码

查看完整的源代码

可用扩展

浏览扩展目录