You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2021/02/16 14:47:42 UTC

[ignite] branch sql-calcite updated: IGNITE-14158 Fix column metadata types for JDBC - Fixes #8789.

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

alexpl pushed a commit to branch sql-calcite
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/sql-calcite by this push:
     new 39c971b  IGNITE-14158 Fix column metadata types for JDBC - Fixes #8789.
39c971b is described below

commit 39c971b00c2e1f5e251485d43f438a982859cb32
Author: Aleksey Plekhanov <pl...@gmail.com>
AuthorDate: Tue Feb 16 17:41:10 2021 +0300

    IGNITE-14158 Fix column metadata types for JDBC - Fixes #8789.
    
    Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
 .../query/calcite/prepare/FieldsMetadata.java      |  4 +-
 .../query/calcite/jdbc/JdbcQueryTest.java          | 63 +++++++++++++++++++++-
 2 files changed, 65 insertions(+), 2 deletions(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FieldsMetadata.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FieldsMetadata.java
index de906edbf..ed02794 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FieldsMetadata.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/FieldsMetadata.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.processors.query.calcite.prepare;
 
+import java.lang.reflect.Type;
 import java.util.List;
 import com.google.common.collect.ImmutableList;
 import org.apache.calcite.rel.type.RelDataType;
@@ -56,12 +57,13 @@ public interface FieldsMetadata {
             List<String> origin = origins != null ? origins.get(i) : null;
             RelDataTypeField field = fields.get(i);
             RelDataType fieldType = field.getType();
+            Type fieldCls = typeFactory.getResultClass(fieldType);
 
             b.add(new CalciteQueryFieldMetadata(
                 F.isEmpty(origin) ? null : origin.get(0),
                 F.isEmpty(origin) ? null : origin.get(1),
                 F.isEmpty(origin) ? field.getName() : origin.get(2),
-                String.valueOf(typeFactory.getResultClass(fieldType)),
+                fieldCls == null ? Void.class.getName() : fieldCls.getTypeName(),
                 fieldType.getPrecision(),
                 fieldType.getScale()
             ));
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java
index d9a9991..4aac4ea 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java
@@ -20,10 +20,11 @@ package org.apache.ignite.internal.processors.query.calcite.jdbc;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.sql.Types;
 import java.util.concurrent.TimeUnit;
-
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.testframework.junits.WithSystemProperty;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
@@ -69,6 +70,8 @@ public class JdbcQueryTest extends GridCommonAbstractTest {
 
         assert stmt.isClosed();
         assert conn.isClosed();
+
+        stopAllGrids();
     }
 
     /**
@@ -94,4 +97,62 @@ public class JdbcQueryTest extends GridCommonAbstractTest {
 
         stmt.close();
     }
+
+    /**
+     * @throws SQLException If failed.
+     */
+    @Test
+    public void testQueryColumnTypes() throws Exception {
+        stmt.execute("CREATE TABLE t1 (id INT NOT NULL, " +
+            "bool_col BOOLEAN, " +
+            "tinyint_col TINYINT, " +
+            "smallint_col SMALLINT, " +
+            "int_col INT, " +
+            "bigint_col BIGINT, " +
+            "varchar_col VARCHAR, " +
+            "char_col CHAR, " +
+            "float_col FLOAT, " +
+            "double_col DOUBLE, " +
+            "time_col TIME, " +
+            "timestamp_col TIMESTAMP, " +
+            "date_col DATE, " +
+            "PRIMARY KEY (id));");
+
+        grid(0).context().cache().context().exchange().affinityReadyFuture(
+            new AffinityTopologyVersion(3, 2)).get(10_000, TimeUnit.MILLISECONDS);
+
+        stmt.executeUpdate("INSERT INTO t1 (id, bool_col, tinyint_col, smallint_col, int_col, bigint_col, " +
+            "varchar_col, char_col, float_col, double_col, time_col, timestamp_col, date_col) VALUES (1, null, null, " +
+            "null, null, null, null, null, null, null, null, null, null);");
+
+        try (ResultSet rs = stmt.executeQuery("SELECT * FROM t1;")) {
+            assertTrue(rs.next());
+
+            ResultSetMetaData md = rs.getMetaData();
+
+            // Columns start from 1.
+            assertEquals(Types.INTEGER, md.getColumnType(1));
+            assertEquals(Types.BOOLEAN, md.getColumnType(2));
+            assertEquals(Types.TINYINT, md.getColumnType(3));
+            assertEquals(Types.SMALLINT, md.getColumnType(4));
+            assertEquals(Types.INTEGER, md.getColumnType(5));
+            assertEquals(Types.BIGINT, md.getColumnType(6));
+            assertEquals(Types.VARCHAR, md.getColumnType(7));
+            // TODO https://issues.apache.org/jira/browse/IGNITE-13547 H2 maps SQL type FLOAT to Value.DOUBLE and
+            //  SQL type CHAR to Value.STRING_FIXED, which are maped to java classes Double/String,
+            //  and to Types.DOUBLE/Types.VARCHAR respectively. Calcite DDL can map this types in a different way.
+            //assertEquals(Types.CHAR, md.getColumnType(8));
+            //assertEquals(Types.FLOAT, md.getColumnType(9));
+            assertEquals(Types.VARCHAR, md.getColumnType(8));
+            assertEquals(Types.DOUBLE, md.getColumnType(9));
+            assertEquals(Types.DOUBLE, md.getColumnType(10));
+            assertEquals(Types.TIME, md.getColumnType(11));
+            assertEquals(Types.TIMESTAMP, md.getColumnType(12));
+            assertEquals(Types.DATE, md.getColumnType(13));
+        }
+
+        stmt.execute("DROP TABLE t1");
+
+        stmt.close();
+    }
 }