From a58699ce33df9d830dfbde428d14e42405f8cbf7 Mon Sep 17 00:00:00 2001 From: Shivam Raj Date: Wed, 7 May 2025 15:08:57 +0530 Subject: [PATCH 1/3] added real, numeric, char and long support in setObject method --- .../databricks/jdbc/common/util/DatabricksTypeUtil.java | 7 +++++++ .../jdbc/common/util/DatabricksTypeUtilTest.java | 8 ++++++++ 2 files changed, 15 insertions(+) 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..a8a3dad7e2 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( @@ -65,6 +66,7 @@ public class DatabricksTypeUtil { public static ColumnInfoTypeName getColumnInfoType(String typeName) { switch (typeName) { + case DatabricksTypeUtil.CHAR: case DatabricksTypeUtil.STRING: return ColumnInfoTypeName.STRING; case DatabricksTypeUtil.DATE: @@ -79,6 +81,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 +362,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,6 +375,7 @@ public static String getDatabricksTypeFromSQLType(int sqlType) { case Types.DATE: return DATE; case Types.DECIMAL: + case Types.NUMERIC: return DECIMAL; case Types.BIT: case Types.BOOLEAN: @@ -377,6 +383,7 @@ public static String getDatabricksTypeFromSQLType(int sqlType) { case Types.DOUBLE: return DOUBLE; case Types.FLOAT: + case Types.REAL: 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) { From 0f7672d06094c41d5d15c359eb0c220777d60a75 Mon Sep 17 00:00:00 2001 From: Shivam Raj Date: Wed, 7 May 2025 15:14:40 +0530 Subject: [PATCH 2/3] updated nextchangelog.md --- NEXT_CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 4b7ae168eed3c998dd790576ea2f8544be9d2ad6 Mon Sep 17 00:00:00 2001 From: Shivam Raj Date: Thu, 8 May 2025 18:52:06 +0530 Subject: [PATCH 3/3] added comments --- .../databricks/jdbc/common/util/DatabricksTypeUtil.java | 7 ++++--- 1 file changed, 4 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 a8a3dad7e2..db7b9a5ead 100644 --- a/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java +++ b/src/main/java/com/databricks/jdbc/common/util/DatabricksTypeUtil.java @@ -64,11 +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: @@ -376,14 +377,14 @@ public static String getDatabricksTypeFromSQLType(int sqlType) { return DATE; case Types.DECIMAL: case Types.NUMERIC: - return DECIMAL; + 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: + case Types.REAL: // REAL is float(24) return FLOAT; case Types.INTEGER: return INT;