diff --git a/CHANGELOG.md b/CHANGELOG.md index 94761adae..6d9a39448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Bug Fixes * NoClassDefFoundError with clickhouse-apache-http-client-jdbc. [#1319](https://github.com/ClickHouse/clickhouse-java/issues/1319) +* Nested array in tuple array is incorrectly deserialized. [#1324](https://github.com/ClickHouse/clickhouse-java/issues/1324) * client certificate password exposure in exception. [#1331](https://github.com/ClickHouse/clickhouse-java/issues/1331) ## 0.4.5, 2023-04-25 diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDeserializer.java b/clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDeserializer.java index 111e9f4ae..0482184df 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDeserializer.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDeserializer.java @@ -12,19 +12,6 @@ */ @FunctionalInterface public interface ClickHouseDeserializer { - static final class ResetValueDeserializer implements ClickHouseDeserializer { - private final ClickHouseDeserializer deserializer; - - public ResetValueDeserializer(ClickHouseDeserializer deserializer) { - this.deserializer = deserializer; - } - - @Override - public ClickHouseValue deserialize(ClickHouseValue ref, ClickHouseInputStream input) throws IOException { - return deserializer.deserialize(ref.resetToDefault(), input); - } - } - static class CompositeDeserializer implements ClickHouseDeserializer { protected final ClickHouseDeserializer[] deserializers; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/format/ClickHouseRowBinaryProcessor.java b/clickhouse-data/src/main/java/com/clickhouse/data/format/ClickHouseRowBinaryProcessor.java index d374099ca..cd4239874 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/format/ClickHouseRowBinaryProcessor.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/format/ClickHouseRowBinaryProcessor.java @@ -483,8 +483,7 @@ public ClickHouseDeserializer getDeserializer(ClickHouseDataConfig config, Click } } else { deserializer = new BinaryDataProcessor.ArrayDeserializer(config, column, true, - new ClickHouseDeserializer.ResetValueDeserializer( - getDeserializer(config, column.getNestedColumns().get(0)))); + getDeserializer(config, column.getNestedColumns().get(0))); } break; } diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseArrayValue.java index 42282d40d..62809647e 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseArrayValue.java @@ -573,7 +573,7 @@ public ClickHouseArraySequence allocate(int length, Class clazz, int level) { ? ClickHouseValues.createPrimitiveArray(clazz, 0, level) : ClickHouseValues.createObjectArray(clazz, 0, level))); } - } else if (length() != length) { + } else { set((T[]) (clazz.isPrimitive() ? ClickHouseValues.createPrimitiveArray(clazz, length, level) : ClickHouseValues.createObjectArray(clazz, length, level))); diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseBoolArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseBoolArrayValue.java index 202b3fa1d..639ac07e7 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseBoolArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseBoolArrayValue.java @@ -519,7 +519,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new boolean[length]); } return this; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseByteArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseByteArrayValue.java index fd3f3217e..2a6faefc0 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseByteArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseByteArrayValue.java @@ -605,7 +605,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new byte[length]); } return this; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseDoubleArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseDoubleArrayValue.java index 9b9f00db5..9cbc9737f 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseDoubleArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseDoubleArrayValue.java @@ -497,7 +497,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new double[length]); } return this; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseFloatArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseFloatArrayValue.java index 5b26a4657..f10e48eda 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseFloatArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseFloatArrayValue.java @@ -497,7 +497,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new float[length]); } return this; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseIntArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseIntArrayValue.java index 8dfe7019c..ecf0ced1f 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseIntArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseIntArrayValue.java @@ -583,7 +583,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new int[length]); } return this; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseLongArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseLongArrayValue.java index d476633d2..53fc137d6 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseLongArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseLongArrayValue.java @@ -595,7 +595,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new long[length]); } return this; diff --git a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseShortArrayValue.java b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseShortArrayValue.java index a0d8ce122..c8206bcf4 100644 --- a/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseShortArrayValue.java +++ b/clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseShortArrayValue.java @@ -583,7 +583,7 @@ public int hashCode() { public ClickHouseArraySequence allocate(int length, Class clazz, int level) { if (length < 1) { resetToDefault(); - } else if (length() != length) { + } else { set(new short[length]); } return this; diff --git a/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseStatementTest.java b/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseStatementTest.java index 00860a6d7..e25d2def5 100644 --- a/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseStatementTest.java +++ b/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseStatementTest.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.math.BigDecimal; import java.sql.Array; import java.sql.BatchUpdateException; import java.sql.Connection; @@ -1139,6 +1140,44 @@ public void testNestedArrayInTuple() throws SQLException { Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[1]).get(1), new int[] { 6, 7 }); Assert.assertFalse(rs.next()); } + + Assert.assertFalse(stmt.execute("drop table if exists test_nested_array_in_tuple; " + + "create table test_nested_array_in_tuple(id UInt64, val Array(Tuple(UInt16,Array(Decimal(10,0)))))engine=Memory; " + + "insert into test_nested_array_in_tuple values(1, [(0, [1, 2]), (1, [2, 3])]), (2, [(2, [4, 5]), (3, [6, 7])])")); + try (ResultSet rs = stmt.executeQuery("select * from test_nested_array_in_tuple order by id")) { + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt(1), 1); + Assert.assertEquals(((Object[]) rs.getObject(2)).length, 2); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[0]).size(), 2); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[0]).get(0), UnsignedShort.ZERO); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[0]).get(1))[0], + BigDecimal.valueOf(1)); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[0]).get(1))[1], + BigDecimal.valueOf(2)); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[1]).size(), 2); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[1]).get(0), UnsignedShort.ONE); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[1]).get(1))[0], + BigDecimal.valueOf(2)); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[1]).get(1))[1], + BigDecimal.valueOf(3)); + Assert.assertTrue(rs.next()); + Assert.assertEquals(((Object[]) rs.getObject(2)).length, 2); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[0]).size(), 2); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[0]).get(0), + UnsignedShort.valueOf((short) 2)); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[0]).get(1))[0], + BigDecimal.valueOf(4)); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[0]).get(1))[1], + BigDecimal.valueOf(5)); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[1]).size(), 2); + Assert.assertEquals(((List) ((Object[]) rs.getObject(2))[1]).get(0), + UnsignedShort.valueOf((short) 3)); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[1]).get(1))[0], + BigDecimal.valueOf(6)); + Assert.assertEquals(((BigDecimal[]) ((List) ((Object[]) rs.getObject(2))[1]).get(1))[1], + BigDecimal.valueOf(7)); + Assert.assertFalse(rs.next()); + } } }