May be useful to interface with some external program, e.g. I want to use `clickhouse-format` to beautify the queries for performance test reports.

For now, DDL dictionaries don't work for `clickhouse-local` at all (https://github.com/ClickHouse/ClickHouse/issues/22354)

We should do it through DDL, because the xml config route looks hopeless. `clickhouse-local` can't even load server's `config.xml` properly.
std::shared_ptr<ProcessPool> process_pool;
        std::unique_ptr<ShellCommand> command;
        BlockInputStreamPtr stream;
        size_t rows_to_read;
        Poco::Logger * log;
        std::function<void(WriteBufferFromFile &)> send_data;
        ThreadFromGlobalPool thread;
        size_t current_read_rows = 0;
        std::mutex exception_during_read_lock;
        std::exception_ptr exception_during_read;
    };
}
BlockInputStreamPtr ExecutablePoolDictionarySource::loadIds(const std::vector<UInt64> & ids)
{
    LOG_TRACE(log, "loadIds {} size = {}", toString(), ids.size());
    auto block = blockForIds(dict_struct, ids);
    return getStreamForBlock(block);
}
BlockInputStreamPtr ExecutablePoolDictionarySource::loadKeys(const Columns & key_columns, const std::vector<size_t> & requested_rows)
{
    LOG_TRACE(log, "loadKeys {} size = {}", toString(), requested_rows.size());
    auto block = blockForKeys(dict_struct, key_columns, requested_rows);
    return getStreamForBlock(block);
}
BlockInputStreamPtr ExecutablePoolDictionarySource::getStreamForBlock(const Block & block)