news 2026/2/7 23:12:10

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/2/8 9:05:20

如何选择一款真正能打通研发到生产的工业AI平台?

在制造业加速智能化转型的当下&#xff0c;企业对工业AI平台的需求早已不再停留在单点自动化或局部效率提升的层面。真正有远见的制造企业&#xff0c;正在寻找一种能够贯通研发、工艺、生产、质量乃至供应链的全链路智能中枢。然而&#xff0c;市面上的平台林林总总&#xff0…

作者头像 李华
网站建设 2026/2/7 1:47:36

基于深度学习YOLOv11的超市商品识别检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 随着零售行业的快速发展&#xff0c;智能商品识别技术在超市自动化管理中扮演着重要角色。本文基于深度学习技术&#xff0c;提出了一种基于YOLOv11的超市商品识别检测系统。该系统通过YOLOv11算法实现了对295类超市商品的高精度实时检测&#xff0c;并集成了用户…

作者头像 李华
网站建设 2026/2/8 7:40:45

【计算机毕业设计案例】基于nodejs的计算机c语音自学交流平台基于nodejs+vue知识交流平台的实现与设计(程序+文档+讲解+定制)

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

作者头像 李华
网站建设 2026/2/7 13:08:53

Python入门:从“一脸懵”到“有点东西”,只需3小时

前言 “想学Python却不知从哪下手&#xff1f;看了教程只会打印Hello World&#xff1f;别急&#xff0c;这篇指南让你3小时后就能用Python做点‘真事儿’。” 一、别装软件&#xff01;第一步先“玩”起来 新人最大误区&#xff1a;花3小时配环境&#xff0c;然后热情耗尽。…

作者头像 李华