1#include <Common/FieldVisitors.h>
2#include <DataTypes/FieldToDataType.h>
3#include <DataTypes/DataTypeTuple.h>
4#include <DataTypes/DataTypesNumber.h>
5#include <DataTypes/DataTypesDecimal.h>
6#include <DataTypes/DataTypeString.h>
7#include <DataTypes/DataTypeArray.h>
8#include <DataTypes/DataTypeNullable.h>
9#include <DataTypes/DataTypeNothing.h>
10#include <DataTypes/getLeastSupertype.h>
11#include <DataTypes/DataTypeFactory.h>
12#include <Common/Exception.h>
13#include <ext/size.h>
14
15
16namespace DB
17{
18
19namespace ErrorCodes
20{
21 extern const int EMPTY_DATA_PASSED;
22 extern const int NOT_IMPLEMENTED;
23}
24
25
26DataTypePtr FieldToDataType::operator() (const Null &) const
27{
28 return std::make_shared<DataTypeNullable>(std::make_shared<DataTypeNothing>());
29}
30
31DataTypePtr FieldToDataType::operator() (const UInt64 & x) const
32{
33 if (x <= std::numeric_limits<UInt8>::max()) return std::make_shared<DataTypeUInt8>();
34 if (x <= std::numeric_limits<UInt16>::max()) return std::make_shared<DataTypeUInt16>();
35 if (x <= std::numeric_limits<UInt32>::max()) return std::make_shared<DataTypeUInt32>();
36 return std::make_shared<DataTypeUInt64>();
37}
38
39DataTypePtr FieldToDataType::operator() (const UInt128 &) const
40{
41 throw Exception("There are no UInt128 literals in SQL", ErrorCodes::NOT_IMPLEMENTED);
42}
43
44DataTypePtr FieldToDataType::operator() (const Int64 & x) const
45{
46 if (x <= std::numeric_limits<Int8>::max() && x >= std::numeric_limits<Int8>::min()) return std::make_shared<DataTypeInt8>();
47 if (x <= std::numeric_limits<Int16>::max() && x >= std::numeric_limits<Int16>::min()) return std::make_shared<DataTypeInt16>();
48 if (x <= std::numeric_limits<Int32>::max() && x >= std::numeric_limits<Int32>::min()) return std::make_shared<DataTypeInt32>();
49 return std::make_shared<DataTypeInt64>();
50}
51
52DataTypePtr FieldToDataType::operator() (const Float64 &) const
53{
54 return std::make_shared<DataTypeFloat64>();
55}
56
57DataTypePtr FieldToDataType::operator() (const String &) const
58{
59 return std::make_shared<DataTypeString>();
60}
61
62DataTypePtr FieldToDataType::operator() (const DecimalField<Decimal32> & x) const
63{
64 using Type = DataTypeDecimal<Decimal32>;
65 return std::make_shared<Type>(Type::maxPrecision(), x.getScale());
66}
67
68DataTypePtr FieldToDataType::operator() (const DecimalField<Decimal64> & x) const
69{
70 using Type = DataTypeDecimal<Decimal64>;
71 return std::make_shared<Type>(Type::maxPrecision(), x.getScale());
72}
73
74DataTypePtr FieldToDataType::operator() (const DecimalField<Decimal128> & x) const
75{
76 using Type = DataTypeDecimal<Decimal128>;
77 return std::make_shared<Type>(Type::maxPrecision(), x.getScale());
78}
79
80
81DataTypePtr FieldToDataType::operator() (const Array & x) const
82{
83 DataTypes element_types;
84 element_types.reserve(x.size());
85
86 for (const Field & elem : x)
87 element_types.emplace_back(applyVisitor(FieldToDataType(), elem));
88
89 return std::make_shared<DataTypeArray>(getLeastSupertype(element_types));
90}
91
92
93DataTypePtr FieldToDataType::operator() (const Tuple & tuple) const
94{
95 if (tuple.empty())
96 throw Exception("Cannot infer type of an empty tuple", ErrorCodes::EMPTY_DATA_PASSED);
97
98 DataTypes element_types;
99 element_types.reserve(ext::size(tuple));
100
101 for (const auto & element : tuple)
102 element_types.push_back(applyVisitor(FieldToDataType(), element));
103
104 return std::make_shared<DataTypeTuple>(element_types);
105}
106
107DataTypePtr FieldToDataType::operator() (const AggregateFunctionStateData & x) const
108{
109 auto & name = static_cast<const AggregateFunctionStateData &>(x).name;
110 return DataTypeFactory::instance().get(name);
111}
112
113}
114