#include #include #include #include #include #include #include #include #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int EMPTY_DATA_PASSED; extern const int NOT_IMPLEMENTED; } DataTypePtr FieldToDataType::operator() (const Null &) const { return std::make_shared(std::make_shared()); } 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(); } DataTypePtr FieldToDataType::operator() (const UInt128 &) const { throw Exception("There are no UInt128 literals in SQL", ErrorCodes::NOT_IMPLEMENTED); } 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(); } DataTypePtr FieldToDataType::operator() (const Float64 &) const { return std::make_shared(); } DataTypePtr FieldToDataType::operator() (const String &) const { return std::make_shared(); } DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } DataTypePtr FieldToDataType::operator() (const DecimalField & x) const { using Type = DataTypeDecimal; return std::make_shared(Type::maxPrecision(), x.getScale()); } 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(FieldToDataType(), elem)); return std::make_shared(getLeastSupertype(element_types)); } 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(ext::size(tuple)); for (const auto & element : tuple) element_types.push_back(applyVisitor(FieldToDataType(), element)); return std::make_shared(element_types); } DataTypePtr FieldToDataType::operator() (const AggregateFunctionStateData & x) const { auto & name = static_cast(x).name; return DataTypeFactory::instance().get(name); } }