Skip to content

Commit 470aaa1

Browse files
authored
Merge pull request #2235 from markgrex/mg/schema-with-params
Support getting table schema from a query with params
2 parents f64b139 + abd0395 commit 470aaa1

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

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

+11-5
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,7 @@ public TableSchema getTableSchema(String table) {
18651865
*/
18661866
public TableSchema getTableSchema(String table, String database) {
18671867
final String sql = "DESCRIBE TABLE " + table + " FORMAT " + ClickHouseFormat.TSKV.name();
1868-
return getTableSchemaImpl(sql, table, null, database);
1868+
return getTableSchemaImpl(sql, table, null, database, null);
18691869
}
18701870

18711871
/**
@@ -1874,16 +1874,22 @@ public TableSchema getTableSchema(String table, String database) {
18741874
* @return table schema for the query
18751875
*/
18761876
public TableSchema getTableSchemaFromQuery(String sql) {
1877+
return getTableSchemaFromQuery(sql, null);
1878+
}
1879+
1880+
public TableSchema getTableSchemaFromQuery(String sql, Map<String, Object> params) {
18771881
final String describeQuery = "DESC (" + sql + ") FORMAT " + ClickHouseFormat.TSKV.name();
1878-
return getTableSchemaImpl(describeQuery, null, sql, getDefaultDatabase());
1882+
return getTableSchemaImpl(describeQuery, null, sql, getDefaultDatabase(), params);
18791883
}
18801884

1881-
private TableSchema getTableSchemaImpl(String describeQuery, String name, String originalQuery, String database) {
1885+
private TableSchema getTableSchemaImpl(
1886+
String describeQuery, String name, String originalQuery, String database, Map<String, Object> queryParams) {
18821887
int operationTimeout = getOperationTimeout();
18831888

18841889
QuerySettings settings = new QuerySettings().setDatabase(database);
1885-
try (QueryResponse response = operationTimeout == 0 ? query(describeQuery, settings).get() :
1886-
query(describeQuery, settings).get(getOperationTimeout(), TimeUnit.SECONDS)) {
1890+
try (QueryResponse response = operationTimeout == 0
1891+
? query(describeQuery, queryParams, settings).get()
1892+
: query(describeQuery, queryParams, settings).get(getOperationTimeout(), TimeUnit.SECONDS)) {
18871893
return TableSchemaParser.readTSKV(response.getInputStream(), name, originalQuery, database);
18881894
} catch (TimeoutException e) {
18891895
throw new ClientException("Operation has likely timed out after " + getOperationTimeout() + " seconds.", e);

client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -1632,7 +1632,7 @@ public void testGetTableSchemaError() {
16321632
}
16331633

16341634
@Test(groups = {"integration"})
1635-
public void testGetTableSchemaFromQuery() throws Exception {
1635+
public void testGetTableSchemaFromQuery() {
16361636
TableSchema schema = client.getTableSchemaFromQuery("SELECT toUInt32(1) as col1, 'value' as col2");
16371637
Assert.assertNotNull(schema);
16381638
Assert.assertEquals(schema.getColumns().size(), 2);
@@ -1642,6 +1642,20 @@ public void testGetTableSchemaFromQuery() throws Exception {
16421642
Assert.assertEquals(schema.getColumns().get(1).getDataType(), ClickHouseDataType.String);
16431643
}
16441644

1645+
@Test(groups = {"integration"})
1646+
public void testGetTableSchemaFromQueryWithParams() {
1647+
Map<String, Object> queryParams = new HashMap<>();
1648+
queryParams.put("param1", 2);
1649+
TableSchema schema = client.getTableSchemaFromQuery("SELECT toUInt32(1) as col1, {param1:String} as col2",
1650+
queryParams);
1651+
Assert.assertNotNull(schema);
1652+
Assert.assertEquals(schema.getColumns().size(), 2);
1653+
Assert.assertEquals(schema.getColumns().get(0).getColumnName(), "col1");
1654+
Assert.assertEquals(schema.getColumns().get(0).getDataType(), ClickHouseDataType.UInt32);
1655+
Assert.assertEquals(schema.getColumns().get(1).getColumnName(), "col2");
1656+
Assert.assertEquals(schema.getColumns().get(1).getDataType(), ClickHouseDataType.String);
1657+
}
1658+
16451659
@Test(groups = {"integration"})
16461660
public void testServerTimeZoneFromHeader() {
16471661

0 commit comments

Comments
 (0)