2017-06-06 17:18:32 +00:00
|
|
|
#include <ext/range.h>
|
2017-04-01 09:19:00 +00:00
|
|
|
#include <Dictionaries/ExternalResultDescription.h>
|
|
|
|
#include <DataTypes/DataTypesNumber.h>
|
|
|
|
#include <DataTypes/DataTypeString.h>
|
|
|
|
#include <DataTypes/DataTypeDate.h>
|
|
|
|
#include <DataTypes/DataTypeDateTime.h>
|
2018-08-07 19:09:30 +00:00
|
|
|
#include <DataTypes/DataTypeUUID.h>
|
2018-10-12 02:09:47 +00:00
|
|
|
#include <DataTypes/DataTypeNullable.h>
|
2017-07-13 20:58:19 +00:00
|
|
|
#include <Common/typeid_cast.h>
|
2016-12-08 02:49:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
extern const int UNKNOWN_TYPE;
|
2016-12-08 02:49:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ExternalResultDescription::init(const Block & sample_block_)
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
sample_block = sample_block_;
|
2016-12-08 02:49:04 +00:00
|
|
|
|
2018-10-12 02:09:47 +00:00
|
|
|
types.reserve(sample_block.columns());
|
2016-12-08 02:49:04 +00:00
|
|
|
|
2018-10-12 02:09:47 +00:00
|
|
|
for (auto & elem : sample_block)
|
2017-04-01 07:20:54 +00:00
|
|
|
{
|
2018-10-12 02:09:47 +00:00
|
|
|
/// If default value for column was not provided, use default from data type.
|
|
|
|
if (elem.column->empty())
|
|
|
|
elem.column = elem.type->createColumnConstWithDefaultValue(1)->convertToFullColumnIfConst();
|
|
|
|
|
|
|
|
DataTypePtr type_not_nullable = removeNullable(elem.type);
|
|
|
|
const IDataType * type = type_not_nullable.get();
|
2016-12-08 02:49:04 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
if (typeid_cast<const DataTypeUInt8 *>(type))
|
|
|
|
types.push_back(ValueType::UInt8);
|
|
|
|
else if (typeid_cast<const DataTypeUInt16 *>(type))
|
|
|
|
types.push_back(ValueType::UInt16);
|
|
|
|
else if (typeid_cast<const DataTypeUInt32 *>(type))
|
|
|
|
types.push_back(ValueType::UInt32);
|
|
|
|
else if (typeid_cast<const DataTypeUInt64 *>(type))
|
|
|
|
types.push_back(ValueType::UInt64);
|
|
|
|
else if (typeid_cast<const DataTypeInt8 *>(type))
|
|
|
|
types.push_back(ValueType::Int8);
|
|
|
|
else if (typeid_cast<const DataTypeInt16 *>(type))
|
|
|
|
types.push_back(ValueType::Int16);
|
|
|
|
else if (typeid_cast<const DataTypeInt32 *>(type))
|
|
|
|
types.push_back(ValueType::Int32);
|
|
|
|
else if (typeid_cast<const DataTypeInt64 *>(type))
|
|
|
|
types.push_back(ValueType::Int64);
|
|
|
|
else if (typeid_cast<const DataTypeFloat32 *>(type))
|
|
|
|
types.push_back(ValueType::Float32);
|
|
|
|
else if (typeid_cast<const DataTypeFloat64 *>(type))
|
|
|
|
types.push_back(ValueType::Float64);
|
|
|
|
else if (typeid_cast<const DataTypeString *>(type))
|
|
|
|
types.push_back(ValueType::String);
|
|
|
|
else if (typeid_cast<const DataTypeDate *>(type))
|
|
|
|
types.push_back(ValueType::Date);
|
|
|
|
else if (typeid_cast<const DataTypeDateTime *>(type))
|
|
|
|
types.push_back(ValueType::DateTime);
|
2018-08-07 19:09:30 +00:00
|
|
|
else if (typeid_cast<const DataTypeUUID *>(type))
|
|
|
|
types.push_back(ValueType::UUID);
|
2017-04-01 07:20:54 +00:00
|
|
|
else
|
2018-05-07 02:01:11 +00:00
|
|
|
throw Exception{"Unsupported type " + type->getName(), ErrorCodes::UNKNOWN_TYPE};
|
2017-04-01 07:20:54 +00:00
|
|
|
}
|
2016-12-08 02:49:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|