diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md index 715ea2b447..f02193e158 100644 --- a/NEXT_CHANGELOG.md +++ b/NEXT_CHANGELOG.md @@ -9,7 +9,7 @@ - ### Fixed -- +- Fix: unsupported data types in `setObject(int,Object,int targetSqlType)` method in PreparedStatement --- *Note: When making changes, please add your change under the appropriate section with a brief description.* \ No newline at end of file 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 0b7f57858e..db7b9a5ead 100644 --- a/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java +++ b/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java @@ -53,6 +53,7 @@ public class DatabricksTypeUtil { public static final String ARRAY = "ARRAY"; public static final String STRUCT = "STRUCT"; public static final String VARIANT = "VARIANT"; + public static final String CHAR = "CHAR"; private static final ArrayList SIGNED_TYPES = new ArrayList<>( Arrays.asList( @@ -63,10 +64,12 @@ public class DatabricksTypeUtil { ColumnInfoTypeName.LONG, ColumnInfoTypeName.SHORT)); + // only used for PreparedStatement public static ColumnInfoTypeName getColumnInfoType(String typeName) { switch (typeName) { + case DatabricksTypeUtil.CHAR: case DatabricksTypeUtil.STRING: - return ColumnInfoTypeName.STRING; + return ColumnInfoTypeName.STRING; // both char, string passed as STRING param case DatabricksTypeUtil.DATE: case DatabricksTypeUtil.TIMESTAMP: case DatabricksTypeUtil.TIMESTAMP_NTZ: @@ -79,6 +82,7 @@ public static ColumnInfoTypeName getColumnInfoType(String typeName) { case DatabricksTypeUtil.INT: return ColumnInfoTypeName.INT; case DatabricksTypeUtil.BIGINT: + case DatabricksTypeUtil.LONG: return ColumnInfoTypeName.LONG; case DatabricksTypeUtil.FLOAT: return ColumnInfoTypeName.FLOAT; @@ -359,6 +363,8 @@ public static Nullable getNullableFromValue(Integer isNullable) { */ public static String getDatabricksTypeFromSQLType(int sqlType) { switch (sqlType) { + case Types.CHAR: + return DatabricksTypeUtil.CHAR; case Types.ARRAY: return ARRAY; case Types.BIGINT: @@ -370,13 +376,15 @@ public static String getDatabricksTypeFromSQLType(int sqlType) { case Types.DATE: return DATE; case Types.DECIMAL: - return DECIMAL; + case Types.NUMERIC: + return DECIMAL; // Databricks treats NUMERIC as DECIMAL case Types.BIT: case Types.BOOLEAN: return BOOLEAN; case Types.DOUBLE: return DOUBLE; case Types.FLOAT: + case Types.REAL: // REAL is float(24) return FLOAT; case Types.INTEGER: return INT; 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 add60fe7f0..09b89f4dc0 100644 --- a/src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java +++ b/src/test/java/com/databricks/jdbc/common/util/DatabricksTypeUtilTest.java @@ -158,6 +158,8 @@ void testGetDatabricksTypeFromSQLType() { DatabricksTypeUtil.INT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.INTEGER)); assertEquals( DatabricksTypeUtil.STRING, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.VARCHAR)); + assertEquals( + DatabricksTypeUtil.CHAR, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.CHAR)); assertEquals( DatabricksTypeUtil.STRING, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.LONGVARCHAR)); @@ -178,6 +180,8 @@ void testGetDatabricksTypeFromSQLType() { assertEquals( DatabricksTypeUtil.BINARY, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.LONGVARBINARY)); + assertEquals( + DatabricksTypeUtil.DECIMAL, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.NUMERIC)); assertEquals( DatabricksTypeUtil.DATE, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.DATE)); assertEquals( @@ -188,6 +192,8 @@ void testGetDatabricksTypeFromSQLType() { DatabricksTypeUtil.DOUBLE, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.DOUBLE)); assertEquals( DatabricksTypeUtil.FLOAT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.FLOAT)); + assertEquals( + DatabricksTypeUtil.FLOAT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.REAL)); assertEquals( DatabricksTypeUtil.TIMESTAMP_NTZ, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.TIMESTAMP)); @@ -234,6 +240,7 @@ void testInferDatabricksType() { "BYTE, BYTE", "INT, INT", "BIGINT, LONG", + "LONG, LONG", "FLOAT, FLOAT", "DOUBLE, DOUBLE", "BINARY, BINARY", @@ -244,6 +251,7 @@ void testInferDatabricksType() { "VOID, NULL", "NULL, NULL", "MAP, MAP", + "CHAR, STRING", "UNKNOWN, USER_DEFINED_TYPE" }) public void testGetColumnInfoType(String inputTypeName, String expectedTypeName) {