首页/新闻资讯/正文详情

用 PostgreSQL 原生回归测试套件验证 TimescaleDB:pginstallcheck 目标完整指南

发布时间:2026/9/20 23:09:01 来源:云帆数科 栏目:资讯中心
用 PostgreSQL 原生回归测试套件验证 TimescaleDB:pginstallcheck 目标完整指南
用 PostgreSQL 原生回归测试套件验证 TimescaleDBpginstallcheck 目标完整指南【免费下载链接】timescaledbA time-series database for high-performance real-time analytics packaged as a Postgres extension项目地址: https://gitcode.com/gh_mirrors/ti/timescaledbTimescaleDB 作为 PostgreSQL 扩展深度修改了规划器planner与 DDL 钩子hooks因此其改动是否与标准 PostgreSQL 行为兼容至关重要。本文介绍仓库中 test/pgtest 目录提供的pginstallcheckCMake 目标如何在加载 TimescaleDB 扩展的情况下直接运行 PostgreSQL 自带的src/test/regress回归测试套件以及这一机制的底层实现原理。读完本文你将掌握从配置PG_SOURCE_DIR、生成构建目录到执行make pginstallcheck的完整流程并理解测试计划schedule如何被裁剪、扩展如何被预加载。为什么需要运行 PostgreSQL 原生测试套件TimescaleDB 不是传统的纯 SQL 层扩展——它在 C 层面介入 PostgreSQL 的核心执行路径在规划阶段src/planner/planner.c 中的钩子会拦截查询计划将针对 hypertable 的查询改写为面向多个 chunk 的查询在 DDL 阶段src/process_utility.c 会拦截CREATE TABLE、ALTER TABLE等语句自动把普通表转换为 hypertable 并维护维度、chunk 等元数据。这种深层次的侵入意味着任何对 PostgreSQL 内部接口的误用都可能让扩展与原生 PostgreSQL 行为产生冲突而这类冲突往往只有在大规模标准测试中才会暴露。test/pgtest/README.md 明确指出运行标准 PostgreSQL 测试套件的价值就在于确保 TimescaleDB 修改的 planner 和 DDL 钩子与标准 PostgreSQL 兼容。因此test/pgtest目录的目标不是测试 TimescaleDB 自己的功能那由 test/sql 和 tsl/test 下的回归测试负责而是用 PostgreSQL 官方的测试资产做兼容性体检。前置条件运行pginstallcheck需要满足以下条件PostgreSQL 源码树必须能访问 PostgreSQL 的源码测试资产SQL 脚本、期望输出、数据文件将从src/test/regress目录复制出来源码树已编译至少src/test/regress目录需要完成编译因为pg_regress工具和测试所需的二进制组件依赖构建产物TimescaleDB 构建环境就绪通常指已通过bootstrap脚本初始化好 CMake 构建目录并已安装/可加载 TimescaleDB 扩展。仓库当前支持的 PostgreSQL 主版本为 15、16、17 和 18见 CMakeLists.txt 中的版本检查使用与目标版本匹配的 PostgreSQL 源码树即可。配置构建定位 PostgreSQL 源码树pginstallcheck目标依赖PG_SOURCE_DIRCMake 变量来定位 PostgreSQL 源码树。顶层 CMakeLists.txt 会尝试自动探测该路径find_path( PG_SOURCE_DIR src/include/pg_config.h.in HINTS $ENV{HOME} $ENV{HOME}/projects $ENV{HOME}/Projects $ENV{HOME}/development $ENV{HOME}/Development $ENV{HOME}/workspace PATH_SUFFIXES postgres postgresql pgsql DOC The path to the PostgreSQL source tree)也就是说如果 PostgreSQL 源码位于$HOME/postgres、$HOME/projects/postgresql之类的常见目录下CMake 会在配置阶段自动找到它并在输出中打印Found PostgreSQL source in /path/to/postgresql如果自动探测失败则需要手动指定这是 README 中给出的标准配置方式。在 TimescaleDB 源码树的顶层目录执行$ mkdir build cd build $ cmake -DPG_SOURCE_DIRpath/to/pg/source ..其中path/to/pg/source应替换为 PostgreSQL 源码树的绝对路径即包含src/include/pg_config.h.in的目录。注意find_path探测的 HINTS 路径会作为默认值缓存而显式传入的-DPG_SOURCE_DIR优先级最高。只有配置阶段成功解析出PG_SOURCE_DIR后test/CMakeLists.txt 才会把pgtest子目录纳入构建if(PG_SOURCE_DIR) add_subdirectory(pgtest) endif(PG_SOURCE_DIR)换句话说没有 PostgreSQL 源码树时pginstallcheck目标根本不会生成。运行测试make pginstallcheckCMake 配置完成后直接执行$ make pginstallcheck该命令的核心行为由 test/pgtest/CMakeLists.txt 定义add_custom_target( pginstallcheck COMMAND ${PG_REGRESS} ${PG_REGRESS_OPTS_BASE} ${PG_REGRESS_OPTS_PGTEST} ${PG_REGRESS_OPTS_TEMP_INSTANCE_PGTEST} USES_TERMINAL)其中${PG_REGRESS}是pg_regress回归测试驱动程序位于 PostgreSQL 安装目录的bin下${PG_REGRESS_OPTS_PGTEST}指定了裁剪后的测试计划并加载 TimescaleDB 扩展set(PG_REGRESS_OPTS_PGTEST --schedule${CMAKE_CURRENT_BINARY_DIR}/schedule --load-extensiontimescaledb)${PG_REGRESS_OPTS_TEMP_INSTANCE_PGTEST}让pg_regress启动一个临时 PostgreSQL 实例与 TimescaleDB 自身的回归测试共用同一套临时实例机制并注入专为该测试准备的配置set(PG_REGRESS_OPTS_TEMP_INSTANCE_PGTEST --temp-instance${TEST_CLUSTER}-pg --temp-config${TEST_OUTPUT_DIR}/pgtest.conf)pgtest.conf由模板 test/pgtest.conf.in 生成内容非常精简但关键# postgresql.conf settings for PostgreSQL test suite shared_preload_librariestimescaledb TELEMETRY_DEFAULT_SETTINGshared_preload_librariestimescaledb确保扩展在实例启动时就随共享库预加载这也是 TimescaleDB 注册钩子、共享内存结构所必需的前提TELEMETRY_DEFAULT_SETTING则根据构建时是否开启遥测USE_TELEMETRY见 test/test-defs.cmake展开为timescaledb.telemetry_leveloff或留空保证测试环境默认关闭遥测、行为可复现。底层机制剖析测试资产如何搬运与裁剪pginstallcheck的魔法在 CMake 配置阶段就已经完成。运行make pginstallcheck之前CMake 会依次做四件事全部位于 test/pgtest/CMakeLists.txt1. 复制测试资产set(PG_REGRESS_DIR ${PG_SOURCE_DIR}/src/test/regress CACHE PATH Path to PostgreSQLs regress directory) set(PGTEST_DIRS ${PG_REGRESS_DIR}/data ${PG_REGRESS_DIR}/sql ${PG_REGRESS_DIR}/expected) file(COPY ${PGTEST_DIRS} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})data回归测试用的数据文件、sql测试 SQL 脚本和expected期望输出三个目录被整体复制到 TimescaleDB 的构建输出目录。注释解释了原因测试套件会从模板源文件生成一些 SQL 脚本和输出文件要求这些目录与输出目录同处一地colocated。2. 读取并裁剪测试计划file(READ ${PG_REGRESS_DIR}/parallel_schedule PG_TEST_SCHEDULE)PostgreSQL 的回归测试由src/test/regress/parallel_schedule文件编排pg_regress按该计划顺序执行各组测试。TimescaleDB 从中读取完整计划后按需剔除与扩展环境冲突的用例。3. 准备 tablespace 测试目录file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testtablespace)回归测试套件中的tablespace测试需要真实的目录来创建表空间因此预先在构建目录下建好。4. 从计划中剔除不兼容测试set(PG_IGNORE_TESTS advisory_lock amutils database event_trigger jsonb_jsonpath opr_sanity sanity_check type_sanity create_am select_parallel psql)这 11 项测试被从parallel_schedule中移除原因可归为几类依赖特定扩展/模块amutils需要amcheck等、jsonb_jsonpath测试脚本依赖database、event_trigger等涉及全局状态与扩展共存时行为不稳定与扩展冲突的 sanity 检查opr_sanity、sanity_check、type_sanity会严格校验系统目录pg_catalog等内容的一致性而 TimescaleDB 预加载后会改变部分目录状态这类白盒校验不再适用行为与版本/并发相关select_parallel在不同版本下会派生不同数量的并行 worker注释明确说明因此被忽略psql、advisory_lock等涉及客户端交互或全局锁语义。值得注意的实现细节同样写在 CMake 注释中pg_regress 在 PG16 移除了--ignore选项对应 PostgreSQL 提交 bd8d453e9b5f8b632a400a9e796fc041aed76d82因此这里不再依赖运行时的忽略参数而是通过string(REPLACE ...)把对应测试行从 schedule 文本中直接删除再写回裁剪后的计划文件foreach(IGNORE_TEST ${PG_IGNORE_TESTS}) string(REPLACE test: ${IGNORE_TEST}\n PG_TEST_SCHEDULE ${PG_TEST_SCHEDULE}) string(REPLACE ${IGNORE_TEST} PG_TEST_SCHEDULE ${PG_TEST_SCHEDULE}) string(REPLACE ${IGNORE_TEST}\n \n PG_TEST_SCHEDULE ${PG_TEST_SCHEDULE}) endforeach(IGNORE_TEST) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/schedule ${PG_TEST_SCHEDULE})最终生成的schedule文件就是--schedule参数指向的输入意味着测试内容会随 PostgreSQL 源码版本自动同步而排除清单则由 TimescaleDB 维护。配套目标pginstallchecklocal除了临时实例模式test/pgtest/CMakeLists.txt 还定义了pginstallchecklocaladd_custom_target( pginstallchecklocal COMMAND ${PG_REGRESS} ${PG_REGRESS_OPTS_BASE} ${PG_REGRESS_OPTS_PGTEST} ${PG_REGRESS_OPTS_LOCAL_INSTANCE} USES_TERMINAL)两者共享同一份裁剪后的 schedule 和--load-extensiontimescaledb唯一区别是连接方式pginstallcheck使用--temp-instance启动一次性临时集群用完即销毁适合 CI 和本地快速验证而pginstallchecklocal通过${PG_REGRESS_OPTS_LOCAL_INSTANCE}连接到一个已经运行中的 PostgreSQL 实例set(PG_REGRESS_OPTS_LOCAL_INSTANCE --host${TEST_PGHOST} --port${TEST_PGPORT_LOCAL})TEST_PGHOST默认localhost、TEST_PGPORT_LOCAL默认5432见 test/test-defs.cmake均可通过 CMake 缓存变量覆盖。这种模式适合需要在特定配置、特定数据的常驻实例上反复调试的场景。与 TimescaleDB 自身测试体系的关系在仓库的整体测试架构中pginstallcheck是一个独立补充层TimescaleDB 自身的 SQL 回归测试由regresscheck临时实例与regresschecklocal本地实例驱动测试资产位于 test/sql 与 tsl/test/sql统一由 test/CMakeLists.txt 中的pg_regress.sh包装器执行pginstallcheck则完全复用 PostgreSQL 官方src/test/regress的资产目标指向兼容性而非功能正确性只有当PG_SOURCE_DIR被解析到且REGRESS_CHECKS开启从而找到pg_regress时该目标才会出现在构建系统中。两者互补前者验证 TimescaleDB 自身的 hypertable、压缩、连续聚合等功能后者验证扩展加载后不会破坏 PostgreSQL 的任何原生行为。对于计划在 CI 中同时跑两者的团队建议在配置阶段显式传入-DPG_SOURCE_DIR避免自动探测在无头环境中失败若要在已有实例上快速复核make pginstallchecklocal无需反复启停临时集群是更轻量的选择。小结pginstallcheck是 TimescaleDB 为保证扩展与 PostgreSQL 内核深度耦合仍不破坏原生行为而设计的兼容性测试通道。其核心链路可以概括为PG_SOURCE_DIR定位源码 → CMake 复制src/test/regress资产并读取parallel_schedule→ 剔除 11 项冲突测试生成新 schedule →pg_regress以--load-extensiontimescaledb在临时实例或本地实例上执行全套原生回归测试。无论是扩展开发者验证钩子改动还是发布前的兼容性回归这一目标都值得纳入常规测试流程。更多细节可继续阅读 test/pgtest/CMakeLists.txt 与 test/pgtest/README.md 原文。【免费下载链接】timescaledbA time-series database for high-performance real-time analytics packaged as a Postgres extension项目地址: https://gitcode.com/gh_mirrors/ti/timescaledb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

如何 5 分钟上手 miniblink49:面向新手的轻量浏览器内核完整指南
如何 5 分钟上手 miniblink49:面向新手的轻量浏览器内核完整指南

如何 5 分钟上手 miniblink49:面向新手的轻量浏览器内核完整指南 【免费下载链接】miniblink49 a lighter, faster browser kernel of blink to integrate HTML UI in your app. 一个小巧、轻量的浏览器内核,用来取代wke和libcef 项目地址: https://gi… · 2026/9/20 23:09:01

Vitess v17.0.3 版本解读:`--grpc-send-session-in-streaming` 标志与 StreamExecute 流式事务兼容性修复
Vitess v17.0.3 版本解读:`--grpc-send-session-in-streaming` 标志与 StreamExecute 流式事务兼容性修复

数据库分布式数据库云原生后端数据存储 【免费下载链接】vitess Vitess is a database clustering system for horizontal scaling of MySQL. 项目地址: https://gitcode.com/gh_mirrors/vi/vitess 点击查看 免费下载 导读 Vitess v17.0.3 是 v17.0 系列的一个关键… · 2026/9/20 23:09:01

OpenDesign 设计系统 2.0 溯源与 Token 契约解析:以 Retro 包的 Source Evidence 为例
OpenDesign 设计系统 2.0 溯源与 Token 契约解析:以 Retro 包的 Source Evidence 为例

OpenDesign 设计系统 2.0 溯源与 Token 契约解析:以 Retro 包的 Source Evidence 为例 【免费下载链接】open-design 🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. &… · 2026/9/20 23:09:01

网站开发分为几个方向?这份避坑指南让你少交学费
网站开发分为几个方向?这份避坑指南让你少交学费

网站开发分为几个方向?这份避坑指南让你少交学费 刚接触建站的朋友,是不是对着电脑屏幕发呆?心里最慌的往往不是代码写不出来,而是 备案流程一头雾水 。域名解析了,服务器买好了,结果卡在“ICP备案”这一步,电话打不通,材料被驳回,时间全耗在反复修改上。很多老板以为建站就是找个公司做个页面,其实这里面的… · 2026/9/21 2:49:53

Presto内存管理与溢写磁盘:大查询防OOM的完整解决方案
Presto内存管理与溢写磁盘:大查询防OOM的完整解决方案

Presto内存管理与溢写磁盘:大查询防OOM的完整解决方案 【免费下载链接】presto The official home of the Presto distributed SQL query engine for big data 项目地址: https://gitcode.com/gh_mirrors/pre/presto Presto 是业界主流的分布式 SQL 查询引擎… · 2026/9/21 2:49:53

oh-my-openagent 中的 FastAPI 全栈规范:SQLAlchemy 2.x async + Postgres + Pydantic v2 生产级 API 搭建指南
oh-my-openagent 中的 FastAPI 全栈规范:SQLAlchemy 2.x async + Postgres + Pydantic v2 生产级 API 搭建指南

人工智能AI Agent代码智能体多智能体MCP ClientsAgent 编排 【免费下载链接】oh-my-openagent OmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering. 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-… · 2026/9/21 2:49:53

RxJS v4 windowWithCount 操作符详解:按元素数量将可观测序列切分为多个窗口
RxJS v4 windowWithCount 操作符详解:按元素数量将可观测序列切分为多个窗口

RxJS v4 windowWithCount 操作符详解:按元素数量将可观测序列切分为多个窗口 【免费下载链接】RxJS The Reactive Extensions for JavaScript 项目地址: https://gitcode.com/gh_mirrors/rxj/RxJS 本文围绕 RxJS v4 的 windowWithCount(别名 wind… · 2026/9/21 2:49:53

示波器探头怎么选?从分类到避坑,一篇讲透
示波器探头怎么选?从分类到避坑,一篇讲透

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 2:48:52

Relay 数据更新完全指南:Mutation、Subscription 与本地存储更新机制
Relay 数据更新完全指南:Mutation、Subscription 与本地存储更新机制

Relay 数据更新完全指南:Mutation、Subscription 与本地存储更新机制 【免费下载链接】relay Relay is a JavaScript framework for building data-driven React applications. 项目地址: https://gitcode.com/gh_mirrors/relay29/relay Relay 在客户端维护一… · 2026/9/21 2:48:52

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39

Word表格编号全攻略:从列表编号到题注交叉引用
Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39

从第一个站到第二个站:独立开发者的静态网站选型与落地实践
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41

Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行
Claude Code 按智谱AI指南装完,ANTHROPIC_BASE_URL 改走 TaoToken 兼容通道行不行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 0:00:18

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码