diff --git a/pom.xml b/pom.xml index 99d86ee8f..e85ec3844 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 2.9.10.8 29.0-jre 2.3.1 - 1.7 + 1.8 1.15.1 6.14.3 1.10.19 diff --git a/src/main/java/ru/yandex/clickhouse/domain/ClickHouseFormat.java b/src/main/java/ru/yandex/clickhouse/domain/ClickHouseFormat.java index 6a8f9371b..ef8614cb2 100644 --- a/src/main/java/ru/yandex/clickhouse/domain/ClickHouseFormat.java +++ b/src/main/java/ru/yandex/clickhouse/domain/ClickHouseFormat.java @@ -37,7 +37,10 @@ public enum ClickHouseFormat { Native, Null, XML, - CapnProto; + CapnProto, + Parquet, + ORC + ; public static boolean containsFormat(String statement) { if (statement == null || statement.isEmpty()) { diff --git a/src/test/java/ru/yandex/clickhouse/ClickHouseContainerForTest.java b/src/test/java/ru/yandex/clickhouse/ClickHouseContainerForTest.java index 05c2c1b2a..911d14843 100644 --- a/src/test/java/ru/yandex/clickhouse/ClickHouseContainerForTest.java +++ b/src/test/java/ru/yandex/clickhouse/ClickHouseContainerForTest.java @@ -1,10 +1,10 @@ package ru.yandex.clickhouse; import java.time.Duration; - import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.ImageFromDockerfile; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; @@ -23,6 +23,7 @@ public class ClickHouseContainerForTest { static { String imageTag = System.getProperty("clickhouseVersion"); + if (imageTag == null || (imageTag = imageTag.trim()).isEmpty()) { clickhouseVersion = imageTag = ""; } else { @@ -33,7 +34,15 @@ public class ClickHouseContainerForTest { } imageTag = ":" + imageTag; } - clickhouseContainer = new GenericContainer<>("yandex/clickhouse-server" + imageTag) + + final String imageNameWithTag = "yandex/clickhouse-server" + imageTag; + + clickhouseContainer = new GenericContainer<>( new ImageFromDockerfile() + .withDockerfileFromBuilder(builder -> + builder + .from( imageNameWithTag ) + .run("apt-get update && apt-get install tzdata") + )) .withExposedPorts(HTTP_PORT, NATIVE_PORT, MYSQL_PORT) .withClasspathResourceMapping( "ru/yandex/clickhouse/users.d", diff --git a/src/test/java/ru/yandex/clickhouse/integration/StreamSQLTest.java b/src/test/java/ru/yandex/clickhouse/integration/StreamSQLTest.java index 210e75f4e..c3798f35e 100644 --- a/src/test/java/ru/yandex/clickhouse/integration/StreamSQLTest.java +++ b/src/test/java/ru/yandex/clickhouse/integration/StreamSQLTest.java @@ -8,8 +8,10 @@ import ru.yandex.clickhouse.ClickHouseDataSource; import ru.yandex.clickhouse.domain.ClickHouseCompression; import ru.yandex.clickhouse.domain.ClickHouseFormat; -import ru.yandex.clickhouse.settings.ClickHouseProperties; +import ru.yandex.clickhouse.util.ClickHouseVersionNumberUtil; + import java.io.*; +import java.math.BigDecimal; import java.nio.charset.Charset; import java.sql.ResultSet; import java.sql.SQLException; @@ -216,4 +218,164 @@ public void CSVInsertCompressedIntoTable() throws SQLException, IOException { Assert.assertEquals(rs.getLong("uniq"), 1); } + @Test + public void ORCInsertCompressedIntoTable() throws SQLException { + // clickhouse-client -q "select number int, toString(number) str, 1/number flt, toDecimal64( 1/(number+1) , 9) dcml, + // toDateTime('2020-01-01 00:00:00') + number time from numbers(100) format ORC"|gzip > test_sample.orc.gz + + String version = connection.getServerVersion(); + if (version.compareTo("20.8") < 0) { + return; + } + + connection.createStatement().execute("DROP TABLE IF EXISTS test.orc_stream_compressed"); + connection.createStatement().execute( + "CREATE TABLE test.orc_stream_compressed (int Int64, str String, flt Float64, " + + "dcml Decimal64(9), time DateTime) ENGINE = Log();" + ); + + InputStream inputStream = StreamSQLTest.class.getResourceAsStream("/data_samples/test_sample.orc.gz"); + + connection.createStatement(). + write() + .table("test.orc_stream_compressed") + .format(ClickHouseFormat.ORC) + .dataCompression(ClickHouseCompression.gzip) + .data(inputStream) + .send(); + + ResultSet rs = connection.createStatement().executeQuery( + "SELECT count() AS cnt, " + + "sum(int) sum_int, " + + "round(sum(flt),2) AS sum_flt, " + + "uniqExact(str) uniq_str, " + + "max(dcml) max_dcml, " + + "min(time) min_time, " + + "max(time) max_time " + + "FROM test.orc_stream_compressed"); + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt("cnt"), 100); + Assert.assertEquals(rs.getLong("sum_int"), 4950); + Assert.assertEquals(rs.getFloat("sum_flt"), Float.POSITIVE_INFINITY); + Assert.assertEquals(rs.getLong("uniq_str"), 100); + Assert.assertEquals(rs.getBigDecimal("max_dcml"), new BigDecimal("1.000000000")); + Assert.assertEquals(rs.getString("min_time"), "2020-01-01 00:00:00"); + Assert.assertEquals(rs.getString("max_time"), "2020-01-01 00:01:39"); + } + + @Test + public void ORCInsertCompressedIntoTable1() throws SQLException { + // clickhouse-client -q "select number int, toString(number) str, 1/number flt, toDecimal64( 1/(number+1) , 9) dcml, + // toDateTime('2020-01-01 00:00:00') + number time from numbers(100) format ORC"|gzip > test_sample.orc.gz + + String version = connection.getServerVersion(); + if (version.compareTo("20.8") < 0) { + return; + } + + connection.createStatement().execute("DROP TABLE IF EXISTS test.orc1_stream_compressed"); + connection.createStatement().execute( + "CREATE TABLE test.orc1_stream_compressed (int Int64, str String, flt Float64, " + + "dcml Decimal64(9), time DateTime) ENGINE = Log();" + ); + + InputStream inputStream = StreamSQLTest.class.getResourceAsStream("/data_samples/test_sample.orc.gz"); + + connection.createStatement(). + write() + .sql("insert into test.orc1_stream_compressed format ORC") + .dataCompression(ClickHouseCompression.gzip) + .data(inputStream) + .send(); + + ResultSet rs = connection.createStatement().executeQuery( + "select * from test.orc1_stream_compressed where int=42"); + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt("int"), 42); + Assert.assertEquals(rs.getString("str"), "42"); + Assert.assertTrue( Math.abs(rs.getFloat("flt") - 0.023809524) < 0.0001); + Assert.assertTrue( Math.abs(rs.getFloat("dcml") - 0.023255813) < 0.0001); + Assert.assertEquals(rs.getString("time"), "2020-01-01 00:00:42"); + } + + @Test + public void ParquetInsertCompressedIntoTable() throws SQLException { + // clickhouse-client -q "select number int, toString(number) str, 1/number flt, toDecimal64( 1/(number+1) , 9) dcml, + // toDateTime('2020-01-01 00:00:00') + number time from numbers(100) format Parquet"|gzip > test_sample.parquet.gz + + String version = connection.getServerVersion(); + if (version.compareTo("20.8") < 0) { + return; + } + + connection.createStatement().execute("DROP TABLE IF EXISTS test.parquet_stream_compressed"); + connection.createStatement().execute( + "CREATE TABLE test.parquet_stream_compressed (int Int64, str String, flt Float64, " + + "dcml Decimal64(9), time DateTime) ENGINE = Log();" + ); + + InputStream inputStream = StreamSQLTest.class.getResourceAsStream("/data_samples/test_sample.parquet.gz"); + + connection.createStatement(). + write() + .table("test.parquet_stream_compressed") + .format(ClickHouseFormat.Parquet) + .dataCompression(ClickHouseCompression.gzip) + .data(inputStream) + .send(); + + ResultSet rs = connection.createStatement().executeQuery( + "SELECT count() AS cnt, " + + "sum(int) sum_int, " + + "round(sum(flt),2) AS sum_flt, " + + "uniqExact(str) uniq_str, " + + "max(dcml) max_dcml, " + + "min(time) min_time, " + + "max(time) max_time " + + "FROM test.parquet_stream_compressed"); + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt("cnt"), 100); + Assert.assertEquals(rs.getLong("sum_int"), 4950); + Assert.assertEquals(rs.getFloat("sum_flt"), Float.POSITIVE_INFINITY); + Assert.assertEquals(rs.getLong("uniq_str"), 100); + Assert.assertEquals(rs.getBigDecimal("max_dcml"), new BigDecimal("1.000000000")); + Assert.assertEquals(rs.getString("min_time"), "2020-01-01 00:00:00"); + Assert.assertEquals(rs.getString("max_time"), "2020-01-01 00:01:39"); + } + + @Test + public void ParquetInsertCompressedIntoTable1() throws SQLException { + // clickhouse-client -q "select number int, toString(number) str, 1/number flt, toDecimal64( 1/(number+1) , 9) dcml, + // toDateTime('2020-01-01 00:00:00') + number time from numbers(100) format Parquet"|gzip > test_sample.parquet.gz + + String version = connection.getServerVersion(); + if (version.compareTo("20.8") < 0) { + return; + } + + connection.createStatement().execute("DROP TABLE IF EXISTS test.parquet1_stream_compressed"); + connection.createStatement().execute( + "CREATE TABLE test.parquet1_stream_compressed (int Int64, str String, flt Float64, " + + "dcml Decimal64(9), time DateTime) ENGINE = Log();" + ); + + InputStream inputStream = StreamSQLTest.class.getResourceAsStream("/data_samples/test_sample.parquet.gz"); + + connection.createStatement(). + write() + .sql("insert into test.parquet1_stream_compressed format Parquet") + .dataCompression(ClickHouseCompression.gzip) + .data(inputStream) + .send(); + + ResultSet rs = connection.createStatement().executeQuery( + "select * from test.parquet1_stream_compressed where int=42"); + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt("int"), 42); + Assert.assertEquals(rs.getString("str"), "42"); + Assert.assertTrue( Math.abs(rs.getFloat("flt") - 0.023809524) < 0.0001); + Assert.assertTrue( Math.abs(rs.getFloat("dcml") - 0.023255813) < 0.0001); + Assert.assertEquals(rs.getString("time"), "2020-01-01 00:00:42"); + } + } diff --git a/src/test/resources/data_samples/test_sample.orc.gz b/src/test/resources/data_samples/test_sample.orc.gz new file mode 100644 index 000000000..a387cd591 Binary files /dev/null and b/src/test/resources/data_samples/test_sample.orc.gz differ diff --git a/src/test/resources/data_samples/test_sample.parquet.gz b/src/test/resources/data_samples/test_sample.parquet.gz new file mode 100644 index 000000000..eab2be518 Binary files /dev/null and b/src/test/resources/data_samples/test_sample.parquet.gz differ