AI_使用_DeepSeek_阅读Duckdb-Extension源码-插件

利用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  			  
posted @ 2025-02-07 14:44  辰令  阅读(145)  评论(0)    收藏  举报