Repository: calcite Updated Branches: refs/heads/master 03ec2cfda -> d0a119d50
[CALCITE-2220] SqlToRelConverter generates incorrect ordinal while flattening a record-valued field (Shuyi Chen) Close apache/calcite#651 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/8affc8dc Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/8affc8dc Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/8affc8dc Branch: refs/heads/master Commit: 8affc8dc74bd6eaa88a1849cb41120dd0fe78b00 Parents: 03ec2cf Author: Shuyi Chen <[email protected]> Authored: Thu Mar 22 01:05:14 2018 -0700 Committer: Julian Hyde <[email protected]> Committed: Mon Mar 26 21:30:00 2018 -0700 ---------------------------------------------------------------------- .../calcite/sql2rel/RelStructuredTypeFlattener.java | 14 ++++++++++++-- .../org/apache/calcite/test/MockCatalogReader.java | 1 + .../apache/calcite/test/SqlToRelConverterTest.java | 4 ++++ .../apache/calcite/test/SqlToRelConverterTest.xml | 16 +++++++++++++++- 4 files changed, 32 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/8affc8dc/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java index 28ed8f1..ae830a5 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java @@ -75,6 +75,7 @@ import org.apache.calcite.util.Util; import org.apache.calcite.util.mapping.Mappings; import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.SortedSetMultimap; @@ -627,9 +628,18 @@ public class RelStructuredTypeFlattener implements ReflectiveVisitor { // functions which return row types working. int j = 0; - for (RelDataTypeField field : exp.getType().getFieldList()) { + RexNode newExp = exp; + List<RexNode> oldOperands = ((RexCall) exp).getOperands(); + if (oldOperands.get(0) instanceof RexInputRef) { + RexInputRef inputRef = (RexInputRef) oldOperands.get(0); + int newOffset = getNewForOldInput(inputRef.getIndex()); + newExp = rexBuilder.makeCall(exp.getType(), ((RexCall) exp).getOperator(), + ImmutableList.of( + rexBuilder.makeInputRef(inputRef.getType(), newOffset), oldOperands.get(1))); + } + for (RelDataTypeField field : newExp.getType().getFieldList()) { flattenedExps.add( - Pair.of(rexBuilder.makeFieldAccess(exp, field.getIndex()), + Pair.of(rexBuilder.makeFieldAccess(newExp, field.getIndex()), fieldName + "$" + (j++))); } } else { http://git-wip-us.apache.org/repos/asf/calcite/blob/8affc8dc/core/src/test/java/org/apache/calcite/test/MockCatalogReader.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/MockCatalogReader.java b/core/src/test/java/org/apache/calcite/test/MockCatalogReader.java index 23c6b94..e179d05 100644 --- a/core/src/test/java/org/apache/calcite/test/MockCatalogReader.java +++ b/core/src/test/java/org/apache/calcite/test/MockCatalogReader.java @@ -247,6 +247,7 @@ public class MockCatalogReader extends CalciteCatalogReader { MockTable.create(this, salesSchema, "DEPT_NESTED", false, 4); deptNestedTable.addColumn("DEPTNO", f.intType, true); deptNestedTable.addColumn("NAME", f.varchar10Type); + deptNestedTable.addColumn("SKILL", f.skillRecordType); deptNestedTable.addColumn("EMPLOYEES", f.empListType); registerTable(deptNestedTable); http://git-wip-us.apache.org/repos/asf/calcite/blob/8affc8dc/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 95a506b..a888a23 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -1106,6 +1106,10 @@ public class SqlToRelConverterTest extends SqlToRelTestBase { sql("select employees[1].detail.skills[2+3].desc from dept_nested").ok(); } + @Test public void testFlattenRecords() { + sql("select employees[1] from dept_nested").ok(); + } + @Test public void testUnnestArray() { sql("select*from unnest(array(select*from dept))").ok(); } http://git-wip-us.apache.org/repos/asf/calcite/blob/8affc8dc/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 089fd56..6fd5657 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -366,7 +366,21 @@ window w as (partition by productId)]]> <Resource name="plan"> <![CDATA[ LogicalProject(EXPR$0=[DOT(ITEM(DOT(DOT(ITEM($2, 1), 'DETAIL'), 'SKILLS'), +(2, 3)), 'DESC')]) - LogicalTableScan(table=[[CATALOG, SALES, DEPT_NESTED]]) + LogicalProject(DEPTNO=[$0], NAME=[$1], TYPE=[$2.TYPE], DESC=[$2.DESC], EMPLOYEES=[$3]) + LogicalTableScan(table=[[CATALOG, SALES, DEPT_NESTED]]) +]]> + </Resource> + </TestCase> + <TestCase name="testFlattenRecords"> + <Resource name="sql"> + <![CDATA[select employees[1] from dept_nested]]> + </Resource> + <Resource name="plan"> + <![CDATA[ +LogicalProject(EXPR$0=[$0]) + LogicalProject(EXPR$0$0=[ITEM($6, 1).EMPNO], EXPR$0$1=[ITEM($6, 1).ENAME], EXPR$0$2=[ITEM($6, 1).DETAIL]) + LogicalProject(DEPTNO=[$0], NAME=[$1], TYPE=[$2.TYPE], DESC=[$2.DESC], A=[$2.OTHERS.A], B=[$2.OTHERS.B], EMPLOYEES=[$3]) + LogicalTableScan(table=[[CATALOG, SALES, DEPT_NESTED]]) ]]> </Resource> </TestCase>
