19 #include "../Analyzer/Analyzer.h"
22 #include <boost/algorithm/string.hpp>
46 throw std::runtime_error(
"SINGLE_VALUE not supported on '" +
53 UNREACHABLE() <<
"Unsupported agg_kind: " << agg_kind;
60 if (boost::iequals(field,
"year") || boost::iequals(field,
"yy") ||
61 boost::iequals(field,
"yyyy") || boost::iequals(field,
"sql_tsi_year")) {
63 }
else if (boost::iequals(field,
"quarter") || boost::iequals(field,
"qq") ||
64 boost::iequals(field,
"q") || boost::iequals(field,
"sql_tsi_quarter")) {
66 }
else if (boost::iequals(field,
"month") || boost::iequals(field,
"mm") ||
67 boost::iequals(field,
"m") || boost::iequals(field,
"sql_tsi_month")) {
69 }
else if (boost::iequals(field,
"dayofyear") || boost::iequals(field,
"dy") ||
70 boost::iequals(field,
"y")) {
72 }
else if (boost::iequals(field,
"day") || boost::iequals(field,
"dd") ||
73 boost::iequals(field,
"d") || boost::iequals(field,
"sql_tsi_day")) {
75 }
else if (boost::iequals(field,
"week") || boost::iequals(field,
"ww") ||
76 boost::iequals(field,
"w") || boost::iequals(field,
"sql_tsi_week")) {
78 }
else if (boost::iequals(field,
"week_sunday")) {
80 }
else if (boost::iequals(field,
"week_saturday")) {
82 }
else if (boost::iequals(field,
"hour") || boost::iequals(field,
"hh") ||
83 boost::iequals(field,
"sql_tsi_hour")) {
85 }
else if (boost::iequals(field,
"minute") || boost::iequals(field,
"mi") ||
86 boost::iequals(field,
"n") || boost::iequals(field,
"sql_tsi_minute")) {
88 }
else if (boost::iequals(field,
"second") || boost::iequals(field,
"ss") ||
89 boost::iequals(field,
"s") || boost::iequals(field,
"sql_tsi_second")) {
91 }
else if (boost::iequals(field,
"millisecond") || boost::iequals(field,
"ms")) {
93 }
else if (boost::iequals(field,
"microsecond") || boost::iequals(field,
"us") ||
94 boost::iequals(field,
"sql_tsi_microsecond") ||
95 boost::iequals(field,
"frac_second")) {
97 }
else if (boost::iequals(field,
"nanosecond") || boost::iequals(field,
"ns") ||
98 boost::iequals(field,
"sql_tsi_frac_second")) {
100 }
else if (boost::iequals(field,
"weekday") || boost::iequals(field,
"dw")) {
102 }
else if (boost::iequals(field,
"quarterday") || boost::iequals(field,
"dq")) {
105 throw std::runtime_error(
"Unsupported field in DATEPART function: " + field);
112 if (boost::iequals(field,
"year") || boost::iequals(field,
"yy") ||
113 boost::iequals(field,
"yyyy") || boost::iequals(field,
"sql_tsi_year")) {
115 }
else if (boost::iequals(field,
"quarter") || boost::iequals(field,
"qq") ||
116 boost::iequals(field,
"q") || boost::iequals(field,
"sql_tsi_quarter")) {
118 }
else if (boost::iequals(field,
"month") || boost::iequals(field,
"mm") ||
119 boost::iequals(field,
"m") || boost::iequals(field,
"sql_tsi_month")) {
121 }
else if (boost::iequals(field,
"day") || boost::iequals(field,
"dd") ||
122 boost::iequals(field,
"d") || boost::iequals(field,
"sql_tsi_day")) {
124 }
else if (boost::iequals(field,
"week") || boost::iequals(field,
"ww") ||
125 boost::iequals(field,
"w") || boost::iequals(field,
"sql_tsi_week")) {
127 }
else if (boost::iequals(field,
"hour") || boost::iequals(field,
"hh") ||
128 boost::iequals(field,
"sql_tsi_hour")) {
130 }
else if (boost::iequals(field,
"minute") || boost::iequals(field,
"mi") ||
131 boost::iequals(field,
"n") || boost::iequals(field,
"sql_tsi_minute")) {
133 }
else if (boost::iequals(field,
"second") || boost::iequals(field,
"ss") ||
134 boost::iequals(field,
"s") || boost::iequals(field,
"sql_tsi_second")) {
136 }
else if (boost::iequals(field,
"millisecond") || boost::iequals(field,
"ms")) {
138 }
else if (boost::iequals(field,
"microsecond") || boost::iequals(field,
"us") ||
139 boost::iequals(field,
"sql_tsi_microsecond") ||
140 boost::iequals(field,
"frac_second")) {
142 }
else if (boost::iequals(field,
"nanosecond") || boost::iequals(field,
"ns") ||
143 boost::iequals(field,
"sql_tsi_frac_second")) {
145 }
else if (boost::iequals(field,
"weekday") || boost::iequals(field,
"dw")) {
147 }
else if (boost::iequals(field,
"decade") || boost::iequals(field,
"dc")) {
149 }
else if (boost::iequals(field,
"century")) {
151 }
else if (boost::iequals(field,
"millennium")) {
154 throw std::runtime_error(
"Unsupported field in DATEADD function: " + field);
161 if (boost::iequals(field,
"year") || boost::iequals(field,
"yy") ||
162 boost::iequals(field,
"yyyy") || boost::iequals(field,
"sql_tsi_year")) {
164 }
else if (boost::iequals(field,
"quarter") || boost::iequals(field,
"qq") ||
165 boost::iequals(field,
"q") || boost::iequals(field,
"sql_tsi_quarter")) {
167 }
else if (boost::iequals(field,
"month") || boost::iequals(field,
"mm") ||
168 boost::iequals(field,
"m") || boost::iequals(field,
"sql_tsi_month")) {
170 }
else if (boost::iequals(field,
"week") || boost::iequals(field,
"ww") ||
171 boost::iequals(field,
"w") || boost::iequals(field,
"sql_tsi_week")) {
173 }
else if (boost::iequals(field,
"week_sunday")) {
175 }
else if (boost::iequals(field,
"week_saturday")) {
177 }
else if (boost::iequals(field,
"day") || boost::iequals(field,
"dd") ||
178 boost::iequals(field,
"d") || boost::iequals(field,
"sql_tsi_day")) {
180 }
else if (boost::iequals(field,
"quarterday")) {
182 }
else if (boost::iequals(field,
"hour") || boost::iequals(field,
"hh") ||
183 boost::iequals(field,
"sql_tsi_hour")) {
185 }
else if (boost::iequals(field,
"minute") || boost::iequals(field,
"mi") ||
186 boost::iequals(field,
"n") || boost::iequals(field,
"sql_tsi_minute")) {
188 }
else if (boost::iequals(field,
"second") || boost::iequals(field,
"ss") ||
189 boost::iequals(field,
"s") || boost::iequals(field,
"sql_tsi_second")) {
191 }
else if (boost::iequals(field,
"millisecond") || boost::iequals(field,
"ms")) {
193 }
else if (boost::iequals(field,
"microsecond") || boost::iequals(field,
"us") ||
194 boost::iequals(field,
"sql_tsi_microsecond") ||
195 boost::iequals(field,
"frac_second")) {
197 }
else if (boost::iequals(field,
"nanosecond") || boost::iequals(field,
"ns") ||
198 boost::iequals(field,
"sql_tsi_frac_second")) {
200 }
else if (boost::iequals(field,
"decade") || boost::iequals(field,
"dc")) {
202 }
else if (boost::iequals(field,
"century")) {
204 }
else if (boost::iequals(field,
"millennium")) {
207 throw std::runtime_error(
"Unsupported field in DATEDIFF function: " + field);
225 return makeExpr<Analyzer::Constant>(ti,
false, d);
SQLTypeInfo get_agg_type(const SQLAgg agg_kind, const Analyzer::Expr *arg_expr)
HOST DEVICE SQLTypes get_type() const
ExtractField to_datepart_field(const std::string &field)
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
DatetruncField to_datediff_field(const std::string &field)
const SQLTypeInfo & get_type_info() const
std::string get_type_name() const
std::shared_ptr< Analyzer::Constant > make_fp_constant(const int64_t val, const SQLTypeInfo &ti)
DateaddField to_dateadd_field(const std::string &field)