| 100 | } |
| 101 | |
| 102 | void FileMetadataUtils::AddFileLevelVirtualColumns(MemPool* mem_pool, |
| 103 | Tuple* template_tuple) { |
| 104 | if (template_tuple == nullptr) return; |
| 105 | for (int i = 0; i < scan_node_->virtual_column_slots().size(); ++i) { |
| 106 | const SlotDescriptor* slot_desc = scan_node_->virtual_column_slots()[i]; |
| 107 | if (slot_desc->virtual_column_type() == TVirtualColumnType::INPUT_FILE_NAME) { |
| 108 | StringValue* slot = template_tuple->GetStringSlot(slot_desc->tuple_offset()); |
| 109 | const char* filename = file_desc_->filename.c_str(); |
| 110 | int len = strlen(filename); |
| 111 | char* filename_copy = reinterpret_cast<char*>(mem_pool->Allocate(len)); |
| 112 | Ubsan::MemCpy(filename_copy, filename, len); |
| 113 | slot->Assign(filename_copy, len); |
| 114 | template_tuple->SetNotNull(slot_desc->null_indicator_offset()); |
| 115 | } else if (slot_desc->virtual_column_type() == |
| 116 | TVirtualColumnType::ICEBERG_DATA_SEQUENCE_NUMBER) { |
| 117 | using namespace org::apache::impala::fb; |
| 118 | const FbIcebergSplitMetadata* ice_metadata = |
| 119 | file_desc_->file_metadata->iceberg_metadata(); |
| 120 | DCHECK(ice_metadata != nullptr); |
| 121 | |
| 122 | int64_t data_seq_num = ice_metadata->data_sequence_number(); |
| 123 | if (data_seq_num > -1) { |
| 124 | int64_t* slot = template_tuple->GetBigIntSlot(slot_desc->tuple_offset()); |
| 125 | *slot = data_seq_num; |
| 126 | template_tuple->SetNotNull(slot_desc->null_indicator_offset()); |
| 127 | } else { |
| 128 | template_tuple->SetNull(slot_desc->null_indicator_offset()); |
| 129 | } |
| 130 | } else if (slot_desc->virtual_column_type() == |
| 131 | TVirtualColumnType::ICEBERG_FIRST_ROW_ID) { |
| 132 | using namespace org::apache::impala::fb; |
| 133 | const FbIcebergSplitMetadata* ice_metadata = |
| 134 | file_desc_->file_metadata->iceberg_metadata(); |
| 135 | DCHECK(ice_metadata != nullptr); |
| 136 | |
| 137 | int64_t first_row_id = ice_metadata->first_row_id(); |
| 138 | if (first_row_id > -1) { |
| 139 | int64_t* slot = template_tuple->GetBigIntSlot(slot_desc->tuple_offset()); |
| 140 | *slot = first_row_id; |
| 141 | template_tuple->SetNotNull(slot_desc->null_indicator_offset()); |
| 142 | } else { |
| 143 | template_tuple->SetNull(slot_desc->null_indicator_offset()); |
| 144 | } |
| 145 | } |
| 146 | } |
| 147 | } |
| 148 | |
| 149 | auto FileMetadataUtils::IcebergPartitionTransforms() const { |
| 150 | DCHECK(file_desc_ != nullptr); |
nothing calls this directly
no test coverage detected