Skip to content

Commit f509170

Browse files
committed
Fix error during parsing of bad binary data of Variant column
1 parent a5b66c6 commit f509170

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

src/DataTypes/Serializations/SerializationVariant.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,13 +738,17 @@ void SerializationVariant::deserializeBinary(IColumn & column, ReadBuffer & istr
738738
{
739739
col.insertDefault();
740740
}
741-
else
741+
else if (global_discr < variants.size())
742742
{
743743
auto & variant_column = col.getVariantByGlobalDiscriminator(global_discr);
744744
variants[global_discr]->deserializeBinary(variant_column, istr, settings);
745745
col.getLocalDiscriminators().push_back(col.localDiscriminatorByGlobal(global_discr));
746746
col.getOffsets().push_back(variant_column.size() - 1);
747747
}
748+
else
749+
{
750+
throw Exception(ErrorCodes::INCORRECT_DATA, "Cannot read value of {}: unexpected discriminator {}", variant_name, UInt64(global_discr));
751+
}
748752
}
749753

750754
namespace

tests/queries/0_stateless/03410_variant_bad_binary_data.reference

Whitespace-only changes.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
4+
# shellcheck source=../shell_config.sh
5+
. "$CURDIR"/../shell_config.sh
6+
7+
$CLICKHOUSE_LOCAL -m -q "
8+
CREATE TABLE tx (c0 Tuple(Map(Variant(DateTime),Variant(Decimal)))) ENGINE = Memory();
9+
INSERT INTO TABLE tx (c0) FROM INFILE '$CURDIR/data_binary/bad_variant_data.bin' FORMAT RowBinary; -- {clientError INCORRECT_DATA}
10+
DROP TABLE tx;
11+
"

0 commit comments

Comments
 (0)