From 669c742acdbf3e008c59ca50a4756cbd9d34a4d4 Mon Sep 17 00:00:00 2001 From: zipg Date: Thu, 16 Jul 2026 18:19:29 +0800 Subject: [PATCH] fix(kingbase): restore table structure type parameters --- .../table/tableStructureEditorState.spec.ts | 50 +++++++++++++++++++ .../lib/table/tableStructureEditorState.ts | 21 +++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts b/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts index aca715905..2eaa2354c 100644 --- a/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts +++ b/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts @@ -24,6 +24,56 @@ import { } from "@/lib/table/tableStructureEditorState"; describe("tableStructureEditorState", () => { + it("hydrates Kingbase type parameters returned separately from the data type", () => { + const columns = createColumnDrafts( + [ + { + name: "display_name", + data_type: "varchar", + is_nullable: true, + column_default: null, + is_primary_key: false, + extra: null, + character_maximum_length: 255, + }, + { + name: "amount", + data_type: "numeric", + is_nullable: false, + column_default: null, + is_primary_key: false, + extra: null, + numeric_precision: 12, + numeric_scale: 2, + }, + { + name: "attempts", + data_type: "integer", + is_nullable: false, + column_default: null, + is_primary_key: false, + extra: null, + numeric_precision: 32, + numeric_scale: 0, + }, + { + name: "code", + data_type: "character varying(64)", + is_nullable: true, + column_default: null, + is_primary_key: false, + extra: null, + character_maximum_length: 64, + }, + ], + "kingbase", + ); + + expect(columns.map((column) => column.dataType)).toEqual(["varchar(255)", "numeric(12,2)", "integer", "character varying(64)"]); + expect(columns.map((column) => column.original?.data_type)).toEqual(["varchar(255)", "numeric(12,2)", "integer", "character varying(64)"]); + expect(dataTypeLengthInputValue("kingbase", columns[0]?.dataType ?? "")).toBe("255"); + }); + it("parses Kingbase SQLServer compatibility identity metadata", () => { expect(parseExtraToColumnExtra("identity(10, 2)", "kingbase")).toEqual({ autoIncrement: true, diff --git a/apps/desktop/src/lib/table/tableStructureEditorState.ts b/apps/desktop/src/lib/table/tableStructureEditorState.ts index d93c2c0a1..2c3b7d5f3 100644 --- a/apps/desktop/src/lib/table/tableStructureEditorState.ts +++ b/apps/desktop/src/lib/table/tableStructureEditorState.ts @@ -638,11 +638,30 @@ function columnDefaultForEditor(column: ColumnInfo, databaseType?: DatabaseType) return defaultValue; } +const CHARACTER_LENGTH_METADATA_TYPES = new Set(["binary", "char", "character", "character varying", "nchar", "nvarchar", "nvarchar2", "varbinary", "varchar", "varchar2"]); +const NUMERIC_PRECISION_METADATA_TYPES = new Set(["decimal", "number", "numeric"]); + +function columnDataTypeForEditor(column: ColumnInfo, databaseType?: DatabaseType): string { + const parsed = splitDataType(column.data_type); + if (parsed.params) return column.data_type; + + const baseType = parsed.baseType.trim().replace(/\s+/g, " "); + const normalized = baseType.toLowerCase(); + if (CHARACTER_LENGTH_METADATA_TYPES.has(normalized) && Number.isInteger(column.character_maximum_length) && Number(column.character_maximum_length) > 0) { + return combineDataTypeForDatabase(databaseType, baseType, String(column.character_maximum_length)); + } + if (NUMERIC_PRECISION_METADATA_TYPES.has(normalized) && Number.isInteger(column.numeric_precision) && Number(column.numeric_precision) > 0) { + const scale = Number.isInteger(column.numeric_scale) && Number(column.numeric_scale) >= 0 ? `,${column.numeric_scale}` : ""; + return combineDataTypeForDatabase(databaseType, baseType, `${column.numeric_precision}${scale}`); + } + return column.data_type; +} + export function createColumnDrafts(columns: ColumnInfo[], databaseType?: DatabaseType): EditableStructureColumn[] { return columns.map((column, index) => { const defaultValue = columnDefaultForEditor(column, databaseType); const enumValues = isMysqlEnumDataType(databaseType, column.data_type) ? [...(column.enum_values ?? [])] : undefined; - const dataType = enumValues?.length ? mysqlEnumDataType(enumValues) : column.data_type; + const dataType = enumValues?.length ? mysqlEnumDataType(enumValues) : columnDataTypeForEditor(column, databaseType); return { id: `existing:${column.name}`, name: column.name,