2017-04-01 09:19:00 +00:00
|
|
|
#include <DataStreams/MaterializingBlockInputStream.h>
|
|
|
|
#include <DataTypes/DataTypeNullable.h>
|
|
|
|
#include <DataTypes/DataTypesNumber.h>
|
2016-08-10 19:12:29 +00:00
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2017-09-08 02:29:47 +00:00
|
|
|
MaterializingBlockInputStream::MaterializingBlockInputStream(const BlockInputStreamPtr & input)
|
2016-08-10 19:12:29 +00:00
|
|
|
{
|
2017-09-08 02:29:47 +00:00
|
|
|
children.push_back(input);
|
2016-08-10 19:12:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
String MaterializingBlockInputStream::getName() const
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
return "Materializing";
|
2016-08-10 19:12:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
String MaterializingBlockInputStream::getID() const
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
std::stringstream res;
|
|
|
|
res << "Materializing(" << children.back()->getID() << ")";
|
|
|
|
return res.str();
|
2016-08-10 19:12:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Block MaterializingBlockInputStream::readImpl()
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
Block res = children.back()->read();
|
|
|
|
|
|
|
|
if (!res)
|
|
|
|
return res;
|
|
|
|
|
|
|
|
size_t columns = res.columns();
|
|
|
|
for (size_t i = 0; i < columns; ++i)
|
|
|
|
{
|
|
|
|
auto & element = res.safeGetByPosition(i);
|
|
|
|
auto & src = element.column;
|
|
|
|
ColumnPtr converted = src->convertToFullColumnIfConst();
|
|
|
|
if (converted)
|
|
|
|
{
|
|
|
|
src = converted;
|
|
|
|
auto & type = element.type;
|
|
|
|
if (type->isNull())
|
|
|
|
{
|
|
|
|
/// A ColumnNull that is converted to a full column
|
|
|
|
/// has the type DataTypeNullable(DataTypeUInt8).
|
|
|
|
type = std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt8>());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
2016-08-10 19:12:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|