Skip to content

Commit e32739b

Browse files
Fix errors in table creation when using BIGINT, SMALLINT, TINYINT, or VOID types (#1069)
## Description This PR fixes an issue in the Databricks JDBC driver where `PreparedStatement.getMetaData()` would throw exceptions for certain column types. Specifically, it now correctly handles: - `BIGINT` - `SMALLINT` - `TINYINT` - `VOID` Previously, attempting to get metadata for these types would fail with exceptions such as `IllegalArgumentException` or `IllegalStateException`, preventing normal JDBC usage. **Notes:** - `INTERVAL` columns are not included in this fix because they cannot currently be used in `CREATE TABLE` statements, so testing and support are not possible at this time. - `GEOMETRY` and `GEOGRAPHY` types are still in preview and tables with these columns could not be created. As a result, they are not yet fully supported by `getMetaData()`. This change ensures that `ResultSetMetaData` is correctly returned for all supported numeric and void types, improving compatibility and stability for JDBC clients. **Fixes**: [databricks-jdbc #1064](#1064) ## Testing The following testing was performed to validate the fix: 1. **Unit tests** - Added tests covering tables with columns of type `BIGINT`, `SMALLINT`, `TINYINT`, and `VOID`. - Verified that calling `getMetaData()` does not throw exceptions and returns the correct metadata. 2. **Manual testing** - Created a table with a `BIGINT` column and retrieved its metadata: ```java try (Connection conn = driver.connect(url, props)) { try (PreparedStatement st = conn.prepareStatement("create or replace table simple_test_2856371 (col bigint)")) { st.execute(); } try (PreparedStatement st = conn.prepareStatement("select t.* from simple_test_2856371 as t")) { ResultSetMetaData rsmd = st.getMetaData(); assert rsmd.getColumnCount() == 1; assert "BIGINT".equals(rsmd.getColumnTypeName(1)); } } ``` 3. **Regression checks** - Confirmed that other supported column types continue to return metadata correctly. - Verified that driver behavior remains consistent across different JDBC operations. - Local testing <img width="1598" height="1039" alt="Screenshot 2025-11-08 at 19 33 10" src="https://github.com/user-attachments/assets/444ef818-de0d-4ed8-b258-3ebd94b2a256" /> <img width="1598" height="1039" alt="Screenshot 2025-11-08 at 19 33 02" src="https://github.com/user-attachments/assets/41a0bcfa-6147-45b5-9757-638b3c2b4fa8" /> --------- Signed-off-by: Roman Dryndik <dryndikroman@gmail.com> Co-authored-by: Samikshya Chand <148681192+samikshya-db@users.noreply.github.com>
1 parent 66c0599 commit e32739b

4 files changed

Lines changed: 143 additions & 96 deletions

File tree

NEXT_CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@
99
- Minimized OAuth requests by reducing calls in feature flags and telemetry.
1010

1111
### Fixed
12+
- Fixed: Errors in table creation when using BIGINT, SMALLINT, TINYINT, or VOID types.
13+
- Fixed: PreparedStatement.getMetaData() now correctly reports TINYINT columns as Types.TINYINT (java.lang.Byte) instead of Types.SMALLINT (java.lang.Integer).
1214
---
1315
*Note: When making changes, please add your change under the appropriate section with a brief description.*

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

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public class DatabricksTypeUtil {
4242
public static final String INT = "INT";
4343
public static final String BYTE = "BYTE";
4444
public static final String VOID = "VOID";
45-
public static final String SMALLINT = "SHORT";
45+
public static final String SHORT = "SHORT";
46+
public static final String SMALLINT = "SMALLINT";
4647
public static final String NULL = "NULL";
4748
public static final String STRING = "STRING";
4849
public static final String TINYINT = "TINYINT";
@@ -68,7 +69,11 @@ public class DatabricksTypeUtil {
6869
ColumnInfoTypeName.FLOAT,
6970
ColumnInfoTypeName.INT,
7071
ColumnInfoTypeName.LONG,
71-
ColumnInfoTypeName.SHORT));
72+
ColumnInfoTypeName.SHORT,
73+
ColumnInfoTypeName.SMALLINT,
74+
ColumnInfoTypeName.TINYINT,
75+
ColumnInfoTypeName.BYTE,
76+
ColumnInfoTypeName.BIGINT));
7277

7378
// only used for PreparedStatement
7479
public static ColumnInfoTypeName getColumnInfoType(String typeName) {
@@ -81,8 +86,10 @@ public static ColumnInfoTypeName getColumnInfoType(String typeName) {
8186
case DatabricksTypeUtil.TIMESTAMP_NTZ:
8287
return ColumnInfoTypeName.TIMESTAMP;
8388
case DatabricksTypeUtil.SMALLINT:
84-
case DatabricksTypeUtil.TINYINT:
89+
case DatabricksTypeUtil.SHORT:
8590
return ColumnInfoTypeName.SHORT;
91+
case DatabricksTypeUtil.TINYINT:
92+
return ColumnInfoTypeName.TINYINT;
8693
case DatabricksTypeUtil.BYTE:
8794
return ColumnInfoTypeName.BYTE;
8895
case DatabricksTypeUtil.INT:
@@ -118,14 +125,19 @@ public static int getColumnType(ColumnInfoTypeName typeName) {
118125
return Types.OTHER;
119126
}
120127
switch (typeName) {
128+
case TINYINT:
121129
case BYTE:
122130
return Types.TINYINT;
131+
case SMALLINT:
123132
case SHORT:
124133
return Types.SMALLINT;
125134
case INT:
126135
return Types.INTEGER;
127136
case LONG:
137+
case BIGINT:
128138
return Types.BIGINT;
139+
case VOID:
140+
return Types.OTHER;
129141
case FLOAT:
130142
return Types.FLOAT;
131143
case DOUBLE:
@@ -169,8 +181,13 @@ public static String getColumnTypeClassName(ColumnInfoTypeName typeName) {
169181
switch (typeName) {
170182
case BYTE:
171183
case SHORT:
184+
case SMALLINT:
185+
return "java.lang.Short";
172186
case INT:
173187
return "java.lang.Integer";
188+
case TINYINT:
189+
return "java.lang.Byte";
190+
case BIGINT:
174191
case LONG:
175192
return "java.lang.Long";
176193
case FLOAT:
@@ -201,6 +218,7 @@ public static String getColumnTypeClassName(ColumnInfoTypeName typeName) {
201218
case GEOGRAPHY:
202219
return GEOGRAPHY_CLASS_NAME;
203220
case NULL:
221+
case VOID:
204222
return "null";
205223
case MAP:
206224
return "java.util.Map";

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
public enum ColumnInfoTypeName {
99
ARRAY,
1010
BINARY,
11+
BIGINT,
12+
SMALLINT,
13+
TINYINT,
14+
VOID,
1115
BOOLEAN,
1216
BYTE,
1317
CHAR,

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

Lines changed: 116 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.sql.SQLException;
1313
import java.sql.Timestamp;
1414
import java.sql.Types;
15+
import java.util.Map;
1516
import java.util.stream.Stream;
1617
import org.apache.arrow.vector.types.DateUnit;
1718
import org.apache.arrow.vector.types.FloatingPointPrecision;
@@ -46,6 +47,11 @@ static Stream<Object[]> dataProvider() {
4647
new Object[] {TTypeId.TIMESTAMP_TYPE, new ArrowType.Timestamp(TimeUnit.MICROSECOND, null)},
4748
new Object[] {TTypeId.BINARY_TYPE, ArrowType.Binary.INSTANCE},
4849
new Object[] {TTypeId.NULL_TYPE, ArrowType.Null.INSTANCE},
50+
new Object[] {TTypeId.ARRAY_TYPE, ArrowType.Utf8.INSTANCE},
51+
new Object[] {TTypeId.MAP_TYPE, ArrowType.Utf8.INSTANCE},
52+
new Object[] {TTypeId.STRUCT_TYPE, ArrowType.Utf8.INSTANCE},
53+
new Object[] {TTypeId.USER_DEFINED_TYPE, ArrowType.Utf8.INSTANCE},
54+
new Object[] {TTypeId.DECIMAL_TYPE, ArrowType.Utf8.INSTANCE},
4955
new Object[] {TTypeId.DATE_TYPE, new ArrowType.Date(DateUnit.DAY)});
5056
}
5157

@@ -59,47 +65,82 @@ public void testMapToArrowType(TTypeId typeId, ArrowType expectedArrowType) thro
5965

6066
@Test
6167
void testGetColumnType() {
62-
assertEquals(Types.TINYINT, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.BYTE));
63-
assertEquals(Types.SMALLINT, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.SHORT));
64-
assertEquals(Types.BIGINT, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.LONG));
65-
assertEquals(Types.FLOAT, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.FLOAT));
66-
assertEquals(Types.DECIMAL, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.DECIMAL));
67-
assertEquals(Types.BINARY, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.BINARY));
68-
assertEquals(Types.BOOLEAN, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.BOOLEAN));
69-
assertEquals(Types.CHAR, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.CHAR));
70-
assertEquals(Types.TIMESTAMP, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.TIMESTAMP));
71-
assertEquals(Types.DATE, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.DATE));
72-
assertEquals(Types.STRUCT, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.STRUCT));
73-
assertEquals(Types.ARRAY, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.ARRAY));
74-
assertEquals(Types.VARCHAR, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.NULL));
75-
assertEquals(
76-
Types.OTHER, DatabricksTypeUtil.getColumnType(ColumnInfoTypeName.USER_DEFINED_TYPE));
68+
Map<ColumnInfoTypeName, Integer> expectedMappings =
69+
Map.ofEntries(
70+
Map.entry(ColumnInfoTypeName.BYTE, Types.TINYINT),
71+
Map.entry(ColumnInfoTypeName.SHORT, Types.SMALLINT),
72+
Map.entry(ColumnInfoTypeName.SMALLINT, Types.SMALLINT),
73+
Map.entry(ColumnInfoTypeName.INT, Types.INTEGER),
74+
Map.entry(ColumnInfoTypeName.LONG, Types.BIGINT),
75+
Map.entry(ColumnInfoTypeName.BIGINT, Types.BIGINT),
76+
Map.entry(ColumnInfoTypeName.TINYINT, Types.TINYINT),
77+
Map.entry(ColumnInfoTypeName.VOID, Types.OTHER),
78+
Map.entry(ColumnInfoTypeName.FLOAT, Types.FLOAT),
79+
Map.entry(ColumnInfoTypeName.DOUBLE, Types.DOUBLE),
80+
Map.entry(ColumnInfoTypeName.DECIMAL, Types.DECIMAL),
81+
Map.entry(ColumnInfoTypeName.BINARY, Types.BINARY),
82+
Map.entry(ColumnInfoTypeName.BOOLEAN, Types.BOOLEAN),
83+
Map.entry(ColumnInfoTypeName.CHAR, Types.CHAR),
84+
Map.entry(ColumnInfoTypeName.STRING, Types.VARCHAR),
85+
Map.entry(ColumnInfoTypeName.MAP, Types.VARCHAR),
86+
Map.entry(ColumnInfoTypeName.INTERVAL, Types.VARCHAR),
87+
Map.entry(ColumnInfoTypeName.NULL, Types.VARCHAR),
88+
Map.entry(ColumnInfoTypeName.TIMESTAMP, Types.TIMESTAMP),
89+
Map.entry(ColumnInfoTypeName.DATE, Types.DATE),
90+
Map.entry(ColumnInfoTypeName.STRUCT, Types.STRUCT),
91+
Map.entry(ColumnInfoTypeName.ARRAY, Types.ARRAY),
92+
Map.entry(ColumnInfoTypeName.GEOMETRY, Types.OTHER),
93+
Map.entry(ColumnInfoTypeName.GEOGRAPHY, Types.OTHER),
94+
Map.entry(ColumnInfoTypeName.USER_DEFINED_TYPE, Types.OTHER));
95+
96+
expectedMappings.forEach(
97+
(typeName, expectedSqlType) ->
98+
assertEquals(
99+
expectedSqlType,
100+
DatabricksTypeUtil.getColumnType(typeName),
101+
() -> "Unexpected type for " + typeName));
102+
assertEquals(Types.OTHER, DatabricksTypeUtil.getColumnType(null));
77103
}
78104

79105
@Test
80106
void testGetColumnTypeClassName() {
81-
assertEquals(
82-
"java.lang.Long", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.LONG));
83-
assertEquals(
84-
"java.lang.Float", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.FLOAT));
85-
assertEquals(
86-
"java.lang.Double", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.DOUBLE));
87-
assertEquals(
88-
"java.math.BigDecimal",
89-
DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.DECIMAL));
90-
assertEquals("[B", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.BINARY));
91-
assertEquals(
92-
"java.sql.Date", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.DATE));
93-
assertEquals(
94-
"java.sql.Struct", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.STRUCT));
95-
assertEquals(
96-
"java.sql.Array", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.ARRAY));
97-
assertEquals(
98-
"java.util.Map", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.MAP));
99-
assertEquals("null", DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.NULL));
100-
assertEquals(
101-
"java.sql.Timestamp",
102-
DatabricksTypeUtil.getColumnTypeClassName(ColumnInfoTypeName.TIMESTAMP));
107+
final String GEOMETRY_CLASS_NAME = "com.databricks.jdbc.api.IGeometry";
108+
final String GEOGRAPHY_CLASS_NAME = "com.databricks.jdbc.api.IGeography";
109+
Map<ColumnInfoTypeName, String> expectedMappings =
110+
Map.ofEntries(
111+
Map.entry(ColumnInfoTypeName.BYTE, "java.lang.Short"),
112+
Map.entry(ColumnInfoTypeName.SHORT, "java.lang.Short"),
113+
Map.entry(ColumnInfoTypeName.SMALLINT, "java.lang.Short"),
114+
Map.entry(ColumnInfoTypeName.INT, "java.lang.Integer"),
115+
Map.entry(ColumnInfoTypeName.TINYINT, "java.lang.Byte"),
116+
Map.entry(ColumnInfoTypeName.LONG, "java.lang.Long"),
117+
Map.entry(ColumnInfoTypeName.BIGINT, "java.lang.Long"),
118+
Map.entry(ColumnInfoTypeName.FLOAT, "java.lang.Float"),
119+
Map.entry(ColumnInfoTypeName.DOUBLE, "java.lang.Double"),
120+
Map.entry(ColumnInfoTypeName.DECIMAL, "java.math.BigDecimal"),
121+
Map.entry(ColumnInfoTypeName.BINARY, "[B"),
122+
Map.entry(ColumnInfoTypeName.BOOLEAN, "java.lang.Boolean"),
123+
Map.entry(ColumnInfoTypeName.CHAR, "java.lang.String"),
124+
Map.entry(ColumnInfoTypeName.STRING, "java.lang.String"),
125+
Map.entry(ColumnInfoTypeName.INTERVAL, "java.lang.String"),
126+
Map.entry(ColumnInfoTypeName.USER_DEFINED_TYPE, "java.lang.String"),
127+
Map.entry(ColumnInfoTypeName.TIMESTAMP, "java.sql.Timestamp"),
128+
Map.entry(ColumnInfoTypeName.DATE, "java.sql.Date"),
129+
Map.entry(ColumnInfoTypeName.STRUCT, "java.sql.Struct"),
130+
Map.entry(ColumnInfoTypeName.ARRAY, "java.sql.Array"),
131+
Map.entry(ColumnInfoTypeName.GEOMETRY, GEOMETRY_CLASS_NAME),
132+
Map.entry(ColumnInfoTypeName.GEOGRAPHY, GEOGRAPHY_CLASS_NAME),
133+
Map.entry(ColumnInfoTypeName.MAP, "java.util.Map"),
134+
Map.entry(ColumnInfoTypeName.NULL, "null"),
135+
Map.entry(ColumnInfoTypeName.VOID, "null"));
136+
137+
expectedMappings.forEach(
138+
(columnType, expectedClassName) ->
139+
assertEquals(
140+
expectedClassName,
141+
DatabricksTypeUtil.getColumnTypeClassName(columnType),
142+
() -> "Unexpected type for " + columnType));
143+
assertEquals("null", DatabricksTypeUtil.getColumnTypeClassName(null));
103144
}
104145

105146
@Test
@@ -154,61 +195,42 @@ void testIsSigned() {
154195

155196
@Test
156197
void testGetDatabricksTypeFromSQLType() {
157-
assertEquals(
158-
DatabricksTypeUtil.INT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.INTEGER));
159-
assertEquals(
160-
DatabricksTypeUtil.STRING, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.VARCHAR));
161-
assertEquals(
162-
DatabricksTypeUtil.CHAR, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.CHAR));
163-
assertEquals(
164-
DatabricksTypeUtil.STRING,
165-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.LONGVARCHAR));
166-
assertEquals(
167-
DatabricksTypeUtil.STRING, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.NVARCHAR));
168-
assertEquals(
169-
DatabricksTypeUtil.STRING,
170-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.LONGNVARCHAR));
171-
assertEquals(
172-
DatabricksTypeUtil.ARRAY, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.ARRAY));
173-
assertEquals(
174-
DatabricksTypeUtil.LONG, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.BIGINT));
175-
assertEquals(
176-
DatabricksTypeUtil.BINARY, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.BINARY));
177-
assertEquals(
178-
DatabricksTypeUtil.BINARY,
179-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.VARBINARY));
180-
assertEquals(
181-
DatabricksTypeUtil.BINARY,
182-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.LONGVARBINARY));
183-
assertEquals(
184-
DatabricksTypeUtil.DECIMAL, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.NUMERIC));
185-
assertEquals(
186-
DatabricksTypeUtil.DATE, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.DATE));
187-
assertEquals(
188-
DatabricksTypeUtil.DECIMAL, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.DECIMAL));
189-
assertEquals(
190-
DatabricksTypeUtil.BOOLEAN, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.BOOLEAN));
191-
assertEquals(
192-
DatabricksTypeUtil.DOUBLE, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.DOUBLE));
193-
assertEquals(
194-
DatabricksTypeUtil.FLOAT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.FLOAT));
195-
assertEquals(
196-
DatabricksTypeUtil.FLOAT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.REAL));
197-
assertEquals(
198-
DatabricksTypeUtil.TIMESTAMP_NTZ,
199-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.TIMESTAMP));
200-
assertEquals(
201-
DatabricksTypeUtil.TIMESTAMP,
202-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.TIMESTAMP_WITH_TIMEZONE));
203-
assertEquals(
204-
DatabricksTypeUtil.STRUCT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.STRUCT));
205-
assertEquals(
206-
DatabricksTypeUtil.STRUCT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.STRUCT));
207-
assertEquals(
208-
DatabricksTypeUtil.SMALLINT,
209-
DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.SMALLINT));
210-
assertEquals(
211-
DatabricksTypeUtil.TINYINT, DatabricksTypeUtil.getDatabricksTypeFromSQLType(Types.TINYINT));
198+
final int UNKNOWN_TYPE = 1000;
199+
final String NULL = "NULL";
200+
Map<Integer, String> expectedMappings =
201+
Map.ofEntries(
202+
Map.entry(Types.INTEGER, DatabricksTypeUtil.INT),
203+
Map.entry(Types.VARCHAR, DatabricksTypeUtil.STRING),
204+
Map.entry(Types.CHAR, DatabricksTypeUtil.CHAR),
205+
Map.entry(Types.LONGVARCHAR, DatabricksTypeUtil.STRING),
206+
Map.entry(Types.NVARCHAR, DatabricksTypeUtil.STRING),
207+
Map.entry(Types.LONGNVARCHAR, DatabricksTypeUtil.STRING),
208+
Map.entry(Types.ARRAY, DatabricksTypeUtil.ARRAY),
209+
Map.entry(Types.BIGINT, DatabricksTypeUtil.LONG),
210+
Map.entry(Types.BINARY, DatabricksTypeUtil.BINARY),
211+
Map.entry(Types.VARBINARY, DatabricksTypeUtil.BINARY),
212+
Map.entry(Types.LONGVARBINARY, DatabricksTypeUtil.BINARY),
213+
Map.entry(Types.NUMERIC, DatabricksTypeUtil.DECIMAL),
214+
Map.entry(Types.DATE, DatabricksTypeUtil.DATE),
215+
Map.entry(Types.DECIMAL, DatabricksTypeUtil.DECIMAL),
216+
Map.entry(Types.BOOLEAN, DatabricksTypeUtil.BOOLEAN),
217+
Map.entry(Types.DOUBLE, DatabricksTypeUtil.DOUBLE),
218+
Map.entry(Types.FLOAT, DatabricksTypeUtil.FLOAT),
219+
Map.entry(Types.REAL, DatabricksTypeUtil.FLOAT),
220+
Map.entry(Types.TIMESTAMP, DatabricksTypeUtil.TIMESTAMP_NTZ),
221+
Map.entry(Types.TIMESTAMP_WITH_TIMEZONE, DatabricksTypeUtil.TIMESTAMP),
222+
Map.entry(Types.STRUCT, DatabricksTypeUtil.STRUCT),
223+
Map.entry(Types.SMALLINT, DatabricksTypeUtil.SMALLINT),
224+
Map.entry(Types.TINYINT, DatabricksTypeUtil.TINYINT),
225+
Map.entry(Types.BIT, DatabricksTypeUtil.BOOLEAN));
226+
227+
expectedMappings.forEach(
228+
(sqlType, expectedType) ->
229+
assertEquals(
230+
expectedType,
231+
DatabricksTypeUtil.getDatabricksTypeFromSQLType(sqlType),
232+
() -> "Unexpected type for " + sqlType));
233+
assertEquals(NULL, DatabricksTypeUtil.getDatabricksTypeFromSQLType(UNKNOWN_TYPE));
212234
}
213235

214236
@Test
@@ -236,7 +258,8 @@ void testInferDatabricksType() {
236258
"TIMESTAMP, TIMESTAMP",
237259
"TIMESTAMP_NTZ, TIMESTAMP",
238260
"SHORT, SHORT",
239-
"TINYINT, SHORT",
261+
"SMALLINT, SHORT",
262+
"TINYINT, TINYINT",
240263
"BYTE, BYTE",
241264
"INT, INT",
242265
"BIGINT, LONG",

0 commit comments

Comments
 (0)