利用DeepSeek阅读Duckdb-Extension源码
问题: 如何写duckdb的扩展
请解读代码
头文件
头文件-- "quack_extension.hpp"
// QuackExtension 类,继承自 Extension。这个类重写了Load、Name和Version方法
#include "duckdb.hpp"
namespace duckdb {
class QuackExtension : public Extension {
public:
void Load(DuckDB &db) override;
std::string Name() override;
std::string Version() const override;
};
}
源文件
01.定义函数
使用 UnaryExecutor::Execute 来处理输入参数,生成结果字符串
inline void QuackScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
UnaryExecutor::Execute<string_t, string_t>( name_vector, result, args.size(),[&](string_t name) {
return StringVector::AddString(result, "Quack "+name.GetString()+" 🐥");;
});
功能:接受一个字符串参数,返回拼接后的字符串(如输入 "Alice" 返回 "Quack Alice 🐥")。
输入类型和输出类型 Execute<string_t, string_t>
UnaryExecutor::Execute<string_t, bool>(strings, result, args.size(), [&](string_t input) {
return OP::Operation(CreateStringPiece(input), lstate.constant_pattern);
});
02.注册函数
通过ScalarFunction创建函数对象,指定函数名、参数类型、返回类型以及对应的处理函数,
然后使用 ExtensionUtil::RegisterFunction 将函数注册到DuckDB实例中
static void LoadInternal(DatabaseInstance &instance) {
auto quack_scalar_function = ScalarFunction("quack", {LogicalType::VARCHAR}, LogicalType::VARCHAR, QuackScalarFun);
ExtensionUtil::RegisterFunction(instance, quack_scalar_function);
}
QuackExtension类的
Load方法调用了 LoadInternal,将扩展加载到数据库实例中。
Name方法返回扩展的名称“quack”,
Version方法返回版本号
03.在extern "C"部分,quack_init:扩展的入口函数,DuckDB 在加载扩展时会调用此函数。
定义了quack_init和quack_version函数。
quack_init函数是扩展的初始化入口,创建DuckDB包装器并加载 QuackExtension 。
duckdb::DuckDB db_wrapper(db);
db_wrapper.LoadExtension<duckdb::QuackExtension>();
quack_version返回DuckDB的库版本
C++语法
C++ 匿名函数 lambda表达式实现
[capture_list] (parameters) mutable-> return_type {
// function body
}
auto lambda = []() {std::cout << "Hello, World!" << std::endl;};
lambda()
插件分类
源码内置了原生插件- extension 目录
01.
Out-of-Tree Extension独立的插件,
不是集成在源码树中。独立编译好后,可以 运行时载入到 duckdb 中。
02.官方认证的插件
03.非官方认证的插件 run duckdb with the -unsigned flag :
示例 % duckdb -unsigned
## force install **
插件原理
插件的核心注册逻辑
01.创建函数对象,指定函数名、参数类型、返回类型以及对应的处理函数,
ExtensionUtil 支持注册普通函数、聚合函数、Table 函数、PragmaFunction、Collation、Secret 等。
ExtensionUtil::RegisterFunction 将函数注册到DuckDB实例中
RegisterSubSystem,这说明对于文件系统,Duckdb 也做了抽象,方便插件化
插件开发
duckprompt calls OpenAI's ChatGPT to do natural language queries
deepseekprompt calls deepseek to do natural language queries
https://tdoehmen.github.io/blog/2023/03/07/quackingduck.html.
参考
AI_使用_DeepSeek_作为 DuckDB 的自然语言接口
AI_使用_DeepSeek_阅读Duckdb-Extension源码
https://github.com/jtigani/duckprompt/tree/main
https://tdoehmen.github.io/blog/2023/03/07/quackingduck.html
https://github.com/jtigani/duckprompt
https://github.com/duckdb/extension-template