news 2026/5/12 23:48:01

DeepSeek总结DuckPL:为DuckDB引入过程式编程语言

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek总结DuckPL:为DuckDB引入过程式编程语言

DuckPL:为DuckDB引入过程式编程语言

原文地址:https://blobs.duckdb.org/events/duckdb-developer-meeting-1/duckpl-a-procedural-language-in-duckdb-denis-hirn.pdf

在2026年1月30日的DuckDB开发者会议#1上,来自蒂宾根大学的Denis Hirn(长期DuckDB贡献者)介绍了DuckPL——一种为DuckDB打造的原生过程式编程语言,旨在填补DuckDB在用户定义函数(UDF)功能上的关键空白。

当前DuckDB UDF的局限性

DuckDB目前支持简单的宏(MACRO)功能:

CREATEMACROadd(a,b)ASa+b;

不支持完整的过程式编程:

CREATEMACRO sequence(n)ASIFn<0THENdosomestuffELSEdoother stuffENDIF;

现有解决方案如Python、R等外部语言UDF虽然可用,但:

  • 需要外部运行时环境
  • 破坏了DuckDB“单文件、零依赖数据库”的核心承诺

DuckPL的核心特性

DuckPL为DuckDB带来了完整的PL/pgSQL兼容性过程式编程能力:

简单直观的编程模型

CREATEFUNCTIONcollatz(yBIGINT)RETURNSBIGINTAS$$DECLAREstepsBIGINT:=0;xBIGINT:=y;BEGINWHILEx>1LOOPIFx%2=0THENx :=x/2;ELSEx :=3*x+1;ENDIF;steps :=steps+1;ENDLOOP;RETURNsteps;END;$$;

对比纯SQL实现(需要复杂的递归CTE):

WITHRECURSIVE collatz_cte(x,steps)AS(...)

DuckPL让过程式逻辑编写变得直观简单,无需掌握高级SQL技巧。

技术架构解析

双重解析机制

DuckPL采用两层解析架构:

  1. CREATE FUNCTION语句解析:扩展DuckDB原有SQL解析器
  2. PL/pgSQL函数体解析:重用libpg_query库的PL/pgSQL解析器
CREATE FUNCTION语句 → libpg_query解析 → AST转换 → DuckPL AST

这与DuckDB 2018年构建SQL解析器的方式完全一致,保证了技术一致性。

统一的内部表示(DuckPL AST)

DuckPL设计了简洁、语法无关的中间表示(IR),将所有复杂结构简化为基本构建块:

  • FOR/WHILE循环 → LOOP + IF + BREAK组合
  • CASE语句 → IF语句链
  • 游标循环 → 基本循环结构

示例转换

WHILE counter < 10 LOOP counter := counter + 1; END LOOP; RETURN counter;

转换为DuckPL IR:

loop { if (counter >= 10) { break; } let counter = counter + 1; } emit counter; stop;

这种设计带来三大优势:

  1. 简化解释器:减少控制流处理复杂度
  2. 支持多语言前端:未来可轻松添加PL/Python、PL/Duck等
  3. 便于编译优化:更容易将DuckPL AST编译为SQL

持久化存储

DuckPL函数通过专用表duckpl_functions持久化存储:

CREATETABLEduckpl_functions(function_idBIGINTPRIMARYKEY,function_uuid UUID,function_num_argsINT,function_arg_namesTEXT[],function_arg_typesTEXT[],function_return_typesTEXT[],function_returns_setBOOLEAN,function_nameTEXTNOTNULL,function_srcTEXT,function_bodyBLOB-- 序列化的AST);

启动时加载反序列化,立即注册到目录中,无需重新解析。

堆栈驱动的解释器

DuckPL采用显式堆栈帧管理而非递归调用:

  • 状态管理:执行可在任意点暂停和恢复
  • 无C++递归:避免栈深度限制和溢出风险
  • 完全流式处理:结果逐块输出,不缓冲全部数据

这种设计特别适合流式场景:

CREATEFUNCTIONinfinite()RETURNSSETOFBIGINTAS$$DECLAREiBIGINT:=0;BEGINLOOPi :=(i+1)%1000;RETURNNEXTi;-- 流式输出ENDLOOP;END$$;

对比PostgreSQL(会缓冲所有结果导致内存膨胀),DuckPL的流式处理能高效配合LIMIT等操作。

表达式执行优化

通过ExpressionExecutor缓存机制,避免每次表达式计算都触发完整SQL管道:

  1. 准备虚拟SELECT语句提取表达式
  2. 缓存对应的ExpressionExecutor实例
  3. 针对包含局部变量的DataChunk执行

实测带来30倍以上的性能提升

功能支持现状

已实现功能

  • 标量/表值UDF
  • 变量和赋值
  • 所有数据类型(包括复合类型)
  • 控制流(IF、LOOP、WHILE、FOR、BREAK、CONTINUE、RETURN、RETURN NEXT)
  • 游标(FETCH INTO)
  • 调试支持(RAISE INFO)

规划中功能

  • 聚合/窗口UDF
  • 异常处理
  • 事务支持(COMMIT、ROLLBACK)
  • UDF优化器
  • 编译为纯SQL:利用递归CTE等技术大幅提升性能

暂不支持

  • 动态SQL(可使用query(…)替代)
  • 高级游标功能(SCROLL、MOVE)
  • 触发器

未来愿景与发展路线

混合执行架构

未来DuckPL将发展为解释与编译混合执行系统:

PL/SQL输入 → 解析 → AST转换 → 分发器 → [解释器 | SQL编译]

交互式编程环境

计划提供REPL式CLI体验:

❯ duckdb D LET y=0:: BIGINT;D FOR i IN1..10: LET x=(SELECTRANDOM());IF x>0.5: LET y=y +1;D PRINT y;5

技术演进方向

  1. 现代化语法:添加友好型PL语法
  2. 下一代解析器:转向PEG-based PL/pegSQL
  3. 向量化解释:实现向量化执行
  4. 生产就绪:改进错误信息和调试支持

总结:DuckPL的核心价值

兼容性优先

  • 为现有PL/pgSQL代码库提供迁移路径
  • Postgres用户几乎无需学习成本
  • 与现有工具链立即兼容

智能执行引擎

  • 基于堆栈的流式解释,避免内存膨胀
  • 无需外部运行时,保持"零依赖"承诺
  • 随数据库一起分发,无额外依赖

前瞻性设计

  • 为自动UDF编译和内联优化奠定基础
  • 支持混合执行策略
  • 为未来性能飞跃预留空间

DuckPL即将开源,这将为DuckDB生态系统带来真正的过程式编程能力,让用户能在保持DuckDB核心优势的同时,享受完整的过程式编程体验。


作者:Denis Hirn(蒂宾根大学)
GitHub:@kryonix

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 23:46:03

【计算机毕业设计案例】基于php+vue.js流浪动物宠物领养公益网站基于php+vue的动物救助网站的设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/12 23:47:47

基于深度学习YOLOv11的小目标车辆检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 本文设计并实现了一种基于深度学习YOLOv11的小目标车辆检测系统&#xff0c;结合YOLO格式标注的自定义数据集&#xff0c;构建了完整的车辆检测解决方案。系统采用Python开发&#xff0c;集成用户友好的UI界面及登录注册功能&#xff0c;支持高效的小目标车辆识别…

作者头像 李华
网站建设 2026/5/12 8:31:58

海外短剧新引擎,JAVA源码一键出海

在海外短剧市场爆发式增长背景下&#xff0c;基于 JAVA 微服务架构 的源码方案通过 全球化支付、多语言支持、智能推荐、跨平台适配 等核心能力&#xff0c;成为短剧出海的“技术新引擎”。以下是具体技术实现与商业价值分析&#xff1a; 一、技术架构&#xff1a;高并发与全…

作者头像 李华
网站建设 2026/5/11 23:31:00

从跟单到AI量化:交易所开发者的“财富密码“藏在哪些技术细节里?

引言&#xff1a;交易所——数字金融时代的“超级枢纽” 在区块链技术重构全球金融体系的浪潮中&#xff0c;交易所已从单纯的交易撮合平台进化为集资产托管、风险管理、智能投顾于一体的数字金融基础设施。2025年全球数字资产交易所日交易量突破1200亿美元&#xff0c;衍生品…

作者头像 李华
网站建设 2026/5/11 6:45:26

计算机PHP毕设实战-基于php+vue的篮球馆智慧管理运营系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华