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,


Reply via email to