From c3dbfe3a57f216aaf5710aa56087b5893e55fa70 Mon Sep 17 00:00:00 2001 From: Zhichun Wu Date: Wed, 11 May 2022 01:13:41 +0800 Subject: [PATCH 1/3] Remove extra flush when closing piped output stream --- .../clickhouse/client/stream/BlockingPipedOutputStream.java | 5 ++++- .../client/stream/NonBlockingPipedOutputStream.java | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/clickhouse-client/src/main/java/com/clickhouse/client/stream/BlockingPipedOutputStream.java b/clickhouse-client/src/main/java/com/clickhouse/client/stream/BlockingPipedOutputStream.java index 6032d5b10..dd4bb981c 100644 --- a/clickhouse-client/src/main/java/com/clickhouse/client/stream/BlockingPipedOutputStream.java +++ b/clickhouse-client/src/main/java/com/clickhouse/client/stream/BlockingPipedOutputStream.java @@ -102,7 +102,10 @@ public void close() throws IOException { Thread.currentThread().interrupt(); throw new IOException("Thread was interrupted when putting EMPTY buffer into queue", e); } finally { - super.close(); + closed = true; + if (postCloseAction != null) { + postCloseAction.run(); + } } } diff --git a/clickhouse-client/src/main/java/com/clickhouse/client/stream/NonBlockingPipedOutputStream.java b/clickhouse-client/src/main/java/com/clickhouse/client/stream/NonBlockingPipedOutputStream.java index ff3175923..8c4428fb4 100644 --- a/clickhouse-client/src/main/java/com/clickhouse/client/stream/NonBlockingPipedOutputStream.java +++ b/clickhouse-client/src/main/java/com/clickhouse/client/stream/NonBlockingPipedOutputStream.java @@ -116,7 +116,11 @@ public void close() throws IOException { for (int i = 0, len = buckets.length; i < len; i++) { buckets[i] = null; } - super.close(); + + closed = true; + if (postCloseAction != null) { + postCloseAction.run(); + } } } From b0789f5b2796ebf6f3338739e4c098e65962fef4 Mon Sep 17 00:00:00 2001 From: Zhichun Wu Date: Wed, 11 May 2022 01:14:42 +0800 Subject: [PATCH 2/3] Fix #909 --- .../client/ClickHouseDataStreamFactory.java | 5 +-- .../clickhouse/client/ClickHouseRequest.java | 45 ++++++++++++++++++- .../client/ClickHouseRequestTest.java | 32 ++++++++++++- 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseDataStreamFactory.java b/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseDataStreamFactory.java index db09ed0cb..6f57c8f5e 100644 --- a/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseDataStreamFactory.java +++ b/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseDataStreamFactory.java @@ -51,7 +51,7 @@ public ClickHouseDataProcessor getProcessor(ClickHouseConfig config, ClickHouseI ClickHouseOutputStream output, Map settings, List columns) throws IOException { ClickHouseFormat format = ClickHouseChecker.nonNull(config, "config").getFormat(); - ClickHouseDataProcessor processor; + ClickHouseDataProcessor processor = null; if (ClickHouseFormat.RowBinary == format || ClickHouseFormat.RowBinaryWithNamesAndTypes == format) { processor = new ClickHouseRowBinaryProcessor(config, input, output, columns, settings); } else if (ClickHouseFormat.TSVWithNames == format || ClickHouseFormat.TSVWithNamesAndTypes == format @@ -61,10 +61,7 @@ public ClickHouseDataProcessor getProcessor(ClickHouseConfig config, ClickHouseI } else if (format != null && format.isText()) { processor = new ClickHouseTabSeparatedProcessor(config, input, output, ClickHouseDataProcessor.DEFAULT_COLUMNS, settings); - } else { - throw new IllegalArgumentException(ERROR_UNSUPPORTED_FORMAT + format); } - return processor; } diff --git a/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseRequest.java b/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseRequest.java index 6ba29be93..b00c7d618 100644 --- a/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseRequest.java +++ b/clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseRequest.java @@ -48,7 +48,50 @@ protected Mutation(ClickHouseRequest request, boolean sealed) { @Override protected String getQuery() { if (input != null && sql != null) { - return new StringBuilder().append(sql).append(" FORMAT ").append(getInputFormat().name()).toString(); + int tmp = 0; + int len = sql.length(); + int index = len; + while ((tmp = ClickHouseUtils.skipContentsUntil(sql, tmp, sql.length(), "format", false)) < len) { + index = tmp; + } + + StringBuilder builder = new StringBuilder(); + boolean spaces = false; + for (; index < len; index++) { + char ch = sql.charAt(index); + if (ClickHouseUtils.isQuote(ch) || ClickHouseUtils.isOpenBracket(ch)) { + break; + } else if (Character.isWhitespace(ch)) { + if (builder.length() > 0) { + spaces = true; + } + } else if (index + 1 < len) { + char nextCh = sql.charAt(index + 1); + if (ch == '-' && nextCh == '-') { + index = ClickHouseUtils.skipSingleLineComment(sql, index + 2, len) - 1; + } else if (ch == '/' && nextCh == '*') { + index = ClickHouseUtils.skipMultiLineComment(sql, index + 2, len) - 1; + } else if (ch == '\\') { + index++; + } else { + if (spaces) { + break; + } else { + builder.append(ch); + } + } + } else { + if (spaces) { + break; + } else { + builder.append(ch); + } + } + } + + return builder.length() > 0 && index == len ? sql + : new StringBuilder().append(sql).append("\n FORMAT ").append(getInputFormat().name()) + .toString(); } return super.getQuery(); diff --git a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseRequestTest.java b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseRequestTest.java index 304e448cb..45a45380e 100644 --- a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseRequestTest.java +++ b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseRequestTest.java @@ -360,11 +360,39 @@ public void testMutation() { Mutation request = ClickHouseClient.newInstance().connect(ClickHouseNode.builder().build()).write(); request.table("test_table").format(ClickHouseFormat.Arrow).data(new ByteArrayInputStream(new byte[0])); - String expectedSql = "INSERT INTO test_table FORMAT Arrow"; + String expectedSql = "INSERT INTO test_table\n FORMAT Arrow"; Assert.assertEquals(request.getQuery(), expectedSql); Assert.assertEquals(request.getStatements().get(0), expectedSql); - request = request.seal(); + ClickHouseRequest sealedRequest = request.seal(); + Assert.assertEquals(sealedRequest.getQuery(), expectedSql); + Assert.assertEquals(sealedRequest.getStatements().get(0), expectedSql); + + request.query(expectedSql = "select 1 format CSV"); + Assert.assertEquals(request.getQuery(), expectedSql); + Assert.assertEquals(request.getStatements().get(0), expectedSql); + + request.query(expectedSql = "select format tsv from table format CSV "); + Assert.assertEquals(request.getQuery(), expectedSql); + Assert.assertEquals(request.getStatements().get(0), expectedSql); + + request.query(expectedSql = "select 1 -- format CSV "); + expectedSql += "\n FORMAT Arrow"; + Assert.assertEquals(request.getQuery(), expectedSql); + Assert.assertEquals(request.getStatements().get(0), expectedSql); + + request.query(expectedSql = "select format CSV from table /* ccc */"); + expectedSql += "\n FORMAT Arrow"; + Assert.assertEquals(request.getQuery(), expectedSql); + Assert.assertEquals(request.getStatements().get(0), expectedSql); + + request.query(expectedSql = "select /* format CSV */"); + expectedSql += "\n FORMAT Arrow"; + Assert.assertEquals(request.getQuery(), expectedSql); + Assert.assertEquals(request.getStatements().get(0), expectedSql); + + request.query(expectedSql = "select 1 format CSV a"); + expectedSql += "\n FORMAT Arrow"; Assert.assertEquals(request.getQuery(), expectedSql); Assert.assertEquals(request.getStatements().get(0), expectedSql); } From fde782b1b35e008af1be3182c580adc30815b2bc Mon Sep 17 00:00:00 2001 From: Zhichun Wu Date: Wed, 11 May 2022 01:17:14 +0800 Subject: [PATCH 3/3] Bump version --- README.md | 4 ++-- clickhouse-client/README.md | 2 +- clickhouse-jdbc/README.md | 2 +- examples/grpc/pom.xml | 2 +- examples/jdbc/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6c94082a1..9f48f47d8 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Note: in general, the new driver(v0.3.2) is a few times faster with less memory com.clickhouse clickhouse-http-client - 0.3.2-patch8 + 0.3.2-patch9 ``` @@ -151,7 +151,7 @@ try (ClickHouseClient client = ClickHouseClient.newInstance(preferredProtocol); com.clickhouse clickhouse-jdbc - 0.3.2-patch8 + 0.3.2-patch9 http diff --git a/clickhouse-client/README.md b/clickhouse-client/README.md index 4cdcf87a4..47baaef82 100644 --- a/clickhouse-client/README.md +++ b/clickhouse-client/README.md @@ -9,7 +9,7 @@ Async Java client for ClickHouse. `clickhouse-client` is an abstract module, so com.clickhouse clickhouse-http-client - 0.3.2-patch8 + 0.3.2-patch9 ``` diff --git a/clickhouse-jdbc/README.md b/clickhouse-jdbc/README.md index a9d6efc71..ab96c08f7 100644 --- a/clickhouse-jdbc/README.md +++ b/clickhouse-jdbc/README.md @@ -11,7 +11,7 @@ Keep in mind that `clickhouse-jdbc` is synchronous, and in general it has more o com.clickhouse clickhouse-jdbc - 0.3.2-patch8 + 0.3.2-patch9 ``` diff --git a/examples/grpc/pom.xml b/examples/grpc/pom.xml index ed5d73a01..7dcae357f 100644 --- a/examples/grpc/pom.xml +++ b/examples/grpc/pom.xml @@ -56,7 +56,7 @@ UTF-8 UTF-8 - 0.3.2-patch8 + 0.3.2-patch9 3.8.1 diff --git a/examples/jdbc/pom.xml b/examples/jdbc/pom.xml index 6c0a94b1e..b7fe4ad9e 100644 --- a/examples/jdbc/pom.xml +++ b/examples/jdbc/pom.xml @@ -56,7 +56,7 @@ UTF-8 UTF-8 - 0.3.2-patch8 + 0.3.2-patch9 3.8.1