Skip to content

Commit e9b9197

Browse files
authored
Merge pull request #1344 from zhicwu/main
Fix deserialization issue of nested array in other nested types
2 parents 7c5ccbe + bf68187 commit e9b9197

12 files changed

+49
-23
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
### Bug Fixes
88
* NoClassDefFoundError with clickhouse-apache-http-client-jdbc. [#1319](https://github.com/ClickHouse/clickhouse-java/issues/1319)
9+
* Nested array in tuple array is incorrectly deserialized. [#1324](https://github.com/ClickHouse/clickhouse-java/issues/1324)
910
* client certificate password exposure in exception. [#1331](https://github.com/ClickHouse/clickhouse-java/issues/1331)
1011

1112
## 0.4.5, 2023-04-25

clickhouse-data/src/main/java/com/clickhouse/data/ClickHouseDeserializer.java

-13
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,6 @@
1212
*/
1313
@FunctionalInterface
1414
public interface ClickHouseDeserializer {
15-
static final class ResetValueDeserializer implements ClickHouseDeserializer {
16-
private final ClickHouseDeserializer deserializer;
17-
18-
public ResetValueDeserializer(ClickHouseDeserializer deserializer) {
19-
this.deserializer = deserializer;
20-
}
21-
22-
@Override
23-
public ClickHouseValue deserialize(ClickHouseValue ref, ClickHouseInputStream input) throws IOException {
24-
return deserializer.deserialize(ref.resetToDefault(), input);
25-
}
26-
}
27-
2815
static class CompositeDeserializer implements ClickHouseDeserializer {
2916
protected final ClickHouseDeserializer[] deserializers;
3017

clickhouse-data/src/main/java/com/clickhouse/data/format/ClickHouseRowBinaryProcessor.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,7 @@ public ClickHouseDeserializer getDeserializer(ClickHouseDataConfig config, Click
483483
}
484484
} else {
485485
deserializer = new BinaryDataProcessor.ArrayDeserializer(config, column, true,
486-
new ClickHouseDeserializer.ResetValueDeserializer(
487-
getDeserializer(config, column.getNestedColumns().get(0))));
486+
getDeserializer(config, column.getNestedColumns().get(0)));
488487
}
489488
break;
490489
}

clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
573573
? ClickHouseValues.createPrimitiveArray(clazz, 0, level)
574574
: ClickHouseValues.createObjectArray(clazz, 0, level)));
575575
}
576-
} else if (length() != length) {
576+
} else {
577577
set((T[]) (clazz.isPrimitive()
578578
? ClickHouseValues.createPrimitiveArray(clazz, length, level)
579579
: ClickHouseValues.createObjectArray(clazz, length, level)));

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseBoolArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ public int hashCode() {
519519
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
520520
if (length < 1) {
521521
resetToDefault();
522-
} else if (length() != length) {
522+
} else {
523523
set(new boolean[length]);
524524
}
525525
return this;

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseByteArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ public int hashCode() {
605605
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
606606
if (length < 1) {
607607
resetToDefault();
608-
} else if (length() != length) {
608+
} else {
609609
set(new byte[length]);
610610
}
611611
return this;

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseDoubleArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ public int hashCode() {
497497
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
498498
if (length < 1) {
499499
resetToDefault();
500-
} else if (length() != length) {
500+
} else {
501501
set(new double[length]);
502502
}
503503
return this;

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseFloatArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ public int hashCode() {
497497
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
498498
if (length < 1) {
499499
resetToDefault();
500-
} else if (length() != length) {
500+
} else {
501501
set(new float[length]);
502502
}
503503
return this;

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseIntArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ public int hashCode() {
583583
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
584584
if (length < 1) {
585585
resetToDefault();
586-
} else if (length() != length) {
586+
} else {
587587
set(new int[length]);
588588
}
589589
return this;

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseLongArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ public int hashCode() {
595595
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
596596
if (length < 1) {
597597
resetToDefault();
598-
} else if (length() != length) {
598+
} else {
599599
set(new long[length]);
600600
}
601601
return this;

clickhouse-data/src/main/java/com/clickhouse/data/value/array/ClickHouseShortArrayValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ public int hashCode() {
583583
public ClickHouseArraySequence allocate(int length, Class<?> clazz, int level) {
584584
if (length < 1) {
585585
resetToDefault();
586-
} else if (length() != length) {
586+
} else {
587587
set(new short[length]);
588588
}
589589
return this;

clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseStatementTest.java

+39
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.File;
44
import java.io.IOException;
5+
import java.math.BigDecimal;
56
import java.sql.Array;
67
import java.sql.BatchUpdateException;
78
import java.sql.Connection;
@@ -1139,6 +1140,44 @@ public void testNestedArrayInTuple() throws SQLException {
11391140
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[1]).get(1), new int[] { 6, 7 });
11401141
Assert.assertFalse(rs.next());
11411142
}
1143+
1144+
Assert.assertFalse(stmt.execute("drop table if exists test_nested_array_in_tuple; "
1145+
+ "create table test_nested_array_in_tuple(id UInt64, val Array(Tuple(UInt16,Array(Decimal(10,0)))))engine=Memory; "
1146+
+ "insert into test_nested_array_in_tuple values(1, [(0, [1, 2]), (1, [2, 3])]), (2, [(2, [4, 5]), (3, [6, 7])])"));
1147+
try (ResultSet rs = stmt.executeQuery("select * from test_nested_array_in_tuple order by id")) {
1148+
Assert.assertTrue(rs.next());
1149+
Assert.assertEquals(rs.getInt(1), 1);
1150+
Assert.assertEquals(((Object[]) rs.getObject(2)).length, 2);
1151+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[0]).size(), 2);
1152+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[0]).get(0), UnsignedShort.ZERO);
1153+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[0]).get(1))[0],
1154+
BigDecimal.valueOf(1));
1155+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[0]).get(1))[1],
1156+
BigDecimal.valueOf(2));
1157+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[1]).size(), 2);
1158+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[1]).get(0), UnsignedShort.ONE);
1159+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[1]).get(1))[0],
1160+
BigDecimal.valueOf(2));
1161+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[1]).get(1))[1],
1162+
BigDecimal.valueOf(3));
1163+
Assert.assertTrue(rs.next());
1164+
Assert.assertEquals(((Object[]) rs.getObject(2)).length, 2);
1165+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[0]).size(), 2);
1166+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[0]).get(0),
1167+
UnsignedShort.valueOf((short) 2));
1168+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[0]).get(1))[0],
1169+
BigDecimal.valueOf(4));
1170+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[0]).get(1))[1],
1171+
BigDecimal.valueOf(5));
1172+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[1]).size(), 2);
1173+
Assert.assertEquals(((List<?>) ((Object[]) rs.getObject(2))[1]).get(0),
1174+
UnsignedShort.valueOf((short) 3));
1175+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[1]).get(1))[0],
1176+
BigDecimal.valueOf(6));
1177+
Assert.assertEquals(((BigDecimal[]) ((List<?>) ((Object[]) rs.getObject(2))[1]).get(1))[1],
1178+
BigDecimal.valueOf(7));
1179+
Assert.assertFalse(rs.next());
1180+
}
11421181
}
11431182
}
11441183

0 commit comments

Comments
 (0)