This is an automated email from the ASF dual-hosted git repository. danny0405 pushed a commit to branch branch-1.22 in repository https://gitbox.apache.org/repos/asf/calcite.git
commit eaba5e8803a7d5e691af1600c0d31e718d71003d Author: shuo.cs <[email protected]> AuthorDate: Thu Feb 27 13:40:10 2020 +0800 [CALCITE-3830] The ‘approximate’ field should be considered when computing the digest of AggregateCall Add 'APPROXIMATE' keyword for the agg call to make the digest different with call that isn't approximate. close apache/calcite#1835 (cherry picked from commit cdd141df56e3c72315992c9a1477ff6d179b11d2) --- .../org/apache/calcite/rel/core/AggregateCall.java | 3 +++ .../org/apache/calcite/test/RelOptRulesTest.java | 19 +++++++++++++ .../org/apache/calcite/test/RelOptRulesTest.xml | 31 ++++++++++++++++++++++ .../apache/calcite/test/SqlToRelConverterTest.xml | 6 ++--- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java b/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java index ee2c9a4..8880389 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java +++ b/core/src/main/java/org/apache/calcite/rel/core/AggregateCall.java @@ -294,6 +294,9 @@ public class AggregateCall { public String toString() { StringBuilder buf = new StringBuilder(aggFunction.toString()); buf.append("("); + if (approximate) { + buf.append("APPROXIMATE "); + } if (distinct) { buf.append((argList.size() == 0) ? "DISTINCT" : "DISTINCT "); } diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java index 970c228..f178fa0 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -267,6 +267,25 @@ public class RelOptRulesTest extends RelOptTestBase { .check(); } + @Test public void testDigestOfApproximateDistinctAggregateCall() { + HepProgram preProgram = new HepProgramBuilder() + .build(); + + HepProgramBuilder builder = new HepProgramBuilder(); + builder.addRuleClass(AggregateProjectMergeRule.class); + HepPlanner hepPlanner = new HepPlanner(builder.build()); + hepPlanner.addRule(AggregateProjectMergeRule.INSTANCE); + + final String sql = "select *\n" + + "from (\n" + + "select deptno, count(distinct empno) from emp group by deptno\n" + + "union all\n" + + "select deptno, approx_count_distinct(empno) from emp group by deptno)"; + sql(sql).withPre(preProgram) + .with(hepPlanner) + .check(); + } + /** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-1479">[CALCITE-1479] * AssertionError in ReduceExpressionsRule on multi-column IN diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml index 1e1848d..9d45e6a 100644 --- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml @@ -164,6 +164,37 @@ LogicalProject(SAL=[$5]) ]]> </Resource> </TestCase> + <TestCase name="testDigestOfApproximateDistinctAggregateCall"> + <Resource name="sql"> + <![CDATA[select * +from ( +select deptno, count(distinct empno) from emp group by deptno +union all +select deptno, approx_count_distinct(empno) from emp group by deptno)]]> + </Resource> + <Resource name="planAfter"> + <![CDATA[ +LogicalProject(DEPTNO=[$0], EXPR$1=[$1]) + LogicalUnion(all=[true]) + LogicalAggregate(group=[{7}], EXPR$1=[COUNT(DISTINCT $0)]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) + LogicalAggregate(group=[{7}], EXPR$1=[COUNT(APPROXIMATE DISTINCT $0)]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + <Resource name="planBefore"> + <![CDATA[ +LogicalProject(DEPTNO=[$0], EXPR$1=[$1]) + LogicalUnion(all=[true]) + LogicalAggregate(group=[{0}], EXPR$1=[COUNT(DISTINCT $1)]) + LogicalProject(DEPTNO=[$7], EMPNO=[$0]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) + LogicalAggregate(group=[{0}], EXPR$1=[COUNT(APPROXIMATE DISTINCT $1)]) + LogicalProject(DEPTNO=[$7], EMPNO=[$0]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + </TestCase> <TestCase name="testReduceOrCaseWhen"> <Resource name="sql"> <![CDATA[select sal diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml index 7760390..e710248 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -28,7 +28,7 @@ from sales.dept_nested]]> <Resource name="plan"> <![CDATA[ LogicalProject(COLLECT_SKILL=[$0], COUNT_SKILL=[$1], COUNT_STAR=[$1], APPROX_COUNT_DISTINCT_SKILL=[$2], MAX_SKILL=[ROW($3.TYPE, $3.DESC, ROW($3.OTHERS.A, $3.OTHERS.B))], MIN_SKILL=[ROW($4.TYPE, $4.DESC, ROW($4.OTHERS.A, $4.OTHERS.B))], ANY_VALUE_SKILL=[ROW($5.TYPE, $5.DESC, ROW($5.OTHERS.A, $5.OTHERS.B))]) - LogicalAggregate(group=[{}], COLLECT_SKILL=[COLLECT($0)], COUNT_SKILL=[COUNT()], APPROX_COUNT_DISTINCT_SKILL=[COUNT(DISTINCT $0)], MAX_SKILL=[MAX($0)], MIN_SKILL=[MIN($0)], ANY_VALUE_SKILL=[ANY_VALUE($0)]) + LogicalAggregate(group=[{}], COLLECT_SKILL=[COLLECT($0)], COUNT_SKILL=[COUNT()], APPROX_COUNT_DISTINCT_SKILL=[COUNT(APPROXIMATE DISTINCT $0)], MAX_SKILL=[MAX($0)], MIN_SKILL=[MIN($0)], ANY_VALUE_SKILL=[ANY_VALUE($0)]) LogicalProject(SKILL=[ROW($2.TYPE, $2.DESC, ROW($2.OTHERS.A, $2.OTHERS.B))]) LogicalTableScan(table=[[CATALOG, SALES, DEPT_NESTED]]) ]]> @@ -46,7 +46,7 @@ from sales.dept_nested group by name]]> <Resource name="plan"> <![CDATA[ LogicalProject(COLLECT_SKILL=[$1], COUNT_SKILL=[$2], COUNT_STAR=[$2], APPROX_COUNT_DISTINCT_SKILL=[$3], MAX_SKILL=[ROW($4.TYPE, $4.DESC, ROW($4.OTHERS.A, $4.OTHERS.B))], MIN_SKILL=[ROW($5.TYPE, $5.DESC, ROW($5.OTHERS.A, $5.OTHERS.B))], ANY_VALUE_SKILL=[ROW($6.TYPE, $6.DESC, ROW($6.OTHERS.A, $6.OTHERS.B))]) - LogicalAggregate(group=[{0}], COLLECT_SKILL=[COLLECT($1)], COUNT_SKILL=[COUNT()], APPROX_COUNT_DISTINCT_SKILL=[COUNT(DISTINCT $1)], MAX_SKILL=[MAX($1)], MIN_SKILL=[MIN($1)], ANY_VALUE_SKILL=[ANY_VALUE($1)]) + LogicalAggregate(group=[{0}], COLLECT_SKILL=[COLLECT($1)], COUNT_SKILL=[COUNT()], APPROX_COUNT_DISTINCT_SKILL=[COUNT(APPROXIMATE DISTINCT $1)], MAX_SKILL=[MAX($1)], MIN_SKILL=[MIN($1)], ANY_VALUE_SKILL=[ANY_VALUE($1)]) LogicalProject(NAME=[$1], SKILL=[ROW($2.TYPE, $2.DESC, ROW($2.OTHERS.A, $2.OTHERS.B))]) LogicalTableScan(table=[[CATALOG, SALES, DEPT_NESTED]]) ]]> @@ -6476,7 +6476,7 @@ GROUP BY empno]]> </Resource> <Resource name="plan"> <![CDATA[ -LogicalAggregate(group=[{0}], EXPR$1=[COUNT(DISTINCT $1)], EXPR$2=[COUNT(DISTINCT $1)]) +LogicalAggregate(group=[{0}], EXPR$1=[COUNT(DISTINCT $1)], EXPR$2=[COUNT(APPROXIMATE DISTINCT $1)]) LogicalProject(EMPNO=[$0], ENAME=[$1]) LogicalTableScan(table=[[CATALOG, SALES, EMP]]) ]]>
