mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-15 02:41:59 +00:00
56 lines
1.6 KiB
C++
56 lines
1.6 KiB
C++
|
#include <Formats/FormatFactory.h>
|
||
|
#include <Processors/Formats/Impl/RawBLOBRowInputFormat.h>
|
||
|
#include <DataTypes/DataTypeNullable.h>
|
||
|
#include <DataTypes/DataTypeLowCardinality.h>
|
||
|
#include <IO/ReadHelpers.h>
|
||
|
|
||
|
|
||
|
namespace DB
|
||
|
{
|
||
|
|
||
|
namespace ErrorCodes
|
||
|
{
|
||
|
extern const int BAD_ARGUMENTS;
|
||
|
}
|
||
|
|
||
|
RawBLOBRowInputFormat::RawBLOBRowInputFormat(const Block & header_, ReadBuffer & in_, Params params_)
|
||
|
: IRowInputFormat(header_, in_, std::move(params_))
|
||
|
{
|
||
|
if (header_.columns() > 1)
|
||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||
|
"This input format is only suitable for tables with a single column of type String but the number of columns is {}",
|
||
|
header_.columns());
|
||
|
|
||
|
if (!isString(removeNullable(removeLowCardinality(header_.getByPosition(0).type))))
|
||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||
|
"This input format is only suitable for tables with a single column of type String but the column type is {}",
|
||
|
header_.getByPosition(0).type->getName());
|
||
|
}
|
||
|
|
||
|
bool RawBLOBRowInputFormat::readRow(MutableColumns & columns, RowReadExtension &)
|
||
|
{
|
||
|
if (in.eof())
|
||
|
return false;
|
||
|
|
||
|
/// One excessive copy.
|
||
|
String blob;
|
||
|
readStringUntilEOF(blob, in);
|
||
|
columns.at(0)->insertData(blob.data(), blob.size());
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void registerInputFormatProcessorRawBLOB(FormatFactory & factory)
|
||
|
{
|
||
|
factory.registerInputFormatProcessor("RawBLOB", [](
|
||
|
ReadBuffer & buf,
|
||
|
const Block & sample,
|
||
|
const RowInputFormatParams & params,
|
||
|
const FormatSettings &)
|
||
|
{
|
||
|
return std::make_shared<RawBLOBRowInputFormat>(sample, buf, params);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|