#include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int EMPTY_DATA_PASSED; } template DataTypePtr FieldToDataType::operator() (const Null &) const { return std::make_shared(std::make_shared()); } template DataTypePtr FieldToDataType::operator() (const UInt64 & x) const { if (x <= std::numeric_limits::max()) return std::make_shared(); if (x <= std::numeric_limits::max()) return std::make_shared(); if (x <= std::numeric_limits::max()) return std::make_shared(); return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const Int64 & x) const { if (x <= std::numeric_limits::max() && x >= std::numeric_limits::min()) return std::make_shared(); if (x <= std::numeric_limits::max() && x >= std::numeric_limits::min()) return std::make_shared(); if (x <= std::numeric_limits::max() && x >= std::numeric_limits::min()) return std::make_shared(); return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const Float64 &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const UInt128 &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const Int128 &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const UInt256 &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const Int256 &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const UUID &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const String &) const { return std::make_shared(); } template DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } template DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } template DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } template DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } template DataTypePtr FieldToDataType::operator() (const Array & x) const { DataTypes element_types; element_types.reserve(x.size()); for (const Field & elem : x) element_types.emplace_back(applyVisitor(*this, elem)); return std::make_shared(getLeastSupertype(element_types)); } template DataTypePtr FieldToDataType::operator() (const Tuple & tuple) const { if (tuple.empty()) throw Exception("Cannot infer type of an empty tuple", ErrorCodes::EMPTY_DATA_PASSED); DataTypes element_types; element_types.reserve(tuple.size()); for (const auto & element : tuple) element_types.push_back(applyVisitor(*this, element)); return std::make_shared(element_types); } template DataTypePtr FieldToDataType::operator() (const Map & map) const { DataTypes key_types; DataTypes value_types; key_types.reserve(map.size()); value_types.reserve(map.size()); for (const auto & elem : map) { const auto & tuple = elem.safeGet(); assert(tuple.size() == 2); key_types.push_back(applyVisitor(*this, tuple[0])); value_types.push_back(applyVisitor(*this, tuple[1])); } return std::make_shared( getLeastSupertype(key_types), getLeastSupertype(value_types)); } template DataTypePtr FieldToDataType::operator() (const Object &) const { /// TODO: Do we need different parameters for type Object? return std::make_shared("json", false); } template DataTypePtr FieldToDataType::operator() (const AggregateFunctionStateData & x) const { const auto & name = static_cast(x).name; return DataTypeFactory::instance().get(name); } template DataTypePtr FieldToDataType::operator()(const bool &) const { return DataTypeFactory::instance().get("Bool"); } template class FieldToDataType; template class FieldToDataType; template class FieldToDataType; }