MCPcopy Create free account
hub / github.com/apache/impala / MaterializeNextRow

Method MaterializeNextRow

be/src/exec/data-source-scan-node.cc:342–452  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

340}
341
342Status DataSourceScanNode::MaterializeNextRow(const Timezone* local_tz,
343 MemPool* tuple_pool, Tuple* tuple) {
344 const vector<TColumnData>& cols = input_batch_->rows.cols;
345 tuple->Init(tuple_desc_->byte_size());
346
347 for (int i = 0; i < tuple_desc_->slots().size(); ++i) {
348 const SlotDescriptor* slot_desc = tuple_desc_->slots()[i];
349 void* slot = tuple->GetSlot(slot_desc->tuple_offset());
350 const TColumnData& col = cols[i];
351
352 if (col.is_null[next_row_idx_]) {
353 tuple->SetNull(slot_desc->null_indicator_offset());
354 continue;
355 }
356
357 // Get and increment the index into the values array (e.g. int_vals) for this col.
358 int val_idx = cols_next_val_idx_[i]++;
359 switch (slot_desc->type().type) {
360 case TYPE_STRING: {
361 if (val_idx >= col.string_vals.size()) {
362 return Status(Substitute(ERROR_INVALID_COL_DATA, "STRING"));
363 }
364 const string& val = col.string_vals[val_idx];
365 size_t val_size = val.size();
366 char* buffer = reinterpret_cast<char*>(
367 tuple_pool->TryAllocateUnaligned(val_size));
368 if (UNLIKELY(buffer == NULL)) {
369 string details = Substitute(ERROR_MEM_LIMIT_EXCEEDED, "MaterializeNextRow",
370 val_size, "string slot");
371 return tuple_pool->mem_tracker()->MemLimitExceeded(NULL, details, val_size);
372 }
373 memcpy(buffer, val.data(), val_size);
374 reinterpret_cast<StringValue*>(slot)->Assign(buffer, val_size);
375 break;
376 }
377 case TYPE_TINYINT:
378 if (val_idx >= col.byte_vals.size()) {
379 return Status(Substitute(ERROR_INVALID_COL_DATA, "TINYINT"));
380 }
381 *reinterpret_cast<int8_t*>(slot) = col.byte_vals[val_idx];
382 break;
383 case TYPE_SMALLINT:
384 if (val_idx >= col.short_vals.size()) {
385 return Status(Substitute(ERROR_INVALID_COL_DATA, "SMALLINT"));
386 }
387 *reinterpret_cast<int16_t*>(slot) = col.short_vals[val_idx];
388 break;
389 case TYPE_INT:
390 if (val_idx >= col.int_vals.size()) {
391 return Status(Substitute(ERROR_INVALID_COL_DATA, "INT"));
392 }
393 *reinterpret_cast<int32_t*>(slot) = col.int_vals[val_idx];
394 break;
395 case TYPE_BIGINT:
396 if (val_idx >= col.long_vals.size()) {
397 return Status(Substitute(ERROR_INVALID_COL_DATA, "BIGINT"));
398 }
399 *reinterpret_cast<int64_t*>(slot) = col.long_vals[val_idx];

Callers

nothing calls this directly

Calls 15

SubstituteFunction · 0.85
OKFunction · 0.85
tuple_offsetMethod · 0.80
SetNullMethod · 0.80
TryAllocateUnalignedMethod · 0.80
StatusClass · 0.70
SetDecimalValFunction · 0.70
DateValueClass · 0.50
InitMethod · 0.45
byte_sizeMethod · 0.45
sizeMethod · 0.45
GetSlotMethod · 0.45

Tested by

no test coverage detected