You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/03/23 18:26:16 UTC
[2/9] incubator-calcite git commit: [CALCITE-596] JDBC adapter
incorrectly reads null values as 0 (Ng Jiunn Jye)
[CALCITE-596] JDBC adapter incorrectly reads null values as 0 (Ng Jiunn Jye)
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/2b07a9e9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/2b07a9e9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/2b07a9e9
Branch: refs/heads/master
Commit: 2b07a9e9680e662a6d9785deb2a4ed140026e95f
Parents: 3b10a6a
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Mar 23 01:39:12 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Mar 23 01:39:12 2015 -0700
----------------------------------------------------------------------
.../adapter/jdbc/JdbcToEnumerableConverter.java | 11 ++++
.../java/org/apache/calcite/test/JdbcTest.java | 60 ++++++++++++++++++++
2 files changed, 71 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/2b07a9e9/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
index 3fbf778..125d61b 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverter.java
@@ -232,6 +232,17 @@ public class JdbcToEnumerableConverter
Expressions.statement(
Expressions.assign(
target, source)));
+
+ // [CALCITE-596] If primitive type columns contain null value, returns null
+ // object
+ if (primitive != null) {
+ builder.add(
+ Expressions.ifThen(
+ Expressions.call(resultSet_, "wasNull"),
+ Expressions.statement(
+ Expressions.assign(target,
+ Expressions.constant(null)))));
+ }
}
private Method getMethod(SqlTypeName sqlTypeName, boolean nullable,
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/2b07a9e9/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 0942334..0024bf1 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -6137,6 +6137,66 @@ public class JdbcTest {
.returnsUnordered("DID=1", "DID=2");
}
+ /**
+ * Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-596">[CALCITE-596]
+ * JDBC adapter incorrectly reads null values as 0</a>.
+ */
+ @Test public void testPrimitiveColumnsWithNullValues() throws Exception {
+ String hsqldbMemUrl = "jdbc:hsqldb:mem:.";
+ Connection baseConnection = DriverManager.getConnection(hsqldbMemUrl);
+ Statement baseStmt = baseConnection.createStatement();
+ baseStmt.execute("CREATE TABLE T1 (\n"
+ + "ID INTEGER,\n"
+ + "VALS DOUBLE)");
+ baseStmt.execute("INSERT INTO T1 VALUES (1, 1.0)");
+ baseStmt.execute("INSERT INTO T1 VALUES (2, null)");
+ baseStmt.execute("INSERT INTO T1 VALUES (null, 2.0)");
+
+ baseStmt.close();
+ baseConnection.commit();
+
+ Properties info = new Properties();
+ info.put("model",
+ "inline:"
+ + "{\n"
+ + " version: '1.0',\n"
+ + " defaultSchema: 'BASEJDBC',\n"
+ + " schemas: [\n"
+ + " {\n"
+ + " type: 'jdbc',\n"
+ + " name: 'BASEJDBC',\n"
+ + " jdbcDriver: '" + jdbcDriver.class.getName() + "',\n"
+ + " jdbcUrl: '" + hsqldbMemUrl + "',\n"
+ + " jdbcCatalog: null,\n"
+ + " jdbcSchema: null\n"
+ + " }\n"
+ + " ]\n"
+ + "}");
+
+ Connection calciteConnection = DriverManager.getConnection(
+ "jdbc:calcite:", info);
+
+ ResultSet rs = calciteConnection.prepareStatement("select * from t1")
+ .executeQuery();
+
+ assertThat(rs.next(), is(true));
+ assertThat((Integer) rs.getObject("ID"), equalTo(1));
+ assertThat((Double) rs.getObject("VALS"), equalTo(1.0));
+
+ assertThat(rs.next(), is(true));
+ assertThat((Integer) rs.getObject("ID"), equalTo(2));
+ assertThat((Double) rs.getObject("VALS"), nullValue());
+
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getObject("ID"), nullValue());
+ assertThat((Double) rs.getObject("VALS"), equalTo(2.0));
+
+ rs.close();
+ calciteConnection.close();
+
+ }
+
// Disable checkstyle, so it doesn't complain about fields like "customer_id".
//CHECKSTYLE: OFF