Skip to content

Commit 72636bf

Browse files
authored
Merge branch 'databricks:main' into main
2 parents b84d320 + e0ef2e7 commit 72636bf

File tree

6 files changed

+64
-5
lines changed

6 files changed

+64
-5
lines changed

NEXT_CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
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.
15+
- 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.
1416

1517
---
1618
*Note: When making changes, please add your change under the appropriate section

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/dbclient/impl/common/MetadataResultSetBuilder.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,8 @@ int getCode(String s) {
11311131
case "CHARACTER":
11321132
return 1;
11331133
case "VARIANT":
1134+
case "GEOMETRY":
1135+
case "GEOGRAPHY":
11341136
return 1111;
11351137
}
11361138
if (s.startsWith(INTERVAL)) {
@@ -1626,8 +1628,10 @@ List<List<Object>> getThriftRows(List<List<Object>> rows, List<ResultColumn> col
16261628
}
16271629
}
16281630
if (column.getColumnName().equals(DATA_TYPE_COLUMN.getColumnName())) {
1629-
// Check if complex datatype support is disabled and this is a complex type
1630-
if (!ctx.isComplexDatatypeSupportEnabled() && isComplexType(typeVal)) {
1631+
// Check if geospatial support is disabled and this is a geospatial type
1632+
if (!ctx.isGeoSpatialSupportEnabled() && isGeospatialType(typeVal)) {
1633+
object = Types.VARCHAR;
1634+
} else if (!ctx.isComplexDatatypeSupportEnabled() && isComplexType(typeVal)) {
16311635
object = Types.VARCHAR;
16321636
} else {
16331637
object = getCode(stripBaseTypeName(typeVal));

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) {

src/test/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilderTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ void testGetCode() {
7171
assert metadataResultSetBuilder.getCode("SMALLINT") == 5;
7272
assert metadataResultSetBuilder.getCode("INTEGER") == 4;
7373
assert metadataResultSetBuilder.getCode("VARIANT") == 1111;
74+
assert metadataResultSetBuilder.getCode("GEOMETRY") == 1111;
75+
assert metadataResultSetBuilder.getCode("GEOGRAPHY") == 1111;
7476
assert metadataResultSetBuilder.getCode("INTERVAL") == 12;
7577
assert metadataResultSetBuilder.getCode("INTERVAL YEAR") == 12;
7678
}
@@ -818,6 +820,48 @@ void testColumnDefIsPreservedInGetThriftRowsWhenDefaultExists() {
818820
"'42'", updatedRows.get(0).get(12), "COLUMN_DEF should return the actual default value");
819821
}
820822

823+
@Test
824+
void testGetThriftRowsGeospatialDataTypeWhenDisabled() {
825+
// When geospatial support is disabled, GEOMETRY/GEOGRAPHY DATA_TYPE should be VARCHAR (12)
826+
when(connectionContext.isGeoSpatialSupportEnabled()).thenReturn(false);
827+
lenient().when(connectionContext.isComplexDatatypeSupportEnabled()).thenReturn(true);
828+
829+
for (String typeName : List.of("GEOMETRY", "GEOGRAPHY")) {
830+
List<Object> row =
831+
Arrays.asList(
832+
"cat", "schema", "tbl", "col", 0, typeName, 10, null, 0, 10, 1, "", null, null, null,
833+
null, 0, "YES", null, null, null, null, "NO", "NO");
834+
List<List<Object>> updatedRows =
835+
metadataResultSetBuilder.getThriftRows(List.of(row), COLUMN_COLUMNS);
836+
837+
assertEquals(
838+
Types.VARCHAR,
839+
updatedRows.get(0).get(4),
840+
typeName + " DATA_TYPE should be VARCHAR (12) when geospatial is disabled");
841+
}
842+
}
843+
844+
@Test
845+
void testGetThriftRowsGeospatialDataTypeWhenEnabled() {
846+
// When geospatial support is enabled, GEOMETRY/GEOGRAPHY DATA_TYPE should be OTHER (1111)
847+
when(connectionContext.isGeoSpatialSupportEnabled()).thenReturn(true);
848+
when(connectionContext.isComplexDatatypeSupportEnabled()).thenReturn(true);
849+
850+
for (String typeName : List.of("GEOMETRY", "GEOGRAPHY")) {
851+
List<Object> row =
852+
Arrays.asList(
853+
"cat", "schema", "tbl", "col", 0, typeName, 10, null, 0, 10, 1, "", null, null, null,
854+
null, 0, "YES", null, null, null, null, "NO", "NO");
855+
List<List<Object>> updatedRows =
856+
metadataResultSetBuilder.getThriftRows(List.of(row), COLUMN_COLUMNS);
857+
858+
assertEquals(
859+
Types.OTHER,
860+
updatedRows.get(0).get(4),
861+
typeName + " DATA_TYPE should be OTHER (1111) when geospatial is enabled");
862+
}
863+
}
864+
821865
private static Stream<Arguments> provideColumnDefTypeNames() {
822866
return Stream.of(
823867
Arguments.of("INT"),

0 commit comments

Comments
 (0)