**Use case**

Test one ClickHouse SQL function with libFuzzer in a predefined SQL query.
Example:

```
clickhouse-local --query 'SELECT extractTextFromHTML(getFuzzerData())'
```

**Describe the solution you'd like**

If `clickhouse-local` is compiled with libFuzzer, the fuzzer will execute a query in infinite loop, where the `getFuzzerData` function will return different strings in every iteration, using coverage guided fuzzing.

**Additional context**

What's the reason to have this kind of fuzzing?

Although we can provide very high level entry point for libFuzzer, for example, to generate SQL queries as an input. But that fuzzing method is too broad. By using the method described in this task, we can make fuzzing more targeted and ensure fuzzing for specific functions.

Existing functional tests can be used to guide fuzzing (by replacing arbitrary expressions with `getFuzzerData()`).
if (index_mark_cache_size)
        global_context->setIndexMarkCache(index_mark_cache_size);
    
    size_t mmap_cache_size = config().getUInt64("mmap_cache_size", 1000);   
    if (mmap_cache_size)
        global_context->setMMappedFileCache(mmap_cache_size);
    
    global_context->setDefaultProfiles(config());
    
    DatabaseCatalog::instance().initializeAndLoadTemporaryDatabase();
    /** Init dummy default DB
      * NOTE: We force using isolated default database to avoid conflicts with default database from server environment
      * Otherwise, metadata of temporary File(format, EXPLICIT_PATH) tables will pollute metadata/ directory;
      *  if such tables will not be dropped, clickhouse-server will not be able to load them due to security reasons.
      */
    std::string default_database = config().getString("default_database", "_local");
    DatabaseCatalog::instance().attachDatabase(default_database, std::make_shared<DatabaseMemory>(default_database, global_context));
    global_context->setCurrentDatabase(default_database);
    applyCmdOptions(global_context);
    bool enable_objects_loader = false;
    if (config().has("path"))
    {
        String path = global_context->getPath();
        
        status.emplace(fs::path(path) / "status", StatusFile::write_full_info);
        fs::create_directories(fs::path(path) / "user_defined/");
        LOG_DEBUG(log, "Loading user defined objects from {}", path);
        Poco::File(path + "user_defined/").createDirectories();
        UserDefinedSQLObjectsLoader::instance().loadObjects(global_context);
        enable_objects_loader = true;