Skip to content

Commit 1d6257c

Browse files
authored
Merge pull request #856 from zhicwu/prepare-patch
Correct behavior of Connection.createArrayOf
2 parents e31fee4 + 046c3f2 commit 1d6257c

File tree

3 files changed

+44
-14
lines changed

3 files changed

+44
-14
lines changed

clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseColumn.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,16 @@ private static ClickHouseColumn update(ClickHouseColumn column) {
4848
column.precision = column.dataType.getMaxPrecision();
4949
switch (column.dataType) {
5050
case Array:
51-
column.arrayLevel = 1;
52-
column.arrayBaseColumn = column.nested.get(0);
53-
while (column.arrayLevel < 255) {
54-
if (column.arrayBaseColumn.dataType == ClickHouseDataType.Array) {
55-
column.arrayLevel++;
56-
column.arrayBaseColumn = column.arrayBaseColumn.nested.get(0);
57-
} else {
58-
break;
51+
if (!column.nested.isEmpty()) {
52+
column.arrayLevel = 1;
53+
column.arrayBaseColumn = column.nested.get(0);
54+
while (column.arrayLevel < 255) {
55+
if (column.arrayBaseColumn.dataType == ClickHouseDataType.Array) {
56+
column.arrayLevel++;
57+
column.arrayBaseColumn = column.arrayBaseColumn.nested.get(0);
58+
} else {
59+
break;
60+
}
5961
}
6062
}
6163
break;
@@ -101,10 +103,14 @@ private static ClickHouseColumn update(ClickHouseColumn column) {
101103
case Decimal64:
102104
case Decimal128:
103105
case Decimal256:
104-
column.scale = Integer.parseInt(column.parameters.get(0));
106+
if (size > 0) {
107+
column.scale = Integer.parseInt(column.parameters.get(0));
108+
}
105109
break;
106110
case FixedString:
107-
column.precision = Integer.parseInt(column.parameters.get(0));
111+
if (size > 0) {
112+
column.precision = Integer.parseInt(column.parameters.get(0));
113+
}
108114
break;
109115
default:
110116
break;
@@ -307,13 +313,14 @@ public static ClickHouseColumn of(String columnName, ClickHouseDataType dataType
307313

308314
public static ClickHouseColumn of(String columnName, ClickHouseDataType dataType, boolean nullable,
309315
boolean lowCardinality, String... parameters) {
310-
return new ClickHouseColumn(dataType, columnName, null, nullable, lowCardinality, Arrays.asList(parameters),
311-
null);
316+
return update(new ClickHouseColumn(dataType, columnName, null, nullable, lowCardinality,
317+
Arrays.asList(parameters), null));
312318
}
313319

314320
public static ClickHouseColumn of(String columnName, ClickHouseDataType dataType, boolean nullable,
315321
ClickHouseColumn... nestedColumns) {
316-
return new ClickHouseColumn(dataType, columnName, null, nullable, false, null, Arrays.asList(nestedColumns));
322+
return update(
323+
new ClickHouseColumn(dataType, columnName, null, nullable, false, null, Arrays.asList(nestedColumns)));
317324
}
318325

319326
public static ClickHouseColumn of(String columnName, String columnType) {

clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/ClickHouseConnection.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import com.clickhouse.client.ClickHouseColumn;
1616
import com.clickhouse.client.ClickHouseConfig;
17+
import com.clickhouse.client.ClickHouseDataType;
1718
import com.clickhouse.client.ClickHouseValue;
1819
import com.clickhouse.client.ClickHouseValues;
1920
import com.clickhouse.client.ClickHouseVersion;
@@ -36,7 +37,8 @@ public interface ClickHouseConnection extends Connection {
3637
@Override
3738
default ClickHouseArray createArrayOf(String typeName, Object[] elements) throws SQLException {
3839
ClickHouseConfig config = getConfig();
39-
ClickHouseColumn column = ClickHouseColumn.of("", typeName);
40+
ClickHouseColumn column = ClickHouseColumn.of("", ClickHouseDataType.Array, false,
41+
ClickHouseColumn.of("", typeName));
4042
ClickHouseValue v = ClickHouseValues.newValue(config, column).update(elements);
4143
ClickHouseResultSet rs = new ClickHouseResultSet("", "", createStatement(),
4244
ClickHouseSimpleResponse.of(config, Collections.singletonList(column),

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,27 @@ public void testInsertStringAsArray() throws Exception {
882882
Assert.assertEquals(rs.getObject(3), new long[] { 3, 0, 1 });
883883
Assert.assertFalse(rs.next());
884884
}
885+
886+
try (ClickHouseConnection conn = newConnection(new Properties());
887+
Statement s = conn.createStatement()) {
888+
s.execute("drop table if exists test_string_array_insert; "
889+
+ "create table test_string_array_insert(id UInt32, a Array(LowCardinality(String)), b Array(Nullable(String)))engine=Memory");
890+
891+
try (PreparedStatement stmt = conn.prepareStatement(
892+
"insert into test_string_array_insert(id, a, b) values (?,?,?)")) {
893+
stmt.setString(1, "1");
894+
stmt.setObject(2, new String[] { "1", "2", "3" });
895+
stmt.setArray(3, conn.createArrayOf("String", new String[] { "3", null, "1" }));
896+
Assert.assertEquals(stmt.executeUpdate(), 1);
897+
}
898+
899+
ResultSet rs = s.executeQuery("select * from test_string_array_insert order by id");
900+
Assert.assertTrue(rs.next());
901+
Assert.assertEquals(rs.getInt(1), 1);
902+
Assert.assertEquals(rs.getArray(2).getArray(), new String[] { "1", "2", "3" });
903+
Assert.assertEquals(rs.getObject(3), new String[] { "3", null, "1" });
904+
Assert.assertFalse(rs.next());
905+
}
885906
}
886907

887908
@Test(groups = "integration")

0 commit comments

Comments
 (0)