If they are defined, they can override table-level settings.
auto host = host_future.get();
    if (is_active.error == Coordination::Error::ZNONODE || host.error == Coordination::Error::ZNONODE)
        throw Exception("Replica is not active right now", ErrorCodes::READONLY);
    quorum_info.is_active_node_value = is_active.data;
    quorum_info.is_active_node_version = is_active.stat.version;
    quorum_info.host_node_version = host.stat.version;
}
void ReplicatedMergeTreeSink::consume(Chunk chunk)
{
    auto block = getHeader().cloneWithColumns(chunk.detachColumns());
    auto zookeeper = storage.getZooKeeper();
    assertSessionIsNotExpired(zookeeper);
    /** If write is with quorum, then we check that the required number of replicas is now live,
      *  and also that for all previous parts for which quorum is required, this quorum is reached.
      * And also check that during the insertion, the replica was not reinitialized or disabled (by the value of `is_active` node).
      * TODO Too complex logic, you can do better.
      */
    if (quorum)
        checkQuorumPrecondition(zookeeper);
    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<ReplicatedMergeTreeSink::DelayedChunk::Partition>;
    DelayedPartitions partitions;
    size_t streams = 0;
    bool support_parallel_write = false;
    const Settings & settings = context->getSettingsRef();
    for (auto & current_block : part_blocks)
    {
        Stopwatch watch;