If they are defined, they can override table-level settings.
auto lock = lockParts();
        return secondary_index_sizes;
    }
    
    String getPartitionIDFromQuery(const ASTPtr & ast, ContextPtr context) const;
    std::unordered_set<String> getPartitionIDsFromQuery(const ASTs & asts, ContextPtr context) const;
    std::set<String> getPartitionIdsAffectedByCommands(const MutationCommands & commands, ContextPtr query_context) const;
    
    
    
    MergeTreeData & checkStructureAndGetMergeTreeData(const StoragePtr & source_table, const StorageMetadataPtr & src_snapshot, const StorageMetadataPtr & my_snapshot) const;
    MergeTreeData & checkStructureAndGetMergeTreeData(IStorage & source_table, const StorageMetadataPtr & src_snapshot, const StorageMetadataPtr & my_snapshot) const;
    struct HardlinkedFiles
    {
        
        std::string source_table_shared_id;
        
        std::string source_part_name;
        
        NameSet hardlinks_from_source_part;
    };
    MergeTreeData::MutableDataPartPtr cloneAndLoadDataPartOnSameDisk(
        const MergeTreeData::DataPartPtr & src_part, const String & tmp_part_prefix,
        const MergeTreePartInfo & dst_part_info, const StorageMetadataPtr & metadata_snapshot,
        const MergeTreeTransactionPtr & txn, HardlinkedFiles * hardlinked_files,
        bool copy_instead_of_hardlink);
    virtual std::vector<MergeTreeMutationStatus> getMutationsStatus() const = 0;
    
    
    virtual bool canUseAdaptiveGranularity() const