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