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/02/10 19:52:52 UTC

[2/2] incubator-calcite git commit: [CALCITE-580] Average aggregation on an Integer column throws java.lang.ClassCastException

[CALCITE-580] Average aggregation on an Integer column throws java.lang.ClassCastException


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/cca42158
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/cca42158
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/cca42158

Branch: refs/heads/master
Commit: cca42158f5b9b6c43059cbd10167f7cb72aeb6b8
Parents: 882477b
Author: Julian Hyde <jh...@apache.org>
Authored: Tue Feb 10 01:58:15 2015 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Feb 10 01:58:15 2015 -0800

----------------------------------------------------------------------
 .../adapter/enumerable/JavaRowFormat.java       |  26 +----
 .../calcite/test/ReflectiveSchemaTest.java      | 100 ++++++++++++++++---
 2 files changed, 90 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cca42158/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
index ac87aad..9cb54ff 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java
@@ -19,18 +19,15 @@ package org.apache.calcite.adapter.enumerable;
 import org.apache.calcite.adapter.java.JavaTypeFactory;
 import org.apache.calcite.interpreter.Row;
 import org.apache.calcite.linq4j.tree.Expression;
-import org.apache.calcite.linq4j.tree.ExpressionType;
 import org.apache.calcite.linq4j.tree.Expressions;
 import org.apache.calcite.linq4j.tree.MemberExpression;
 import org.apache.calcite.linq4j.tree.Types;
-import org.apache.calcite.linq4j.tree.UnaryExpression;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.runtime.FlatLists;
 import org.apache.calcite.runtime.Unit;
 import org.apache.calcite.util.BuiltInMethod;
 
 import java.lang.reflect.Type;
-import java.util.AbstractList;
 import java.util.List;
 
 /**
@@ -207,10 +204,8 @@ public enum JavaRowFormat {
       return Object.class;
     }
 
-    public Expression record(
-        Type javaRowClass, List<Expression> expressions) {
-      return Expressions.newArrayInit(
-          Object.class, stripCasts(expressions));
+    public Expression record(Type javaRowClass, List<Expression> expressions) {
+      return Expressions.newArrayInit(Object.class, expressions);
     }
 
     @Override public Expression comparer() {
@@ -257,23 +252,6 @@ public enum JavaRowFormat {
   public abstract Expression record(
       Type javaRowClass, List<Expression> expressions);
 
-  private static List<Expression> stripCasts(
-      final List<Expression> expressions) {
-    return new AbstractList<Expression>() {
-      public Expression get(int index) {
-        Expression expression = expressions.get(index);
-        while (expression.getNodeType() == ExpressionType.Convert) {
-          expression = ((UnaryExpression) expression).expression;
-        }
-        return expression;
-      }
-
-      public int size() {
-        return expressions.size();
-      }
-    };
-  }
-
   public Expression comparer() {
     return null;
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/cca42158/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
index ddba621..7c5ba6f 100644
--- a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
+++ b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java
@@ -18,6 +18,7 @@ package org.apache.calcite.test;
 
 import org.apache.calcite.adapter.java.ReflectiveSchema;
 import org.apache.calcite.avatica.util.DateTimeUtils;
+import org.apache.calcite.config.Lex;
 import org.apache.calcite.jdbc.CalciteConnection;
 import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.linq4j.Linq4j;
@@ -33,8 +34,10 @@ import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.schema.impl.AbstractSchema;
 import org.apache.calcite.schema.impl.TableMacroImpl;
 import org.apache.calcite.schema.impl.ViewTable;
+import org.apache.calcite.util.Util;
 
 import com.google.common.base.Function;
+import com.google.common.base.Throwables;
 
 import org.junit.Assert;
 import org.junit.Ignore;
@@ -328,18 +331,65 @@ public class ReflectiveSchemaTest {
   }
 
   private void checkAgg(CalciteAssert.AssertThat with, String fn) {
-    for (Field field
+    for (final Field field
         : fn.equals("avg") ? EveryType.numericFields() : EveryType.fields()) {
-      with.query("select " + fn + "(\"" + field.getName() + "\") as c\n"
-          + "from \"s\".\"everyTypes\"")
-          .returns(CalciteAssert.<ResultSet, Void>constantNull());
+      with.query(
+          "select " + fn + "(\"" + field.getName() + "\") as c\n"
+              + "from \"s\".\"everyTypes\"")
+          .returns(
+              new Function<ResultSet, Void>() {
+                public Void apply(ResultSet input) {
+                  int n = 0;
+                  try {
+                    while (input.next()) {
+                      final Object o = get(input);
+                      Util.discard(o);
+                      ++n;
+                    }
+                  } catch (SQLException e) {
+                    throw Throwables.propagate(e);
+                  }
+                  assertThat(n, equalTo(1));
+                  return null;
+                }
+
+                private Object get(ResultSet input) throws SQLException {
+                  final int type = input.getMetaData().getColumnType(1);
+                  switch (type) {
+                  case java.sql.Types.BOOLEAN:
+                    return input.getBoolean(1);
+                  case java.sql.Types.TINYINT:
+                    return input.getByte(1);
+                  case java.sql.Types.SMALLINT:
+                    return input.getShort(1);
+                  case java.sql.Types.INTEGER:
+                    return input.getInt(1);
+                  case java.sql.Types.BIGINT:
+                    return input.getLong(1);
+                  case java.sql.Types.REAL:
+                    return input.getFloat(1);
+                  case java.sql.Types.DOUBLE:
+                    return input.getDouble(1);
+                  case java.sql.Types.CHAR:
+                  case java.sql.Types.VARCHAR:
+                    return input.getString(1);
+                  case java.sql.Types.DATE:
+                    return input.getDate(1);
+                  case java.sql.Types.TIME:
+                    return input.getTime(1);
+                  case java.sql.Types.TIMESTAMP:
+                    return input.getTimestamp(1);
+                  default:
+                    throw new AssertionError(type);
+                  }
+                }
+              });
     }
   }
 
   @Test public void testClassNames() throws Exception {
     CalciteAssert.that()
-        .withSchema("s", CATCHALL)
-        .query("select * from \"s\".\"everyTypes\"")
+        .withSchema("s", CATCHALL).query("select * from \"s\".\"everyTypes\"")
         .returns(
             new Function<ResultSet, Void>() {
               public Void apply(ResultSet input) {
@@ -491,13 +541,37 @@ public class ReflectiveSchemaTest {
   }
 
   @Test public void testCastFromString() {
-    CalciteAssert.that()
-        .withSchema("s", CATCHALL)
+    CalciteAssert.that().withSchema("s", CATCHALL)
         .query("select cast(\"string\" as int) as c from \"s\".\"everyTypes\"")
         .returns("C=1\n"
             + "C=null\n");
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-580">CALCITE-580</a>,
+   * "Average aggregation on an Integer column throws ClassCastException". */
+  @Test public void testAvgInt() throws Exception {
+    CalciteAssert.that().withSchema("s", CATCHALL).with(Lex.JAVA)
+        .query("select primitiveLong, avg(primitiveInt)\n"
+                + "from s.everyTypes\n"
+                + "group by primitiveLong order by primitiveLong")
+        .returns(
+            new Function<ResultSet, Void>() {
+              public Void apply(ResultSet input) {
+                StringBuilder buf = new StringBuilder();
+                try {
+                  while (input.next()) {
+                    buf.append(input.getInt(2)).append("\n");
+                  }
+                } catch (SQLException e) {
+                  throw Throwables.propagate(e);
+                }
+                assertThat(buf.toString(), equalTo("0\n2147483647\n"));
+                return null;
+              }
+            });
+  }
+
   private static boolean isNumeric(Class type) {
     switch (Primitive.flavor(type)) {
     case BOX:
@@ -565,8 +639,9 @@ public class ReflectiveSchemaTest {
     CalciteAssert.that()
         .withSchema("s", new ReflectiveSchema(new JdbcTest.HrSchema()))
         .query("select * from table(\"s\".\"view\"('abc'))")
-        .returns("empid=2; deptno=10; name=Ab; salary=0.0; commission=null\n"
-            + "empid=4; deptno=10; name=Abd; salary=0.0; commission=null\n");
+        .returns(
+            "empid=2; deptno=10; name=Ab; salary=0.0; commission=null\n"
+                + "empid=4; deptno=10; name=Abd; salary=0.0; commission=null\n");
   }
 
   /** Finds a table-macro using reflection. */
@@ -575,8 +650,9 @@ public class ReflectiveSchemaTest {
     CalciteAssert.that()
         .withSchema("s", new ReflectiveSchema(new JdbcTest.HrSchema()))
         .query("select * from table(\"s\".\"foo\"(3))")
-        .returns("empid=2; deptno=10; name=Ab; salary=0.0; commission=null\n"
-            + "empid=4; deptno=10; name=Abd; salary=0.0; commission=null\n");
+        .returns(
+            "empid=2; deptno=10; name=Ab; salary=0.0; commission=null\n"
+                + "empid=4; deptno=10; name=Abd; salary=0.0; commission=null\n");
   }
 
   /** Table with single field as Integer[] */