mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-10-22 00:10:52 +00:00
78 lines
3.0 KiB
C
78 lines
3.0 KiB
C
|
#pragma once
|
|||
|
|
|||
|
#include <DB/DataTypes/IDataType.h>
|
|||
|
#include <DB/Core/NamesAndTypes.h>
|
|||
|
|
|||
|
namespace DB
|
|||
|
{
|
|||
|
|
|||
|
using Poco::SharedPtr;
|
|||
|
|
|||
|
|
|||
|
class DataTypeNested : public IDataType
|
|||
|
{
|
|||
|
private:
|
|||
|
/// Имена и типы вложенных массивов.
|
|||
|
NamesAndTypesListPtr nested;
|
|||
|
/// Тип смещений.
|
|||
|
DataTypePtr offsets;
|
|||
|
|
|||
|
public:
|
|||
|
DataTypeNested(NamesAndTypesListPtr nested_);
|
|||
|
|
|||
|
std::string getName() const;
|
|||
|
|
|||
|
DataTypePtr clone() const
|
|||
|
{
|
|||
|
return new DataTypeNested(nested);
|
|||
|
}
|
|||
|
|
|||
|
void serializeBinary(const Field & field, WriteBuffer & ostr) const;
|
|||
|
void deserializeBinary(Field & field, ReadBuffer & istr) const;
|
|||
|
|
|||
|
void serializeText(const Field & field, WriteBuffer & ostr) const;
|
|||
|
void deserializeText(Field & field, ReadBuffer & istr) const;
|
|||
|
|
|||
|
void serializeTextEscaped(const Field & field, WriteBuffer & ostr) const;
|
|||
|
void deserializeTextEscaped(Field & field, ReadBuffer & istr) const;
|
|||
|
|
|||
|
void serializeTextQuoted(const Field & field, WriteBuffer & ostr) const;
|
|||
|
void deserializeTextQuoted(Field & field, ReadBuffer & istr) const;
|
|||
|
|
|||
|
void serializeTextJSON(const Field & field, WriteBuffer & ostr) const;
|
|||
|
|
|||
|
/** Потоковая сериализация массивов устроена по-особенному:
|
|||
|
* - записываются/читаются элементы, уложенные подряд, без размеров массивов;
|
|||
|
* - размеры записываются/читаются в отдельный столбец,
|
|||
|
* и о записи/чтении размеров должна позаботиться вызывающая сторона.
|
|||
|
* Это нужно, так как несколько массивов имеют общие размеры.
|
|||
|
*/
|
|||
|
|
|||
|
/** Записать только значения, без размеров. Вызывающая сторона также должна куда-нибудь записать смещения. */
|
|||
|
void serializeBinary(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const;
|
|||
|
|
|||
|
/** Прочитать только значения, без размеров.
|
|||
|
* При этом, в column уже заранее должны быть считаны все размеры.
|
|||
|
*/
|
|||
|
void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const;
|
|||
|
|
|||
|
/** Записать размеры. */
|
|||
|
void serializeOffsets(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const;
|
|||
|
|
|||
|
/** Прочитать размеры. Вызывайте этот метод перед чтением значений. */
|
|||
|
void deserializeOffsets(IColumn & column, ReadBuffer & istr, size_t limit) const;
|
|||
|
|
|||
|
ColumnPtr createColumn() const;
|
|||
|
ColumnPtr createConstColumn(size_t size, const Field & field) const;
|
|||
|
|
|||
|
Field getDefault() const
|
|||
|
{
|
|||
|
throw Exception("Method getDefault is not supported for " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|||
|
}
|
|||
|
|
|||
|
const NamesAndTypesListPtr & getNestedTypes() const { return nested; }
|
|||
|
const DataTypePtr & getOffsetsType() const { return offsets; }
|
|||
|
};
|
|||
|
|
|||
|
}
|