AST-based query fuzzer should randomly modify data types in CREATE TABLE queries, mostly by wrapping in Nullable, Array and LowCardinality.
{
            
            ast_zk_path = engine_args[arg_num]->as<ASTLiteral>();
            if (ast_zk_path && ast_zk_path->value.getType() == Field::Types::String)
                zookeeper_path = ast_zk_path->value.safeGet<String>();
            else
                throw Exception(
                    "Path in ZooKeeper must be a string literal" + getMergeTreeVerboseHelp(is_extended_storage_def),
                    ErrorCodes::BAD_ARGUMENTS);
            ++arg_num;
            ast_replica_name = engine_args[arg_num]->as<ASTLiteral>();
            if (ast_replica_name && ast_replica_name->value.getType() == Field::Types::String)
                replica_name = ast_replica_name->value.safeGet<String>();
            else
                throw Exception(
                    "Replica name must be a string literal" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::BAD_ARGUMENTS);
            if (replica_name.empty())
                throw Exception(
                    "No replica name in config" + getMergeTreeVerboseHelp(is_extended_storage_def), ErrorCodes::NO_REPLICA_NAME_GIVEN);
            ++arg_num;
        }
        else if (is_extended_storage_def
            && (arg_cnt == 0
                || !engine_args[arg_num]->as<ASTLiteral>()
                || (arg_cnt == 1 && merging_params.mode == MergeTreeData::MergingParams::Graphite)))
        {
            
            
            const auto & config = args.getContext()->getConfigRef();
            zookeeper_path = StorageReplicatedMergeTree::getDefaultZooKeeperPath(config);