From 7f09cc80989de3c23134fbc5508a471db434ae4d Mon Sep 17 00:00:00 2001 From: Dmitry Aleksandrov Date: Tue, 20 May 2025 01:32:40 +0300 Subject: [PATCH] Fix `ResultSet#findColumn` - return actual column's index instead of 0 --- .../client/api/metadata/TableSchema.java | 13 +++++++ .../com/clickhouse/jdbc/ResultSetImpl.java | 2 +- .../clickhouse/jdbc/ResultSetImplTest.java | 38 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 jdbc-v2/src/test/java/com/clickhouse/jdbc/ResultSetImplTest.java diff --git a/client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java b/client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java index 8a1589532..ef41832de 100644 --- a/client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java +++ b/client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java @@ -104,10 +104,23 @@ public String columnIndexToName(int index) { return indexToName(index - 1); } + /** + * Takes column name and return corresponding index (starting from 1). + * Equals to {@code nameToIndex(name) + 1}. + * + * @param name - column name + * @return - column index starting from 1 + */ public int nameToColumnIndex(String name) { return nameToIndex(name) + 1; } + /** + * Takes column name and return corresponding index (starting from 0). + * + * @param name - column name + * @return - column index starting from 0 + */ public int nameToIndex(String name) { Integer index = colIndex.get(name); if (index == null) { diff --git a/jdbc-v2/src/main/java/com/clickhouse/jdbc/ResultSetImpl.java b/jdbc-v2/src/main/java/com/clickhouse/jdbc/ResultSetImpl.java index 5e51f4533..f1e356f9b 100644 --- a/jdbc-v2/src/main/java/com/clickhouse/jdbc/ResultSetImpl.java +++ b/jdbc-v2/src/main/java/com/clickhouse/jdbc/ResultSetImpl.java @@ -469,7 +469,7 @@ public Object getObject(String columnLabel) throws SQLException { public int findColumn(String columnLabel) throws SQLException { checkClosed(); try { - return reader.getSchema().getColumnByName(columnLabel).getColumnIndex(); + return reader.getSchema().nameToColumnIndex(columnLabel); } catch (Exception e) { throw ExceptionUtils.toSqlState(String.format("Method: findColumn(\"%s\") encountered an exception.", columnLabel), String.format("SQL: [%s]", parentStatement.getLastStatementSql()), e); } diff --git a/jdbc-v2/src/test/java/com/clickhouse/jdbc/ResultSetImplTest.java b/jdbc-v2/src/test/java/com/clickhouse/jdbc/ResultSetImplTest.java new file mode 100644 index 000000000..ebdc94a3b --- /dev/null +++ b/jdbc-v2/src/test/java/com/clickhouse/jdbc/ResultSetImplTest.java @@ -0,0 +1,38 @@ +package com.clickhouse.jdbc; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import org.testng.annotations.Test; + +public class ResultSetImplTest extends JdbcIntegrationTest { + + @Test(groups = "integration") + public void shouldReturnColumnIndex() throws SQLException { + runQuery("CREATE TABLE rs_test_data (id UInt32, val UInt8) ENGINE = MergeTree ORDER BY (id)"); + runQuery("INSERT INTO rs_test_data VALUES (1, 10), (2, 20)"); + + try (Connection conn = getJdbcConnection()) { + try (Statement stmt = conn.createStatement()) { + try (ResultSet rs = stmt.executeQuery("SELECT * FROM rs_test_data ORDER BY id")) { + assertTrue(rs.next()); + assertEquals(rs.findColumn("id"), 1); + assertEquals(rs.getInt(1), 1); + assertEquals(rs.findColumn("val"), 2); + assertEquals(rs.getInt(2), 10); + + assertTrue(rs.next()); + assertEquals(rs.findColumn("id"), 1); + assertEquals(rs.getInt(1), 2); + assertEquals(rs.findColumn("val"), 2); + assertEquals(rs.getInt(2), 20); + } + } + } + } +}