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

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

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

相关文章:

  • 终极指南:SMAPI如何成为星露谷物语模组生态的基石
  • 实验报告
  • AI编程智能体在结构软件开发中的实践应用与优化策略
  • 字符串输入校验:只允许中英文数字与基础符号
  • 模板驱动型文档自动化:让非技术人员用规则代替编码
  • python神经网络编程入门(八)——全连接网络的“死穴“—— 为什么图像任务必须换思路,CNN?
  • 突破光学极限!新型“拼接”超透镜打破高NA与大视场魔咒
  • 真力时官方服务项目及价格查询|完整地址与24小时售后热线权威信息公告(2026年7月最新) - 亨得利官方服务中心
  • Winhance:开源免费的Windows系统优化工具使用指南
  • C++单元测试实战:gtest与gmock环境搭建、核心用法与工程实践
  • 锂电池组均衡充电技术及BQ25887应用解析
  • 豆包2.0实测:设计师如何用多模态语义理解提效降本
  • 网络工程毕业设计易上手选题汇总
  • 突破网盘限速:网盘直链下载助手的智能加速革新
  • Sqribble:浏览器里的文档操作系统与模板自动化原理
  • 直播流处理技术实战:从协议解析到FFmpeg高效应用
  • “Waiting to start…”卡死超15分钟?独家逆向工程MJ队列调度算法,提供3种绕过排队的紧急通道配置
  • AI Agent项目实战指南:从环境配置到生产部署
  • MAX77654与MKV46F电源管理方案在工业物联网中的应用
  • 计科毕业设计创新的方向怎么选
  • Git 管理 Word 文档 3 大痛点分析:存储膨胀、格式丢失与协作困境
  • 万国官方售后服务中心电话与详细地址实地考察报告_多信源验证(2026年7月最新) - 万国中国官方服务中心
  • 医疗健康辅助系统开发:低血压监测与智能管理技术实践
  • 号称一键把 AIGC 率降到个位数的工具靠谱吗?实测给你看
  • 1. 配置环境、创建导航栏
  • 启动文件:0x08000000第一个字是栈顶,第二个字是复位入口
  • 【ChatGPT FAQ自动生成实战指南】:20年NLP专家亲授5大核心算法与3类企业落地陷阱
  • 方案能不能进入下一阶段,先看这 6 类证据
  • 揭秘Goo Engine:Blender二次元渲染的革命性定制版本
  • 电脑上有没有好用的音频格式转换器?盘点10款好用的音频转换工具