Tile *Tile::CopyTile(BackendType backend_type) { auto schema = GetSchema(); bool tile_columns_inlined = schema->IsInlined(); auto allocated_tuple_count = GetAllocatedTupleCount(); // Create a shallow copy of the old tile TileGroupHeader *new_header = GetHeader(); Tile *new_tile = TileFactory::GetTile( backend_type, INVALID_OID, INVALID_OID, INVALID_OID, INVALID_OID, new_header, *schema, tile_group, allocated_tuple_count); PL_MEMCPY(static_cast<void *>(new_tile->data), static_cast<void *>(data), tile_size); // Do a deep copy if some column is uninlined, so that // the values in that column point to the new pool if (!tile_columns_inlined) { auto uninlined_col_cnt = schema->GetUninlinedColumnCount(); // Go over each uninlined column, making a deep copy for (oid_t col_itr = 0; col_itr < uninlined_col_cnt; col_itr++) { auto uninlined_col_offset = schema->GetUninlinedColumn(col_itr); // Copy the column over to the new tile group for (oid_t tuple_itr = 0; tuple_itr < allocated_tuple_count; tuple_itr++) { type::Value val = (new_tile->GetValue(tuple_itr, uninlined_col_offset)); new_tile->SetValue(val, tuple_itr, uninlined_col_offset); } } } return new_tile; }
// Compare two schemas bool Schema::operator==(const Schema &other) const { if (other.GetColumnCount() != GetColumnCount() || other.GetUninlinedColumnCount() != GetUninlinedColumnCount() || other.IsInlined() != IsInlined()) { return false; } for (oid_t column_itr = 0; column_itr < other.GetColumnCount(); column_itr++) { const Column &column_info = other.GetColumn(column_itr); const Column &other_column_info = GetColumn(column_itr); if (column_info != other_column_info) { return false; } } return true; }