2011-08-12 18:27:39 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
|
|
|
#include <DB/DataTypes/DataTypeString.h>
|
2011-09-19 01:42:16 +00:00
|
|
|
#include <DB/DataTypes/DataTypeAggregateFunction.h>
|
2012-08-26 11:14:52 +00:00
|
|
|
#include <DB/DataTypes/DataTypeArray.h>
|
2011-08-12 18:27:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
/// Для заданного значения Field возвращает минимальный тип данных, позволяющий хранить значение этого типа.
|
2013-01-05 20:03:19 +00:00
|
|
|
class FieldToDataType : public StaticVisitor<DataTypePtr>
|
2011-08-12 18:27:39 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
DataTypePtr operator() (const Null & x) const
|
|
|
|
{
|
|
|
|
throw Exception("NULL literals is not implemented yet", ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
}
|
|
|
|
|
|
|
|
DataTypePtr operator() (const UInt64 & x) const
|
|
|
|
{
|
|
|
|
if (x <= std::numeric_limits<UInt8>::max()) return new DataTypeUInt8;
|
|
|
|
if (x <= std::numeric_limits<UInt16>::max()) return new DataTypeUInt16;
|
|
|
|
if (x <= std::numeric_limits<UInt32>::max()) return new DataTypeUInt32;
|
|
|
|
return new DataTypeUInt64;
|
|
|
|
}
|
|
|
|
|
|
|
|
DataTypePtr operator() (const Int64 & x) const
|
|
|
|
{
|
|
|
|
if (x <= std::numeric_limits<Int8>::max() && x >= std::numeric_limits<Int8>::min()) return new DataTypeInt8;
|
|
|
|
if (x <= std::numeric_limits<Int16>::max() && x >= std::numeric_limits<Int16>::min()) return new DataTypeInt16;
|
|
|
|
if (x <= std::numeric_limits<Int32>::max() && x >= std::numeric_limits<Int32>::min()) return new DataTypeInt32;
|
|
|
|
return new DataTypeInt64;
|
|
|
|
}
|
|
|
|
|
|
|
|
DataTypePtr operator() (const Float64 & x) const
|
|
|
|
{
|
|
|
|
return new DataTypeFloat64;
|
|
|
|
}
|
|
|
|
|
|
|
|
DataTypePtr operator() (const String & x) const
|
|
|
|
{
|
2011-09-19 01:42:16 +00:00
|
|
|
return new DataTypeString;
|
|
|
|
}
|
|
|
|
|
2011-08-12 18:27:39 +00:00
|
|
|
DataTypePtr operator() (const Array & x) const
|
|
|
|
{
|
2013-01-05 20:03:19 +00:00
|
|
|
return new DataTypeArray(apply_visitor(FieldToDataType(), x.at(0)));
|
2011-08-12 18:27:39 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|