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