This is an automated email from the ASF dual-hosted git repository.

ppa pushed a commit to branch ignite-26314
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 1f7cba3cdbc1367a1c0db344df1e506864a7ac1d
Author: Pavel Pereslegin <[email protected]>
AuthorDate: Thu Nov 13 14:51:21 2025 +0300

    IGNITE-26314 Use new ResultSet implementation in JdbcDatabaseMetadata.
---
 .../internal/jdbc/ItJdbcMetadataSelfTest.java      |  25 +-
 .../ignite/internal/jdbc/JdbcDatabaseMetadata.java | 590 +++++++++++----------
 .../internal/jdbc/JdbcDatabaseMetataUtils.java     | 321 +++++++++++
 .../ignite/internal/jdbc2/ClientSyncResultSet.java |   3 +-
 .../ignite/internal/jdbc2/JdbcResultSet.java       |   3 +-
 .../ignite/internal/jdbc2/JdbcStatement2.java      |  14 +-
 6 files changed, 652 insertions(+), 304 deletions(-)

diff --git 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
index 2c95ec8e1c7..01c4c75e9c5 100644
--- 
a/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
+++ 
b/modules/jdbc/src/integrationTest/java/org/apache/ignite/internal/jdbc/ItJdbcMetadataSelfTest.java
@@ -36,10 +36,15 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.StringJoiner;
 import java.util.UUID;
-import org.apache.ignite.internal.jdbc.proto.event.JdbcColumnMeta;
+import org.apache.ignite.internal.jdbc2.JdbcResultSetMetadata;
+import org.apache.ignite.internal.sql.ColumnMetadataImpl;
+import org.apache.ignite.internal.sql.ColumnMetadataImpl.ColumnOriginImpl;
+import org.apache.ignite.internal.sql.ResultSetMetadataImpl;
 import org.apache.ignite.internal.sql.engine.util.SqlTestUtils;
 import org.apache.ignite.internal.type.NativeType;
 import org.apache.ignite.jdbc.AbstractJdbcSelfTest;
+import org.apache.ignite.sql.ColumnMetadata;
+import org.apache.ignite.sql.ColumnMetadata.ColumnOrigin;
 import org.apache.ignite.sql.ColumnType;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
@@ -77,24 +82,27 @@ public class ItJdbcMetadataSelfTest extends 
AbstractJdbcSelfTest {
         try {
             DatabaseMetaData dbMeta = conn.getMetaData();
 
-            List<JdbcColumnMeta> columnsMeta = new ArrayList<>();
+            List<ColumnMetadata> columnsMeta = new ArrayList<>();
             try (ResultSet rs = dbMeta.getColumns(null, "META", "TEST", null)) 
{
                 while (rs.next()) {
-                    JdbcColumnMeta meta = new JdbcColumnMeta(
-                            rs.getString("COLUMN_NAME"),
+                    ColumnOrigin origin = new ColumnOriginImpl(
                             rs.getString("TABLE_SCHEM"),
                             rs.getString("TABLE_NAME"),
+                            rs.getString("COLUMN_NAME")
+                    );
+                    ColumnMetadata meta = new ColumnMetadataImpl(
                             rs.getString("COLUMN_NAME"),
                             dataTypeToColumnType(rs.getInt("DATA_TYPE"), 
rs.getString("TYPE_NAME")),
-                            rs.getShort("COLUMN_SIZE"),
-                            rs.getShort("DECIMAL_DIGITS"),
-                            "YES".equals(rs.getString("IS_NULLABLE"))
+                            rs.getInt("COLUMN_SIZE"),
+                            rs.getInt("DECIMAL_DIGITS"),
+                            "YES".equals(rs.getString("IS_NULLABLE")),
+                            origin
                     );
                     columnsMeta.add(meta);
                 }
             }
 
-            ResultSetMetaData rsMeta = new JdbcResultSetMetadata(columnsMeta);
+            ResultSetMetaData rsMeta = new JdbcResultSetMetadata(new 
ResultSetMetadataImpl(columnsMeta));
             checkMeta(rsMeta);
         } finally {
             stmt.execute("DROP TABLE META.TEST;");
@@ -161,7 +169,6 @@ public class ItJdbcMetadataSelfTest extends 
AbstractJdbcSelfTest {
     }
 
     @Test
-    @Disabled("https://issues.apache.org/jira/browse/IGNITE-26145";)
     public void testResultSetMetaDataColumns() throws Exception {
         createMetaTable();
 
diff --git 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetadata.java
 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetadata.java
index 8a7baea022b..97e99e0bb63 100644
--- 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetadata.java
+++ 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetadata.java
@@ -24,6 +24,7 @@ import static java.sql.ResultSet.TYPE_FORWARD_ONLY;
 import static java.sql.RowIdLifetime.ROWID_UNSUPPORTED;
 import static java.util.Arrays.asList;
 import static java.util.Collections.singletonList;
+import static 
org.apache.ignite.internal.jdbc.JdbcDatabaseMetataUtils.createObjectListResultSet;
 import static 
org.apache.ignite.internal.jdbc.proto.SqlStateCode.CONNECTION_CLOSED;
 
 import java.sql.Connection;
@@ -54,6 +55,7 @@ import 
org.apache.ignite.internal.jdbc.proto.event.JdbcMetaTablesResult;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcPrimaryKeyMeta;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcTableMeta;
 import org.apache.ignite.internal.properties.IgniteProductVersion;
+import org.apache.ignite.internal.sql.ColumnMetadataImpl;
 import org.apache.ignite.sql.ColumnMetadata;
 import org.apache.ignite.sql.ColumnType;
 
@@ -813,22 +815,28 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
         return false;
     }
 
+    private static ColumnMetadata columnMeta(String name, ColumnType type) {
+        return new ColumnMetadataImpl(name, type, -1, -1, true, null);
+    }
+
+
+
     /** {@inheritDoc} */
     @Override
     public ResultSet getProcedures(String catalog, String schemaPtrn,
             String procedureNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("PROCEDURE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("PROCEDURE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("PROCEDURE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("", ColumnType.NULL),
-                new JdbcColumnMeta("", ColumnType.NULL),
-                new JdbcColumnMeta("", ColumnType.NULL),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("PROCEDURE_TYPE", ColumnType.INT16),
-                new JdbcColumnMeta("SPECIFIC_NAME", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("PROCEDURE_CAT", ColumnType.STRING),
+                columnMeta("PROCEDURE_SCHEM", ColumnType.STRING),
+                columnMeta("PROCEDURE_NAME", ColumnType.STRING),
+                columnMeta("", ColumnType.NULL),
+                columnMeta("", ColumnType.NULL),
+                columnMeta("", ColumnType.NULL),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("PROCEDURE_TYPE", ColumnType.INT16),
+                columnMeta("SPECIFIC_NAME", ColumnType.STRING)
         ));
     }
 
@@ -838,27 +846,27 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String colNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("PROCEDURE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("PROCEDURE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("PROCEDURE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_TYPE", ColumnType.INT16),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PRECISION", ColumnType.INT32),
-                new JdbcColumnMeta("LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("SCALE", ColumnType.INT16),
-                new JdbcColumnMeta("RADIX", ColumnType.INT16),
-                new JdbcColumnMeta("NULLABLE", ColumnType.INT16),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_DEF", ColumnType.STRING),
-                new JdbcColumnMeta("SQL_DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("SQL_DATETIME_SUB", ColumnType.INT32),
-                new JdbcColumnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("ORDINAL_POSITION", ColumnType.INT32),
-                new JdbcColumnMeta("IS_NULLABLE", ColumnType.STRING),
-                new JdbcColumnMeta("SPECIFIC_NAME", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("PROCEDURE_CAT", ColumnType.STRING),
+                columnMeta("PROCEDURE_SCHEM", ColumnType.STRING),
+                columnMeta("PROCEDURE_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_TYPE", ColumnType.INT16),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("PRECISION", ColumnType.INT32),
+                columnMeta("LENGTH", ColumnType.INT32),
+                columnMeta("SCALE", ColumnType.INT16),
+                columnMeta("RADIX", ColumnType.INT16),
+                columnMeta("NULLABLE", ColumnType.INT16),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("COLUMN_DEF", ColumnType.STRING),
+                columnMeta("SQL_DATA_TYPE", ColumnType.INT32),
+                columnMeta("SQL_DATETIME_SUB", ColumnType.INT32),
+                columnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
+                columnMeta("ORDINAL_POSITION", ColumnType.INT32),
+                columnMeta("IS_NULLABLE", ColumnType.STRING),
+                columnMeta("SPECIFIC_NAME", ColumnType.STRING)
         ));
     }
 
@@ -868,17 +876,17 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             throws SQLException {
         ensureNotClosed();
 
-        final List<JdbcColumnMeta> meta = asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_TYPE", ColumnType.STRING),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("SELF_REFERENCING_COL_NAME", 
ColumnType.STRING),
-                new JdbcColumnMeta("REF_GENERATION", ColumnType.STRING));
+        List<ColumnMetadata> meta = asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("TABLE_TYPE", ColumnType.STRING),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("TYPE_CAT", ColumnType.STRING),
+                columnMeta("TYPE_SCHEM", ColumnType.STRING),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("SELF_REFERENCING_COL_NAME", ColumnType.STRING),
+                columnMeta("REF_GENERATION", ColumnType.STRING));
 
         boolean tblTypeMatch = false;
 
@@ -895,7 +903,7 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
         }
 
         if (!isValidCatalog(catalog) || !tblTypeMatch) {
-            return new JdbcResultSet(Collections.emptyList(), meta);
+            return createObjectListResultSet(meta);
         }
 
         try {
@@ -912,7 +920,7 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
                 rows.add(tableRow(tblMeta));
             }
 
-            return new JdbcResultSet(rows, meta);
+            return createObjectListResultSet(rows, meta);
         } catch (InterruptedException e) {
             throw new SQLException("Thread was interrupted.", e);
         } catch (ExecutionException e) {
@@ -933,13 +941,13 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getSchemas(String catalog, String schemaPtrn) throws 
SQLException {
         ensureNotClosed();
 
-        List<JdbcColumnMeta> meta = asList(
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_CATALOG", ColumnType.STRING)
+        List<ColumnMetadata> meta = asList(
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_CATALOG", ColumnType.STRING)
         );
 
         if (!isValidCatalog(catalog)) {
-            return new JdbcResultSet(Collections.emptyList(), meta);
+            return createObjectListResultSet(meta);
         }
 
         try {
@@ -960,7 +968,7 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
                 rows.add(row);
             }
 
-            return new JdbcResultSet(rows, meta);
+            return createObjectListResultSet(rows, meta);
         } catch (InterruptedException e) {
             throw new SQLException("Thread was interrupted.", e);
         } catch (ExecutionException e) {
@@ -976,8 +984,8 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getCatalogs() throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(singletonList(singletonList(CATALOG_NAME)),
-                asList(new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING)));
+        return 
createObjectListResultSet(singletonList(singletonList(CATALOG_NAME)),
+                asList(columnMeta("TABLE_CAT", ColumnType.STRING)));
     }
 
     /** {@inheritDoc} */
@@ -986,9 +994,9 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getTableTypes() throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(
+        return createObjectListResultSet(
                 asList(List.of(TYPE_TABLE, TYPE_VIEW)),
-                asList(new JdbcColumnMeta("TABLE_TYPE", ColumnType.STRING)));
+                asList(columnMeta("TABLE_TYPE", ColumnType.STRING)));
     }
 
     /** {@inheritDoc} */
@@ -996,35 +1004,35 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getColumns(String catalog, String schemaPtrn, String 
tblNamePtrn, String colNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        final List<JdbcColumnMeta> meta = asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),      // 1
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),    // 2
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),     // 3
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),    // 4
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT16),       // 5
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),      // 6
-                new JdbcColumnMeta("COLUMN_SIZE", ColumnType.INT32),   // 7
-                new JdbcColumnMeta("BUFFER_LENGTH", ColumnType.INT32), // 8
-                new JdbcColumnMeta("DECIMAL_DIGITS", ColumnType.INT32), // 9
-                new JdbcColumnMeta("NUM_PREC_RADIX", ColumnType.INT16),  // 10
-                new JdbcColumnMeta("NULLABLE", ColumnType.INT16),        // 11
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),        // 12
-                new JdbcColumnMeta("COLUMN_DEF", ColumnType.STRING),     // 13
-                new JdbcColumnMeta("SQL_DATA_TYPE", ColumnType.INT32), // 14
-                new JdbcColumnMeta("SQL_DATETIME_SUB", ColumnType.INT32), // 15
-                new JdbcColumnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32), // 
16
-                new JdbcColumnMeta("ORDINAL_POSITION", ColumnType.INT32), // 17
-                new JdbcColumnMeta("IS_NULLABLE", ColumnType.STRING),    // 18
-                new JdbcColumnMeta("SCOPE_CATLOG", ColumnType.STRING),   // 19
-                new JdbcColumnMeta("SCOPE_SCHEMA", ColumnType.STRING),   // 20
-                new JdbcColumnMeta("SCOPE_TABLE", ColumnType.STRING),    // 21
-                new JdbcColumnMeta("SOURCE_DATA_TYPE", ColumnType.INT16), // 22
-                new JdbcColumnMeta("IS_AUTOINCREMENT", ColumnType.STRING), // 
23
-                new JdbcColumnMeta("IS_GENERATEDCOLUMN", ColumnType.STRING) // 
24
+        List<ColumnMetadata> meta = asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),      // 1
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),    // 2
+                columnMeta("TABLE_NAME", ColumnType.STRING),     // 3
+                columnMeta("COLUMN_NAME", ColumnType.STRING),    // 4
+                columnMeta("DATA_TYPE", ColumnType.INT16),       // 5
+                columnMeta("TYPE_NAME", ColumnType.STRING),      // 6
+                columnMeta("COLUMN_SIZE", ColumnType.INT32),   // 7
+                columnMeta("BUFFER_LENGTH", ColumnType.INT32), // 8
+                columnMeta("DECIMAL_DIGITS", ColumnType.INT32), // 9
+                columnMeta("NUM_PREC_RADIX", ColumnType.INT16),  // 10
+                columnMeta("NULLABLE", ColumnType.INT16),        // 11
+                columnMeta("REMARKS", ColumnType.STRING),        // 12
+                columnMeta("COLUMN_DEF", ColumnType.STRING),     // 13
+                columnMeta("SQL_DATA_TYPE", ColumnType.INT32), // 14
+                columnMeta("SQL_DATETIME_SUB", ColumnType.INT32), // 15
+                columnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32), // 16
+                columnMeta("ORDINAL_POSITION", ColumnType.INT32), // 17
+                columnMeta("IS_NULLABLE", ColumnType.STRING),    // 18
+                columnMeta("SCOPE_CATLOG", ColumnType.STRING),   // 19
+                columnMeta("SCOPE_SCHEMA", ColumnType.STRING),   // 20
+                columnMeta("SCOPE_TABLE", ColumnType.STRING),    // 21
+                columnMeta("SOURCE_DATA_TYPE", ColumnType.INT16), // 22
+                columnMeta("IS_AUTOINCREMENT", ColumnType.STRING), // 23
+                columnMeta("IS_GENERATEDCOLUMN", ColumnType.STRING) // 24
         );
 
         if (!isValidCatalog(catalog)) {
-            return new JdbcResultSet(Collections.emptyList(), meta);
+            return createObjectListResultSet(meta);
         }
 
         try {
@@ -1041,7 +1049,7 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
                 rows.add(columnRow(res.meta().get(i), i + 1));
             }
 
-            return new JdbcResultSet(rows, meta);
+            return createObjectListResultSet(rows, meta);
         } catch (InterruptedException e) {
             throw new SQLException("Thread was interrupted.", e);
         } catch (ExecutionException e) {
@@ -1057,15 +1065,15 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String colNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("GRANTOR", ColumnType.STRING),
-                new JdbcColumnMeta("GRANTEE", ColumnType.STRING),
-                new JdbcColumnMeta("PRIVILEGE", ColumnType.STRING),
-                new JdbcColumnMeta("IS_GRANTABLE", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("GRANTOR", ColumnType.STRING),
+                columnMeta("GRANTEE", ColumnType.STRING),
+                columnMeta("PRIVILEGE", ColumnType.STRING),
+                columnMeta("IS_GRANTABLE", ColumnType.STRING)
         ));
     }
 
@@ -1075,14 +1083,14 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String tblNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("GRANTOR", ColumnType.STRING),
-                new JdbcColumnMeta("GRANTEE", ColumnType.STRING),
-                new JdbcColumnMeta("PRIVILEGE", ColumnType.STRING),
-                new JdbcColumnMeta("IS_GRANTABLE", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("GRANTOR", ColumnType.STRING),
+                columnMeta("GRANTEE", ColumnType.STRING),
+                columnMeta("PRIVILEGE", ColumnType.STRING),
+                columnMeta("IS_GRANTABLE", ColumnType.STRING)
         ));
     }
 
@@ -1090,15 +1098,15 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     @Override
     public ResultSet getBestRowIdentifier(String catalog, String schema, 
String tbl, int scope,
             boolean nullable) throws SQLException {
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("SCOPE", ColumnType.INT16),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_SIZE", ColumnType.INT32),
-                new JdbcColumnMeta("BUFFER_LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("DECIMAL_DIGITS", ColumnType.INT16),
-                new JdbcColumnMeta("PSEUDO_COLUMN", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("SCOPE", ColumnType.INT16),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_SIZE", ColumnType.INT32),
+                columnMeta("BUFFER_LENGTH", ColumnType.INT32),
+                columnMeta("DECIMAL_DIGITS", ColumnType.INT16),
+                columnMeta("PSEUDO_COLUMN", ColumnType.INT16)
         ));
     }
 
@@ -1107,15 +1115,15 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getVersionColumns(String catalog, String schema, String 
tbl) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("SCOPE", ColumnType.INT16),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_SIZE", ColumnType.INT32),
-                new JdbcColumnMeta("BUFFER_LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("DECIMAL_DIGITS", ColumnType.INT16),
-                new JdbcColumnMeta("PSEUDO_COLUMN", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("SCOPE", ColumnType.INT16),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_SIZE", ColumnType.INT32),
+                columnMeta("BUFFER_LENGTH", ColumnType.INT32),
+                columnMeta("DECIMAL_DIGITS", ColumnType.INT16),
+                columnMeta("PSEUDO_COLUMN", ColumnType.INT16)
         ));
     }
 
@@ -1124,16 +1132,16 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getPrimaryKeys(String catalog, String schema, String tbl) 
throws SQLException {
         ensureNotClosed();
 
-        final List<JdbcColumnMeta> meta = asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("KEY_SEQ", ColumnType.INT16),
-                new JdbcColumnMeta("PK_NAME", ColumnType.STRING));
+        List<ColumnMetadata> meta = asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("KEY_SEQ", ColumnType.INT16),
+                columnMeta("PK_NAME", ColumnType.STRING));
 
         if (!isValidCatalog(catalog)) {
-            return new JdbcResultSet(Collections.emptyList(), meta);
+            return createObjectListResultSet(meta);
         }
 
         try {
@@ -1149,7 +1157,7 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
                 rows.addAll(primaryKeyRows(pkMeta));
             }
 
-            return new JdbcResultSet(rows, meta);
+            return createObjectListResultSet(rows, meta);
         } catch (InterruptedException e) {
             throw new SQLException("Thread was interrupted.", e);
         } catch (ExecutionException e) {
@@ -1164,21 +1172,21 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getImportedKeys(String catalog, String schema, String 
tbl) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("PKTABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("PKTABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("PKTABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PKCOLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("FKCOLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("KEY_SEQ", ColumnType.INT16),
-                new JdbcColumnMeta("UPDATE_RULE", ColumnType.INT16),
-                new JdbcColumnMeta("DELETE_RULE", ColumnType.INT16),
-                new JdbcColumnMeta("FK_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PK_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DEFERRABILITY", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("PKTABLE_CAT", ColumnType.STRING),
+                columnMeta("PKTABLE_SCHEM", ColumnType.STRING),
+                columnMeta("PKTABLE_NAME", ColumnType.STRING),
+                columnMeta("PKCOLUMN_NAME", ColumnType.STRING),
+                columnMeta("FKTABLE_CAT", ColumnType.STRING),
+                columnMeta("FKTABLE_SCHEM", ColumnType.STRING),
+                columnMeta("FKTABLE_NAME", ColumnType.STRING),
+                columnMeta("FKCOLUMN_NAME", ColumnType.STRING),
+                columnMeta("KEY_SEQ", ColumnType.INT16),
+                columnMeta("UPDATE_RULE", ColumnType.INT16),
+                columnMeta("DELETE_RULE", ColumnType.INT16),
+                columnMeta("FK_NAME", ColumnType.STRING),
+                columnMeta("PK_NAME", ColumnType.STRING),
+                columnMeta("DEFERRABILITY", ColumnType.INT16)
         ));
     }
 
@@ -1187,21 +1195,21 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getExportedKeys(String catalog, String schema, String 
tbl) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("PKTABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("PKTABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("PKTABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PKCOLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("FKCOLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("KEY_SEQ", ColumnType.INT16),
-                new JdbcColumnMeta("UPDATE_RULE", ColumnType.INT16),
-                new JdbcColumnMeta("DELETE_RULE", ColumnType.INT16),
-                new JdbcColumnMeta("FK_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PK_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DEFERRABILITY", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("PKTABLE_CAT", ColumnType.STRING),
+                columnMeta("PKTABLE_SCHEM", ColumnType.STRING),
+                columnMeta("PKTABLE_NAME", ColumnType.STRING),
+                columnMeta("PKCOLUMN_NAME", ColumnType.STRING),
+                columnMeta("FKTABLE_CAT", ColumnType.STRING),
+                columnMeta("FKTABLE_SCHEM", ColumnType.STRING),
+                columnMeta("FKTABLE_NAME", ColumnType.STRING),
+                columnMeta("FKCOLUMN_NAME", ColumnType.STRING),
+                columnMeta("KEY_SEQ", ColumnType.INT16),
+                columnMeta("UPDATE_RULE", ColumnType.INT16),
+                columnMeta("DELETE_RULE", ColumnType.INT16),
+                columnMeta("FK_NAME", ColumnType.STRING),
+                columnMeta("PK_NAME", ColumnType.STRING),
+                columnMeta("DEFERRABILITY", ColumnType.INT16)
         ));
     }
 
@@ -1211,21 +1219,21 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String foreignCatalog, String foreignSchema, String foreignTbl) 
throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("PKTABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("PKTABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("PKTABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PKCOLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("FKTABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("FKCOLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("KEY_SEQ", ColumnType.INT16),
-                new JdbcColumnMeta("UPDATE_RULE", ColumnType.INT16),
-                new JdbcColumnMeta("DELETE_RULE", ColumnType.INT16),
-                new JdbcColumnMeta("FK_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PK_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DEFERRABILITY", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("PKTABLE_CAT", ColumnType.STRING),
+                columnMeta("PKTABLE_SCHEM", ColumnType.STRING),
+                columnMeta("PKTABLE_NAME", ColumnType.STRING),
+                columnMeta("PKCOLUMN_NAME", ColumnType.STRING),
+                columnMeta("FKTABLE_CAT", ColumnType.STRING),
+                columnMeta("FKTABLE_SCHEM", ColumnType.STRING),
+                columnMeta("FKTABLE_NAME", ColumnType.STRING),
+                columnMeta("FKCOLUMN_NAME", ColumnType.STRING),
+                columnMeta("KEY_SEQ", ColumnType.INT16),
+                columnMeta("UPDATE_RULE", ColumnType.INT16),
+                columnMeta("DELETE_RULE", ColumnType.INT16),
+                columnMeta("FK_NAME", ColumnType.STRING),
+                columnMeta("PK_NAME", ColumnType.STRING),
+                columnMeta("DEFERRABILITY", ColumnType.INT16)
         ));
     }
 
@@ -1326,25 +1334,25 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
                 (short) typeNullable, false, (short) typeSearchable, false, 
false, false, "ARRAY", 0, 0,
                 Types.ARRAY, 0, null));
 
-        return new JdbcResultSet(types, asList(
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("PRECISION", ColumnType.INT32),
-                new JdbcColumnMeta("LITERAL_PREFIX", ColumnType.STRING),
-                new JdbcColumnMeta("LITERAL_SUFFIX", ColumnType.STRING),
-                new JdbcColumnMeta("CREATE_PARAMS", ColumnType.STRING),
-                new JdbcColumnMeta("NULLABLE", ColumnType.INT16),
-                new JdbcColumnMeta("CASE_SENSITIVE", ColumnType.BOOLEAN),
-                new JdbcColumnMeta("SEARCHABLE", ColumnType.INT16),
-                new JdbcColumnMeta("UNSIGNED_ATTRIBUTE", ColumnType.BOOLEAN),
-                new JdbcColumnMeta("FIXED_PREC_SCALE", ColumnType.BOOLEAN),
-                new JdbcColumnMeta("AUTO_INCREMENT", ColumnType.BOOLEAN),
-                new JdbcColumnMeta("LOCAL_TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("MINIMUM_SCALE", ColumnType.INT16),
-                new JdbcColumnMeta("MAXIMUM_SCALE", ColumnType.INT16),
-                new JdbcColumnMeta("SQL_DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("SQL_DATETIME_SUB", ColumnType.INT32),
-                new JdbcColumnMeta("NUM_PREC_RADIX", ColumnType.INT32)
+        return createObjectListResultSet(types, asList(
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("PRECISION", ColumnType.INT32),
+                columnMeta("LITERAL_PREFIX", ColumnType.STRING),
+                columnMeta("LITERAL_SUFFIX", ColumnType.STRING),
+                columnMeta("CREATE_PARAMS", ColumnType.STRING),
+                columnMeta("NULLABLE", ColumnType.INT16),
+                columnMeta("CASE_SENSITIVE", ColumnType.BOOLEAN),
+                columnMeta("SEARCHABLE", ColumnType.INT16),
+                columnMeta("UNSIGNED_ATTRIBUTE", ColumnType.BOOLEAN),
+                columnMeta("FIXED_PREC_SCALE", ColumnType.BOOLEAN),
+                columnMeta("AUTO_INCREMENT", ColumnType.BOOLEAN),
+                columnMeta("LOCAL_TYPE_NAME", ColumnType.STRING),
+                columnMeta("MINIMUM_SCALE", ColumnType.INT16),
+                columnMeta("MAXIMUM_SCALE", ColumnType.INT16),
+                columnMeta("SQL_DATA_TYPE", ColumnType.INT32),
+                columnMeta("SQL_DATETIME_SUB", ColumnType.INT32),
+                columnMeta("NUM_PREC_RADIX", ColumnType.INT32)
         ));
     }
 
@@ -1354,23 +1362,23 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             boolean approximate) throws SQLException {
         ensureNotClosed();
 
-        final List<JdbcColumnMeta> meta = asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("NON_UNIQUE", ColumnType.BOOLEAN),
-                new JdbcColumnMeta("INDEX_QUALIFIER", ColumnType.STRING),
-                new JdbcColumnMeta("INDEX_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE", ColumnType.INT16),
-                new JdbcColumnMeta("ORDINAL_POSITION", ColumnType.INT16),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("ASC_OR_DESC", ColumnType.STRING),
-                new JdbcColumnMeta("CARDINALITY", ColumnType.INT32),
-                new JdbcColumnMeta("PAGES", ColumnType.INT32),
-                new JdbcColumnMeta("FILTER_CONDITION", ColumnType.STRING));
+        List<ColumnMetadata> meta = asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("NON_UNIQUE", ColumnType.BOOLEAN),
+                columnMeta("INDEX_QUALIFIER", ColumnType.STRING),
+                columnMeta("INDEX_NAME", ColumnType.STRING),
+                columnMeta("TYPE", ColumnType.INT16),
+                columnMeta("ORDINAL_POSITION", ColumnType.INT16),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("ASC_OR_DESC", ColumnType.STRING),
+                columnMeta("CARDINALITY", ColumnType.INT32),
+                columnMeta("PAGES", ColumnType.INT32),
+                columnMeta("FILTER_CONDITION", ColumnType.STRING));
 
         if (!isValidCatalog(catalog)) {
-            return new JdbcResultSet(Collections.emptyList(), meta);
+            return createObjectListResultSet(Collections.emptyList(), meta);
         }
 
         throw new UnsupportedOperationException("Index info is not supported 
yet.");
@@ -1454,14 +1462,14 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             int[] types) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TYPE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("CLASS_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("BASE_TYPE", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("TYPE_CAT", ColumnType.STRING),
+                columnMeta("TYPE_SCHEM", ColumnType.STRING),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("CLASS_NAME", ColumnType.STRING),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("BASE_TYPE", ColumnType.INT16)
         ));
     }
 
@@ -1501,13 +1509,13 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String typeNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TYPE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("SUPERTYPE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("SUPERTYPE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("SUPERTYPE_NAME", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("TYPE_CAT", ColumnType.STRING),
+                columnMeta("TYPE_SCHEM", ColumnType.STRING),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("SUPERTYPE_CAT", ColumnType.STRING),
+                columnMeta("SUPERTYPE_SCHEM", ColumnType.STRING),
+                columnMeta("SUPERTYPE_NAME", ColumnType.STRING)
         ));
     }
 
@@ -1517,11 +1525,11 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String tblNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("SUPERTABLE_NAME", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("SUPERTABLE_NAME", ColumnType.STRING)
         ));
     }
 
@@ -1531,28 +1539,28 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String attributeNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TYPE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("ATTR_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("ATTR_TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("ATTR_SIZE", ColumnType.INT32),
-                new JdbcColumnMeta("DECIMAL_DIGITS", ColumnType.INT32),
-                new JdbcColumnMeta("NUM_PREC_RADIX", ColumnType.INT32),
-                new JdbcColumnMeta("NULLABLE", ColumnType.INT32),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("ATTR_DEF", ColumnType.STRING),
-                new JdbcColumnMeta("SQL_DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("SQL_DATETIME_SUB", ColumnType.INT32),
-                new JdbcColumnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("ORDINAL_POSITION", ColumnType.INT32),
-                new JdbcColumnMeta("IS_NULLABLE", ColumnType.STRING),
-                new JdbcColumnMeta("SCOPE_CATALOG", ColumnType.STRING),
-                new JdbcColumnMeta("SCOPE_SCHEMA", ColumnType.STRING),
-                new JdbcColumnMeta("SCOPE_TABLE", ColumnType.STRING),
-                new JdbcColumnMeta("SOURCE_DATA_TYPE", ColumnType.INT16)
+        return createObjectListResultSet(asList(
+                columnMeta("TYPE_CAT", ColumnType.STRING),
+                columnMeta("TYPE_SCHEM", ColumnType.STRING),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("ATTR_NAME", ColumnType.STRING),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("ATTR_TYPE_NAME", ColumnType.STRING),
+                columnMeta("ATTR_SIZE", ColumnType.INT32),
+                columnMeta("DECIMAL_DIGITS", ColumnType.INT32),
+                columnMeta("NUM_PREC_RADIX", ColumnType.INT32),
+                columnMeta("NULLABLE", ColumnType.INT32),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("ATTR_DEF", ColumnType.STRING),
+                columnMeta("SQL_DATA_TYPE", ColumnType.INT32),
+                columnMeta("SQL_DATETIME_SUB", ColumnType.INT32),
+                columnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
+                columnMeta("ORDINAL_POSITION", ColumnType.INT32),
+                columnMeta("IS_NULLABLE", ColumnType.STRING),
+                columnMeta("SCOPE_CATALOG", ColumnType.STRING),
+                columnMeta("SCOPE_SCHEMA", ColumnType.STRING),
+                columnMeta("SCOPE_TABLE", ColumnType.STRING),
+                columnMeta("SOURCE_DATA_TYPE", ColumnType.INT16)
         ));
     }
 
@@ -1633,11 +1641,11 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
     public ResultSet getClientInfoProperties() throws SQLException {
         // We do not check whether connection is closed as 
         // this operation is not expected to do any server calls.  
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("NAME", ColumnType.STRING),
-                new JdbcColumnMeta("MAX_LEN", ColumnType.INT32),
-                new JdbcColumnMeta("DEFAULT_VALUE", ColumnType.STRING),
-                new JdbcColumnMeta("DESCRIPTION", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("NAME", ColumnType.STRING),
+                columnMeta("MAX_LEN", ColumnType.INT32),
+                columnMeta("DEFAULT_VALUE", ColumnType.STRING),
+                columnMeta("DESCRIPTION", ColumnType.STRING)
         ));
     }
 
@@ -1649,13 +1657,13 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String functionNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("FUNCTION_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("FUNCTION_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("FUNCTION_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("FUNCTION_TYPE", ColumnType.STRING),
-                new JdbcColumnMeta("SPECIFIC_NAME", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("FUNCTION_CAT", ColumnType.STRING),
+                columnMeta("FUNCTION_SCHEM", ColumnType.STRING),
+                columnMeta("FUNCTION_NAME", ColumnType.STRING),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("FUNCTION_TYPE", ColumnType.STRING),
+                columnMeta("SPECIFIC_NAME", ColumnType.STRING)
         ));
     }
 
@@ -1665,24 +1673,24 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String colNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("FUNCTION_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("FUNCTION_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("FUNCTION_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_TYPE", ColumnType.INT16),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("TYPE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("PRECISION", ColumnType.INT32),
-                new JdbcColumnMeta("LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("SCALE", ColumnType.INT16),
-                new JdbcColumnMeta("RADIX", ColumnType.INT16),
-                new JdbcColumnMeta("NULLABLE", ColumnType.INT16),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("ORDINAL_POSITION", ColumnType.INT32),
-                new JdbcColumnMeta("IS_NULLABLE", ColumnType.STRING),
-                new JdbcColumnMeta("SPECIFIC_NAME", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("FUNCTION_CAT", ColumnType.STRING),
+                columnMeta("FUNCTION_SCHEM", ColumnType.STRING),
+                columnMeta("FUNCTION_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_TYPE", ColumnType.INT16),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("TYPE_NAME", ColumnType.STRING),
+                columnMeta("PRECISION", ColumnType.INT32),
+                columnMeta("LENGTH", ColumnType.INT32),
+                columnMeta("SCALE", ColumnType.INT16),
+                columnMeta("RADIX", ColumnType.INT16),
+                columnMeta("NULLABLE", ColumnType.INT16),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
+                columnMeta("ORDINAL_POSITION", ColumnType.INT32),
+                columnMeta("IS_NULLABLE", ColumnType.STRING),
+                columnMeta("SPECIFIC_NAME", ColumnType.STRING)
         ));
     }
 
@@ -1708,19 +1716,19 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
             String colNamePtrn) throws SQLException {
         ensureNotClosed();
 
-        return new JdbcResultSet(Collections.emptyList(), asList(
-                new JdbcColumnMeta("TABLE_CAT", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_SCHEM", ColumnType.STRING),
-                new JdbcColumnMeta("TABLE_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("COLUMN_NAME", ColumnType.STRING),
-                new JdbcColumnMeta("DATA_TYPE", ColumnType.INT32),
-                new JdbcColumnMeta("COLUMN_SIZE", ColumnType.INT32),
-                new JdbcColumnMeta("DECIMAL_DIGITS", ColumnType.INT32),
-                new JdbcColumnMeta("NUM_PREC_RADIX", ColumnType.INT32),
-                new JdbcColumnMeta("COLUMN_USAGE", ColumnType.INT32),
-                new JdbcColumnMeta("REMARKS", ColumnType.STRING),
-                new JdbcColumnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
-                new JdbcColumnMeta("IS_NULLABLE", ColumnType.STRING)
+        return createObjectListResultSet(asList(
+                columnMeta("TABLE_CAT", ColumnType.STRING),
+                columnMeta("TABLE_SCHEM", ColumnType.STRING),
+                columnMeta("TABLE_NAME", ColumnType.STRING),
+                columnMeta("COLUMN_NAME", ColumnType.STRING),
+                columnMeta("DATA_TYPE", ColumnType.INT32),
+                columnMeta("COLUMN_SIZE", ColumnType.INT32),
+                columnMeta("DECIMAL_DIGITS", ColumnType.INT32),
+                columnMeta("NUM_PREC_RADIX", ColumnType.INT32),
+                columnMeta("COLUMN_USAGE", ColumnType.INT32),
+                columnMeta("REMARKS", ColumnType.STRING),
+                columnMeta("CHAR_OCTET_LENGTH", ColumnType.INT32),
+                columnMeta("IS_NULLABLE", ColumnType.STRING)
         ));
     }
 
@@ -1777,14 +1785,14 @@ public class JdbcDatabaseMetadata implements 
DatabaseMetaData {
         row.add(CATALOG_NAME);                  // 1. TABLE_CAT
         row.add(colMeta.schemaName());          // 2. TABLE_SCHEM
         row.add(colMeta.tableName());           // 3. TABLE_NAME
-        row.add(colMeta.columnLabel());          // 4. COLUMN_NAME
-        row.add(colMeta.dataType());            // 5. DATA_TYPE
+        row.add(colMeta.columnLabel());         // 4. COLUMN_NAME
+        row.add((short) colMeta.dataType());    // 5. DATA_TYPE
         row.add(colMeta.dataTypeName());        // 6. TYPE_NAME
         row.add(colMeta.precision() == -1 ? null : colMeta.precision()); // 7. 
COLUMN_SIZE
         row.add((Integer) null);                 // 8. BUFFER_LENGTH
         row.add(colMeta.scale() == -1 ? null : colMeta.scale());           // 
9. DECIMAL_DIGITS
         row.add(10);                            // 10. NUM_PREC_RADIX
-        row.add(colMeta.isNullable() ? columnNullable : columnNoNulls);  // 
11. NULLABLE
+        row.add(colMeta.isNullable() ? (short) columnNullable : (short) 
columnNoNulls);  // 11. NULLABLE
         row.add((String) null);                  // 12. REMARKS
         row.add(colMeta.defaultValue());        // 13. COLUMN_DEF
         row.add(colMeta.dataType());            // 14. SQL_DATA_TYPE
diff --git 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetataUtils.java
 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetataUtils.java
new file mode 100644
index 00000000000..8f94df1e87f
--- /dev/null
+++ 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc/JdbcDatabaseMetataUtils.java
@@ -0,0 +1,321 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.jdbc;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.UUID;
+import org.apache.ignite.internal.jdbc2.ClientSyncResultSet;
+import org.apache.ignite.internal.jdbc2.JdbcResultSet;
+import org.apache.ignite.internal.sql.ResultSetMetadataImpl;
+import org.apache.ignite.internal.util.TransformingIterator;
+import org.apache.ignite.sql.ColumnMetadata;
+import org.apache.ignite.sql.NoRowSetExpectedException;
+import org.apache.ignite.sql.ResultSetMetadata;
+import org.apache.ignite.sql.SqlRow;
+import org.apache.ignite.table.Tuple;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Helper methods for creating a {@link ResultSet} set using a list of objects.
+ */
+public class JdbcDatabaseMetataUtils {
+    static ResultSet createObjectListResultSet(List<ColumnMetadata> 
columnsMeta) {
+        return createObjectListResultSet(List.of(), columnsMeta);
+    }
+
+    static ResultSet createObjectListResultSet(List<List<Object>> rows, 
List<ColumnMetadata> columnsMeta) {
+        ResultSetMetadata meta = new ResultSetMetadataImpl(columnsMeta);
+
+        TransformingIterator<List<Object>, SqlRow> transformer = new 
TransformingIterator<>(rows.iterator(),
+                ObjectListToSqlRowAdapter::new);
+
+        return new JdbcResultSet(
+                new IteratorBasedClientSyncResultSet(transformer, meta),
+                null,
+                ZoneId::systemDefault,
+                false,
+                0
+        );
+    }
+
+    private static class IteratorBasedClientSyncResultSet implements 
ClientSyncResultSet {
+        private final ResultSetMetadata metadata;
+        private final Iterator<SqlRow> rowsIterator;
+
+        IteratorBasedClientSyncResultSet(Iterator<SqlRow> rowsIterator, 
ResultSetMetadata metadata) {
+            this.rowsIterator = rowsIterator;
+            this.metadata = metadata;
+        }
+
+        @Override
+        public ResultSetMetadata metadata() {
+            return metadata;
+        }
+
+        @Override
+        public boolean hasRowSet() {
+            return true;
+        }
+
+        @Override
+        public long affectedRows() {
+            return -1;
+        }
+
+        @Override
+        public boolean wasApplied() {
+            return false;
+        }
+
+        @Override
+        public boolean hasNextResultSet() {
+            return false;
+        }
+
+        @Override
+        public ClientSyncResultSet nextResultSet() {
+            throw new NoSuchElementException("Query has no more results");
+        }
+
+        @Override
+        public void close() {
+            // No-op.
+        }
+
+        @Override
+        public boolean hasNext() {
+            return rowsIterator.hasNext();
+        }
+
+        @Override
+        public SqlRow next() {
+            if (!rowsIterator.hasNext()) {
+                throw new NoRowSetExpectedException();
+            }
+
+            return rowsIterator.next();
+        }
+    }
+
+    private static class ObjectListToSqlRowAdapter implements SqlRow {
+        private final List<Object> row;
+
+        ObjectListToSqlRowAdapter(List<Object> row) {
+            this.row = row;
+        }
+
+        @Override
+        public <T> @Nullable T value(int columnIndex) {
+            return (T) row.get(columnIndex);
+        }
+
+        @Override
+        public <T> @Nullable T value(String columnName) throws 
IllegalArgumentException {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public ResultSetMetadata metadata() {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public int columnCount() {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public String columnName(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public int columnIndex(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public <T> @Nullable T valueOrDefault(String columnName, @Nullable T 
defaultValue) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public Tuple set(String columnName, @Nullable Object value) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public boolean booleanValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public boolean booleanValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public byte byteValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public byte byteValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public short shortValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public short shortValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public int intValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public int intValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public long longValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public long longValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public float floatValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public float floatValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public double doubleValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public double doubleValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public BigDecimal decimalValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public BigDecimal decimalValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public String stringValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public String stringValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public byte[] bytesValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public byte[] bytesValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public UUID uuidValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public UUID uuidValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public LocalDate dateValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public LocalDate dateValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public LocalTime timeValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public LocalTime timeValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public LocalDateTime datetimeValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public LocalDateTime datetimeValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public Instant timestampValue(String columnName) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+
+        @Override
+        public Instant timestampValue(int columnIndex) {
+            throw new UnsupportedOperationException("This method should not be 
called.");
+        }
+    }
+}
diff --git 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/ClientSyncResultSet.java
 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/ClientSyncResultSet.java
index a565e073947..231bba83a5c 100644
--- 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/ClientSyncResultSet.java
+++ 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/ClientSyncResultSet.java
@@ -26,7 +26,8 @@ import org.apache.ignite.sql.SqlRow;
 /**
  * Sync result set.
  */
-interface ClientSyncResultSet extends Iterator<SqlRow> {
+// TODO https://issues.apache.org/jira/browse/IGNITE-26145 Remove "public" 
modifier
+public interface ClientSyncResultSet extends Iterator<SqlRow> {
 
     ResultSetMetadata EMPTY_METADATA = new ResultSetMetadataImpl(List.of());
 
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 6863ffc40c3..da9948c0709 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
@@ -105,7 +105,8 @@ public class JdbcResultSet implements ResultSet {
     /**
      * Constructor.
      */
-    JdbcResultSet(
+    // TODO https://issues.apache.org/jira/browse/IGNITE-26145 Remove "public" 
modifier
+    public JdbcResultSet(
             ClientSyncResultSet rs,
             Statement statement,
             Supplier<ZoneId> zoneIdSupplier,
diff --git 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement2.java
 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement2.java
index 79efecb640d..4a46f0ef647 100644
--- 
a/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement2.java
+++ 
b/modules/jdbc/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement2.java
@@ -510,12 +510,22 @@ public class JdbcStatement2 implements Statement {
         return FETCH_FORWARD;
     }
 
-    /** {@inheritDoc} */
+    /**
+     * Gives the JDBC driver a hint as to the number of rows that should
+     * be fetched from the database.
+     *
+     * <p>Note: in the current driver implementation, this method does nothing.
+     *
+     * @param fetchSize the number of rows to fetch
+     * @exception SQLException if the condition {@code rows >= 0} is not 
satisfied.
+     * @since 1.2
+     * @see #getFetchSize
+     */
     @Override
     public void setFetchSize(int fetchSize) throws SQLException {
         ensureNotClosed();
 
-        if (fetchSize <= 0) {
+        if (fetchSize < 0) {
             throw new SQLException("Invalid fetch size.");
         }
 

Reply via email to