2016-08-10 19:12:29 +00:00
|
|
|
#include <DB/DataStreams/MaterializingBlockInputStream.h>
|
|
|
|
#include <DB/Columns/ColumnConst.h>
|
|
|
|
#include <DB/DataTypes/DataTypeNullable.h>
|
2017-03-12 10:13:45 +00:00
|
|
|
#include <DB/DataTypes/DataTypesNumber.h>
|
2016-08-10 19:12:29 +00:00
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
MaterializingBlockInputStream::MaterializingBlockInputStream(BlockInputStreamPtr input_)
|
|
|
|
{
|
|
|
|
children.push_back(input_);
|
|
|
|
}
|
|
|
|
|
|
|
|
String MaterializingBlockInputStream::getName() const
|
|
|
|
{
|
|
|
|
return "Materializing";
|
|
|
|
}
|
|
|
|
|
|
|
|
String MaterializingBlockInputStream::getID() const
|
|
|
|
{
|
|
|
|
std::stringstream res;
|
|
|
|
res << "Materializing(" << children.back()->getID() << ")";
|
|
|
|
return res.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
Block MaterializingBlockInputStream::readImpl()
|
|
|
|
{
|
|
|
|
Block res = children.back()->read();
|
|
|
|
|
|
|
|
if (!res)
|
|
|
|
return res;
|
|
|
|
|
|
|
|
size_t columns = res.columns();
|
|
|
|
for (size_t i = 0; i < columns; ++i)
|
|
|
|
{
|
2017-01-02 20:12:12 +00:00
|
|
|
auto & element = res.safeGetByPosition(i);
|
2016-08-10 19:12:29 +00:00
|
|
|
auto & src = element.column;
|
|
|
|
ColumnPtr converted = src->convertToFullColumnIfConst();
|
|
|
|
if (converted)
|
|
|
|
{
|
|
|
|
src = converted;
|
|
|
|
auto & type = element.type;
|
2016-08-15 11:14:29 +00:00
|
|
|
if (type->isNull())
|
2016-08-10 19:12:29 +00:00
|
|
|
{
|
|
|
|
/// 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|