OmniSciDB  8fa3bf436f
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CalciteDeserializerUtils.cpp File Reference
#include "CalciteDeserializerUtils.h"
#include "../Analyzer/Analyzer.h"
#include "Logger/Logger.h"
#include <boost/algorithm/string.hpp>
+ Include dependency graph for CalciteDeserializerUtils.cpp:

Go to the source code of this file.

Functions

SQLTypeInfo get_agg_type (const SQLAgg agg_kind, const Analyzer::Expr *arg_expr)
 
ExtractField to_datepart_field (const std::string &field)
 
DateaddField to_dateadd_field (const std::string &field)
 
DatetruncField to_datediff_field (const std::string &field)
 
std::shared_ptr
< Analyzer::Constant
make_fp_constant (const int64_t val, const SQLTypeInfo &ti)
 

Variables

bool g_bigint_count
 

Function Documentation

SQLTypeInfo get_agg_type ( const SQLAgg  agg_kind,
const Analyzer::Expr arg_expr 
)

Definition at line 26 of file CalciteDeserializerUtils.cpp.

References CHECK, g_bigint_count, Analyzer::Expr::get_type_info(), SQLTypeInfo::get_type_name(), SQLTypeInfo::is_integer(), SQLTypeInfo::is_varlen(), kAPPROX_COUNT_DISTINCT, kAPPROX_MEDIAN, kAVG, kBIGINT, kCOUNT, kDOUBLE, kINT, kMAX, kMIN, kSAMPLE, kSINGLE_VALUE, and kSUM.

Referenced by anonymous_namespace{RelAlgExecutor.cpp}::decide_approx_count_distinct_implementation(), and RelAlgTranslator::translateAggregateRex().

26  {
27  switch (agg_kind) {
28  case kCOUNT:
29  return SQLTypeInfo(g_bigint_count ? kBIGINT : kINT, false);
30  case kMIN:
31  case kMAX:
32  return arg_expr->get_type_info();
33  case kSUM:
34  return arg_expr->get_type_info().is_integer() ? SQLTypeInfo(kBIGINT, false)
35  : arg_expr->get_type_info();
36  case kAVG:
37  return SQLTypeInfo(kDOUBLE, false);
39  return SQLTypeInfo(kBIGINT, false);
40  case kAPPROX_MEDIAN:
41  return SQLTypeInfo(kDOUBLE, false);
42  case kSINGLE_VALUE:
43  if (arg_expr->get_type_info().is_varlen()) {
44  throw std::runtime_error("SINGLE_VALUE not supported on '" +
45  arg_expr->get_type_info().get_type_name() + "' input.");
46  }
47  case kSAMPLE:
48  return arg_expr->get_type_info();
49  default:
50  CHECK(false);
51  }
52  CHECK(false);
53  return SQLTypeInfo();
54 }
bool is_varlen() const
Definition: sqltypes.h:514
Definition: sqldefs.h:73
bool is_integer() const
Definition: sqltypes.h:491
bool g_bigint_count
Definition: sqldefs.h:75
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:78
Definition: sqldefs.h:76
std::string get_type_name() const
Definition: sqltypes.h:417
#define CHECK(condition)
Definition: Logger.h:203
Definition: sqltypes.h:44
Definition: sqldefs.h:74
Definition: sqldefs.h:72

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

std::shared_ptr<Analyzer::Constant> make_fp_constant ( const int64_t  val,
const SQLTypeInfo ti 
)

Definition at line 210 of file CalciteDeserializerUtils.cpp.

References CHECK, test_fsi::d, Datum::doubleval, Datum::floatval, SQLTypeInfo::get_type(), kDOUBLE, and kFLOAT.

Referenced by RelAlgTranslator::translateLiteral().

211  {
212  Datum d;
213  switch (ti.get_type()) {
214  case kFLOAT:
215  d.floatval = val;
216  break;
217  case kDOUBLE:
218  d.doubleval = val;
219  break;
220  default:
221  CHECK(false);
222  }
223  return makeExpr<Analyzer::Constant>(ti, false, d);
224 }
tuple d
Definition: test_fsi.py:9
HOST DEVICE SQLTypes get_type() const
Definition: sqltypes.h:314
float floatval
Definition: sqltypes.h:210
#define CHECK(condition)
Definition: Logger.h:203
double doubleval
Definition: sqltypes.h:211

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

DateaddField to_dateadd_field ( const std::string &  field)

Definition at line 108 of file CalciteDeserializerUtils.cpp.

References daCENTURY, daDAY, daDECADE, daHOUR, daMICROSECOND, daMILLENNIUM, daMILLISECOND, daMINUTE, daMONTH, daNANOSECOND, daQUARTER, daSECOND, daWEEK, daWEEKDAY, and daYEAR.

Referenced by RelAlgTranslator::translateDateadd().

108  {
109  DateaddField fieldno;
110  if (boost::iequals(field, "year") || boost::iequals(field, "yy") ||
111  boost::iequals(field, "yyyy") || boost::iequals(field, "sql_tsi_year")) {
112  fieldno = daYEAR;
113  } else if (boost::iequals(field, "quarter") || boost::iequals(field, "qq") ||
114  boost::iequals(field, "q") || boost::iequals(field, "sql_tsi_quarter")) {
115  fieldno = daQUARTER;
116  } else if (boost::iequals(field, "month") || boost::iequals(field, "mm") ||
117  boost::iequals(field, "m") || boost::iequals(field, "sql_tsi_month")) {
118  fieldno = daMONTH;
119  } else if (boost::iequals(field, "day") || boost::iequals(field, "dd") ||
120  boost::iequals(field, "d") || boost::iequals(field, "sql_tsi_day")) {
121  fieldno = daDAY;
122  } else if (boost::iequals(field, "week") || boost::iequals(field, "ww") ||
123  boost::iequals(field, "w") || boost::iequals(field, "sql_tsi_week")) {
124  fieldno = daWEEK;
125  } else if (boost::iequals(field, "hour") || boost::iequals(field, "hh") ||
126  boost::iequals(field, "sql_tsi_hour")) {
127  fieldno = daHOUR;
128  } else if (boost::iequals(field, "minute") || boost::iequals(field, "mi") ||
129  boost::iequals(field, "n") || boost::iequals(field, "sql_tsi_minute")) {
130  fieldno = daMINUTE;
131  } else if (boost::iequals(field, "second") || boost::iequals(field, "ss") ||
132  boost::iequals(field, "s") || boost::iequals(field, "sql_tsi_second")) {
133  fieldno = daSECOND;
134  } else if (boost::iequals(field, "millisecond") || boost::iequals(field, "ms")) {
135  fieldno = daMILLISECOND;
136  } else if (boost::iequals(field, "microsecond") || boost::iequals(field, "us") ||
137  boost::iequals(field, "sql_tsi_microsecond") ||
138  boost::iequals(field, "frac_second")) {
139  fieldno = daMICROSECOND;
140  } else if (boost::iequals(field, "nanosecond") || boost::iequals(field, "ns") ||
141  boost::iequals(field, "sql_tsi_frac_second")) {
142  fieldno = daNANOSECOND;
143  } else if (boost::iequals(field, "weekday") || boost::iequals(field, "dw")) {
144  fieldno = daWEEKDAY;
145  } else if (boost::iequals(field, "decade") || boost::iequals(field, "dc")) {
146  fieldno = daDECADE;
147  } else if (boost::iequals(field, "century")) {
148  fieldno = daCENTURY;
149  } else if (boost::iequals(field, "millennium")) {
150  fieldno = daMILLENNIUM;
151  } else {
152  throw std::runtime_error("Unsupported field in DATEADD function: " + field);
153  }
154  return fieldno;
155 }
Definition: DateAdd.h:47
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
Definition: JsonAccessors.h:31
Definition: DateAdd.h:43
DateaddField
Definition: DateAdd.h:42
Definition: DateAdd.h:56
Definition: DateAdd.h:46

+ Here is the caller graph for this function:

DatetruncField to_datediff_field ( const std::string &  field)

Definition at line 157 of file CalciteDeserializerUtils.cpp.

References dtCENTURY, dtDAY, dtDECADE, dtHOUR, dtMICROSECOND, dtMILLENNIUM, dtMILLISECOND, dtMINUTE, dtMONTH, dtNANOSECOND, dtQUARTER, dtQUARTERDAY, dtSECOND, dtWEEK, dtWEEK_SATURDAY, dtWEEK_SUNDAY, and dtYEAR.

Referenced by RelAlgTranslator::translateDatediff().

157  {
158  DatetruncField fieldno;
159  if (boost::iequals(field, "year") || boost::iequals(field, "yy") ||
160  boost::iequals(field, "yyyy") || boost::iequals(field, "sql_tsi_year")) {
161  fieldno = dtYEAR;
162  } else if (boost::iequals(field, "quarter") || boost::iequals(field, "qq") ||
163  boost::iequals(field, "q") || boost::iequals(field, "sql_tsi_quarter")) {
164  fieldno = dtQUARTER;
165  } else if (boost::iequals(field, "month") || boost::iequals(field, "mm") ||
166  boost::iequals(field, "m") || boost::iequals(field, "sql_tsi_month")) {
167  fieldno = dtMONTH;
168  } else if (boost::iequals(field, "week") || boost::iequals(field, "ww") ||
169  boost::iequals(field, "w") || boost::iequals(field, "sql_tsi_week")) {
170  fieldno = dtWEEK;
171  } else if (boost::iequals(field, "week_sunday")) {
172  fieldno = dtWEEK_SUNDAY;
173  } else if (boost::iequals(field, "week_saturday")) {
174  fieldno = dtWEEK_SATURDAY;
175  } else if (boost::iequals(field, "day") || boost::iequals(field, "dd") ||
176  boost::iequals(field, "d") || boost::iequals(field, "sql_tsi_day")) {
177  fieldno = dtDAY;
178  } else if (boost::iequals(field, "quarterday")) {
179  fieldno = dtQUARTERDAY;
180  } else if (boost::iequals(field, "hour") || boost::iequals(field, "hh") ||
181  boost::iequals(field, "sql_tsi_hour")) {
182  fieldno = dtHOUR;
183  } else if (boost::iequals(field, "minute") || boost::iequals(field, "mi") ||
184  boost::iequals(field, "n") || boost::iequals(field, "sql_tsi_minute")) {
185  fieldno = dtMINUTE;
186  } else if (boost::iequals(field, "second") || boost::iequals(field, "ss") ||
187  boost::iequals(field, "s") || boost::iequals(field, "sql_tsi_second")) {
188  fieldno = dtSECOND;
189  } else if (boost::iequals(field, "millisecond") || boost::iequals(field, "ms")) {
190  fieldno = dtMILLISECOND;
191  } else if (boost::iequals(field, "microsecond") || boost::iequals(field, "us") ||
192  boost::iequals(field, "sql_tsi_microsecond") ||
193  boost::iequals(field, "frac_second")) {
194  fieldno = dtMICROSECOND;
195  } else if (boost::iequals(field, "nanosecond") || boost::iequals(field, "ns") ||
196  boost::iequals(field, "sql_tsi_frac_second")) {
197  fieldno = dtNANOSECOND;
198  } else if (boost::iequals(field, "decade") || boost::iequals(field, "dc")) {
199  fieldno = dtDECADE;
200  } else if (boost::iequals(field, "century")) {
201  fieldno = dtCENTURY;
202  } else if (boost::iequals(field, "millennium")) {
203  fieldno = dtMILLENNIUM;
204  } else {
205  throw std::runtime_error("Unsupported field in DATEDIFF function: " + field);
206  }
207  return fieldno;
208 }
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
Definition: JsonAccessors.h:31
DatetruncField
Definition: DateTruncate.h:27

+ Here is the caller graph for this function:

ExtractField to_datepart_field ( const std::string &  field)

Definition at line 56 of file CalciteDeserializerUtils.cpp.

References kDAY, kDOY, kHOUR, kISODOW, kMICROSECOND, kMILLISECOND, kMINUTE, kMONTH, kNANOSECOND, kQUARTER, kQUARTERDAY, kSECOND, kWEEK, kWEEK_SATURDAY, kWEEK_SUNDAY, and kYEAR.

Referenced by RelAlgTranslator::translateDatepart().

56  {
57  ExtractField fieldno;
58  if (boost::iequals(field, "year") || boost::iequals(field, "yy") ||
59  boost::iequals(field, "yyyy") || boost::iequals(field, "sql_tsi_year")) {
60  fieldno = kYEAR;
61  } else if (boost::iequals(field, "quarter") || boost::iequals(field, "qq") ||
62  boost::iequals(field, "q") || boost::iequals(field, "sql_tsi_quarter")) {
63  fieldno = kQUARTER;
64  } else if (boost::iequals(field, "month") || boost::iequals(field, "mm") ||
65  boost::iequals(field, "m") || boost::iequals(field, "sql_tsi_month")) {
66  fieldno = kMONTH;
67  } else if (boost::iequals(field, "dayofyear") || boost::iequals(field, "dy") ||
68  boost::iequals(field, "y")) {
69  fieldno = kDOY;
70  } else if (boost::iequals(field, "day") || boost::iequals(field, "dd") ||
71  boost::iequals(field, "d") || boost::iequals(field, "sql_tsi_day")) {
72  fieldno = kDAY;
73  } else if (boost::iequals(field, "week") || boost::iequals(field, "ww") ||
74  boost::iequals(field, "w") || boost::iequals(field, "sql_tsi_week")) {
75  fieldno = kWEEK;
76  } else if (boost::iequals(field, "week_sunday")) {
77  fieldno = kWEEK_SUNDAY;
78  } else if (boost::iequals(field, "week_saturday")) {
79  fieldno = kWEEK_SATURDAY;
80  } else if (boost::iequals(field, "hour") || boost::iequals(field, "hh") ||
81  boost::iequals(field, "sql_tsi_hour")) {
82  fieldno = kHOUR;
83  } else if (boost::iequals(field, "minute") || boost::iequals(field, "mi") ||
84  boost::iequals(field, "n") || boost::iequals(field, "sql_tsi_minute")) {
85  fieldno = kMINUTE;
86  } else if (boost::iequals(field, "second") || boost::iequals(field, "ss") ||
87  boost::iequals(field, "s") || boost::iequals(field, "sql_tsi_second")) {
88  fieldno = kSECOND;
89  } else if (boost::iequals(field, "millisecond") || boost::iequals(field, "ms")) {
90  fieldno = kMILLISECOND;
91  } else if (boost::iequals(field, "microsecond") || boost::iequals(field, "us") ||
92  boost::iequals(field, "sql_tsi_microsecond") ||
93  boost::iequals(field, "frac_second")) {
94  fieldno = kMICROSECOND;
95  } else if (boost::iequals(field, "nanosecond") || boost::iequals(field, "ns") ||
96  boost::iequals(field, "sql_tsi_frac_second")) {
97  fieldno = kNANOSECOND;
98  } else if (boost::iequals(field, "weekday") || boost::iequals(field, "dw")) {
99  fieldno = kISODOW;
100  } else if (boost::iequals(field, "quarterday") || boost::iequals(field, "dq")) {
101  fieldno = kQUARTERDAY;
102  } else {
103  throw std::runtime_error("Unsupported field in DATEPART function: " + field);
104  }
105  return fieldno;
106 }
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
Definition: JsonAccessors.h:31
ExtractField

+ Here is the caller graph for this function:

Variable Documentation