Skip to content

fix: 修正搬移參數與 PostgreSQL 索引鍵預檢 - #47

Merged
NickYCLin merged 2 commits into
masterfrom
fix/migration-parameters-key-budget
Oct 14, 2026
Merged

NickYCLin merged 2 commits into
masterfrom
fix/migration-parameters-key-budget

Conversation

@NickYCLin

Copy link
Copy Markdown
Collaborator

範圍

接續已合併 PR46;只修三個 SQLServerBatchInsert 真引擎問題及 PostgreSQL 索引 byte budget。版更仍 hold,不新增 tag、不觸發 release、不加發布 trailer。

  • SQL Server:2098 資料參數上限/guard,替 RPC 保留額度;非 NULL TimeSpan 由 SQL client Value 推導,NULL time 明確 SqlDbType.Time,其他 provider 仍使用 DbType.Time;byte[] 欄位包含 DBNull 都設 Binary。
  • PostgreSQL:讀 SHOW block_size 並納入 fingerprint;只接受標準 8192-byte page。PK/普通索引逐列、每鍵限制保守 2048-byte tuple 預算,包含複合鍵、UTF-8、varlena header、NULL bitmap 與對齊。未知 page fail closed;未索引文字保留原本欄位上限。
  • 兩個目的分開提交。新增可重跑的正式來源 SQL2019/2022 runner,隨機容器/localhost 動態 port/tmpfs,核對 ownership label 後清除,不存取真實 profile、不保存密碼。

已實際執行(不是獨立審查的 patched copy)

  • 正式來源 .NET8 全 solution Release build 成功;cross-platform smoke 33/33。既有 nullable warnings,沒有新編譯錯誤。
  • python3 tests/Run-SqlServerVersionMigration.py /tmp/mysqlpunk-formal-sql-20261014-final:15.0.4500.2 → 16.0.4255.1 → 15.0.4500.2,兩向各1007列/7欄+空表,正式 service/catalog/session/batch/owner+SHA256 multiset/schema。bigint極值、繁中emoji、decimal(20,6)、datetime2(7)、time(7)、binary bytes/empty/NULL、bit。兩引擎另各測七欄1000列末批重複PK全部回滾與安全重試,NULL time/binary;測試PK僅注入批次錯誤,不代表搬移PK覆蓋。兩容器已清除,來源hash/image digest/清除紀錄已保存。
  • 真 PostgreSQL 16.15 / block_size8192、正式 Core 與 smoke:focused 1/1。8000-byte 隨機文字PK/普通index、合計超限複合PK、多位元UTF8鍵均預檢CanStart=false且Run=Refused,target public objects=0;2048-byte保守tuple邊界與8000-byte未索引文字真正Verified;重複邊界PK被引擎23505拒絕。確認後改成超限鍵會失效批准,未寫入;重新預覽後可執行。自有PG容器及tmpfs已清除。
  • 原本 SQLite↔PG bigint/bytea fixture仍為一表四列(另有已接受文字PK/index fixture);1005列fault suite僅SQLite。focused 1/1不冒充全provider56/56;新head全套由正常CI驗證。

未測/限制

  • SQL2016/2017/2025及全25方向仍非真機矩陣;SQL migration沒有PK/FK/index/identity、Windows UI、SQL auth+SSH真機覆蓋。
  • PG14/15/17、非標準page真機未跑;未知/其他page目前拒絕。2048是刻意保守白名單,不宣稱精確最大btree容量,不能靠壓縮放行。
  • MySQL/MariaDB及SQLServer跨引擎、非關聯式model未因此解禁;不承諾任意資料庫/版本無損轉換。沒有觸碰已驗收BLOB限長或SQLite取消实现。

合併前等待此精確head五個CI,正常review流程,不用admin或force;release繼續hold。

time 不再套用會轉成 DateTime 的 DbType,NULL 使用 SqlDbType.Time;binary 依欄位型別保留 NULL 與空值。資料參數上限改為 2098,替 RPC 保留額度,避免七欄批次撞上引擎限制。新增連結正式來源的 2019 與 2022 隔離雙向回歸,可保存來源雜湊與容器清理證據,不存取真實 profile。
8000-byte 文字主鍵原先會放行到 INSERT 才遇到 btree 上限。現在讀取實際 page 大小,逐列計算每個主鍵與普通索引的 UTF-8、複合欄位及對齊成本,以保守 tuple 預算拒絕超限;未知 page 不放行。新增 PG16 真引擎的單鍵、複合鍵、普通索引、多位元文字、邊界及未索引文字回歸,並確認來源鍵變更會失效原確認,拒絕時目標保持空白。
@NickYCLin
NickYCLin merged commit fa734e7 into master Oct 14, 2026
5 checks passed
@NickYCLin

Copy link
Copy Markdown
Collaborator Author

精確 head 5e5103a 五個 CI 全成功:Windows 38518496396(240 smoke tests、隔離安裝/更新/重啟驗收);cross-platform 38518496372(四平台33/33,Linux x64完整provider live 56/56,含本次PG16.15索引預檢案例)。正常merge已更新遠端master至fa734e7b540393a986201f4f78b1a6b771d77587,兩筆目的不同的提交均保留,tree與已通過head一致。真SQL2019↔2022證據是本機正式來源runner,不冒充Windows UI/SSH或全部版本矩陣。版更與正式發布仍hold。

@NickYCLin

Copy link
Copy Markdown
Collaborator Author

合併後主線 fa734e7 的 Windows 38519346974 與跨平台 38519347051(四平台)皆已成功。自動 Auto Release Gate 38519347010 明確回傳 ShouldRelease=false,版更與發布仍 hold;未加標籤、未手動 dispatch。gh run watch 曾遇 GitHub API 網路錯誤,最終結論以上述 run 的重新讀取狀態為準,不把 watch exit code 當建置失敗。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant