If they are defined, they can override table-level settings.
if (drop_range.min_block <= part->info.max_block)
            {
                
                throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected merged part {} intersecting drop range {}",
                                part->name, drop_range.getPartName());
            }
            continue;
        }
        
        if (part->info.min_block > drop_range.max_block)
            break;
        if (part->info.min_block <= drop_range.max_block && drop_range.max_block < part->info.max_block)
        {
            
            throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected merged part {} intersecting drop range {}",
                            part->name, drop_range.getPartName());
        }
        parts_to_remove.emplace_back(part);
    }
    bool clear_without_timeout = true;
    
    
    auto inactive_parts_to_remove_immediately = getDataPartsVectorInPartitionForInternalUsage(DataPartState::Outdated, drop_range.partition_id, &lock);
    for (auto & part : inactive_parts_to_remove_immediately)
        part->remove_time.store(0, std::memory_order_relaxed);
    
    removePartsFromWorkingSet(txn, parts_to_remove, clear_without_timeout, lock);
    return parts_to_remove;
}
void MergeTreeData::restoreAndActivatePart(const DataPartPtr & part, DataPartsLock * acquired_lock)