无损迁移含 NUL 的来源文本并恢复 PostgreSQL 断点 #14

Merged
Zayden-Jung merged 1 commits from codex/postgres-nul into main 2026-11-06 19:37:01 +00:00
Collaborator

全量迁移在一条来源摘要包含 NUL 时失败,PostgreSQL text 无法接收该字符,导致 source_records 的 COPY 事务回滚。本修复保留原始内容并允许从同一固定 SQLite 快照继续恢复。

  • 新增 postgres/text.py:可逆 nul-soh-v1 编码,NUL→SOH/SOH,原有 SOH→SOH/STX,其余字符不变;保持字串前缀及文本复合主键的二进制顺序。
  • postgres/migration.py:COPY 编码、全量回读后解码再比较原始内容哈希,另记物理存储哈希。旧版已提交暂存表在事务中升级;已建唯一约束的情况先移除未发布约束/索引,再通过正常流程重建验证,避免升级过程中的临时键冲突。发布时记录 schema 格式注释。
  • postgres/client.py:按公开 schema 注释识别格式,编码绑定参数并还原查询结果;其他项目无需访问私有迁移控制表,旧版未编码 schema 保持兼容。
  • tests/test_postgres.py:覆盖控制字符碰撞与前缀排序、真实 PostgreSQL 全量内容/复合键/筛选/详情/NUL 后全文检索、旧断点及已建唯一约束断点升级。
  • docs/operations.md、docs/usage.md:说明编码格式、共享读取、恢复和逻辑/物理哈希区别;直接 SQL/ETL 需要按版本解码。

验证:本提交 CI964/job1061 已成功(aliyun-ces-control,ces-control 标签):完整192项测试通过,包含9项实际 PostgreSQL 集成用例,wheel 构建、安装及入口检查通过。此前最终源码16项 PostgreSQL 专项检查也通过。未在本机测试或构建,git diff --check 通过。

运行状态:生产迁移与独立验收现已完成。完整21表数量及还原内容SHA-256全部一致,21主键/26外键/7唯一约束/4CHECK均有效,历史ID序列、GIN索引、PG与SQLite统计/标签/详情比较、含NUL来源摘要3684518原文还原、跨会议拒稿后录用历史及原生全文查询通过。原foundry-postgres实例未重启,foundry-core readiness为200,临时自动维护设置已恢复。独立验收单元4d7a32b301194ac99b63e3ddd65fcd13退出码0;报告/data/paper-index/collected/postgres-postcheck.json状态passed,2026-11-07T06:50:20Z验收。主库指针/data/paper-index/postgres-primary.json已写入,指向foundry_data.research;SQLite保留0444只读备份并有匹配切换标记。首次NUL失败与后续验收控制器因临时单元回收而停止的现场均保留,未重跑已完成迁移;已独立恢复维护并完成验收。当前3,526,999条论文记录,原目标最终去重、剩余来源导入和会议覆盖仍未完成。按用户要求暂停完整goal并保留待办。本PR已由用户手动合并,bot未合并或推送main。

base main;head codex/postgres-nul(4e62710)。已由用户手动合并;未开启自动合并。

全量迁移在一条来源摘要包含 NUL 时失败,PostgreSQL text 无法接收该字符,导致 source_records 的 COPY 事务回滚。本修复保留原始内容并允许从同一固定 SQLite 快照继续恢复。 - 新增 postgres/text.py:可逆 nul-soh-v1 编码,NUL→SOH/SOH,原有 SOH→SOH/STX,其余字符不变;保持字串前缀及文本复合主键的二进制顺序。 - postgres/migration.py:COPY 编码、全量回读后解码再比较原始内容哈希,另记物理存储哈希。旧版已提交暂存表在事务中升级;已建唯一约束的情况先移除未发布约束/索引,再通过正常流程重建验证,避免升级过程中的临时键冲突。发布时记录 schema 格式注释。 - postgres/client.py:按公开 schema 注释识别格式,编码绑定参数并还原查询结果;其他项目无需访问私有迁移控制表,旧版未编码 schema 保持兼容。 - tests/test_postgres.py:覆盖控制字符碰撞与前缀排序、真实 PostgreSQL 全量内容/复合键/筛选/详情/NUL 后全文检索、旧断点及已建唯一约束断点升级。 - docs/operations.md、docs/usage.md:说明编码格式、共享读取、恢复和逻辑/物理哈希区别;直接 SQL/ETL 需要按版本解码。 验证:本提交 CI964/job1061 已成功(aliyun-ces-control,ces-control 标签):完整192项测试通过,包含9项实际 PostgreSQL 集成用例,wheel 构建、安装及入口检查通过。此前最终源码16项 PostgreSQL 专项检查也通过。未在本机测试或构建,git diff --check 通过。 运行状态:生产迁移与独立验收现已完成。完整21表数量及还原内容SHA-256全部一致,21主键/26外键/7唯一约束/4CHECK均有效,历史ID序列、GIN索引、PG与SQLite统计/标签/详情比较、含NUL来源摘要3684518原文还原、跨会议拒稿后录用历史及原生全文查询通过。原foundry-postgres实例未重启,foundry-core readiness为200,临时自动维护设置已恢复。独立验收单元4d7a32b301194ac99b63e3ddd65fcd13退出码0;报告/data/paper-index/collected/postgres-postcheck.json状态passed,2026-11-07T06:50:20Z验收。主库指针/data/paper-index/postgres-primary.json已写入,指向foundry_data.research;SQLite保留0444只读备份并有匹配切换标记。首次NUL失败与后续验收控制器因临时单元回收而停止的现场均保留,未重跑已完成迁移;已独立恢复维护并完成验收。当前3,526,999条论文记录,原目标最终去重、剩余来源导入和会议覆盖仍未完成。按用户要求暂停完整goal并保留待办。本PR已由用户手动合并,bot未合并或推送main。 base main;head codex/postgres-nul(4e62710)。已由用户手动合并;未开启自动合并。
codex-bot added 1 commit 2026-11-06 19:28:37 +00:00
Preserve NUL text through PostgreSQL migration and resume
Metadata integrity checks / metadata (push) Successful in 1m7s
4e62710bba
Zayden-Jung merged commit 426aa042a5 into main 2026-11-06 19:37:01 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Zayden-Jung/paper-atlas#14