Skip to content

Commit f062681

Browse files
committed
Merge branch 'main' into jdbc_various_fixes_091225
2 parents 28f0fe7 + f000e1f commit f062681

File tree

29 files changed

+1593
-312
lines changed

29 files changed

+1593
-312
lines changed

.github/workflows/build.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,24 @@ jobs:
5757
cache: "maven"
5858
- name: Build and install libraries
5959
run: mvn --batch-mode --no-transfer-progress --show-version --strict-checksums --threads 2 -Dmaven.wagon.rto=30000 -Dj8 -DskipITs install
60+
- name: Copy Artifacts to Build dir
61+
run: |
62+
mkdir clickhouse-jdbc-artifacts
63+
cp -rf $HOME/.m2/repository/com/clickhouse/clickhouse-jdbc/* ./clickhouse-jdbc-artifacts/
6064
- name: Compile examples
6165
run: |
6266
export LIB_VER=$(grep '<revision>' pom.xml | sed -e 's|[[:space:]]*<[/]*revision>[[:space:]]*||g')
6367
find `pwd`/examples -type f -name pom.xml -exec sed -i -e "s|\(<clickhouse-java.version>\).*\(<\)|\1$LIB_VER\2|g" {} \;
6468
for d in $(ls -d `pwd`/examples/*/); do \
6569
if [ -e $d/pom.xml ]; then cd $d && mvn --batch-mode --no-transfer-progress clean compile; fi;
6670
if [ -e $d/gradlew ]; then cd $d && ./gradlew clean build; fi;
67-
done
71+
done
72+
- name: Save clickhouse-jdbc-all for tests
73+
uses: actions/upload-artifact@v4
74+
with:
75+
name: clickhouse-jdbc-archive
76+
path: clickhouse-jdbc-artifacts/
77+
retention-days: 5
6878

6979
# test-multi-env:
7080
# needs: compile
@@ -196,6 +206,7 @@ jobs:
196206
path: |
197207
**/target/failsafe-reports
198208
**/target/surefire-reports
209+
retention-days: 5
199210

200211
test-with-cloud:
201212
runs-on: ubuntu-latest

clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseDriverTest.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package com.clickhouse.jdbc;
22

3-
import java.sql.Connection;
4-
import java.sql.SQLException;
5-
63
import com.clickhouse.client.ClickHouseProtocol;
7-
84
import com.clickhouse.client.ClickHouseServerForTest;
9-
import com.clickhouse.client.config.ClickHouseDefaults;
10-
import com.clickhouse.jdbc.internal.ClickHouseJdbcUrlParser;
115
import org.testng.Assert;
126
import org.testng.annotations.Test;
137

8+
import java.sql.Connection;
9+
import java.sql.SQLException;
10+
1411
public class ClickHouseDriverTest extends JdbcIntegrationTest {
1512
@Test(groups = "integration")
1613
public void testAcceptUrl() throws SQLException {
@@ -24,13 +21,21 @@ public void testAcceptUrl() throws SQLException {
2421

2522
@Test(groups = "integration")
2623
public void testConnect() throws SQLException {
27-
if (isCloud()) return; //TODO: testConnect - Revisit, see: https://github.com/ClickHouse/clickhouse-java/issues/1747
24+
if (isCloud()) {
25+
return; //
26+
}
27+
2828
System.setProperty("clickhouse.jdbc.v1","true");
2929
String address = getServerAddress(ClickHouseProtocol.HTTP, true);
3030
ClickHouseDriver driver = new ClickHouseDriver();
3131
Connection conn = driver.connect("jdbc:clickhouse://default:" + ClickHouseServerForTest.getPassword() + "@" + address, null);
3232
conn.close();
33+
System.setProperty("clickhouse.jdbc.v1","false");
34+
ClickHouseDriver driver2 = new ClickHouseDriver();
35+
Connection conn2 = driver2.connect("jdbc:clickhouse://default:" + ClickHouseServerForTest.getPassword() + "@" + address, null);
36+
conn2.close();
3337
}
38+
3439
@Test(groups = "integration")
3540
public void testV2Driver() {
3641
System.setProperty("clickhouse.jdbc.v1","false");

clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHouseStatementTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import java.util.List;
5353
import java.util.Locale;
5454
import java.util.Properties;
55+
import java.util.ServiceLoader;
5556
import java.util.TimeZone;
5657
import java.util.UUID;
5758
import java.util.concurrent.CountDownLatch;

client-v2/src/main/java/com/clickhouse/client/api/Client.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,8 @@ public Builder useServerTimeZone(boolean useServerTimeZone) {
766766
*/
767767
public Builder useTimeZone(String timeZone) {
768768
this.configuration.put(ClientConfigProperties.USE_TIMEZONE.getKey(), timeZone);
769+
// switch using server timezone to false
770+
this.configuration.put(ClientConfigProperties.USE_SERVER_TIMEZONE.getKey(), String.valueOf(Boolean.FALSE));
769771
return this;
770772
}
771773

client-v2/src/main/java/com/clickhouse/client/api/DataTypeUtils.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.clickhouse.client.api;
22

3-
import java.time.Instant;
4-
import java.time.ZoneId;
53
import com.clickhouse.client.api.data_formats.internal.BinaryStreamReader;
4+
import com.clickhouse.data.ClickHouseDataType;
65

76
import java.time.Instant;
87
import java.time.ZoneId;
@@ -11,8 +10,6 @@
1110
import java.time.temporal.ChronoField;
1211
import java.util.Objects;
1312

14-
import com.clickhouse.data.ClickHouseDataType;
15-
1613
import static com.clickhouse.client.api.data_formats.internal.BinaryStreamReader.BASES;
1714

1815
public class DataTypeUtils {
@@ -39,6 +36,10 @@ public class DataTypeUtils {
3936
.appendFraction(ChronoField.NANO_OF_SECOND, 9, 9, true)
4037
.toFormatter();
4138

39+
public static final DateTimeFormatter TIME_WITH_NANOS_FORMATTER = INSTANT_FORMATTER;
40+
41+
public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
42+
4243
/**
4344
* Formats an {@link Instant} object for use in SQL statements or as query
4445
* parameter.

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/AbstractBinaryFormatReader.java

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.clickhouse.client.api.ClientException;
55
import com.clickhouse.client.api.DataTypeUtils;
66
import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader;
7+
import com.clickhouse.client.api.internal.DataTypeConverter;
78
import com.clickhouse.client.api.internal.MapUtils;
89
import com.clickhouse.client.api.internal.ServerSettings;
910
import com.clickhouse.client.api.metadata.NoSuchColumnException;
@@ -61,6 +62,8 @@ public abstract class AbstractBinaryFormatReader implements ClickHouseBinaryForm
6162

6263
protected BinaryStreamReader binaryStreamReader;
6364

65+
protected DataTypeConverter dataTypeConverter;
66+
6467
private TableSchema schema;
6568
private ClickHouseColumn[] columns;
6669
private Map[] convertions;
@@ -84,6 +87,7 @@ protected AbstractBinaryFormatReader(InputStream inputStream, QuerySettings quer
8487
if (schema != null) {
8588
setSchema(schema);
8689
}
90+
this.dataTypeConverter = DataTypeConverter.INSTANCE; // singleton while no need to customize conversion
8791
}
8892

8993
protected Object[] currentRecord;
@@ -326,52 +330,7 @@ public TableSchema getSchema() {
326330

327331
@Override
328332
public String getString(String colName) {
329-
return readAsString(readValue(colName), schema.getColumnByName(colName));
330-
}
331-
332-
/**
333-
* Converts value in to a string representation. Does some formatting for selected data types
334-
* @return string representation of a value for specified column
335-
*/
336-
public static String readAsString(Object value, ClickHouseColumn column) {
337-
if (value == null) {
338-
return null;
339-
} else if (value instanceof String) {
340-
return (String) value;
341-
} else if (value instanceof ZonedDateTime) {
342-
ClickHouseDataType dataType = column.getDataType();
343-
ZonedDateTime zdt = (ZonedDateTime) value;
344-
switch (dataType) { // should not be null
345-
case Date:
346-
case Date32:
347-
return zdt.format(DataTypeUtils.DATE_FORMATTER);
348-
case DateTime:
349-
case DateTime32:
350-
return zdt.format(DataTypeUtils.DATETIME_FORMATTER);
351-
case DateTime64:
352-
return zdt.format(DataTypeUtils.DATETIME_WITH_NANOS_FORMATTER);
353-
default:
354-
return value.toString();
355-
}
356-
} else if (value instanceof BinaryStreamReader.EnumValue) {
357-
return ((BinaryStreamReader.EnumValue)value).name;
358-
} else if (value instanceof Number ) {
359-
ClickHouseDataType dataType = column.getDataType();
360-
int num = ((Number) value).intValue();
361-
if (column.getDataType() == ClickHouseDataType.Variant) {
362-
for (ClickHouseColumn c : column.getNestedColumns()) {
363-
// TODO: will work only if single enum listed as variant
364-
if (c.getDataType() == ClickHouseDataType.Enum8 || c.getDataType() == ClickHouseDataType.Enum16) {
365-
return c.getEnumConstants().name(num);
366-
}
367-
}
368-
} else if (dataType == ClickHouseDataType.Enum8 || dataType == ClickHouseDataType.Enum16) {
369-
return column.getEnumConstants().name(num);
370-
}
371-
} else if (value instanceof BinaryStreamReader.ArrayValue) {
372-
return ((BinaryStreamReader.ArrayValue)value).asList().toString();
373-
}
374-
return value.toString();
333+
return dataTypeConverter.convertToString(readValue(colName), schema.getColumnByName(colName));
375334
}
376335

377336
@Override

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/MapBackedRecord.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.clickhouse.client.api.ClientException;
44
import com.clickhouse.client.api.DataTypeUtils;
5+
import com.clickhouse.client.api.internal.DataTypeConverter;
56
import com.clickhouse.client.api.metadata.TableSchema;
67
import com.clickhouse.client.api.query.GenericRecord;
78
import com.clickhouse.client.api.query.NullValueException;
@@ -38,10 +39,13 @@ public class MapBackedRecord implements GenericRecord {
3839

3940
private Map[] columnConverters;
4041

42+
private DataTypeConverter dataTypeConverter;
43+
4144
public MapBackedRecord(Map<String, Object> record, Map[] columnConverters, TableSchema schema) {
4245
this.record = new HashMap<>(record);
4346
this.schema = schema;
4447
this.columnConverters = columnConverters;
48+
this.dataTypeConverter = DataTypeConverter.INSTANCE;
4549
}
4650

4751
public <T> T readValue(int colIndex) {
@@ -58,7 +62,7 @@ public <T> T readValue(String colName) {
5862

5963
@Override
6064
public String getString(String colName) {
61-
return AbstractBinaryFormatReader.readAsString(readValue(colName), schema.getColumnByName(colName));
65+
return dataTypeConverter.convertToString(readValue(colName), schema.getColumnByName(colName));
6266
}
6367

6468
@Override

client-v2/src/main/java/com/clickhouse/client/api/data_formats/internal/SerializerUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,7 +1143,7 @@ public static void writeDateTime(OutputStream output, Object value, ZoneId targe
11431143
Instant dt = (Instant) value;
11441144
ts = dt.getEpochSecond();
11451145
} else {
1146-
throw new IllegalArgumentException("Cannot convert " + value + " to DataTime");
1146+
throw new IllegalArgumentException("Cannot convert " + value + " to DateTime");
11471147
}
11481148

11491149
BinaryStreamUtils.writeUnsignedInt32(output, ts);
@@ -1179,7 +1179,7 @@ public static void writeDateTime64(OutputStream output, Object value, int scale,
11791179
ts = dt.getEpochSecond();
11801180
nano = dt.getNano();
11811181
} else {
1182-
throw new IllegalArgumentException("Cannot convert " + value + " to DataTime");
1182+
throw new IllegalArgumentException("Cannot convert " + value + " to DateTime");
11831183
}
11841184

11851185
ts *= BinaryStreamReader.BASES[scale];

0 commit comments

Comments
 (0)