Skip to content

Commit 1f633d6

Browse files
committed
implement getParameterMetadata method in PreparedStatement
1 parent 3a71503 commit 1f633d6

File tree

4 files changed

+56
-9
lines changed

4 files changed

+56
-9
lines changed

clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/InputBasedPreparedStatement.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.ArrayList;
1717
import java.util.Arrays;
1818
import java.util.Calendar;
19+
import java.util.Collections;
1920
import java.util.List;
2021

2122
import com.clickhouse.client.ClickHouseColumn;
@@ -40,6 +41,7 @@ public class InputBasedPreparedStatement extends AbstractPreparedStatement imple
4041

4142
private final ClickHouseColumn[] columns;
4243
private final ClickHouseValue[] values;
44+
private final ClickHouseParameterMetaData paramMetaData;
4345
private final boolean[] flags;
4446

4547
private int counter;
@@ -62,12 +64,15 @@ protected InputBasedPreparedStatement(ClickHouseConnectionImpl connection, Click
6264
int size = columns.size();
6365
this.columns = new ClickHouseColumn[size];
6466
this.values = new ClickHouseValue[size];
67+
List<ClickHouseColumn> list = new ArrayList<>(size);
6568
int i = 0;
6669
for (ClickHouseColumn col : columns) {
6770
this.columns[i] = col;
6871
this.values[i] = ClickHouseValues.newValue(config, col);
72+
list.add(col);
6973
i++;
7074
}
75+
paramMetaData = new ClickHouseParameterMetaData(Collections.unmodifiableList(list));
7176
flags = new boolean[size];
7277

7378
counter = 0;
@@ -444,8 +449,7 @@ public void setNull(int parameterIndex, int sqlType, String typeName) throws SQL
444449

445450
@Override
446451
public ParameterMetaData getParameterMetaData() throws SQLException {
447-
// TODO Auto-generated method stub
448-
return null;
452+
return paramMetaData;
449453
}
450454

451455
@Override

clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/SqlBasedPreparedStatement.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
import java.util.ArrayList;
1616
import java.util.Arrays;
1717
import java.util.Calendar;
18+
import java.util.Collections;
1819
import java.util.LinkedList;
1920
import java.util.List;
2021
import java.util.TimeZone;
2122

2223
import com.clickhouse.client.ClickHouseChecker;
24+
import com.clickhouse.client.ClickHouseColumn;
2325
import com.clickhouse.client.ClickHouseConfig;
26+
import com.clickhouse.client.ClickHouseDataType;
2427
import com.clickhouse.client.ClickHouseParameterizedQuery;
2528
import com.clickhouse.client.ClickHouseRequest;
2629
import com.clickhouse.client.ClickHouseResponse;
@@ -51,6 +54,7 @@ public class SqlBasedPreparedStatement extends AbstractPreparedStatement impleme
5154
private final ClickHouseParameterizedQuery preparedQuery;
5255
private final ClickHouseValue[] templates;
5356
private final String[] values;
57+
private final ClickHouseParameterMetaData paramMetaData;
5458
private final List<String[]> batch;
5559
private final StringBuilder builder;
5660

@@ -93,7 +97,13 @@ protected SqlBasedPreparedStatement(ClickHouseConnectionImpl connection, ClickHo
9397

9498
templates = preparedQuery.getParameterTemplates();
9599

96-
values = new String[templates.length];
100+
int tlen = templates.length;
101+
values = new String[tlen];
102+
List<ClickHouseColumn> list = new ArrayList<>(tlen);
103+
for (int i = 1; i <= tlen; i++) {
104+
list.add(ClickHouseColumn.of("parameter" + i, ClickHouseDataType.JSON, true));
105+
}
106+
paramMetaData = new ClickHouseParameterMetaData(Collections.unmodifiableList(list));
97107
batch = new LinkedList<>();
98108
builder = new StringBuilder();
99109
if ((insertValuesQuery = prefix) != null) {
@@ -578,8 +588,7 @@ public void setNull(int parameterIndex, int sqlType, String typeName) throws SQL
578588

579589
@Override
580590
public ParameterMetaData getParameterMetaData() throws SQLException {
581-
// TODO Auto-generated method stub
582-
return null;
591+
return paramMetaData;
583592
}
584593

585594
@Override

clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/TableBasedPreparedStatement.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.util.List;
1717
import java.util.Set;
1818

19+
import com.clickhouse.client.ClickHouseColumn;
20+
import com.clickhouse.client.ClickHouseDataType;
1921
import com.clickhouse.client.ClickHouseRequest;
2022
import com.clickhouse.client.ClickHouseResponse;
2123
import com.clickhouse.client.ClickHouseUtils;
@@ -35,12 +37,12 @@ public class TableBasedPreparedStatement extends AbstractPreparedStatement imple
3537
private final ClickHouseSqlStatement parsedStmt;
3638
private final List<String> tables;
3739
private final ClickHouseExternalTable[] values;
40+
private final ClickHouseParameterMetaData paramMetaData;
3841

3942
private final List<List<ClickHouseExternalTable>> batch;
4043

4144
protected TableBasedPreparedStatement(ClickHouseConnectionImpl connection, ClickHouseRequest<?> request,
42-
ClickHouseSqlStatement parsedStmt, int resultSetType, int resultSetConcurrency,
43-
int resultSetHoldability)
45+
ClickHouseSqlStatement parsedStmt, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
4446
throws SQLException {
4547
super(connection, request, resultSetType, resultSetConcurrency, resultSetHoldability);
4648

@@ -54,6 +56,11 @@ protected TableBasedPreparedStatement(ClickHouseConnectionImpl connection, Click
5456
this.tables = new ArrayList<>(size);
5557
this.tables.addAll(set);
5658
values = new ClickHouseExternalTable[size];
59+
List<ClickHouseColumn> list = new ArrayList<>(size);
60+
for (String name : set) {
61+
list.add(ClickHouseColumn.of(name, ClickHouseDataType.JSON, false));
62+
}
63+
paramMetaData = new ClickHouseParameterMetaData(Collections.unmodifiableList(list));
5764
batch = new LinkedList<>();
5865
}
5966

@@ -278,8 +285,7 @@ public void setNull(int parameterIndex, int sqlType, String typeName) throws SQL
278285

279286
@Override
280287
public ParameterMetaData getParameterMetaData() throws SQLException {
281-
// TODO Auto-generated method stub
282-
return null;
288+
return paramMetaData;
283289
}
284290

285291
@Override

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

+28
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.sql.BatchUpdateException;
1010
import java.sql.Connection;
1111
import java.sql.Date;
12+
import java.sql.ParameterMetaData;
1213
import java.sql.PreparedStatement;
1314
import java.sql.ResultSet;
1415
import java.sql.SQLException;
@@ -28,6 +29,7 @@
2829

2930
import com.clickhouse.client.ClickHouseConfig;
3031
import com.clickhouse.client.ClickHouseDataStreamFactory;
32+
import com.clickhouse.client.ClickHouseDataType;
3133
import com.clickhouse.client.ClickHouseFormat;
3234
import com.clickhouse.client.ClickHouseInputStream;
3335
import com.clickhouse.client.ClickHousePipedOutputStream;
@@ -1433,4 +1435,30 @@ public void testInsertWithMultipleValues() throws Exception {
14331435
}
14341436
}
14351437
}
1438+
1439+
@Test(groups = "integration")
1440+
public void testGetParameterMetaData() throws Exception {
1441+
try (Connection conn = newConnection(new Properties());
1442+
PreparedStatement emptyPs = conn.prepareStatement("select 1");
1443+
PreparedStatement inputPs = conn.prepareStatement(
1444+
"insert into non_existing_table select * from input('col2 String, col3 Int8, col1 JSON')");
1445+
PreparedStatement sqlPs = conn.prepareStatement("select ?, toInt32(?), ? b");
1446+
PreparedStatement tablePs = conn.prepareStatement(
1447+
"select a.id, c.* from {tt 'col2'} a inner join {tt 'col3'} b on a.id = b.id left outer join {tt 'col1'} c on b.id = c.id");) {
1448+
Assert.assertEquals(emptyPs.getParameterMetaData().getParameterCount(), 0);
1449+
1450+
for (PreparedStatement ps : new PreparedStatement[] { inputPs, sqlPs }) {
1451+
Assert.assertNotNull(ps.getParameterMetaData());
1452+
Assert.assertTrue(ps.getParameterMetaData() == ps.getParameterMetaData(),
1453+
"parameter mete data should be singleton");
1454+
Assert.assertEquals(ps.getParameterMetaData().getParameterCount(), 3);
1455+
Assert.assertEquals(ps.getParameterMetaData().getParameterMode(3), ParameterMetaData.parameterModeIn);
1456+
Assert.assertEquals(ps.getParameterMetaData().getParameterType(3), Types.OTHER);
1457+
Assert.assertEquals(ps.getParameterMetaData().getPrecision(3), 0);
1458+
Assert.assertEquals(ps.getParameterMetaData().getScale(3), 0);
1459+
Assert.assertEquals(ps.getParameterMetaData().getParameterClassName(3), Object.class.getName());
1460+
Assert.assertEquals(ps.getParameterMetaData().getParameterTypeName(3), ClickHouseDataType.JSON.name());
1461+
}
1462+
}
1463+
}
14361464
}

0 commit comments

Comments
 (0)