This is an automated email from the ASF dual-hosted git repository.
korlov pushed a commit to branch jdbc_over_thin_sql
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/jdbc_over_thin_sql by this
push:
new cd0e43b90e2 IGNITE-26140 Sql. Jdbc. Add new implementation for
java.sql.ResultSet (adapter for org.apache.ignite.sql.ResultSet). (#6639)
cd0e43b90e2 is described below
commit cd0e43b90e243d9c0e77b6206606d10ae15e656c
Author: Max Zhuravkov <[email protected]>
AuthorDate: Thu Sep 25 15:07:24 2025 +0300
IGNITE-26140 Sql. Jdbc. Add new implementation for java.sql.ResultSet
(adapter for org.apache.ignite.sql.ResultSet). (#6639)
---
.../ignite/internal/jdbc2/JdbcResultSet.java | 46 ++-
.../internal/jdbc/JdbcResultSetBaseSelfTest.java | 336 +++++++++++++++++++++
.../internal/jdbc/JdbcResultSetSelfTest.java | 16 +-
.../internal/jdbc2/JdbcResultSet2SelfTest.java | 11 -
4 files changed, 383 insertions(+), 26 deletions(-)
diff --git
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java
index b1f59cf45e9..85517457fa5 100644
---
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java
+++
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.jdbc2;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
import java.io.InputStream;
@@ -24,6 +25,7 @@ import java.io.Reader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
+import java.nio.ByteBuffer;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
@@ -52,6 +54,7 @@ import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import java.util.function.Supplier;
import org.apache.ignite.internal.jdbc.proto.SqlStateCode;
import org.apache.ignite.internal.lang.IgniteExceptionMapperUtil;
@@ -595,19 +598,48 @@ public class JdbcResultSet implements ResultSet {
/** {@inheritDoc} */
@Override
- public byte[] getBytes(int colIdx) throws SQLException {
- ensureNotClosed();
- ensureHasCurrentRow();
+ public byte @Nullable [] getBytes(String colLb) throws SQLException {
+ int colIdx = findColumn(colLb);
- throw new UnsupportedOperationException();
+ return getBytes(colIdx);
}
/** {@inheritDoc} */
@Override
- public byte[] getBytes(String colLb) throws SQLException {
- int colIdx = findColumn(colLb);
+ public byte @Nullable [] getBytes(int colIdx) throws SQLException {
+ Object val = getValue(colIdx);
- return getBytes(colIdx);
+ if (val == null) {
+ return null;
+ }
+
+ ColumnType columnType = getColumnType(colIdx);
+ switch (columnType) {
+ case BYTE_ARRAY:
+ return (byte[]) val;
+ case INT8:
+ return new byte[]{(byte) val};
+ case INT16:
+ return ByteBuffer.allocate(2).putShort((short) val).array();
+ case INT32:
+ return ByteBuffer.allocate(4).putInt((int) val).array();
+ case INT64:
+ return ByteBuffer.allocate(8).putLong((long) val).array();
+ case FLOAT:
+ return ByteBuffer.allocate(4).putFloat(((float) val)).array();
+ case DOUBLE:
+ return ByteBuffer.allocate(8).putDouble(((double)
val)).array();
+ case STRING:
+ return ((String) val).getBytes(UTF_8);
+ case UUID: {
+ ByteBuffer buf = ByteBuffer.allocate(16);
+ buf.putLong(((UUID) val).getMostSignificantBits());
+ buf.putLong(((UUID) val).getLeastSignificantBits());
+ return buf.array();
+ }
+ default:
+ throw conversionError("byte[]", val);
+ }
}
/** {@inheritDoc} */
diff --git
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetBaseSelfTest.java
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetBaseSelfTest.java
index 5347a1b8413..061e917fcf7 100644
---
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetBaseSelfTest.java
+++
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetBaseSelfTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.jdbc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.any;
import static org.hamcrest.Matchers.containsString;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -31,6 +32,8 @@ import java.io.Reader;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
@@ -63,6 +66,7 @@ import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.apache.ignite.internal.jdbc.proto.SqlStateCode;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.util.StringUtils;
import org.apache.ignite.sql.ColumnType;
import org.jetbrains.annotations.Nullable;
import org.junit.jupiter.api.Test;
@@ -162,6 +166,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ expectSqlConversionError(() -> rs.getBytes(1), "byte[]");
+ expectSqlConversionError(() -> rs.getBytes("C"), "byte[]");
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -209,6 +216,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getObject(1, String.class));
assertEquals(strVal, rs.getObject("C", String.class));
+ expectSqlConversionError(() -> rs.getObject(1, byte[].class),
"byte[]");
+ expectSqlConversionError(() -> rs.getObject("C", byte[].class),
"byte[]");
+
expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
@@ -271,6 +281,7 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
BigDecimal decimalVal = BigDecimal.valueOf(value);
BigDecimal decimalScaledVal =
BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP);
String strVal = String.valueOf(value);
+ byte[] bytesVal = {value};
if (value == 0) {
assertFalse(rs.getBoolean(1));
@@ -312,6 +323,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -359,6 +373,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getObject(1, String.class));
assertEquals(strVal, rs.getObject("C", String.class));
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
@@ -494,6 +511,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
BigDecimal decimalVal = BigDecimal.valueOf(value);
BigDecimal decimalScaledVal =
BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP);
String strVal = String.valueOf(value);
+ byte[] bytesVal = ByteBuffer.allocate(2)
+ .putShort(value)
+ .array();
if (value == 0) {
assertFalse(rs.getBoolean(1));
@@ -537,6 +557,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -586,6 +609,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getObject(1, String.class));
assertEquals(strVal, rs.getObject("C", String.class));
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
@@ -723,6 +749,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
BigDecimal decimalVal = BigDecimal.valueOf(value);
BigDecimal decimalScaledVal =
BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP);
String strVal = String.valueOf(value);
+ byte[] bytesVal = ByteBuffer.allocate(4)
+ .putInt(value)
+ .array();
if (value == 0) {
assertFalse(rs.getBoolean(1));
@@ -768,6 +797,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -954,6 +989,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
BigDecimal decimalVal = BigDecimal.valueOf(value);
BigDecimal decimalScaledVal =
BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP);
String strVal = String.valueOf(value);
+ byte[] bytesVal = ByteBuffer.allocate(8)
+ .putLong(value)
+ .array();
if (value == 0) {
assertFalse(rs.getBoolean(1));
@@ -1001,6 +1039,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -1188,6 +1232,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
BigDecimal decimalVal = new BigDecimal(value);
BigDecimal decimalScaledVal = new BigDecimal(value).setScale(2,
RoundingMode.HALF_UP);
String strVal = String.valueOf(value);
+ byte[] bytesVal = ByteBuffer.allocate(4)
+ .putFloat(value)
+ .array();
expectSqlConversionError(() -> rs.getBoolean(1), "boolean");
expectSqlConversionError(() -> rs.getBoolean("C"), "boolean");
@@ -1232,6 +1279,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -1401,6 +1454,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
BigDecimal decimalVal = new BigDecimal(value);
BigDecimal decimalScaledVal = new BigDecimal(value).setScale(2,
RoundingMode.HALF_UP);
String strVal = String.valueOf(value);
+ byte[] bytesVal = ByteBuffer.allocate(8)
+ .putDouble(value)
+ .array();
expectSqlConversionError(() -> rs.getBoolean(1), "boolean");
expectSqlConversionError(() -> rs.getBoolean("C"), "boolean");
@@ -1447,6 +1503,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -1671,6 +1733,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ expectSqlConversionError(() -> rs.getBytes(1), "byte[]");
+ expectSqlConversionError(() -> rs.getBytes("C"), "byte[]");
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -1717,6 +1782,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getObject(1, String.class));
assertEquals(strVal, rs.getObject("C", String.class));
+ expectSqlConversionError(() -> rs.getObject(1, byte[].class),
"byte[]");
+ expectSqlConversionError(() -> rs.getObject("C", byte[].class),
"byte[]");
+
expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
@@ -1966,6 +2034,8 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
try (ResultSet rs = createSingleRow(new ColumnDefinition("C",
ColumnType.STRING, 0, 0, false), value)) {
assertTrue(rs.next());
+ byte[] bytesVal = value.getBytes(StandardCharsets.UTF_8);
+
expectSqlConversionError(() -> rs.getBoolean(1), "boolean");
expectSqlConversionError(() -> rs.getBoolean("C"), "boolean");
@@ -2001,6 +2071,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(value, rs.getNString(1));
assertEquals(value, rs.getNString("C"));
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
expectSqlConversionError(() -> rs.getDate(1), "date");
expectSqlConversionError(() -> rs.getDate("C"), "date");
@@ -2045,6 +2118,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(value, rs.getObject(1, String.class));
assertEquals(value, rs.getObject("C", String.class));
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
@@ -2053,9 +2129,127 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
expectSqlConversionError(() -> rs.getObject(1, Timestamp.class),
"timestamp");
expectSqlConversionError(() -> rs.getObject("C", Timestamp.class),
"timestamp");
+
+ expectSqlConversionError(() -> rs.getObject(1, UUID.class),
"java.util.UUID");
+ expectSqlConversionError(() -> rs.getObject("C", UUID.class),
"java.util.UUID");
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("getBytesValues")
+ public void getBytes(byte[] value) throws SQLException {
+ try (ResultSet rs = createSingleRow(new ColumnDefinition("C",
ColumnType.BYTE_ARRAY, 0, 0, false), value)) {
+ assertTrue(rs.next());
+
+ String strVal = StringUtils.toHexString(value);
+
+ expectSqlConversionError(() -> rs.getBoolean(1), "boolean");
+ expectSqlConversionError(() -> rs.getBoolean("C"), "boolean");
+
+ expectSqlConversionError(() -> rs.getByte(1), "byte");
+ expectSqlConversionError(() -> rs.getByte("C"), "byte");
+
+ expectSqlConversionError(() -> rs.getShort(1), "short");
+ expectSqlConversionError(() -> rs.getShort("C"), "short");
+
+ expectSqlConversionError(() -> rs.getInt(1), "int");
+ expectSqlConversionError(() -> rs.getInt("C"), "int");
+
+ expectSqlConversionError(() -> rs.getLong(1), "long");
+ expectSqlConversionError(() -> rs.getLong("C"), "long");
+
+ expectSqlConversionError(() -> rs.getFloat(1), "float");
+ expectSqlConversionError(() -> rs.getFloat("C"), "float");
+
+ expectSqlConversionError(() -> rs.getDouble(1), "double");
+ expectSqlConversionError(() -> rs.getDouble("C"), "double");
+
+ expectSqlConversionError(() -> rs.getBigDecimal(1), "BigDecimal");
+ expectSqlConversionError(() -> rs.getBigDecimal("C"),
"BigDecimal");
+
+ //noinspection deprecation
+ expectSqlConversionError(() -> rs.getBigDecimal(1, 2),
"BigDecimal");
+ //noinspection deprecation
+ expectSqlConversionError(() -> rs.getBigDecimal("C", 4),
"BigDecimal");
+
+ assertEquals(strVal, rs.getString(1));
+ assertEquals(strVal, rs.getString("C"));
+
+ assertEquals(strVal, rs.getNString(1));
+ assertEquals(strVal, rs.getNString("C"));
+
+ assertArrayEquals(value, rs.getBytes(1));
+ assertArrayEquals(value, rs.getBytes("C"));
+
+ expectSqlConversionError(() -> rs.getDate(1), "date");
+ expectSqlConversionError(() -> rs.getDate("C"), "date");
+
+ expectSqlConversionError(() -> rs.getTime(1), "time");
+ expectSqlConversionError(() -> rs.getTime("C"), "time");
+
+ expectSqlConversionError(() -> rs.getTimestamp(1), "timestamp");
+ expectSqlConversionError(() -> rs.getTimestamp("C"), "timestamp");
+
+ expectSqlConversionError(() -> rs.getDate(1,
Calendar.getInstance()), "date");
+ expectSqlConversionError(() -> rs.getDate("C",
Calendar.getInstance()), "date");
+
+ expectSqlConversionError(() -> rs.getTime(1,
Calendar.getInstance()), "time");
+ expectSqlConversionError(() -> rs.getTime("C",
Calendar.getInstance()), "time");
+
+ expectSqlConversionError(() -> rs.getTimestamp(1,
Calendar.getInstance()), "timestamp");
+ expectSqlConversionError(() -> rs.getTimestamp("C",
Calendar.getInstance()), "timestamp");
+
+ // getObject
+
+ assertEquals(value, rs.getObject(1));
+ assertEquals(value, rs.getObject("C"));
+
+ expectSqlConversionError(() -> rs.getObject(1, Boolean.class),
"boolean");
+ expectSqlConversionError(() -> rs.getObject("C", Boolean.class),
"boolean");
+
+ expectSqlConversionError(() -> rs.getObject(1, Byte.class),
"byte");
+ expectSqlConversionError(() -> rs.getObject("C", Byte.class),
"byte");
+
+ expectSqlConversionError(() -> rs.getObject(1, Short.class),
"short");
+ expectSqlConversionError(() -> rs.getObject("C", Short.class),
"short");
+
+ expectSqlConversionError(() -> rs.getObject(1, Integer.class),
"int");
+ expectSqlConversionError(() -> rs.getObject("C", Integer.class),
"int");
+
+ expectSqlConversionError(() -> rs.getObject(1, Long.class),
"long");
+ expectSqlConversionError(() -> rs.getObject("C", Long.class),
"long");
+
+ expectSqlConversionError(() -> rs.getObject(1, BigDecimal.class),
"BigDecimal");
+ expectSqlConversionError(() -> rs.getObject("C",
BigDecimal.class), "BigDecimal");
+
+ assertEquals(strVal, rs.getObject(1, String.class));
+ assertEquals(strVal, rs.getObject("C", String.class));
+
+ assertArrayEquals(value, rs.getObject(1, byte[].class));
+ assertArrayEquals(value, rs.getObject("C", byte[].class));
+
+ expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
+ expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
+
+ expectSqlConversionError(() -> rs.getObject(1, Time.class),
"time");
+ expectSqlConversionError(() -> rs.getObject("C", Time.class),
"time");
+
+ expectSqlConversionError(() -> rs.getObject(1, Timestamp.class),
"timestamp");
+ expectSqlConversionError(() -> rs.getObject("C", Timestamp.class),
"timestamp");
+
+ expectSqlConversionError(() -> rs.getObject(1, UUID.class),
"java.util.UUID");
+ expectSqlConversionError(() -> rs.getObject("C", UUID.class),
"java.util.UUID");
}
}
+ private static Stream<byte[]> getBytesValues() {
+ return Stream.of(
+ new byte[0],
+ new byte[]{1, 2, 3, 4},
+ "hello, world".getBytes(StandardCharsets.UTF_8)
+ );
+ }
+
@ParameterizedTest
@MethodSource("getDateValues")
public void getDate(LocalDate value) throws SQLException {
@@ -2099,6 +2293,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ expectSqlConversionError(() -> rs.getBytes(1), "byte[]");
+ expectSqlConversionError(() -> rs.getBytes("C"), "byte[]");
+
assertEquals(Date.valueOf(value), rs.getDate(1));
assertEquals(Date.valueOf(value), rs.getDate("C"));
@@ -2137,6 +2334,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
expectSqlConversionError(() -> rs.getObject(1, BigDecimal.class),
"BigDecimal");
expectSqlConversionError(() -> rs.getObject("C",
BigDecimal.class), "BigDecimal");
+ assertEquals(strVal, rs.getObject(1, String.class));
+ assertEquals(strVal, rs.getObject("C", String.class));
+
+ expectSqlConversionError(() -> rs.getObject(1, byte[].class),
"byte[]");
+ expectSqlConversionError(() -> rs.getObject("C", byte[].class),
"byte[]");
+
assertEquals(Date.valueOf(value), rs.getObject(1, Date.class));
assertEquals(Date.valueOf(value), rs.getObject("C", Date.class));
@@ -2276,6 +2479,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ expectSqlConversionError(() -> rs.getBytes(1), "byte[]");
+ expectSqlConversionError(() -> rs.getBytes("C"), "byte[]");
+
assertEquals(LocalDate.of(1970, 1, 1),
rs.getDate(1).toLocalDate());
assertEquals(LocalDate.of(1970, 1, 1),
rs.getDate("C").toLocalDate());
@@ -2316,6 +2522,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
expectSqlConversionError(() -> rs.getObject(1, BigDecimal.class),
"BigDecimal");
expectSqlConversionError(() -> rs.getObject("C",
BigDecimal.class), "BigDecimal");
+ assertEquals(strVal, rs.getObject(1, String.class));
+ assertEquals(strVal, rs.getObject("C", String.class));
+
+ expectSqlConversionError(() -> rs.getObject(1, byte[].class),
"byte[]");
+ expectSqlConversionError(() -> rs.getObject("C", byte[].class),
"byte[]");
+
assertEquals(LocalDate.of(1970, 1, 1), rs.getObject(1,
Date.class).toLocalDate());
assertEquals(LocalDate.of(1970, 1, 1), rs.getObject("C",
Date.class).toLocalDate());
@@ -2482,6 +2694,9 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
assertEquals(strVal, rs.getNString(1));
assertEquals(strVal, rs.getNString("C"));
+ expectSqlConversionError(() -> rs.getBytes(1), "byte[]");
+ expectSqlConversionError(() -> rs.getBytes("C"), "byte[]");
+
LocalDate date = LocalDate.ofInstant(value, zoneId);
assertEquals(date, rs.getDate(1).toLocalDate());
assertEquals(date, rs.getDate("C").toLocalDate());
@@ -2523,6 +2738,12 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
expectSqlConversionError(() -> rs.getObject(1, BigDecimal.class),
"BigDecimal");
expectSqlConversionError(() -> rs.getObject("C",
BigDecimal.class), "BigDecimal");
+ assertEquals(strVal, rs.getObject(1, String.class));
+ assertEquals(strVal, rs.getObject("C", String.class));
+
+ expectSqlConversionError(() -> rs.getObject(1, byte[].class),
"byte[]");
+ expectSqlConversionError(() -> rs.getObject("C", byte[].class),
"byte[]");
+
assertEquals(date, rs.getObject(1, Date.class).toLocalDate());
assertEquals(date, rs.getObject("C", Date.class).toLocalDate());
@@ -2668,6 +2889,121 @@ public abstract class JdbcResultSetBaseSelfTest extends
BaseIgniteAbstractTest {
}
}
+ @ParameterizedTest
+ @MethodSource("getUuidValues")
+ public void getObjectAsUuid(UUID value) throws SQLException {
+ try (ResultSet rs = createSingleRow(new ColumnDefinition("C",
ColumnType.UUID, 0, 0, false), value)) {
+ assertTrue(rs.next());
+
+ String strVal = value.toString();
+ byte[] bytesVal = ByteBuffer.allocate(16)
+ .putLong(value.getMostSignificantBits())
+ .putLong(value.getLeastSignificantBits())
+ .array();
+
+ expectSqlConversionError(() -> rs.getBoolean(1), "boolean");
+ expectSqlConversionError(() -> rs.getBoolean("C"), "boolean");
+
+ expectSqlConversionError(() -> rs.getByte(1), "byte");
+ expectSqlConversionError(() -> rs.getByte("C"), "byte");
+
+ expectSqlConversionError(() -> rs.getShort(1), "short");
+ expectSqlConversionError(() -> rs.getShort("C"), "short");
+
+ expectSqlConversionError(() -> rs.getInt(1), "int");
+ expectSqlConversionError(() -> rs.getInt("C"), "int");
+
+ expectSqlConversionError(() -> rs.getLong(1), "long");
+ expectSqlConversionError(() -> rs.getLong("C"), "long");
+
+ expectSqlConversionError(() -> rs.getFloat(1), "float");
+ expectSqlConversionError(() -> rs.getFloat("C"), "float");
+
+ expectSqlConversionError(() -> rs.getDouble(1), "double");
+ expectSqlConversionError(() -> rs.getDouble("C"), "double");
+
+ expectSqlConversionError(() -> rs.getBigDecimal(1), "BigDecimal");
+ expectSqlConversionError(() -> rs.getBigDecimal("C"),
"BigDecimal");
+
+ //noinspection deprecation
+ expectSqlConversionError(() -> rs.getBigDecimal(1, 2),
"BigDecimal");
+ //noinspection deprecation
+ expectSqlConversionError(() -> rs.getBigDecimal("C", 4),
"BigDecimal");
+
+ assertEquals(strVal, rs.getString(1));
+ assertEquals(strVal, rs.getString("C"));
+
+ assertEquals(strVal, rs.getNString(1));
+ assertEquals(strVal, rs.getNString("C"));
+
+ assertArrayEquals(bytesVal, rs.getBytes(1));
+ assertArrayEquals(bytesVal, rs.getBytes("C"));
+
+ expectSqlConversionError(() -> rs.getDate(1), "date");
+ expectSqlConversionError(() -> rs.getDate("C"), "date");
+
+ expectSqlConversionError(() -> rs.getDate(1,
Calendar.getInstance()), "date");
+ expectSqlConversionError(() -> rs.getDate("C",
Calendar.getInstance()), "date");
+
+ expectSqlConversionError(() -> rs.getTime(1), "time");
+ expectSqlConversionError(() -> rs.getTime("C"), "time");
+
+ expectSqlConversionError(() -> rs.getTime(1,
Calendar.getInstance()), "time");
+ expectSqlConversionError(() -> rs.getTime("C",
Calendar.getInstance()), "time");
+
+ expectSqlConversionError(() -> rs.getTimestamp(1), "timestamp");
+ expectSqlConversionError(() -> rs.getTimestamp("C"), "timestamp");
+
+ expectSqlConversionError(() -> rs.getTimestamp(1,
Calendar.getInstance()), "timestamp");
+ expectSqlConversionError(() -> rs.getTimestamp("C",
Calendar.getInstance()), "timestamp");
+
+ // getObject
+
+ expectSqlConversionError(() -> rs.getObject(1, Boolean.class),
"boolean");
+ expectSqlConversionError(() -> rs.getObject("C", Boolean.class),
"boolean");
+
+ expectSqlConversionError(() -> rs.getObject(1, Byte.class),
"byte");
+ expectSqlConversionError(() -> rs.getObject("C", Byte.class),
"byte");
+
+ expectSqlConversionError(() -> rs.getObject(1, Short.class),
"short");
+ expectSqlConversionError(() -> rs.getObject("C", Short.class),
"short");
+
+ expectSqlConversionError(() -> rs.getObject(1, Integer.class),
"int");
+ expectSqlConversionError(() -> rs.getObject("C", Integer.class),
"int");
+
+ expectSqlConversionError(() -> rs.getObject(1, Long.class),
"long");
+ expectSqlConversionError(() -> rs.getObject("C", Long.class),
"long");
+
+ expectSqlConversionError(() -> rs.getObject(1, BigDecimal.class),
"BigDecimal");
+ expectSqlConversionError(() -> rs.getObject("C",
BigDecimal.class), "BigDecimal");
+
+ assertEquals(strVal, rs.getObject(1, String.class));
+ assertEquals(strVal, rs.getObject("C", String.class));
+
+ assertArrayEquals(bytesVal, rs.getObject(1, byte[].class));
+ assertArrayEquals(bytesVal, rs.getObject("C", byte[].class));
+
+ expectSqlConversionError(() -> rs.getObject(1, Date.class),
"date");
+ expectSqlConversionError(() -> rs.getObject("C", Date.class),
"date");
+
+ expectSqlConversionError(() -> rs.getObject(1, Time.class),
"time");
+ expectSqlConversionError(() -> rs.getObject("C", Time.class),
"time");
+
+ expectSqlConversionError(() -> rs.getObject(1, Timestamp.class),
"timestamp");
+ expectSqlConversionError(() -> rs.getObject("C", Timestamp.class),
"timestamp");
+
+ assertEquals(value, rs.getObject(1, UUID.class));
+ assertEquals(value, rs.getObject("C", UUID.class));
+ }
+ }
+
+ private static Stream<UUID> getUuidValues() {
+ return Stream.of(
+ new UUID(0, 0),
+ UUID.randomUUID()
+ );
+ }
+
@Test
public void getNotSupportedTypes() throws SQLException {
try (ResultSet rs = createSingleRow(new ColumnDefinition("C",
ColumnType.STRING, 3, 0, false), "ABC")) {
diff --git
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetSelfTest.java
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetSelfTest.java
index 7157462549b..7ebb486ec2a 100644
---
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetSelfTest.java
+++
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc/JdbcResultSetSelfTest.java
@@ -64,56 +64,56 @@ public class JdbcResultSetSelfTest extends
JdbcResultSetBaseSelfTest {
}
// findColumn has bugs in the current JDBC driver it is not worth fixing
them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void findColumn() throws SQLException {
super.navigationMethods();
}
// isAfterLast has bugs in the current JDBC driver it is not worth fixing
them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void navigationMethods() throws SQLException {
super.navigationMethods();
}
// getByte does not have range checks in the current JDBC driver it is not
worth fixing them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void getByteFromNumber(boolean valid, Number value) throws
SQLException {
super.getByteFromNumber(valid, value);
}
// getShort does not have range checks in the current JDBC driver it is
not worth fixing them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void getShortFromNumber(boolean valid, Number value) throws
SQLException {
super.getShortFromNumber(valid, value);
}
// getInt does not have range checks in the current JDBC driver it is not
worth fixing them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void getIntFromNumber(boolean valid, Number value) throws
SQLException {
super.getLongFromNumber(valid, value);
}
// getLong does not have range checks in the current JDBC driver it is
not worth fixing them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void getLongFromNumber(boolean valid, Number value) throws
SQLException {
super.getLongFromNumber(valid, value);
}
// getFloat does not have range checks in the current JDBC driver it is
not worth fixing them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void getFloatFromNumber(boolean valid, Number value) throws
SQLException {
super.getFloatFromNumber(valid, value);
}
// getDouble does not have range checks in the current JDBC driver it is
not worth fixing them
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
+ @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145")
@Override
public void getDoubleFromNumber(boolean valid, Number value) throws
SQLException {
super.getDoubleFromNumber(valid, value);
diff --git
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSet2SelfTest.java
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSet2SelfTest.java
index 182bf1e8c22..1e9035f60e4 100644
---
a/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSet2SelfTest.java
+++
b/modules/jdbc/src/test/java/org/apache/ignite/internal/jdbc2/JdbcResultSet2SelfTest.java
@@ -63,7 +63,6 @@ import org.apache.ignite.sql.ResultSetMetadata;
import org.apache.ignite.sql.SqlRow;
import org.apache.ignite.table.Tuple;
import org.jetbrains.annotations.Nullable;
-import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
@@ -75,8 +74,6 @@ import org.mockito.internal.stubbing.answers.ThrowsException;
*/
public class JdbcResultSet2SelfTest extends JdbcResultSetBaseSelfTest {
- // getBytes is not implemented yet
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
@Override
@ParameterizedTest
@EnumSource(names = {"PERIOD", "DURATION"}, mode = EnumSource.Mode.EXCLUDE)
@@ -84,8 +81,6 @@ public class JdbcResultSet2SelfTest extends
JdbcResultSetBaseSelfTest {
super.wasNullPositional(columnType);
}
- // getBytes is not implemented yet
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-26140")
@Override
@ParameterizedTest
@EnumSource(names = {"PERIOD", "DURATION"}, mode = EnumSource.Mode.EXCLUDE)
@@ -93,12 +88,6 @@ public class JdbcResultSet2SelfTest extends
JdbcResultSetBaseSelfTest {
super.wasNullNamed(columnType);
}
- @Test
- @Override
- public void getUnknownColumn() throws SQLException {
- super.getUnknownColumn();
- }
-
@Test
public void unwrap() throws SQLException {
try (ResultSet rs = createResultSet(null,