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();
+ }
}