Skip to content

Latest commit

 

History

History
617 lines (520 loc) · 149 KB

File metadata and controls

617 lines (520 loc) · 149 KB

功能完成紀錄

這裡放的是各功能做完的細節紀錄,原本堆在 README 的「未完成功能與已知限制」,越長越大搬過來的。README 只留功能概況表跟現在還存在的限制;做完一個功能,細節寫在這裡,README 那邊把狀態改一下就好。

未完成功能與已知限制

  • Windows 更新流程

    • 下載只接受 Windows x64 可攜包或安裝檔;SHA-256 可來自 GitHub asset digest 或舊版 manifest,缺少有效校驗碼就停止。檔案先下載到獨立暫存檔,驗證通過才取代既有下載;取消、網路錯誤與校驗失敗都會清理暫存檔。
    • 靜默安裝明確指定目前程式目錄與使用者層級,支援空白、中文及單引號路徑。兩種更新腳本都等待目前程式結束,兩分鐘逾時後直接停止;安裝成功或失敗都嘗試重新啟動現有程式,並傳回安裝結果。
    • 同一主視窗的自動與手動更新共用執行中旗標,檢查、提示、下載及安裝確認未結束前不再啟動第二份工作;取消或失敗後可重新檢查。靜默安裝失敗只留下最小結果,依程式路徑區分,重新開啟對應程式時提示一次。
    • 可攜包解壓後先檢查主程式數量與位置;只接受根目錄或單一包裝目錄中的一份 mySQLPunk.exe。缺檔、多份主程式、混雜包裝目錄或損毀 ZIP 都在複製前停止。套用前只備份會覆寫的檔案,逐檔驗證後替換;遇到 I/O 錯誤會反向回復、核對原雜湊並移除本次新增的檔案及空目錄。若回復不完整,暫存目錄會保留備份與 journal.json,且不重啟程式。斷電或強制終止腳本後的自動復原尚未涵蓋。
    • 首次啟動若沒有本版 application-options.json,會從同產品目錄選取最近舊版的選項,檢查格式後以同目錄暫存檔搬入。theme.txt 與 language.txt 也會帶入舊版支援的主題及語言。來源保留、新版既有設定不覆寫;讀取失敗會阻止自動存檔用預設值蓋掉原資料。CLI 路徑等其他版本化檔案仍待搬移。
    • smoke tests 涵蓋實際 HTTP 下載取消、校驗碼缺漏/格式錯誤/不符、既有下載保留,以及產生的 PowerShell 腳本之逾時、路徑與失敗代碼。可攜版另以真實檔案鎖驗證更新中斷後的完整檔案雜湊與目錄回復,並檢查備份失敗及 junction 邊界。
    • Windows CI 另以 Test-WindowsUpdateInstall.ps1 在 GitHub 一次性 runner 下載並驗證公開 v1.0.0.21 安裝檔,安裝到含空白、中文與單引號的測試目錄,再由目前產生的更新腳本執行真正的安裝與重新啟動,核對版本、程式 SHA-256、測試資料保留及解除安裝結果。選項只在舊版目錄建立,驗收會確認新版自行帶入 bool/int/string 選項,且舊版關閉後的設定檔 SHA-256 保持不變。測試不替換 installer 或 Start-Process,JSON 與 log 會保留為 CI artifact;這是更新服務/安裝腳本的驗收,不包含點擊 UI 更新按鈕。腳本只接受 GitHub hosted Windows runner,不會在開發者電腦安裝程式。
  • Linux / macOS 跨平台預覽 🟡 第二階段進行中

    • PostgreSQL array no-equality concurrency:array 原值 predicate 不再直接呼叫 element type 的等號運算子,改為比對載入時 canonical text 的 UTF-8 bytes;這讓 json[]、xml[] 等沒有原生等號的元素陣列也能參與 optimistic concurrency。PostgreSQL 16 實機矩陣先固定舊版 42883 could not identify an equality operator for type json,再驗證保持 array 不變時可修改同列、外部改動 array 會阻擋 stale marker,重新整理後可儲存新陣列。Linux X11 另從真實 Table 編輯器完成上述三階段,並以 psql 直接核對 array 與 marker。
    • PostgreSQL json byte-exact concurrency:json 會保留原始空白與 key 順序,原值 predicate 不再轉成 jsonb 後做語意等號,而是將欄位與參數轉成 UTF-8 bytea 比對;jsonb 維持原生 canonical 結構等號。PostgreSQL 16 實機矩陣先證明外部把 {"a":1,"b":2} 改為 { "b": 2, "a": 1 } 時舊版會提交 stale marker,再確認修正版攔截衝突、保留原始 JSON bytes/marker,刷新後可無損修改。Linux X11 另從真實 Table 編輯器完成同一衝突與刷新後合法寫入,並以 psql 直接核對完整 JSON 文字。
    • PostgreSQL byte-exact concurrency/citext:所有 String 載入會明確轉成 text,補上 Npgsql 無法以 object 讀取 citext extension type 的缺口;原值 predicate 再用 convert_to(..., 'UTF8') 轉為 bytea 比對,避開 nondeterministic collation 的寬鬆等號。character(n) 仍使用去 padding 後的 canonical 文字。PostgreSQL 16 實機矩陣先重現 citext 載入的 InvalidCastException,再由 ICU collation 自證 Resume = résumé 且舊版允許 stale update,最後驗證修正版攔截衝突、保留外部 bytes/marker,刷新後可同時修改 citext、collated text 與 marker。Linux X11 另實際打開該 Table、重現衝突對話框、直接查庫確認未覆寫,刷新後由 UI 修改 citext 並核對 UTF-8 hex。
    • MySQL/MariaDB byte-exact concurrency:String 原值 predicate 會將欄位與參數轉為 binary 後逐 byte 比對;CHAR 先移除 server 本身無法 round-trip 的 U+0020 padding,保留合法短值編輯。MySQL 8 與 MariaDB 11.4 實機矩陣先在 utf8mb4_general_ci 重現 Alpha→alpha、resume→résumé 仍讓過期修改提交,再確認修正版回復交易、保留外部 bytes 與 marker,重新整理後可正常修改。Linux X11 亦從真實 MySQL Table 編輯器重現同一衝突,UI 顯示「資料已變更」且直接查庫證明 marker 未被覆寫,刷新後才允許合法儲存。
    • 架構:保留 mySQLPunk.sln 的 .NET Framework 4.7.2 WinForms 完整版,另以 mySQLPunk.CrossPlatform.sln 建立 .NET 8 Core、Avalonia Desktop 與獨立 smoke tests。跨平台 UI 不引用 System.Windows.Forms、Windows Credential Manager、Task Scheduler 或 SQLite.Interop.dll。
    • Provider:MySqlConnector、Npgsql、Microsoft.Data.SqlClient 與 Microsoft.Data.Sqlite 共用 provider-neutral session contract,涵蓋連線測試、database 清單、Table / View metadata、欄位型別/nullable/Primary Key/generated/DEFAULT 辨識、識別字引用、前 200 列預覽,以及 DDL / DML / SELECT 執行。SQL Server 使用 TOP 與方括號識別字,其餘 provider 使用各自的 LIMIT 與引用規則;結果以欄位與列模型回傳,UI 不依賴 provider-specific DataTable。
    • UI:連線設定新增/編輯/刪除、SQLite 檔案選擇、資料庫切換、Table / View 物件樹、選取範圍/游標 statement/整份文件的明確執行入口、取消操作、動態結果網格與狀態/錯誤顯示。Ctrl/Cmd+Enter 預設只執行選取範圍或游標 statement,Ctrl/Cmd+Shift+Enter 才執行整份;statement lexer 依 provider 略過字串、quoted identifier、註解及 PostgreSQL dollar quote/E'' 內分號,MySQL 反斜線跳脫若受 NO_BACKSLASH_ESCAPES 影響而有兩種邊界則 fail closed、要求明確反白。雙擊 Table 會開啟每頁 200 列的資料編輯器,依複合 Primary Key ordinal 穩定排序並提供上一頁/下一頁、頁碼與列範圍;雙擊 View 則產生預覽 SQL。編輯器依 metadata 顯示 PK、generated、nullable 與型別,支援 Value/NULL/DEFAULT 新增、修改、刪除與重新整理;無 Primary Key 時為避免 offset 定位漂移,只顯示第一頁。
    • 安全:跨平台連線設定寫入使用者 application-data 下的 mySQLPunk/connections.json;Linux 在全新環境尚未建立 ApplicationData 時會遵循絕對的 XDG_CONFIG_HOME 或 ~/.config,macOS 則回到 ~/Library/Application Support,不再嘗試寫入程式安裝目錄。Password 明確排除序列化,只有非祕密的 UseSecretStore opt-in 旗標會保存,非 Windows 檔案權限會嘗試限制為 0600。Linux 透過 secret-tool 的 stdin 接 Secret Service,macOS 透過 security -i 的 stdin 接 Keychain,祕密不出現在 process arguments;寫入後會讀回比對,工具缺失、服務鎖定或驗證失敗時不建立檔案 fallback,只保留於本次程式記憶體。刪除連線或取消保存會同步清除 Keyring 項目。
    • 連線 URI 與 TLS 模式:連線設定頁可貼上 mysql:///mariadb://、postgres:///postgresql://、mssql:///sqlserver:// 或 sqlite:/// URI 並「安全套用」到表單,自動填入 provider、主機、port、認證、資料庫、逾時與 TLS 模式,不自動連線或儲存;輸入框遮蔽顯示且成功後即清除。TLS 改為 provider 原生模式下拉(MySQL Disabled/Preferred/Required/VerifyCA/VerifyFull、PostgreSQL 另含 Allow、SQL Server Optional/Mandatory/Strict),未指定時保留驅動程式預設而非降級;connections.json 以 tlsMode 保存,舊 useSsl 依 provider 遷移為等價模式,同時含兩者、含 password、重複欄位、非法模式或空白/重複 id 一律 fail closed。URI 解析拒絕未知/重複參數、fragment、多層或 dot-segment 資料庫路徑、未編碼空白、非法 percent/UTF-8、Unicode 控制/格式/noncharacter、過長內容與 provider 不相容的 TLS 值,錯誤訊息不回顯密碼;smoke test 覆蓋四種 provider 的成功案例、IPv6、前後空白密碼、SQLite 尾端空白路徑、legacy 遷移與三十餘個 fail-closed 案例。操作方式見 CONNECTION_SECURITY.md。
    • TLS 憑證檔案:連線設定頁可指定 CA 憑證(SQL Server 為伺服器憑證)、客戶端憑證與私鑰的絕對路徑,或由 URI 的 sslca/sslrootcert/sslcert/sslkey/servercertificate 帶入,對應 MySqlConnector、Npgsql 與 SqlClient 原生選項。CA 憑證只接受 VerifyCA/VerifyFull(SQL Server 為 Mandatory/Strict),客戶端憑證與私鑰須成對且模式至少 Required,SQL Server/SQLite 不接受客戶端憑證;路徑須為絕對路徑且不含控制字元,儲存、測試與連線前確認檔案存在、非目錄且私鑰不可被其他使用者讀取。connections.json 只保存路徑;smoke test 覆蓋三種 provider 的連線字串映射、十餘個不相容組合、缺檔/目錄/權限過寬、設定檔 round-trip 與 URI 參數。規則見 CONNECTION_SECURITY.md。
    • 執行計畫:查詢工具列「執行計畫」依游標 statement 或反白範圍取得 MySQL/MariaDB JSON、PostgreSQL JSON(ANALYZE FALSE)、SQL Server SHOWPLAN_ALL(同連線開關,失敗必關)與 SQLite EXPLAIN QUERY PLAN 的唯讀計畫;獨立視窗顯示樹狀節點與相對成本標示、節點屬性、文字計畫與原始資料。只接受單一 SELECT/WITH/DML,拒絕 DDL 與多 statement,解釋 INSERT/DELETE 不會修改資料;smoke test 與 Docker 實機矩陣驗證四種 provider 的解析、列數不變與 SHOWPLAN 清理。
    • 資料產生器:物件面板「資料產生器…」可勾選多張資料表並設定筆數,逐欄選擇規則(自動、資料庫預設、NULL、固定值、序列、範圍、清單、樣式與 NULL 比例),可指定 seed 重現。自動規則依型別、欄位名稱(email、姓名、電話、城市、金額、生日等)、長度與 ENUM/SET 成員產生;外鍵欄位挑選現有或同批產生的父列(含自我參照與複合外鍵),主鍵與唯一索引不與既有或同批資料重複,被參照的自動編號主鍵改寫明確值並推進序列。每個值寫入前都經資料編輯器的型別驗證,預覽只在記憶體產生,寫入在單一交易中完成、任何一列失敗就整批回滾。smoke test 與 Docker 實機矩陣在 SQLite、MySQL 8、MariaDB 11.4、PostgreSQL 16、SQL Server 2022 驗證外鍵完整性、唯一性、規則、seed 重現、並行衝突回滾與寫入後預設新增不撞主鍵。
    • 資料比較與同步:結構比較視窗的「比較資料…」以 Primary Key 逐列比對同名資料表(每表上限 50,000 列),可預覽 SQL 並在目標以單一交易同步;依外鍵相依排序、每列以比對當下的目標原值為條件(比對後被修改則整批回滾),刪除預設不勾且需輸入資料庫名稱,identity 主鍵保留來源值並重設 PostgreSQL 序列,寫入沿用資料編輯器的型別轉換。五種資料庫的實機往返與並行回滾皆驗證。
    • 同步 SQL 預覽:同類型資料庫的比較結果可產生讓目標跟上來源的指令碼(建表、加改欄位、索引、外鍵、檢視表),刪除類變更一律註解、無法安全表達的列為手動項目;可複製或另存 .sql,也可在「在目標執行」分頁勾選後於目標連線執行(刪除類預設不勾且需輸入資料庫名稱確認;PostgreSQL/SQL Server/SQLite 單一交易、失敗全部回滾,MySQL/MariaDB 遇錯即停並標示已生效語句),不送進編輯器、完成後自動重比。smoke test 與 Docker 實機矩陣在五種資料庫上驗證產生→套用→重比後只剩被註解的差異,並驗證惡意名稱無法逃出註解。
    • 結構比較:物件面板「結構比較…」比對目前資料庫與任一已儲存連線的資料庫(可跨 provider),列出物件、欄位、索引、外鍵的只在來源/只在目標/內容不同,可篩選並匯出 HTML;主鍵依角色、外鍵依欄位清單比對,型別大小寫與 SQL Server 預設值括號正規化,無法讀取的物件只列警告。只讀 metadata、不產生同步 SQL;smoke test 覆蓋 SQLite 雙庫差異、跨 provider 名稱對應與正規化、無法讀取物件。
    • 資料字典:物件面板「資料字典…」把目前資料庫所有資料表/檢視表匯出成單一 HTML(欄位、索引、外鍵、註解、建立語法或檢視表定義),四種 provider 只讀目錄 metadata;無權限的物件在文件內註明,所有文字 HTML 逃逸並附 CSP,錨點雜湊、64 MiB 上限、暫存檔原子替換。smoke test 與 Docker 實機矩陣覆蓋四種 provider 的結構欄位。
    • SSH Tunnel:連線設定可勾選透過 SSH Tunnel 連線,填入 SSH 主機/port/使用者、密碼或 OpenSSH/PEM 私鑰(含密語)與必填的主機金鑰 SHA256 指紋;以 SSH.NET 建立只綁定 127.0.0.1 動態 port 的本機轉送,MySQL/MariaDB、PostgreSQL、SQL Server 的每個 session 共用一條 SSH 連線,中斷連線或關閉程式即釋放,跳板機斷線後下一次操作會自動重建。主機金鑰完全比對、不符即中止並回報實際指紋;MD5 指紋、缺主機/使用者/指紋、非絕對路徑或權限過寬的私鑰、MySQL/PostgreSQL 的 VerifyFull 一律 fail closed,SQL Server 改以原始主機名稱驗證憑證。SSH 密碼與密語不寫入設定檔,勾選系統密碼庫時以獨立項目存入 Secret Service/Keychain,否則只保留到本次程式關閉;smoke test 用本機臨時 sshd 實機驗證金鑰登入、加密私鑰、錯誤密語、指紋不符、權限過寬與 provider session 整合。
    • 結果排序、複製與匯出:動態欄位使用原始 provider 值的型別感知 comparer;NULL 遞增時置前、跨 CLR 數字先正規比較、日期與文字保留各自語意、binary 使用 byte lexicographic 順序,無法直接比較的異質值仍有不拋例外的穩定 fallback,相同值保留查詢回傳順序。顯示用 (NULL) 與資料中的同名 literal 維持不同值。結果網格可延伸選取多列,以按鈕或 Ctrl/Cmd+C 依目前可視順序複製含欄名 TSV;流程使用原始結果值而非畫面 (NULL),區分 NULL/空字串、保留 invariant 日期/數字/binary,沿用公式注入中和並限制為 4 MiB,只寫系統剪貼簿。完整結果仍可明確選擇 CSV、TSV 或 JSON,再由 Linux / macOS 原生儲存對話框選擇檔案;三種格式都會依目前結果網格的排序輸出完整載入列。CSV / TSV 採 UTF-8 BOM 與 CRLF,正確處理分隔符、引號、換行、空字串、NULL、日期、數字與 binary hex;JSON 不帶 BOM,保留 JSON 可表達的型別並為重複欄名建立穩定唯一名稱。輸出先寫同目錄暫存檔,成功後才替換目標;截斷結果會在匯出前提示只包含目前載入的前 10,000 列。
    • 安全資料編輯:新增、修改與刪除只接受 schema metadata 中存在且可編輯的欄位,所有值使用 provider 參數,不把輸入拼入 SQL。修改/刪除要求 Primary Key,WHERE 同時比對 PK 與載入時的可編輯原始值;影響 0 列視為外部變更衝突,超過 1 列也會回復交易,避免靜默覆蓋或批次誤改。MySQL/MariaDB BLOB、PostgreSQL bytea、SQL Server binary/varbinary/image 與 SQLite BLOB 接受 0x 加偶數個 hex 字元並以原生 binary 參數寫入,上限 1 MiB;MySQL/MariaDB BIT(1–64) 接受非負十進位整數,會依欄位寬度拒絕溢位並以 MySqlDbType.Bit 寫入;ENUM/SET 會保留 COLUMN_TYPE 宣告並使用 MySqlDbType.Enum/Set,SET 由 server 依宣告順序正規化,strict mode 拒絕未宣告值時回復交易;TIME 使用專用值型別,不受 TimeSpan.Parse 的 24 小時格式限制,可依 TIME(0–6) 精度解析正負 HHH:mm:ss.ffffff,上限為 ±838:59:59 且以 MySqlDbType.Time 寫入,載入則 cast text 保留 MySQL 原生顯示。PostgreSQL bit(n)/bit varying(n) 使用純 0/1 字串,metadata 保留欄位長度並驗證精確/最大 bit 數,再轉成 Npgsql BitArray 參數;載入時明確 cast text 以保留前導零。PostgreSQL time with time zone 使用 HH:mm:ss.ffffff±HH:mm,要求明確 offset 並以 Npgsql TimeTz 寫入;載入時 cast text,原值 predicate 再嚴格轉回 DateTimeOffset。PostgreSQL interval 使用 months=<整數>;days=<整數>;microseconds=<整數> 保留原生三分量並以 NpgsqlInterval 寫入;載入與原值 predicate 也按三分量正規化,不用 TimeSpan 近似月數,且不會把 1 month 與 30 days 視為同一原值;metadata 另保留 interval(p) 與 YEAR、YEAR TO MONTH、DAY TO HOUR、DAY TO SECOND(p) 等宣告,寫入前拒絕會被 server 丟棄或取整的較小分量。PostgreSQL pg_lsn 要求 XXXXXXXX/XXXXXXXX 格式,斜線兩側各限制為 32-bit 十六進位值並正規化為大寫,再以 NpgsqlLogSequenceNumber/PgLsn 原生參數寫入。PostgreSQL oid/xid/cid 使用 UInt32,xid8 使用 UInt64,並繞過 Npgsql 不支援的通用 DbType.UInt64、直接指定各自原生型別,避免高位值被有號整數截斷。PostgreSQL tsvector/tsquery 禁止 NUL 且限制 1 MiB;因 Npgsql 8 client parser 已標示為不可靠且 obsolete,寫入與 optimistic 原值會以 Unknown 參數讓 PostgreSQL 在型別上下文中權威解析,仍維持 SQL 與值分離,server 拒絕畸形內容時整筆交易回復。MySQL/MariaDB JSON、PostgreSQL json/jsonb 與 SQLite JSON 會先經嚴格 JSON parser 驗證,再以 provider 專用參數寫入,並針對 MySQL 儲存正規化與 PostgreSQL json 無原生等號的差異使用正確原值 predicate。PostgreSQL xml、SQL Server xml 與 SQLite XML 會禁止 DTD/外部實體並限制文件深度,原生 provider 另使用 XML 參數與可比較的序列化原值 predicate。PostgreSQL inet/cidr/macaddr/macaddr8 會驗證 address family、prefix、CIDR host bits、zone identifier 與 MAC byte 長度,再轉成 Npgsql 原生型別;載入時由 PostgreSQL 轉成文字以保留 inet prefix。SQL Server text/ntext/image 使用對應的 SqlDbType,optimistic predicate 則轉成 varchar(max)/nvarchar(max)/varbinary(max) 後逐 byte 比對,避開 legacy LOB 不可直接使用等號的限制。超過 1 MiB 的既有 binary/JSON/XML/bit string/全文檢索值只顯示摘要,且不放入非 PK optimistic predicate。無 Primary Key 的 Table 只允許新增與瀏覽,generated 及尚未支援的進階型別維持唯讀。
    • MySQL/MariaDB ENUM:解析 COLUMN_TYPE 的完整宣告成員,在建立 provider 參數前以 ordinal 精確比對,拒絕 collation、尾端空白與數字索引會無 warning 改成另一成員的輸入。metadata parser 保留逗號、引號、反斜線、空字串與數字字串;MySQL 8/MariaDB 11.4 實機矩陣先重現四種原生靜默正規化,再驗證全部特殊成員 round-trip 與錯誤輸入不落資料。Linux X11 另確認 DRAFT 留在編輯視窗且資料庫原值不變,精確的 published 則可保存並刷新表格。
    • MySQL/MariaDB SET:沿用宣告成員 metadata parser,將輸入拆成逗號分隔成員後逐一做 ordinal 精確比對,拒絕 collation、尾端空白與數字 bitmap 會無 warning 改變所選集合的輸入。合法任意順序與重複成員依 SET 無序集合語意輸出為宣告順序;含空字串或逗號、無法以文字無歧義 round-trip 的歷史 schema 保持唯讀。MySQL 8/MariaDB 11.4 實機矩陣涵蓋特殊成員、空集合、單一與多成員 bitmap、canonicalization 與錯誤輸入不落資料;Linux X11 另確認 ALPHA 被 UI 拒絕且原值不變,Beta,alpha 保存後刷新為 alpha,Beta 並直接查庫一致。
    • PostgreSQL 文字序列化型別:jsonpath、pg_snapshot/txid_snapshot、hstore、ltree/lquery/ltxtquery、11 種 reg* 物件參照,以及任意 enum/composite/extension UDT 改以最多 1 MiB 的純文字編輯;參數保持 Unknown,讓欄位型別上下文交由 PostgreSQL 權威 parser 驗證。載入一律轉 canonical text;沒有原生等號的型別以載入時文字做 optimistic predicate,仍可偵測其他連線改動。PostgreSQL 16 實機矩陣涵蓋 22 個代表型別的 metadata、新增、修改、畸形 jsonpath/composite rollback、衝突與刪除,其中自訂型別直接覆蓋 enum、named composite、cube extension 與 enum domain;Linux X11 另從 UI 修改 jsonpath/ltree,以及 enum/named composite/cube UDT 後直接查庫核對。
    • PostgreSQL domain:metadata 分開保存 schema-qualified domain 與 base storage type,例如 "public"."short_label" (character varying(30));integer、varchar、numeric、enum/UDT、CIDR 等 domain 沿用 base type 的解析、參數與 optimistic predicate,並保留 domain constraint 權威驗證。PostgreSQL 16 實機矩陣涵蓋五種 base type 的 metadata、CRUD、constraint rollback、衝突與刪除;Linux X11 另從 UI 修改全部五種 domain 後直接查庫核對。
    • PostgreSQL scalar temporal:timestamp(p) without time zone、timestamp(p) with time zone、time(p) without time zone 與既有 time(p) with time zone 會依 format_type metadata 保留 0–6 位小數秒精度並使用對應的 Npgsql 原生參數。無時區 timestamp 禁止 offset;timestamptz 必須包含明確 offset 或 Z,載入固定正規化為 UTC Z,不受 session timezone 影響;time 保留 PostgreSQL 合法的 24:00:00 上界。超過欄位 p 的值會在送出前拒絕,避免 server 取整。PostgreSQL 16 實機矩陣涵蓋 metadata、0001/9999 年、毫秒/微秒、offset 轉 UTC、24:00、錯誤輸入不落資料、CRUD 與 optimistic conflict;Linux X11 另驗證 timestamp(3) 第 4 位小數被 UI 拒絕,再修改四欄並以 psql 逐欄查回。
    • PostgreSQL/SQLite 純日期:SQLite date 只接受 yyyy-MM-dd;PostgreSQL date 使用獨立文字 canonical 型別,接受 YYYY-MM-DD、YYYY-MM-DD BC 與 ±infinity,載入以 EXTRACT 組回不受 DateStyle 或 timestamp 上限影響的 4713 BC–5874897 AD 完整範圍。參數維持 Unknown 交給 date 欄位上下文解析,避開 Npgsql 把 .NET DateTime.MinValue/0001-01-01 自動送成 -infinity;完整 timestamp 會在送出前拒絕。PostgreSQL 16 實機矩陣涵蓋 BC/AD 上下界、0001/9999 年、正負 infinity、NULL、CRUD、optimistic predicate 與錯誤輸入不落資料;Linux X11 另確認 grid/編輯器顯示純日期、timestamp 被 UI 拒絕,以及從 0001-01-01 修改後直接查庫一致。
    • SQLite NUMERIC affinity:SQLite 不強制 DECIMAL(p,s) 的 precision/scale,Microsoft.Data.Sqlite 的 decimal TEXT 參數仍會被 NUMERIC affinity 轉成 INTEGER 或 REAL。編輯器因此將可落在 signed 64-bit 的整數維持完整範圍,其餘數值最多接受 15 位有效數字,並拒絕會在 binary64 轉換中無聲失真的輸入;載入一律顯示 SQLite 實際儲存值的 canonical text,固定小數與科學記號可按數值等價完成 optimistic concurrency 比對。SQLite round-trip 測試涵蓋 REAL/INTEGER storage class、Int64 上界、安全科學記號、失真輸入不落資料及外部修改衝突。
    • SQLite temporal:DATE、TIME、DATETIME、TIMESTAMP 與 DATETIMEOFFSET 不再先轉成 .NET DateTime/DateTimeOffset;編輯器分別要求純 yyyy-MM-dd、HH:mm:ss[.fffffff]、不含 offset 的 yyyy-MM-dd[ T]HH:mm:ss[.fffffff],或必須包含 ±HH:mm 的 offset 日期時間,再以 TEXT 參數原樣保存。這避免 Date 被補午夜、Time 被注入當天日期、offset 被轉成本機時間後丟失,以及超過 7 位小數秒;offset 的原始文字也不會被正規化到 UTC。舊有非 canonical/INTEGER/REAL 值只要未修改就以原始顯示判定相同,不會在修改其他欄位時被連帶重寫。SQLite 端到端測試涵蓋五種 metadata、TEXT storage class、7 位小數秒、正負 offset、錯誤輸入不落資料與 optimistic conflict;Linux X11 另先重現 TIME 注入日期、DATE 補午夜與合法 DATETIMEOFFSET 被錯誤拒絕,再確認修正版拒絕缺 offset 值,合法純日期/時間/日期時間/offset 日期時間保存後以原生 client 核對文字與 hex。
    • SQLite UUID/GUID:自訂宣告不再落到 NUMERIC affinity 編輯器;兩種 metadata 都映射到 SQLite 專用 GUID 文字型別,只接受含連字號的 8-4-4-4-12 D 格式,再以 TEXT 參數原樣保存大小寫,避免 Microsoft.Data.Sqlite 的 Guid 參數自動轉成大寫。既有大括號等非標準文字與 16-byte BLOB 未修改時仍以原始 storage class 做 optimistic predicate。SQLite 端到端測試涵蓋 metadata、大小寫、TEXT/BLOB storage class、錯誤輸入不落資料、legacy 原值及外部修改衝突;Linux X11 另先重現標準 UUID 被誤判為數字,再確認無連字號值由 UI 拒絕,合法大小寫分別保存後以 sqlite3 核對文字與 hex。
    • SQLite byte-exact concurrency:String、JSON、XML、temporal 與 GUID 的原值 predicate 會將欄位與參數都 CAST(... AS BLOB) 後比較,避開 NOCASE、RTRIM 或應用程式自訂 collation 把不同 bytes 判成相等。SQLite 端到端測試先以 Alpha→alpha 和 tail →tail 重現 stale update 可提交,再確認修正版回復交易、保留外部值與 marker,重新整理後仍可合法修改;Linux X11 另在編輯 modal 開啟期間由第二連線改變大小寫,確認儲存顯示衝突且不覆寫其它欄位。
    • IEEE 754 浮點:依 provider metadata 分開映射 4-byte single 與 8-byte double;SQL Server float(n) 保留 n 並以 24 為界,MySQL/MariaDB FLOAT(p) 也依 24 為界,FLOAT(M,D) 另驗證小數位、整數位與 UNSIGNED。輸入先正規化十進位/科學記號,再要求與目標 single/double 的 R canonical 文字數值相同,拒絕會改變數字、溢位、subnormal、下溢為 zero、NaN 與 Infinity;參數固定使用各 provider 的 Real/Float/Double 原生型別。MySQL/MariaDB FLOAT 查詢會先 CAST 為 DOUBLE 取回完整 binary32 值,避免 text protocol 預設只輸出約 6 位有效數字;原值 predicate 使用同一路徑,仍能偵測外部修改。SQLite、MySQL 8、MariaDB 11.4、PostgreSQL 16 與 SQL Server 2022 測試涵蓋 metadata、single/double/precision 宣告、CRUD、降精度輸入不落資料、optimistic conflict 與刪除;Linux X11 另從實際 Table 編輯器確認 canonical REAL 顯示、UI 拒絕超精度輸入,合法修改後再由 sqlite3 直接查回一致。
    • Provider-aware integer range:欄位 metadata 保存實際 base integer 的 minimum/maximum;MySQL/MariaDB 涵蓋 signed/unsigned/ZEROFILL 的 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,PostgreSQL 涵蓋 smallint/integer/bigint,SQL Server 另將 tinyint 視為 0–255。輸入在建立 provider 參數前先依邊界拒絕,PostgreSQL domain 與 SQL Server alias type 也沿用 base storage type,不再只依共用 long/ulong 上限。實機矩陣會把 MySQL/MariaDB 切到 non-strict session,確認越界值不會被 server 靜默截到最近邊界,並涵蓋所有正負上下界、BIGINT UNSIGNED 全範圍、CRUD、optimistic conflict 與刪除;Linux X11 另驗證 non-strict MySQL UI 拒絕 TINYINT=128 且資料庫原值不變,再保存合法下界 -128 並直接查庫一致。
    • PostgreSQL money:metadata 以資料庫當前 lc_monetary 實際推導固定小數位,不依賴 information_schema 會回傳 NULL 的 numeric scale。編輯器只接受 locale-independent 十進位文字,先依小數位與底層 signed 64-bit 儲存範圍拒絕會被 server 取整或溢位的值;載入透過 lossless money → numeric → text 顯示 canonical 金額,寫入使用 Unknown 文字參數明確 CAST 回 money,避免幣別符號與千分位受到 Linux/macOS locale 影響。PostgreSQL 16 實機矩陣涵蓋 metadata、正負範圍邊界、CRUD、多餘小數/溢位/locale 格式拒絕、optimistic conflict 與刪除;Linux X11 另確認 grid 不顯示 locale 幣別/千分位、UI 拒絕第 3 位小數,合法修改後再由 psql 直接查回一致。
    • Spatial 型別:MySQL/MariaDB 的 8 種 OGC spatial 與 SQL Server geometry/geography 使用共同的 SRID=<非負整數>;<WKT> 編輯格式;provider 載入 canonical WKT、顯式重建原生物件,optimistic predicate 同時比對 SRID 與 WKT。MariaDB 對畸形 WKT 只回 warning/NULL 的差異已 fail-closed 包裝為錯誤,nullable 欄位不會被靜默清空。MySQL 8、MariaDB 11.4、SQL Server 2022 實機矩陣涵蓋 NULL、metadata、全部型別 CRUD、SRID 保存、畸形 WKT rollback、衝突與刪除;Linux X11 另從 MariaDB UI 修改 geometry/point 後直接查庫核對。
    • MariaDB 原生 UUID/INET4/INET6:metadata 分別映射為 Guid 與 NetworkAddress 編輯器,載入會明確 cast text,UUID 正規化為小寫 D 格式,INET4 僅接受 IPv4 並以 4-byte binary 保存,INET6 接受 IPv4/IPv6 並將 IPv4 保存為 mapped IPv6。寫入與原值 predicate 使用文字參數及 CAST(... AS UUID/INET4/INET6);錯誤 UUID、把 IPv6/CIDR prefix 寫入 INET4、以及 INET6 prefix/zone identifier 都會在送出前 fail closed。MariaDB 11.4 實機矩陣涵蓋 metadata、底層 HEX、IPv4/IPv6 canonical 化、CRUD、錯誤輸入不落資料與 optimistic conflict;CI 會與 MySQL 8、PostgreSQL 16、SQL Server 2022 同時啟動驗證。Linux X11 另從實際 Table 編輯器修改三種原生型別,畫面重新載入 canonical 值後再直接查庫與底層 HEX 核對。
    • MySQL/MariaDB DATE/DATETIME/TIMESTAMP:metadata 會保留 DATETIME(p)/TIMESTAMP(p) 的 0–6 位小數秒精度,載入以固定長度 canonical ISO 文字顯示,寫入則使用 Date/DateTime/Timestamp 原生參數。DATE/DATETIME 會先檢查 1000–9999 年範圍;三者都拒絕寬鬆日期格式、offset 與超過欄位 fsp 的小數秒,避免 server 預設在沒有 warning 的情況下四捨五入。MySQL 8 與 MariaDB 11.4 實機矩陣涵蓋四個代表欄位、metadata、1000/9999 年、毫秒/微秒、錯誤輸入不落資料、CRUD 與 optimistic conflict;Linux X11 另驗證 DATETIME(3) 第 4 位小數會在 UI 被拒絕,再從 Table 編輯器修改 DATE、兩種 DATETIME 與 TIMESTAMP,重新載入後用原生 client 逐欄查回核對。
    • SQL Server hierarchyid:以最多 1 MiB 的 canonical path 文字編輯,參數固定使用 nvarchar(max) 並由 hierarchyid::Parse() 權威驗證;載入透過 ToString() 顯示 /1/2.5/ 形式,原值 predicate 使用原生 hierarchyid 等號。SQL Server 2022 實機矩陣涵蓋 NULL、metadata、新增、修改、畸形 path rollback、衝突與刪除;Linux X11 另從 UI 修改 path 後用 sqlcmd 直接查庫核對。
    • SQL Server sql_variant:以 type:value 編輯並顯式保存內層 base type;支援整數、bit、decimal/numeric precision/scale、money、有限浮點數、date/datetime/smalldatetime/datetime2/datetimeoffset/time、GUID、定長/變長 ANSI/Unicode 字串與 binary。字串 canonical tag 另帶 collation name、LCID 與 comparison style,載入與 optimistic predicate 會比對完整型別 metadata 和內容;寫入依 tag 建立強型別參數,numeric 與 datetimeoffset 再由 SQL Server 明確 CAST,避免 synonym 或時區 offset 被驅動程式改變。時間與金額會在本機先拒絕需要取整的值,binary、字串長度及 decimal 範圍也 fail closed。SQL Server 2022 實機矩陣涵蓋 decimal/numeric、int、nvarchar/varchar custom collation、datetime2/datetimeoffset/time、varbinary 的 metadata、CRUD、越界 rollback、custom-collation 原值鎖定、衝突與刪除,並以 SQL_VARIANT_PROPERTY 直接核對修改後的 base type、precision、scale 與 max length。
    • SQL Server 一般字串:char/varchar/text、nchar/nvarchar/ntext 與字串 alias type 的 metadata 會保留 base storage type、最大 bytes 與欄位 collation。所有輸入先用 nvarchar(max) 參數無損送達,再由 SQL expression 套用目標 collation;ANSI/UTF-8 型別會驗證 DATALENGTH 並轉回 Unicode 做 binary round-trip,Unicode 型別則依 UTF-16 bytes 驗證容量,任何 code-page 替換或截斷都在單列交易內 fail closed。原值 predicate 也以 collation-aware 轉換後的 bytes 比對,補上 SQL Server 一般字串等號忽略尾端空白的競爭衝突缺口。SQL Server 2022 實機矩陣先證明 legacy varchar 原生寫入會把 漢字 靜默存成 ??,再覆蓋 ANSI、UTF-8、Unicode、alias、legacy text 的拒絕、不落資料、合法 byte 邊界 CRUD、尾端空白衝突與刪除。
    • SQL Server scalar money:一般 money/smallmoney 欄位使用獨立的 fixed-scale 編輯器與原生 SqlDbType.Money/SmallMoney 參數,不再走無範圍限制的通用 decimal。載入正規化為 4 位小數文字;寫入前依各自正負邊界拒絕溢位,並拒絕會被 SQL Server 四捨五入的第 5 位小數,以及幣別符號、千分位與科學記號。SQL Server 2022 實機矩陣涵蓋兩種型別的 metadata、正負邊界、CRUD、錯誤值不落資料、optimistic conflict 與刪除;Linux X11 另確認 grid 固定 4 位小數、UI 拒絕需取整的第 5 位,合法修改 money/smallmoney 後再由 sqlcmd 直接查回一致。
    • SQL Server scalar temporal:date、datetime、smalldatetime、datetime2(p)、datetimeoffset(p) 與 time(p) 使用各自精確的 SqlDbType;帶小數秒的型別會依 metadata 設定原生 Scale,不再讓一般 DateTime 參數退回舊式 datetime。本機解析會拒絕 datetime 1753 年以前/無法精確保存的 1/300 秒值、smalldatetime 的秒數與範圍,以及超出欄位 Scale 的時間,避免 server 無聲取整。SQL Server 2022 實機矩陣涵蓋全部六類、datetime2(3)/datetime2(7) 雙精度、metadata、0001 年、100ns、正負 offset、邊界修改、錯誤輸入不落資料、衝突與刪除;Linux X11 另從 UI 先驗證 datetime2(3) 多一位小數會被拒絕,再修改七個時間欄位並用 sqlcmd 逐欄查回核對。
    • SQL Server alias type:metadata 分開保存 declared type 與 base storage type;sysname 會顯示為 sysname (nvarchar(128)),CREATE TYPE dbo.precise_amount FROM decimal(18,6) 則顯示為 [dbo].[precise_amount] (decimal(18,6))。字串、整數與 exact decimal alias 沿用 base type 的參數、precision/scale 與 optimistic predicate,同時保留 alias 名稱;SQL Server 2022 實機矩陣涵蓋 metadata、CRUD、int alias 溢位 rollback、衝突與刪除,Linux X11 另修改 nvarchar/int/decimal alias 與 sysname 後直接查庫核對。
    • 更新檢查與下載:主視窗從最新公開 GitHub Release 依實際 OSArchitecture 選擇四個允許 RID 之一,只有目標安裝包與同名 .sha256 都存在才開放下載;release 頁與資產 URL 都必須是 github.com/shadowjohn/mySQLPunk 下的 HTTPS,非預期版本、RID、scheme 或 host 會 fail closed。Sidecar 限制 4 KiB、單筆 strict UTF-8 SHA-256 與精確檔名,安裝包限制 512 MiB 並串流寫入/計算雜湊;同目錄暫存通過後才原子替換,任何錯誤或取消都保留既有檔案。Linux 與 macOS UI 都會在關閉前以 CreateNew 原子保留 updater lock,多視窗同時套用會 fail closed,已不存在 PID 的 stale lock 才會回收;獨立 updater 取得 token 後等待目前 PID 結束,再以私有副本重驗 SHA-256、archive 路徑、entry 類型、數量與展開大小。Linux 最後執行交易式 installer,macOS 則在目標 bundle 同檔案系統核對 plist 版本、RID、Mach-O 架構與 codesign 後原子換包。新版啟動五秒內退出會回復舊版並重啟,失敗結果與 log 位置會在 UI 顯示;Developer ID/notarization 仍為需要發行憑證的獨立工作。
    • 驗證與發佈:Core smoke tests 覆蓋密碼不落地、三種結果格式、Unicode、escaping、公式注入、JSON 型別、重複欄名、失敗不覆寫、兩種系統工具的 store/get/delete 與 arguments 安全契約、SQLite DDL / DML / UTF-8 SELECT、metadata、Table Value/NULL/DEFAULT/binary/JSON/XML CRUD、無 PK 限制、參數格式、大小限制、畸形 JSON、XML 多根節點、DTD/XXE 與深度限制,以及 MySQL BIT width/UInt64 邊界、ENUM/SET 原生參數/宣告順序/strict 拒絕、TIME 正負/超過 24 小時/宣告微秒精度/±838:59:59 邊界,PostgreSQL bit string 固定/可變長度、timetz 微秒/正負 offset、interval 三分量/正負值/欄位限制/小數秒精度、pg_lsn 32-bit 分量/64-bit 最大值、oid/xid/cid UInt32 與 xid8 UInt64 邊界、tsvector 位置/權重、tsquery prefix/NOT/phrase-distance、server 拒絕畸形全文查詢且不落資料、IPv4/IPv6/CIDR/MAC 正規化與錯誤輸入、SQL Server hierarchyid canonical path/大小/NUL/server rollback、sql_variant tag/型別 metadata/日期金額精度/custom collation 原值比對,以及 scalar temporal 範圍/Scale/無損表示、競爭衝突、跨三頁 offset/邊界狀態、更新版本比較、四種 RID 命名、安裝包/SHA-256 配對、不受信任 URL 拒絕、Linux/macOS updater ArgumentList 與失敗結果解析。Linux X11 已從 UI 完成 SQLite Table 的新增、修改 NULL、binary hex、JSON、XML、MariaDB ENUM/SET/完整範圍 TIME/UUID/INET4/INET6、SQL Server hierarchyid/scalar temporal,以及 PostgreSQL bit string、interval、pg_lsn、四種系統識別碼、tsvector/tsquery 與四種網路位址修改後直接查庫確認、確認刪除、200 列翻到 201–400 列並驗證畫面;Docker 實機矩陣會在 Linux x64 啟動 MySQL 8、MariaDB 11.4、PostgreSQL 16 與 SQL Server 2022,驗證建庫、DDL、DML、Unicode、metadata、實際分頁 SQL及安全 CRUD/衝突情境後自行清理。GitHub Actions 會在原生 Linux x64/ARM64 與 Intel/Apple Silicon macOS runner 建立 self-contained linux-x64/linux-arm64 tar 與 osx-x64/osx-arm64 .app.zip,每個資產附獨立 SHA-256。兩個 Linux job 都會執行交易式安裝故障注入、隔離安裝、Xvfb UI 啟動、解除安裝、安全更新、五秒啟動檢查、rollback、舊版重啟與失敗狀態檔;兩個 macOS job 分別從 ZIP 重建同架構 app bundle,核對 plist、CPU 架構與 codesign,再以健康新版、立即退出新版、錯誤 SHA 與 symlink 檔案驗證安全套用/rollback,最後實際套用 self-contained app 並完成啟動健康檢查。tag Release 會先完成全部驗證與四種跨平台資產,再由 Windows job 核對九個檔案齊全並一次發布。macOS Developer ID/notarization 與 Windows 完整版其餘 provider/工作台能力留待後續。
    • Docker 實機覆蓋明細:含 binary、MySQL/MariaDB JSON/BIT(8)/BIT(64)/ENUM/SET/TIME(6)、MariaDB UUID/INET4/INET6、PostgreSQL jsonb/XML/bit/bit varying/timetz/interval/受限 interval typemod/pg_lsn/oid/xid/cid/xid8/tsvector/tsquery/inet/cidr/macaddr/macaddr8,以及 SQL Server XML/text/ntext/image/hierarchyid/sql_variant/scalar temporal 的安全 CRUD 與衝突情境。
  • Snowflake provider 🟡 第二期完成(查詢編輯器 DML/DDL)

    • 架構選擇:不引入官方 Snowflake.Data 驅動——5.x 已退出 .NET Framework 4.7.2,4.x 只剩 netstandard2.0 且會把 Apache.Arrow、AWSSDK.S3、Azure.Storage、Google Cloud Storage 等整串相依拖進 packages.config 專案。改以內建 SnowflakeRestClient 直連 SQL REST API v2:POST statements、202 輪詢與多 partition 讀取,零新增套件。
    • 連線與驗證:連線設定頁提供帳戶識別碼、使用者、token、database、schema、warehouse、role 與 OAuth 切換;驗證使用 Programmatic Access Token(預設)或 OAuth token(X-Snowflake-Authorization-Token-Type),token 由 Windows Credential Manager 保存。snowflake://user:token@account/db?warehouse=&role=&schema=&auth= URI 可匯入,未知參數一律拒絕;endpoint 覆寫僅接受 loopback,供測試使用。
    • Metadata 與查詢:SHOW DATABASES 列出資料庫,INFORMATION_SCHEMA 提供 schema.table/view、欄位型別、列數與位元組數;資料表可分頁瀏覽(LIMIT/OFFSET),查詢分頁接受 SELECT/SHOW/DESC/EXPLAIN/WITH。GET_DDL 供檢視 table/view 定義。
    • 第二期寫入:查詢編輯器會把 INSERT/UPDATE/DELETE/MERGE 與 DDL 交給 SQL REST API 執行,並從 DML ResultSet 的 affected-row 欄位回報筆數;結果集入口仍拒絕寫入。帶參數的呼叫會 fail closed,避免在參數綁定尚未實作時靜默忽略值而誤寫。
    • 驗證與限制:70 項 smoke test 含 loopback HTTP 伺服器,實際走過 bearer token 與 token type header、100-continue、202 輪詢、partition 合併、SHOW/INFORMATION_SCHEMA 解析、DML 寫入與 affected-row 解析、URI 匯入及設定保存。所有值以字串呈現(SQL API JSON 格式);尚未對真實 Snowflake 帳戶實機驗收,key-pair JWT、參數綁定、資料網格寫回、物件複製、暫存區、bulk load 與 BI 整合留待後續。
  • Redis 有序集合刪除衝突保護

    • 刪除會在 WATCH 後比對畫面載入時的分數,分數改變、成員消失或 EXEC 被中止都回報衝突;分數以數值比較,7 與 7.0 視為相同。
    • 回歸案例涵蓋過期分數、等值文字、成員消失及交易中止;Redis/Garnet 實機矩陣另加入外部改分數後拒絕刪除的案例。
  • Redis list 元素安全刪除

    • 刪除前以 WATCH 鎖定 key 並比對畫面載入時的索引和值;交易中先把該索引換成兩組 GUID 組成的唯一標記,再只移除一次標記,因此 list 內有重複值也不會刪到別的位置。
    • 索引消失、值被外部修改或 EXEC 中止都會回報衝突且保留清單;loopback 測試涵蓋重複值、過期值、越界索引與交易中止,Redis/Garnet 實機矩陣也會驗證重複值及外部修改。
  • Redis/Garnet INFO 即時監控

    • Redis 資料庫節點可開啟停靠式監控頁,支援手動更新或每 1/5/10/30 秒自動更新;摘要列出 logical db key 數、版本、運行時間、連線與阻塞數、記憶體、每秒命令、命中率、網路流量、CPU、持久化與複寫狀態。
    • 命令統計解析 INFO commandstats,依呼叫次數排序並顯示平均微秒與失敗/拒絕次數。每次更新先讀一筆預設 INFO,缺少的區段才個別補讀;不支援或被 ACL 拒絕的區段會略過,監控只保留當次快照,不持久化伺服器資訊。
    • loopback RESP 測試涵蓋 INFO 欄位、命中率、命令排序與錯誤計數;Redis 6.2/7 及 Garnet 實機矩陣已加入快照案例,待 Docker 環境重跑。
  • Redis/Garnet Pub/Sub 訊息工作區

    • Redis 資料庫節點可開啟停靠式 Pub/Sub 頁籤,以 channel 或 glob-style pattern 訂閱訊息;接收使用另外建立且完成相同 AUTH/SELECT 流程的 RESP2 連線,不會占住 provider 的一般查詢連線。
    • 訊息表保留收到時間、matched pattern、實際 channel 與 payload,僅存在目前頁籤記憶體且上限 1,000 筆。發布必須由使用者按下按鈕,完成後顯示 Redis 回報的接收端數量;停止訂閱或關閉頁籤會直接釋放專線。
    • loopback TCP 測試實際驗證 channel、pattern、PUBLISH、專線關閉後 provider 仍可使用;Redis 6.2/7 與 Garnet standalone 實機矩陣已加入相同案例,待 Docker 環境重跑。Redis Pub/Sub 本身是 at-most-once,這版不保存、補送訊息或自動重連。
  • Redis/Microsoft Garnet provider 🟡 第三期完成(集合型別編輯)

    • key 編輯器依型別切換:hash/list/set/zset 以項目網格+輸入列操作——hash 欄位新增/更新/刪除、list 既有元素編輯/刪除與尾端新增(RPUSH)、set 成員新增/移除、zset 成員分數新增/更新/移除;TTL 與刪除 key 對所有型別可用。
    • 並行安全:所有集合寫入共用 WATCH+MULTI/EXEC 交易——型別被改變、項目被其他連線建立/刪除/改值、或 EXEC 落空都會回報衝突且不寫入;zset 分數以數值比較避免字串表示差異誤判,list 刪除則以交易內唯一標記鎖定索引,避免重複值誤刪。
    • 實機矩陣(2026-08-27):Redis 6.2、Redis 7、Garnet 各通過 39 項檢查(原 26 項+13 項集合寫入:欄位/元素/成員的更新、新增、刪除、stale 衝突不覆蓋與型別衝突)。
  • Redis/Microsoft Garnet provider 🟡 第二期完成(string 安全編輯與實機矩陣)

    • 連線:新增 Redis / Garnet 選項與設定頁,支援 redis:///rediss:// URI、ACL username+password、舊版 password-only URI 匯入相容、TLS 與 logical database index;密碼仍由 Windows Credential Manager 保存,設定檔另保留驗證需求旗標以便憑證遺失時提示補輸入。
    • 瀏覽:每個 logical db 提供 keys 虛擬表,透過 SCAN 顯示 key、type、TTL 與內容摘要;單次 traversal 會去除重複 key,type filter 會先於 offset/limit 套用,避免前一批不同型別吃掉結果額度。
    • 唯讀查詢:接受 SELECT * FROM keys 相容入口,或只含 pattern、key、type、limit 的 JSON;可檢視 string、list、hash、set、zset 內容,拒絕未知欄位、混用 key/pattern 與所有寫入命令。
    • 協定安全:內建 RESP2 TCP/TLS client,限制 bulk string/array 大小及巢狀深度;連線流程涵蓋 AUTH、PING、SELECT,metadata 以 CONFIG/DBSIZE/INFO 讀取並對不支援的 INFO 區段降級。
    • key 編輯器:查詢結果雙擊 key 或右鍵「編輯 Key」可開啟編輯器,支援 string 值編輯、TTL 設定(秒)/移除與確認後刪除 key;右鍵另有直接刪除入口。儲存以 WATCH+MULTI/EXEC 樂觀並行保護:載入後被其他連線改過(比對值不同或 EXEC 落空)會回報衝突且不覆蓋,「保留剩餘 TTL」會在同一交易內補 PEXPIRE。值含無法以 UTF-8 呈現的位元組時標示唯讀,避免寫回把原始位元組換成替換字元。查詢分頁本身仍拒絕所有寫入命令。
    • 實機矩陣(2026-08-27,Docker standalone):Redis 6.2、Redis 7、Microsoft Garnet 各通過 26 項實機檢查——連線、INFO 版本、DBSIZE、pattern/type 掃描、五種型別單鍵內容、TTL 欄位、編輯基準載入、保留/清除 TTL 儲存、並行衝突不覆蓋、衝突後重載可續存、非 string 拒編輯、EXPIRE/PERSIST、缺 key 失敗與刪除 round-trip;可用 tests/Run-RedisLiveMatrixTests.ps1 重跑。
    • 驗證與限制:68 項 smoke test 含兩座 loopback TCP/RESP 伺服器,覆蓋 ACL AUTH、SCAN 去重/型別篩選、單鍵內容、INFO 與 WATCH/MULTI/EXEC 編輯流程(含 EXEC 落空與 UNWATCH)。尚不支援 Cluster、Sentinel、Pub/Sub、監控、二進位值編輯,以及 list/hash/set/zset 的寫入;SCAN 分頁在資料同時變更時仍屬 best effort。
  • MongoDB provider 🟡 第三期完成(文件新增/刪除與實機矩陣)

    • 連線:新增一般 mongodb:// 與 Atlas 常用 mongodb+srv:// 設定,可保存 auth source、replica set、direct connection、retry writes 與 TLS;URI 匯入會拒絕未知、重複或互相衝突的參數,原始 URI 不會保存,密碼仍交由 Windows Credential Manager。
    • Metadata:左側樹可列出 database、collection 與 view;collection metadata 包含索引、統計資訊,並抽樣前 100 筆文件推斷頂層欄位、BSON 型別、NULL 與 _id key。
    • 唯讀查詢:雙擊 collection 會用分頁網格顯示頂層欄位與 _json 完整文件;查詢分頁接受受限 JSON find 規格(collection、filter、projection、sort、skip、limit),上限 10,000 筆。查詢分頁本身仍拒絕新增、修改、刪除、DDL、跨庫複製與 Dump,寫入只能走文件檢視器。
    • 文件檢視器:雙擊結果列或右鍵「開啟文件」可開啟文件檢視器,左側是可展開的欄位/陣列/型別樹,右側是 Canonical Extended JSON 編輯區(型別不會被 relaxed 表示法默默改掉)。開啟時會依 _id 重新讀取伺服器上的完整文件,查詢 projection 不會造成欄位遺失。
    • 安全寫回:儲存前驗證 JSON 與 _id 不可變更,寫回以「編輯前完整文件」做樂觀並行比對(頂層值可能被解讀成查詢運算子的文件改用 _id 過濾+寫入前重讀比對);文件被別人改過或刪除時直接回報衝突、不寫入。View 與缺 _id 的文件維持唯讀。
    • 文件新增/刪除:結果網格右鍵「新增文件」以空白文件開啟檢視器插入模式,未提供 _id 時由驅動產生,成功後轉為一般編輯模式;「刪除文件」會先依 _id 重讀完整文件、確認後以同一套重讀比對+完整文件過濾刪除,文件被他人改過或已刪除時回報衝突。兩者對 view 都直接擋下。
    • 實機矩陣(2026-08-27,Docker standalone):MongoDB 4.4、7.0、8.0 各通過 24 項實機檢查——連線、database/collection/view metadata、schema 推斷、索引、分頁、JSON find、canonical 型別保真(Int64)、no-op 不寫入、正常編輯、舊版衝突、外部新增欄位衝突、插入自動 _id、刪除、重複刪除衝突與查詢分頁唯讀。Atlas/SRV、replica set 與帳號驗證環境仍未實機驗收。
    • 後續方向:schema 路徑統計、Aggregation Pipeline、Atlas/SRV 與驗證環境矩陣;smoke test 另涵蓋 URI、連線字串、provider factory、唯讀邊界、文件樹、編輯/插入驗證與並行規則。
  • 連線星號、色彩與批次屬性 ✅ 已完成

    • 顯示與排序:連線右鍵可加上/移除星號;加星連線會顯示 ★ 並在同一層置頂。連線色彩改用穩定的 palette key 保存,不再只改目前 TreeNode 而在重繪或重開後消失。
    • 批次操作:工具選單、連線樹空白處或單一連線右鍵可開啟批次屬性視窗,勾選多筆連線後統一加/移星號、移動/移出群組,以及設定/清除色彩;每個屬性都能選擇維持不變,避免覆蓋未指定內容。
    • 相容與安全:conn_starred、conn_color 隨目前連線設定檔匯出/匯入,舊設定缺少欄位時正規化為未加星號與預設色,不會產生假差異;舊版以 favorites.txt 保存的連線最愛會在啟動時遷移成星號。批次畫面只顯示名稱、provider 與群組,不顯示帳號密碼。
    • 驗證:smoke test 覆蓋多選去重、群組路徑正規化、加星/移星、色彩套用/清除、無實際變更、未選連線保持不變、表單預選、密碼不顯示、設定保存欄位與繁中/英文語系。
  • 連線 URI 匯入 ✅ RDBMS、MongoDB 與 Redis 已完成

    • 操作:新增連線精靈可從 URI 匯入 MySQL/MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB 與 Redis;解析完成後會開啟原本的 provider 設定頁供使用者檢查、測試與保存,不會自動連線或直接寫入設定。
    • 格式:網路資料庫使用 scheme://user:password@host:port/database,支援百分比編碼、name 與 sslmode;SQL Server 另支援 Windows 驗證及憑證信任參數,Oracle 可用路徑指定 Service Name 或以 sid/service_name 參數指定識別值,SQLite 使用絕對檔案 URI。
    • 安全:原始 URI 不會保存;畫面預設遮蔽可能含密碼的內容,只有使用者勾選才顯示。解析會拒絕未知/重複/衝突參數、fragment、錯誤 percent escape、控制字元、額外資料庫路徑與不支援 scheme;密碼仍沿用正常儲存流程寫入 Windows Credential Manager。
    • 驗證:smoke test 覆蓋 provider alias、預設與自訂連接埠、帳密/名稱 percent decode、TLS 對應、SQL Server Windows 驗證、Oracle SID、SQLite 路徑、MongoDB SRV、Redis logical db/password-only 相容、表單預填及 fail-closed 錯誤案例。
  • SSL/TLS 與 SSH Tunnel ✅ 四種網路 provider 已完成

    • 連線設定:MySQL/MariaDB、PostgreSQL、SQL Server 與 Oracle 的新增/編輯視窗都可開啟 SSL/TLS 與 SSH Tunnel;SQLite/SpatiaLite 為本機檔案,不套用網路傳輸設定。
    • 憑證驗證:依 provider 提供 Required、VerifyCA 或 VerifyFull 等模式,可指定 CA、用戶端憑證/私鑰或 Oracle Wallet;Oracle Basic 可改用 TCPS 與伺服器 DN 比對,TNS 則交由 tnsnames.ora 管理。
    • SSH 安全:支援密碼、私鑰或同時使用,連線前必須完全比對 SHA256 主機金鑰指紋;本機轉送只監聽 127.0.0.1 動態連接埠,資料庫關閉後一併停止 Tunnel。
    • 秘密與排程:SSH 密碼、私鑰密語與憑證密碼只存在 Windows Credential Manager;主畫面、測試連線與自動執行作業共用連線開啟流程,刪除連線或設定檔時也會清理對應憑證。
    • 驗證:smoke test 覆蓋四種 provider 連線字串、秘密 payload round-trip、SSH 指紋正規化、SSH 與 VerifyFull 衝突阻擋及四個連線編輯器入口;目前尚未在專案外的真實 SSH 伺服器和四種資料庫憑證環境做完整實機矩陣。操作方式見 CONNECTION_SECURITY.md。
  • Windows 自動執行作業 ✅ 第一版完成

    • 完成內容:工具選單新增可停靠管理畫面,可建立唯讀查詢、查詢結果匯出與整庫邏輯 SQL 備份;支援立即執行、最近紀錄、每日 Windows 工作排程註冊與移除。
    • 可攜與安全:作業以獨立 JSON 保存,只引用設定檔與連線顯示名稱,不複製主機連線字串或帳密;實際執行才由同一個 Windows 使用者的 Credential Manager 取回密碼。執行紀錄不保存 SQL。
    • 安全邊界:自動查詢只接受單一唯讀 statement,保守拒絕 DML/DDL、SELECT INTO、EXPLAIN ANALYZE 與多段 SQL;工作排程使用 InteractiveToken 與最低權限,只在建立排程的使用者已登入時執行。
    • 後續方向:加入每小時/每週觸發、失敗重試、匯入、跨庫傳輸與郵件/Webhook 通知。操作與檔案格式見 AUTOMATION.md。

以下是從程式碼裡的「尚未支援」、「Unavailable」、「Unsupported」與實作 fallback 掃描出的清單。後續修改請優先參考這裡,把完成狀態同步更新。

優先待辦

  • Navicat 對齊:唯讀 ER 圖 ✅ 第一版已完成

    • 操作:從「檢視 > ER 圖表」、資料庫右鍵「將資料庫逆向至模型」,或 Models 下的 ER Diagram 開啟可停靠分頁;支援重新整理、10%~200% 縮放、適合視窗、中鍵平移與完整圖面 PNG 匯出。
    • 共用模型:SchemaModelService 會將 MySQL/MariaDB、PostgreSQL、SQL Server、Oracle、SQLite 的資料表、欄位、主鍵與外鍵整理成 provider-neutral 快照,兩庫結構差異與後續同步預覽會直接沿用。
    • 顯示:每張資料表以卡片呈現欄位、型別、可空值與 PK,外鍵以帶方向箭頭的折線連接來源及目標欄位;單表超過 16 個欄位時先收合其餘欄位,避免大型 schema 的卡片過高。
    • 容錯:單一資料表欄位或外鍵 metadata 讀取失敗時會保留其餘圖面並在狀態列顯示警告數,不會把整張 ER 圖清空。
    • 驗證:smoke test 覆蓋五種 provider 的原生外鍵查詢、共用欄位/PK/FK mapping、圖面配置、PNG render,以及唯讀 dockable workspace 行為。
    • 後續方向:卡片拖曳與位置保存、關聯標籤/篩選、多模型工作區及資料庫雙向同步。
  • Navicat 對齊:兩庫結構差異報告 ✅ 第一版已完成

    • 操作:從 Models 下的 Schema Comparison 或資料庫右鍵「比較資料庫結構」選擇另一個已開啟的資料庫;比較結果以可停靠分頁呈現,可重新比較、交換來源/目標並匯出 HTML。
    • 比較範圍:沿用 provider-neutral schema 快照,比對資料表、欄位、資料型別、可空值、Primary Key 與外鍵;外鍵以來源欄位及參照目標的語意比對,不因兩邊 constraint 名稱不同而誤報。
    • 跨 provider:常見等價型別別名會先正規化,例如 INT/INTEGER、BOOLEAN/BOOL,但長度或精度不同仍會列為差異;單邊 metadata 讀取警告會保留在報告內,避免把不完整資料誤當成完全一致。
    • 安全:比較本身只讀取 metadata 與資料列;同步 SQL 與資料同步只在使用者勾選並確認後送到比較時使用的目標連線,破壞性項目預設不勾且需輸入資料庫名稱。
    • 驗證:smoke test 覆蓋來源/目標獨有資料表與欄位、型別、NULL、PK、FK、metadata 警告、固定排序、HTML 編碼,以及唯讀 dockable workspace 行為。
    • 同步 SQL 預覽:結構差異頁的「同步 SQL 預覽」可為同類型資料庫(MySQL/MariaDB、PostgreSQL、SQL Server、SQLite)產生讓目標跟上來源的腳本,涵蓋建表、加欄位、PostgreSQL/SQL Server 型別與 NULL 變更、補外鍵;刪除類變更一律註解,MySQL MODIFY 與主鍵、SQLite 限制列為手動項目。可複製、另存,或在「在目標執行」分頁勾選後於目標執行(刪除類預設不勾且需輸入資料庫名稱;交易式 provider 失敗整批回滾、MySQL 遇錯即停並標示已生效),完成後自動重比;腳本實際在 MySQL 8、PostgreSQL 16、SQL Server 2022、SQLite 套用驗證。
    • 視覺查詢建構器:資料庫右鍵「查詢建構器...」以畫布加入資料表(外鍵自動連接、拖曳欄位建立連接),設定輸出、別名、彙總、排序、分組、條件、DISTINCT 與筆數上限;SQL 依 provider 即時產生,可修改後轉回圖形(不支援的語法明確拒絕),可複製或送到查詢視窗,本身不執行語句。
    • MongoDB 結構描述分析:collection 右鍵「結構描述分析...」抽樣(前 N 筆或 $sample)後展開巢狀與陣列路徑,列出出現率、型別分佈、NULL、範圍、常見值與 IQR 極端值(附 _id),並標出混合型別、數字存成字串、稀疏欄位、大小寫不一致欄位名稱、空字串等異常;只讀取文件。
    • MongoDB Aggregation Pipeline:collection 右鍵「Aggregation Pipeline...」以範本新增唯讀 stage、調整順序與啟用、逐 stage 編輯 JSON,預覽到任一 stage 的前 N 筆輸出;拒絕 $out/$merge(含巢狀),可匯入、複製 mongosh 語法或送到查詢視窗(查詢 JSON 支援 pipeline 欄位)。
    • Redis Cluster/Sentinel:Redis 連線可選 Cluster(CRC16 slot 路由、MOVED/ASK 重導、逐 master 掃描、交易固定節點、只有 db0)或 Sentinel(從 Sentinel 取得 master 並以 ROLE 確認);連線 URI 以 mode/seeds/master 參數表示,未知參數拒絕。
    • 資料傳輸精靈:資料庫右鍵「資料傳輸...」選擇目標資料庫後逐表設定建立新表/附加/取代資料與欄位對應;每批寫入後記錄檢查點可續傳(有主鍵接續、無主鍵重來或拒絕附加續傳),完成後以列數驗證並匯出 HTML 報告,取代資料需輸入資料庫名稱。
    • ER 模型工作區:ER 圖可拖曳編排、依外鍵分層自動排列,以群組上色/隱藏/鎖定,多張圖表存成 .punkmodel(只存版面),並可匯出 PNG/SVG。
    • 模型與資料庫雙向同步:模型可保存結構並離線編輯資料表/欄位/外鍵,與資料庫雙向比較;模型 → 資料庫沿用結構同步的逐句審核與破壞性確認。限制:模型只保存資料表、欄位型別、NULL、主鍵與外鍵,不含索引、預設值、CHECK、檢視與程序;SQLite 無法以 ALTER 新增外鍵,同步時只列為需手動處理的項目。
    • 原生備份/還原:SQL Server 伺服器端 BACKUP/RESTORE(COPY_ONLY、CHECKSUM、驗證、還原為新資料庫),PostgreSQL pg_dump/pg_restore 與 MongoDB mongodump/mongorestore;密碼不經命令列,還原一律建立新資料庫。
    • BI 儀表板:資料集為唯讀 SQL 或 MongoDB JSON find/pipeline,加上計算欄位;長條/折線/圓餅/數字卡/表格在本機彙總,點選分類跨圖表篩選(同名欄位、可跨資料集),存成 .punkbi 並可匯出 PNG。限制:每個資料集最多 200,000 列、一次載入到記憶體;MongoDB 巢狀文件以 JSON 文字呈現,要分組的巢狀欄位請先在 pipeline 用 $project/$addFields 攤平;Snowflake 尚未以真實帳戶驗收;Linux/macOS 版尚未提供。
    • 資料產生器:資料庫右鍵「資料產生...」改為多表產生器,可勾選資料表與筆數、逐欄設定規則(自動、資料庫預設、NULL、固定值、序列、範圍、清單、樣式、NULL 比例)與 seed。自動規則依型別、欄位名稱、長度、精度與 MySQL ENUM/SET 產生;外鍵挑選現有或同批產生的父列(含自我參照),主鍵與唯一索引(MySQL、PostgreSQL、SQL Server、SQLite 皆讀取)不重複,被參照的自動編號改寫明確值並推進序列;規則值在寫入前先依型別檢查。預覽只在記憶體產生,寫入需確認並以單一交易執行,失敗整批回滾。smoke test 以 SQLite 驗證外鍵完整性、唯一性、規則、seed 重現與錯誤案例。
    • 資料比較與同步:結構比較視窗的「比較資料…」以 Primary Key 逐列比對同類型資料庫的同名資料表(每表上限 50,000 列、無主鍵或主鍵重複則略過),可預覽 SQL 並在目標以單一交易同步;依外鍵相依排序(先刪子表),每列寫入前在交易內重讀目標原值,比對後被修改即整批回滾;刪除只在目標的資料列預設不同步,勾選時需輸入資料庫名稱;計算欄位不寫入,SQL Server identity 以 IDENTITY_INSERT、PostgreSQL 以 OVERRIDING SYSTEM VALUE 保留來源值並重設序列。smoke test 以兩個 SQLite 資料庫驗證比較、不含刪除與含刪除的同步、並行修改回滾與註解注入。
  • Navicat 對齊:物件 URI 分享與直接定位 ✅ 已完成

    • 操作:database 與 Table、View、Function、User、Event、Model、BI、內建工具、Report 可從左側樹或物件清單右鍵複製 mysqlpunk://object URI;接收方開啟 URI 後會清除暫時的連線搜尋條件、找到目前設定檔的同名連線並定位物件。
    • 啟動流程:未開啟的連線會沿用主視窗既有 provider 流程連線,再載入指定 database 的 metadata;物件群組正常顯示、隱藏或只顯示活躍物件時都以節點型別標記定位,不依賴固定樹層級。
    • 安全:URI 只保存連線顯示名稱、database、物件類型、名稱及 User 的 host 次要鍵,不含主機、連接埠、帳號、密碼或 connection string;解析會拒絕未知/重複/缺漏參數、帳密、fragment、額外路徑、控制字元與非法百分比編碼。
    • 驗證:smoke test 覆蓋 Unicode 與保留字元 round-trip、database/Table/User URI、樹狀群組對應,以及錯誤 scheme、endpoint、帳密、重複/未知/缺漏參數、不支援類型與畸形 escape 的 fail-closed 行為。
  • Navicat 對齊:具名資料表設定檔 ✅ 已完成

    • 操作:資料表資料模式的底部工具列新增設定檔下拉與管理按鈕;每張資料表可新增、修改、刪除多組具名設定,並快速切換目前設定。
    • 內容:設定檔保存 WHERE 後方的篩選條件、單一主要排序欄位與方向,以及顯示欄位;目前選擇會依 provider/database/table 寫入使用者目錄的 table-data-profiles.json,不保存密碼、查詢結果或資料列內容。
    • 安全與一致性:篩選只接受單一條件,拒絕分號、SQL 註解與頂層 ORDER BY/GROUP BY/UNION 等子句;MySQL、PostgreSQL、SQLite 使用 LIMIT/OFFSET,SQL Server、Oracle 使用 OFFSET/FETCH,且主要排序後會追加 Primary Key 作為穩定分頁 tie-breaker。資料表有未儲存變更時會阻止切換,避免重新載入造成資料遺失。
    • 驗證:smoke test 覆蓋 JSON round-trip、作用中設定、重名拒絕、欄位可見性、五種 provider 的識別字 quoting/分頁語法、字串內分號與多 statement/頂層排序拒絕。
  • Navicat 對齊:程式碼片段與上下文自動完成 ✅ 已完成

    • 自動完成:查詢編輯器會限定在游標所在 statement,略過 SQL 字串與註解後解析 FROM/JOIN/UPDATE/INTO 的資料表與 alias;輸入 alias. 只列出對應欄位,多表查詢會提供 alias.column,資料表位置則優先列出資料表與 View。
    • metadata:資料表、View 與實際使用到的欄位會以 provider/database 分區保存到 autocomplete-cache.json;啟用自動更新時會刷新物件清單及目前 statement 用到的欄位,避免開啟大型 schema 時一次查詢所有資料表。
    • 程式碼片段:編輯選單或 Ctrl+Shift+P 可開啟管理器,內建 SELECT、JOIN、INSERT、UPDATE、DELETE、CTE、交易與 CREATE TABLE;支援全文搜尋、自訂片段 CRUD、$CURSOR$ 游標定位、保留目前縮排插入,以及 JSON 匯入/匯出供工作區同步。
    • 驗證:smoke test 覆蓋 alias 對應、游標後方 FROM 解析、多表欄位、註解/字串排除、片段縮排展開、自訂片段 round-trip、匯入/匯出與 metadata 快取。
  • Navicat 對齊:視覺化執行計畫 ✅ 五種 provider 已完成

    • 現況:查詢工具列與檔案選單的「執行計畫」會分析選取 SQL 或全文;MySQL/MariaDB 使用 EXPLAIN FORMAT=JSON,PostgreSQL 使用 EXPLAIN (FORMAT JSON, ANALYZE FALSE, ...),SQLite 使用 EXPLAIN QUERY PLAN。
    • 原生格式:SQL Server 會在同一連線暫時啟用 SHOWPLAN_ALL;Oracle 以每次產生的 statement ID 寫入 PLAN_TABLE,只讀取該次資料後刪除。各 provider 都會轉成可展開節點樹,顯示 relation、access/join 類型、預估列數、成本與完整節點屬性,也能切換原始資料與文字計畫。
    • 安全:一次只接受一個 SELECT/WITH/INSERT/UPDATE/DELETE/REPLACE,拒絕 DDL 與多 statement;不使用 PostgreSQL ANALYZE,SQL Server 成功或失敗都會關閉 SHOWPLAN_ALL,Oracle EXPLAIN PLAN 與 SQLite EXPLAIN QUERY PLAN 也不會執行原本 DML。
    • 驗證:smoke test 覆蓋 MySQL/PostgreSQL JSON 階層、SQL Server session 清理、Oracle statement ID 與 PLAN_TABLE 清理、SQLite 記憶體資料庫原生計畫,以及三種視圖與 provider 顯示。
  • 查詢編輯器詢問 AI 與錯誤交接 ✅ 已完成

    • 入口:查詢工具列的「詢問 AI」可對選取範圍或整份 SQL 建立解釋、最佳化草稿;使用者仍能在 Punky 輸入框檢查內容,再自行決定是否送出。
    • SQL 動作:同一選單新增格式化與資料庫語法轉換;格式化提示明確限制只能調整排版、縮排與關鍵字大小寫,轉換則可選 MySQL/MariaDB、PostgreSQL、SQL Server、Oracle 或 SQLite,並把來源與目標 provider 一起放進草稿。目前使用中的 provider 會停用,避免同方言轉換。
    • 自訂動作:「管理自訂動作」可新增、修改、刪除提示,並決定是否釘選到「詢問 AI」選單;未釘選的動作仍保留在管理視窗,需要時可直接按「儲存並使用」。執行時會沿用目前選取範圍或全文,AI 回覆若含 SQL 也會進入同一套差異確認流程。
    • 保存範圍:自訂動作寫入使用者目錄的 query-ai-actions.json,只包含名稱、提示內容與釘選狀態,不保存編輯器 SQL、查詢結果、連線資訊或 AI 認證;同名動作會拒絕,並限制最多 50 組、名稱 80 字、提示 4,000 字。
    • 錯誤修正:SELECT/DML/DDL 執行失敗後才會啟用「修正上次執行錯誤」,使用當次實際 SQL、provider、資料庫名稱與錯誤原因組成草稿;開始下一次查詢時會清除舊錯誤,避免修到不相干的 SQL。
    • 安全:不帶主機、帳號或連線字串;錯誤文字中的 password/pwd、token、API key、secret 與 Bearer credential 會先遮蔽,SQL 限制 20,000 字元、錯誤限制 4,000 字元,且只建立草稿、不自動呼叫外部模型。
    • 差異確認:最佳化與修正回覆若含 SQL,可先逐行並排比較原始內容與 AI 建議;連續差異會合併成一個變更區段並預設全選,可取消不想採用的區段,再按「套用已選變更」回寫當次選取範圍或全文,且不會自動執行。
    • 部分套用:取消修改區段會保留原行,取消新增區段會略過新行,取消刪除區段則保留原本要刪除的行;重建 SQL 時沿用原編輯器的換行格式,沒有選取任何區段時不開放套用。
    • 版本保護:送出 AI 前會記住完整編輯器快照,開啟差異與實際寫入前各檢查一次;等待回覆期間或預覽期間只要 SQL 被修改,就拒絕用舊建議覆蓋。
    • 驗證:smoke test 覆蓋格式化限制、來源/目標 provider、缺少轉換目標時 fail closed、五種目標選單與同 provider 停用;也涵蓋自訂動作 JSON round-trip、更新/刪除、重名拒絕、釘選篩選、損毀檔案 fail closed、提示長度上限、繁中管理視窗,以及查詢工具列只顯示釘選項目。
  • AI 訂閱 CLI 偵測與選項卡片 ✅ 已完成

    • 畫面:「選項 > AI」以三張卡片顯示 OpenAI Codex、Claude Code 與 Gemini CLI 的安裝狀態、實際執行路徑、帳號標籤、登入方式及目前選用狀態;可重新偵測或直接切換服務。卡片下方只保留目前服務需要的設定:CLI 顯示模型與測試,API 顯示端點、模型與金鑰,本機模型顯示端點、模型與偵測;CLI 找不到執行檔或已有自訂路徑時才顯示路徑欄。
    • 帳號來源:Codex 只取 .codex/auth.json 的登入模式與 ID token 內 email,Claude 只取 .claude.json 的 oauthAccount.emailAddress,Gemini 只取 .gemini/google_accounts.json 的 active 帳號;解析結果不含 token、OAuth credential 或 API key。
    • 安全邊界:畫面明確區分「找到登入資料」與「已驗證訂閱權限」,不會因本機留有帳號資料就宣稱遠端訂閱可用;JSON 損毀、欄位缺漏或帳號標籤含控制字元時會保守顯示無法判定。
    • 驗證:smoke test 覆蓋三家帳號解析、JWT Base64URL、敏感欄位不外洩、錯誤 JSON fail closed 與三個 CLI provider 全數回傳安全狀態;實際 WinForms QA 確認三張卡片、垂直捲動及進階設定沒有水平溢出。
  • Punky 多聊天室 ✅ 第一階段已完成

    • 操作:AI 面板可新增、切換、重新命名與關閉對話;第一則送出的問題會成為簡短標題,之後仍能自行修改。最後一段對話不允許關閉,有內容或草稿的對話會先確認再移除。
    • 隔離:每段對話分開保存訊息上下文、未送出草稿、schema 勾選、最後一段 AI SQL 與其差異套用回呼;切換後不會把前一段的 SQL 套用動作帶過去。模型回覆期間暫停聊天室與供應商切換,回覆仍寫回原本的對話。
    • 隱私:聊天室只存在本次程式的記憶體,不寫入設定檔或其他磁碟檔案;關閉程式後不保留。
    • 驗證:smoke test 覆蓋新增、切換、草稿與 schema 選擇還原、SQL 回呼隔離、重新命名、單一對話保護與關閉後狀態還原。
  • 跨模型答案並排比較 ✅ 已完成

    • 入口:Punky 輸入區的「比較」會開啟獨立寬視窗,左右兩側可分別選 provider 與 model;可比較同一服務的不同模型,也能跨 Codex/Claude/Gemini CLI、API 或本機 OpenAI 相容服務。
    • 請求內容:兩側各自收到相同的 Punky system prompt、勾選時取得的同一份 schema 快照、目前聊天室最近 12 則 user/assistant 訊息,以及輸入框尚未送出的問題;聊天室內既有 system 訊息不會被當成模型指令轉送。
    • 結果:兩個呼叫並行執行,各自計一次用量並在左右欄顯示;單側失敗只顯示在該欄,答案可用右鍵複製。結果不寫入聊天室歷史、不清除草稿、不自動執行或套用 SQL。
    • 設定與安全:送出前會拒絕相同的 provider/endpoint/model、未知 provider、缺少 endpoint/model 或 API key;只保存右側 provider ID 與模型名稱供下次選用,不保存提示、schema、答案或認證。比較進行中不把關閉視窗誤當成取消,必須等兩側完成。
    • 驗證:smoke test 覆蓋設定正規化、相同模型與缺少端點 fail closed、上下文複製與 system 訊息過濾、左右分割結果區、預設挑選不同模型,以及 380px AI 面板仍保留可用輸入寬度。
  • 右側 AI 助理與物件詳細資料收合 ✅ 已完成

    • 現況:新使用者第一次啟動時會直接顯示 AI 助理;按關閉後會記住選擇,下次啟動維持關閉,仍可從「檢視 > AI 助理」重新開啟。
    • 完成內容:AI 助理與物件詳細資料各自提供暫時收合按鈕,收合後會留在右側圖示列,不改動長期顯示偏好;可由圖示列或「檢視」選單再次展開。兩者同時展開時會以主題化細線分隔,任一窗格收合後分隔線會一起隱藏。
  • Navicat 對齊:資料分析 ✅ 欄位統計、Top 值分佈與互動鑽取已完成

    • 現況:資料表節點與資料表清單右鍵新增「資料分析」,以可停靠工作區顯示五種既有 provider 的欄位型別、分析筆數、NULL、相異值、最小值、最大值、數值平均與 Top 10 值比例。
    • 安全與效能:預設只分析 10,000 筆,可切換 1,000/50,000/全表;provider 不支援 BLOB/JSON 等型別的 DISTINCT、排序或分組時,保留可取得的統計並標示部分完成,不讓整份報告失敗。
    • 互動:選取欄位會切換 Top 值分佈,選取或雙擊值可開啟帶安全字面值與 200 筆上限的 WHERE 查詢;MySQL、PostgreSQL、SQLite、SQL Server、Oracle 會使用各自的 identifier quoting 與 LIMIT/TOP/ROWNUM/FETCH 語法。
    • 後續方向:加入字串格式異常、長度分佈、日期/數值區間圖與自訂抽樣方式。
  • 選項中心分類功能 ✅ 查詢視窗、診斷記錄、自動復原草稿、索引標籤偏好、HTTP 代理、檢視顯示偏好與進階註冊已補齊

    • 現況:選項視窗已具備一般、索引標籤、自動完成程式碼、編輯器、記錄、AI、自動復原、檔案位置、連線能力、環境與進階等分類。
    • 完成內容:ApplicationOptionSettings 會將通用選項保存到 application-options.json;查詢視窗已讀取並套用記錄限制、編輯器字型大小、換行、Tab 空格、自動完成啟用狀態、是否自動載入 metadata,且 SQL 文字超過「大型檔案停用門檻」時會停用語法上色與自動完成以降低卡頓;自動完成頁面的「清除自動完成資料」會刪除本機 autocomplete-cache.json 並依目前語系顯示完成提示;資料表資料模式儲存時可依「自動開始交易」把同批新增、修改、刪除包在 provider 對應的 BEGIN/COMMIT/ROLLBACK 流程中;匯出預設資料夾、SQL 開啟/儲存資料夾、結果網格字型大小、結果列高度、日期/時間格式、千分位與是否使用系統數字格式也已套用;檔案位置頁可設定還原差異內容指紋抽樣列數,用於控制還原前後大型資料表內容比對最多讀取幾列;一般頁的「顯示工具提示」會控制主要工具列、連線按鈕、收藏選單與 TreeView 節點提示是否顯示;一般頁的「啟動時自動檢查更新」會在啟動後背景查詢 GitHub Releases,說明選單也提供手動檢查更新;進階選項的「啟用診斷記錄」會把查詢歷程以 JSONL 寫入 選項 > 檔案位置 的記錄位置,內容保留 SQL 預覽與 SHA-256 指紋,不保存完整 SQL 原文;自動復原的查詢開關與間隔會啟動查詢草稿定時保存,草稿寫入查詢資料夾下的 auto-recovery;索引標籤設定可決定新查詢開在主視窗分頁、最後使用位置或新視窗,且「允許重複開啟相同的物件」關閉時會重用同名同型別分頁;檢視選單的導覽窗格(含僅顯示活躍物件)、資訊窗格、清單/詳細資料、欄位排序(含遞增/遞減)、欄位顯示、頂部即時篩選、「隱藏物件群組」與「顯示隱藏的項目」會保存並套用設定,其中欄位選擇視窗的 provider 群組與預設欄位名稱會依繁中/英文語系顯示,但仍保留原欄位 key 以相容既有偏好;僅顯示活躍物件會隱藏空的物件分類,隱藏物件群組會把 Tables / Views / Functions / Users / Events / Queries 的物件直接顯示在 database 節點下且保留右鍵與雙擊操作,隱藏項目會預設過濾 SQLite 系統表、SpatiaLite metadata、sidecar metadata 與常見 provider 系統物件;連線能力的 HTTP 代理設定會套用到 WebRequest/WebClient 路徑,例如自動補註解字典下載與共用 HTTP helper,且「測試連線能力」會以目前代理設定執行 HTTP 探測並依目前語系回報直接連線、代理模式、SOCKS5 限制與結果;進階註冊可在目前使用者層級註冊 SQL 檔案開啟方式與 mysqlpunk:// URL 協定,關閉選項時只移除本程式建立的註冊項目。
    • 後續方向:部分選項仍需逐步接到實際行為,例如 SOCKS5/provider 原生資料庫連線代理。
  • 應用程式打包與更新 ✅ 單一安裝 EXE 與程式內更新已補齊

    • 現況:AppUpdateService 可讀取 GitHub Releases latest API,解析 tag_name、版本、release notes、下載頁、installer asset、GitHub asset SHA-256 digest 與舊版 portable zip asset;主選單「說明 > 檢查更新...」可手動檢查,選項「啟動時自動檢查更新」會在啟動後背景檢查。
    • 完成內容:scripts/package-release.ps1 會整理完整 runtime 與授權檔,再由 Inno Setup 產生一個 mySQLPunk-<version>-win-x64-setup.exe;GitHub workflow 只發布這個 EXE,重跑同一版本時會先刪除舊資產。程式下載更新後會優先使用 GitHub release asset 的 SHA-256 digest 校驗,不需要第二個 manifest;安裝程式採目前使用者安裝,能關閉執行中的 mySQLPunk、覆蓋更新並提供開始功能表與選用桌面捷徑。舊版 portable ZIP 與 manifest 邏輯仍保留,讓已發布版本可繼續更新。
    • 後續方向:可再加入 Windows 程式碼簽章與差分更新,降低 SmartScreen 提示並減少更新下載量。
  • MySQL / MariaDB 使用者管理 Phase 2 ✅ 已完成

    • Provider Adapter 會讀取 SELECT VERSION()、SHOW COLUMNS FROM mysql.user 與 MariaDB mysql.global_priv,不會直接假設 MySQL 8 欄位存在;MariaDB JSON metadata 只取需要的欄位,不顯示驗證雜湊。
    • User List 與 Detail/DDL 顯示 User、Host、Plugin、密碼狀態、Lock、Expire、SSL、resource limits、版本、註解與完整 SHOW GRANTS;SHOW CREATE USER 會移除驗證內容後再顯示。
    • 支援 Create / Alter / Rename / Drop、密碼、Plugin、Lock / Unlock、Expire、SSL、resource limits,以及 Database / Table / View / Function / Procedure 的 Grant / Revoke;所有操作先顯示 SQL Preview,權限畫面會讀取並預選目前 target 的權限。
    • MySQL 5.6 缺少現代 ALTER USER 能力時會使用 SET PASSWORD 等安全 fallback,無法支援的 Lock/Expire/Plugin 操作會停用或明確回報,不會送出已知無效 SQL。
    • 同名但 Host 不同的帳號會以 user@host 分開顯示與操作;provider 回傳 status=NO 時會停止後續 statement 並回報失敗,不再誤顯示完成。
    • Windows smoke test 會驗證 provider SQL、權限解析、UI 預選與失敗判定;Docker 實機矩陣已覆蓋 MySQL 5.6 / 5.7 / 8.0、MariaDB 10.6 / 10.11 / 11.4 的完整 CRUD 與權限流程。
  • MySQL 完整匯出 / 匯入 ✅ 已完成

    • 匯出選項可分頁勾選 Table、View、Function/Procedure、Trigger,並選擇結構、資料、DROP、CREATE DATABASE、USE、DEFINER、外鍵檢查與 INSERT batch size。
    • 大型匯出會直接以 UTF-8 without BOM 串流寫入檔案,不會先把整份 SQL 留在記憶體;每批資料與每個物件都會更新中央遮罩進度視窗。
    • Table 結構沿用 provider 的 SHOW CREATE TABLE,可保留索引、外鍵、AUTO_INCREMENT、charset/collation、資料表與欄位註解;資料會安全處理 NULL、特殊字元、中文/emoji、日期、decimal 與 BLOB hex。
    • View、Function、Procedure、Trigger 支援移除 DEFINER 與 DELIMITER;匯入會逐段串流解析,並可選照 SQL 執行、刪除後重建、只建立不存在物件、略過既有物件及資料。
    • Windows smoke 與 Docker 實機矩陣已覆蓋 MySQL 5.6 / 5.7 / 8.0、MariaDB 10.6 / 10.11 / 11.4 的完整 round-trip。
  • Database Tree inline rename ✅ 已完成

    • Database、Table、View 節點可用 F2 或右鍵進入 inline rename;Enter 執行、Esc 只取消改名,不會繼續觸發關閉連線。
    • MySQL 會使用完整 SHOW CREATE SQL 串流複製 Table、資料、View、Function、Procedure、Trigger,保留 charset、索引、外鍵與註解,並明確保留舊 database;DDL 中的 database qualifier 會安全改成新名稱。
    • PostgreSQL、SQL Server 使用原生 rename;SQLite 會關閉連線、移動檔案、更新 connection string 與 profile path,再重新開啟資料庫。
    • 改名在背景執行,中央遮罩進度視窗會顯示目前物件;成功後刷新並選取新節點,失敗會保留 provider、原名稱、新名稱與原因。
    • Windows keyboard smoke、SQLite 實體檔案,以及 PostgreSQL 17、SQL Server 2022、六個 MySQL/MariaDB 版本均已實際驗證。
  • 連線群組與物件群組顯示 ✅ 已完成

    • 觸發位置:左側樹狀清單空白處右鍵選單的「新增群組」,以及連線/群組節點右鍵選單的群組操作項目。
    • 完成內容:
      • 連線支援 conn_group 欄位,儲存與讀取已整合至 setting.ini。
      • 左側樹狀清單以群組節點分類顯示連線。
      • 右鍵選單支援「移至群組」、「移出群組」、「重新命名群組」、「刪除群組」。
      • 語系文字已補齊。
    • 備註:資料庫物件分類可由「檢視 > 顯示 > 隱藏物件群組」切換成扁平顯示;Tables / Views / Functions / Users / Events / Queries 的子物件會直接掛在 database 節點下,Backups / Models / BI / Other / Reports 這類操作入口仍保留群組,避免功能入口消失。
  • 多連線設定檔 ✅ 已完成

    • 觸發位置:連線根節點右鍵選單的「切換連線設定檔」。
    • 完成內容:
      • 保留既有 setting.ini 作為預設設定檔,不破壞舊版連線資料。
      • 新增的連線設定檔會儲存在 connection_profiles/*.json,目前作用中的設定檔記錄於 connection-profile.txt。
      • 右鍵選單可查看目前設定檔、切換既有設定檔,或新增空白設定檔並立即切換。
      • 支援複製目前設定檔;非預設設定檔可重新命名或刪除,刪除目前設定檔後會切回預設設定檔。
      • 切換設定檔前會先儲存目前設定並關閉已開啟的連線,避免跨 profile 共用舊連線狀態。

Provider 與資料庫操作限制

  • Provider 功能支援表 ✅ 已語系化

    • 現況:其它 > 功能支援 會依目前連線列出資料表、檢視、可編輯資料表資料、SQL 匯入/匯出、備份、Stored Functions 與 Triggers/Events 的支援狀態。
    • 完成內容:功能名稱、支援/不支援狀態、已載入數量、SQLite 備份方式、邏輯 SQL dump、SQLite 不儲存 database routines 等說明,以及 Other 清單中的工具描述已改用繁中/英文語系字串;SQLite 新增函式 SQL 範本中的限制註解也會依目前語系顯示,保留 SELECT 1; 作為可執行 fallback。
  • 維護檢查表 ✅ 已語系化

    • 現況:其它 > 維護檢查 會列出連線狀態、資料表/檢視載入數、備份目標、開啟中的查詢分頁與最大資料表。
    • 完成內容:檢查項目、正常/警告/資訊狀態、資料表/檢視/分頁數量、最大資料表列數與無資料表 fallback 都會依繁中/英文語系切換。
  • 連線診斷表 ✅ 已語系化

    • 現況:其它 > 連線診斷 會列出 provider、連線狀態、資料庫、物件數量、備份來源與 SQLite/SpatiaLite runtime 狀態。
    • 完成內容:診斷項目、就緒/警告狀態與 SpatiaLite 載入狀態已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 模型總覽表 ✅ 已語系化

    • 現況:模型 > Schema Overview 會列出資料表與檢視的欄位數、索引數、列數與狀態。
    • 完成內容:物件類型、就緒狀態與 Models 清單描述已改用語系字串,繁中會顯示「資料表 / 檢視 / 就緒」,英文維持 Table / View / Ready。
  • 模型欄位與索引目錄 ✅ 已語系化

    • 現況:模型 > Column Catalog 會列出資料表/檢視欄位,模型 > Index Catalog 會列出索引或無明確索引狀態。
    • 完成內容:欄位目錄的物件類型、索引目錄的無索引 fallback 與 Models 清單描述已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 報表與 BI 物件類型 ✅ 已語系化

    • 現況:查詢 > Object Inventory、Table Row Counts、BI > Object Distribution 與 BI > Row Count Ranking 會顯示物件類型、分類與就緒狀態。
    • 完成內容:資料表/檢視類型、就緒狀態、物件分布分類、備份來源/目標類型,以及 BI / Reports 清單描述已改用語系字串,繁中與英文介面都會顯示一致文字;列數查詢失敗時也會用目前語系顯示未知錯誤 fallback,避免空白例外讓狀態欄沒有可讀回饋。
  • 資料庫群組清單 ✅ 已修正並語系化

    • 現況:左側資料庫底下的 Views、Backups、Models、BI、Other、Queries、Reports 等群組會在右側清單顯示對應項目。
    • 完成內容:群組清單會正確指定到右側資料表資料來源;檢視、模型、其它、查詢、報表、SQL 備份、缺少來源、空白、就緒狀態與描述欄位已改用語系字串。
  • 資料庫搜尋結果 ✅ 已語系化

    • 現況:資料庫搜尋會列出符合關鍵字的資料表、檢視與欄位結果。
    • 完成內容:搜尋結果的類型與位置已改用語系字串,繁中會顯示「資料表 / 檢視 / 欄位」,英文維持 Table / View / Column。
  • 查詢歷程類型 ✅ 已語系化

    • 現況:查詢歷程會列出執行時間、資料庫、類型、狀態、列數、耗時與 SQL 預覽。
    • 完成內容:類型欄的查詢與命令已改用語系字串,繁中會顯示「查詢 / 命令」,英文維持 Query / Command。
  • 物件細節面板類型 ✅ 已語系化

    • 現況:右側資訊面板會在檢視、模型、BI、其它工具與報表細節中顯示物件類型。
    • 完成內容:細節面板的 View、Model、BI、Other、Report 類型已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 物件細節面板標題 ✅ 已語系化

    • 現況:右側資訊面板標題會顯示目前選取的資料庫、群組、資料表、檢視、事件、函式、使用者、模型、BI、其它工具、報表或搜尋範圍。
    • 完成內容:標題類型與分隔符已改用共用語系 helper,繁中會顯示全形冒號,英文會維持半形冒號,並已納入 smoke test 覆蓋。
  • 物件細節面板屬性列 ✅ 已語系化

    • 現況:右側資訊面板的屬性表會顯示資料庫資訊、資料表狀態、檢視、事件、函式、使用者、模型、BI、其它工具與報表的欄位名稱。
    • 完成內容:屬性 / 值欄位標題,以及字元集、列數、引擎、回傳型別、主機、來源、資料庫、Provider 等屬性名稱已改用語系字串,繁中與英文介面都會顯示一致文字,並已納入 smoke test 覆蓋。
  • 物件細節面板語系切換刷新 ✅ 已補齊

    • 現況:右側資訊面板的資訊 / DDL 切換按鈕與屬性表欄位標題會隨目前語系顯示。
    • 完成內容:細節面板工具列按鈕文字與屬性 / 值欄位標題已接到 ApplyLanguage(),切換繁中 / 英文後會立即刷新,並已納入 smoke test 覆蓋。
  • 物件細節面板錯誤訊息 ✅ 已語系化

    • 現況:右側資訊面板載入資料表、檢視、事件、函式與使用者細節時,可能顯示載入失敗或找不到物件訊息。
    • 完成內容:載入失敗與事件 / 函式 / 使用者找不到訊息已改用語系字串,繁中與英文介面都會回饋一致文字。
  • 物件細節面板 DDL 註解標頭 ✅ 已語系化

    • 現況:右側 DDL / 文字面板會替使用者、模型、BI、其它工具與報表顯示註解式標頭與描述。
    • 完成內容:User / Model / BI / Other / Report 標頭、來源與狀態欄位標籤已改用物件類型與屬性語系字串,繁中與英文介面都會顯示一致文字,並已納入 smoke test 覆蓋。
  • 資料庫與 Table Designer metadata 載入失敗 ✅ 已語系化

    • 現況:展開資料庫載入 metadata、Table Designer 載入既有資料表欄位 metadata 時,失敗訊息會顯示在狀態列或錯誤對話框。
    • 完成內容:database metadata 載入失敗、欄位 metadata 載入失敗與 metadata 錯誤對話框標題已改用語系字串,繁中與英文介面都會顯示一致文字,並保留 provider 原始錯誤方便排查。
  • 我的最愛狀態列訊息 ✅ 已語系化

    • 現況:加入、移除、開啟、找不到與清除我的最愛時會在主視窗狀態列顯示操作結果。
    • 完成內容:上述狀態列訊息已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 主視窗狀態列操作回饋 ✅ 已語系化

    • 現況:SQLite + SpatiaLite 連線成功、查詢歷程載入、SpatiaLite runtime 修復腳本啟動、查詢分頁開啟與資料庫群組缺失等流程會在主視窗狀態列顯示操作回饋。
    • 完成內容:上述狀態列訊息已集中改用語系 helper,繁中與英文介面都會依目前語系顯示一致文字,並已納入 smoke test 覆蓋。
  • 查詢分頁右鍵選單 ✅ 已語系化

    • 現況:查詢分頁可透過右鍵選單浮動 / 取消停靠或關閉。
    • 完成內容:浮動 / 取消停靠選單文字已改用語系字串,繁中與英文介面都會依目前語系顯示一致文字,並已納入 smoke test 覆蓋。
  • 資料表資料底部工具列提示 ✅ 已語系化

    • 現況:資料表資料模式底部工具列以符號按鈕提供新增、刪除、儲存、取消、重新整理與分頁操作。
    • 完成內容:底部工具列按鈕已補上繁中 / 英文 tooltip,切換語系或關閉「顯示工具提示」後會立即刷新,並已納入 smoke test 覆蓋。
  • 全域錯誤與 BLOB 串流進度回饋 ✅ 已語系化

    • 現況:UI 執行緒、背景執行緒未處理例外會顯示全域錯誤對話框;資料表模式匯出大型 BLOB 時會在查詢視窗狀態列顯示串流進度。
    • 完成內容:全域錯誤標題、UI/背景錯誤訊息與 BLOB 串流匯出進度已改用語系字串,繁中與英文介面都會依目前語系顯示一致文字,並已納入 smoke test 覆蓋。
  • 關於視窗內容 ✅ 已語系化

    • 現況:說明 > 關於 會以自訂視窗顯示版本、平台、支援連線、作者資訊與看板娘 Punky 崩琦眨眼動畫。
    • 完成內容:產品定位、版本、平台、支援連線、作者標題、看板娘標題與副標已改用語系字串,繁中與英文介面都會依目前語系顯示一致文字;動畫以約 16 fps 透明 GIF 打包進 image/ 並已納入 smoke test 覆蓋。
  • 連線失敗與重試提示 ✅ 已語系化

    • 現況:MySQL、PostgreSQL、SQLite、Oracle 與 SQL Server 連線失敗時會顯示錯誤原因,暫時性錯誤也會詢問是否重試一次。
    • 完成內容:連線失敗訊息與重試提示已改用共用語系 helper,繁中與英文介面都會依目前語系顯示一致文字,並已納入 smoke test 覆蓋。
  • 連線編輯視窗 ✅ 已語系化

    • 現況:MySQL、PostgreSQL、Oracle、SQLite 與 SQL Server 連線編輯 / 新增視窗會顯示分頁、欄位標籤、測試連線、確定與取消等控制項。
    • 完成內容:上述五個 provider 的連線表單已補齊繁中 / 英文控制項文字,Oracle 的 Service Name、Net Service Name 等欄位也已改為可語系化顯示;測試連線與 SQLite 初始化失敗會保留明確錯誤原因,若 provider 例外沒有明確訊息則依目前語系回退為「未知錯誤 / Unknown error」,並已納入 smoke test 覆蓋實際表單控制項與錯誤訊息。
  • 備份狀態列與未知錯誤 fallback ✅ 已語系化

    • 現況:備份建立 / 失敗與 SQL 執行未知錯誤 fallback 會顯示在狀態列或例外訊息中。
    • 完成內容:備份建立含路徑、備份失敗與未知錯誤 fallback 已改用語系字串,繁中與英文介面都會顯示一致文字;主視窗刪除 Table/View/Function、刪除資料庫、建立資料庫、SQL 匯出、Rename/Copy、資料產生載入資料表、資料產生寫入、資料庫補註解、更新檢查、連線匯入信任來源、SQLite 欄位註解匯入/匯出、備份還原、還原內容掃描報表、隔離備份還原、連線分享、命令列開啟與備份完整性排程失敗時,也會把缺少或空白的 provider / exception reason 回退成語系化未知錯誤;service/helper 層的 metadata 載入、跨 provider View 建立 fallback、隔離備份批次還原、隔離備份還原預覽、備份完整性排程報表、SpatiaLite manifest 診斷與資料列衝突重查失敗也已共用同一套例外原因 fallback,避免前端只顯示空白原因。
  • Provider SQL 執行失敗 fallback ✅ 已語系化

    • 現況:MySQL、PostgreSQL、SQL Server、Oracle 與 SQLite provider 執行 SQL 失敗但底層沒有回傳 reason 時,會以通用錯誤訊息回報前端。
    • 完成內容:五個 provider 已改用共用 SQL 執行結果 helper,保留 provider 原始 reason;缺少 reason 或 reason 為空白時會依目前語系顯示 fallback 訊息;provider catch 區塊也會先正規化例外原因,SQLite 查詢錯誤與 SpatiaLite 載入錯誤會共用同一套未知錯誤 fallback,並已納入 smoke test 覆蓋。
  • 備份服務層錯誤訊息 ✅ 已語系化

    • 現況:還原備份、遠端備份副本與刪除前備份封存服務會檢查備份檔案是否存在,以及 SQL / ZIP 備份是否可還原。
    • 完成內容:備份來源路徑缺失、SQLite 刪除前備份輸出路徑缺失、找不到備份檔案、空 SQL 備份與 ZIP 內沒有 SQL 項目的錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 連線匯出/匯入與 SQL 匯入錯誤 ✅ 已語系化

    • 現況:匯入連線設定前會先建立差異預覽,來源檔不存在時會回報錯誤;連線匯出/匯入與 SQL 匯入若底層例外沒有明確訊息,也需要避免前端只顯示空白原因。
    • 完成內容:連線匯入預覽缺少來源檔的錯誤已改用語系字串;連線匯出、連線匯入與 SQL 匯入的錯誤對話框/狀態列會保留明確例外訊息,缺少或空白時依目前語系回退為「未知錯誤 / Unknown error」,繁中與英文介面都會顯示一致文字。
  • 匯出與診斷 service 參數錯誤 ✅ 已語系化

    • 現況:資料庫備份匯出、查詢結果匯出、BLOB 串流匯出、SpatiaLite runtime 修復與 SQLite 欄位註解 XLSX 匯入會在缺少必要路徑或來源檔時回報錯誤。
    • 完成內容:輸出目標路徑必填、SQL 必填、SpatiaLite 修復腳本不存在與 SQLite 欄位註解 XLSX 檔案不存在等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 更新、註冊、連線能力與串流匯出錯誤 ✅ 已語系化

    • 現況:應用程式更新檢查、進階註冊、連線能力測試與串流匯出會在缺少 GitHub/release/下載路徑參數、應用程式路徑、proxy 測試失敗或遇到不支援格式/provider 時回報錯誤。
    • 完成內容:GitHub owner / repository、Release JSON、下載資料夾、檔案路徑、應用程式路徑、進階註冊套用失敗、proxy 連線測試失敗、串流匯出格式與 provider 不支援等錯誤已改用語系字串;若進階註冊或 proxy 測試例外沒有明確原因,會依目前語系回退為「未知錯誤 / Unknown error」,繁中與英文介面都會顯示一致文字。
  • 連線設定檔管理錯誤 ✅ 已語系化

    • 現況:複製、重新命名或刪除連線設定檔時,底層會阻擋覆蓋預設設定檔、重新命名預設設定檔與刪除預設設定檔。
    • 完成內容:預設設定檔已存在、不可重新命名、不可刪除與設定檔已存在等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 連線開啟與物件複製錯誤 ✅ 已語系化

    • 現況:連線開啟 service 會透過 provider factory 建立資料庫物件;Table/View 複製服務會檢查來源/目標連線、物件類型、來源欄位與 View DDL。
    • 完成內容:資料庫建立器未回傳連線物件、來源或目標資料庫未連線、只支援複製 Table/View、來源資料表沒有可複製欄位、View DDL 無法取得,以及複製流程進度與 fallback 訊息已改用語系字串,繁中與英文介面都會顯示一致文字。
  • Provider View DDL 解析錯誤 ✅ 已語系化

    • 現況:MySQL、PostgreSQL、SQL Server、Oracle 與 SQLite provider 會在複製 View、重新命名 View 或跨 provider 建立 View 時解析來源 View DDL。
    • 完成內容:空 View DDL 與各 provider View DDL 解析失敗已改用語系字串,繁中與英文介面都會顯示一致文字,並已納入 smoke test 覆蓋壞 DDL 的實際例外路徑。
  • 跨 Provider View SQL 轉換原因 ✅ 已語系化

    • 現況:跨 provider 複製 View 時,SQL 方言轉換無法安全處理會回報 fallback 原因,並改用 table snapshot。
    • 完成內容:SELECT 解析失敗、LIMIT/OFFSET、ROWNUM、TOP、Oracle 階層查詢、MySQL 專用語法、REGEXP 與 JSON_TABLE 等轉換原因已改用語系字串,繁中與英文介面都會顯示一致文字,並已納入 smoke test 覆蓋。
  • Metadata 載入與匯入審核紀錄錯誤 ✅ 已語系化

    • 現況:資料庫展開時會分段載入 Tables、Views、Functions、Users 與 Events;連線匯入完成後會寫入本機 JSONL 審核紀錄。
    • 完成內容:各 metadata 分類載入失敗與匯入審核紀錄路徑缺失等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字,並保留 provider 原始錯誤訊息方便排查。
  • Geometry / WKB 解析錯誤 ✅ 已語系化

    • 現況:資料表結果中的 geometry 欄位可轉成 WKT,底層 WKB / SpatiaLite 解析器會檢查 byte order、geometry type、collection、polygon ring 與資料長度。
    • 完成內容:WKB byte order 無效、不支援 geometry 類型、SpatiaLite marker 無效、資料提前結束與集合/點/環數量過大等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • SQLite 專用物件精靈驗證錯誤 ✅ 已語系化

    • 現況:SQLite FTS / RTree / SpatiaLite 精靈會檢查 virtual table 名稱、欄位、RTree min/max 維度欄位與 spatial index 目標。
    • 完成內容:欄位必填、物件名稱必填與 RTree 維度欄位需成對等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • SQLite 專用物件精靈執行失敗 fallback ✅ 已語系化

    • 現況:SQLite FTS / RTree / SpatiaLite 精靈直接執行 SQL 時,若 provider 沒有回傳 reason,會顯示通用錯誤原因。
    • 完成內容:精靈執行失敗已改用共用 SQL 執行結果 helper,保留 provider 原始 reason;缺少 reason 或 SQL 預覽/執行例外沒有明確訊息時,會依目前語系顯示「未知錯誤 / Unknown error」,並已納入 smoke test 覆蓋。
  • 備份排程與還原報表資料夾錯誤 ✅ 已語系化

    • 現況:備份完整性排程會輸出驗證報表並可隔離異常備份,還原差異檢查會輸出內容掃描報表。
    • 完成內容:備份完整性報表資料夾、備份隔離資料夾與還原內容掃描報表資料夾缺失等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • SQLite 欄位註解審核報表資料夾錯誤 ✅ 已語系化

    • 現況:SQLite 欄位註解匯入前會建立新增、更新、移除與不變的審核報表。
    • 完成內容:審核摘要與審核報表輸出資料夾缺失錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • SQLite 欄位註解交換解析錯誤 ✅ 已語系化

    • 現況:SQLite 欄位註解交換支援 JSON、XLSX、CSV、YAML 與 CLI 自動化匯入/匯出,會檢查必要參數、來源內容、欄位標題、工作表與 provider 類型。
    • 完成內容:CLI 參數缺值、必要參數缺失、SQLite 資料庫路徑缺失、空 JSON/CSV/YAML、無可用註解、CSV/XLSX 欄位或工作表缺失、非 SQLite 連線與輸入/輸出路徑缺失等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字;CLI 執行期間若遇到空白例外原因,也會回退成目前語系的未知錯誤,避免命令列結果只有空字串。
  • 自動註解字典錯誤 ✅ 已語系化

    • 現況:Table Designer 會下載遠端自動註解字典,也支援匯入、匯出、預覽與命名版本管理。
    • 完成內容:遠端字典空資料、字典格式錯誤、遠端載入失敗改用本機快取、未知錯誤、匯入/預覽來源路徑與匯出目標路徑缺失等錯誤已改用語系字串,繁中與英文介面都會顯示一致文字。
  • 命令列介面依賴本機 CLI ✅ 偵測、匯入預覽與匯入後補密碼已補齊

    • 現況:右鍵選單會依 provider 產生 mysql、psql、sqlcmd、sqlite3 或 sqlplus 指令並開啟命令提示字元。
    • 完成內容:
      • 已加入 CLI 可用性偵測(先透過 where.exe,再掃描 PATH)。找不到時會顯示安裝說明連結,不會直接開啟空白終端機。
      • 選項 > 環境 可自訂 MySQL、PostgreSQL、SQL Server、Oracle、SQLite CLI 執行檔路徑;未設定時仍會使用 PATH。
      • 已補上密碼傳遞策略:MySQL、PostgreSQL、SQL Server 會透過 MYSQL_PWD、PGPASSWORD、SQLCMDPASSWORD 環境變數傳給 CLI,不把密碼寫進命令列參數;未儲存密碼時仍會保留 CLI 互動式密碼提示。Oracle sqlplus 目前仍採互動式密碼輸入,避免把密碼放進連線字串。
      • 連線密碼會儲存在 Windows Credential Manager;舊版 setting.ini / profile JSON 中的加密 pwd 會在讀取時自動遷移到 credential,並重寫設定檔清空 pwd。編輯連線時若清空密碼欄位,會同步清除對應 credential。
      • 未儲存密碼時,MySQL、PostgreSQL、SQL Server 會在開啟 CLI 前顯示一次性密碼輸入框;輸入的密碼只放入本次 process environment,不會回寫到連線設定或設定檔。
      • 匯入連線設定前會顯示差異預覽,依新增、更新、不變與只存在目前設定分類;使用者可選擇整包取代,也可只合併勾選的匯入連線,保留未勾選與本機既有連線;匯出的連線 JSON 會附帶來源 ID 與 SHA-256 來源簽章,匯入預覽會顯示簽章是否有效,並可將已確認的匯出來源加入本機信任來源白名單,方便辨識檔案是否被修改與是否來自已信任來源;預覽摘要也會附上團隊審核資訊,集中列出來源信任狀態、新增/更新筆數、本機只存在筆數、需補密碼筆數、匯入群組與變更目標,方便多位維護者在合併或取代前檢查;完成取代或合併後會把匯入動作、來源簽章狀態、選取項目、變更目標、匯入群組與需補密碼數寫入本機 JSONL 審核紀錄 connection-import-review-log.jsonl,方便事後追蹤。
      • 匯入連線設定後,若偵測到 MySQL、PostgreSQL、Oracle 或非 Windows 驗證的 SQL Server 連線缺少密碼,會詢問是否開啟批次補密碼視窗;使用者可一次補多筆密碼,密碼只會寫入 Windows Credential Manager,不會出現在匯入檔或設定檔明文中。
    • 後續方向:若要進一步強化跨機匯入,可再將本機 JSONL 審核紀錄同步到集中式儲存或簽核系統,讓多位維護者跨機追蹤誰已審核匯出來源。
  • 部分連線類型尚未支援編輯 ✅ 已完成

    • 現況:MySQL、PostgreSQL、Oracle、SQLite、SQL Server 五種 provider 均有對應的編輯表單(template form)。
    • 完成內容:已修正編輯連線後 conn_group 欄位消失的問題——update_connection 現在會自動保留原連線的群組歸屬。
    • 後續方向:非上列 provider 的連線(未來擴充)仍會顯示「此連線類型尚未支援編輯」。
  • 由主機節點新增/刪除資料庫只支援部分 provider ✅ 高風險刪除備份、壓縮封存、還原入口與保留上限已補齊

    • 現況:MySQL、PostgreSQL、SQL Server 支援從連線節點新增 / 刪除資料庫。
    • 完成內容:
      • Oracle:新增資料庫會開啟 Oracle Schema 精靈,輸入使用者、密碼、預設/暫存 Tablespace 後依序執行 CREATE USER、ALTER USER ... QUOTA 與常用物件建立權限 grant;需使用具備建立 user 權限的帳戶。
      • Oracle:刪除資料庫會使用 DROP USER ... CASCADE,執行前會先顯示高風險提示並要求再次輸入完整 Schema 名稱;SYS、SYSTEM、XDB、CTXSYS、MDSYS 等系統 Schema 會被阻擋。
      • SQLite:資料庫為獨立檔案;刪除時會解析連線檔案路徑、確認檔案存在且不是目錄,並要求再次輸入完整檔名後才會先建立刪除前備份,再關閉連線、清除 SQLite connection pool,並將 .sqlite、-wal、-shm、-journal 檔案移到資源回收筒;若檔案系統不支援資源回收筒,才會 fallback 成直接刪除。
      • MySQL / PostgreSQL / SQL Server / Oracle:刪除前會詢問是否先建立邏輯 SQL 備份,預設輸出到文件目錄的 mySQLPunk/pre-delete-backups;選擇備份時若建立失敗,刪除會中止,不會直接執行 DROP DATABASE 或 DROP USER ... CASCADE。
      • 刪除前備份建立成功後會自動封存為 .zip,zip 內保留原始 .sql 或 SQLite 備份檔名;封存成功後會移除未壓縮暫存檔,並在同目錄保留最近 20 份 *_before_delete_*.zip,降低備份目錄長期膨脹風險。
      • 還原支援:資料庫與 Backups 節點右鍵可開啟「還原備份」,支援 .sql 與含 .sql 的 .zip;還原前會顯示 SQL 語句數、大小與目標資料庫,確認後會先建立還原前快照並壓縮保存到 mySQLPunk/pre-restore-backups,快照成功後才沿用 SQL 匯入執行器套用;還原完成後會比較還原前後的資料表、檢視、函式/程序與事件/Trigger 數量,並列出新增/移除的物件名稱;資料表列數與欄位 metadata 可用時,也會列出資料列數差異、欄位新增/移除與型別/NULL/DEFAULT/註解變更,讓使用者立即看到資料量、物件與 schema 摘要變化。
      • 遠端副本支援:選項 > 檔案位置 可設定遠端備份資料夾與保留份數;每次建立備份成功後會自動複製一份到該資料夾,適合 NAS、雲端同步資料夾或團隊共享磁碟;若同名檔案已存在,會自動加上流水號避免覆蓋,並只清理 mySQLPunk 產生樣式的舊備份檔,避免誤刪同資料夾其它檔案。
      • 完整性驗證:備份建立後會立即驗證本機檔案;SQL 備份需有可執行語句,ZIP 備份需包含可讀 SQL 或 SQLite 備份,SQLite 備份會執行 PRAGMA integrity_check;若有遠端副本,也會在複製後驗證副本,驗證失敗會回報錯誤。
      • 定期排程:選項 > 檔案位置 可開關「定期驗證備份完整性」並設定驗證間隔;主程式啟動後會在背景檢查本機刪除前備份、還原前快照與遠端副本資料夾,驗證結果只顯示在狀態列,不跳出干擾式通知;每次排程也會輸出 JSON 報表到文件目錄的 mySQLPunk/backup-integrity-reports,方便追查異常備份。
      • 異常隔離:選項 > 檔案位置 可選擇驗證失敗時自動隔離異常備份,並設定隔離區保留份數;開啟後排程會把失敗檔案移到文件目錄的 mySQLPunk/backup-quarantine,輸出隔離 manifest,並只清理 mySQLPunk 產生樣式的舊隔離檔,預設關閉以避免未經同意移動備份。
      • 隔離區還原入口:資料庫與 Backups 節點右鍵可開啟「還原隔離備份」,從 backup-quarantine 選擇被隔離的備份檔,若 manifest 保留原始路徑會預填還原位置;移回前會顯示隔離檔路徑、原始路徑、大小、二次完整性驗證結果與目標檔案差異預覽(原始路徑是否存在、大小變化與是否需覆蓋確認),還原動作只把備份檔移回指定位置,不會直接灌入資料庫,使用者可先檢查檔案後再走既有「還原備份」流程;也可使用「批次還原隔離備份」把有原始路徑的隔離檔移回原處,目標檔已存在時會略過不覆蓋;還原預覽、略過原因與不支援檔案類型等錯誤訊息會依目前語系顯示。
    • 完成內容:還原摘要已包含物件數、資料列數、欄位 schema 差異,且摘要標題、差異類型、欄位變更、內容指紋、比對/抽樣覆蓋列數與缺值文字都會依繁中/英文語系切換;資料表會在還原前後建立順序無關的 SHA-256 內容指紋,即使列數不變但資料值被改動,也會在「資料內容差異」中標示變更的資料表。內容指紋改用 provider 分頁讀取,每頁先計算 row hash 再組成摘要,避免一次把大型資料表整批載入記憶體;選項 > 檔案位置 可設定內容指紋最多抽樣列數,預設 10000 列;還原完成後也會輸出 JSON 內容掃描報表到文件目錄的 mySQLPunk/restore-content-scan-reports,保留每張資料表的列數、抽樣列數、是否完整比對與前後 SHA-256 指紋,方便事後稽核。
    • 後續方向:若需要更完整的資料保護,可再加入指定主鍵範圍或背景排程完整掃描。
  • SQLite 欄位註解不支援 ✅ sidecar metadata 與交換格式已補齊

    • 現況:SQLite 本身沒有欄位註解語法,因此 mySQLPunk 會使用 __mysqlpunk_column_comments sidecar metadata table 保存欄位註解。
    • 完成內容:SQLite provider 讀取欄位時會合併 sidecar 註解;Table Designer 新增/修改/重建資料表與資料庫/資料表補註解流程都會寫入 sidecar metadata。
    • 匯出支援:SQL Dump 的結構匯出會附帶 sidecar table 建立語句與目前資料表的欄位註解 INSERT OR REPLACE,跨環境還原後可保留 mySQLPunk 欄位註解;SQLite 資料庫、Tables 節點與單一資料表右鍵可匯出 / 匯入專用欄位註解 JSON、XLSX、CSV、YAML,匯入時會建立 sidecar table 並覆蓋匯入範圍內資料表的註解;XLSX 匯出模板會包含 provider、database、table、column、type、not_null、default_value、comment 欄位,方便人工審核或交給外部工具補註解;CLI 可用 --sqlite-comments-export --database <sqlite> --output <json|xlsx|csv|yaml> [--table <name>] 與 --sqlite-comments-import --database <sqlite> --input <json|xlsx|csv|yaml> [--table <name>] 進行自動化交換;匯入也支援第三方扁平陣列 JSON(table / column / comment)、table 內 columns 陣列格式、table,column,comment CSV、含額外輔助欄位的 XLSX 工作表與簡化 YAML comments 清單,並接受 object_name / field_name / comment_text、entity / attribute / note 等常見第三方模板別名,方便外部工具轉接;匯入前會比對目前 sidecar 註解與匯入內容,顯示新增、更新、移除與不變摘要,匯入成功後會輸出 JSON 審核報告到文件目錄的 mySQLPunk/sqlite-column-comment-import-reviews,方便追蹤實際覆蓋內容。
    • 後續方向:若需要和其它 SQLite 工具深度整合,可再把審核報告接到外部簽核或共同維護平台。
  • SpatiaLite extension 可能載入失敗 ✅ 診斷資訊與修復指引已補齊

    • 現況:SQLite provider 會嘗試載入 SpatiaLite;環境缺少 extension 時會顯示載入錯誤。tools/spatialite/Build-SpatiaLiteRuntime.ps1 可從官方原始碼重建 runtime,mySQLPunk.csproj 也會明確複製 SQLite.Interop.dll 的 x64/x86 runtime。
    • 完成內容:
      • 載入失敗訊息已改用語系化字串(Connection.SpatiaLiteLoadFailed),並同步更新狀態列,降級行為更清楚;初始化 SpatiaLite metadata、未開啟 SQLite 連線、runtime 目錄缺失與 mod_spatialite.dll 缺失等診斷訊息也會依目前語系回饋。
      • 其它 > 連線診斷 會顯示 SpatiaLite runtime 目錄、mod_spatialite.dll 路徑、載入狀態與版本資訊;若 extension 未載入,也會顯示 runtime manifest、manifest 來源摘要、manifest runtime 檔案 SHA-256/大小校驗結果、官方來源 zip 快取、離線來源包、建置腳本路徑、可直接執行的 PowerShell 修復命令、偏好快取/離線包的修復命令、修復 log 路徑、缺少 DLL 與目前載入錯誤,且 Ready / Warning / Info 狀態欄與來源快取、離線包、manifest 來源、檔案校驗摘要、修復指南等診斷細節會依目前語系顯示,方便依 tools/spatialite/Build-SpatiaLiteRuntime.ps1 從 Gaia-SINS 官方 libspatialite-5.1.0.zip 來源重建 runtime;建置腳本會把下載成功的來源 zip 快取到 tools/spatialite/cache,也可用 -PreferCachedSource 或 -OfflinePackagePath 在離線環境重建;提交版 SPATIALITE_RUNTIME_MANIFEST.json 會用 built_at_utc / build_tool / files[].bytes 格式記錄 runtime binary/proj data,README 與第三方 notice 這類易受換行格式影響的文字檔不列入 manifest;smoke test 會直接驗證每個 manifest 檔案存在且 SHA-256/bytes 與實際檔案一致,並確認不包含 sqlite3.exe、libreadline8.dll、libtermcap-0.dll;在連線診斷表格雙擊 SpatiaLite Repair Command 會直接開啟 PowerShell 執行建置腳本,並用 Tee-Object 將進度輸出寫入文件目錄的 mySQLPunk/spatialite-repair-logs;修復腳本結束後會重置目前 SQLite provider 的 SpatiaLite 載入狀態、重新嘗試載入 extension,並刷新連線診斷表格與狀態列。
    • 後續方向:若需要更完整的部署體驗,可再加入預先打包的 runtime release 檔與自動校驗下載。

Table Designer 限制

  • 自動補註解字典為遠端服務,可能受網路影響 ✅ 本機快取、匯入匯出、逐項差異預覽、命名字典版本比較與回復已補齊

    • 現況:Table Designer 的「補註解」會載入遠端字典對照表;成功載入後會保存到本機快取。
    • 完成內容:若網路/站台/SSL 等因素導致遠端載入失敗,會在重試後改用上次成功的本機快取,避免補註解功能完全不可用;若遠端例外沒有提供錯誤文字,狀態與警告會依目前語系顯示「未知錯誤 / Unknown error」而不是空白原因;補註解進度視窗會標示目前使用的是遠端字典、本機快取、匯入字典或已命名字典;Table Designer 的補註解下拉選單可手動匯入 / 匯出 JSON 字典檔,方便離線環境或團隊共用欄位註解對照;匯出的字典會包含 version、exportedAtUtc、source、entryCount 與 signatureSha256,匯入仍相容舊版純 key/value JSON;匯入前會顯示新增、更新、移除與不變項目的摘要與逐項表格,也會顯示字典來源簽章是否有效,使用者可檢查每個欄位的目前註解與匯入註解,確認後才覆蓋本機字典;也可以將目前字典另存為命名字典,之後直接從下拉選單切換、重新命名或刪除;同名命名字典被覆蓋前會自動保留上一版,使用者可從下拉選單比較歷史版本差異,確認後回復指定版本;匯入、匯出、保存、切換、重新命名、刪除、版本比較與版本回復失敗時,若例外原因空白也會回退成目前語系的未知錯誤,避免對話框只顯示空白原因。
    • 後續方向:若需要更完整的字典協作,可再加入審核流程或團隊共享來源。
  • 既有資料表修改仍有不支援情境 ✅ provider ALTER 與進階索引 smoke test 已補齊

    • 現況:部分 ALTER TABLE 操作會列入「目前不支援以下既有資料表變更」;PostgreSQL Table Designer 已支援 schema.table 形式的既有資料表 SQL 產生,不再固定套用 public schema;PostgreSQL / SQL Server / Oracle 的 FULLTEXT、SPATIAL 索引 SQL 產生已納入可重跑 smoke test。
    • 本輪補齊:約束分頁可載入 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 的外鍵與 CHECK 約束,新增、刪除或修改會先正規化名稱、欄位、參照目標與動作,再生成 provider 對應的 DDL;SQL Server 索引分頁也支援 PRIMARY/PATH/VALUE/PROPERTY XML 索引與父 XML 索引關係。
    • 本輪補齊:欄位屬性保留各 provider 的原始 metadata。MySQL/MariaDB 支援字元集、collation、generated expression/storage;PostgreSQL 支援 identity、generated expression、storage、compression、collation;SQLite 支援 generated expression/storage、collation;Oracle 與 Snowflake 支援 identity、虛擬欄位、collation,Oracle 另保留 DEFAULT ON NULL。可安全建立的屬性會進入 SQL 預覽;既有資料表無法安全 ALTER 的進階屬性會明確列為不支援,SQLite 若無法解析既有 generated expression 也拒絕重建,避免遺失 schema 設定。
    • 本輪補齊:SQLite 既有欄位型別、NULL 或 DEFAULT 變更需要重建表的限制說明已改用語系字串,繁中與英文預覽都會顯示一致原因。
    • 本輪補齊:MySQL 既有資料表沒有偵測到任何欄位或索引變更時,SQL 預覽的無變更註解已改用語系字串,繁中與英文介面都會顯示一致文字。
    • 本輪補齊:Table Designer 載入既有資料表索引 metadata 失敗時不再沉默吞錯,會顯示可理解的警告訊息,索引頁改以空白狀態開啟,欄位設計仍可繼續使用;若 provider 未提供錯誤原因,儲存失敗與索引 metadata 載入失敗的 fallback 也會依繁中/英文語系顯示「未知錯誤 / Unknown error」。
    • 本輪補齊:PostgreSQL provider 會列出非 public schema 的 Table/View、Function 與 Trigger,並讓欄位、索引、資料瀏覽、列數、複製建表、View DDL 與批次寫入等主要操作依 schema.table 產生正確 SQL;QueryForm 資料表新增/更新/刪除與 Form1 共用物件 SQL(開啟查詢、Drop、Dump/DDL、資料產生、補註解)也會依 schema.table 寫入正確 schema;Table Designer 欄位修改、註解、Primary Key 變更與索引刪除的 SQL 預覽也會依目前資料表 schema 產生正確物件名稱;新增 View / Function 範本會沿用目前選取物件的 schema,避免在非預設 schema 工作時又產生 public / dbo 範本。
    • 本輪驗證:新增 MySQL / PostgreSQL / SQL Server / Oracle / SQLite 既有資料表 ALTER smoke test,覆蓋欄位改名、型別變更、NULL / DEFAULT、註解、新增欄位、MySQL 刪欄位、外鍵/CHECK 約束、SQL Server XML 索引、跨資料庫欄位屬性,以及 SQLite 受限 ALTER 的重建表策略。
    • 後續方向:Primary Key 與 constraint 變更仍需依 provider 增加更多實機測試資料庫案例;進階索引已先以 SQL builder smoke test 固定語法輸出,後續仍可補實機建立/刪除案例。
  • FULLTEXT / SPATIAL 索引只支援部分 provider 與語法 ✅ 主要 provider 與 SQLite 專用精靈已補齊

    • 現況:Table Designer 支援 MySQL FULLTEXT/SPATIAL、PostgreSQL FULLTEXT GIN 與 SPATIAL GiST、SQL Server Full-Text / Spatial、Oracle CTXSYS/MDSYS 索引 SQL 產生;SQLite FTS virtual table、RTree 與 SpatiaLite spatial index 不混入一般索引 UI,改由 database 右鍵選單的專用精靈產生 SQL。
    • 完成內容:新增與修改資料表流程都會依 provider 產生對應 FULLTEXT/SPATIAL 語法;MySQL 既有資料表 ALTER 已補上 ADD SPATIAL INDEX,索引註解也會套用 MySQL 字串 escape;SQLite 專用精靈可產生 FTS5 virtual table、RTree virtual table 與 CreateSpatialIndex SQL,並可直接執行。
    • 測試覆蓋:tests/SmokeTests.cs 已涵蓋 FTS5、RTree、SpatiaLite spatial index SQL 產生與 RTree 維度欄位驗證。
  • SQL Server DEFAULT constraint 變更仍有限制 ✅ 已補齊

    • 現況:SQL Server 會把欄位 DEFAULT 存成 default constraint,修改時不能只用一般 ALTER COLUMN 覆蓋。
    • 完成內容:Table Designer 修改欄位 DEFAULT 時會先查 sys.default_constraints 找到實際 constraint name 後 drop,再以 DF_<table>_<column> 規則建立具名 DEFAULT constraint;SQL Server 預覽 SQL 分段執行時也會保留 DECLARE batch,避免變數 scope 被切壞。
    • Schema 支援:SQL Server provider 會列出所有 schema 的 Table/View;dbo 維持原表名顯示,非 dbo 會顯示為 schema.table。資料瀏覽、資料編輯、DDL/Dump、Table/View 複製、補註解與 Table Designer SQL 產生都會解析 schema,不再硬套 dbo。
  • Oracle Table Designer 對權限與物件狀態較敏感 ✅ 預覽提示、權限診斷 SQL、逐步確認清單與高風險二次確認已補齊

    • 現況:已有多種診斷提示,例如權限不足、物件不存在、跨 schema 權限、語法不符。
    • 完成內容:Oracle SQL 預覽會在可執行 SQL 前加入註解提示,標示目標物件、直接授權需求(ALTER / CREATE INDEX / DROP / COMMENT 等)與分段執行方式;預覽註解也會依 SQL 變更類型產生逐步確認清單,提醒欄位改名、型別/NULL/DEFAULT 變更、欄位註解、索引與 constraint / Primary Key 等執行前檢查;同時附上 all_tab_privs 與 session_privs 權限診斷 SQL,方便使用者在套用 DDL 前先確認目前帳號對目標物件的直接授權與系統權限;若儲存 SQL 偵測到 Oracle DROP COLUMN、DROP INDEX 或 DROP CONSTRAINT,會在一般 SQL 確認後再顯示一次高風險 DDL 確認;儲存判斷也改成檢查是否存在真正可執行 SQL,避免預覽註解誤擋操作;Oracle DDL 執行失敗時會嘗試查詢並解析 all_tab_privs / session_privs 結果,把目前直接授權、Session 系統權限與可能缺少的權限摘要加入錯誤訊息;若診斷查詢或修復建議產生失敗且例外原因空白,會依目前語系回退成未知錯誤;若偵測到權限不足、物件不可見或 tablespace quota 問題,錯誤訊息會附上可操作修復建議,包含確認 SESSION_USER / CURRENT_SCHEMA、檢查 session_roles、直接授權範例 SQL、DBA 最小授權/配額範本,以及跨 schema DDL policy 提醒;常見 Oracle 實機錯誤碼也已補上提示,包含 ORA-00904、ORA-01439、ORA-01408、ORA-02264、ORA-02261、ORA-01950 與既有權限/物件/constraint 類錯誤。
    • 後續方向:若需要更完整的 Oracle 風險控管,可再補更多實機 DDL 案例與團隊核准流程整合。

資料瀏覽與儲存限制

  • 沒有 Primary Key 的資料表儲存風險較高 ✅ 唯讀選項、optimistic WHERE 與衝突值提示已補齊

    • 現況:儲存更新/刪除時,若沒有 Primary Key,會先顯示風險警告;繼續儲存時會用可比對欄位的原始值建立 optimistic WHERE 條件,並避開 BLOB/geometry 這類大型二進位欄位;若沒有可安全比對欄位,會拒絕產生不安全 WHERE。各 provider 的 ExecSQL 會回傳影響列數,更新/刪除若影響 0 列會提示資料可能已被他人修改或刪除,並附上操作類型與 WHERE 比對條件摘要,方便判斷是哪個 optimistic 條件未命中。
    • 完成內容:選項 > 一般 新增「沒有 Primary Key 的資料表以唯讀模式開啟」。啟用後,開啟無 Primary Key 的資料表會自動停用新增、刪除與儲存操作,並在狀態列提示原因;若使用者選擇繼續編輯,衝突訊息會補充 UPDATE/DELETE、比對條件摘要與參數值(包含原始比對值與本次異動值),避免只看到泛用錯誤。若 UPDATE/DELETE 影響 0 列,QueryForm 會用未被本機修改且可安全比對的原始欄位重查候選資料列;剛好找到一列時會顯示原始值與目前資料庫值的欄位差異,找到 0 列或多列時會明確提示無法安全判斷。查詢執行、分頁載入、儲存資料、匯出與資料列寫入若收到空白例外或空白 provider reason,也會依目前語系回退成「未知錯誤 / Unknown error」,避免結果表格、狀態列或錯誤視窗只顯示空白原因。
    • 風險:資料列被其他人改過,或欄位包含浮點/大文字時,WHERE 仍可能因 provider 比對規則而不穩定。
    • 後續方向:若仍需要編輯無 Primary Key 資料表,可再補更多 provider 實機案例與衝突情境測試。
  • BLOB/geometry 欄位操作 ✅ 分頁檢視、資料表模式串流匯出、查詢結果底層串流匯出與預覽語系化已補齊

    • 現況:byte[] 欄位在結果表格中會先嘗試顯示為 Geometry WKT 預覽,無法解析時才顯示 BLOB 大小與十六進位片段;右鍵可檢視十六進位、複製 Hex、匯出檔案,在資料表資料模式可匯入檔案寫回目前 BLOB 欄位,也可針對 geometry 複製 WKT / WKT 轉 Geometry SQL。
    • 完成內容:BLOB 十六進位檢視器改為 4KB 分頁顯示,支援首頁、上一頁、下一頁、末頁與複製本頁 Hex,避免大型 BLOB 一次轉成完整文字造成 UI 卡頓。
    • 完成內容:資料表資料模式中,若目前資料列有 Primary Key 且尚未被本機修改,右鍵「匯出 BLOB 檔案」會以 provider-level SequentialAccess 重新查詢單一欄位並串流寫入檔案;MySQL、PostgreSQL、SQLite、SQL Server、Oracle provider 會共用同一個串流服務,匯出時狀態列會顯示已寫入大小。
    • 完成內容:QueryResultExportService 新增 provider-level streaming export 底層能力,可直接用 DbDataReader 將任意查詢結果輸出為 CSV / TSV / JSON / XML / HTML / Markdown,不必先載入整份 DataTable,並沿用既有 BLOB/geometry 預覽格式、空值處理與列數進度回報;查詢視窗匯出上述文字格式時,若上一個成功結果是一般查詢且可安全重跑,會直接走串流匯出,資料表編輯模式與 XLSX 則保留既有 DataTable 路徑;主視窗資料格、查詢視窗資料格與匯出 service 的 BLOB/geometry fallback 預覽已改用語系字串,繁中會顯示「幾何」與「位元組」,英文維持技術標籤;匯出完成視窗的「開啟檔案 / 開啟資料夾」失敗時也會依目前語系顯示可讀錯誤,缺少例外原因時會回退為「未知錯誤 / Unknown error」。
    • 限制:XLSX 仍需整份結果資料才能產生活頁簿輸出。沒有 Primary Key 或資料列已有未儲存變更時,單一 BLOB 匯出會退回目前格子的記憶體值。
  • 查詢結果匯出格式 ✅ 已補齊常用格式

    • 現況:查詢結果匯出預設使用 CSV,並可在儲存對話框選擇 Excel .xlsx、TSV、JSON、XML、HTML、Markdown 或 SQL INSERT .sql。
    • 完成內容:各格式會共用結果表格顯示值轉換;BLOB/geometry 會沿用結果表格的語系化 Geometry WKT 或 BLOB 十六進位片段顯示,日期與空值也會一致處理;XLSX 匯出會凍結標題列、套用自動篩選、穩定欄寬與表頭樣式,讓大型 workbook 開啟後可直接篩選與辨識欄位;SQL INSERT 匯出會產生 query_result 目標表的 INSERT INTO 腳本,字串、NULL、數字與 BLOB 十六進位 literal 會正確輸出,且可走串流匯出大型結果;匯出完成後會顯示摘要視窗,列出格式、筆數、檔案大小與路徑,摘要 helper 與對話框欄位都會依目前語系顯示,並可直接開啟檔案或所在資料夾;成功匯出後會記住這次選擇的資料夾,下次匯出會直接從同一個位置開始。
    • 後續方向:若需要更完整的大型結果集匯出,可再評估 XLSX 分段寫入;單一 BLOB/geometry 欄位的資料表模式匯出已先支援串流寫檔。

Table/View 複製限制

  • View SQL 無法安全轉換時會改用 table snapshot ✅ 使用者選項與預覽已補齊
    • 現況:跨 provider 複製 View 時,如果無法解析或轉換 SQL,會以查詢結果建立資料表快照。
    • 完成內容:複製前新增「跨 Provider 複製 View」對話框,讓使用者選擇:
      • 嘗試轉換 View SQL(無法轉換時自動改為 table snapshot)
      • 直接建立 Table snapshot(最穩定,不保留 View 語法)
      • 取消複製
      • 可在同一個對話框檢查來源 View SQL 與轉換後 SQL 預覽;若無法安全轉換,會顯示原因;若取得來源 View SQL 時 provider 例外原因空白,會依目前語系回退為「未知錯誤 / Unknown error」。
    • 方言轉換:已支援 SQL Server TOP (n) 轉 MySQL/PostgreSQL/SQLite LIMIT n 或 Oracle FETCH FIRST、MySQL/PostgreSQL/SQLite LIMIT 轉 SQL Server TOP (n) 或 Oracle FETCH/OFFSET,帶穩定 ORDER BY 的 MySQL/PostgreSQL/SQLite LIMIT ... OFFSET 可轉 SQL Server OFFSET ... FETCH NEXT,SQL Server / Oracle OFFSET ... FETCH NEXT/FIRST 可轉 MySQL/PostgreSQL/SQLite LIMIT ... OFFSET,標準 / Oracle / PostgreSQL FETCH FIRST n ROWS ONLY 可轉 SQL Server TOP (n) 或 MySQL/PostgreSQL/SQLite LIMIT n,簡單 Oracle ROWNUM <= n 轉目標 provider row limit,以及 NVL / NVL2 / IFNULL / ISNULL / GETDATE() / GETUTCDATE() / SYSDATETIME() / SYSUTCDATETIME() / NOW() / CURRENT_TIMESTAMP / CURRENT_TIMESTAMP() / UTC_TIMESTAMP() / SYSDATE / SYSTIMESTAMP / CURDATE() / CURRENT_DATE / CURTIME() / CURRENT_TIME / LOCALTIME / LOCALTIMESTAMP / CURRENT_USER / SESSION_USER / SYSTEM_USER / USER() / DATABASE() / CURRENT_DATABASE() / DB_NAME() / SCHEMA() / CURRENT_SCHEMA / SCHEMA_NAME() / DATE / TRUNC / DATEDIFF / TIMESTAMPDIFF / MONTHS_BETWEEN / DATEADD / DATE_ADD / DATE_SUB / ADD_MONTHS / EOMONTH / LAST_DAY / DATEFROMPARTS / YEAR / MONTH / DAY / HOUR / MINUTE / SECOND / DATEPART / DATE_PART / EXTRACT 的常見函式轉換;DATEDIFF / TIMESTAMPDIFF / MONTHS_BETWEEN 已涵蓋 year、quarter、month、week、day、hour、minute、second 或月份差距,DATEADD / DATE_ADD / DATE_SUB / ADD_MONTHS 已涵蓋 year、quarter、month、week、day、hour、minute、second 或月份加減。
    • 進階轉換:已補上簡單 DATE_FORMAT / FORMAT / TO_CHAR / TO_DATE / TO_TIMESTAMP / STR_TO_DATE / SQL Server CONVERT(..., 23/120) 日期格式與解析函式、PostgreSQL DATE_TRUNC 與 Oracle TRUNC(..., 'MM'/'YYYY'/'HH24'/'MI') 日期截斷,且 DATE_TRUNC 已涵蓋 year、month、day、hour、minute、second;IF / IIF / DECODE 條件函式、CEIL / CEILING 數值進位函式、TRUNCATE(number, decimals) 與 SQL Server ROUND(number, decimals, 1) 數值截斷函式、MOD 取餘數函式轉 SQL Server %、POW 次方函式轉 POWER、GREATEST / LEAST 雙參數比較函式轉 SQL Server CASE WHEN、TRUE / FALSE 布林常值轉 SQL Server / Oracle 數值常值、PostgreSQL 欄位::型別 cast operator 與 SQL Server TRY_CAST / TRY_CONVERT 轉目標 provider CAST(...) 或日期解析、ORDER BY ... NULLS FIRST/LAST 轉 SQL Server / MySQL CASE WHEN 排序、RAND / RANDOM / DBMS_RANDOM.VALUE 隨機數函式、PostgreSQL ILIKE 大小寫不敏感比對、REGEXP_LIKE / PostgreSQL ~ 正規表示式比對、GROUP_CONCAT / group_concat / STRING_AGG / LISTAGG、CONCAT 與 PostgreSQL / Oracle / SQLite || 字串串接、LPAD / RPAD 字串補齊轉 SQL Server / SQLite 等價語法、JSON_EXTRACT / JSON_UNQUOTE(JSON_EXTRACT(...)) / JSON_VALUE / JSON_QUERY / JSON_EXISTS / JSON_CONTAINS_PATH / JSON_LENGTH / JSON_ARRAY_LENGTH、JSON_OBJECT / JSON_ARRAY 與 PostgreSQL jsonb_build_object / jsonb_build_array、SQLite json_object / json_array、Oracle JSON_OBJECT KEY VALUE 建構式,以及 MySQL / PostgreSQL -> / ->>、PostgreSQL #> / #>> JSON operators 的跨 provider 轉換;簡單 JSON_TABLE(... COLUMNS (欄位 型別 PATH '$.x')) 也可轉 PostgreSQL LATERAL jsonb_array_elements 逐欄位套用 PATH、SQL Server OPENJSON ... WITH,或 SQLite json_each 搭配欄位參照改寫;MySQL/Oracle FOR ORDINALITY 欄位已可轉 PostgreSQL WITH ORDINALITY 與 SQLite json_each.key + 1,SQL Server 會在尚無安全等價展開時保留明確不支援原因;並可在目標為 SQL Server / Oracle 時將 WITH RECURSIVE 轉成 WITH,讓常見日期格式、日期解析、日期截斷、條件欄位、數值進位、數值截斷、JSON_TABLE 序號欄位、最大/最小值比較、布林常值、型別轉換、空值排序、字串比對、正規表示式、字串聚合、字串補齊、JSON 純量讀取、JSON 片段讀取、JSON path 存在判斷、JSON 陣列長度、JSON 物件/陣列建構、JSON 陣列展開與遞迴 CTE 關鍵字差異可以保留 View SQL。
    • 本輪補齊:SQL Server CONVERT(type, expr) 一般型別轉換會在目標為 MySQL、PostgreSQL、Oracle 或 SQLite 時轉為對應 CAST(expr AS type),補齊不帶日期 style 的跨 provider 轉型。
    • 本輪補齊:SQL Server CONVERT(type, expr) 一般型別轉換改用函式呼叫掃描器,可處理 CONVERT(int, REPLACE(col, '-', '')) 這類巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:SQL Server TRY_CAST(expr AS type) 改用函式呼叫掃描器與 top-level AS 解析,可處理 TRY_CAST(REPLACE(col, '-', '') AS int) 這類巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:SQL Server TRY_CONVERT(type, expr[, style]) 改用函式呼叫掃描器,可處理 TRY_CONVERT(int, REPLACE(col, '-', '')) 這類巢狀參數,並保留字串常值中的函式範例文字;日期 style 23/120 仍會轉為目標 provider 日期解析函式。
    • 本輪補齊:IF(...) / IIF(...) / DECODE(...) / CHOOSE(...) 條件函式改用函式呼叫掃描器,可處理 IIF(ABS(score) >= 60, ...) 這類巢狀條件,並保留字串常值中的函式範例文字。
    • 本輪補齊:GREATEST(left, right) / LEAST(left, right) 複製到 SQLite 時會轉為通用 CASE WHEN ... THEN ... ELSE ... END,不再只處理 SQL Server 目標。
    • 本輪補齊:DATEPART / DATE_PART / EXTRACT / MySQL 日期部分函式已擴充 quarter、week、weekday 與 dayofyear,SQLite 會用 strftime('%m') 計算季度、strftime('%W') 計算週序、strftime('%w') 計算星期序、strftime('%j') 計算年內日序;Oracle 目標會改用 TO_NUMBER(TO_CHAR(...)) 保留這些日期部分。
    • 本輪補齊:DATEADD(...)、DATE_ADD(... INTERVAL ... ...) 與 DATE_SUB(... INTERVAL ... ...) 的 interval 數量可使用欄位或簡單運算式,不再只支援純數字;SQLite 目標會產生動態 date/datetime modifier。
    • 本輪補齊:DATEPART(...) / DATE_PART(...) 改用函式呼叫掃描器,可處理 DATEPART(day, DATEADD(day, 1, created_at)) 這類巢狀日期運算;DATEADD / DATE_ADD / DATE_SUB / ADD_MONTHS 轉換也會避開字串常值,保留報表範例文字。
    • 本輪補齊:SQL Server DATEFROMPARTS(year, month, day) 改用函式呼叫掃描器,可處理 DATEFROMPARTS(ABS(year_col), month_col, day_col) 這類巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:EOMONTH(...) / LAST_DAY(...) 月末日期函式改用函式呼叫掃描器,可處理含 offset 或巢狀日期加減的月末轉換,並保留字串常值中的函式範例文字。
    • 本輪補齊:MySQL CURTIME() 與標準 CURRENT_TIME 會依目標 provider 轉為對應的目前時間表達式,SQL Server 使用 CAST(GETDATE() AS time)、SQLite 使用 time('now')、MySQL 使用 CURTIME()。
    • 本輪補齊:標準 LOCALTIME / LOCALTIMESTAMP 會依目標 provider 轉為目前時間或目前 timestamp 表達式,並先處理 LOCALTIMESTAMP 以避免被 LOCALTIME 前綴誤轉。
    • 本輪補齊:SQL Server SYSDATETIME() / SYSUTCDATETIME() 會依目標 provider 轉為目前 timestamp 或 UTC timestamp 表達式,與既有 GETDATE() / GETUTCDATE() 共用同一組轉換語意。
    • 本輪補齊:標準 CURRENT_TIMESTAMP / CURRENT_TIMESTAMP() 會依目標 provider 正規化為對應目前 timestamp 表達式,MySQL 目標統一輸出 NOW()。
    • 本輪補齊:CURRENT_USER / SESSION_USER / SYSTEM_USER / USER() 會依目標 provider 轉為對應目前使用者或登入者表達式,Oracle 目標的 session/system user 使用 SYS_CONTEXT('USERENV','SESSION_USER')。
    • 本輪補齊:DATABASE() / CURRENT_DATABASE() / DB_NAME() 會依目標 provider 轉為目前資料庫名稱表達式,Oracle 目標使用 SYS_CONTEXT('USERENV','DB_NAME'),SQLite 目標以 NULL 保持可執行。
    • 本輪補齊:SCHEMA() / CURRENT_SCHEMA / SCHEMA_NAME() 會依目標 provider 轉為目前 schema 表達式,SQL Server 目標使用 SCHEMA_NAME(),Oracle 目標使用 SYS_CONTEXT('USERENV','CURRENT_SCHEMA'),SQLite 目標以 NULL 保持可執行。
    • 本輪補齊:Oracle TO_NUMBER(...) / TO_NUMBER(..., 'format') 會在目標為 SQL Server、MySQL、PostgreSQL 或 SQLite 時轉為對應的 CAST(...) 數值型別,避免 Oracle View 複製到其它 provider 後留下不可執行的數值轉型函式。
    • 本輪補齊:TO_NUMBER(...) 改用函式呼叫掃描器,可處理 TO_NUMBER(REPLACE(col, ',', ''), 'format') 這類巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:MySQL TRUNCATE(number, decimals) 複製到 SQL Server 會轉為 ROUND(number, decimals, 1),複製到 PostgreSQL / Oracle 會轉為 TRUNC(number, decimals),SQLite 會用整數截斷與 pow(10, decimals) 模擬,避免報表 View 留下 MySQL 專用數值函式。
    • 本輪補齊:SQL Server ROUND(number, decimals, 1) 的截斷語意會依目標 provider 轉為 MySQL TRUNCATE(number, decimals)、PostgreSQL / Oracle TRUNC(number, decimals),SQLite 仍以整數截斷與 pow(10, decimals) 模擬;一般 ROUND(number, decimals) 不會被誤改。
    • 本輪補齊:TRUNCATE(...) 與三參數 ROUND(..., ..., 1) 改用函式呼叫掃描器,可處理 TRUNCATE(ABS(col), 2) 這類巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:CEIL(...) / CEILING(...) 名稱轉換會避開字串常值,MOD(...) 轉 SQL Server % 時也改用函式呼叫掃描器,可處理 MOD(ABS(col), n) 這類巢狀參數並保留 'CEIL(...)' / 'MOD(...)' 文字。
    • 本輪補齊:POW(...) 轉 POWER(...) 時只會改寫 SQL 片段,會保留 'POW(...)' 這類字串常值,避免報表標籤或樣板文字被誤改。
    • 本輪補齊:RAND() / RANDOM() / DBMS_RANDOM.VALUE 隨機數函式轉換會避開字串常值,避免將 'RAND()' 這類報表文字誤改成目標 provider 函式名稱。
    • 本輪補齊:NVL(...) / IFNULL(...) 轉換為 COALESCE(...) 時只會改寫 SQL 片段,不會再誤改 'NVL(...)' 或 'IFNULL(...)' 這類字串常值,避免備註、狀態文字或樣板字串被污染。
    • 本輪補齊:NVL2(...) / ISNULL(...) 轉換會用函式呼叫掃描器避開字串常值,並可處理參數字串內含括號或巢狀函式的情境,避免漏轉真正函式或污染 'NVL2(...)' / 'ISNULL(...)' 文字。
    • 本輪補齊:LOCATE / CHARINDEX / INSTR 的起始位置參數會轉為目標 provider 等價語法;SQLite / PostgreSQL 會用 SUBSTR / SUBSTRING 搭配 CASE 保留找不到時回傳 0 的行為。
    • 本輪補齊:MySQL UCASE(...) / LCASE(...) 會在複製到 SQL Server、PostgreSQL、SQLite 或 Oracle 時轉為通用的 UPPER(...) / LOWER(...),並改用函式呼叫掃描器處理巢狀參數與保留字串常值,避免目標資料庫留下不可執行的 MySQL alias 或污染報表文字。
    • 本輪補齊:TRIM(...) / LTRIM(RTRIM(...)) / RTRIM(LTRIM(...)) 字串修剪轉換改用函式呼叫掃描器,可處理 REPLACE(...) 這類含逗號的巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:SQL Server DATALENGTH(...)、PostgreSQL/MySQL OCTET_LENGTH(...) 與 Oracle LENGTHB(...) 會依目標 provider 轉為對應的 byte-length 函式,SQLite 目標會用 length(CAST(expr AS BLOB)) 保留位元組長度語意。
    • 本輪補齊:MySQL/PostgreSQL BIT_LENGTH(...) 會依目標 provider 保留位元長度語意,SQL Server / Oracle / SQLite 目標會用對應 byte-length 函式乘以 8。
    • 本輪補齊:SQL Server NEWID()、MySQL UUID() 與 Oracle SYS_GUID() 會依目標 provider 轉為對應的 UUID/Guid 產生函式,SQLite 目標會用 randomblob() 組出 v4-like UUID 字串。
    • 本輪補齊:MySQL/PostgreSQL REPEAT(...) 與 SQL Server REPLICATE(...) 會依目標 provider 轉為 REPEAT、REPLICATE、SQLite ZEROBLOB 模擬或 Oracle RPAD 模擬,讓常見補零、遮罩與固定字元重複 View 可跨資料庫複製。
    • 本輪補齊:MySQL LPAD(...) / RPAD(...) 複製到 SQL Server 或 SQLite 時改用函式呼叫掃描器,可支援巢狀參數並保留字串常值中的函式範例文字。
    • 本輪補齊:SQL Server/MySQL SPACE(n) 會在目標為 PostgreSQL、SQLite 或 Oracle 時轉為對應的字串重複表達式,讓縮排、補空白與固定格式 View 可跨資料庫複製。
    • 本輪補齊:Oracle/PostgreSQL CHR(n) 與 SQL Server/MySQL/SQLite CHAR(n) 會依目標 provider 轉為對應的字元碼函式,且會避開 CAST(... AS CHAR(n)) 這類型別宣告,避免誤改欄位型別。
    • 本輪補齊:SQL Server NCHAR(n) 會依目標 provider 轉為對應的 Unicode 字元碼函式,且一般 CAST(... AS NCHAR/VARCHAR/INT/DATE...) 也會依目標 provider 轉為相容型別,不再只處理 CONVERT(...) / TRY_CAST(...) / TRY_CONVERT(...)。
    • 本輪補齊:MySQL/PostgreSQL/Oracle ASCII(...)、SQL Server UNICODE(...) 與 SQLite unicode(...) 會依目標 provider 轉為對應的字元碼讀取函式,讓字元碼分析 View 可跨資料庫複製。
    • 本輪補齊:MySQL 一參數 ISNULL(expr) 會依目標 provider 轉為 expr IS NULL 或 CASE WHEN expr IS NULL THEN 1 ELSE 0 END,SQL Server 二參數 ISNULL(expr, fallback) 仍會轉為 COALESCE(expr, fallback);避免跨 provider 複製時把 NULL 判斷誤轉成空值替代。
    • 本輪補齊:日期格式化與解析函式轉換改用函式呼叫掃描器,CONVERT(..., style 23/120)、DATE_FORMAT、FORMAT、TO_CHAR、TO_DATE、TO_TIMESTAMP 與 STR_TO_DATE 會保留字串常值中的範例文字,只改寫真正的 SQL 函式呼叫。
    • 本輪補齊:MySQL FIELD(expr, value1, value2, ...) 會在目標非 MySQL 時轉為通用 CASE expr WHEN value1 THEN 1 ... ELSE 0 END,讓自訂狀態排序與優先序 View 可跨資料庫複製。
    • 本輪補齊:MySQL ELT(index, value1, value2, ...) 會在目標非 MySQL 時轉為通用 CASE index WHEN 1 THEN value1 ... ELSE NULL END,讓代碼轉標籤與優先序文字 View 可跨資料庫複製。
    • 本輪補齊:MySQL FIND_IN_SET(expr, 'value1,value2,...') 在第二參數為靜態清單時會轉為通用 CASE expr WHEN value1 THEN 1 ... ELSE 0 END,讓固定清單排序與狀態順位 View 可跨資料庫複製。
    • 本輪補齊:MySQL STRCMP(left, right) 會在目標非 MySQL 時轉為通用 CASE WHEN left = right THEN 0 WHEN left < right THEN -1 ELSE 1 END,讓字串排序/比較結果 View 可跨資料庫複製。
    • 本輪補齊:SQL Server CHOOSE(index, value1, value2, ...) 會在目標非 SQL Server 時轉為通用 CASE index WHEN 1 THEN value1 ... ELSE NULL END,讓序號轉標籤 View 可跨資料庫複製。
    • 本輪補齊:SQL Server STUFF(expr, start, length, replacement) 會在目標為 MySQL、PostgreSQL、SQLite 或 Oracle 時轉為 substring 串接表達式,並改用函式呼叫掃描器支援巢狀參數與保留字串常值,讓遮罩、局部替換與格式化 View 可跨資料庫複製。
    • 本輪補齊:SUBSTR(...) / 逗號式 SUBSTRING(...) 名稱轉換改用函式呼叫掃描器,可處理 REPLACE(...) 這類含括號與逗號的巢狀參數,並保留字串常值中的函式範例文字。
    • 本輪補齊:LEFT(...) / RIGHT(...) 複製到 Oracle 或 SQLite 時改用函式呼叫掃描器,可處理 REPLACE(...) 這類巢狀參數並轉為 SUBSTR(...),同時保留字串常值中的函式範例文字。
    • 本輪補齊:MySQL SUBSTRING_INDEX(expr, delimiter, 1) 會在目標為 SQL Server、PostgreSQL、SQLite 或 Oracle 時轉為「第一個 delimiter 前段」的等價 CASE 表達式;SUBSTRING_INDEX(expr, delimiter, -1) 會在目標為 SQL Server、PostgreSQL 或 Oracle 時轉為「最後一個 delimiter 後段」的等價表達式,找不到 delimiter 時保留原字串;轉換已改用函式呼叫掃描器,可支援巢狀參數並保留字串常值中的函式範例文字。
    • 本輪補齊:MySQL/PostgreSQL/SQL Server CONCAT_WS(separator, ...) 複製到 Oracle 或 SQLite 時會展開為分隔符串接表達式,讓電話、代碼與複合鍵格式化 View 可跨資料庫複製。
    • 已知情境:Oracle 階層查詢、MySQL 專用 View 語法、帶 OFFSET 且缺少穩定排序的 SQL Server 轉換、無法解析的 SELECT SQL 仍會改用 table snapshot。
    • 測試覆蓋:tests/SmokeTests.cs 已加入 TOP / LIMIT / LIMIT OFFSET / OFFSET FETCH / FETCH FIRST / ROWNUM、日期格式與解析(含 SQL Server CONVERT style 23/120、TO_DATE、TO_TIMESTAMP、STR_TO_DATE)、目前日期/時間(含 GETUTCDATE() / UTC_TIMESTAMP() / SYSDATE / SYSTIMESTAMP)、DATE_TRUNC 與 Oracle TRUNC(..., 'MM'/'YYYY'/'HH24'/'MI') 日期截斷、NVL2 空值條件、DATE / TRUNC 日期截斷、DATEDIFF / TIMESTAMPDIFF / MONTHS_BETWEEN 年/月/日/時分秒差、DATEADD / DATE_ADD / DATE_SUB / ADD_MONTHS 年/月/日/時加減、EOMONTH / LAST_DAY 月末日期、DATEFROMPARTS 日期組裝與 YEAR / MONTH / DAY / HOUR / MINUTE / SECOND / DATEPART / DATE_PART / EXTRACT 日期部分函式、IF / IIF / DECODE 條件函式、CEIL / CEILING 數值進位、MOD 取餘數、POW / POWER 次方、GREATEST / LEAST 最大/最小值比較、TRUE / FALSE 布林常值、PostgreSQL 欄位::型別 cast operator、SQL Server TRY_CAST / TRY_CONVERT、NULLS FIRST/LAST 空值排序、RAND / RANDOM / DBMS_RANDOM.VALUE 隨機數、PostgreSQL ILIKE、REGEXP_LIKE / PostgreSQL ~ 正規表示式比對、字串聚合、CONCAT 與 || 字串串接、LEN / LENGTH / CHAR_LENGTH / CHARACTER_LENGTH 字串長度、TRIM / LTRIM / RTRIM 字串修剪、SUBSTR / SUBSTRING / SUBSTRING ... FROM ... FOR / LEFT / RIGHT / LPAD / RPAD 字串擷取與補齊、LOCATE / CHARINDEX / INSTR / POSITION 字串位置、JSON 純量讀取(含 JSON_EXTRACT / JSON_UNQUOTE(JSON_EXTRACT(...)) / JSON_VALUE / MySQL ->> / PostgreSQL ->> / #>> 轉 PostgreSQL / MySQL / Oracle / SQL Server)、JSON 片段讀取(含 JSON_QUERY / MySQL -> / PostgreSQL -> / #> 轉 MySQL / PostgreSQL / SQLite)、JSON path 存在判斷(含 JSON_EXISTS / JSON_CONTAINS_PATH 轉 MySQL / PostgreSQL / SQLite / SQL Server / Oracle)、JSON 陣列長度(含 JSON_LENGTH / JSON_ARRAY_LENGTH 轉 MySQL / PostgreSQL / SQLite / SQL Server / Oracle)、JSON 物件/陣列建構(含 MySQL、PostgreSQL、SQLite、Oracle 互轉)、簡單 JSON_TABLE 轉 PostgreSQL / SQL Server / SQLite、JSON_TABLE FOR ORDINALITY 轉 PostgreSQL / SQLite 與 SQL Server 不支援原因、CTE/window 保留、WITH RECURSIVE 關鍵字轉換與不支援轉換原因的可重跑案例。
    • 後續方向:若需要更高相容性,可再逐 provider 擴充 JSON table 與更多 provider 專用內建函式等更複雜 SQL 方言轉換規則。