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 <wmy7...@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