diff --git a/dbms/src/DataTypes/DataTypeNullable.cpp b/dbms/src/DataTypes/DataTypeNullable.cpp index a687ce9a979..0eb82d6abdb 100644 --- a/dbms/src/DataTypes/DataTypeNullable.cpp +++ b/dbms/src/DataTypes/DataTypeNullable.cpp @@ -119,6 +119,33 @@ void DataTypeNullable::deserializeBinaryBulkWithMultipleStreams( } +void DataTypeNullable::serializeBinary(const Field & field, WriteBuffer & ostr) const +{ + if (field.isNull()) + { + writeBinary(true, ostr); + } + else + { + writeBinary(false, ostr); + nested_data_type->serializeBinary(field, ostr); + } +} + +void DataTypeNullable::deserializeBinary(Field & field, ReadBuffer & istr) const +{ + bool is_null = false; + readBinary(is_null, istr); + if (!is_null) + { + nested_data_type->deserializeBinary(field, istr); + } + else + { + field = Null(); + } +} + void DataTypeNullable::serializeBinary(const IColumn & column, size_t row_num, WriteBuffer & ostr) const { const ColumnNullable & col = assert_cast(column); diff --git a/dbms/src/DataTypes/DataTypeNullable.h b/dbms/src/DataTypes/DataTypeNullable.h index 25afed61411..49b14eefc6c 100644 --- a/dbms/src/DataTypes/DataTypeNullable.h +++ b/dbms/src/DataTypes/DataTypeNullable.h @@ -45,8 +45,8 @@ public: DeserializeBinaryBulkSettings & settings, DeserializeBinaryBulkStatePtr & state) const override; - void serializeBinary(const Field & field, WriteBuffer & ostr) const override { nested_data_type->serializeBinary(field, ostr); } - void deserializeBinary(Field & field, ReadBuffer & istr) const override { nested_data_type->deserializeBinary(field, istr); } + void serializeBinary(const Field & field, WriteBuffer & ostr) const override; + void deserializeBinary(Field & field, ReadBuffer & istr) const override; void serializeBinary(const IColumn & column, size_t row_num, WriteBuffer & ostr) const override; void deserializeBinary(IColumn & column, ReadBuffer & istr) const override; void serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override; diff --git a/dbms/tests/queries/0_stateless/01016_null_part_minmax.reference b/dbms/tests/queries/0_stateless/01016_null_part_minmax.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/dbms/tests/queries/0_stateless/01016_null_part_minmax.sql b/dbms/tests/queries/0_stateless/01016_null_part_minmax.sql new file mode 100644 index 00000000000..3d471a33a33 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01016_null_part_minmax.sql @@ -0,0 +1,5 @@ +-- this test checks that null values are correctly serialized inside minmax index (issue #7113) +drop table if exists null_01016; +create table if not exists null_01016 (x Nullable(String)) engine MergeTree order by ifNull(x, 'order-null') partition by ifNull(x, 'partition-null'); +insert into null_01016 values (null); +drop table null_01016;