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