diff --git a/apps/desktop/src/lib/tableTree.ts b/apps/desktop/src/lib/tableTree.ts index acf0baa12..a6c54b474 100644 --- a/apps/desktop/src/lib/tableTree.ts +++ b/apps/desktop/src/lib/tableTree.ts @@ -231,13 +231,20 @@ export function mergeTableInfosIntoObjects( if (objectType !== "TABLE" && objectType !== "VIEW") continue; const name = normalizeDatabaseObjectName(table.name); if (!name) continue; - const key = `${objectType}\0${(schema || "").toLowerCase()}\0${name.toLowerCase()}`; + const matchingObject = objects.find((obj) => { + const objName = normalizeDatabaseObjectName(obj.name); + if (objName.toLowerCase() !== name.toLowerCase()) return false; + return normalizeObjectType(obj.object_type) === objectType; + }); + const tableSchema = + schema ?? (matchingObject?.schema ? normalizeDatabaseObjectName(matchingObject.schema) : undefined); + const key = `${objectType}\0${(tableSchema || "").toLowerCase()}\0${name.toLowerCase()}`; if (seen.has(key)) continue; seen.add(key); merged.push({ name, object_type: objectType, - schema, + schema: tableSchema, comment: table.comment, created_at: undefined, updated_at: undefined, diff --git a/packages/app-tests/tableTree.test.ts b/packages/app-tests/tableTree.test.ts index 3c148040a..193fbcf5d 100644 --- a/packages/app-tests/tableTree.test.ts +++ b/packages/app-tests/tableTree.test.ts @@ -193,3 +193,26 @@ test("mergeTableInfosIntoObjects restores views missing from object metadata", ( ], ); }); + +test("mergeTableInfosIntoObjects dedupes MySQL tables when object metadata carries database as schema", () => { + const merged = mergeTableInfosIntoObjects( + [ + { + name: "orders", + object_type: "TABLE", + schema: "app", + comment: null, + created_at: null, + updated_at: null, + parent_schema: null, + parent_name: null, + }, + ], + [table("orders")], + ); + + assert.deepEqual( + merged.map((item) => ({ name: item.name, type: item.object_type, schema: item.schema })), + [{ name: "orders", type: "TABLE", schema: "app" }], + ); +});