diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 830d158671..d03b411238 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 `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. --- *Note: When making changes, please add your change under the appropriate section diff --git a/src/main/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilder.java b/src/main/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilder.java index 9d5aba0a41..e79f62ff0c 100644 --- a/src/main/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilder.java +++ b/src/main/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilder.java @@ -1131,6 +1131,8 @@ int getCode(String s) { case "CHARACTER": return 1; case "VARIANT": + case "GEOMETRY": + case "GEOGRAPHY": return 1111; } if (s.startsWith(INTERVAL)) { @@ -1626,8 +1628,10 @@ List> getThriftRows(List> rows, List col } } if (column.getColumnName().equals(DATA_TYPE_COLUMN.getColumnName())) { - // Check if complex datatype support is disabled and this is a complex type - if (!ctx.isComplexDatatypeSupportEnabled() && isComplexType(typeVal)) { + // Check if geospatial support is disabled and this is a geospatial type + if (!ctx.isGeoSpatialSupportEnabled() && isGeospatialType(typeVal)) { + object = Types.VARCHAR; + } else if (!ctx.isComplexDatatypeSupportEnabled() && isComplexType(typeVal)) { object = Types.VARCHAR; } else { object = getCode(stripBaseTypeName(typeVal)); diff --git a/src/test/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilderTest.java b/src/test/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilderTest.java index 03beee246b..db849a10cd 100644 --- a/src/test/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilderTest.java +++ b/src/test/java/com/databricks/jdbc/dbclient/impl/common/MetadataResultSetBuilderTest.java @@ -71,6 +71,8 @@ void testGetCode() { assert metadataResultSetBuilder.getCode("SMALLINT") == 5; assert metadataResultSetBuilder.getCode("INTEGER") == 4; assert metadataResultSetBuilder.getCode("VARIANT") == 1111; + assert metadataResultSetBuilder.getCode("GEOMETRY") == 1111; + assert metadataResultSetBuilder.getCode("GEOGRAPHY") == 1111; assert metadataResultSetBuilder.getCode("INTERVAL") == 12; assert metadataResultSetBuilder.getCode("INTERVAL YEAR") == 12; } @@ -818,6 +820,48 @@ void testColumnDefIsPreservedInGetThriftRowsWhenDefaultExists() { "'42'", updatedRows.get(0).get(12), "COLUMN_DEF should return the actual default value"); } + @Test + void testGetThriftRowsGeospatialDataTypeWhenDisabled() { + // When geospatial support is disabled, GEOMETRY/GEOGRAPHY DATA_TYPE should be VARCHAR (12) + when(connectionContext.isGeoSpatialSupportEnabled()).thenReturn(false); + lenient().when(connectionContext.isComplexDatatypeSupportEnabled()).thenReturn(true); + + for (String typeName : List.of("GEOMETRY", "GEOGRAPHY")) { + List row = + Arrays.asList( + "cat", "schema", "tbl", "col", 0, typeName, 10, null, 0, 10, 1, "", null, null, null, + null, 0, "YES", null, null, null, null, "NO", "NO"); + List> updatedRows = + metadataResultSetBuilder.getThriftRows(List.of(row), COLUMN_COLUMNS); + + assertEquals( + Types.VARCHAR, + updatedRows.get(0).get(4), + typeName + " DATA_TYPE should be VARCHAR (12) when geospatial is disabled"); + } + } + + @Test + void testGetThriftRowsGeospatialDataTypeWhenEnabled() { + // When geospatial support is enabled, GEOMETRY/GEOGRAPHY DATA_TYPE should be OTHER (1111) + when(connectionContext.isGeoSpatialSupportEnabled()).thenReturn(true); + when(connectionContext.isComplexDatatypeSupportEnabled()).thenReturn(true); + + for (String typeName : List.of("GEOMETRY", "GEOGRAPHY")) { + List row = + Arrays.asList( + "cat", "schema", "tbl", "col", 0, typeName, 10, null, 0, 10, 1, "", null, null, null, + null, 0, "YES", null, null, null, null, "NO", "NO"); + List> updatedRows = + metadataResultSetBuilder.getThriftRows(List.of(row), COLUMN_COLUMNS); + + assertEquals( + Types.OTHER, + updatedRows.get(0).get(4), + typeName + " DATA_TYPE should be OTHER (1111) when geospatial is enabled"); + } + } + private static Stream provideColumnDefTypeNames() { return Stream.of( Arguments.of("INT"),