Skip to content

Commit e0ef2e7

Browse files
authored
Add VARIANT type to ColumnInfoTypeName for correct SEA metadata (#1388)
## Summary - VARIANT columns in the SEA path returned `null` for `getColumnClassName()` because `ColumnInfoTypeName` had no `VARIANT` enum value, causing Jackson deserialization to fail silently - Added `VARIANT` to the enum and all relevant type mapping methods (`getColumnInfoType`, `getColumnType`, `getColumnTypeClassName`) so both SEA and Thrift paths return consistent metadata (`java.lang.String`, `Types.OTHER`) - Added test coverage for all new VARIANT mappings ## Test plan - [x] `DatabricksTypeUtilTest` — 59 tests pass (includes new VARIANT assertions in `testGetColumnType`, `testGetColumnTypeClassName`, `testGetColumnInfoType`, `testIsSigned`) - [x] `DatabricksResultSetMetaDataTest` — 28 tests pass - [x] E2E verification: ran `example_run_variant` against live workspace — both THRIFT and SEA return `ColumnClassName=java.lang.String, ColumnTypeName=VARIANT` This pull request was AI-assisted by Isaac. --------- Signed-off-by: Sreekanth Vadigi <[email protected]>
1 parent f2f57ec commit e0ef2e7

File tree

4 files changed

+13
-3
lines changed

4 files changed

+13
-3
lines changed

NEXT_CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- 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.
1212
- Fixed Volume ingestion for SEA mode, which was broken due to statement being closed prematurely.
1313
- Fixed escaped pattern characters in catalogName for `getSchemas`, as returned catalogName should be unescaped.
14+
- Fixed `getColumnClassName()` returning null for VARIANT columns in SEA mode by adding VARIANT to the type system.
1415
- Fixed `getColumns()` returning `DATA_TYPE=0` (NULL) for GEOMETRY/GEOGRAPHY columns in Thrift mode. Now returns `Types.VARCHAR` (12) when geospatial is disabled and `Types.OTHER` (1111) when enabled, consistent with SEA mode.
1516

1617
---

src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ public static ColumnInfoTypeName getColumnInfoType(String typeName) {
116116
return ColumnInfoTypeName.MAP;
117117
case DatabricksTypeUtil.INTERVAL:
118118
return ColumnInfoTypeName.INTERVAL;
119+
case DatabricksTypeUtil.VARIANT:
120+
return ColumnInfoTypeName.VARIANT;
119121
}
120122
return ColumnInfoTypeName.USER_DEFINED_TYPE;
121123
}
@@ -163,6 +165,7 @@ public static int getColumnType(ColumnInfoTypeName typeName) {
163165
return Types.STRUCT;
164166
case ARRAY:
165167
return Types.ARRAY;
168+
case VARIANT:
166169
case GEOMETRY:
167170
case GEOGRAPHY:
168171
case USER_DEFINED_TYPE:
@@ -203,6 +206,7 @@ public static String getColumnTypeClassName(ColumnInfoTypeName typeName) {
203206
case CHAR:
204207
case STRING:
205208
case INTERVAL:
209+
case VARIANT:
206210
case USER_DEFINED_TYPE:
207211
return "java.lang.String";
208212
case TIMESTAMP:

src/main/java/com/databricks/jdbc/model/core/ColumnInfoTypeName.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ public enum ColumnInfoTypeName {
3030
STRING,
3131
STRUCT,
3232
TIMESTAMP,
33-
USER_DEFINED_TYPE;
33+
USER_DEFINED_TYPE,
34+
VARIANT;
3435
}

src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ void testGetColumnType() {
9191
Map.entry(ColumnInfoTypeName.ARRAY, Types.ARRAY),
9292
Map.entry(ColumnInfoTypeName.GEOMETRY, Types.OTHER),
9393
Map.entry(ColumnInfoTypeName.GEOGRAPHY, Types.OTHER),
94-
Map.entry(ColumnInfoTypeName.USER_DEFINED_TYPE, Types.OTHER));
94+
Map.entry(ColumnInfoTypeName.USER_DEFINED_TYPE, Types.OTHER),
95+
Map.entry(ColumnInfoTypeName.VARIANT, Types.OTHER));
9596

9697
expectedMappings.forEach(
9798
(typeName, expectedSqlType) ->
@@ -132,7 +133,8 @@ void testGetColumnTypeClassName() {
132133
Map.entry(ColumnInfoTypeName.GEOGRAPHY, GEOGRAPHY_CLASS_NAME),
133134
Map.entry(ColumnInfoTypeName.MAP, "java.util.Map"),
134135
Map.entry(ColumnInfoTypeName.NULL, "null"),
135-
Map.entry(ColumnInfoTypeName.VOID, "null"));
136+
Map.entry(ColumnInfoTypeName.VOID, "null"),
137+
Map.entry(ColumnInfoTypeName.VARIANT, "java.lang.String"));
136138

137139
expectedMappings.forEach(
138140
(columnType, expectedClassName) ->
@@ -191,6 +193,7 @@ void testGetMetadataColPrecision() {
191193
void testIsSigned() {
192194
assertTrue(DatabricksTypeUtil.isSigned(ColumnInfoTypeName.INT));
193195
assertFalse(DatabricksTypeUtil.isSigned(ColumnInfoTypeName.BOOLEAN));
196+
assertFalse(DatabricksTypeUtil.isSigned(ColumnInfoTypeName.VARIANT));
194197
}
195198

196199
@Test
@@ -285,6 +288,7 @@ void testInferDatabricksType() {
285288
"MAP, MAP",
286289
"CHAR, STRING",
287290
"INTERVAL, INTERVAL",
291+
"VARIANT, VARIANT",
288292
"UNKNOWN, USER_DEFINED_TYPE"
289293
})
290294
public void testGetColumnInfoType(String inputTypeName, String expectedTypeName) {

0 commit comments

Comments
 (0)