21 #include <gutil/strings/substitute.h>
25 using namespace apache::hive::service::cli;
26 using namespace impala;
27 using namespace strings;
34 inline void SetNullBit(uint32_t row_idx,
bool is_null,
string* nulls) {
35 DCHECK_LE(row_idx / 8, nulls->size());
36 int16_t mod_8 = row_idx % 8;
37 if (mod_8 == 0) (*nulls) +=
'\0';
38 (*nulls)[row_idx / 8] |= (1 << mod_8) * is_null;
41 inline bool GetNullBit(
const string& nulls, uint32_t row_idx) {
42 DCHECK_LE(row_idx / 8, nulls.size());
43 return nulls[row_idx / 8] & (1 << row_idx % 8);
47 uint32_t start_idx,
const string& from,
string* to) {
48 to->reserve((num_rows_before + num_rows_added + 7) / 8);
56 for (
int i = 0; i < num_rows_added; ++i) {
63 const TColumnType& type, uint32_t row_idx, thrift::TColumn* column) {
66 switch (type.types[0].scalar_type.type) {
67 case TPrimitiveType::NULL_TYPE:
68 case TPrimitiveType::BOOLEAN:
69 is_null = !col_val.__isset.bool_val;
70 column->boolVal.values.push_back(col_val.bool_val);
71 nulls = &column->boolVal.nulls;
73 case TPrimitiveType::TINYINT:
74 is_null = !col_val.__isset.byte_val;
75 column->byteVal.values.push_back(col_val.byte_val);
76 nulls = &column->byteVal.nulls;
78 case TPrimitiveType::SMALLINT:
79 is_null = !col_val.__isset.short_val;
80 column->i16Val.values.push_back(col_val.short_val);
81 nulls = &column->i16Val.nulls;
83 case TPrimitiveType::INT:
84 is_null = !col_val.__isset.int_val;
85 column->i32Val.values.push_back(col_val.int_val);
86 nulls = &column->i32Val.nulls;
88 case TPrimitiveType::BIGINT:
89 is_null = !col_val.__isset.long_val;
90 column->i64Val.values.push_back(col_val.long_val);
91 nulls = &column->i64Val.nulls;
93 case TPrimitiveType::FLOAT:
94 case TPrimitiveType::DOUBLE:
95 is_null = !col_val.__isset.double_val;
96 column->doubleVal.values.push_back(col_val.double_val);
97 nulls = &column->doubleVal.nulls;
99 case TPrimitiveType::TIMESTAMP:
100 case TPrimitiveType::STRING:
101 case TPrimitiveType::CHAR:
102 case TPrimitiveType::VARCHAR:
103 case TPrimitiveType::DECIMAL:
104 is_null = !col_val.__isset.string_val;
105 column->stringVal.values.push_back(col_val.string_val);
106 nulls = &column->stringVal.nulls;
109 DCHECK(
false) <<
"Unhandled type: "
119 uint32_t row_idx, thrift::TColumn* column) {
121 switch (type.types[0].scalar_type.type) {
122 case TPrimitiveType::NULL_TYPE:
123 case TPrimitiveType::BOOLEAN:
124 column->boolVal.values.push_back(
125 value == NULL ?
false : *reinterpret_cast<const bool*>(value));
126 nulls = &column->boolVal.nulls;
128 case TPrimitiveType::TINYINT:
129 column->byteVal.values.push_back(
130 value == NULL ? 0 : *reinterpret_cast<const int8_t*>(value));
131 nulls = &column->byteVal.nulls;
133 case TPrimitiveType::SMALLINT:
134 column->i16Val.values.push_back(
135 value == NULL ? 0 : *reinterpret_cast<const int16_t*>(value));
136 nulls = &column->i16Val.nulls;
138 case TPrimitiveType::INT:
139 column->i32Val.values.push_back(
140 value == NULL ? 0 : *reinterpret_cast<const int32_t*>(value));
141 nulls = &column->i32Val.nulls;
143 case TPrimitiveType::BIGINT:
144 column->i64Val.values.push_back(
145 value == NULL ? 0 : *reinterpret_cast<const int64_t*>(value));
146 nulls = &column->i64Val.nulls;
148 case TPrimitiveType::FLOAT:
149 column->doubleVal.values.push_back(
150 value == NULL ? 0.f : *reinterpret_cast<const float*>(value));
151 nulls = &column->doubleVal.nulls;
153 case TPrimitiveType::DOUBLE:
154 column->doubleVal.values.push_back(
155 value == NULL ? 0.0 : *reinterpret_cast<const double*>(value));
156 nulls = &column->doubleVal.nulls;
158 case TPrimitiveType::TIMESTAMP:
159 column->stringVal.values.push_back(
"");
162 &(column->stringVal.values.back()));
164 nulls = &column->stringVal.nulls;
166 case TPrimitiveType::STRING:
167 case TPrimitiveType::VARCHAR:
168 column->stringVal.values.push_back(
"");
171 column->stringVal.values.back().assign(
172 static_cast<char*>(str_val->
ptr), str_val->
len);
174 nulls = &column->stringVal.nulls;
176 case TPrimitiveType::CHAR:
177 column->stringVal.values.push_back(
"");
179 ColumnType char_type = ColumnType::CreateCharType(type.types[0].scalar_type.len);
180 column->stringVal.values.back().assign(
181 StringValue::CharSlotToPtr(value, char_type), char_type.
len);
183 nulls = &column->stringVal.nulls;
185 case TPrimitiveType::DECIMAL: {
187 column->stringVal.values.push_back(
"");
190 switch (decimalType.GetByteSize()) {
192 column->stringVal.values.back() =
193 reinterpret_cast<const Decimal4Value*
>(value)->ToString(type);
196 column->stringVal.values.back() =
197 reinterpret_cast<const Decimal8Value*
>(value)->ToString(type);
200 column->stringVal.values.back() =
204 DCHECK(
false) <<
"bad type: " << type;
207 nulls = &column->stringVal.nulls;
211 DCHECK(
false) <<
"Unhandled type: "
221 const TColumnType& type, thrift::TColumnValue* hs2_col_val) {
223 DCHECK_EQ(1, type.types.size());
224 DCHECK_EQ(TTypeNodeType::SCALAR, type.types[0].type);
225 DCHECK_EQ(
true, type.types[0].__isset.scalar_type);
226 switch (type.types[0].scalar_type.type) {
227 case TPrimitiveType::BOOLEAN:
228 hs2_col_val->__isset.boolVal =
true;
229 hs2_col_val->boolVal.value = col_val.bool_val;
230 hs2_col_val->boolVal.__isset.value = col_val.__isset.bool_val;
232 case TPrimitiveType::TINYINT:
233 hs2_col_val->__isset.byteVal =
true;
234 hs2_col_val->byteVal.value = col_val.byte_val;
235 hs2_col_val->byteVal.__isset.value = col_val.__isset.byte_val;
237 case TPrimitiveType::SMALLINT:
238 hs2_col_val->__isset.i16Val =
true;
239 hs2_col_val->i16Val.value = col_val.short_val;
240 hs2_col_val->i16Val.__isset.value = col_val.__isset.short_val;
242 case TPrimitiveType::INT:
243 hs2_col_val->__isset.i32Val =
true;
244 hs2_col_val->i32Val.value = col_val.int_val;
245 hs2_col_val->i32Val.__isset.value = col_val.__isset.int_val;
247 case TPrimitiveType::BIGINT:
248 hs2_col_val->__isset.i64Val =
true;
249 hs2_col_val->i64Val.value = col_val.long_val;
250 hs2_col_val->i64Val.__isset.value = col_val.__isset.long_val;
252 case TPrimitiveType::FLOAT:
253 case TPrimitiveType::DOUBLE:
254 hs2_col_val->__isset.doubleVal =
true;
255 hs2_col_val->doubleVal.value = col_val.double_val;
256 hs2_col_val->doubleVal.__isset.value = col_val.__isset.double_val;
258 case TPrimitiveType::DECIMAL:
259 case TPrimitiveType::STRING:
260 case TPrimitiveType::TIMESTAMP:
261 case TPrimitiveType::VARCHAR:
262 case TPrimitiveType::CHAR:
265 hs2_col_val->__isset.stringVal =
true;
266 hs2_col_val->stringVal.__isset.value = col_val.__isset.string_val;
267 if (col_val.__isset.string_val) {
268 hs2_col_val->stringVal.value = col_val.string_val;
272 DCHECK(
false) <<
"bad type: "
280 thrift::TColumnValue* hs2_col_val) {
281 bool not_null = (value != NULL);
283 DCHECK_EQ(1, type.types.size());
284 DCHECK_EQ(TTypeNodeType::SCALAR, type.types[0].type);
285 DCHECK_EQ(1, type.types[0].__isset.scalar_type);
286 switch (type.types[0].scalar_type.type) {
287 case TPrimitiveType::NULL_TYPE:
289 hs2_col_val->__isset.boolVal =
true;
290 hs2_col_val->boolVal.__isset.value =
false;
292 case TPrimitiveType::BOOLEAN:
293 hs2_col_val->__isset.boolVal =
true;
294 if (not_null) hs2_col_val->boolVal.value = *
reinterpret_cast<const bool*
>(value);
295 hs2_col_val->boolVal.__isset.value = not_null;
297 case TPrimitiveType::TINYINT:
298 hs2_col_val->__isset.byteVal =
true;
299 if (not_null) hs2_col_val->byteVal.value = *
reinterpret_cast<const int8_t*
>(value);
300 hs2_col_val->byteVal.__isset.value = not_null;
302 case TPrimitiveType::SMALLINT:
303 hs2_col_val->__isset.i16Val =
true;
304 if (not_null) hs2_col_val->i16Val.value = *
reinterpret_cast<const int16_t*
>(value);
305 hs2_col_val->i16Val.__isset.value = not_null;
307 case TPrimitiveType::INT:
308 hs2_col_val->__isset.i32Val =
true;
309 if (not_null) hs2_col_val->i32Val.value = *
reinterpret_cast<const int32_t*
>(value);
310 hs2_col_val->i32Val.__isset.value = not_null;
312 case TPrimitiveType::BIGINT:
313 hs2_col_val->__isset.i64Val =
true;
314 if (not_null) hs2_col_val->i64Val.value = *
reinterpret_cast<const int64_t*
>(value);
315 hs2_col_val->i64Val.__isset.value = not_null;
317 case TPrimitiveType::FLOAT:
318 hs2_col_val->__isset.doubleVal =
true;
319 if (not_null) hs2_col_val->doubleVal.value = *
reinterpret_cast<const float*
>(value);
320 hs2_col_val->doubleVal.__isset.value = not_null;
322 case TPrimitiveType::DOUBLE:
323 hs2_col_val->__isset.doubleVal =
true;
325 hs2_col_val->doubleVal.value = *
reinterpret_cast<const double*
>(value);
327 hs2_col_val->doubleVal.__isset.value = not_null;
329 case TPrimitiveType::STRING:
330 case TPrimitiveType::VARCHAR:
331 hs2_col_val->__isset.stringVal =
true;
332 hs2_col_val->stringVal.__isset.value = not_null;
335 hs2_col_val->stringVal.value.assign(static_cast<char*>(string_val->
ptr),
339 case TPrimitiveType::CHAR:
340 hs2_col_val->__isset.stringVal =
true;
341 hs2_col_val->stringVal.__isset.value = not_null;
343 ColumnType char_type = ColumnType::CreateCharType(type.types[0].scalar_type.len);
344 hs2_col_val->stringVal.value.assign(
345 StringValue::CharSlotToPtr(value, char_type), char_type.
len);
348 case TPrimitiveType::TIMESTAMP:
350 hs2_col_val->__isset.stringVal =
true;
351 hs2_col_val->stringVal.__isset.value = not_null;
353 RawValue::PrintValue(value,
TYPE_TIMESTAMP, -1, &(hs2_col_val->stringVal.value));
356 case TPrimitiveType::DECIMAL: {
358 hs2_col_val->__isset.stringVal =
true;
359 hs2_col_val->stringVal.__isset.value = not_null;
362 switch (decimalType.GetByteSize()) {
364 hs2_col_val->stringVal.value =
365 reinterpret_cast<const Decimal4Value*
>(value)->ToString(type);
368 hs2_col_val->stringVal.
value =
369 reinterpret_cast<const Decimal8Value*
>(value)->ToString(type);
372 hs2_col_val->stringVal.
value =
376 DCHECK(
false) <<
"bad type: " << type;
382 DCHECK(
false) <<
"bad type: "
390 if (val.__isset.value) {
398 const apache::hive::service::cli::thrift::TColumnValue& colval, stringstream* out) {
399 if (colval.__isset.boolVal) {
400 if (colval.boolVal.__isset.value) {
401 (*out) << ((colval.boolVal.value) ?
"true" :
"false");
405 }
else if (colval.__isset.doubleVal) {
407 }
else if (colval.__isset.byteVal) {
409 }
else if (colval.__isset.i32Val) {
411 }
else if (colval.__isset.i16Val) {
413 }
else if (colval.__isset.i64Val) {
415 }
else if (colval.__isset.stringVal) {
void TColumnValueToHS2TColumnValue(const TColumnValue &col_val, const TColumnType &type, apache::hive::service::cli::thrift::TColumnValue *hs2_col_val)
For V1->V5.
void StitchNulls(uint32_t num_rows_before, uint32_t num_rows_added, uint32_t start_idx, const std::string &from, std::string *to)
PrimitiveType ThriftToType(TPrimitiveType::type ttype)
void PrintVal(const T &val, ostream *ss)
void PrintTColumnValue(const apache::hive::service::cli::thrift::TColumnValue &colval, std::stringstream *out)
void SetNullBit(uint32_t row_idx, bool is_null, string *nulls)
string TypeToString(PrimitiveType t)
void TColumnValueToHS2TColumn(const TColumnValue &col_val, const TColumnType &type, uint32_t row_idx, apache::hive::service::cli::thrift::TColumn *column)
For V6->
int len
Only set if type == TYPE_CHAR or type == TYPE_VARCHAR.
void ExprValueToHS2TColumn(const void *value, const TColumnType &type, uint32_t row_idx, apache::hive::service::cli::thrift::TColumn *column)
For V6->
bool GetNullBit(const string &nulls, uint32_t row_idx)
void ExprValueToHS2TColumnValue(const void *value, const TColumnType &type, apache::hive::service::cli::thrift::TColumnValue *hs2_col_val)
For V1->V5.