17 #ifndef INLINENULLVALUES_H
18 #define INLINENULLVALUES_H
20 #include "../Logger/Logger.h"
27 #define NULL_BOOLEAN INT8_MIN
28 #define NULL_TINYINT INT8_MIN
29 #define NULL_SMALLINT INT16_MIN
30 #define NULL_INT INT32_MIN
31 #define NULL_BIGINT INT64_MIN
32 #define NULL_FLOAT FLT_MIN
33 #define NULL_DOUBLE DBL_MIN
35 #define NULL_ARRAY_BOOLEAN (INT8_MIN + 1)
36 #define NULL_ARRAY_TINYINT (INT8_MIN + 1)
37 #define NULL_ARRAY_SMALLINT (INT16_MIN + 1)
38 #define NULL_ARRAY_INT (INT32_MIN + 1)
39 #define NULL_ARRAY_BIGINT (INT64_MIN + 1)
40 #define NULL_ARRAY_FLOAT (FLT_MIN * 2.0)
41 #define NULL_ARRAY_DOUBLE (DBL_MIN * 2.0)
43 #define NULL_ARRAY_COMPRESSED_32 0x80000000U
45 #if !(defined(__CUDACC__) || defined(NO_BOOST))
46 #define CONSTEXPR constexpr
53 return std::is_signed<T>::value ? std::numeric_limits<T>::min()
54 : std::numeric_limits<T>::max();
59 return std::is_signed<T>::value ? std::numeric_limits<T>::min() + 1
60 : std::numeric_limits<T>::max() - 1;
67 return std::is_signed<T>::value ? std::numeric_limits<T>::max()
68 : std::numeric_limits<T>::max() - 1;
73 #if !(defined(__CUDACC__) || defined(NO_BOOST))
74 LOG(
FATAL) <<
"Only float or double overloads should be called.";
93 #if !(defined(__CUDACC__) || defined(NO_BOOST))
94 LOG(
FATAL) <<
"Only float or double overloads should be called.";
112 template <
typename SQL_TYPE_INFO>
114 auto type = ti.get_type();
115 if (ti.is_string()) {
124 return inline_int_null_value<int8_t>();
126 return inline_int_null_value<int8_t>();
128 return inline_int_null_value<int16_t>();
130 return inline_int_null_value<int32_t>();
132 return inline_int_null_value<int64_t>();
138 return inline_int_null_value<int64_t>();
141 return inline_int_null_value<int64_t>();
147 template <
typename SQL_TYPE_INFO>
153 switch (ti.get_comp_param()) {
156 return inline_int_null_value<int32_t>();
158 return inline_int_null_value<int16_t>();
161 CHECK(
false) <<
"Unknown encoding width for date in days: "
162 << ti.get_comp_param();
169 CHECK(ti.is_string());
170 switch (ti.get_size()) {
172 return inline_int_null_value<uint8_t>();
174 return inline_int_null_value<uint16_t>();
176 return inline_int_null_value<int32_t>();
179 CHECK(
false) <<
"Unknown size for dictionary encoded type: " << ti.get_size();
186 CHECK(ti.is_integer() || ti.is_time() || ti.is_decimal());
187 CHECK_EQ(0, ti.get_comp_param() % 8);
188 return -(1L << (ti.get_comp_param() - 1));
191 template <
typename SQL_TYPE_INFO>
194 const auto type = ti.get_type();
206 template <
typename SQL_TYPE_INFO>
208 auto type = ti.get_type();
209 if (ti.is_string()) {
220 return inline_int_null_array_value<int8_t>();
222 return inline_int_null_array_value<int8_t>();
224 return inline_int_null_array_value<int16_t>();
226 return inline_int_null_array_value<int32_t>();
228 return inline_int_null_array_value<int64_t>();
234 return inline_int_null_array_value<int64_t>();
237 return inline_int_null_array_value<int64_t>();
243 template <
typename SQL_TYPE_INFO>
249 switch (ti.get_comp_param()) {
252 return inline_int_null_array_value<int32_t>();
254 return inline_int_null_array_value<int16_t>();
257 CHECK(
false) <<
"Unknown encoding width for date in days: "
258 << ti.get_comp_param();
265 CHECK(ti.is_string());
267 CHECK(
false) <<
"Currently don't support fixed length arrays of dict encoded strings";
271 switch (ti.get_size()) {
273 return inline_int_null_array_value<uint8_t>();
275 return inline_int_null_array_value<uint16_t>();
277 return inline_int_null_array_value<int32_t>();
280 CHECK(
false) <<
"Unknown size for dictionary encoded type: " << ti.get_size();
287 CHECK(
false) <<
"Currently don't support fixed length arrays with fixed encoding";
292 CHECK(ti.is_integer() || ti.is_time() || ti.is_decimal());
293 CHECK_EQ(0, ti.get_comp_param() % 8);
297 return -(1L << (ti.get_comp_param() - 1)) + 1;
302 #include <type_traits>
304 namespace serialize_detail {
305 template <
int overload>
325 template <
typename T,
bool array = false>
331 CONSTEXPR(std::is_floating_point<T>::value) {
333 CONSTEXPR(array) { nv = inline_fp_null_array_value<T>(); }
335 nv = inline_fp_null_value<T>();
341 CONSTEXPR(array) { nv = inline_int_null_array_value<T>(); }
343 nv = inline_int_null_value<T>();
346 #if !(defined(__CUDACC__) || defined(NO_BOOST))
348 CHECK(
false) <<
"Serializing null values of floating point or integral types only is "
355 template <
typename T,
bool array = false>
358 return serialized_null_value<T, array>() == *(TT*)(&value);
361 template <
typename T,
bool array = false>
364 *(TT*)(&value) = serialized_null_value<T, array>();
constexpr T inline_fp_null_value()
CONSTEXPR DEVICE serialize_detail::IntType< sizeof(T)>::type serialized_null_value()
double inline_fp_null_val(const SQL_TYPE_INFO &ti)
CONSTEXPR DEVICE bool is_null(const T &value)
CONSTEXPR DEVICE void set_null(T &value)
T inline_fp_null_array_value()
int64_t inline_int_null_array_val(const SQL_TYPE_INFO &ti)
constexpr int64_t inline_int_null_value()
constexpr double inline_fp_null_array_value< double >()
constexpr float inline_fp_null_value< float >()
constexpr double inline_fp_null_value< double >()
int64_t inline_fixed_encoding_null_array_val(const SQL_TYPE_INFO &ti)
#define NULL_ARRAY_DOUBLE
int64_t inline_int_null_val(const SQL_TYPE_INFO &ti)
int64_t inline_fixed_encoding_null_val(const SQL_TYPE_INFO &ti)
constexpr float inline_fp_null_array_value< float >()
constexpr int64_t inline_int_null_array_value()
constexpr int64_t max_valid_int_value()