Skip to content

後續第二階段:邏輯搬移有界讀取、文字與主鍵索引 - #46

Merged
NickYCLin merged 3 commits into
masterfrom
feat/logical-text-keys-bounded-read
Oct 14, 2026
Merged

NickYCLin merged 3 commits into
masterfrom
feat/logical-text-keys-bounded-read

Conversation

@NickYCLin

@NickYCLin NickYCLin commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

這次修改

  • 修正先 GetValue 才拒絕大 BLOB:SQL byte length 與 CASE 限額投影,預算先檢查再讀有界內容。SQLite expression 不走 GetBytes metadata 原生路徑;PG 使用 SequentialAccess 分段讀取。
  • SQLite STRICT ↔ PostgreSQL 新增有效 UTF-8 TEXT BINARY/C、明確非自增單欄/複合 PK、普通升冪非 unique 索引。主鍵與索引列入預覽、確認 fingerprint 與正式 catalog 提交前驗證。
  • 不放寬其他語意:SQLite PK 須 WITHOUT ROWID 與明確 NOT NULL;nullable PG 索引須 NULLS FIRST。NUL/無效 UTF-8、FK、default、identity/sequence、expression/partial/unique/DESC/自訂 opclass/定序等拒絕。
  • 更新實際 UI 提示與方向矩陣。MySQL/MariaDB 的 DDL implicit commit/unsigned/charset/PAD SPACE、SQLServer 的定序/UTF16/精度/identity 等需要專用 codec/快照/恢復設計,跨引擎目前仍拒絕,不宣稱整體完成。

本機新程式碼驗證

  • dotnet build mySQLPunk.CrossPlatform.sln -c Release:0 errors;12 個既有 linked SQLServer nullable warnings。
  • 完整 smoke 33/33;新增真 SQLite 32 MiB BLOB 拒絕前 managed allocation <8 MiB、1 MiB 邊界、文字/Unicode/NULL/bytes、NUL/壞 UTF8/文字超限拒絕、單欄/複合 PK 實際約束、索引改順序使確認失效、缺索引及建索引後取消整批回滾。
  • 隔離 Xvfb 正式 Avalonia handlers 通過;新 fixture 含文字/PK/索引,預覽顯示 DDL 不含值,實際按確認後內容/索引/PK 均核對;busy SQL/edit/delete/connect 與取消 lease 保留既有回歸。
  • PG16 既有隔離 CI fixture 新增同一業務表 SQLite→PG→SQLite、C Unicode 排序及 PK 實際約束、catalog features 加入/移除拒絕測試,以及 32 MiB bytea 有界拒絕/1 MiB 邊界搬移:本輪精確 head CI 已通過,不借用 PR45 證據。

後續補正與證據

  • 最終 head:ccef849a51fa633cfffcadf11a6b11a40d3ff7f1。NULL/空欄位最少計入 8 bytes 快照預算,避免總量限制被大量空值繞過。
  • 首輪 f855298 的 Linux live CI 失敗:expression 索引 fixture 的 number+1 遇 Int64 最大值溢位,尚未走到 catalog 檢查;已改用 number%2,新 head 重新驗證。不把該失敗 run 或 PR45 舊 SHA 當本輪通過。
  • 本機最後 smoke build 0 errors/12 個既有 warnings、33/33 通過;正式 Avalonia/Xvfb 回歸有 24 行 PASS(含總結)。證據與來源 hash 位於 implementation-evidence/pr46-ccef849,不覆寫獨立驗收日誌。
  • 精確新 head CI 全部成功:Cross-platform Desktop 38514604603(Linux x64、ARM64、macOS Intel、Apple Silicon);Windows Desktop 38514604621。Linux x64 真實隔離 live suite 56/56,包含新增 SQLite↔PG16 文字/PK/索引與 PG 大欄位測試;一般 MySQL/MariaDB/SQLServer provider round-trip 不等於這些引擎已支援跨引擎邏輯搬移。
  • 已正常合併 master 9a7d84c60ecb4abe4d499c1e8a8c79fa3bdfdb17,三筆提交均包含在遠端主線;工作目錄乾淨,merge tree 與 PR head 一致。合併 SHA 的五項 CI 亦全部成功:Windows 38515397465、Cross-platform 38515397616;live suite 再次 56/56。Auto Release Gate 38515397418 明確 ShouldRelease=false,沒有發布。

限制與發布

真 SQLServer 跨版本/SQL auth+SSH、PG14/15/17、SQLite 歷史版本、MySQL/MariaDB 跨引擎未實測。只 synthetic/mock/隔離 fixture,不連使用者資料庫、不讀秘密、不部署。不版更、不 tag、不觸發 Release-Now,待使用者獨立驗收。這是 PR44/45 合併後的小範圍補正,不重做已驗收四項。

原本先 GetValue 再檢查大小,超大 BLOB 已配置完整陣列才拒絕。改成 SQL 長度與 CASE 限額投影,先檢查單欄及累計預算,才讀取有界內容;PostgreSQL 分段讀取,SQLite 避免 expression 欄位的 GetBytes metadata 原生錯誤。隔離 SQLite 證明 32 MiB 欄位不配置完整 managed 陣列且空目標不變,1 MiB 邊界可正常搬移。
第一階段只有整數與二進位且拒絕所有鍵索引,無法搬移帶文字的常見業務表。新增 SQLite BINARY 與 PostgreSQL C 的有效 UTF-8 文字映射、明確非自增主鍵與升冪普通索引,正式 catalog 檢查定序、opclass、NULL 排序及特殊索引;不支援的語意仍在寫入前拒絕。

主鍵與索引加入確認 fingerprint、DDL 預覽及提交前結構驗證,索引建立後取消與索引遭修改都整批回滾。隔離 SQLite 與正式 Avalonia handlers 已通過文字、PK、索引與有界讀取回歸,PG16 fixture 新增雙向業務表與 catalog 測試,由本次 CI 驗證。矩陣分開說明 MySQL/MariaDB 的 implicit DDL commit、SQLServer 的定序與型別轉換障礙,不宣稱全引擎完成,也不發版。
NULL 與空欄位也佔快照空間,至少計入八個位元組,避免大量空值繞過總量限制。加入 PostgreSQL 真實 fixture 的 32 MiB 拒絕與 1 MiB 邊界搬移,確認大欄位不會先完整傳回應用程式。

不支援的 expression 索引測試改用取餘數,避免 Int64 最大值在建立測試索引時先溢位,讓測試確實走到 catalog 預檢。
@NickYCLin
NickYCLin merged commit 9a7d84c into master Oct 14, 2026
5 checks passed
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