From c980b15bbb359865ab2f517063f55a2bfca78912 Mon Sep 17 00:00:00 2001 From: liuhy Date: Sun, 26 Jul 2026 08:26:04 -0700 Subject: [PATCH] fix(snowflake): preserve column precision when scale is null buildDataType guarded with columnSize == null || decimalDigits == null, returning bare type for NUMBER(10) (precision set, scale null). The size-only branch was unreachable dead code. Guard on columnSize only, mirroring every sibling. Same fix as Sqlite #2167 and MySQL #2180. Fixes #2188 Co-Authored-By: Claude --- .../enums/type/SnowflakeColumnTypeEnum.java | 2 +- .../SnowflakeColumnTypeEnumDecimalTest.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/test/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnumDecimalTest.java diff --git a/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/main/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnum.java b/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/main/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnum.java index cfde9796da..6e1ec30df9 100644 --- a/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/main/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnum.java +++ b/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/main/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnum.java @@ -147,7 +147,7 @@ private String buildDataType(TableColumn column, SnowflakeColumnTypeEnum type) { } if (Arrays.asList(DECIMAL, FLOAT, DOUBLE,TINYINT, INT, NUMBER, NUMERIC, INTEGER, BIGINT, SMALLINT, BYTEINT).contains(type)) { - if (column.getColumnSize() == null || column.getDecimalDigits() == null) { + if (column.getColumnSize() == null) { return columnType; } if (column.getColumnSize() != null && column.getDecimalDigits() == null) { diff --git a/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/test/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnumDecimalTest.java b/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/test/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnumDecimalTest.java new file mode 100644 index 0000000000..a60630ace8 --- /dev/null +++ b/chat2db-community-server/chat2db-community-plugins/chat2db-community-snowflake/src/test/java/ai/chat2db/plugin/snowflake/enums/type/SnowflakeColumnTypeEnumDecimalTest.java @@ -0,0 +1,41 @@ +package ai.chat2db.plugin.snowflake.enums.type; + +import ai.chat2db.community.domain.api.model.metadata.TableColumn; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SnowflakeColumnTypeEnumDecimalTest { + + private TableColumn column(String type, Integer size, Integer digits) { + TableColumn c = new TableColumn(); + c.setColumnType(type); + c.setColumnSize(size); + c.setDecimalDigits(digits); + return c; + } + + @Test + void numberWithPrecisionOnly() { + String result = SnowflakeColumnTypeEnum.NUMBER.buildCreateColumnSql(column("NUMBER", 10, null)); + assertTrue(result.contains("NUMBER(10"), () -> "Expected NUMBER(10): " + result); + } + + @Test + void numberWithPrecisionAndScale() { + String result = SnowflakeColumnTypeEnum.NUMBER.buildCreateColumnSql(column("NUMBER", 10, 2)); + assertTrue(result.contains("NUMBER(10,2)"), () -> "Expected NUMBER(10,2): " + result); + } + + @Test + void decimalWithPrecisionOnly() { + String result = SnowflakeColumnTypeEnum.DECIMAL.buildCreateColumnSql(column("DECIMAL", 15, null)); + assertTrue(result.contains("DECIMAL(15"), () -> "Expected DECIMAL(15): " + result); + } + + @Test + void decimalWithBothNull() { + String result = SnowflakeColumnTypeEnum.DECIMAL.buildCreateColumnSql(column("DECIMAL", null, null)); + assertTrue(result.contains("DECIMAL"), () -> "Expected DECIMAL: " + result); + } +}