OmniSciDB  5ade3759e0
CompareIR.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 MapD Technologies, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "CodeGenerator.h"
18 #include "Execute.h"
19 
20 #include <typeinfo>
21 
22 #include "../Parser/ParserNode.h"
23 
24 namespace {
25 
26 llvm::CmpInst::Predicate llvm_icmp_pred(const SQLOps op_type) {
27  switch (op_type) {
28  case kEQ:
29  return llvm::ICmpInst::ICMP_EQ;
30  case kNE:
31  return llvm::ICmpInst::ICMP_NE;
32  case kLT:
33  return llvm::ICmpInst::ICMP_SLT;
34  case kGT:
35  return llvm::ICmpInst::ICMP_SGT;
36  case kLE:
37  return llvm::ICmpInst::ICMP_SLE;
38  case kGE:
39  return llvm::ICmpInst::ICMP_SGE;
40  default:
41  abort();
42  }
43 }
44 
45 std::string icmp_name(const SQLOps op_type) {
46  switch (op_type) {
47  case kEQ:
48  return "eq";
49  case kNE:
50  return "ne";
51  case kLT:
52  return "lt";
53  case kGT:
54  return "gt";
55  case kLE:
56  return "le";
57  case kGE:
58  return "ge";
59  default:
60  abort();
61  }
62 }
63 
64 std::string icmp_arr_name(const SQLOps op_type) {
65  switch (op_type) {
66  case kEQ:
67  return "eq";
68  case kNE:
69  return "ne";
70  case kLT:
71  return "gt";
72  case kGT:
73  return "lt";
74  case kLE:
75  return "ge";
76  case kGE:
77  return "le";
78  default:
79  abort();
80  }
81 }
82 
83 llvm::CmpInst::Predicate llvm_fcmp_pred(const SQLOps op_type) {
84  switch (op_type) {
85  case kEQ:
86  return llvm::CmpInst::FCMP_OEQ;
87  case kNE:
88  return llvm::CmpInst::FCMP_ONE;
89  case kLT:
90  return llvm::CmpInst::FCMP_OLT;
91  case kGT:
92  return llvm::CmpInst::FCMP_OGT;
93  case kLE:
94  return llvm::CmpInst::FCMP_OLE;
95  case kGE:
96  return llvm::CmpInst::FCMP_OGE;
97  default:
98  abort();
99  }
100 }
101 
102 } // namespace
103 
104 namespace {
105 
106 std::string string_cmp_func(const SQLOps optype) {
107  switch (optype) {
108  case kLT:
109  return "string_lt";
110  case kLE:
111  return "string_le";
112  case kGT:
113  return "string_gt";
114  case kGE:
115  return "string_ge";
116  case kEQ:
117  return "string_eq";
118  case kNE:
119  return "string_ne";
120  default:
121  abort();
122  }
123 }
124 
125 std::shared_ptr<Analyzer::BinOper> lower_bw_eq(const Analyzer::BinOper* bw_eq) {
126  const auto eq_oper =
127  std::make_shared<Analyzer::BinOper>(bw_eq->get_type_info(),
128  bw_eq->get_contains_agg(),
129  kEQ,
130  bw_eq->get_qualifier(),
131  bw_eq->get_own_left_operand(),
132  bw_eq->get_own_right_operand());
133  const auto lhs_is_null =
134  std::make_shared<Analyzer::UOper>(kBOOLEAN, kISNULL, bw_eq->get_own_left_operand());
135  const auto rhs_is_null = std::make_shared<Analyzer::UOper>(
137  const auto both_are_null =
138  Parser::OperExpr::normalize(kAND, kONE, lhs_is_null, rhs_is_null);
139  const auto bw_eq_oper = std::dynamic_pointer_cast<Analyzer::BinOper>(
140  Parser::OperExpr::normalize(kOR, kONE, eq_oper, both_are_null));
141  CHECK(bw_eq_oper);
142  return bw_eq_oper;
143 }
144 
145 std::shared_ptr<Analyzer::BinOper> make_eq(const std::shared_ptr<Analyzer::Expr>& lhs,
146  const std::shared_ptr<Analyzer::Expr>& rhs,
147  const SQLOps optype) {
148  CHECK(IS_EQUIVALENCE(optype));
149  // Sides of a tuple equality are stripped of cast operators to simplify the logic
150  // in the hash table construction algorithm. Add them back here.
151  auto eq_oper = std::dynamic_pointer_cast<Analyzer::BinOper>(
152  Parser::OperExpr::normalize(optype, kONE, lhs, rhs));
153  CHECK(eq_oper);
154  return optype == kBW_EQ ? lower_bw_eq(eq_oper.get()) : eq_oper;
155 }
156 
157 // Convert a column tuple equality expression back to a conjunction of comparisons
158 // so that it can be handled by the regular code generation methods.
159 std::shared_ptr<Analyzer::BinOper> lower_multicol_compare(
160  const Analyzer::BinOper* multicol_compare) {
161  const auto left_tuple_expr = dynamic_cast<const Analyzer::ExpressionTuple*>(
162  multicol_compare->get_left_operand());
163  const auto right_tuple_expr = dynamic_cast<const Analyzer::ExpressionTuple*>(
164  multicol_compare->get_right_operand());
165  CHECK(left_tuple_expr && right_tuple_expr);
166  const auto& left_tuple = left_tuple_expr->getTuple();
167  const auto& right_tuple = right_tuple_expr->getTuple();
168  CHECK_EQ(left_tuple.size(), right_tuple.size());
169  CHECK_GT(left_tuple.size(), size_t(1));
170  auto acc =
171  make_eq(left_tuple.front(), right_tuple.front(), multicol_compare->get_optype());
172  for (size_t i = 1; i < left_tuple.size(); ++i) {
173  auto crt = make_eq(left_tuple[i], right_tuple[i], multicol_compare->get_optype());
174  const bool not_null =
175  acc->get_type_info().get_notnull() && crt->get_type_info().get_notnull();
176  acc = makeExpr<Analyzer::BinOper>(
177  SQLTypeInfo(kBOOLEAN, not_null), false, kAND, kONE, acc, crt);
178  }
179  return acc;
180 }
181 
182 } // namespace
183 
184 llvm::Value* CodeGenerator::codegenCmp(const Analyzer::BinOper* bin_oper,
185  const CompilationOptions& co) {
186  const auto qualifier = bin_oper->get_qualifier();
187  const auto lhs = bin_oper->get_left_operand();
188  const auto rhs = bin_oper->get_right_operand();
189  if (dynamic_cast<const Analyzer::ExpressionTuple*>(lhs)) {
190  CHECK(dynamic_cast<const Analyzer::ExpressionTuple*>(rhs));
191  const auto lowered = lower_multicol_compare(bin_oper);
192  const auto lowered_lvs = codegen(lowered.get(), true, co);
193  CHECK_EQ(size_t(1), lowered_lvs.size());
194  return lowered_lvs.front();
195  }
196  const auto optype = bin_oper->get_optype();
197  if (optype == kBW_EQ) {
198  const auto bw_eq_oper = lower_bw_eq(bin_oper);
199  return codegenLogical(bw_eq_oper.get(), co);
200  }
201  if (optype == kOVERLAPS) {
202  return codegenOverlaps(optype,
203  qualifier,
204  bin_oper->get_own_left_operand(),
205  bin_oper->get_own_right_operand(),
206  co);
207  }
208  if (is_unnest(lhs) || is_unnest(rhs)) {
209  throw std::runtime_error("Unnest not supported in comparisons");
210  }
211  const auto& lhs_ti = lhs->get_type_info();
212  const auto& rhs_ti = rhs->get_type_info();
213 
214  if (lhs_ti.is_string() && rhs_ti.is_string() &&
215  !(IS_EQUIVALENCE(optype) || optype == kNE)) {
216  auto cmp_str = codegenStrCmp(optype,
217  qualifier,
218  bin_oper->get_own_left_operand(),
219  bin_oper->get_own_right_operand(),
220  co);
221  if (cmp_str) {
222  return cmp_str;
223  }
224  }
225 
226  if (lhs_ti.is_decimal()) {
227  auto cmp_decimal_const =
228  codegenCmpDecimalConst(optype, qualifier, lhs, lhs_ti, rhs, co);
229  if (cmp_decimal_const) {
230  return cmp_decimal_const;
231  }
232  }
233 
234  auto lhs_lvs = codegen(lhs, true, co);
235  return codegenCmp(optype, qualifier, lhs_lvs, lhs_ti, rhs, co);
236 }
237 
238 llvm::Value* CodeGenerator::codegenOverlaps(const SQLOps optype,
239  const SQLQualifier qualifier,
240  const std::shared_ptr<Analyzer::Expr> lhs,
241  const std::shared_ptr<Analyzer::Expr> rhs,
242  const CompilationOptions& co) {
243  // TODO(adb): we should never get here, but going to leave this in place for now since
244  // it will likely be useful in factoring the bounds check out of ST_Contains
245  const auto lhs_ti = lhs->get_type_info();
246  CHECK(lhs_ti.is_geometry());
247 
248  if (lhs_ti.is_geometry()) {
249  // only point in linestring/poly/mpoly is currently supported
250  CHECK(lhs_ti.get_type() == kPOINT);
251  const auto lhs_col = dynamic_cast<Analyzer::ColumnVar*>(lhs.get());
252  CHECK(lhs_col);
253 
254  // Get the actual point data column descriptor
255  const auto coords_cd = executor()->getCatalog()->getMetadataForColumn(
256  lhs_col->get_table_id(), lhs_col->get_column_id() + 1);
257  CHECK(coords_cd);
258 
259  std::vector<std::shared_ptr<Analyzer::Expr>> geoargs;
260  geoargs.push_back(makeExpr<Analyzer::ColumnVar>(coords_cd->columnType,
261  coords_cd->tableId,
262  coords_cd->columnId,
263  lhs_col->get_rte_idx()));
264 
265  Datum input_compression;
266  input_compression.intval =
267  (lhs_ti.get_compression() == kENCODING_GEOINT && lhs_ti.get_comp_param() == 32)
268  ? 1
269  : 0;
270  geoargs.push_back(makeExpr<Analyzer::Constant>(kINT, false, input_compression));
271  Datum input_srid;
272  input_srid.intval = lhs_ti.get_input_srid();
273  geoargs.push_back(makeExpr<Analyzer::Constant>(kINT, false, input_srid));
274  Datum output_srid;
275  output_srid.intval = lhs_ti.get_output_srid();
276  geoargs.push_back(makeExpr<Analyzer::Constant>(kINT, false, output_srid));
277 
278  const auto x_ptr_oper = makeExpr<Analyzer::FunctionOper>(
279  SQLTypeInfo(kDOUBLE, true), "ST_X_Point", geoargs);
280  const auto y_ptr_oper = makeExpr<Analyzer::FunctionOper>(
281  SQLTypeInfo(kDOUBLE, true), "ST_Y_Point", geoargs);
282 
283  const auto rhs_ti = rhs->get_type_info();
284  CHECK(IS_GEO_POLY(rhs_ti.get_type()));
285  const auto rhs_col = dynamic_cast<Analyzer::ColumnVar*>(rhs.get());
286  CHECK(rhs_col);
287 
288  const auto poly_bounds_cd = executor()->getCatalog()->getMetadataForColumn(
289  rhs_col->get_table_id(),
290  rhs_col->get_column_id() + rhs_ti.get_physical_coord_cols() + 1);
291  CHECK(poly_bounds_cd);
292 
293  auto bbox_col_var = makeExpr<Analyzer::ColumnVar>(poly_bounds_cd->columnType,
294  poly_bounds_cd->tableId,
295  poly_bounds_cd->columnId,
296  rhs_col->get_rte_idx());
297 
298  const auto bbox_contains_func_oper =
299  makeExpr<Analyzer::FunctionOper>(SQLTypeInfo(kBOOLEAN, false),
300  "Point_Overlaps_Box",
301  std::vector<std::shared_ptr<Analyzer::Expr>>{
302  bbox_col_var, x_ptr_oper, y_ptr_oper});
303 
304  return codegenFunctionOper(bbox_contains_func_oper.get(), co);
305  }
306 
307  CHECK(false) << "Unsupported type for overlaps operator: " << lhs_ti.get_type_name();
308  return nullptr;
309 }
310 
311 llvm::Value* CodeGenerator::codegenStrCmp(const SQLOps optype,
312  const SQLQualifier qualifier,
313  const std::shared_ptr<Analyzer::Expr> lhs,
314  const std::shared_ptr<Analyzer::Expr> rhs,
315  const CompilationOptions& co) {
316  const auto lhs_ti = lhs->get_type_info();
317  const auto rhs_ti = rhs->get_type_info();
318 
319  CHECK(lhs_ti.is_string());
320  CHECK(rhs_ti.is_string());
321 
322  const auto null_check_suffix = get_null_check_suffix(lhs_ti, rhs_ti);
323  if (lhs_ti.get_compression() == kENCODING_DICT &&
324  rhs_ti.get_compression() == kENCODING_DICT) {
325  if (lhs_ti.get_comp_param() == rhs_ti.get_comp_param()) {
326  // Both operands share a dictionary
327 
328  // check if query is trying to compare a columnt against literal
329 
330  auto ir = codegenDictStrCmp(lhs, rhs, optype, co);
331  if (ir) {
332  return ir;
333  }
334  } else {
335  // Both operands don't share a dictionary
336  return nullptr;
337  }
338  }
339  return nullptr;
340 }
342  const SQLQualifier qualifier,
343  const Analyzer::Expr* lhs,
344  const SQLTypeInfo& lhs_ti,
345  const Analyzer::Expr* rhs,
346  const CompilationOptions& co) {
347  auto u_oper = dynamic_cast<const Analyzer::UOper*>(lhs);
348  if (!u_oper || u_oper->get_optype() != kCAST) {
349  return nullptr;
350  }
351  auto rhs_constant = dynamic_cast<const Analyzer::Constant*>(rhs);
352  if (!rhs_constant) {
353  return nullptr;
354  }
355  const auto operand = u_oper->get_operand();
356  const auto& operand_ti = operand->get_type_info();
357  if (operand_ti.is_decimal() && operand_ti.get_scale() < lhs_ti.get_scale()) {
358  // lhs decimal type has smaller scale
359  } else if (operand_ti.is_integer() && 0 < lhs_ti.get_scale()) {
360  // lhs is integer, no need to scale it all the way up to the cmp expr scale
361  } else {
362  return nullptr;
363  }
364 
365  auto scale_diff = lhs_ti.get_scale() - operand_ti.get_scale() - 1;
366  int64_t bigintval = rhs_constant->get_constval().bigintval;
367  bool negative = false;
368  if (bigintval < 0) {
369  negative = true;
370  bigintval = -bigintval;
371  }
372  int64_t truncated_decimal = bigintval / exp_to_scale(scale_diff);
373  int64_t decimal_tail = bigintval % exp_to_scale(scale_diff);
374  if (truncated_decimal % 10 == 0 && decimal_tail > 0) {
375  truncated_decimal += 1;
376  }
377  SQLTypeInfo new_ti = SQLTypeInfo(
378  kDECIMAL, 19, lhs_ti.get_scale() - scale_diff, operand_ti.get_notnull());
379  if (negative) {
380  truncated_decimal = -truncated_decimal;
381  }
382  Datum d;
383  d.bigintval = truncated_decimal;
384  const auto new_rhs_lit =
385  makeExpr<Analyzer::Constant>(new_ti, rhs_constant->get_is_null(), d);
386  const auto operand_lv = codegen(operand, true, co).front();
387  const auto lhs_lv = codegenCast(operand_lv, operand_ti, new_ti, false, co);
388  return codegenCmp(optype, qualifier, {lhs_lv}, new_ti, new_rhs_lit.get(), co);
389 }
390 
391 llvm::Value* CodeGenerator::codegenCmp(const SQLOps optype,
392  const SQLQualifier qualifier,
393  std::vector<llvm::Value*> lhs_lvs,
394  const SQLTypeInfo& lhs_ti,
395  const Analyzer::Expr* rhs,
396  const CompilationOptions& co) {
397  CHECK(IS_COMPARISON(optype));
398  const auto& rhs_ti = rhs->get_type_info();
399  if (rhs_ti.is_array()) {
400  return codegenQualifierCmp(optype, qualifier, lhs_lvs, rhs, co);
401  }
402  auto rhs_lvs = codegen(rhs, true, co);
403  CHECK_EQ(kONE, qualifier);
404  if (optype == kOVERLAPS) {
405  CHECK(lhs_ti.is_geometry());
406  CHECK(rhs_ti.is_array() ||
407  rhs_ti.is_geometry()); // allow geo col or bounds col to pass
408  } else {
409  CHECK((lhs_ti.get_type() == rhs_ti.get_type()) ||
410  (lhs_ti.is_string() && rhs_ti.is_string()));
411  }
412  const auto null_check_suffix = get_null_check_suffix(lhs_ti, rhs_ti);
413  if (lhs_ti.is_integer() || lhs_ti.is_decimal() || lhs_ti.is_time() ||
414  lhs_ti.is_boolean() || lhs_ti.is_string() || lhs_ti.is_timeinterval()) {
415  if (lhs_ti.is_string()) {
416  CHECK(rhs_ti.is_string());
417  CHECK_EQ(lhs_ti.get_compression(), rhs_ti.get_compression());
418  if (lhs_ti.get_compression() == kENCODING_NONE) {
419  // unpack pointer + length if necessary
420  if (lhs_lvs.size() != 3) {
421  CHECK_EQ(size_t(1), lhs_lvs.size());
422  lhs_lvs.push_back(cgen_state_->emitCall("extract_str_ptr", {lhs_lvs.front()}));
423  lhs_lvs.push_back(cgen_state_->emitCall("extract_str_len", {lhs_lvs.front()}));
424  }
425  if (rhs_lvs.size() != 3) {
426  CHECK_EQ(size_t(1), rhs_lvs.size());
427  rhs_lvs.push_back(cgen_state_->emitCall("extract_str_ptr", {rhs_lvs.front()}));
428  rhs_lvs.push_back(cgen_state_->emitCall("extract_str_len", {rhs_lvs.front()}));
429  }
430  std::vector<llvm::Value*> str_cmp_args{
431  lhs_lvs[1], lhs_lvs[2], rhs_lvs[1], rhs_lvs[2]};
432  if (!null_check_suffix.empty()) {
433  str_cmp_args.push_back(
435  }
436  return cgen_state_->emitCall(
437  string_cmp_func(optype) + (null_check_suffix.empty() ? "" : "_nullable"),
438  str_cmp_args);
439  } else {
440  CHECK(optype == kEQ || optype == kNE);
441  }
442  }
443  return null_check_suffix.empty()
444  ? cgen_state_->ir_builder_.CreateICmp(
445  llvm_icmp_pred(optype), lhs_lvs.front(), rhs_lvs.front())
447  icmp_name(optype) + "_" + numeric_type_name(lhs_ti) +
448  null_check_suffix,
449  {lhs_lvs.front(),
450  rhs_lvs.front(),
453  }
454  if (lhs_ti.get_type() == kFLOAT || lhs_ti.get_type() == kDOUBLE) {
455  return null_check_suffix.empty()
456  ? cgen_state_->ir_builder_.CreateFCmp(
457  llvm_fcmp_pred(optype), lhs_lvs.front(), rhs_lvs.front())
459  icmp_name(optype) + "_" + numeric_type_name(lhs_ti) +
460  null_check_suffix,
461  {lhs_lvs.front(),
462  rhs_lvs.front(),
463  lhs_ti.get_type() == kFLOAT ? cgen_state_->llFp(NULL_FLOAT)
466  }
467  CHECK(false);
468  return nullptr;
469 }
470 
471 llvm::Value* CodeGenerator::codegenQualifierCmp(const SQLOps optype,
472  const SQLQualifier qualifier,
473  std::vector<llvm::Value*> lhs_lvs,
474  const Analyzer::Expr* rhs,
475  const CompilationOptions& co) {
476  const auto& rhs_ti = rhs->get_type_info();
477  const Analyzer::Expr* arr_expr{rhs};
478  if (dynamic_cast<const Analyzer::UOper*>(rhs)) {
479  const auto cast_arr = static_cast<const Analyzer::UOper*>(rhs);
480  CHECK_EQ(kCAST, cast_arr->get_optype());
481  arr_expr = cast_arr->get_operand();
482  }
483  const auto& arr_ti = arr_expr->get_type_info();
484  const auto& elem_ti = arr_ti.get_elem_type();
485  auto rhs_lvs = codegen(arr_expr, true, co);
486  CHECK_NE(kONE, qualifier);
487  std::string fname{std::string("array_") + (qualifier == kANY ? "any" : "all") + "_" +
488  icmp_arr_name(optype)};
489  const auto& target_ti = rhs_ti.get_elem_type();
490  const bool is_real_string{target_ti.is_string() &&
491  target_ti.get_compression() != kENCODING_DICT};
492  if (is_real_string) {
493  if (g_cluster) {
494  throw std::runtime_error(
495  "Comparison between a dictionary-encoded and a none-encoded string not "
496  "supported for distributed queries");
497  }
498  if (g_enable_watchdog) {
499  throw WatchdogException(
500  "Comparison between a dictionary-encoded and a none-encoded string would be "
501  "slow");
502  }
504  throw QueryMustRunOnCpu();
505  }
506  CHECK_EQ(kENCODING_NONE, target_ti.get_compression());
507  fname += "_str";
508  }
509  if (elem_ti.is_integer() || elem_ti.is_boolean() || elem_ti.is_string()) {
510  fname += ("_" + numeric_type_name(elem_ti));
511  } else {
512  CHECK(elem_ti.is_fp());
513  fname += elem_ti.get_type() == kDOUBLE ? "_double" : "_float";
514  }
515  if (is_real_string) {
516  CHECK_EQ(size_t(3), lhs_lvs.size());
518  fname,
520  {rhs_lvs.front(),
521  posArg(arr_expr),
522  lhs_lvs[1],
523  lhs_lvs[2],
524  cgen_state_->llInt(int64_t(executor()->getStringDictionaryProxy(
525  elem_ti.get_comp_param(), executor()->getRowSetMemoryOwner(), true))),
526  cgen_state_->inlineIntNull(elem_ti)});
527  }
528  if (target_ti.is_integer() || target_ti.is_boolean() || target_ti.is_string()) {
529  fname += ("_" + numeric_type_name(target_ti));
530  } else {
531  CHECK(target_ti.is_fp());
532  fname += target_ti.get_type() == kDOUBLE ? "_double" : "_float";
533  }
535  fname,
537  {rhs_lvs.front(),
538  posArg(arr_expr),
539  lhs_lvs.front(),
540  elem_ti.is_fp() ? static_cast<llvm::Value*>(cgen_state_->inlineFpNull(elem_ti))
541  : static_cast<llvm::Value*>(cgen_state_->inlineIntNull(elem_ti))});
542 }
SQLQualifier get_qualifier() const
Definition: Analyzer.h:434
#define CHECK_EQ(x, y)
Definition: Logger.h:195
#define NULL_DOUBLE
Definition: sqltypes.h:176
llvm::Value * codegenStrCmp(const SQLOps, const SQLQualifier, const std::shared_ptr< Analyzer::Expr >, const std::shared_ptr< Analyzer::Expr >, const CompilationOptions &)
Definition: CompareIR.cpp:311
void d(const SQLTypes expected_type, const std::string &str)
Definition: ImportTest.cpp:268
llvm::ConstantFP * llFp(const float v) const
Definition: CgenState.h:251
bool is_time() const
Definition: sqltypes.h:456
std::string icmp_name(const SQLOps op_type)
Definition: CompareIR.cpp:45
#define IS_EQUIVALENCE(X)
Definition: sqldefs.h:67
CgenState * cgen_state_
SQLQualifier
Definition: sqldefs.h:69
std::shared_ptr< Analyzer::BinOper > lower_multicol_compare(const Analyzer::BinOper *multicol_compare)
Definition: CompareIR.cpp:159
Executor * executor() const
SQLOps
Definition: sqldefs.h:29
Definition: sqldefs.h:35
llvm::IRBuilder ir_builder_
Definition: CgenState.h:268
HOST DEVICE int get_scale() const
Definition: sqltypes.h:328
Definition: sqldefs.h:36
HOST DEVICE SQLTypes get_type() const
Definition: sqltypes.h:323
Definition: sqldefs.h:38
Definition: sqldefs.h:49
Definition: sqldefs.h:30
std::shared_ptr< Analyzer::BinOper > lower_bw_eq(const Analyzer::BinOper *bw_eq)
Definition: CompareIR.cpp:125
llvm::CmpInst::Predicate llvm_fcmp_pred(const SQLOps op_type)
Definition: CompareIR.cpp:83
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
#define CHECK_GT(x, y)
Definition: Logger.h:199
HOST DEVICE EncodingType get_compression() const
Definition: sqltypes.h:331
int32_t intval
Definition: sqltypes.h:125
std::string icmp_arr_name(const SQLOps op_type)
Definition: CompareIR.cpp:64
SQLOps get_optype() const
Definition: Analyzer.h:432
bool is_timeinterval() const
Definition: sqltypes.h:461
bool is_integer() const
Definition: sqltypes.h:452
llvm::LLVMContext & context_
Definition: CgenState.h:266
llvm::Value * codegenCmpDecimalConst(const SQLOps, const SQLQualifier, const Analyzer::Expr *, const SQLTypeInfo &, const Analyzer::Expr *, const CompilationOptions &)
Definition: CompareIR.cpp:341
#define CHECK_NE(x, y)
Definition: Logger.h:196
bool is_decimal() const
Definition: sqltypes.h:453
llvm::ConstantInt * inlineIntNull(const SQLTypeInfo &)
Definition: CgenState.cpp:24
llvm::Value * emitExternalCall(const std::string &fname, llvm::Type *ret_type, const std::vector< llvm::Value *> args, const std::vector< llvm::Attribute::AttrKind > &fnattrs={})
Definition: CgenState.h:203
int64_t bigintval
Definition: sqltypes.h:126
#define NULL_FLOAT
Definition: sqltypes.h:175
llvm::Value * codegenFunctionOper(const Analyzer::FunctionOper *, const CompilationOptions &)
Definition: sqldefs.h:37
Definition: sqldefs.h:69
llvm::Value * codegenOverlaps(const SQLOps, const SQLQualifier, const std::shared_ptr< Analyzer::Expr >, const std::shared_ptr< Analyzer::Expr >, const CompilationOptions &)
Definition: CompareIR.cpp:238
llvm::Value * codegenDictStrCmp(const std::shared_ptr< Analyzer::Expr >, const std::shared_ptr< Analyzer::Expr >, const SQLOps, const CompilationOptions &co)
std::string get_null_check_suffix(const SQLTypeInfo &lhs_ti, const SQLTypeInfo &rhs_ti)
Definition: Execute.h:1043
SQLTypeInfoCore< ArrayContextTypeSizer, ExecutorTypePackaging, DateTimeFacilities > SQLTypeInfo
Definition: sqltypes.h:823
const std::shared_ptr< Analyzer::Expr > get_own_left_operand() const
Definition: Analyzer.h:437
ExecutorDeviceType device_type_
static std::shared_ptr< Analyzer::Expr > normalize(const SQLOps optype, const SQLQualifier qual, std::shared_ptr< Analyzer::Expr > left_expr, std::shared_ptr< Analyzer::Expr > right_expr)
Definition: ParserNode.cpp:257
Definition: sqldefs.h:34
bool is_boolean() const
Definition: sqltypes.h:457
std::vector< llvm::Value * > codegen(const Analyzer::Expr *, const bool fetch_columns, const CompilationOptions &)
Definition: IRCodegen.cpp:25
const std::shared_ptr< Analyzer::Expr > get_own_right_operand() const
Definition: Analyzer.h:440
Definition: sqldefs.h:69
std::shared_ptr< Analyzer::BinOper > make_eq(const std::shared_ptr< Analyzer::Expr > &lhs, const std::shared_ptr< Analyzer::Expr > &rhs, const SQLOps optype)
Definition: CompareIR.cpp:145
llvm::Value * emitCall(const std::string &fname, const std::vector< llvm::Value *> &args)
Definition: CgenState.cpp:134
Definition: sqldefs.h:32
llvm::CmpInst::Predicate llvm_icmp_pred(const SQLOps op_type)
Definition: CompareIR.cpp:26
llvm::Value * codegenCmp(const Analyzer::BinOper *, const CompilationOptions &)
Definition: CompareIR.cpp:184
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:77
#define CHECK(condition)
Definition: Logger.h:187
Definition: sqldefs.h:31
llvm::Value * codegenLogical(const Analyzer::BinOper *, const CompilationOptions &)
Definition: LogicalIR.cpp:289
uint64_t exp_to_scale(const unsigned exp)
int64_t inline_int_null_val(const SQL_TYPE_INFO &ti)
bool is_geometry() const
Definition: sqltypes.h:462
bool g_cluster
bool g_enable_watchdog
Definition: Execute.cpp:69
Definition: sqldefs.h:33
llvm::Value * codegenCast(const Analyzer::UOper *, const CompilationOptions &)
Definition: CastIR.cpp:20
std::string numeric_type_name(const SQLTypeInfo &ti)
Definition: Execute.h:157
bool get_contains_agg() const
Definition: Analyzer.h:79
Definition: sqltypes.h:47
llvm::Value * codegenQualifierCmp(const SQLOps, const SQLQualifier, std::vector< llvm::Value *>, const Analyzer::Expr *, const CompilationOptions &)
Definition: CompareIR.cpp:471
bool is_unnest(const Analyzer::Expr *expr)
Definition: Execute.h:1059
bool is_string() const
Definition: sqltypes.h:450
llvm::ConstantInt * llInt(const T v) const
Definition: CgenState.h:247
std::string string_cmp_func(const SQLOps optype)
Definition: CompareIR.cpp:106
#define IS_COMPARISON(X)
Definition: sqldefs.h:57
const Expr * get_right_operand() const
Definition: Analyzer.h:436
const Expr * get_left_operand() const
Definition: Analyzer.h:435
#define IS_GEO_POLY(T)
Definition: sqltypes.h:168