**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.
case Protocol::Server::Exception:
            onReceiveExceptionFromServer(std::move(packet.exception)
            return false;
        case Protocol::Server::Log:
            onLogData(packet.block
            return true;
        case Protocol::Server::EndOfStream:
            onEndOfStream(
            return false;
        case Protocol::Server::ProfileEvents:
            onProfileEvents(packet.block
            return true;
        default:
            throw Exception(
                ErrorCodes::UNKNOWN_PACKET_FROM_SERVER, "Unknown packet {} from server {}", packet.type, connection->getDescription()
    }
}
void ClientBase::onProgress(const Progress & value)
{
    if (!progress_indication.updateProgress(value))
    {
        // Just a keep-alive update.
        return;
    }
    if (output_format)
        output_format->onProgress(value
    if (need_render_progress)
        progress_indication.writeProgress(
}
void ClientBase::onEndOfStream()