**Use case**

ClickHouse already throws exception if the data for INSERT is empty:

```
Code: 108. DB::Exception: No data to insert
```

Let's introduce a setting, enabled by default, to control this behavior.
The user will be able to disable it to allow empty INSERTs.

This is useful in some batch scripts.
{
    public:
        virtual ~BaseResponder() = default;
        virtual void start(GRPCService & grpc_service,
                           grpc::ServerCompletionQueue & new_call_queue,
                           grpc::ServerCompletionQueue & notification_queue,
                           const CompletionCallback & callback) = 0;
        virtual void read(GRPCQueryInfo & query_info_, const CompletionCallback & callback) = 0;
        virtual void write(const GRPCResult & result, const CompletionCallback & callback) = 0;
        virtual void writeAndFinish(const GRPCResult & result, const grpc::Status & status, const CompletionCallback & callback) = 0;
        Poco::Net::SocketAddress getClientAddress() const
        {
            String peer = grpc_context.peer();
            return Poco::Net::SocketAddress{peer.substr(peer.find(':') + 1)};
        }
        std::optional<String> getClientHeader(const String & key) const
        {
            const auto & client_metadata = grpc_context.client_metadata();
            auto it = client_metadata.find(key);
            if (it != client_metadata.end())
                return String{it->second.data(), it->second.size()};
            return std::nullopt;
        }
        void setTransportCompression(const TransportCompression & transport_compression)
        {
            grpc_context.set_compression_algorithm(transport_compression.algorithm);
            grpc_context.set_compression_level(transport_compression.level);
        }
    protected:
        CompletionCallback * getCallbackPtr(const CompletionCallback & callback)