static CompletableFuture<ClickHouseResponseSummary> send(ClickHouseNode server, String sql,
            Map<String, String> params) {
        if (server == null || sql == null || params == null) {
            throw new IllegalArgumentException("Non-null server, sql and parameters are required");
        }

        // in case the protocol is ANY
        final ClickHouseNode theServer = server.probe();

        return submit(() -> {
            // set async to false so that we don't have to create additional thread
            try (ClickHouseClient client = ClickHouseClient.builder()
                    .nodeSelector(ClickHouseNodeSelector.of(theServer.getProtocol()))
                    .option(ClickHouseClientOption.ASYNC, false).build();
                    ClickHouseResponse resp = client.read(theServer).format(ClickHouseFormat.RowBinary).query(sql)
                            .params(params).executeAndWait()) {
                return resp.getSummary();
            }
        });
    }
Sends SQL query along with stringified parameters to specified server.

@param server non-null server to connect to
@param sql    non-null SQL query
@param params non-null stringified parameters
@return list of {@link ClickHouseResponseSummary} one for each execution
@throws IllegalArgumentException if any of server, sql, and params is null
@throws CompletionException      when error occurred during execution
clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseClient.java