Skip to content

Commit dc60af7

Browse files
authored
Support Array conversion (#2073)
1 parent cfb3db5 commit dc60af7

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

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

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

3+
import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader;
34
import com.clickhouse.data.ClickHouseDataType;
5+
import com.clickhouse.jdbc.types.Array;
46

57
import java.sql.Date;
68
import java.sql.JDBCType;
@@ -239,8 +241,8 @@ public static Object convert(Object value, Class<?> type) throws SQLException {
239241
return java.sql.Timestamp.valueOf(LocalDateTime.from((TemporalAccessor) value));
240242
} else if (type == java.sql.Time.class && value instanceof TemporalAccessor) {
241243
return java.sql.Time.valueOf(LocalTime.from((TemporalAccessor) value));
242-
} else if (type == java.sql.Array.class) {
243-
return value;
244+
} else if (type == java.sql.Array.class && value instanceof BinaryStreamReader.ArrayValue) {//It's cleaner to use getList but this handles the more generic getObject
245+
return new Array(((BinaryStreamReader.ArrayValue) value).asList(), "Object", JDBCType.JAVA_OBJECT.getVendorTypeNumber());
244246
}
245247
} catch (Exception e) {
246248
throw new SQLException("Failed to convert " + value + " to " + type.getName(), ExceptionUtils.SQL_STATE_DATA_EXCEPTION);

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.testng.annotations.Ignore;
55
import org.testng.annotations.Test;
66

7+
import java.sql.Array;
78
import java.sql.Connection;
89
import java.sql.PreparedStatement;
910
import java.sql.ResultSet;
@@ -233,9 +234,15 @@ public void testPrimitiveArrays() throws Exception {
233234
stmt.setObject(1, new String[][] {new String[]{"a"}, new String[]{"b"}, new String[]{"c"}});
234235
try (ResultSet rs = stmt.executeQuery()) {
235236
assertTrue(rs.next());
236-
assertEquals(((BinaryStreamReader.ArrayValue)((BinaryStreamReader.ArrayValue)rs.getObject(1)).get(0)).get(0), "a");
237-
assertEquals(((BinaryStreamReader.ArrayValue)((BinaryStreamReader.ArrayValue)rs.getObject(1)).get(1)).get(0), "b");
238-
assertEquals(((BinaryStreamReader.ArrayValue)((BinaryStreamReader.ArrayValue)rs.getObject(1)).get(2)).get(0), "c");
237+
Array a1 = rs.getArray(1);
238+
assertNotNull(a1);
239+
assertEquals(Arrays.deepToString((Object[]) a1.getArray()), "[[a], [b], [c]]");
240+
Array a2 = rs.getObject(1, Array.class);
241+
assertNotNull(a2);
242+
assertEquals(Arrays.deepToString((Object[]) a2.getArray()), "[[a], [b], [c]]");
243+
Array a3 = rs.getObject(1) instanceof Array ? (Array) rs.getObject(1) : null;
244+
assertNotNull(a3);
245+
assertEquals(Arrays.deepToString((Object[]) a3.getArray()), "[[a], [b], [c]]");
239246
assertFalse(rs.next());
240247
}
241248
}

0 commit comments

Comments
 (0)