Skip to content

Commit 67e8a2b

Browse files
authored
Merge pull request #2618 from ClickHouse/fix_duplicate_columns_problem
[JDBC-V2, Client-V2] fixes problem with duplicate column names
2 parents 252bf42 + f08a186 commit 67e8a2b

File tree

3 files changed

+68
-2
lines changed

3 files changed

+68
-2
lines changed

client-v2/src/main/java/com/clickhouse/client/api/metadata/TableSchema.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ public TableSchema(String tableName, String query, String databaseName, Collecti
3232
this.columns = ImmutableList.copyOf(columns);
3333
ImmutableMap.Builder<String, Integer> colIndexMapBuilder = ImmutableMap.builder();
3434
for (int i = 0; i < this.columns.size(); i++) {
35-
ClickHouseColumn column= this.columns.get(i);
35+
ClickHouseColumn column = this.columns.get(i);
3636
if (column.hasDefault()) {
3737
this.hasDefaults = true;
3838
}
3939
colIndexMapBuilder.put(this.columns.get(i).getColumnName(), i);
4040
}
41-
this.colIndex = colIndexMapBuilder.build();
41+
this.colIndex = colIndexMapBuilder.buildKeepingLast();
4242
}
4343

4444
/**

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,4 +2215,32 @@ public void testSettingsNotChanged() throws Exception{
22152215
Assert.assertEquals(response.getFormat(), ClickHouseFormat.JSONEachRow);
22162216
}
22172217
}
2218+
2219+
@Test
2220+
public void testDuplicateColumnNames() throws Exception {
2221+
{
2222+
// simple scenario
2223+
List<GenericRecord> records = client.queryAll("SELECT 'a', 'a'");
2224+
GenericRecord record = records.get(0);
2225+
Assert.assertEquals(record.getString("'a'"), "a");
2226+
Assert.assertEquals(record.getString(1), "a");
2227+
Assert.assertEquals(record.getString(2), "a");
2228+
}
2229+
2230+
{
2231+
client.execute("DROP TABLE IF EXISTS test_duplicate_column_names1").get().close();
2232+
client.execute("DROP TABLE IF EXISTS test_duplicate_column_names2").get().close();
2233+
client.execute("CREATE TABLE test_duplicate_column_names1 (name String ) ENGINE = MergeTree ORDER BY ()").get().close();
2234+
client.execute("INSERT INTO test_duplicate_column_names1 VALUES ('some name')").get().close();
2235+
client.execute("CREATE TABLE test_duplicate_column_names2 (name String ) ENGINE = MergeTree ORDER BY ()").get().close();
2236+
client.execute("INSERT INTO test_duplicate_column_names2 VALUES ('another name')").get().close();
2237+
2238+
List<GenericRecord> records = client.queryAll("SELECT * FROM test_duplicate_column_names1, test_duplicate_column_names2");
2239+
GenericRecord record = records.get(0);
2240+
Assert.assertEquals(record.getString("name"), "some name");
2241+
Assert.assertEquals(record.getString("test_duplicate_column_names2.name"), "another name");
2242+
Assert.assertEquals(record.getString(1), "some name");
2243+
Assert.assertEquals(record.getString(2), "another name");
2244+
}
2245+
}
22182246
}

jdbc-v2/src/test/java/com/clickhouse/jdbc/StatementTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.sql.Connection;
1616
import java.sql.Date;
1717
import java.sql.ResultSet;
18+
import java.sql.ResultSetMetaData;
1819
import java.sql.SQLException;
1920
import java.sql.Statement;
2021
import java.time.LocalDate;
@@ -1189,6 +1190,43 @@ public void testSetFetchSize() throws Exception {
11891190
}
11901191
}
11911192

1193+
@Test(groups = {"integration"})
1194+
public void testResponseWithDuplicateColumns() throws Exception {
1195+
try (Connection conn = getJdbcConnection(); Statement stmt = conn.createStatement()) {
1196+
1197+
1198+
try (ResultSet rs = stmt.executeQuery("SELECT 'a', 'a'")) {
1199+
ResultSetMetaData metaData = rs.getMetaData();
1200+
Assert.assertEquals(metaData.getColumnCount(), 2);
1201+
Assert.assertEquals(metaData.getColumnName(1), "'a'");
1202+
Assert.assertEquals(metaData.getColumnName(2), "'a'");
1203+
}
1204+
1205+
{
1206+
stmt.execute("DROP TABLE IF EXISTS test_jdbc_duplicate_column_names1");
1207+
stmt.execute("DROP TABLE IF EXISTS test_jdbc_duplicate_column_names2");
1208+
stmt.execute("CREATE TABLE test_jdbc_duplicate_column_names1 (name String ) ENGINE = MergeTree ORDER BY ()");
1209+
stmt.execute("INSERT INTO test_jdbc_duplicate_column_names1 VALUES ('some name')");
1210+
stmt.execute("CREATE TABLE test_jdbc_duplicate_column_names2 (name String ) ENGINE = MergeTree ORDER BY ()");
1211+
stmt.execute("INSERT INTO test_jdbc_duplicate_column_names2 VALUES ('another name')");
1212+
1213+
try (ResultSet rs = stmt.executeQuery("SELECT * FROM test_jdbc_duplicate_column_names1, test_jdbc_duplicate_column_names2")) {
1214+
ResultSetMetaData metaData = rs.getMetaData();
1215+
Assert.assertEquals(metaData.getColumnCount(), 2);
1216+
Assert.assertEquals(metaData.getColumnName(1), "name");
1217+
Assert.assertEquals(metaData.getColumnName(2), "test_jdbc_duplicate_column_names2.name");
1218+
1219+
rs.next();
1220+
Assert.assertEquals(rs.getString("name"), "some name");
1221+
Assert.assertEquals(rs.getString("test_jdbc_duplicate_column_names2.name"), "another name");
1222+
Assert.assertEquals(rs.getString(1), "some name");
1223+
Assert.assertEquals(rs.getString(2), "another name");
1224+
1225+
}
1226+
}
1227+
}
1228+
}
1229+
11921230
private static String getDBName(Statement stmt) throws SQLException {
11931231
try (ResultSet rs = stmt.executeQuery("SELECT database()")) {
11941232
rs.next();

0 commit comments

Comments
 (0)