Skip to content

Commit e36cbc1

Browse files
committed
Fix deserialization of variant discriminators with basic format in compact parts
1 parent a5b66c6 commit e36cbc1

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

src/DataTypes/Serializations/SerializationVariant.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,12 +452,15 @@ void SerializationVariant::deserializeBinaryBulkWithMultipleStreams(
452452
{
453453
variant_state = checkAndGetState<DeserializeBinaryBulkStateVariant>(state);
454454
auto * discriminators_state = checkAndGetState<DeserializeBinaryBulkStateVariantDiscriminators>(variant_state->discriminators_state);
455+
/// Now we are sure that discriminators are not in cache and we can save the size of discriminators now to know how
456+
/// many discriminators were actually deserialized to iterate over them later to calculate limits for variants.
457+
variant_state->num_rows_read = col.getLocalDiscriminatorsPtr()->size();
455458

456459
/// Deserialize discriminators according to serialization mode.
457460
if (discriminators_state->mode.value == DiscriminatorsSerializationMode::BASIC)
458461
{
459462
SerializationNumber<ColumnVariant::Discriminator>().deserializeBinaryBulk(
460-
*col.getLocalDiscriminatorsPtr()->assumeMutable(), *discriminators_stream, 0, rows_offset + limit, 0);
463+
*col.getLocalDiscriminatorsPtr()->assumeMutable(), *discriminators_stream, rows_offset, limit, 0);
461464
}
462465
else
463466
{
@@ -738,13 +741,17 @@ void SerializationVariant::deserializeBinary(IColumn & column, ReadBuffer & istr
738741
{
739742
col.insertDefault();
740743
}
741-
else
744+
else if (global_discr < variants.size())
742745
{
743746
auto & variant_column = col.getVariantByGlobalDiscriminator(global_discr);
744747
variants[global_discr]->deserializeBinary(variant_column, istr, settings);
745748
col.getLocalDiscriminators().push_back(col.localDiscriminatorByGlobal(global_discr));
746749
col.getOffsets().push_back(variant_column.size() - 1);
747750
}
751+
else
752+
{
753+
throw Exception(ErrorCodes::INCORRECT_DATA, "Cannot read value of {}: unexpected discriminator {}", variant_name, UInt64(global_discr));
754+
}
748755
}
749756

750757
namespace
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)