Repository: calcite
Updated Branches:
  refs/heads/master 5324a3988 -> 7ce2e6213


[CALCITE-998] Exception when calling STDDEV_SAMP, STDDEV_POP (Matthew Shaer)

Close apache/calcite#191

Also, fix some javadoc,
and close an unrelated PR that was merged a while ago:

Close apache/calcite#174


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

Branch: refs/heads/master
Commit: 7ce2e62133be221e65d67250ad28809324d055c8
Parents: 5324a39
Author: Matthew Shaer <[email protected]>
Authored: Wed Feb 3 17:08:11 2016 +0000
Committer: Julian Hyde <[email protected]>
Committed: Wed Feb 3 14:21:11 2016 -0800

----------------------------------------------------------------------
 .../rel/rules/AggregateReduceFunctionsRule.java | 14 +++++--
 .../main/java/org/apache/calcite/util/Pair.java |  3 +-
 .../calcite/sql/test/SqlOperatorBaseTest.java   | 42 ++++++++++----------
 core/src/test/resources/sql/agg.iq              | 40 +++++++++++++++++++
 .../org/apache/calcite/linq4j/GroupingImpl.java |  3 +-
 5 files changed, 74 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/7ce2e621/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
index 578ecde..fca05ed 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
@@ -16,6 +16,7 @@
  */
 package org.apache.calcite.rel.rules;
 
+import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
@@ -25,6 +26,7 @@ import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexLiteral;
@@ -373,7 +375,9 @@ public class AggregateReduceFunctionsRule extends 
RelOptRule {
     //     / nullif(count(x) - 1, 0),
     //     .5)
     final int nGroups = oldAggRel.getGroupCount();
-    final RexBuilder rexBuilder = oldAggRel.getCluster().getRexBuilder();
+    final RelOptCluster cluster = oldAggRel.getCluster();
+    final RexBuilder rexBuilder = cluster.getRexBuilder();
+    final RelDataTypeFactory typeFactory = cluster.getTypeFactory();
 
     assert oldCall.getArgList().size() == 1 : oldCall.getArgList();
     final int argOrdinal = oldCall.getArgList().get(0);
@@ -388,15 +392,17 @@ public class AggregateReduceFunctionsRule extends 
RelOptRule {
             SqlStdOperatorTable.MULTIPLY, argRef, argRef);
     final int argSquaredOrdinal = lookupOrAdd(inputExprs, argSquared);
 
+    final Aggregate.AggCallBinding binding =
+        new Aggregate.AggCallBinding(typeFactory, SqlStdOperatorTable.SUM,
+            ImmutableList.of(argRef.getType()), oldAggRel.getGroupCount(),
+            oldCall.filterArg >= 0);
     final AggregateCall sumArgSquaredAggCall =
         AggregateCall.create(
             SqlStdOperatorTable.SUM,
             oldCall.isDistinct(),
             ImmutableIntList.of(argSquaredOrdinal),
             oldCall.filterArg,
-            oldAggRel.getGroupCount(),
-            oldAggRel.getInput(),
-            null,
+            SqlStdOperatorTable.SUM.inferReturnType(binding),
             null);
     final RexNode sumArgSquared =
         rexBuilder.addAggCall(sumArgSquaredAggCall,

http://git-wip-us.apache.org/repos/asf/calcite/blob/7ce2e621/core/src/main/java/org/apache/calcite/util/Pair.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Pair.java 
b/core/src/main/java/org/apache/calcite/util/Pair.java
index cf4baac..c2dc1fd 100644
--- a/core/src/main/java/org/apache/calcite/util/Pair.java
+++ b/core/src/main/java/org/apache/calcite/util/Pair.java
@@ -85,7 +85,8 @@ public class Pair<T1, T2>
 
   /** {@inheritDoc}
    *
-   * <p>Computes hash code consistent with {@link Map.Entry#hashCode()}. */
+   * <p>Computes hash code consistent with
+   * {@link java.util.Map.Entry#hashCode()}. */
   @Override public int hashCode() {
     int keyHash = left == null ? 0 : left.hashCode();
     int valueHash = right == null ? 0 : right.hashCode();

http://git-wip-us.apache.org/repos/asf/calcite/blob/7ce2e621/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java 
b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
index 6a35641..54e808a 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlOperatorBaseTest.java
@@ -4716,16 +4716,15 @@ public abstract class SqlOperatorBaseTest {
     tester.checkType("stddev_pop(CAST(NULL AS INTEGER))", "INTEGER");
     checkAggType(tester, "stddev_pop(DISTINCT 1.5)", "DECIMAL(2, 1) NOT NULL");
     final String[] values = {"0", "CAST(null AS FLOAT)", "3", "3"};
-    if (!enable) {
-      return;
+    if (enable) {
+      // verified on Oracle 10g
+      tester.checkAgg("stddev_pop(x)", values, 1.414213562373095d,
+          0.000000000000001d);
+      // Oracle does not allow distinct
+      tester.checkAgg("stddev_pop(DISTINCT x)", values, 1.5d, 0d);
+      tester.checkAgg("stddev_pop(DISTINCT CASE x WHEN 0 THEN NULL ELSE -1 
END)",
+          values, 0, 0d);
     }
-    // verified on Oracle 10g
-    tester.checkAgg("stddev_pop(x)", values, 1.414213562373095d,
-        0.000000000000001d);
-    // Oracle does not allow distinct
-    tester.checkAgg("stddev_pop(DISTINCT x)", values, 1.5d, 0d);
-    tester.checkAgg("stddev_pop(DISTINCT CASE x WHEN 0 THEN NULL ELSE -1 END)",
-        values, 0, 0d);
     // with one value
     tester.checkAgg("stddev_pop(x)", new String[]{"5"}, 0, 0d);
     // with zero values
@@ -4745,20 +4744,19 @@ public abstract class SqlOperatorBaseTest {
     tester.checkType("stddev_samp(CAST(NULL AS INTEGER))", "INTEGER");
     checkAggType(tester, "stddev_samp(DISTINCT 1.5)", "DECIMAL(2, 1) NOT 
NULL");
     final String[] values = {"0", "CAST(null AS FLOAT)", "3", "3"};
-    if (!enable) {
-      return;
+    if (enable) {
+      // verified on Oracle 10g
+      tester.checkAgg("stddev_samp(x)", values, 1.732050807568877d,
+          0.000000000000001d);
+      // Oracle does not allow distinct
+      tester.checkAgg("stddev_samp(DISTINCT x)", values, 2.121320343559642d,
+          0.000000000000001d);
+      tester.checkAgg(
+          "stddev_samp(DISTINCT CASE x WHEN 0 THEN NULL ELSE -1 END)",
+          values,
+          null,
+          0d);
     }
-    // verified on Oracle 10g
-    tester.checkAgg("stddev_samp(x)", values, 1.732050807568877d,
-        0.000000000000001d);
-    // Oracle does not allow distinct
-    tester.checkAgg("stddev_samp(DISTINCT x)", values, 2.121320343559642d,
-        0.000000000000001d);
-    tester.checkAgg(
-        "stddev_samp(DISTINCT CASE x WHEN 0 THEN NULL ELSE -1 END)",
-        values,
-        null,
-        0d);
     // with one value
     tester.checkAgg(
         "stddev_samp(x)",

http://git-wip-us.apache.org/repos/asf/calcite/blob/7ce2e621/core/src/test/resources/sql/agg.iq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/agg.iq 
b/core/src/test/resources/sql/agg.iq
index 39bd683..3b1f58e 100644
--- a/core/src/test/resources/sql/agg.iq
+++ b/core/src/test/resources/sql/agg.iq
@@ -62,6 +62,46 @@ select count(deptno, ename, 1, deptno) as c from emp;
 
 !ok
 
+# [CALCITE-998] Exception when calling STDDEV_SAMP, STDDEV_POP
+# stddev_samp
+select stddev_samp(deptno) as s from emp;
++----+
+| S  |
++----+
+| 19 |
++----+
+(1 row)
+
+!ok
+
+# stddev_pop
+select stddev_pop(deptno) as s from emp;
++----+
+| S  |
++----+
+| 17 |
++----+
+(1 row)
+
+!ok
+
+# both
+select gender,
+  stddev_pop(deptno) as p,
+  stddev_samp(deptno) as s,
+  count(deptno) as c
+from emp
+group by gender;
++--------+----+----+---+
+| GENDER | P  | S  | C |
++--------+----+----+---+
+| F      | 17 | 19 | 5 |
+| M      | 17 | 20 | 3 |
++--------+----+----+---+
+(2 rows)
+
+!ok
+
 select city, gender as c from emps;
 +---------------+---+
 | CITY          | C |

http://git-wip-us.apache.org/repos/asf/calcite/blob/7ce2e621/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java
----------------------------------------------------------------------
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java 
b/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java
index 42de3bf..65af763 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/GroupingImpl.java
@@ -43,7 +43,8 @@ class GroupingImpl<K, V> extends AbstractEnumerable<V>
 
   /** {@inheritDoc}
    *
-   * <p>Computes hash code consistent with {@link Map.Entry#hashCode()}. */
+   * <p>Computes hash code consistent with
+   * {@link java.util.Map.Entry#hashCode()}. */
   @Override public int hashCode() {
     return key.hashCode() ^ values.hashCode();
   }

Reply via email to