If they are defined, they can override table-level settings.
auto temp_part = storage.writer.writeTempPart(current_block, metadata_snapshot, context);
        
        
        if (!temp_part.part)
            continue;
        String block_id;
        if (deduplicate)
        {
            String block_dedup_token;
            
            
            const String & dedup_token = settings.insert_deduplication_token;
            if (!dedup_token.empty())
            {
                
                
                block_dedup_token = fmt::format("{}_{}", dedup_token, chunk_dedup_seqnum);
                ++chunk_dedup_seqnum;
            }
            block_id = temp_part.part->getZeroLevelPartBlockID(block_dedup_token);
            LOG_DEBUG(log, "Wrote block with ID '{}', {} rows", block_id, current_block.block.rows());
        }
        else
        {
            LOG_DEBUG(log, "Wrote block with {} rows", current_block.block.rows());
        }
        UInt64 elapsed_ns = watch.elapsed();
        size_t max_insert_delayed_streams_for_parallel_write = DEFAULT_DELAYED_STREAMS_FOR_PARALLEL_WRITE;
        if (!support_parallel_write || settings.max_insert_delayed_streams_for_parallel_write.changed)