news 2026/4/23 18:41:26

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/4/23 13:02:27

【课程设计/毕业设计】基于Vue的宠物领养系统的设计基于php+vue的动物救助网站的设计与实现【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/4/23 12:52:02

Nodejs毕设选题推荐:基于VUE框架的实时新闻推送新闻信息管理、新闻投稿管理平台【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/4/23 12:48:04

ollama 官网下载安装包慢怎么解决

ollama 官网下载安装包慢怎么解决 下载 Ollama 官网安装包慢是很多国内用户&#xff08;尤其是在河南等地区&#xff09;常见的问题&#xff0c;这通常是因为网络连接 GitHub 或其服务器时存在延迟或限速。 别担心&#xff0c;这个问题很好解决。我为你整理了几种最有效的提速…

作者头像 李华
网站建设 2026/4/23 13:01:26

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

一、项目介绍 随着零售行业的快速发展&#xff0c;智能商品识别技术在超市管理中的应用日益广泛。本文基于YOLOv12深度学习算法&#xff0c;设计并实现了一套高效的超市商品识别检测系统。该系统能够准确识别295种常见商品&#xff0c;涵盖饮料、零食、调味品、生鲜等多个类别…

作者头像 李华
网站建设 2026/4/23 14:50:24

Nodejs计算机毕设之基于nodejs+vue知识交流平台的实现与设计基于nodejs的计算机c语音自学交流平台(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/23 14:45:22

计算机Nodejs毕设实战-基于nodejs的计算机c语音自学交流平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华