Skip to content

Commit adbf505

Browse files
authored
SqlResult columnDescriptor is always empty for Oracle (#1069)
Fixes #1068 The client must create RowDesc from ResultSet metadata (when possible). Signed-off-by: Thomas Segismont <tsegismont@gmail.com>
1 parent d03d098 commit adbf505

File tree

3 files changed

+71
-43
lines changed

3 files changed

+71
-43
lines changed

vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/OracleColumnDesc.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,16 @@ public static RowDesc rowDesc(ResultSetMetaData metaData) throws SQLException {
3939
public OracleColumnDesc(ResultSetMetaData md, int idx) throws SQLException {
4040
this.name = md.getColumnLabel(idx);
4141
this.typeName = md.getColumnTypeName(idx);
42-
this.type = JDBCType.valueOf(md.getColumnType(idx));
42+
this.type = find(md.getColumnType(idx));
43+
}
44+
45+
private static JDBCType find(int vendorTypeNumber) {
46+
for (JDBCType jdbcType : JDBCType.values()) {
47+
if (jdbcType.getVendorTypeNumber() == vendorTypeNumber) {
48+
return jdbcType;
49+
}
50+
}
51+
return JDBCType.OTHER;
4352
}
4453

4554
@Override
@@ -49,7 +58,7 @@ public String name() {
4958

5059
@Override
5160
public boolean isArray() {
52-
return false;
61+
return type == JDBCType.ARRAY;
5362
}
5463

5564
@Override

vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/commands/QueryCommand.java

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
import io.vertx.core.json.JsonArray;
1616
import io.vertx.oracleclient.OracleConnectOptions;
1717
import io.vertx.oracleclient.OraclePrepareOptions;
18+
import io.vertx.oracleclient.impl.OracleColumnDesc;
1819
import io.vertx.oracleclient.impl.OracleRow;
19-
import io.vertx.sqlclient.PrepareOptions;
2020
import io.vertx.sqlclient.Row;
2121
import io.vertx.sqlclient.Tuple;
2222
import io.vertx.sqlclient.impl.RowDesc;
@@ -25,9 +25,6 @@
2525
import java.math.BigDecimal;
2626
import java.sql.*;
2727
import java.time.ZoneOffset;
28-
import java.util.ArrayList;
29-
import java.util.Collections;
30-
import java.util.List;
3128
import java.util.function.BiConsumer;
3229
import java.util.stream.Collector;
3330

@@ -102,7 +99,7 @@ protected OracleResponse<R> decode(Statement statement, int[] returnedBatchResul
10299

103100
BiConsumer<C, Row> accumulator = collector.accumulator();
104101

105-
RowDesc desc = new RowDesc(Collections.emptyList());
102+
RowDesc desc = RowDesc.EMPTY;
106103
C container = collector.supplier().get();
107104
for (int result : returnedBatchResult) {
108105
Row row = new OracleRow(desc);
@@ -123,19 +120,14 @@ protected OracleResponse<R> decode(Statement statement, int[] returnedBatchResul
123120
private void decodeResultSet(ResultSet rs, OracleResponse<R> response) throws SQLException {
124121
BiConsumer<C, Row> accumulator = collector.accumulator();
125122

126-
List<String> columnNames = new ArrayList<>();
127-
RowDesc desc = new RowDesc(columnNames);
128123
C container = collector.supplier().get();
129124
int size = 0;
130125
ResultSetMetaData metaData = rs.getMetaData();
131-
int cols = metaData.getColumnCount();
132-
for (int i = 1; i <= cols; i++) {
133-
columnNames.add(metaData.getColumnLabel(i));
134-
}
126+
RowDesc desc = OracleColumnDesc.rowDesc(metaData);
135127
while (rs.next()) {
136128
size++;
137129
Row row = new OracleRow(desc);
138-
for (int i = 1; i <= cols; i++) {
130+
for (int i = 1; i <= metaData.getColumnCount(); i++) {
139131
Object res = convertSqlValue(rs.getObject(i));
140132
row.addValue(res);
141133
}
@@ -146,30 +138,6 @@ private void decodeResultSet(ResultSet rs, OracleResponse<R> response) throws SQ
146138
.push(collector.finisher().apply(container), desc, size);
147139
}
148140

149-
private R decodeRawResultSet(ResultSet rs) throws SQLException {
150-
BiConsumer<C, Row> accumulator = collector.accumulator();
151-
152-
List<String> columnNames = new ArrayList<>();
153-
RowDesc desc = new RowDesc(columnNames);
154-
C container = collector.supplier().get();
155-
156-
ResultSetMetaData metaData = rs.getMetaData();
157-
int cols = metaData.getColumnCount();
158-
for (int i = 1; i <= cols; i++) {
159-
columnNames.add(metaData.getColumnLabel(i));
160-
}
161-
while (rs.next()) {
162-
Row row = new OracleRow(desc);
163-
for (int i = 1; i <= cols; i++) {
164-
Object res = convertSqlValue(rs.getObject(i));
165-
row.addValue(res);
166-
}
167-
accumulator.accept(container, row);
168-
}
169-
170-
return collector.finisher().apply(container);
171-
}
172-
173141
private void decodeReturnedKeys(Statement statement, OracleResponse<R> response) throws SQLException {
174142
Row keys = null;
175143

@@ -180,11 +148,7 @@ private void decodeReturnedKeys(Statement statement, OracleResponse<R> response)
180148
if (metaData != null) {
181149
int cols = metaData.getColumnCount();
182150
if (cols > 0) {
183-
List<String> keysColumnNames = new ArrayList<>();
184-
RowDesc keysDesc = new RowDesc(keysColumnNames);
185-
for (int i = 1; i <= cols; i++) {
186-
keysColumnNames.add(metaData.getColumnLabel(i));
187-
}
151+
RowDesc keysDesc = OracleColumnDesc.rowDesc(metaData);
188152

189153
if (keysRS.next()) {
190154
keys = new OracleRow(keysDesc);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) 2011-2021 Contributors to the Eclipse Foundation
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
7+
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
8+
*
9+
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
10+
*/
11+
12+
package io.vertx.oracleclient.test;
13+
14+
import io.vertx.ext.unit.TestContext;
15+
import io.vertx.ext.unit.junit.VertxUnitRunner;
16+
import io.vertx.oracleclient.OraclePool;
17+
import io.vertx.oracleclient.test.junit.OracleRule;
18+
import io.vertx.sqlclient.PoolOptions;
19+
import org.junit.After;
20+
import org.junit.Before;
21+
import org.junit.ClassRule;
22+
import org.junit.Test;
23+
import org.junit.runner.RunWith;
24+
25+
@RunWith(VertxUnitRunner.class)
26+
public class OracleColumnDescriptorTest extends OracleTestBase {
27+
28+
@ClassRule
29+
public static OracleRule oracle = OracleRule.SHARED_INSTANCE;
30+
31+
OraclePool pool;
32+
33+
@Before
34+
public void setUp() throws Exception {
35+
pool = OraclePool.pool(vertx, oracle.options(), new PoolOptions());
36+
}
37+
38+
@Test
39+
public void testMetadata(TestContext ctx) {
40+
pool.withConnection(conn -> conn.query("SELECT id, val FROM mutable").execute(), ctx.asyncAssertSuccess(rows -> {
41+
ctx.assertNotNull(rows.columnDescriptors());
42+
ctx.assertNotNull(rows.columnsNames());
43+
ctx.assertEquals("ID", rows.columnsNames().get(0));
44+
ctx.assertEquals("VAL", rows.columnsNames().get(1));
45+
ctx.assertEquals(2, rows.columnDescriptors().size());
46+
ctx.assertEquals("NUMBER", rows.columnDescriptors().get(0).typeName());
47+
ctx.assertEquals("VARCHAR2", rows.columnDescriptors().get(1).typeName());
48+
}));
49+
}
50+
51+
@After
52+
public void tearDown(TestContext ctx) throws Exception {
53+
pool.close(ctx.asyncAssertSuccess());
54+
}
55+
}

0 commit comments

Comments
 (0)