fix(kingbase): restore table structure type parameters

This commit is contained in:
zipg 2026-07-16 18:19:29 +08:00 committed by GitHub
parent d9ef8b0cac
commit 669c742acd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 70 additions and 1 deletions

View File

@ -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,

View File

@ -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,