ClickHouseExecutor
Runs statements over the HTTP client and decodes JSONEachRow, one record per line.
The client answers with a future; the body is read on scheduler, a bounded pool that rejects work beyond its queue rather than letting slow analytical queries pile up. Each statement carries its own query id: when a subscriber cancels, the request is abandoned and KILL QUERY stops the statement on the server, since an abandoned HTTP read does not always reach it.