default ClickHouseResponse executeAndWait(ClickHouseRequest<?> request) throws ClickHouseException {
        final ClickHouseRequest<?> sealedRequest = request.seal();

        try {
            return execute(sealedRequest).get(sealedRequest.getConfig().getSocketTimeout(), TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw ClickHouseException.forCancellation(e, sealedRequest.getServer());
        } catch (CancellationException e) {
            throw ClickHouseException.forCancellation(e, sealedRequest.getServer());
        } catch (CompletionException | ExecutionException | TimeoutException | UncheckedIOException e) {
            Throwable cause = e.getCause();
            if (cause == null) {
                cause = e;
            }
            throw cause instanceof ClickHouseException ? (ClickHouseException) cause
                    : ClickHouseException.of(cause, sealedRequest.getServer());
        } catch (RuntimeException e) { // unexpected
            throw ClickHouseException.of(e, sealedRequest.getServer());
        }
    }
Synchronous version of {@link #execute(ClickHouseRequest)}.

@param request request object which will be sealed(immutable copy) upon
               execution
@return non-null response
@throws ClickHouseException when error occurred during execution
clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseClient.java