Skip to content

Commit f8a48f2

Browse files
committed
fixed problem with nested arrays
1 parent a8c59f8 commit f8a48f2

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ public static Object convert(Object value, Class<?> type, ClickHouseColumn colum
229229
try {
230230
if (type.isInstance(value)) {
231231
return value;
232+
} else if (type != java.sql.Array.class && value instanceof List<?>) {
233+
return convertList((List<?>) value, type);
232234
} else if (type == String.class) {
233235
return value.toString();
234236
} else if (type == Boolean.class || type == boolean.class) {
@@ -268,15 +270,14 @@ public static Object convert(Object value, Class<?> type, ClickHouseColumn colum
268270
if (column != null && column.getArrayBaseColumn() != null) {
269271
ClickHouseDataType baseType = column.getArrayBaseColumn().getDataType();
270272
Object[] convertedValues = convertArray(arrayValue.getArrayOfObjects(),
271-
JdbcUtils.convertToJavaClass(column.getArrayBaseColumn().getDataType()));
273+
JdbcUtils.convertToJavaClass(baseType));
272274
return new Array(convertedValues, baseType.getName(), baseType.getVendorTypeNumber());
273275
}
274276
return new Array(arrayValue.getArrayOfObjects(), "Unknown", JDBCType.OTHER.getVendorTypeNumber());
275277
} else if (type == java.sql.Array.class && value instanceof List<?>) {
276-
277278
if (column != null && column.getArrayBaseColumn() != null) {
278279
ClickHouseDataType baseType = column.getArrayBaseColumn().getDataType();
279-
return new Array(convertList((List<?>) value, JdbcUtils.convertToJavaClass(column.getArrayBaseColumn().getDataType())),
280+
return new Array(convertList((List<?>) value, JdbcUtils.convertToJavaClass(baseType)),
280281
baseType.getName(), JdbcUtils.CLICKHOUSE_TO_SQL_TYPE_MAP.getOrDefault(baseType, JDBCType.OTHER).getVendorTypeNumber());
281282
}
282283
// base type is unknown. all objects should be converted
@@ -301,6 +302,9 @@ public static Object[] convertList(List<?> values, Class<?> type) throws SQLExce
301302
if (values == null) {
302303
return null;
303304
}
305+
if (values.isEmpty()) {
306+
return new Object[0];
307+
}
304308

305309
Object[] convertedValues = new Object[values.size()];
306310
for (int i = 0; i < values.size(); i++) {

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,23 @@ public void testArrayTypes() throws SQLException {
10001000
}
10011001
}
10021002

1003+
@Test(groups = { "integration" })
1004+
public void testNestedArrays() throws Exception {
1005+
try (Connection conn = getJdbcConnection()) {
1006+
try (Statement stmt = conn.createStatement()) {
1007+
try (ResultSet rs = stmt.executeQuery("SELECT [['a', 'b'], ['c', 'd']] as value")) {
1008+
assertTrue(rs.next());
1009+
Array arrayHolder = (Array) rs.getObject(1);
1010+
Object[] array = (Object[]) arrayHolder.getArray();
1011+
Object[] subArray1 = (Object[]) array[0];
1012+
assertEquals(subArray1, new Object[]{ "a", "b"} );
1013+
Object[] subArray2 = (Object[]) array[1];
1014+
assertEquals(subArray2, new Object[]{ "c", "d"} );
1015+
}
1016+
}
1017+
}
1018+
}
1019+
10031020
@Test(groups = { "integration" })
10041021
public void testMapTypes() throws SQLException {
10051022
runQuery("CREATE TABLE test_maps (order Int8, "

jdbc-v2/src/test/java/com/clickhouse/jdbc/internal/JdbcUtilsTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.clickhouse.jdbc.internal;
22

33
import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader;
4-
import com.clickhouse.client.api.data_formats.internal.InetAddressConverter;
54
import com.clickhouse.data.ClickHouseColumn;
65
import org.testng.annotations.Test;
76

87
import java.math.BigDecimal;
9-
import java.net.Inet6Address;
108
import java.sql.SQLException;
119
import java.util.Arrays;
1210
import java.util.List;

0 commit comments

Comments
 (0)