From 5f3c80bdf93a146bdd5fecbef07b1383b622651a Mon Sep 17 00:00:00 2001 From: Sreekanth Vadigi Date: Wed, 8 Apr 2026 09:26:00 +0000 Subject: [PATCH 1/2] Add VARIANT type to ColumnInfoTypeName for correct SEA metadata VARIANT columns in SEA path returned null for getColumnClassName() because ColumnInfoTypeName had no VARIANT value, causing Jackson deserialization to return null. Add VARIANT to the enum and type mapping methods so both SEA and Thrift paths return consistent metadata. Signed-off-by: Sreekanth Vadigi Co-authored-by: Isaac Signed-off-by: Sreekanth Vadigi --- .../databricks/jdbc/common/util/DatabricksTypeUtil.java | 4 ++++ .../databricks/jdbc/model/core/ColumnInfoTypeName.java | 3 ++- .../jdbc/common/util/DatabricksTypeUtilTest.java | 8 ++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java b/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java index 1a65a53ef6..6350597185 100644 --- a/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java +++ b/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java @@ -116,6 +116,8 @@ public static ColumnInfoTypeName getColumnInfoType(String typeName) { return ColumnInfoTypeName.MAP; case DatabricksTypeUtil.INTERVAL: return ColumnInfoTypeName.INTERVAL; + case DatabricksTypeUtil.VARIANT: + return ColumnInfoTypeName.VARIANT; } return ColumnInfoTypeName.USER_DEFINED_TYPE; } @@ -163,6 +165,7 @@ public static int getColumnType(ColumnInfoTypeName typeName) { return Types.STRUCT; case ARRAY: return Types.ARRAY; + case VARIANT: case GEOMETRY: case GEOGRAPHY: case USER_DEFINED_TYPE: @@ -203,6 +206,7 @@ public static String getColumnTypeClassName(ColumnInfoTypeName typeName) { case CHAR: case STRING: case INTERVAL: + case VARIANT: case USER_DEFINED_TYPE: return "java.lang.String"; case TIMESTAMP: diff --git a/src/main/java/com/databricks/jdbc/model/core/ColumnInfoTypeName.java b/src/main/java/com/databricks/jdbc/model/core/ColumnInfoTypeName.java index 1d198fc9d7..3b269ea7b5 100644 --- a/src/main/java/com/databricks/jdbc/model/core/ColumnInfoTypeName.java +++ b/src/main/java/com/databricks/jdbc/model/core/ColumnInfoTypeName.java @@ -30,5 +30,6 @@ public enum ColumnInfoTypeName { STRING, STRUCT, TIMESTAMP, - USER_DEFINED_TYPE; + USER_DEFINED_TYPE, + VARIANT; } diff --git a/src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java b/src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java index fc885b6cb8..f5ae37e12f 100644 --- a/src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java +++ b/src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java @@ -91,7 +91,8 @@ void testGetColumnType() { Map.entry(ColumnInfoTypeName.ARRAY, Types.ARRAY), Map.entry(ColumnInfoTypeName.GEOMETRY, Types.OTHER), Map.entry(ColumnInfoTypeName.GEOGRAPHY, Types.OTHER), - Map.entry(ColumnInfoTypeName.USER_DEFINED_TYPE, Types.OTHER)); + Map.entry(ColumnInfoTypeName.USER_DEFINED_TYPE, Types.OTHER), + Map.entry(ColumnInfoTypeName.VARIANT, Types.OTHER)); expectedMappings.forEach( (typeName, expectedSqlType) -> @@ -132,7 +133,8 @@ void testGetColumnTypeClassName() { Map.entry(ColumnInfoTypeName.GEOGRAPHY, GEOGRAPHY_CLASS_NAME), Map.entry(ColumnInfoTypeName.MAP, "java.util.Map"), Map.entry(ColumnInfoTypeName.NULL, "null"), - Map.entry(ColumnInfoTypeName.VOID, "null")); + Map.entry(ColumnInfoTypeName.VOID, "null"), + Map.entry(ColumnInfoTypeName.VARIANT, "java.lang.String")); expectedMappings.forEach( (columnType, expectedClassName) -> @@ -191,6 +193,7 @@ void testGetMetadataColPrecision() { void testIsSigned() { assertTrue(DatabricksTypeUtil.isSigned(ColumnInfoTypeName.INT)); assertFalse(DatabricksTypeUtil.isSigned(ColumnInfoTypeName.BOOLEAN)); + assertFalse(DatabricksTypeUtil.isSigned(ColumnInfoTypeName.VARIANT)); } @Test @@ -285,6 +288,7 @@ void testInferDatabricksType() { "MAP, MAP", "CHAR, STRING", "INTERVAL, INTERVAL", + "VARIANT, VARIANT", "UNKNOWN, USER_DEFINED_TYPE" }) public void testGetColumnInfoType(String inputTypeName, String expectedTypeName) { From 12fa77787af0d4c4f265fc74b33427e3482524bf Mon Sep 17 00:00:00 2001 From: Sreekanth Vadigi Date: Wed, 8 Apr 2026 09:30:24 +0000 Subject: [PATCH 2/2] Add VARIANT fix changelog entry Signed-off-by: Sreekanth Vadigi Co-authored-by: Isaac Signed-off-by: Sreekanth Vadigi --- NEXT_CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 830d158671..c3caa49c67 100644 --- a/NEXT_CHANGELOG.md +++ b/NEXT_CHANGELOG.md @@ -11,6 +11,7 @@ - Fixed `PARSE_SYNTAX_ERROR` for column names containing special characters (e.g., dots) when `EnableBatchedInserts` is enabled, by re-quoting column names with backticks in reconstructed multi-row INSERT statements. - Fixed Volume ingestion for SEA mode, which was broken due to statement being closed prematurely. - Fixed escaped pattern characters in catalogName for `getSchemas`, as returned catalogName should be unescaped. +- Fixed `getColumnClassName()` returning null for VARIANT columns in SEA mode by adding VARIANT to the type system. --- *Note: When making changes, please add your change under the appropriate section