diff --git a/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/ClickHouseConnectionImpl.java b/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/ClickHouseConnectionImpl.java index 1ba8d191e..70985779b 100644 --- a/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/ClickHouseConnectionImpl.java +++ b/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/ClickHouseConnectionImpl.java @@ -88,6 +88,9 @@ private void initConnection(ClickHouseProperties properties) throws SQLException } serverTimeZone = TimeZone.getTimeZone("UTC"); // just for next query + timezone = serverTimeZone; + serverVersion = ""; + try (Statement s = createStatement(); ResultSet rs = s.executeQuery("select timezone(), version()")) { if (rs.next()) { serverTimeZone = TimeZone.getTimeZone(rs.getString(1)); diff --git a/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtil.java b/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtil.java index eb6b20e9e..e3b0211c4 100644 --- a/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtil.java +++ b/clickhouse-jdbc/src/main/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtil.java @@ -9,8 +9,8 @@ */ public final class ClickHouseVersionNumberUtil { - private static final Pattern VERSION_NUMBER_PATTERN = - Pattern.compile("^\\s*(\\d+)\\.(\\d+).*"); + private static final Pattern VERSION_NUMBER_PATTERN = Pattern.compile("^\\s*(\\d+)\\.(\\d+).*"); + private static final Pattern NON_NUMBERIC_PATTERN = Pattern.compile("[^0-9.]"); public static int getMajorVersion(String versionNumber) { Matcher m = VERSION_NUMBER_PATTERN.matcher(versionNumber); @@ -22,5 +22,36 @@ public static int getMinorVersion(String versionNumber) { return m.matches() ? Integer.parseInt(m.group(2)) : 0; } - private ClickHouseVersionNumberUtil() { /* do not instantiate util */ } + public static int compare(String currentVersion, String targetVersion) { + if (currentVersion == null || targetVersion == null || currentVersion.isEmpty() || targetVersion.isEmpty()) { + throw new IllegalArgumentException("Both version cannot be null or empty"); + } + + currentVersion = NON_NUMBERIC_PATTERN.matcher(currentVersion).replaceAll(""); + targetVersion = NON_NUMBERIC_PATTERN.matcher(targetVersion).replaceAll(""); + if (currentVersion.equals(targetVersion)) { + return 0; + } + + String[] v1 = currentVersion.split("\\."); + String[] v2 = targetVersion.split("\\."); + + int result = 0; + for (int i = 0, len = Math.min(v1.length, v2.length); i < len; i++) { + int n1 = Integer.parseInt(v1[i]); + int n2 = Integer.parseInt(v2[i]); + + if (n1 == n2) { + continue; + } else { + result = n1 > n2 ? 1 : -1; + break; + } + } + + return result; + } + + private ClickHouseVersionNumberUtil() { + /* do not instantiate util */ } } diff --git a/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/integration/ClickHouseLargeNumberTest.java b/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/integration/ClickHouseLargeNumberTest.java index e0eb722e3..e9a393fe8 100644 --- a/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/integration/ClickHouseLargeNumberTest.java +++ b/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/integration/ClickHouseLargeNumberTest.java @@ -27,9 +27,10 @@ import ru.yandex.clickhouse.except.ClickHouseException; import ru.yandex.clickhouse.settings.ClickHouseProperties; import ru.yandex.clickhouse.settings.ClickHouseQueryParam; +import ru.yandex.clickhouse.util.ClickHouseVersionNumberUtil; public class ClickHouseLargeNumberTest { - private Connection conn; + private ClickHouseConnection conn; @BeforeTest public void setUp() throws Exception { @@ -57,10 +58,10 @@ public void tearDown() throws Exception { @Test public void testBigIntSupport() throws SQLException { - if (conn == null) { + if (conn == null || ClickHouseVersionNumberUtil.compare(conn.getServerVersion(), "21.7") >= 0) { return; } - + String testSql = "create table if not exists system.test_bigint_support(i Int256) engine=Memory;" + "drop table if exists system.test_bigint_support;"; try (Connection conn = ClickHouseContainerForTest.newDataSource().getConnection(); diff --git a/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtilTest.java b/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtilTest.java index 8da439ca2..50d152ec3 100644 --- a/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtilTest.java +++ b/clickhouse-jdbc/src/test/java/ru/yandex/clickhouse/util/ClickHouseVersionNumberUtilTest.java @@ -10,7 +10,8 @@ public void testMajorNull() { try { ClickHouseVersionNumberUtil.getMajorVersion(null); Assert.fail(); - } catch (NullPointerException npe) { /* expected */ } + } catch (NullPointerException npe) { + /* expected */ } } @Test @@ -18,7 +19,8 @@ public void testMinorNull() { try { ClickHouseVersionNumberUtil.getMinorVersion(null); Assert.fail(); - } catch (NullPointerException npe) { /* expected */ } + } catch (NullPointerException npe) { + /* expected */ } } @Test @@ -62,4 +64,15 @@ public void testMinorSimple() { Assert.assertEquals(ClickHouseVersionNumberUtil.getMinorVersion("1.1-SNAPSHOT"), 1); } + @Test + public void testCompare() { + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("1", "1"), 0); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("21.3", "21.12"), -1); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("21 .3", "21. 12"), -1); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("21 .3", "21. 12-test"), -1); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("21.3", "21.1"), 1); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("21. 3", "21 .1"), 1); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("21. 3-test", "21 .1"), 1); + Assert.assertEquals(ClickHouseVersionNumberUtil.compare("18.16", "18.16.0"), 0); + } }