2020-11-05 13:24:31 +00:00
|
|
|
#include <DataTypes/DataTypeOneElementTuple.h>
|
|
|
|
#include <DataTypes/DataTypeFactory.h>
|
2020-11-10 12:13:33 +00:00
|
|
|
#include <DataTypes/DataTypeCustom.h>
|
2020-11-05 13:24:31 +00:00
|
|
|
#include <IO/WriteBufferFromString.h>
|
|
|
|
#include <IO/Operators.h>
|
|
|
|
#include <Common/quoteString.h>
|
|
|
|
#include <Parsers/ASTNameTypePair.h>
|
2020-11-10 17:32:00 +00:00
|
|
|
#include <Columns/IColumn.h>
|
2020-11-05 13:24:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2020-11-10 12:13:33 +00:00
|
|
|
namespace
|
2020-11-05 13:24:31 +00:00
|
|
|
{
|
|
|
|
|
2021-01-11 11:36:31 +00:00
|
|
|
/** Custom substreams representation for single subcolumn.
|
|
|
|
* It serializes/deserializes column as a nested type, but in that way
|
|
|
|
* if it was a named tuple with one element and a given name.
|
|
|
|
*/
|
2020-11-10 12:13:33 +00:00
|
|
|
class DataTypeOneElementTupleStreams : public IDataTypeCustomStreams
|
2020-11-05 13:24:31 +00:00
|
|
|
{
|
2020-11-10 12:13:33 +00:00
|
|
|
private:
|
|
|
|
DataTypePtr nested;
|
|
|
|
String name;
|
|
|
|
bool escape_delimiter;
|
|
|
|
|
|
|
|
public:
|
2020-12-17 17:10:33 +00:00
|
|
|
DataTypeOneElementTupleStreams(const DataTypePtr & nested_, const String & name_, bool escape_delimiter_)
|
2020-11-10 12:13:33 +00:00
|
|
|
: nested(nested_), name(name_), escape_delimiter(escape_delimiter_) {}
|
|
|
|
|
|
|
|
void enumerateStreams(
|
|
|
|
const IDataType::StreamCallback & callback,
|
|
|
|
IDataType::SubstreamPath & path) const override
|
|
|
|
{
|
|
|
|
addToPath(path);
|
|
|
|
nested->enumerateStreams(callback, path);
|
|
|
|
path.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
void serializeBinaryBulkStatePrefix(
|
|
|
|
IDataType:: SerializeBinaryBulkSettings & settings,
|
|
|
|
IDataType::SerializeBinaryBulkStatePtr & state) const override
|
|
|
|
{
|
|
|
|
addToPath(settings.path);
|
|
|
|
nested->serializeBinaryBulkStatePrefix(settings, state);
|
|
|
|
settings.path.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
void serializeBinaryBulkStateSuffix(
|
|
|
|
IDataType::SerializeBinaryBulkSettings & settings,
|
|
|
|
IDataType::SerializeBinaryBulkStatePtr & state) const override
|
|
|
|
{
|
|
|
|
addToPath(settings.path);
|
|
|
|
nested->serializeBinaryBulkStateSuffix(settings, state);
|
|
|
|
settings.path.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
void deserializeBinaryBulkStatePrefix(
|
|
|
|
IDataType::DeserializeBinaryBulkSettings & settings,
|
|
|
|
IDataType::DeserializeBinaryBulkStatePtr & state) const override
|
|
|
|
{
|
|
|
|
addToPath(settings.path);
|
|
|
|
nested->deserializeBinaryBulkStatePrefix(settings, state);
|
|
|
|
settings.path.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
void serializeBinaryBulkWithMultipleStreams(
|
|
|
|
const IColumn & column,
|
|
|
|
size_t offset,
|
|
|
|
size_t limit,
|
|
|
|
IDataType::SerializeBinaryBulkSettings & settings,
|
|
|
|
IDataType::SerializeBinaryBulkStatePtr & state) const override
|
|
|
|
{
|
|
|
|
addToPath(settings.path);
|
|
|
|
nested->serializeBinaryBulkWithMultipleStreams(column, offset, limit, settings, state);
|
|
|
|
settings.path.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
void deserializeBinaryBulkWithMultipleStreams(
|
2020-11-10 17:32:00 +00:00
|
|
|
ColumnPtr & column,
|
2020-11-10 12:13:33 +00:00
|
|
|
size_t limit,
|
|
|
|
IDataType::DeserializeBinaryBulkSettings & settings,
|
2020-11-10 17:32:00 +00:00
|
|
|
IDataType::DeserializeBinaryBulkStatePtr & state,
|
|
|
|
IDataType::SubstreamsCache * cache) const override
|
2020-11-10 12:13:33 +00:00
|
|
|
{
|
|
|
|
addToPath(settings.path);
|
2020-11-10 17:32:00 +00:00
|
|
|
nested->deserializeBinaryBulkWithMultipleStreams(column, limit, settings, state, cache);
|
2020-11-10 12:13:33 +00:00
|
|
|
settings.path.pop_back();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
void addToPath(IDataType::SubstreamPath & path) const
|
|
|
|
{
|
|
|
|
path.push_back(IDataType::Substream::TupleElement);
|
|
|
|
path.back().tuple_element_name = name;
|
|
|
|
path.back().escape_tuple_delimiter = escape_delimiter;
|
|
|
|
}
|
|
|
|
};
|
2020-11-05 13:24:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-11-10 12:13:33 +00:00
|
|
|
DataTypePtr createOneElementTuple(const DataTypePtr & type, const String & name, bool escape_delimiter)
|
2020-11-05 13:24:31 +00:00
|
|
|
{
|
2020-11-10 12:13:33 +00:00
|
|
|
auto custom_desc = std::make_unique<DataTypeCustomDesc>(
|
2020-12-17 17:10:33 +00:00
|
|
|
std::make_unique<DataTypeCustomFixedName>(type->getName()),nullptr,
|
2020-11-10 12:13:33 +00:00
|
|
|
std::make_unique<DataTypeOneElementTupleStreams>(type, name, escape_delimiter));
|
2020-11-05 13:24:31 +00:00
|
|
|
|
2020-11-10 12:13:33 +00:00
|
|
|
return DataTypeFactory::instance().getCustom(std::move(custom_desc));
|
2020-11-05 13:24:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|