OmniSciDB  29e35f4d58
TargetInfo.h
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 
22 #ifndef QUERYENGINE_TARGETINFO_H
23 #define QUERYENGINE_TARGETINFO_H
24 
25 #include "sqldefs.h"
26 #include "sqltypes.h"
27 
28 #include "../Analyzer/Analyzer.h"
29 
30 inline const Analyzer::AggExpr* cast_to_agg_expr(const Analyzer::Expr* target_expr) {
31  return dynamic_cast<const Analyzer::AggExpr*>(target_expr);
32 }
33 
35  const std::shared_ptr<Analyzer::Expr> target_expr) {
36  return dynamic_cast<const Analyzer::AggExpr*>(target_expr.get());
37 }
38 
39 struct TargetInfo {
40  bool is_agg;
46 };
47 
53  switch (agg_kind) {
54  case kMIN:
55  case kMAX:
56  case kSINGLE_VALUE:
57  case kSAMPLE:
58  return true;
59  default:
60  break;
61  }
62  return false;
63 }
64 
65 template <class PointerType>
66 inline TargetInfo get_target_info(const PointerType target_expr,
67  const bool bigint_count) {
68  const auto agg_expr = cast_to_agg_expr(target_expr);
69  bool notnull = target_expr->get_type_info().get_notnull();
70  if (!agg_expr) {
71  auto target_ti = target_expr ? get_logical_type_info(target_expr->get_type_info())
72  : SQLTypeInfo(kBIGINT, notnull);
73  return {false, kMIN, target_ti, SQLTypeInfo(kNULLT, false), false, false};
74  }
75  const auto agg_type = agg_expr->get_aggtype();
76  const auto agg_arg = agg_expr->get_arg();
77  if (!agg_arg) {
78  CHECK_EQ(kCOUNT, agg_type);
79  CHECK(!agg_expr->get_is_distinct());
80  return {true,
81  kCOUNT,
82  SQLTypeInfo(bigint_count ? kBIGINT : kINT, notnull),
83  SQLTypeInfo(kNULLT, false),
84  false,
85  false};
86  }
87 
88  const auto& agg_arg_ti = agg_arg->get_type_info();
89  bool is_distinct{false};
90  if (agg_expr->get_aggtype() == kCOUNT) {
91  is_distinct = agg_expr->get_is_distinct();
92  }
93 
94  if (agg_type == kAVG) {
95  // Upcast the target type for AVG, so that the integer argument does not overflow the
96  // sum
97  return {true,
98  agg_expr->get_aggtype(),
99  agg_arg_ti.is_integer() ? SQLTypeInfo(kBIGINT, agg_arg_ti.get_notnull())
100  : agg_arg_ti,
101  agg_arg_ti,
102  !agg_arg_ti.get_notnull(),
103  is_distinct};
104  }
105 
106  return {
107  true,
108  agg_expr->get_aggtype(),
109  agg_type == kCOUNT
110  ? SQLTypeInfo((is_distinct || bigint_count) ? kBIGINT : kINT, notnull)
111  : agg_expr->get_type_info(),
112  agg_arg_ti,
113  agg_type == kCOUNT && agg_arg_ti.is_varlen() ? false : !agg_arg_ti.get_notnull(),
114  is_distinct};
115 }
116 
117 inline bool is_distinct_target(const TargetInfo& target_info) {
118  return target_info.is_distinct || target_info.agg_kind == kAPPROX_COUNT_DISTINCT;
119 }
120 
121 inline bool takes_float_argument(const TargetInfo& target_info) {
122  return target_info.is_agg &&
123  (target_info.agg_kind == kAVG || target_info.agg_kind == kSUM ||
124  target_info.agg_kind == kMIN || target_info.agg_kind == kMAX ||
125  target_info.agg_kind == kSINGLE_VALUE) &&
126  target_info.agg_arg_type.get_type() == kFLOAT;
127 }
128 
129 #endif // QUERYENGINE_TARGETINFO_H
const Analyzer::Expr * agg_arg(const Analyzer::Expr *expr)
SQLAgg
Definition: sqldefs.h:71
#define CHECK_EQ(x, y)
Definition: Logger.h:201
SQLTypeInfo sql_type
Definition: TargetInfo.h:42
HOST DEVICE bool get_notnull() const
Definition: sqltypes.h:333
TargetInfo get_target_info(const PointerType target_expr, const bool bigint_count)
Definition: TargetInfo.h:66
HOST DEVICE SQLTypes get_type() const
Definition: sqltypes.h:326
SQLTypeInfo get_logical_type_info(const SQLTypeInfo &type_info)
Definition: sqltypes.h:869
Constants for Builtin SQL Types supported by MapD.
bool takes_float_argument(const TargetInfo &target_info)
Definition: TargetInfo.h:121
bool skip_null_val
Definition: TargetInfo.h:44
SQLTypeInfo agg_arg_type
Definition: TargetInfo.h:43
Definition: sqldefs.h:73
bool is_agg
Definition: TargetInfo.h:40
Definition: sqldefs.h:75
bool is_distinct_target(const TargetInfo &target_info)
Definition: TargetInfo.h:117
SQLTypeInfoCore< ArrayContextTypeSizer, ExecutorTypePackaging, DateTimeFacilities > SQLTypeInfo
Definition: sqltypes.h:852
SQLAgg agg_kind
Definition: TargetInfo.h:41
const Analyzer::AggExpr * cast_to_agg_expr(const Analyzer::Expr *target_expr)
Definition: TargetInfo.h:30
Definition: sqldefs.h:76
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:78
#define CHECK(condition)
Definition: Logger.h:193
Common Enum definitions for SQL processing.
Definition: sqltypes.h:48
bool is_distinct
Definition: TargetInfo.h:45
Definition: sqldefs.h:74
Definition: sqldefs.h:72
bool is_agg_domain_range_equivalent(const SQLAgg &agg_kind)
Definition: TargetInfo.h:52