Skip to content

Commit 20376cc

Browse files
committed
Handling for columns renamed in queries
1 parent 4d892c4 commit 20376cc

File tree

7 files changed

+50
-12
lines changed

7 files changed

+50
-12
lines changed

vertx-db2-client/src/main/java/io/vertx/db2client/impl/DB2RowImpl.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,12 @@ public int getColumnIndex(String name) {
9494
if (name == null) {
9595
throw new NullPointerException();
9696
}
97-
return rowDesc.columnNames().indexOf(name.toUpperCase()); // DB2 column names are always in uppercase
97+
int idx = rowDesc.columnIndex(name);
98+
if (idx >= 0) {
99+
return idx;
100+
}
101+
// Unless the column is renamed in the SQL query, the column name will be uppercase
102+
return rowDesc.columnIndex(name.toUpperCase());
98103
}
99104

100105
@Override

vertx-db2-client/src/main/java/io/vertx/db2client/impl/codec/DB2Decoder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ private int computeLength(ByteBuf in) {
6161
dssContinues &= (in.getByte(ridx + index + 3) & 0x40) == 0x40;
6262
else
6363
dssContinues = false;
64-
short dssLen = in.getShort(ridx + index);
64+
short dssLen = 11; // minimum length of DRDA message
65+
if (readableBytes >= index + 2)
66+
dssLen = in.getShort(ridx + index);
6567
index += dssLen;
6668
}
6769
return index;

vertx-db2-client/src/main/java/io/vertx/db2client/impl/drda/ColumnMetaData.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ public List<String> getColumnNames() {
117117
public String getColumnName(int i) {
118118
if (i < 0)
119119
throw new IllegalArgumentException("Requested column name for negative index: " + i);
120-
// Prefer column names from SQLDXGRP if set
121-
if (sqlxName_ != null && i < sqlxName_.length && sqlxName_[i] != null)
122-
return sqlxName_[i];
123-
// Otherwise use column names from SQLDOPTGRP
124-
if (sqlName_ != null && i < sqlName_.length)
120+
// Prefer column names from SQLDOPTGRP if set
121+
if (sqlName_ != null && i < sqlName_.length && sqlName_[i] != null)
125122
return sqlName_[i];
123+
// Otherwise use column names from SQLDXGRP
124+
if (sqlxName_ != null && i < sqlxName_.length)
125+
return sqlxName_[i];
126126
return null;
127127
}
128128

vertx-db2-client/src/main/java/io/vertx/db2client/impl/drda/DRDAQueryResponse.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,7 @@ public void readEndOpenQuery() {
11391139
if (peekCP == CodePoint.ENDQRYRM) {
11401140
parseEndQuery(/*netResultSet*/);
11411141
}
1142-
1142+
11431143
completeOpenQuery(sqlca);
11441144

11451145
endOfSameIdChainData();
@@ -1654,6 +1654,11 @@ void parseEndQuery(/*ResultSetCallbackInterface resultSetI*/) {
16541654
parseTypdefsOrMgrlvlovrs();
16551655
NetSqlca netSqlca = parseSQLCARD(null);
16561656
cursor.setAllRowsReceivedFromServer(true);
1657+
1658+
int peekCP = peekCodePoint();
1659+
if (peekCP == CodePoint.RDBUPDRM) {
1660+
parseRDBUPDRM();
1661+
}
16571662
}
16581663

16591664
// Also called by NetResultSetReply subclass.

vertx-db2-client/src/test/java/io/vertx/db2client/QueryVariationsTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,29 @@
2020
*/
2121
@RunWith(VertxUnitRunner.class)
2222
public class QueryVariationsTest extends DB2TestBase {
23+
24+
@Test
25+
public void testRenamedColumns(TestContext ctx) {
26+
connect(ctx.asyncAssertSuccess(conn -> {
27+
conn.query("SELECT id AS THE_ID," +
28+
"message AS \"the message\"" +
29+
"FROM immutable " +
30+
"WHERE id = 10").execute(
31+
ctx.asyncAssertSuccess(rowSet -> {
32+
ctx.assertEquals(1, rowSet.size());
33+
ctx.assertEquals(Arrays.asList("THE_ID", "the message"), rowSet.columnsNames());
34+
RowIterator<Row> rows = rowSet.iterator();
35+
ctx.assertTrue(rows.hasNext());
36+
Row row = rows.next();
37+
ctx.assertEquals(10, row.getInteger(0));
38+
ctx.assertEquals(10, row.getInteger("THE_ID"));
39+
ctx.assertEquals("Computers make very fast, very accurate mistakes.", row.getString(1));
40+
ctx.assertEquals("Computers make very fast, very accurate mistakes.", row.getString("the message"));
41+
ctx.assertFalse(rows.hasNext());
42+
conn.close();
43+
}));
44+
}));
45+
}
2346

2447
@Test
2548
public void testSubquery(TestContext ctx) {

vertx-db2-client/src/test/java/io/vertx/db2client/TableJoinTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,21 @@ public void testColumnRename(TestContext ctx) {
2525
conn.query("SELECT immutable.id AS \"IMM ID\"," +
2626
"immutable.message AS IMM_MSG," +
2727
"Fortune.id AS FORT_ID," +
28-
"Fortune.message AS \"FORT ID\" FROM immutable " +
28+
"Fortune.message AS \"fortune msg\" FROM immutable " +
2929
"INNER JOIN Fortune ON (immutable.id + 1) = Fortune.id " +
3030
"WHERE immutable.id=1").execute(
3131
ctx.asyncAssertSuccess(rowSet -> {
3232
ctx.assertEquals(1, rowSet.size());
33-
// TODO This is consistent with how JDBC behaves, but we may want to add an API
34-
// to retrieve column labels like JDBC has
35-
ctx.assertEquals(Arrays.asList("ID", "MESSAGE", "ID", "MESSAGE"), rowSet.columnsNames());
33+
ctx.assertEquals(Arrays.asList("IMM ID", "IMM_MSG", "FORT_ID", "fortune msg"), rowSet.columnsNames());
3634
Row row = rowSet.iterator().next();
3735
ctx.assertEquals(1, row.getInteger(0));
36+
ctx.assertEquals(1, row.getInteger("IMM ID"));
3837
ctx.assertEquals("fortune: No such file or directory", row.getString(1));
38+
ctx.assertEquals("fortune: No such file or directory", row.getString("IMM_MSG"));
3939
ctx.assertEquals(2, row.getInteger(2));
40+
ctx.assertEquals(2, row.getInteger("FORT_ID"));
4041
ctx.assertEquals("A computer scientist is someone who fixes things that aren't broken.", row.getString(3));
42+
ctx.assertEquals("A computer scientist is someone who fixes things that aren't broken.", row.getString("fortune msg"));
4143
conn.close();
4244
}));
4345
}));

vertx-db2-client/src/test/java/io/vertx/db2client/junit/DB2Resource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ protected void before() throws Throwable {
7474
.setPassword(get("DB2_PASS"));
7575
}
7676
String jdbcUrl = "jdbc:db2://" + options.getHost() + ":" + options.getPort() + "/" + options.getDatabase();
77+
System.out.println("Initializing DB2 database at: " + jdbcUrl);
7778
try (Connection con = DriverManager.getConnection(jdbcUrl, options.getUser(), options.getPassword())) {
7879
runInitSql(con);
7980
}

0 commit comments

Comments
 (0)