If they are defined, they can override table-level settings.
{
    quorum_info.status_path = storage.zookeeper_path + "/quorum/status";
    Strings replicas = zookeeper->getChildren(fs::path(storage.zookeeper_path) / "replicas");
    std::vector<std::future<Coordination::ExistsResponse>> replicas_status_futures;
    replicas_status_futures.reserve(replicas.size());
    for (const auto & replica : replicas)
        if (replica != storage.replica_name)
            replicas_status_futures.emplace_back(zookeeper->asyncExists(fs::path(storage.zookeeper_path) / "replicas" / replica / "is_active"));
    std::future<Coordination::GetResponse> is_active_future = zookeeper->asyncTryGet(storage.replica_path + "/is_active");
    std::future<Coordination::GetResponse> host_future = zookeeper->asyncTryGet(storage.replica_path + "/host");
    size_t active_replicas = 1;     
    for (auto & status : replicas_status_futures)
        if (status.get().error == Coordination::Error::ZOK)
            ++active_replicas;
    if (active_replicas < quorum)
        throw Exception(ErrorCodes::TOO_FEW_LIVE_REPLICAS, "Number of alive replicas ({}) is less than requested quorum ({}).",
                        active_replicas, quorum);
    /** Is there a quorum for the last part for which a quorum is needed?
        * Write of all the parts with the included quorum is linearly ordered.
        * This means that at any time there can be only one part,
        *  for which you need, but not yet reach the quorum.
        * Information about this part will be located in `/quorum/status` node.
        * If the quorum is reached, then the node is deleted.
        */
    String quorum_status;
    if (!quorum_parallel && zookeeper->tryGet(quorum_info.status_path, quorum_status))
        throw Exception("Quorum for previous write has not been satisfied yet. Status: " + quorum_status,
                        ErrorCodes::UNSATISFIED_QUORUM_FOR_PREVIOUS_WRITE);
    
    auto is_active = is_active_future.get();