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]])
 ]]>

Reply via email to