diff --git a/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/InputBasedPreparedStatement.java b/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/InputBasedPreparedStatement.java index fd676de9c..9ffc0d362 100644 --- a/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/InputBasedPreparedStatement.java +++ b/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/InputBasedPreparedStatement.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.List; import com.clickhouse.client.ClickHouseColumn; @@ -40,6 +41,7 @@ public class InputBasedPreparedStatement extends AbstractPreparedStatement imple private final ClickHouseColumn[] columns; private final ClickHouseValue[] values; + private final ClickHouseParameterMetaData paramMetaData; private final boolean[] flags; private int counter; @@ -62,12 +64,15 @@ protected InputBasedPreparedStatement(ClickHouseConnectionImpl connection, Click int size = columns.size(); this.columns = new ClickHouseColumn[size]; this.values = new ClickHouseValue[size]; + List list = new ArrayList<>(size); int i = 0; for (ClickHouseColumn col : columns) { this.columns[i] = col; this.values[i] = ClickHouseValues.newValue(config, col); + list.add(col); i++; } + paramMetaData = new ClickHouseParameterMetaData(Collections.unmodifiableList(list)); flags = new boolean[size]; counter = 0; @@ -444,8 +449,7 @@ public void setNull(int parameterIndex, int sqlType, String typeName) throws SQL @Override public ParameterMetaData getParameterMetaData() throws SQLException { - // TODO Auto-generated method stub - return null; + return paramMetaData; } @Override diff --git a/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/SqlBasedPreparedStatement.java b/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/SqlBasedPreparedStatement.java index 664f999ed..45eb10968 100644 --- a/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/SqlBasedPreparedStatement.java +++ b/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/SqlBasedPreparedStatement.java @@ -15,12 +15,15 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.TimeZone; import com.clickhouse.client.ClickHouseChecker; +import com.clickhouse.client.ClickHouseColumn; import com.clickhouse.client.ClickHouseConfig; +import com.clickhouse.client.ClickHouseDataType; import com.clickhouse.client.ClickHouseParameterizedQuery; import com.clickhouse.client.ClickHouseRequest; import com.clickhouse.client.ClickHouseResponse; @@ -51,6 +54,7 @@ public class SqlBasedPreparedStatement extends AbstractPreparedStatement impleme private final ClickHouseParameterizedQuery preparedQuery; private final ClickHouseValue[] templates; private final String[] values; + private final ClickHouseParameterMetaData paramMetaData; private final List batch; private final StringBuilder builder; @@ -93,7 +97,13 @@ protected SqlBasedPreparedStatement(ClickHouseConnectionImpl connection, ClickHo templates = preparedQuery.getParameterTemplates(); - values = new String[templates.length]; + int tlen = templates.length; + values = new String[tlen]; + List list = new ArrayList<>(tlen); + for (int i = 1; i <= tlen; i++) { + list.add(ClickHouseColumn.of("parameter" + i, ClickHouseDataType.JSON, true)); + } + paramMetaData = new ClickHouseParameterMetaData(Collections.unmodifiableList(list)); batch = new LinkedList<>(); builder = new StringBuilder(); if ((insertValuesQuery = prefix) != null) { @@ -578,8 +588,7 @@ public void setNull(int parameterIndex, int sqlType, String typeName) throws SQL @Override public ParameterMetaData getParameterMetaData() throws SQLException { - // TODO Auto-generated method stub - return null; + return paramMetaData; } @Override diff --git a/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/TableBasedPreparedStatement.java b/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/TableBasedPreparedStatement.java index e86c94e27..e3ef390f2 100644 --- a/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/TableBasedPreparedStatement.java +++ b/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/internal/TableBasedPreparedStatement.java @@ -16,6 +16,8 @@ import java.util.List; import java.util.Set; +import com.clickhouse.client.ClickHouseColumn; +import com.clickhouse.client.ClickHouseDataType; import com.clickhouse.client.ClickHouseRequest; import com.clickhouse.client.ClickHouseResponse; import com.clickhouse.client.ClickHouseUtils; @@ -35,12 +37,12 @@ public class TableBasedPreparedStatement extends AbstractPreparedStatement imple private final ClickHouseSqlStatement parsedStmt; private final List tables; private final ClickHouseExternalTable[] values; + private final ClickHouseParameterMetaData paramMetaData; private final List> batch; protected TableBasedPreparedStatement(ClickHouseConnectionImpl connection, ClickHouseRequest request, - ClickHouseSqlStatement parsedStmt, int resultSetType, int resultSetConcurrency, - int resultSetHoldability) + ClickHouseSqlStatement parsedStmt, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { super(connection, request, resultSetType, resultSetConcurrency, resultSetHoldability); @@ -54,6 +56,11 @@ protected TableBasedPreparedStatement(ClickHouseConnectionImpl connection, Click this.tables = new ArrayList<>(size); this.tables.addAll(set); values = new ClickHouseExternalTable[size]; + List list = new ArrayList<>(size); + for (String name : set) { + list.add(ClickHouseColumn.of(name, ClickHouseDataType.JSON, false)); + } + paramMetaData = new ClickHouseParameterMetaData(Collections.unmodifiableList(list)); batch = new LinkedList<>(); } @@ -278,8 +285,7 @@ public void setNull(int parameterIndex, int sqlType, String typeName) throws SQL @Override public ParameterMetaData getParameterMetaData() throws SQLException { - // TODO Auto-generated method stub - return null; + return paramMetaData; } @Override diff --git a/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHousePreparedStatementTest.java b/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHousePreparedStatementTest.java index c131e052b..25fe593d3 100644 --- a/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHousePreparedStatementTest.java +++ b/clickhouse-jdbc/src/test/java/com/clickhouse/jdbc/ClickHousePreparedStatementTest.java @@ -9,6 +9,7 @@ import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.Date; +import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -28,6 +29,7 @@ import com.clickhouse.client.ClickHouseConfig; import com.clickhouse.client.ClickHouseDataStreamFactory; +import com.clickhouse.client.ClickHouseDataType; import com.clickhouse.client.ClickHouseFormat; import com.clickhouse.client.ClickHouseInputStream; import com.clickhouse.client.ClickHousePipedOutputStream; @@ -1433,4 +1435,30 @@ public void testInsertWithMultipleValues() throws Exception { } } } + + @Test(groups = "integration") + public void testGetParameterMetaData() throws Exception { + try (Connection conn = newConnection(new Properties()); + PreparedStatement emptyPs = conn.prepareStatement("select 1"); + PreparedStatement inputPs = conn.prepareStatement( + "insert into non_existing_table select * from input('col2 String, col3 Int8, col1 JSON')"); + PreparedStatement sqlPs = conn.prepareStatement("select ?, toInt32(?), ? b"); + PreparedStatement tablePs = conn.prepareStatement( + "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");) { + Assert.assertEquals(emptyPs.getParameterMetaData().getParameterCount(), 0); + + for (PreparedStatement ps : new PreparedStatement[] { inputPs, sqlPs }) { + Assert.assertNotNull(ps.getParameterMetaData()); + Assert.assertTrue(ps.getParameterMetaData() == ps.getParameterMetaData(), + "parameter mete data should be singleton"); + Assert.assertEquals(ps.getParameterMetaData().getParameterCount(), 3); + Assert.assertEquals(ps.getParameterMetaData().getParameterMode(3), ParameterMetaData.parameterModeIn); + Assert.assertEquals(ps.getParameterMetaData().getParameterType(3), Types.OTHER); + Assert.assertEquals(ps.getParameterMetaData().getPrecision(3), 0); + Assert.assertEquals(ps.getParameterMetaData().getScale(3), 0); + Assert.assertEquals(ps.getParameterMetaData().getParameterClassName(3), Object.class.getName()); + Assert.assertEquals(ps.getParameterMetaData().getParameterTypeName(3), ClickHouseDataType.JSON.name()); + } + } + } }