You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by za...@apache.org on 2019/04/20 14:36:57 UTC

[calcite] branch master updated: [CALCITE-2962] RelStructuredTypeFlattener generates wrong types for nested column when flattenProjection (Will Yu)

This is an automated email from the ASF dual-hosted git repository.

zabetak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new a51a187  [CALCITE-2962] RelStructuredTypeFlattener generates wrong types for nested column when flattenProjection (Will Yu)
a51a187 is described below

commit a51a187c2216351905d0da552dd59479ba5b6bd6
Author: Will Yu <wm...@gmail.com>
AuthorDate: Tue Apr 9 22:15:39 2019 -0700

    [CALCITE-2962] RelStructuredTypeFlattener generates wrong types for nested column when flattenProjection (Will Yu)
    
    Close #1152
---
 .../sql2rel/RelStructuredTypeFlattener.java        |  4 ++--
 .../apache/calcite/test/SqlToRelConverterTest.java | 25 ++++++++++++++++++++++
 .../org/apache/calcite/test/SqlValidatorTest.java  |  3 ++-
 .../org/apache/calcite/test/catalog/Fixture.java   |  1 +
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 12 +++++++++++
 5 files changed, 42 insertions(+), 3 deletions(-)

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 6b26808..fdf1762 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java
@@ -619,9 +619,9 @@ public class RelStructuredTypeFlattener implements ReflectiveVisitor {
         int n = fieldList.size();
         for (int j = 0; j < n; ++j) {
           final Ord<RelDataType> newField =
-              getNewFieldForOldInput(inputRef.getIndex());
+              getNewFieldForOldInput(inputRef.getIndex(), j);
           flattenedExps.add(
-              Pair.of(new RexInputRef(newField.i + j, newField.e),
+              Pair.of(new RexInputRef(newField.i, newField.e),
                   fieldName));
         }
       } else if (isConstructor(exp) || exp.isA(SqlKind.CAST)) {
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 35b8841..a0df5ce 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -2648,6 +2648,31 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql).ok();
   }
 
+  /**
+   * Test case for <a href="https://issues.apache.org/jira/browse/CALCITE-2962">[CALCITE-2962]
+   * RelStructuredTypeFlattener generates wrong types for nested column when flattenProjection</a>.
+   */
+  @Test
+  public void testSelectNestedColumnType() {
+    final String sql =
+        "select\n"
+            + "  char_length(coord.\"unit\") as unit_length\n"
+            + "from\n"
+            + "  (\n"
+            + "    select\n"
+            + "      fname,\n"
+            + "      coord\n"
+            + "    from\n"
+            + "      customer.contact_peek\n"
+            + "    where\n"
+            + "      coord.x > 1\n"
+            + "      and coord.y > 1\n"
+            + "  ) as view\n"
+            + "where\n"
+            + "  fname = 'john'";
+    sql(sql).ok();
+  }
+
   @Test public void testDynamicSchemaUnnest() {
     final String sql3 = "select t1.c_nationkey, t3.fake_col3\n"
         + "from SALES.CUSTOMER as t1,\n"
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 4238a9c..b9dad50 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -8157,7 +8157,8 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
     sql("SELECT * FROM customer.contact_peek as c")
         .type("RecordType(INTEGER NOT NULL CONTACTNO, VARCHAR(10) NOT NULL FNAME, "
             + "VARCHAR(10) NOT NULL LNAME, VARCHAR(20) NOT NULL EMAIL, INTEGER NOT NULL X, "
-            + "INTEGER NOT NULL Y, RecordType:peek_no_expand(INTEGER NOT NULL M, "
+            + "INTEGER NOT NULL Y, VARCHAR(20) NOT NULL unit, "
+            + "RecordType:peek_no_expand(INTEGER NOT NULL M, "
             + "RecordType:peek_no_expand(INTEGER NOT NULL A, INTEGER NOT NULL B) "
             + "NOT NULL SUB) NOT NULL COORD_NE) NOT NULL");
 
diff --git a/core/src/test/java/org/apache/calcite/test/catalog/Fixture.java b/core/src/test/java/org/apache/calcite/test/catalog/Fixture.java
index 90e7e2d..3bfca7f 100644
--- a/core/src/test/java/org/apache/calcite/test/catalog/Fixture.java
+++ b/core/src/test/java/org/apache/calcite/test/catalog/Fixture.java
@@ -75,6 +75,7 @@ final class Fixture {
         typeFactory.builder()
             .add("X", intType)
             .add("Y", intType)
+            .add("unit", varchar20Type)
             .kind(StructKind.PEEK_FIELDS)
             .build();
     rectilinearPeekNoExpandCoordType =
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 466a065..619a766 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -870,6 +870,18 @@ LogicalProject(ZIP=[$4])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testSelectNestedColumnType">
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(UNIT_LENGTH=[CHAR_LENGTH($3)])
+  LogicalFilter(condition=[=($0, 'john')])
+    LogicalProject(FNAME=[$1], COORD=[$4], COORD2=[$5], COORD3=[$6])
+      LogicalFilter(condition=[AND(>($4, 1), >($5, 1))])
+        LogicalProject(CONTACTNO=[$0], FNAME=[$1], LNAME=[$2], EMAIL=[$3], X=[$4.X], Y=[$4.Y], unit=[$4.unit], M=[$5.M], A=[$5.SUB.A], B=[$5.SUB.B])
+          LogicalTableScan(table=[[CATALOG, CUSTOMER, CONTACT_PEEK]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testDynamicSchemaUnnest">
         <Resource name="sql">
             <![CDATA[select t1.c_nationkey, t3.fake_col3