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 2014/10/28 18:50:57 UTC

[9/9] git commit: [CALCITE-397] "SELECT DISTINCT *" on reflective schema gives ClassCastException at runtime

[CALCITE-397] "SELECT DISTINCT *" on reflective schema gives ClassCastException at runtime


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

Branch: refs/heads/master
Commit: 1f91bbf811d45d5c6832f23ba27972f2e304537b
Parents: 41215c2
Author: Julian Hyde <jh...@apache.org>
Authored: Sat Oct 25 12:08:33 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Sat Oct 25 12:08:33 2014 -0700

----------------------------------------------------------------------
 .../hydromatic/optiq/rules/java/JavaRowFormat.java  |  6 ++----
 .../net/hydromatic/optiq/rules/java/JavaRules.java  | 12 +++++-------
 .../net/hydromatic/optiq/rules/java/PhysType.java   |  4 ++++
 .../hydromatic/optiq/rules/java/PhysTypeImpl.java   | 16 ++++++++++++++--
 .../java/net/hydromatic/optiq/test/JdbcTest.java    |  8 ++++----
 5 files changed, 29 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/1f91bbf8/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRowFormat.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRowFormat.java b/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRowFormat.java
index 34cb92d..6773ff3 100644
--- a/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRowFormat.java
+++ b/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRowFormat.java
@@ -187,10 +187,8 @@ public enum JavaRowFormat {
           Object.class, stripCasts(expressions));
     }
 
-    @Override
-    public Expression comparer() {
-      return Expressions.call(
-          null, BuiltinMethod.ARRAY_COMPARER.method);
+    @Override public Expression comparer() {
+      return Expressions.call(BuiltinMethod.ARRAY_COMPARER.method);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/1f91bbf8/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRules.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRules.java b/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRules.java
index f6a4f0d..1384e53 100644
--- a/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRules.java
+++ b/core/src/main/java/net/hydromatic/optiq/rules/java/JavaRules.java
@@ -1338,9 +1338,9 @@ public class JavaRules {
         }
       }
       for (final AggImpState agg : aggs) {
-        results.add(agg.implementor.implementResult(
-            agg.context,
-            new AggResultContextImpl(resultBlock, agg.state)));
+        results.add(
+            agg.implementor.implementResult(agg.context,
+                new AggResultContextImpl(resultBlock, agg.state)));
       }
       resultBlock.add(physType.record(results));
       if (keyArity == 0) {
@@ -1369,7 +1369,7 @@ public class JavaRules {
             Expressions.return_(
                 null,
                 Expressions.call(
-                    childExp,
+                    inputPhysType.convertTo(childExp, physType),
                     BuiltinMethod.DISTINCT.method,
                     Expressions.<Expression>list()
                         .appendIfNotNull(physType.comparer()))));
@@ -1998,9 +1998,7 @@ public class JavaRules {
         final JavaTypeFactory typeFactory =
             (JavaTypeFactory) getCluster().getTypeFactory();
         PhysType physType =
-            PhysTypeImpl.of(
-                typeFactory,
-                table.getRowType(),
+            PhysTypeImpl.of(typeFactory, table.getRowType(),
                 JavaRowFormat.CUSTOM);
         List<Expression> expressionList = new ArrayList<Expression>();
         final PhysType childPhysType = result.physType;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/1f91bbf8/core/src/main/java/net/hydromatic/optiq/rules/java/PhysType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/rules/java/PhysType.java b/core/src/main/java/net/hydromatic/optiq/rules/java/PhysType.java
index bf97532..51e60a0 100644
--- a/core/src/main/java/net/hydromatic/optiq/rules/java/PhysType.java
+++ b/core/src/main/java/net/hydromatic/optiq/rules/java/PhysType.java
@@ -164,6 +164,10 @@ public interface PhysType {
   /** Returns a copy of this type that allows nulls if {@code nullable} is
    * true. */
   PhysType makeNullable(boolean nullable);
+
+  /** Converts an enumerable of this physical type to an enumerable that uses a
+   * given physical type for its rows. */
+  Expression convertTo(Expression expression, PhysType targetPhysType);
 }
 
 // End PhysType.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/1f91bbf8/core/src/main/java/net/hydromatic/optiq/rules/java/PhysTypeImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/net/hydromatic/optiq/rules/java/PhysTypeImpl.java b/core/src/main/java/net/hydromatic/optiq/rules/java/PhysTypeImpl.java
index d307299..e30ce21 100644
--- a/core/src/main/java/net/hydromatic/optiq/rules/java/PhysTypeImpl.java
+++ b/core/src/main/java/net/hydromatic/optiq/rules/java/PhysTypeImpl.java
@@ -29,6 +29,7 @@ import org.eigenbase.reltype.RelDataType;
 import org.eigenbase.reltype.RelDataTypeFactory;
 import org.eigenbase.reltype.RelDataTypeField;
 import org.eigenbase.util.Pair;
+import org.eigenbase.util.Util;
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
@@ -130,8 +131,7 @@ public class PhysTypeImpl implements PhysType {
       return Expressions.call(BuiltinMethod.IDENTITY_SELECTOR.method);
     default:
       return Expressions.lambda(Function1.class,
-          targetPhysType.record(fieldReferences(parameter, fields)),
-          parameter);
+          targetPhysType.record(fieldReferences(parameter, fields)), parameter);
     }
   }
 
@@ -178,6 +178,18 @@ public class PhysTypeImpl implements PhysType {
         Primitive.box(javaRowClass), format);
   }
 
+  public Expression convertTo(Expression exp, PhysType targetPhysType) {
+    final JavaRowFormat targetFormat = targetPhysType.getFormat();
+    if (format == targetFormat) {
+      return exp;
+    }
+    final ParameterExpression o_ =
+        Expressions.parameter(javaRowClass, "o");
+    final int fieldCount = rowType.getFieldCount();
+    return Expressions.call(exp, BuiltinMethod.SELECT.method,
+        generateSelector(o_, Util.range(fieldCount), targetFormat));
+  }
+
   public Pair<Expression, Expression> generateCollationKey(
       final List<RelFieldCollation> collations) {
     final Expression selector;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/1f91bbf8/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java b/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
index c2c09cc..2dca18e 100644
--- a/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
+++ b/core/src/test/java/net/hydromatic/optiq/test/JdbcTest.java
@@ -2932,16 +2932,16 @@ public class JdbcTest {
   }
 
   /** Test case for
-   * <a href="https://issues.apache.org/jira/browse/CALCITE-397">CALCITE-397</a>,
-   * "SELECT DISTINCT *" gives ClassCastException at runtime". */
-  @Ignore("CALCITE-397")
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-397">[CALCITE-397]
+   * "SELECT DISTINCT *" on reflective schema gives ClassCastException at
+   * runtime</a>. */
   @Test public void testSelectDistinctStar() {
     OptiqAssert.that()
         .with(OptiqAssert.Config.REGULAR)
         .query(
             "select distinct *\n"
             + "from \"hr\".\"emps\"\n")
-        .returnsCount(5)
+        .returnsCount(4)
         .planContains(".distinct(");
   }