当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/342418/

相关文章:

  • 上海本地生活团购代运营TOP5优选(2026版):全平台赋能商户破局,标杆服务商深度测评 - 野榜数据排行
  • PHP毕设项目:基于php+vue的动物救助网站的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 郑州瑞创建材有限公司——郑州GRC挂板标杆厂家,荥阳市一体化解决方案供应商 - 朴素的承诺
  • 跟AI学一手之自定义调试函数或者类
  • 2026年 化妆刷厂家推荐排行榜:动物毛化妆刷,套刷定制,轮廓刷腮红刷粉底刷眼影刷,专业美妆工具实力解析 - 品牌企业推荐师(官方)
  • 郑州瑞创建材有限公司——立足荥阳,打造河南夯土板行业标杆品牌 - 朴素的承诺
  • PHP毕设项目:基于php+vue的高校资助管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2026中国境外券商投行机构哪家靠谱?送你一份综合评估与选择指南 - Top品牌推荐
  • DeepSeek总结的DuckDB扩展开发实战指南:从标量函数到并行表函数
  • 2026十大高清免费版权图片素材下载网站推荐 - 品牌2026
  • 2026年吸塑机厂家实力推荐榜:全自动正负压/蛋糕盒/汽车配件专用等吸塑机品牌深度解析与选购指南 - 品牌企业推荐师(官方)
  • 2026年 云安全服务商推荐榜单:云安全防护/云安全解决方案/云安全技术/企业云安全/公有云安全/私有云安全,全方位守护企业数字资产 - 品牌企业推荐师(官方)
  • 耐高温水泵采购怎么选?哪些生产企业通过了行业认证? - 品牌推荐大师
  • 耐高温水泵哪家厂家质量可靠?源头生产商有哪些推荐? - 品牌推荐大师
  • 2026年钢材批发厂家厂家最新推荐:方管销售厂、钢材市场、钢材生产厂家、镀锌方管厂家、镀锌方管生产厂家、附近方管批发选择指南 - 优质品牌商家
  • 2026设计师、美工、运营必备:十大正版商用图库网站深度评测与推荐 - 品牌2026
  • 2026年钢材厂家厂家推荐:方管批发厂推荐/钢材生产厂家/哪里有方管批发/成都方管批发/成都钢材批发/成都钢材批发市场/选择指南 - 优质品牌商家
  • 为什么海外大厂开始重新评估 Airbyte?
  • 第 1 篇 | 调度系统,不只是一个“定时器”
  • 【山海鲸实战案例】通过二维组件控制三维场景天气变化
  • 如何选择一款真正能打通研发到生产的工业AI平台?
  • 2026年数据风控厂家推荐:风控平台/风控技术/风控模型/风控系统/风控解决方案/企业数据/实时风控/数据分析/选择指南 - 优质品牌商家
  • PHP计算机毕设之基于php+vue的动物救助网站的设计与实现基于Vue的宠物领养系统的设计(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机网络经典问题透视:无线个人区域网WPAN的主要特点是什么?
  • Nodejs毕设项目:基于VUE框架的实时新闻推送平台(源码+文档,讲解、调试运行,定制等)
  • STM32L452VE使用Cortex-Debug
  • 计算机网络经典问题透视:如何探知无线AP的SSID与BSSID?
  • 2026年汽车真皮座椅翻新厂家实力推荐:磨损/掉色/换皮/老化修复及汽车装饰用品源头服务商精选 - 品牌推荐官
  • 基于深度学习YOLOv11的车辆行人检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 【毕业设计】基于php+vue的高校资助管理系统的设计与实现(源码+文档+远程调试,全bao定制等)