diff --git a/src/Common/FieldVisitorWriteBinary.cpp b/src/Common/FieldVisitorWriteBinary.cpp index 9812f5a51d..203fc796fa 100644 --- a/src/Common/FieldVisitorWriteBinary.cpp +++ b/src/Common/FieldVisitorWriteBinary.cpp @@ -18,10 +18,26 @@ void FieldVisitorWriteBinary::operator() (const Int256 & x, WriteBuffer & buf) c void FieldVisitorWriteBinary::operator() (const UUID & x, WriteBuffer & buf) const { writeBinary(x, buf); } void FieldVisitorWriteBinary::operator() (const IPv4 & x, WriteBuffer & buf) const { writeBinary(x, buf); } void FieldVisitorWriteBinary::operator() (const IPv6 & x, WriteBuffer & buf) const { writeBinary(x, buf); } -void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const { writeBinary(x.getValue(), buf); } -void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const { writeBinary(x.getValue(), buf); } -void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const { writeBinary(x.getValue(), buf); } -void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const { writeBinary(x.getValue(), buf); } +void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const +{ + writeBinary(x.getValue(), buf); + writeVarUInt(x.getScale(), buf); +} +void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const +{ + writeBinary(x.getValue(), buf); + writeVarUInt(x.getScale(), buf); +} +void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const +{ + writeBinary(x.getValue(), buf); + writeVarUInt(x.getScale(), buf); +} +void FieldVisitorWriteBinary::operator() (const DecimalField & x, WriteBuffer & buf) const +{ + writeBinary(x.getValue(), buf); + writeVarUInt(x.getScale(), buf); +} void FieldVisitorWriteBinary::operator() (const AggregateFunctionStateData & x, WriteBuffer & buf) const { writeStringBinary(x.name, buf); diff --git a/src/Core/Field.cpp b/src/Core/Field.cpp index 046c009f56..d1dc5159d8 100644 --- a/src/Core/Field.cpp +++ b/src/Core/Field.cpp @@ -130,11 +130,43 @@ inline Field getBinaryValue(UInt8 type, ReadBuffer & buf) readBinary(value, buf); return bool(value); } + case Field::Types::Decimal32: + { + Decimal32 value; + UInt32 scale; + readBinary(value, buf); + readVarUInt(scale, buf); + return DecimalField(value, scale); + } + case Field::Types::Decimal64: + { + Decimal64 value; + UInt32 scale; + readBinary(value, buf); + readVarUInt(scale, buf); + return DecimalField(value, scale); + } + case Field::Types::Decimal128: + { + Decimal128 value; + UInt32 scale; + readBinary(value, buf); + readVarUInt(scale, buf); + return DecimalField(value, scale); + } + case Field::Types::Decimal256: + { + Decimal256 value; + UInt32 scale; + readBinary(value, buf); + readVarUInt(scale, buf); + return DecimalField(value, scale); + } } - return Field(); + throw Exception(ErrorCodes::INCORRECT_DATA, "Unknown field type {}", std::to_string(type)); } -void readBinary(Array & x, ReadBuffer & buf) +void readBinaryArray(Array & x, ReadBuffer & buf) { size_t size; UInt8 type; @@ -292,6 +324,20 @@ void writeFieldText(const Field & x, WriteBuffer & buf) buf.write(res.data(), res.size()); } +void writeFieldBinary(const Field & x, WriteBuffer & buf) +{ + const UInt8 type = x.getType(); + writeBinary(type, buf); + + Field::dispatch([&buf] (const auto & value) { FieldVisitorWriteBinary()(value, buf); }, x); +} + +Field readFieldBinary(ReadBuffer & buf) +{ + UInt8 type; + readBinary(type, buf); + return getBinaryValue(type, buf); +} String Field::dump() const {