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>

Reply via email to