You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2015/06/16 18:39:33 UTC

incubator-calcite git commit: [CALCITE-753] Aggregate operators may derive row types with duplicate column names Close apache/incubator-calcite#91

Repository: incubator-calcite
Updated Branches:
  refs/heads/master f3cae1306 -> ccdda9b20


[CALCITE-753] Aggregate operators may derive row types with duplicate column names Close apache/incubator-calcite#91


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

Branch: refs/heads/master
Commit: ccdda9b203a9468e439eb2dbffc0359658fb38c3
Parents: f3cae13
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Tue Jun 16 17:38:55 2015 +0100
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Tue Jun 16 17:38:55 2015 +0100

----------------------------------------------------------------------
 .../org/apache/calcite/rel/core/Aggregate.java  | 40 +++++++++++++++++---
 .../calcite/test/SqlToRelConverterTest.java     |  8 ++++
 .../calcite/test/SqlToRelConverterTest.xml      | 13 +++++++
 3 files changed, 56 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/ccdda9b2/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
index b95e44c..3250ae1 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
@@ -46,9 +46,11 @@ import org.apache.calcite.util.Util;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import com.google.common.math.IntMath;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * Relational operator that eliminates
@@ -322,29 +324,57 @@ public abstract class Aggregate extends SingleRel {
     assert groupList.size() == groupSet.cardinality();
     final RelDataTypeFactory.FieldInfoBuilder builder = typeFactory.builder();
     final List<RelDataTypeField> fieldList = inputRowType.getFieldList();
+    final Set<String> containedNames = Sets.newHashSet();
     for (int groupKey : groupList) {
-      builder.add(fieldList.get(groupKey));
+      final RelDataTypeField field = fieldList.get(groupKey);
+      containedNames.add(field.getName());
+      builder.add(field);
     }
     if (indicator) {
       for (int groupKey : groupList) {
         final RelDataType booleanType =
             typeFactory.createTypeWithNullability(
                 typeFactory.createSqlType(SqlTypeName.BOOLEAN), false);
-        builder.add("i$" + fieldList.get(groupKey).getName(), booleanType);
+        final String base = "i$" + fieldList.get(groupKey).getName();
+        String name = base;
+        int i = 0;
+        while (containedNames.contains(name)) {
+          name = base + "_" + i++;
+        }
+        containedNames.add(name);
+        builder.add(name, booleanType);
       }
     }
     for (Ord<AggregateCall> aggCall : Ord.zip(aggCalls)) {
-      String name;
+      final String base;
       if (aggCall.e.name != null) {
-        name = aggCall.e.name;
+        base = aggCall.e.name;
       } else {
-        name = "$f" + (groupList.size() + aggCall.i);
+        base = "$f" + (groupList.size() + aggCall.i);
+      }
+      String name = base;
+      int i = 0;
+      while (containedNames.contains(name)) {
+        name = base + "_" + i++;
       }
+      containedNames.add(name);
       builder.add(name, aggCall.e.type);
     }
     return builder.build();
   }
 
+  public boolean isValid(boolean fail) {
+    if (!super.isValid(fail)) {
+      assert !fail;
+      return false;
+    }
+    if (!Util.isDistinct(getRowType().getFieldNames())) {
+      assert !fail : getRowType();
+      return false;
+    }
+    return true;
+  }
+
   /**
    * Returns whether the inferred type of an {@link AggregateCall} matches the
    * type it was given when it was created.

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/ccdda9b2/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index 08a01a9..3d2b48f 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1115,6 +1115,14 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
         .convertsTo("${plan}");
   }
 
+  /**
+   * [CALCITE-753] Test aggregate operators do not derive row types with duplicate column names
+   */
+  @Test public void testAggNoDuplicateColumnNames() {
+    sql("SELECT empno, EXPR$2, COUNT(empno) FROM (SELECT empno, deptno AS EXPR$2 "
+            + "FROM emp) GROUP BY empno, EXPR$2").convertsTo("${plan}");
+  }
+
   @Test public void testAggScalarSubquery() {
     sql("SELECT SUM(SELECT min(deptno) FROM dept) FROM emp")
         .convertsTo("${plan}");

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/ccdda9b2/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
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 b3be8ce..58777ab 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -2316,6 +2316,19 @@ LogicalAggregate(group=[{0}])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testAggNoDuplicateColumnNames">
+        <Resource name="sql">
+            <![CDATA[SELECT empno, EXPR$2, COUNT(empno) FROM (SELECT empno, deptno AS EXPR$2
+FROM emp) GROUP BY empno, EXPR$2]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalAggregate(group=[{0, 1}], EXPR$2=[COUNT()])
+  LogicalProject(EMPNO=[$0], EXPR$2=[$7])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testAggCaseSubquery">
         <Resource name="sql">
             <![CDATA[SELECT SUM(CASE WHEN empno IN (3) THEN 0 ELSE 1 END) FROM emp]]>