Skip to content

Commit d74c7c1

Browse files
authored
Merge pull request ClickHouse#79000 from Avogar/fix-variant-deserialization
Fix deserialization of variant discriminators with basic format in compact parts
2 parents 48a3233 + 13f3926 commit d74c7c1

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

src/DataTypes/Serializations/SerializationVariant.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,12 +483,15 @@ void SerializationVariant::deserializeBinaryBulkWithMultipleStreams(
483483
{
484484
variant_state = checkAndGetState<DeserializeBinaryBulkStateVariant>(state);
485485
auto * discriminators_state = checkAndGetState<DeserializeBinaryBulkStateVariantDiscriminators>(variant_state->discriminators_state);
486+
/// Now we are sure that discriminators are not in cache and we can save the size of discriminators now to know how
487+
/// many discriminators were actually deserialized to iterate over them later to calculate limits for variants.
488+
variant_state->num_rows_read = col.getLocalDiscriminatorsPtr()->size();
486489

487490
/// Deserialize discriminators according to serialization mode.
488491
if (discriminators_state->mode.value == DiscriminatorsSerializationMode::BASIC)
489492
{
490493
SerializationNumber<ColumnVariant::Discriminator>().deserializeBinaryBulk(
491-
*col.getLocalDiscriminatorsPtr()->assumeMutable(), *discriminators_stream, 0, rows_offset + limit, 0);
494+
*col.getLocalDiscriminatorsPtr()->assumeMutable(), *discriminators_stream, rows_offset, limit, 0);
492495
}
493496
else
494497
{
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
42
2+
a
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
set max_threads=1;
2+
DROP TABLE IF EXISTS t0;
3+
CREATE TABLE t0 (c0 Variant(String, Int)) ENGINE = MergeTree() PRIMARY KEY tuple() SETTINGS use_compact_variant_discriminators_serialization = 0, index_granularity=1;
4+
INSERT INTO TABLE t0 (c0) VALUES (42), ('a');
5+
optimize table t0 final;
6+
SELECT c0 FROM t0;
7+
DROP TABLE t0;
8+

0 commit comments

Comments
 (0)