news 2026/7/13 2:17:03

OpenGauss内置函数初始化与查询全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenGauss内置函数初始化与查询全解析

1. initdb 时写入 pg_proc 的代码
builtin_funcs.ini 不是运行时读取的文本文件,而是通过 #include 在编译时被预处理器内联到 C++ 源码中(src/common/backend/catalog/pg_builtin_proc.cpp),生成 FuncGroup g_func_groups[] 数组。 t

写入 pg_proc 的核心代码在 src/common/backend/utils/cache/catcache.cpp:

- InsertBuiltinFuncInBootstrap()(约第 2495 行):遍历 g_func_groups[],对每个 Builtin_func 调用 CreateHeapTuple4BuiltinFunc() 构建 HeapTuple,然后通过
simple_heap_insert() 直接插入到 bootstrap 模式的 pg_proc 关系描述符中。
- 这个函数在 src/gausskernel/bootstrap/bootparse.y 中,当创建 pg_proc 关系后被调用(约第 250 行)。
- CreateHeapTuple4BuiltinFunc()(约第 1834 行)负责将 Builtin_func 结构体的各个字段(参数类型、返回值、语言ID、权限等)组装成符合 pg_proc 系统表布局的
HeapTuple。

2. 查询时是否直接使用全局变量

查询时有两条路径:

快速路径(按 OID 查找)—— 直接用全局变量,跳过 pg_proc 表:
- fmgr.cpp 中的 fmgr_isbuiltin() 调用 SearchBuiltinFuncByOid(),从 oidHash 哈希表中直接查到 Builtin_func 指针
- 如果命中,fmgr_info_cxt_security() 直接将 fn_addr 指向 C 函数地址,不查询 pg_proc 物理表

慢速路径(按名称+参数查找)—— 缓存未命中时用全局变量动态构造:
- 当系统缓存 SearchSysCache1(PROCNAMEARGSNSP, ...) 未命中时,SearchCatCacheListMiss() 会调用 SearchBuiltinProcCacheList()
- 该函数通过 nameHash 哈希表找到匹配的 Builtin_func,再用 CreateHeapTuple4BuiltinFunc() 动态构建一个 HeapTuple 返回
- 注意这里构建的 HeapTuple 和 bootstrap 阶段 simple_heap_insert 写入磁盘的物理 pg_proc 数据是共存的

整体流程:

builtin_funcs.ini
└─ #include 编译时内联 ─► g_func_groups[] / nameHash / oidHash

├─ initBuiltinFuncs() 进程启动时初始化哈希表

├─ Bootstrap 阶段 ─► InsertBuiltinFuncInBootstrap() ─► simple_heap_insert(pg_proc)

└─ 查询阶段
├─ fmgr_isbuiltin(oid) ─► oidHash 直接查 ─► 返回 fn_addr(不走 pg_proc 表)
└─ 按名缓存未命中 ─► nameHash 查 ─► CreateHeapTuple4BuiltinFunc() 动态构造 Tuple

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

AI代码审查实践指南:从环境配置到团队集成

1. 先搞清楚 AI 自动审查 PR 代码到底能帮你解决什么问题如果你在团队里做过代码审查,肯定遇到过这些情况:PR 堆积没人看、审查意见来回扯皮、低级错误反复出现、或者审查者时间不够只能草草过一遍。OpenAI Codex 这类 AI 代码审查工具,核心价…

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

深度学习入门指南:基于Python的神经网络理论与实践

很多刚接触深度学习的同学都有这样的困惑:面对复杂的数学公式和抽象的理论概念,不知道从哪里开始入手。其实深度学习入门并没有想象中那么困难,关键在于找到合适的学习资料和实践方法。《深度学习入门:基于Python的理论与实现》&a…

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

直流有刷电机驱动方案:TC78H651AFNG与PIC18F85K22组合设计

1. 项目背景与核心器件选型解析在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H651AFNG(东芝)与PIC18F85K22(Microchip)的组合&…

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

Houdini Vellum 布料 10 种材质参数对比:丝绸/牛仔/皮革等关键数值差异表

Houdini Vellum 布料材质参数完全指南:从丝绸到皮革的10种关键数值解析在数字角色服装、动态广告特效或游戏角色设计中,布料模拟的真实感往往决定了作品的质感层级。Houdini的Vellum系统提供了工业级精度的布料解算能力,但面对官方预设的10种…

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

LangGraph构建智能Agentic RAG:从传统检索到决策式问答系统

如果你正在构建基于大语言模型的智能应用,可能会遇到这样的困境:当用户提问时,模型要么直接回答(可能产生幻觉或信息过时),要么盲目检索外部知识库(即使问题很简单)。这种"要么…

作者头像 李华