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/20 1:12:01

Gartner:AI 和数据中心支出大幅增长

据分析师Gartner最新预测&#xff0c;IT支出将增长近11%&#xff08;10.8%&#xff09;&#xff0c;到2026年将达到6.2万亿美元。Gartner最新的IT支出预测显示&#xff0c;2026年数据中心设备支出将增长32%&#xff0c;而软件支出预计增长近15%。这很大程度上与超大规模服务商扩…

作者头像 李华
网站建设 2026/4/23 15:58:47

JAVA旅游系统源码,畅享智慧出行新体验

以下是一套基于 JAVA 的旅游系统源码解决方案&#xff0c;整合了智能行程规划、一站式预订、实时信息推送等核心功能&#xff0c;助力用户畅享智慧出行新体验&#xff1a; 一、技术架构 后端框架 核心框架&#xff1a;Spring Boot 2.7 Spring Cloud 2021.0.5&#xff08;支持…

作者头像 李华
网站建设 2026/4/23 16:47:06

OpenClaw新手入门教程:OpenClaw/Clawdbot快速教程分享

OpenClaw新手入门教程&#xff1a;OpenClaw/Clawdbot快速教程分享。2026年OpenClaw&#xff08;Clawdbot&#xff09;一键部署教程。OpenClaw(原名Clawdbot/Moltbot)是一款开源的本地优先AI代理与自动化平台。它不仅能像聊天机器人一样对话&#xff0c;更能通过自然语言调用浏览…

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

PHP毕设选题推荐:基于php+vue的篮球馆智慧管理系统场地信息管理、预约【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/4/18 8:34:52

6.2 Bookinfo在Kubernetes中的部署:完整YAML配置实战

6.2 Bookinfo在Kubernetes中的部署:完整YAML配置实战 引言 部署Bookinfo是学习Istio的第一步。本文将详细介绍Bookinfo在Kubernetes中的完整部署过程,包括所有必要的YAML配置。 一、部署准备 1.1 前置条件 Kubernetes集群 Istio已安装 kubectl配置 1.2 启用自动注入 kub…

作者头像 李华