17 #ifndef INLINENULLVALUES_H
18 #define INLINENULLVALUES_H
20 #include "../Logger/Logger.h"
29 #define NULL_BOOLEAN INT8_MIN
30 #define NULL_TINYINT INT8_MIN
31 #define NULL_SMALLINT INT16_MIN
32 #define NULL_INT INT32_MIN
33 #define NULL_BIGINT INT64_MIN
34 #define NULL_FLOAT FLT_MIN
35 #define NULL_DOUBLE DBL_MIN
37 #define NULL_ARRAY_BOOLEAN (INT8_MIN + 1)
38 #define NULL_ARRAY_TINYINT (INT8_MIN + 1)
39 #define NULL_ARRAY_SMALLINT (INT16_MIN + 1)
40 #define NULL_ARRAY_INT (INT32_MIN + 1)
41 #define NULL_ARRAY_BIGINT (INT64_MIN + 1)
42 #define NULL_ARRAY_FLOAT (FLT_MIN * 2.0)
43 #define NULL_ARRAY_DOUBLE (DBL_MIN * 2.0)
45 #define NULL_ARRAY_COMPRESSED_32 0x80000000U
47 #if !(defined(__CUDACC__) || defined(NO_BOOST))
48 #define CONSTEXPR constexpr
55 return std::is_signed<T>::value ? std::numeric_limits<T>::min()
56 : std::numeric_limits<T>::max();
61 return std::is_signed<T>::value ? std::numeric_limits<T>::min() + 1
62 : std::numeric_limits<T>::max() - 1;
69 return std::is_signed<T>::value ? std::numeric_limits<T>::max()
70 : std::numeric_limits<T>::max() - 1;
75 #if !(defined(__CUDACC__) || defined(NO_BOOST))
76 LOG(
FATAL) <<
"Only float or double overloads should be called.";
95 #if !(defined(__CUDACC__) || defined(NO_BOOST))
96 LOG(
FATAL) <<
"Only float or double overloads should be called.";
114 template <
typename SQL_TYPE_INFO>
116 auto type = ti.get_type();
117 if (ti.is_string()) {
126 return inline_int_null_value<int8_t>();
128 return inline_int_null_value<int8_t>();
130 return inline_int_null_value<int16_t>();
132 return inline_int_null_value<int32_t>();
134 return inline_int_null_value<int64_t>();
143 return inline_int_null_value<int64_t>();
146 return inline_int_null_value<int64_t>();
152 template <
typename SQL_TYPE_INFO>
158 switch (ti.get_comp_param()) {
161 return inline_int_null_value<int32_t>();
163 return inline_int_null_value<int16_t>();
166 CHECK(
false) <<
"Unknown encoding width for date in days: "
167 << ti.get_comp_param();
174 CHECK(ti.is_string());
175 switch (ti.get_size()) {
177 return inline_int_null_value<uint8_t>();
179 return inline_int_null_value<uint16_t>();
181 return inline_int_null_value<int32_t>();
184 CHECK(
false) <<
"Unknown size for dictionary encoded type: " << ti.get_size();
191 CHECK(ti.is_integer() || ti.is_time() || ti.is_decimal());
192 CHECK_EQ(0, ti.get_comp_param() % 8);
193 return -(1LL << (ti.get_comp_param() - 1));
196 template <
typename SQL_TYPE_INFO>
199 const auto type = ti.get_type();
211 template <
typename SQL_TYPE_INFO>
213 auto type = ti.get_type();
214 if (ti.is_string()) {
225 return inline_int_null_array_value<int8_t>();
227 return inline_int_null_array_value<int8_t>();
229 return inline_int_null_array_value<int16_t>();
231 return inline_int_null_array_value<int32_t>();
233 return inline_int_null_array_value<int64_t>();
239 return inline_int_null_array_value<int64_t>();
242 return inline_int_null_array_value<int64_t>();
248 template <
typename SQL_TYPE_INFO>
254 switch (ti.get_comp_param()) {
257 return inline_int_null_array_value<int32_t>();
259 return inline_int_null_array_value<int16_t>();
262 CHECK(
false) <<
"Unknown encoding width for date in days: "
263 << ti.get_comp_param();
270 CHECK(ti.is_string());
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 -(1LL << (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>
330 if CONSTEXPR (std::is_floating_point<T>::value) {
332 nv = inline_fp_null_array_value<T>();
334 nv = inline_fp_null_value<T>();
336 }
else if CONSTEXPR (std::is_integral<T>::value) {
338 nv = inline_int_null_array_value<T>();
340 nv = inline_int_null_value<T>();
343 #if !(defined(__CUDACC__) || defined(NO_BOOST))
345 CHECK(
false) <<
"Serializing null values of floating point or integral types only is "
352 template <
typename T,
bool array = false>
355 return serialized_null_value<T, array>() == *(TT*)(&value);
358 template <
typename T>
360 if CONSTEXPR (std::is_floating_point<T>::value) {
361 return inline_fp_null_value<T>();
362 }
else if CONSTEXPR (std::is_integral<T>::value) {
363 return inline_int_null_value<T>();
365 #if !(defined(__CUDACC__) || defined(NO_BOOST))
367 CHECK(
false) <<
"Serializing null values of floating point or integral types only is "
371 return inline_int_null_value<int32_t>();
374 template <
typename T,
bool array = false>
377 *(TT*)(&value) = serialized_null_value<T, array>();
constexpr T inline_fp_null_value()
CONSTEXPR DEVICE serialize_detail::IntType< sizeof(T)>::type serialized_null_value()
DEVICE T inline_fp_null_array_value()
DEVICE float inline_fp_null_array_value< float >()
double inline_fp_null_val(const SQL_TYPE_INFO &ti)
CONSTEXPR DEVICE bool is_null(const T &value)
DEVICE TextEncodingDict inline_null_value()
DEVICE double inline_fp_null_array_value< double >()
CONSTEXPR DEVICE void set_null(T &value)
int64_t inline_int_null_array_val(const SQL_TYPE_INFO &ti)
constexpr int64_t inline_int_null_value()
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 int64_t inline_int_null_array_value()
constexpr int64_t max_valid_int_value()