If they are defined, they can override table-level settings.
{
    auto block = getHeader().cloneWithColumns(chunk.detachColumns());
    auto storage_snapshot = storage.getStorageSnapshot(metadata_snapshot, context);
    storage.writer.deduceTypesOfObjectColumns(storage_snapshot, block);
    auto part_blocks = storage.writer.splitBlockIntoParts(block, max_parts_per_block, metadata_snapshot, context);
    using DelayedPartitions = std::vector<MergeTreeSink::DelayedChunk::Partition>;
    DelayedPartitions partitions;
    const Settings & settings = context->getSettingsRef();
    size_t streams = 0;
    bool support_parallel_write = false;
    for (auto & current_block : part_blocks)
    {
        Stopwatch watch;
        String block_dedup_token;
        auto temp_part = storage.writer.writeTempPart(current_block, metadata_snapshot, context);
        UInt64 elapsed_ns = watch.elapsed();
        
        
        if (!temp_part.part)
            continue;
        if (!support_parallel_write && temp_part.part->volume->getDisk()->supportParallelWrite())
            support_parallel_write = true;
        if (storage.getDeduplicationLog())
        {
            const String & dedup_token = settings.insert_deduplication_token;
            if (!dedup_token.empty())
            {
                
                
                block_dedup_token = fmt::format("{}_{}", dedup_token, chunk_dedup_seqnum);