@@ -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
750757namespace
0 commit comments