Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ public TableSchema(String tableName, String query, String databaseName, Collecti
this.columns = ImmutableList.copyOf(columns);
ImmutableMap.Builder<String, Integer> colIndexMapBuilder = ImmutableMap.builder();
for (int i = 0; i < this.columns.size(); i++) {
ClickHouseColumn column= this.columns.get(i);
ClickHouseColumn column = this.columns.get(i);
if (column.hasDefault()) {
this.hasDefaults = true;
}
colIndexMapBuilder.put(this.columns.get(i).getColumnName(), i);
}
this.colIndex = colIndexMapBuilder.build();
this.colIndex = colIndexMapBuilder.buildKeepingLast();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change addresses the duplicate column names issue by keeping the last occurrence of a column name in the index map. Consider adding a comment explaining this behavior, as it's an important detail for users of this API to understand that when duplicate column names exist, only the last one will be accessible via name-based lookups.

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2215,4 +2215,32 @@ public void testSettingsNotChanged() throws Exception{
Assert.assertEquals(response.getFormat(), ClickHouseFormat.JSONEachRow);
}
}

@Test
public void testDuplicateColumnNames() throws Exception {
{
// simple scenario
List<GenericRecord> records = client.queryAll("SELECT 'a', 'a'");
GenericRecord record = records.get(0);
Assert.assertEquals(record.getString("'a'"), "a");
Assert.assertEquals(record.getString(1), "a");
Assert.assertEquals(record.getString(2), "a");
}

{
client.execute("DROP TABLE IF EXISTS test_duplicate_column_names1").get().close();
client.execute("DROP TABLE IF EXISTS test_duplicate_column_names2").get().close();
client.execute("CREATE TABLE test_duplicate_column_names1 (name String ) ENGINE = MergeTree ORDER BY ()").get().close();
client.execute("INSERT INTO test_duplicate_column_names1 VALUES ('some name')").get().close();
client.execute("CREATE TABLE test_duplicate_column_names2 (name String ) ENGINE = MergeTree ORDER BY ()").get().close();
client.execute("INSERT INTO test_duplicate_column_names2 VALUES ('another name')").get().close();

List<GenericRecord> records = client.queryAll("SELECT * FROM test_duplicate_column_names1, test_duplicate_column_names2");
GenericRecord record = records.get(0);
Assert.assertEquals(record.getString("name"), "some name");
Assert.assertEquals(record.getString("test_duplicate_column_names2.name"), "another name");
Assert.assertEquals(record.getString(1), "some name");
Assert.assertEquals(record.getString(2), "another name");
}
}
}
38 changes: 38 additions & 0 deletions jdbc-v2/src/test/java/com/clickhouse/jdbc/StatementTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
Expand Down Expand Up @@ -1189,6 +1190,43 @@ public void testSetFetchSize() throws Exception {
}
}

@Test(groups = {"integration"})
public void testResponseWithDuplicateColumns() throws Exception {
try (Connection conn = getJdbcConnection(); Statement stmt = conn.createStatement()) {


try (ResultSet rs = stmt.executeQuery("SELECT 'a', 'a'")) {
ResultSetMetaData metaData = rs.getMetaData();
Assert.assertEquals(metaData.getColumnCount(), 2);
Assert.assertEquals(metaData.getColumnName(1), "'a'");
Assert.assertEquals(metaData.getColumnName(2), "'a'");
}

{
stmt.execute("DROP TABLE IF EXISTS test_jdbc_duplicate_column_names1");
stmt.execute("DROP TABLE IF EXISTS test_jdbc_duplicate_column_names2");
stmt.execute("CREATE TABLE test_jdbc_duplicate_column_names1 (name String ) ENGINE = MergeTree ORDER BY ()");
stmt.execute("INSERT INTO test_jdbc_duplicate_column_names1 VALUES ('some name')");
stmt.execute("CREATE TABLE test_jdbc_duplicate_column_names2 (name String ) ENGINE = MergeTree ORDER BY ()");
stmt.execute("INSERT INTO test_jdbc_duplicate_column_names2 VALUES ('another name')");

try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_jdbc_duplicate_column_names1, test_jdbc_duplicate_column_names2")) {
ResultSetMetaData metaData = rs.getMetaData();
Assert.assertEquals(metaData.getColumnCount(), 2);
Assert.assertEquals(metaData.getColumnName(1), "name");
Assert.assertEquals(metaData.getColumnName(2), "test_jdbc_duplicate_column_names2.name");

rs.next();
Assert.assertEquals(rs.getString("name"), "some name");
Assert.assertEquals(rs.getString("test_jdbc_duplicate_column_names2.name"), "another name");
Assert.assertEquals(rs.getString(1), "some name");
Assert.assertEquals(rs.getString(2), "another name");

}
}
}
}

private static String getDBName(Statement stmt) throws SQLException {
try (ResultSet rs = stmt.executeQuery("SELECT database()")) {
rs.next();
Expand Down
Loading