From 3840426128fe943039126955a9b073046a2869e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E4=B8=AB=E8=AE=B2=E6=A2=B5?= Date: Fri, 11 Sep 2026 12:06:23 +0800 Subject: [PATCH] fix(table): keep mysql DEFAULT_GENERATED columns copyable --- apps/desktop/src/lib/table/tableClipboard.ts | 4 +++- packages/app-tests/tableClipboard.test.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/lib/table/tableClipboard.ts b/apps/desktop/src/lib/table/tableClipboard.ts index a4ac1ddc94..ba4afd6ced 100644 --- a/apps/desktop/src/lib/table/tableClipboard.ts +++ b/apps/desktop/src/lib/table/tableClipboard.ts @@ -94,7 +94,9 @@ export function tableDataCopyColumnOptions(databaseType: DatabaseType | undefine function isWritableTableDataCopyColumn(databaseType: DatabaseType | undefined, column: ColumnInfo): boolean { const extra = (column.extra ?? "").toLowerCase(); if (databaseType === "mysql") { - return !extra.includes("generated"); + // DEFAULT_GENERATED marks a writable expression default, not a generated column. + // Accept both raw EXTRA metadata and the backend's expanded generation clause. + return !/\b(?:virtual|stored|persistent)\s+generated\b|\bgenerated\s+always\s+as\s*\(/.test(extra); } if (databaseType === "postgres") { return !extra.includes("generated always as ("); diff --git a/packages/app-tests/tableClipboard.test.ts b/packages/app-tests/tableClipboard.test.ts index 0ef9ad5e9c..6e0b5165ee 100644 --- a/packages/app-tests/tableClipboard.test.ts +++ b/packages/app-tests/tableClipboard.test.ts @@ -72,8 +72,8 @@ test("table data copy uses only writable columns for first-class databases", () postgresOverridingSystemValue: true, sqlserverIdentityInsert: false, }); - assert.deepEqual(tableDataCopyColumnOptions("mysql", [{ ...columns[0], extra: "auto_increment" }, { ...columns[1] }, { ...columns[2], extra: "STORED GENERATED" }]), { - columns: ["id", "name"], + assert.deepEqual(tableDataCopyColumnOptions("mysql", [{ ...columns[0], extra: "auto_increment" }, { ...columns[1] }, { ...columns[2], extra: "STORED GENERATED" }, column("expr_default", "DEFAULT_GENERATED"), column("expr_default_on_update", "DEFAULT_GENERATED on update CURRENT_TIMESTAMP"), column("virtual_full_name", "VIRTUAL GENERATED"), column("stored_full_name", "GENERATED ALWAYS AS (concat(first_name, ' ', last_name)) STORED")]), { + columns: ["id", "name", "expr_default", "expr_default_on_update"], postgresOverridingSystemValue: false, sqlserverIdentityInsert: false, });