|
1 | 1 | package com.clickhouse.client.api.data_formats.internal; |
2 | 2 |
|
3 | 3 | import com.clickhouse.data.ClickHouseColumn; |
| 4 | +import com.clickhouse.data.format.BinaryStreamUtils; |
4 | 5 |
|
5 | 6 | import java.io.ByteArrayInputStream; |
6 | 7 | import java.io.ByteArrayOutputStream; |
@@ -204,4 +205,74 @@ public void testReadNullVariantReturnsNull() throws Exception { |
204 | 205 |
|
205 | 206 | Assert.assertNull(reader.readValue(column)); |
206 | 207 | } |
| 208 | + |
| 209 | + @Test |
| 210 | + public void testNullableArrayValueUsesBoxedComponentType() throws Exception { |
| 211 | + ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| 212 | + BinaryStreamUtils.writeVarInt(baos, 2); |
| 213 | + BinaryStreamUtils.writeNonNull(baos); |
| 214 | + BinaryStreamUtils.writeFloat64(baos, 1.0); |
| 215 | + BinaryStreamUtils.writeNonNull(baos); |
| 216 | + BinaryStreamUtils.writeFloat64(baos, 2.0); |
| 217 | + |
| 218 | + BinaryStreamReader reader = new BinaryStreamReader( |
| 219 | + new ByteArrayInputStream(baos.toByteArray()), |
| 220 | + TimeZone.getTimeZone("UTC"), |
| 221 | + null, |
| 222 | + new BinaryStreamReader.CachingByteBufferAllocator(), |
| 223 | + false, |
| 224 | + null); |
| 225 | + |
| 226 | + BinaryStreamReader.ArrayValue array = (BinaryStreamReader.ArrayValue) reader.readValue( |
| 227 | + ClickHouseColumn.of("v", "Array(Nullable(Float64))")); |
| 228 | + |
| 229 | + Assert.assertEquals(array.getArray().getClass().getComponentType(), Double.class); |
| 230 | + } |
| 231 | + |
| 232 | + @Test |
| 233 | + public void testNullableUnsignedArrayUsesWidenedType() throws Exception { |
| 234 | + ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| 235 | + BinaryStreamUtils.writeVarInt(baos, 2); |
| 236 | + BinaryStreamUtils.writeNonNull(baos); |
| 237 | + BinaryStreamUtils.writeUnsignedInt8(baos, 10); |
| 238 | + BinaryStreamUtils.writeNonNull(baos); |
| 239 | + BinaryStreamUtils.writeUnsignedInt8(baos, 20); |
| 240 | + |
| 241 | + BinaryStreamReader reader = new BinaryStreamReader( |
| 242 | + new ByteArrayInputStream(baos.toByteArray()), |
| 243 | + TimeZone.getTimeZone("UTC"), |
| 244 | + null, |
| 245 | + new BinaryStreamReader.CachingByteBufferAllocator(), |
| 246 | + false, |
| 247 | + null); |
| 248 | + |
| 249 | + BinaryStreamReader.ArrayValue array = (BinaryStreamReader.ArrayValue) reader.readValue( |
| 250 | + ClickHouseColumn.of("v", "Array(Nullable(UInt8))")); |
| 251 | + |
| 252 | + Assert.assertEquals(array.getArray().getClass().getComponentType(), Short.class); |
| 253 | + } |
| 254 | + |
| 255 | + @Test |
| 256 | + public void testNullableEnumArrayUsesEnumValueType() throws Exception { |
| 257 | + ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| 258 | + BinaryStreamUtils.writeVarInt(baos, 2); |
| 259 | + BinaryStreamUtils.writeNonNull(baos); |
| 260 | + baos.write(1); // enum ordinal for 'a' |
| 261 | + BinaryStreamUtils.writeNonNull(baos); |
| 262 | + baos.write(2); // enum ordinal for 'b' |
| 263 | + |
| 264 | + BinaryStreamReader reader = new BinaryStreamReader( |
| 265 | + new ByteArrayInputStream(baos.toByteArray()), |
| 266 | + TimeZone.getTimeZone("UTC"), |
| 267 | + null, |
| 268 | + new BinaryStreamReader.CachingByteBufferAllocator(), |
| 269 | + false, |
| 270 | + null); |
| 271 | + |
| 272 | + BinaryStreamReader.ArrayValue array = (BinaryStreamReader.ArrayValue) reader.readValue( |
| 273 | + ClickHouseColumn.of("v", "Array(Nullable(Enum8('a'=1,'b'=2)))")); |
| 274 | + |
| 275 | + Assert.assertEquals(array.getArray().getClass().getComponentType(), |
| 276 | + BinaryStreamReader.EnumValue.class); |
| 277 | + } |
207 | 278 | } |
0 commit comments