| 340 | } |
| 341 | |
| 342 | Status 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]; |
nothing calls this directly
no test coverage detected