Skip to content

Commit 11e842a

Browse files
committed
fixed default mapping for integer and unsigned int types
1 parent 0c42450 commit 11e842a

File tree

3 files changed

+75
-29
lines changed

3 files changed

+75
-29
lines changed

jdbc-v2/src/main/java/com/clickhouse/jdbc/internal/JdbcUtils.java

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
import com.clickhouse.jdbc.types.Array;
77
import com.google.common.collect.ImmutableMap;
88

9+
import java.awt.*;
10+
import java.math.BigInteger;
911
import java.net.Inet4Address;
1012
import java.net.Inet6Address;
1113
import java.sql.Date;
1214
import java.sql.JDBCType;
1315
import java.sql.SQLException;
1416
import java.sql.SQLType;
17+
import java.sql.Types;
1518
import java.time.LocalDate;
1619
import java.time.LocalDateTime;
1720
import java.time.LocalTime;
@@ -42,6 +45,14 @@ private static Map<ClickHouseDataType, SQLType> generateTypeMap() {
4245
map.put(ClickHouseDataType.Int16, JDBCType.SMALLINT);
4346
map.put(ClickHouseDataType.Int32, JDBCType.INTEGER);
4447
map.put(ClickHouseDataType.Int64, JDBCType.BIGINT);
48+
map.put(ClickHouseDataType.Int128, JDBCType.OTHER);
49+
map.put(ClickHouseDataType.Int256, JDBCType.OTHER);
50+
map.put(ClickHouseDataType.UInt8, JDBCType.SMALLINT);
51+
map.put(ClickHouseDataType.UInt16, JDBCType.INTEGER);
52+
map.put(ClickHouseDataType.UInt32, JDBCType.BIGINT);
53+
map.put(ClickHouseDataType.UInt64, JDBCType.OTHER);
54+
map.put(ClickHouseDataType.UInt128, JDBCType.OTHER);
55+
map.put(ClickHouseDataType.UInt256, JDBCType.OTHER);
4556
map.put(ClickHouseDataType.Float32, JDBCType.FLOAT);
4657
map.put(ClickHouseDataType.Float64, JDBCType.DOUBLE);
4758
map.put(ClickHouseDataType.Bool, JDBCType.BOOLEAN);
@@ -81,8 +92,8 @@ private static Map<SQLType, Class<?>> generateClassMap() {
8192
map.put(JDBCType.DECIMAL, java.math.BigDecimal.class);
8293
map.put(JDBCType.BIT, Boolean.class);
8394
map.put(JDBCType.BOOLEAN, Boolean.class);
84-
map.put(JDBCType.TINYINT, Integer.class);
85-
map.put(JDBCType.SMALLINT, Integer.class);
95+
map.put(JDBCType.TINYINT, Byte.class);
96+
map.put(JDBCType.SMALLINT, Short.class);
8697
map.put(JDBCType.INTEGER, Integer.class);
8798
map.put(JDBCType.BIGINT, Long.class);
8899
map.put(JDBCType.REAL, Float.class);
@@ -115,9 +126,44 @@ private static Map<SQLType, Class<?>> generateClassMap() {
115126
private static Map<ClickHouseDataType, Class<?>> getDataTypeClassMap() {
116127
Map<ClickHouseDataType, Class<?>> map = new HashMap<>();
117128
for (Map.Entry<ClickHouseDataType, SQLType> e : CLICKHOUSE_TO_SQL_TYPE_MAP.entrySet()) {
118-
map.put(e.getKey(), SQL_TYPE_TO_CLASS_MAP.get(e.getValue()));
129+
if (e.getValue().equals(JDBCType.OTHER)) {
130+
switch (e.getKey()) {
131+
case UInt64:
132+
map.put(e.getKey(), BigInteger.class);
133+
break;
134+
case UInt128:
135+
map.put(e.getKey(), BigInteger.class);
136+
break;
137+
case UInt256:
138+
map.put(e.getKey(), BigInteger.class);
139+
break;
140+
case Int128:
141+
map.put(e.getKey(), BigInteger.class);
142+
break;
143+
case Int256:
144+
map.put(e.getKey(), BigInteger.class);
145+
break;
146+
case Point:
147+
map.put(e.getKey(), double[].class);
148+
break;
149+
case LineString:
150+
case Ring:
151+
map.put(e.getKey(), double[][].class);
152+
break;
153+
case Polygon:
154+
case MultiLineString:
155+
map.put(e.getKey(), double[][][].class);
156+
break;
157+
case MultiPolygon:
158+
map.put(e.getKey(), double[][][][].class);
159+
break;
160+
default:
161+
map.put(e.getKey(), Object.class);
162+
}
163+
} else {
164+
map.put(e.getKey(), SQL_TYPE_TO_CLASS_MAP.get(e.getValue()));
165+
}
119166
}
120-
121167
return map;
122168
}
123169

jdbc-v2/src/test/java/com/clickhouse/jdbc/DataTypeTests.java

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,10 @@ public void testIntegerTypes() throws SQLException {
124124
try (Statement stmt = conn.createStatement()) {
125125
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_integers ORDER BY order")) {
126126
assertTrue(rs.next());
127-
assertEquals(rs.getByte("int8"), -128);
128-
assertEquals(rs.getShort("int16"), -32768);
129-
assertEquals(rs.getInt("int32"), -2147483648);
130-
assertEquals(rs.getLong("int64"), -9223372036854775808L);
127+
assertEquals(rs.getByte("int8"), Byte.MIN_VALUE);
128+
assertEquals(rs.getShort("int16"), Short.MIN_VALUE);
129+
assertEquals(rs.getInt("int32"), Integer.MIN_VALUE);
130+
assertEquals(rs.getLong("int64"), Long.MIN_VALUE);
131131
assertEquals(rs.getBigDecimal("int128"), new BigDecimal("-170141183460469231731687303715884105728"));
132132
assertEquals(rs.getBigDecimal("int256"), new BigDecimal("-57896044618658097711785492504343953926634992332820282019728792003956564819968"));
133133
assertEquals(rs.getShort("uint8"), 0);
@@ -138,10 +138,10 @@ public void testIntegerTypes() throws SQLException {
138138
assertEquals(rs.getBigDecimal("uint256"), new BigDecimal("0"));
139139

140140
assertTrue(rs.next());
141-
assertEquals(rs.getByte("int8"), 127);
142-
assertEquals(rs.getShort("int16"), 32767);
143-
assertEquals(rs.getInt("int32"), 2147483647);
144-
assertEquals(rs.getLong("int64"), 9223372036854775807L);
141+
assertEquals(rs.getByte("int8"), Byte.MAX_VALUE);
142+
assertEquals(rs.getShort("int16"), Short.MAX_VALUE);
143+
assertEquals(rs.getInt("int32"), Integer.MAX_VALUE);
144+
assertEquals(rs.getLong("int64"), Long.MAX_VALUE);
145145
assertEquals(rs.getBigDecimal("int128"), new BigDecimal("170141183460469231731687303715884105727"));
146146
assertEquals(rs.getBigDecimal("int256"), new BigDecimal("57896044618658097711785492504343953926634992332820282019728792003956564819967"));
147147
assertEquals(rs.getShort("uint8"), 255);
@@ -175,10 +175,10 @@ public void testIntegerTypes() throws SQLException {
175175
try (Statement stmt = conn.createStatement()) {
176176
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_integers ORDER BY order")) {
177177
assertTrue(rs.next());
178-
assertEquals(rs.getObject("int8"), -128);
179-
assertEquals(rs.getObject("int16"), -32768);
180-
assertEquals(rs.getObject("int32"), -2147483648);
181-
assertEquals(rs.getObject("int64"), -9223372036854775808L);
178+
assertEquals(rs.getObject("int8"), Byte.MIN_VALUE);
179+
assertEquals(rs.getObject("int16"), Short.MIN_VALUE);
180+
assertEquals(rs.getObject("int32"), Integer.MIN_VALUE);
181+
assertEquals(rs.getObject("int64"), Long.MIN_VALUE);
182182
assertEquals(rs.getObject("int128"), new BigInteger("-170141183460469231731687303715884105728"));
183183
assertEquals(rs.getObject("int256"), new BigInteger("-57896044618658097711785492504343953926634992332820282019728792003956564819968"));
184184
assertEquals(rs.getObject("uint8"), Short.valueOf("0"));
@@ -189,10 +189,10 @@ public void testIntegerTypes() throws SQLException {
189189
assertEquals(rs.getObject("uint256"), new BigInteger("0"));
190190

191191
assertTrue(rs.next());
192-
assertEquals(rs.getObject("int8"), 127);
193-
assertEquals(rs.getObject("int16"), 32767);
194-
assertEquals(rs.getObject("int32"), 2147483647);
195-
assertEquals(rs.getObject("int64"), 9223372036854775807L);
192+
assertEquals(rs.getObject("int8"), Byte.MAX_VALUE);
193+
assertEquals(rs.getObject("int16"), Short.MAX_VALUE);
194+
assertEquals(rs.getObject("int32"), Integer.MAX_VALUE);
195+
assertEquals(rs.getObject("int64"), Long.MAX_VALUE);
196196
assertEquals(rs.getObject("int128"), new BigInteger("170141183460469231731687303715884105727"));
197197
assertEquals(rs.getObject("int256"), new BigInteger("57896044618658097711785492504343953926634992332820282019728792003956564819967"));
198198
assertEquals(rs.getObject("uint8"), Short.valueOf("255"));
@@ -203,10 +203,10 @@ public void testIntegerTypes() throws SQLException {
203203
assertEquals(rs.getObject("uint256"), new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639935"));
204204

205205
assertTrue(rs.next());
206-
assertEquals(rs.getObject("int8"), int8);
207-
assertEquals(rs.getObject("int16"), int16);
208-
assertEquals(rs.getObject("int32"), int32);
209-
assertEquals(rs.getObject("int64"), int64);
206+
assertEquals(rs.getObject("int8"), (byte)int8);
207+
assertEquals(rs.getObject("int16"), (short)int16);
208+
assertEquals(rs.getObject("int32"), (int)int32);
209+
assertEquals(rs.getObject("int64"), (long)int64);
210210
assertEquals(rs.getObject("int128"), int128);
211211
assertEquals(rs.getObject("int256"), int256);
212212
assertEquals(rs.getObject("uint8"), uint8);
@@ -254,14 +254,14 @@ public void testUnsignedIntegerTypes() throws Exception {
254254

255255
try (Connection conn = getJdbcConnection();
256256
Statement stmt = conn.createStatement();
257-
ResultSet rs = stmt.executeQuery("SELECT * FROM test_unsigned_integers ORDER BY order")) {
257+
ResultSet rs = stmt.executeQuery("SELECT uint8, uint16, uint32, uint64, uint128, uint256 FROM test_unsigned_integers ORDER BY order")) {
258258

259259
List<Class<?>> expectedTypes = Arrays.asList(
260260
Short.class, Integer.class, Long.class, BigInteger.class, BigInteger.class, BigInteger.class);
261261
List<Class<?>> actualTypes = new ArrayList<>();
262262
ResultSetMetaData rsmd = rs.getMetaData();
263-
for (int i = 2; i <= rsmd.getColumnCount(); i++) {
264-
actualTypes.add(Class.forName(rsmd.getColumnClassName(i)));
263+
for (int i = 0; i < rsmd.getColumnCount(); i++) {
264+
actualTypes.add(Class.forName(rsmd.getColumnClassName(i + 1)));
265265
}
266266
assertEquals(actualTypes, expectedTypes);
267267

jdbc-v2/src/test/java/com/clickhouse/jdbc/metadata/ResultSetMetaDataImplTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ public void testGetColumnTypeIntegers() throws Exception {
5858
ResultSet rs = stmt.executeQuery("SELECT toInt8(1), toInt16(1), toInt32(1), toInt64(1) AS a");
5959
ResultSetMetaData rsmd = rs.getMetaData();
6060
assertEquals(rsmd.getColumnType(1), Types.TINYINT);
61-
assertEquals(rsmd.getColumnClassName(1), Integer.class.getName());
61+
assertEquals(rsmd.getColumnClassName(1), Byte.class.getName());
6262
assertEquals(rsmd.getColumnType(2), Types.SMALLINT);
63-
assertEquals(rsmd.getColumnClassName(2), Integer.class.getName());
63+
assertEquals(rsmd.getColumnClassName(2), Short.class.getName());
6464
assertEquals(rsmd.getColumnType(3), Types.INTEGER);
6565
assertEquals(rsmd.getColumnClassName(3), Integer.class.getName());
6666
assertEquals(rsmd.getColumnType(4), Types.BIGINT);

0 commit comments

Comments
 (0)