If they are defined, they can override table-level settings.
CurrentlyMovingPartsTaggerPtr checkPartsForMove(const DataPartsVector & parts, SpacePtr space);
    bool canUsePolymorphicParts(const MergeTreeSettings & settings, String * out_reason = nullptr) const;
    std::mutex write_ahead_log_mutex;
    WriteAheadLogPtr write_ahead_log;
    virtual void startBackgroundMovesIfNeeded() = 0;
    bool allow_nullable_key{};
    void addPartContributionToDataVolume(const DataPartPtr & part);
    void removePartContributionToDataVolume(const DataPartPtr & part);
    void increaseDataVolume(ssize_t bytes, ssize_t rows, ssize_t parts);
    void setDataVolume(size_t bytes, size_t rows, size_t parts);
    std::atomic<size_t> total_active_size_bytes = 0;
    std::atomic<size_t> total_active_size_rows = 0;
    std::atomic<size_t> total_active_size_parts = 0;
    
    mutable std::set<String> query_id_set;
    mutable std::mutex query_id_set_mutex;
    
    MatcherFn getPartitionMatcher(const ASTPtr & partition, ContextPtr context) const;
    
    virtual std::unique_ptr<MergeTreeSettings> getDefaultSettings() const = 0;
    void loadDataPartsFromDisk(
        DataPartsVector & broken_parts_to_detach,
        DataPartsVector & duplicate_parts_to_remove,
        ThreadPool & pool,
        size_t num_parts,
        std::queue<std::vector<std::pair<String, DiskPtr>>> & parts_queue,
        bool skip_sanity_checks,
        const MergeTreeSettingsPtr & settings);
    void loadDataPartsFromWAL(
        DataPartsVector & broken_parts_to_detach,