← 返回 Skill 列表
extension
分类: 开发与工程API Key 暂未确认

seekdb 可复现 SQL 验证

为 OceanBase seekdb 设计可重复执行的 SQL 验证、回归测试与证据记录。适用于验证 SQL 行为、复现数据库问题、比较修复前后结果或整理可审计的测试记录。

person作者: daylight1949hubModelScope

seekdb 可复现 SQL 验证

把数据库结论变成其他人可以按相同步骤重跑的证据。优先使用最小数据集、明确断言和真实 seekdb 实例;不要把命令成功退出当作业务结果正确。

开始前

先确认以下信息,缺少时从项目配置和现有测试中查找;只有关键选择会改变结果时才询问用户:

  • 待验证的 SQL、功能或缺陷;
  • 预期行为,以及哪些输出字段构成通过条件;
  • seekdb 连接方式和版本;
  • 是否允许创建临时数据库或表;
  • 是否需要保留现场供后续检查。

密码、令牌和完整连接串只从环境变量或本机凭据读取。证据中记录主机类型、端口和用户角色即可,所有秘密替换为 <redacted>。

验证流程

1. 固定运行环境

连接真实 seekdb 后,先执行:

SELECT VERSION() AS seekdb_version;
SELECT DATABASE() AS current_database;

记录客户端名称、seekdb 版本和测试时间。若连接的是 MySQL、MariaDB 或模拟器,明确标注,不能把结果写成 seekdb 验证。

2. 建立最小夹具

使用只服务于本次验证的数据库或带唯一前缀的表名。夹具应满足:

  • 数据行数量尽量少,但覆盖正常、边界和空结果;
  • 主键及排序字段固定,避免依赖未声明的行顺序;
  • 建表、插入和查询 SQL 完整保存;
  • 重跑前只清理明确命名的测试对象。

不要删除用户现有的数据库、表或数据。清理范围无法确认时,保留现场并报告对象名称。

3. 把预期写成断言

为每个目标行为定义可观察条件,例如:

| 条件 | 可观察证据 | | --- | --- | | 返回正确记录 | 主键集合与预期集合相同 | | 排序稳定 | ORDER BY 明确,结果顺序逐项匹配 | | 过滤正确 | 应包含与应排除的行分别列出 | | 计划使用目标索引 | 保存 EXPLAIN 输出并指出目标节点 | | 写入正确 | 写入后重新查询,不仅检查受影响行数 |

不要只截取有利的几行。结果较长时,保存完整原始输出,并在摘要中引用决定结论的行。

4. 执行并保存原始结果

优先使用项目已有测试入口。没有入口时,可使用 MySQL 兼容客户端或 Python DB-API 执行同一份 SQL 文件。每次运行保存:

  • 实际命令,秘密已脱敏;
  • 标准输出和标准错误;
  • 进程退出码;
  • SQL 文件与夹具文件的 SHA-256;
  • 每条断言的通过或失败状态。

服务端返回错误时,保留错误码、SQLSTATE 和消息。先区分服务端 SQL 错误、客户端转义错误、网络错误和测试断言失败,再决定是否修改 SQL。

5. 比较修复前后

验证代码或配置修复时,使用相同的 seekdb 版本、夹具、查询和断言分别运行修复前与修复后版本。至少证明:

  1. 修复前目标断言失败;
  2. 修复后同一断言通过;
  3. 相关回归断言仍通过。

如果无法运行修复前版本,明确写成“仅验证当前版本”,不要构造失败记录。

证据目录

建议交付以下最小结构:

evidence/
├── environment.txt
├── setup.sql
├── query.sql
├── expected.md
├── stdout.txt
├── stderr.txt
└── result.md

result.md 使用以下格式:

# seekdb SQL 验证结果

- 目标:<一句话描述>
- 版本:<SELECT VERSION() 的结果>
- 结论:PASS / FAIL / BLOCKED
- 夹具:<数据库、表、数据规模>

## 断言

| 断言 | 预期 | 实际 | 状态 |
| --- | --- | --- | --- |
| <名称> | <预期> | <实际> | PASS/FAIL |

## 复现

<脱敏后的命令和文件顺序>

## 限制

<未覆盖的版本、数据规模或运行条件>

提交前检查

  • 确认测试确实连接 seekdb,并记录 SELECT VERSION() 结果;
  • 确认所有结论都有 SQL 输出或断言支撑;
  • 确认 SQL、夹具和预期可由第三方独立执行;
  • 确认输出中没有密码、令牌、Cookie、内网地址或个人数据;
  • 确认未把临时验证扩大成无关的性能或兼容性结论;
  • 确认清理操作只针对本次创建的测试对象。
<!-- OB-S:vjIcg6kuakQkh_onu9NRgg -->