19 #include "../Analyzer/Analyzer.h"
22 #include <boost/algorithm/string.hpp>
44 throw std::runtime_error(
"SINGLE_VALUE not supported on '" +
58 if (boost::iequals(field,
"year") || boost::iequals(field,
"yy") ||
59 boost::iequals(field,
"yyyy") || boost::iequals(field,
"sql_tsi_year")) {
61 }
else if (boost::iequals(field,
"quarter") || boost::iequals(field,
"qq") ||
62 boost::iequals(field,
"q") || boost::iequals(field,
"sql_tsi_quarter")) {
64 }
else if (boost::iequals(field,
"month") || boost::iequals(field,
"mm") ||
65 boost::iequals(field,
"m") || boost::iequals(field,
"sql_tsi_month")) {
67 }
else if (boost::iequals(field,
"dayofyear") || boost::iequals(field,
"dy") ||
68 boost::iequals(field,
"y")) {
70 }
else if (boost::iequals(field,
"day") || boost::iequals(field,
"dd") ||
71 boost::iequals(field,
"d") || boost::iequals(field,
"sql_tsi_day")) {
73 }
else if (boost::iequals(field,
"week") || boost::iequals(field,
"ww") ||
74 boost::iequals(field,
"w") || boost::iequals(field,
"sql_tsi_week")) {
76 }
else if (boost::iequals(field,
"week_sunday")) {
78 }
else if (boost::iequals(field,
"week_saturday")) {
80 }
else if (boost::iequals(field,
"hour") || boost::iequals(field,
"hh") ||
81 boost::iequals(field,
"sql_tsi_hour")) {
83 }
else if (boost::iequals(field,
"minute") || boost::iequals(field,
"mi") ||
84 boost::iequals(field,
"n") || boost::iequals(field,
"sql_tsi_minute")) {
86 }
else if (boost::iequals(field,
"second") || boost::iequals(field,
"ss") ||
87 boost::iequals(field,
"s") || boost::iequals(field,
"sql_tsi_second")) {
89 }
else if (boost::iequals(field,
"millisecond") || boost::iequals(field,
"ms")) {
91 }
else if (boost::iequals(field,
"microsecond") || boost::iequals(field,
"us") ||
92 boost::iequals(field,
"sql_tsi_microsecond") ||
93 boost::iequals(field,
"frac_second")) {
95 }
else if (boost::iequals(field,
"nanosecond") || boost::iequals(field,
"ns") ||
96 boost::iequals(field,
"sql_tsi_frac_second")) {
98 }
else if (boost::iequals(field,
"weekday") || boost::iequals(field,
"dw")) {
100 }
else if (boost::iequals(field,
"quarterday") || boost::iequals(field,
"dq")) {
103 throw std::runtime_error(
"Unsupported field in DATEPART function: " + field);
110 if (boost::iequals(field,
"year") || boost::iequals(field,
"yy") ||
111 boost::iequals(field,
"yyyy") || boost::iequals(field,
"sql_tsi_year")) {
113 }
else if (boost::iequals(field,
"quarter") || boost::iequals(field,
"qq") ||
114 boost::iequals(field,
"q") || boost::iequals(field,
"sql_tsi_quarter")) {
116 }
else if (boost::iequals(field,
"month") || boost::iequals(field,
"mm") ||
117 boost::iequals(field,
"m") || boost::iequals(field,
"sql_tsi_month")) {
119 }
else if (boost::iequals(field,
"day") || boost::iequals(field,
"dd") ||
120 boost::iequals(field,
"d") || boost::iequals(field,
"sql_tsi_day")) {
122 }
else if (boost::iequals(field,
"week") || boost::iequals(field,
"ww") ||
123 boost::iequals(field,
"w") || boost::iequals(field,
"sql_tsi_week")) {
125 }
else if (boost::iequals(field,
"hour") || boost::iequals(field,
"hh") ||
126 boost::iequals(field,
"sql_tsi_hour")) {
128 }
else if (boost::iequals(field,
"minute") || boost::iequals(field,
"mi") ||
129 boost::iequals(field,
"n") || boost::iequals(field,
"sql_tsi_minute")) {
131 }
else if (boost::iequals(field,
"second") || boost::iequals(field,
"ss") ||
132 boost::iequals(field,
"s") || boost::iequals(field,
"sql_tsi_second")) {
134 }
else if (boost::iequals(field,
"millisecond") || boost::iequals(field,
"ms")) {
136 }
else if (boost::iequals(field,
"microsecond") || boost::iequals(field,
"us") ||
137 boost::iequals(field,
"sql_tsi_microsecond") ||
138 boost::iequals(field,
"frac_second")) {
140 }
else if (boost::iequals(field,
"nanosecond") || boost::iequals(field,
"ns") ||
141 boost::iequals(field,
"sql_tsi_frac_second")) {
143 }
else if (boost::iequals(field,
"weekday") || boost::iequals(field,
"dw")) {
145 }
else if (boost::iequals(field,
"decade") || boost::iequals(field,
"dc")) {
147 }
else if (boost::iequals(field,
"century")) {
149 }
else if (boost::iequals(field,
"millennium")) {
152 throw std::runtime_error(
"Unsupported field in DATEADD function: " + field);
159 if (boost::iequals(field,
"year") || boost::iequals(field,
"yy") ||
160 boost::iequals(field,
"yyyy") || boost::iequals(field,
"sql_tsi_year")) {
162 }
else if (boost::iequals(field,
"quarter") || boost::iequals(field,
"qq") ||
163 boost::iequals(field,
"q") || boost::iequals(field,
"sql_tsi_quarter")) {
165 }
else if (boost::iequals(field,
"month") || boost::iequals(field,
"mm") ||
166 boost::iequals(field,
"m") || boost::iequals(field,
"sql_tsi_month")) {
168 }
else if (boost::iequals(field,
"week") || boost::iequals(field,
"ww") ||
169 boost::iequals(field,
"w") || boost::iequals(field,
"sql_tsi_week")) {
171 }
else if (boost::iequals(field,
"week_sunday")) {
173 }
else if (boost::iequals(field,
"week_saturday")) {
175 }
else if (boost::iequals(field,
"day") || boost::iequals(field,
"dd") ||
176 boost::iequals(field,
"d") || boost::iequals(field,
"sql_tsi_day")) {
178 }
else if (boost::iequals(field,
"quarterday")) {
180 }
else if (boost::iequals(field,
"hour") || boost::iequals(field,
"hh") ||
181 boost::iequals(field,
"sql_tsi_hour")) {
183 }
else if (boost::iequals(field,
"minute") || boost::iequals(field,
"mi") ||
184 boost::iequals(field,
"n") || boost::iequals(field,
"sql_tsi_minute")) {
186 }
else if (boost::iequals(field,
"second") || boost::iequals(field,
"ss") ||
187 boost::iequals(field,
"s") || boost::iequals(field,
"sql_tsi_second")) {
189 }
else if (boost::iequals(field,
"millisecond") || boost::iequals(field,
"ms")) {
191 }
else if (boost::iequals(field,
"microsecond") || boost::iequals(field,
"us") ||
192 boost::iequals(field,
"sql_tsi_microsecond") ||
193 boost::iequals(field,
"frac_second")) {
195 }
else if (boost::iequals(field,
"nanosecond") || boost::iequals(field,
"ns") ||
196 boost::iequals(field,
"sql_tsi_frac_second")) {
198 }
else if (boost::iequals(field,
"decade") || boost::iequals(field,
"dc")) {
200 }
else if (boost::iequals(field,
"century")) {
202 }
else if (boost::iequals(field,
"millennium")) {
205 throw std::runtime_error(
"Unsupported field in DATEDIFF function: " + field);
223 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)