From 79042315661307745edb0c20763ea4390e97e3d6 Mon Sep 17 00:00:00 2001 From: zipg Date: Mon, 24 Aug 2026 21:42:46 +0800 Subject: [PATCH] fix(kingbase): display char column lengths from bpchar metadata --- agents/drivers/kingbase-go/integration_test.go | 10 ++++++++-- .../table/tableStructureEditorState.spec.ts | 14 ++++++++++++-- .../src/lib/table/tableStructureEditorState.ts | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/agents/drivers/kingbase-go/integration_test.go b/agents/drivers/kingbase-go/integration_test.go index 0496a744c0..cddd054ea1 100644 --- a/agents/drivers/kingbase-go/integration_test.go +++ b/agents/drivers/kingbase-go/integration_test.go @@ -58,7 +58,7 @@ func TestKingbaseIntegration(t *testing.T) { } }) - mustExecute(t, server, "CREATE TABLE "+qualifiedSchema+"."+quoteIdentifier(parent)+" (id integer PRIMARY KEY, name varchar(64) NOT NULL)") + mustExecute(t, server, "CREATE TABLE "+qualifiedSchema+"."+quoteIdentifier(parent)+" (id integer PRIMARY KEY, name varchar(64) NOT NULL, code character(32))") mustExecute(t, server, "COMMENT ON TABLE "+qualifiedSchema+"."+quoteIdentifier(parent)+" IS '订单父表'") mustExecute(t, server, "COMMENT ON COLUMN "+qualifiedSchema+"."+quoteIdentifier(parent)+".id IS '主键编号'") mustExecute(t, server, "COMMENT ON COLUMN "+qualifiedSchema+"."+quoteIdentifier(parent)+".name IS '客户''名称'") @@ -76,9 +76,15 @@ func TestKingbaseIntegration(t *testing.T) { t.Fatalf("get columns failed: columns=%v err=%v", columns, err) } parentColumns, err := server.getColumns(schema, parent) - if err != nil || len(parentColumns) != 2 || parentColumns[0].Comment == nil || *parentColumns[0].Comment != "主键编号" || parentColumns[1].Comment == nil || *parentColumns[1].Comment != "客户'名称" { + if err != nil || len(parentColumns) != 3 || parentColumns[0].Comment == nil || *parentColumns[0].Comment != "主键编号" || parentColumns[1].Comment == nil || *parentColumns[1].Comment != "客户'名称" { t.Fatalf("get commented columns failed: columns=%v err=%v", parentColumns, err) } + if parentColumns[1].DataType != "character varying(64)" || parentColumns[1].CharacterMaximumLength == nil || *parentColumns[1].CharacterMaximumLength != 64 { + t.Fatalf("varchar length metadata mismatch: column=%+v", parentColumns[1]) + } + if parentColumns[2].DataType != "character(32)" || parentColumns[2].CharacterMaximumLength == nil || *parentColumns[2].CharacterMaximumLength != 32 { + t.Fatalf("character length metadata mismatch: column=%+v", parentColumns[2]) + } ddl, err := server.getTableDDL(schema, parent) if err != nil { t.Fatalf("get table DDL failed: %v", err) diff --git a/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts b/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts index 6d56017b87..35e9d9c325 100644 --- a/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts +++ b/apps/desktop/src/lib/__tests__/table/tableStructureEditorState.spec.ts @@ -75,6 +75,15 @@ describe("tableStructureEditorState", () => { extra: null, character_maximum_length: 255, }, + { + name: "fixed_code", + data_type: "bpchar", + is_nullable: true, + column_default: null, + is_primary_key: false, + extra: null, + character_maximum_length: 32, + }, { name: "amount", data_type: "numeric", @@ -108,9 +117,10 @@ describe("tableStructureEditorState", () => { "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(columns.map((column) => column.dataType)).toEqual(["varchar(255)", "bpchar(32)", "numeric(12,2)", "integer", "character varying(64)"]); + expect(columns.map((column) => column.original?.data_type)).toEqual(["varchar(255)", "bpchar(32)", "numeric(12,2)", "integer", "character varying(64)"]); expect(dataTypeLengthInputValue("kingbase", columns[0]?.dataType ?? "")).toBe("255"); + expect(dataTypeLengthInputValue("kingbase", columns[1]?.dataType ?? "")).toBe("32"); }); it("turns copied metadata into new column drafts instead of existing columns", () => { diff --git a/apps/desktop/src/lib/table/tableStructureEditorState.ts b/apps/desktop/src/lib/table/tableStructureEditorState.ts index b9e2f70fbd..7b086478b5 100644 --- a/apps/desktop/src/lib/table/tableStructureEditorState.ts +++ b/apps/desktop/src/lib/table/tableStructureEditorState.ts @@ -822,7 +822,7 @@ 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 CHARACTER_LENGTH_METADATA_TYPES = new Set(["binary", "bpchar", "char", "character", "character varying", "nchar", "nvarchar", "nvarchar2", "varbinary", "varchar", "varchar2"]); const NUMERIC_PRECISION_METADATA_TYPES = new Set(["decimal", "number", "numeric"]); const XUGU_SINGLE_PRECISION_METADATA_TYPES = new Set(["bit", "time", "time with time zone", "timestamp", "timestamp with time zone", "varbit"]);