AST-based query fuzzer should randomly modify data types in CREATE TABLE queries, mostly by wrapping in Nullable, Array and LowCardinality.
{
    String zookeeper_name = zkutil::extractZooKeeperName(raw_zookeeper_path);
    String zookeeper_path = zkutil::extractZooKeeperPath(raw_zookeeper_path, true);
    if (!context->hasZooKeeper() && !context->hasAuxiliaryZooKeeper(zookeeper_name))
        throw Exception{ErrorCodes::CANNOT_EXTRACT_TABLE_STRUCTURE, "Cannot get replica structure without zookeeper, you must specify the structure manually"};
    zkutil::ZooKeeperPtr zookeeper;
    try
    {
        if (zookeeper_name == StorageReplicatedMergeTree::getDefaultZooKeeperName())
            zookeeper = context->getZooKeeper();
        else
            zookeeper = context->getAuxiliaryZooKeeper(zookeeper_name);
    }
    catch (...)
    {
        throw Exception{ErrorCodes::CANNOT_EXTRACT_TABLE_STRUCTURE, "Cannot get replica structure from zookeeper, because cannot get zookeeper: {}. You must specify structure manually", getCurrentExceptionMessage(false)};
    }
    if (!zookeeper->exists(zookeeper_path + "/replicas"))
        throw Exception{ErrorCodes::CANNOT_EXTRACT_TABLE_STRUCTURE, "Cannot get replica structure, because there no other replicas in zookeeper. You must specify the structure manually"};
    Coordination::Stat columns_stat;
    return ColumnsDescription::parse(zookeeper->get(fs::path(zookeeper_path) / "columns", &columns_stat));
}
static StoragePtr create(const StorageFactory::Arguments & args)
{
    /** [Replicated][|Summing|VersionedCollapsing|Collapsing|Aggregating|Replacing|Graphite]MergeTree (2 * 7 combinations) engines
        * The argument for the engine should be: