You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2018/05/01 22:44:30 UTC

[1/4] calcite git commit: [CALCITE-2287] FlatList.equals() throws StackOverflowError (Zhong Yu)

Repository: calcite
Updated Branches:
  refs/heads/master e78f8c61e -> 2b93eaa35


[CALCITE-2287] FlatList.equals() throws StackOverflowError (Zhong Yu)

Close apache/calcite#682


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/7924eb0e
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/7924eb0e
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/7924eb0e

Branch: refs/heads/master
Commit: 7924eb0eb38e7955b054919788baf45f9e72cd6f
Parents: 08e4322
Author: yuzhong <yu...@alibaba-inc.com>
Authored: Fri Apr 27 15:05:25 2018 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue May 1 02:01:32 2018 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/runtime/FlatLists.java   | 32 ++++++++++++++------
 1 file changed, 23 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/7924eb0e/core/src/main/java/org/apache/calcite/runtime/FlatLists.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java
index 13c92ff..94cfce1 100644
--- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java
+++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java
@@ -333,7 +333,9 @@ public class FlatLists {
         Flat1List that = (Flat1List) o;
         return Objects.equals(this.t0, that.t0);
       }
-      return Collections.singletonList(t0).equals(o);
+      return o instanceof List
+          && ((List) o).size() == 1
+          && Objects.equals(t0, ((List) o).get(0));
     }
 
     public int hashCode() {
@@ -444,7 +446,11 @@ public class FlatLists {
         return Objects.equals(this.t0, that.t0)
             && Objects.equals(this.t1, that.t1);
       }
-      return Arrays.asList(t0, t1).equals(o);
+      if (o instanceof List) {
+        List lo = (List) o;
+        return lo.size() == 2 && o.equals(this);
+      }
+      return false;
     }
 
     public int hashCode() {
@@ -574,7 +580,9 @@ public class FlatLists {
             && Objects.equals(this.t1, that.t1)
             && Objects.equals(this.t2, that.t2);
       }
-      return o.equals(this);
+      return o instanceof List
+          && ((List) o).size() == 3
+          && Arrays.asList(t0, t1, t2).equals(o);
     }
 
     public int hashCode() {
@@ -686,7 +694,7 @@ public class FlatLists {
     }
 
     public String toString() {
-      return "[" + t0 + ", " + t1 + ", " + t2 + "," + t3 + "]";
+      return "[" + t0 + ", " + t1 + ", " + t2 + ", " + t3 + "]";
     }
 
     public T get(int index) {
@@ -723,7 +731,9 @@ public class FlatLists {
             && Objects.equals(this.t2, that.t2)
             && Objects.equals(this.t3, that.t3);
       }
-      return o.equals(this);
+      return o instanceof List
+          && ((List) o).size() == 4
+          && Arrays.asList(t0, t1, t2, t3).equals(o);
     }
 
     public int hashCode() {
@@ -851,7 +861,7 @@ public class FlatLists {
     }
 
     public String toString() {
-      return "[" + t0 + ", " + t1 + ", " + t2 + "," + t3 + ", " + t4 + "]";
+      return "[" + t0 + ", " + t1 + ", " + t2 + ", " + t3 + ", " + t4 + "]";
     }
 
     public T get(int index) {
@@ -891,7 +901,9 @@ public class FlatLists {
             && Objects.equals(this.t3, that.t3)
             && Objects.equals(this.t4, that.t4);
       }
-      return o.equals(this);
+      return o instanceof List
+          && ((List) o).size() == 5
+          && Arrays.asList(t0, t1, t2, t3, t4).equals(o);
     }
 
     public int hashCode() {
@@ -1035,7 +1047,7 @@ public class FlatLists {
     }
 
     public String toString() {
-      return "[" + t0 + ", " + t1 + ", " + t2 + "," + t3 + ", " + t4
+      return "[" + t0 + ", " + t1 + ", " + t2 + ", " + t3 + ", " + t4
           + ", " + t5 + "]";
     }
 
@@ -1079,7 +1091,9 @@ public class FlatLists {
             && Objects.equals(this.t4, that.t4)
             && Objects.equals(this.t5, that.t5);
       }
-      return o.equals(this);
+      return o instanceof List
+          && ((List) o).size() == 6
+          && Arrays.asList(t0, t1, t2, t3, t4, t5).equals(o);
     }
 
     public int hashCode() {


[3/4] calcite git commit: [CALCITE-2159] Support dynamic row type in UNNEST (Chunhui Shi)

Posted by jh...@apache.org.
[CALCITE-2159] Support dynamic row type in UNNEST (Chunhui Shi)

Also:
* Added a method RelDataTypeFactory.Builder.buildDynamic() so you can
  build dynamic types the same way as you build regular struct types.
* Removed SqlParser.Config.allowBangEqual; it was not used.

Close apache/calcite#672


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/c3f2705f
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/c3f2705f
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/c3f2705f

Branch: refs/heads/master
Commit: c3f2705f65da71ecf70aa6fc1fb42ecf07114790
Parents: 7924eb0
Author: chunhui-shi <cs...@maprtech.com>
Authored: Wed Apr 18 16:47:36 2018 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue May 1 11:16:47 2018 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/rel/core/Uncollect.java  | 16 +++-
 .../calcite/rel/type/RelDataTypeFactory.java    |  9 ++
 .../calcite/rel/type/RelDataTypeHolder.java     |  6 +-
 .../apache/calcite/sql/SqlUnnestOperator.java   | 18 +++-
 .../apache/calcite/sql/parser/SqlParser.java    |  4 -
 .../apache/calcite/sql/type/SqlTypeUtil.java    |  9 ++
 .../calcite/sql/validate/UnnestNamespace.java   | 31 +++----
 .../calcite/test/SqlToRelConverterTest.java     | 40 ++++++++-
 .../apache/calcite/test/SqlToRelTestBase.java   |  7 +-
 .../calcite/test/SqlToRelConverterTest.xml      | 93 +++++++++++++++++++-
 10 files changed, 201 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java b/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java
index 0f9e0b9..0c531cb 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java
@@ -23,6 +23,7 @@ import org.apache.calcite.rel.RelInput;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelWriter;
 import org.apache.calcite.rel.SingleRel;
+import org.apache.calcite.rel.type.DynamicRecordType;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
@@ -123,8 +124,19 @@ public class Uncollect extends SingleRel {
     RelDataType inputType = rel.getRowType();
     assert inputType.isStruct() : inputType + " is not a struct";
     final List<RelDataTypeField> fields = inputType.getFieldList();
-    final RelDataTypeFactory.Builder builder =
-        rel.getCluster().getTypeFactory().builder();
+    final RelDataTypeFactory typeFactory = rel.getCluster().getTypeFactory();
+    final RelDataTypeFactory.Builder builder = typeFactory.builder();
+
+    if (fields.size() == 1
+        && fields.get(0).getType().getSqlTypeName() == SqlTypeName.ANY) {
+      // Component type is unknown to Uncollect, build dynamic star record
+      // type. Only consider ONE field case for unknown type.
+      return builder
+          .add(DynamicRecordType.DYNAMIC_STAR_PREFIX, SqlTypeName.ANY)
+          .nullable(true)
+          .build();
+    }
+
     for (RelDataTypeField field : fields) {
       if (field.getType() instanceof MapSqlType) {
         builder.add(SqlUnnestOperator.MAP_KEY_COLUMN_NAME, field.getType().getKeyType());

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java
index 1eeffb6..da65d87 100644
--- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java
+++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactory.java
@@ -549,6 +549,15 @@ public interface RelDataTypeFactory {
       return typeFactory.createStructType(kind, types, names);
     }
 
+    /** Creates a dynamic struct type with the current contents of this
+     * builder. */
+    public RelDataType buildDynamic() {
+      final RelDataType dynamicType = new DynamicRecordTypeImpl(typeFactory);
+      final RelDataType type = build();
+      dynamicType.getFieldList().addAll(type.getFieldList());
+      return dynamicType;
+    }
+
     /** Returns whether a field exists with the given name. */
     public boolean nameExists(String name) {
       return names.contains(name);

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeHolder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeHolder.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeHolder.java
index 1a777ff..1473679 100644
--- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeHolder.java
+++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeHolder.java
@@ -57,12 +57,16 @@ class RelDataTypeHolder {
       if (Util.matches(caseSensitive, f.getName(), fieldName)) {
         return Pair.of(f, false);
       }
+      // A dynamic star field matches any field
+      if (f.getType().getSqlTypeName() == SqlTypeName.DYNAMIC_STAR) {
+        return Pair.of(f, false);
+      }
     }
 
     final SqlTypeName typeName = DynamicRecordType.isDynamicStarColName(fieldName)
         ? SqlTypeName.DYNAMIC_STAR : SqlTypeName.ANY;
 
-    // This field does not exist in our field list add it
+    // This field does not exist in our field list; add it
     RelDataTypeField newField = new RelDataTypeFieldImpl(
         fieldName,
         fields.size(),

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/sql/SqlUnnestOperator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlUnnestOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlUnnestOperator.java
index fb01b19..6825bc1 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlUnnestOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlUnnestOperator.java
@@ -16,7 +16,7 @@
  */
 package org.apache.calcite.sql;
 
-
+import org.apache.calcite.rel.type.DynamicRecordType;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.sql.type.ArraySqlType;
@@ -27,7 +27,6 @@ import org.apache.calcite.sql.type.SqlOperandCountRanges;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.Util;
 
-
 /**
  * The <code>UNNEST</code> operator.
  */
@@ -61,13 +60,24 @@ public class SqlUnnestOperator extends SqlFunctionalOperator {
   //~ Methods ----------------------------------------------------------------
 
   @Override public RelDataType inferReturnType(SqlOperatorBinding opBinding) {
-    final RelDataTypeFactory.Builder builder =
-        opBinding.getTypeFactory().builder();
+    final RelDataTypeFactory typeFactory = opBinding.getTypeFactory();
+    final RelDataTypeFactory.Builder builder = typeFactory.builder();
     for (Integer operand : Util.range(opBinding.getOperandCount())) {
       RelDataType type = opBinding.getOperandType(operand);
+      if (type.getSqlTypeName() == SqlTypeName.ANY) {
+        // When there is one operand with unknown type (ANY), the return type
+        // is dynamic star
+        return builder
+            .add(DynamicRecordType.DYNAMIC_STAR_PREFIX,
+                SqlTypeName.DYNAMIC_STAR)
+            .nullable(true)
+            .buildDynamic();
+      }
+
       if (type.isStruct()) {
         type = type.getFieldList().get(0).getType();
       }
+
       assert type instanceof ArraySqlType || type instanceof MultisetSqlType
           || type instanceof MapSqlType;
       if (type instanceof MapSqlType) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java
index 626269a..a343a39 100644
--- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java
+++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParser.java
@@ -215,8 +215,6 @@ public class SqlParser {
     private int identifierMaxLength = DEFAULT_IDENTIFIER_MAX_LENGTH;
     private boolean caseSensitive = Lex.ORACLE.caseSensitive;
     private SqlConformance conformance = SqlConformanceEnum.DEFAULT;
-    private boolean allowBangEqual =
-        SqlConformanceEnum.DEFAULT.isBangEqualAllowed();
     private SqlParserImplFactory parserFactory = SqlParserImpl.FACTORY;
 
     private ConfigBuilder() {}
@@ -228,7 +226,6 @@ public class SqlParser {
       this.quoting = config.quoting();
       this.identifierMaxLength = config.identifierMaxLength();
       this.conformance = config.conformance();
-      this.allowBangEqual = config.allowBangEqual();
       this.parserFactory = config.parserFactory();
       return this;
     }
@@ -274,7 +271,6 @@ public class SqlParser {
 
     public ConfigBuilder setConformance(SqlConformance conformance) {
       this.conformance = conformance;
-      this.allowBangEqual = conformance.isBangEqualAllowed();
       return this;
     }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
index 0aac278..19cdbf9 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java
@@ -962,6 +962,15 @@ public abstract class SqlTypeUtil {
                     field.getType().getComponentType(),
                     null),
                 -1);
+        if (field.getType() instanceof ArraySqlType) {
+          flattenedCollectionType =
+              typeFactory.createArrayType(
+                  flattenRecordType(
+                      typeFactory,
+                      field.getType().getComponentType(),
+                      null),
+                  -1);
+        }
         field =
             new RelDataTypeFieldImpl(
                 field.getName(),

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java
index 3eee0a8..2f6c918 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/UnnestNamespace.java
@@ -18,9 +18,10 @@ package org.apache.calcite.sql.validate;
 
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlUnnestOperator;
-import org.apache.calcite.sql.type.MultisetSqlType;
+
 
 /**
  * Namespace for UNNEST.
@@ -47,6 +48,18 @@ class UnnestNamespace extends AbstractNamespace {
 
   //~ Methods ----------------------------------------------------------------
 
+  @Override public SqlValidatorTable getTable() {
+    final SqlNode toUnnest = unnest.operand(0);
+    if (toUnnest instanceof SqlIdentifier) {
+      // When operand of SqlIdentifier type does not have struct, fake a table
+      // for UnnestNamespace
+      final SqlIdentifier id = (SqlIdentifier) toUnnest;
+      final SqlQualified qualified = this.scope.fullyQualify(id);
+      return qualified.namespace.getTable();
+    }
+    return null;
+  }
+
   protected RelDataType validateImpl(RelDataType targetRowType) {
     // Validate the call and its arguments, and infer the return type.
     validator.validateCall(unnest, scope);
@@ -56,22 +69,6 @@ class UnnestNamespace extends AbstractNamespace {
     return toStruct(type, unnest);
   }
 
-  /**
-   * Returns the type of the argument to UNNEST.
-   */
-  private RelDataType inferReturnType() {
-    final SqlNode operand = unnest.operand(0);
-    RelDataType type = validator.getValidatedNodeType(operand);
-
-    // If sub-query, pick out first column.
-    // TODO: Handle this using usual sub-select validation.
-    if (type.isStruct()) {
-      type = type.getFieldList().get(0).getType();
-    }
-    MultisetSqlType t = (MultisetSqlType) type;
-    return t.getComponentType();
-  }
-
   public SqlNode getNode() {
     return unnest;
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/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 a888a23..844313e 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -67,7 +67,7 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
   /** Sets the SQL statement for a test. */
   public final Sql sql(String sql) {
     return new Sql(sql, true, true, tester, false,
-        SqlToRelConverter.Config.DEFAULT, SqlConformanceEnum.DEFAULT);
+        SqlToRelConverter.Config.DEFAULT, tester.getConformance());
   }
 
   protected final void check(
@@ -1102,6 +1102,27 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql).ok();
   }
 
+  @Test public void testUnnestArrayAggPlan() {
+    final String sql = "select d.deptno, e2.empno_avg\n"
+        + "from dept_nested as d outer apply\n"
+        + " (select avg(e.empno) as empno_avg from UNNEST(d.employees) as e) e2";
+    sql(sql).conformance(SqlConformanceEnum.LENIENT).ok();
+  }
+
+  @Test public void testUnnestArrayPlan() {
+    final String sql = "select d.deptno, e2.empno\n"
+        + "from dept_nested as d,\n"
+        + " UNNEST(d.employees) e2";
+    sql(sql).with(getExtendedTester()).ok();
+  }
+
+  @Test public void testUnnestArrayPlanAs() {
+    final String sql = "select d.deptno, e2.empno\n"
+        + "from dept_nested as d,\n"
+        + " UNNEST(d.employees) as e2(empno, y, z)";
+    sql(sql).with(getExtendedTester()).ok();
+  }
+
   @Test public void testArrayOfRecord() {
     sql("select employees[1].detail.skills[2+3].desc from dept_nested").ok();
   }
@@ -2460,6 +2481,22 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql).with(getTesterWithDynamicTable()).ok();
   }
 
+  @Test public void testDynamicNestedColumn() {
+    final String sql = "select t3.fake_q1['fake_col2'] as fake2\n"
+        + "from (\n"
+        + "  select t2.fake_col as fake_q1\n"
+        + "  from SALES.CUSTOMER as t2) as t3";
+    sql(sql).with(getTesterWithDynamicTable()).ok();
+  }
+
+  @Test public void testDynamicSchemaUnnest() {
+    final String sql3 = "select t1.c_nationkey, t3.fake_col3\n"
+        + "from SALES.CUSTOMER as t1,\n"
+        + "lateral (select t2.fake_col2 as fake_col3\n"
+        + "         from unnest(t1.fake_col) as t2) as t3";
+    sql(sql3).with(getTesterWithDynamicTable()).ok();
+  }
+
   /**
    * Test case for Dynamic Table / Dynamic Star support
    * <a href="https://issues.apache.org/jira/browse/CALCITE-1150">[CALCITE-1150]</a>
@@ -2597,6 +2634,7 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
                 regionTable.addColumn("R_NAME", varcharType);
                 regionTable.addColumn("R_COMMENT", varcharType);
                 registerTable(regionTable);
+
                 return this;
               }
               // CHECKSTYLE: IGNORE 1

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java b/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
index 1b9581d..5d627b8 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
@@ -98,7 +98,8 @@ public abstract class SqlToRelTestBase {
 
   protected Tester createTester() {
     return new TesterImpl(getDiffRepos(), false, false, true, false,
-        null, null);
+        null, null, SqlToRelConverter.Config.DEFAULT,
+        SqlConformanceEnum.DEFAULT, Contexts.empty());
   }
 
   /**
@@ -636,7 +637,9 @@ public abstract class SqlToRelTestBase {
     }
 
     public SqlNode parseQuery(String sql) throws Exception {
-      SqlParser parser = SqlParser.create(sql);
+      final SqlParser.Config config =
+          SqlParser.configBuilder().setConformance(getConformance()).build();
+      SqlParser parser = SqlParser.create(sql, config);
       return parser.parseQuery();
     }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/c3f2705f/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 32da81e..c55ad57 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -723,6 +723,40 @@ LogicalProject(EXPR$0=[CHAR_LENGTH('foo')])
             <![CDATA[values (character_length('foo'))]]>
         </Resource>
     </TestCase>
+    <TestCase name="testDynamicNestedColumn">
+        <Resource name="sql">
+            <![CDATA[select t3.fake_q1['fake_col2'] as fake2
+from (
+  select t2.fake_col as fake_q1
+  from SALES.CUSTOMER as t2) as t3]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(FAKE2=[ITEM($0, 'fake_col2')])
+  LogicalProject(FAKE_Q1=[$0])
+    LogicalTableScan(table=[[CATALOG, SALES, CUSTOMER]])
+]]>
+        </Resource>
+    </TestCase>
+    <TestCase name="testDynamicSchemaUnnest">
+        <Resource name="sql">
+            <![CDATA[select t1.c_nationkey, t3.fake_col3
+from SALES.CUSTOMER as t1,
+lateral (select t2.fake_col2 as fake_col3
+         from unnest(t1.fake_col) as t2) as t3]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(C_NATIONKEY=[$1], FAKE_COL3=[$2])
+  LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{0}])
+    LogicalTableScan(table=[[CATALOG, SALES, CUSTOMER]])
+    LogicalProject(FAKE_COL3=[ITEM($0, 'FAKE_COL2')])
+      Uncollect
+        LogicalProject(FAKE_COL=[$cor0.FAKE_COL])
+          LogicalValues(tuples=[[{ 0 }]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testOverAvg">
         <Resource name="plan">
             <![CDATA[
@@ -4458,6 +4492,63 @@ LogicalProject(DEPTNO=[$0])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testUnnestArrayAggPlan">
+        <Resource name="sql">
+            <![CDATA[select d.deptno, e2.empno_avg
+from dept_nested as d outer apply
+ (select avg(e.empno) as empno_avg from UNNEST(d.employees) as e) e2]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(DEPTNO=[$0], EMPNO_AVG=[$7])
+  LogicalProject(DEPTNO=[$0], NAME=[$1], TYPE=[$2], DESC=[$3], A=[$4], B=[$5], EMPLOYEES=[$6], EMPNO_AVG=[$7])
+    LogicalCorrelate(correlation=[$cor0], joinType=[left], requiredColumns=[{6}])
+      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]])
+      LogicalAggregate(group=[{}], EMPNO_AVG=[AVG($0)])
+        LogicalProject(EMPNO=[$0])
+          Uncollect
+            LogicalProject(EMPLOYEES=[$cor0.EMPLOYEES_6])
+              LogicalValues(tuples=[[{ 0 }]])
+]]>
+        </Resource>
+    </TestCase>
+    <TestCase name="testUnnestArrayPlan">
+        <Resource name="sql">
+            <![CDATA[select d.deptno, e2.empno
+from dept_nested as d,
+ UNNEST(d.employees) e2]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(DEPTNO=[$0], EMPNO=[$7])
+  LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{6}])
+    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]])
+    Uncollect
+      LogicalProject(EMPLOYEES=[$cor0.EMPLOYEES_6])
+        LogicalValues(tuples=[[{ 0 }]])
+]]>
+        </Resource>
+    </TestCase>
+    <TestCase name="testUnnestArrayPlanAs">
+        <Resource name="sql">
+            <![CDATA[select d.deptno, e2.empno
+from dept_nested as d,
+ UNNEST(d.employees) as e2(empno, y, z)]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(DEPTNO=[$0], EMPNO=[$7])
+  LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{6}])
+    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]])
+    Uncollect
+      LogicalProject(EMPLOYEES=[$cor0.EMPLOYEES_6])
+        LogicalValues(tuples=[[{ 0 }]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testWithInsideWhereExistsDecorrelateRex">
         <Resource name="sql">
             <![CDATA[select * from emp
@@ -5072,7 +5163,7 @@ LogicalProject(R_REGIONKEY=[$0], R_NAME=[$1], R_COMMENT=[$2])
             <![CDATA[
 LogicalProject(**=[$0])
   LogicalSort(sort0=[$1], dir0=[ASC])
-    LogicalProject(**=[$0], N_NATIONKEY=[$1])
+    LogicalProject(**=[$0], EXPR$1=[ITEM($0, 'N_NATIONKEY')])
       LogicalTableScan(table=[[CATALOG, SALES, NATION]])
 ]]>
         </Resource>


[4/4] calcite git commit: [CALCITE-2293] Upgrade forbidden-apis to 2.5 (for JDK 10)

Posted by jh...@apache.org.
[CALCITE-2293] Upgrade forbidden-apis to 2.5 (for JDK 10)


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/2b93eaa3
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/2b93eaa3
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/2b93eaa3

Branch: refs/heads/master
Commit: 2b93eaa35aa8f758bfe498dc213b6c5dddf20b1f
Parents: c3f2705
Author: Julian Hyde <jh...@apache.org>
Authored: Tue May 1 12:05:08 2018 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue May 1 12:05:08 2018 -0700

----------------------------------------------------------------------
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/2b93eaa3/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 04d7a07..277f5b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,7 +73,7 @@ limitations under the License.
     <fmpp-maven-plugin.version>1.0</fmpp-maven-plugin.version>
     <foodmart-data-hsqldb.version>0.3</foodmart-data-hsqldb.version>
     <foodmart-queries.version>0.4.1</foodmart-queries.version>
-    <forbiddenapis.version>2.3</forbiddenapis.version>
+    <forbiddenapis.version>2.5</forbiddenapis.version>
     <freemarker.version>2.3.25-incubating</freemarker.version>
     <git-commit-id-plugin.version>2.1.9</git-commit-id-plugin.version>
     <geode.version>1.3.0</geode.version>


[2/4] calcite git commit: Test case for [CALCITE-2287] FlatList.equals() throws StackOverflowError (Zhen Wang)

Posted by jh...@apache.org.
Test case for [CALCITE-2287] FlatList.equals() throws StackOverflowError (Zhen Wang)

Close apache/calcite#683


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/08e43229
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/08e43229
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/08e43229

Branch: refs/heads/master
Commit: 08e432295e202c59427f15b47ec5b54d992db68f
Parents: e78f8c6
Author: zhen wang <zi...@gmail.com>
Authored: Sun Apr 29 16:06:37 2018 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue May 1 02:01:32 2018 -0700

----------------------------------------------------------------------
 .../java/org/apache/calcite/util/UtilTest.java  | 57 ++++++++++++++++++++
 1 file changed, 57 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/08e43229/core/src/test/java/org/apache/calcite/util/UtilTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/util/UtilTest.java b/core/src/test/java/org/apache/calcite/util/UtilTest.java
index b8a6a7f..96f810f 100644
--- a/core/src/test/java/org/apache/calcite/util/UtilTest.java
+++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java
@@ -1241,6 +1241,63 @@ public class UtilTest {
     return Arrays.asList(e0, e1, e2);
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-2287">[CALCITE-2287]
+   * FlatList.equals throws StackOverflowError</a>. */
+  @Test public void testFlat34Equals() {
+    List f3list = FlatLists.of(1, 2, 3);
+    List f4list = FlatLists.of(1, 2, 3, 4);
+    assertThat(f3list.equals(f4list), is(false));
+  }
+
+  @SuppressWarnings("unchecked")
+  @Test public void testFlatListN() {
+    List<List<Object>> list = new ArrayList<>();
+    list.add(FlatLists.of());
+    list.add(FlatLists.<Object>copyOf());
+    list.add(FlatLists.of("A"));
+    list.add(FlatLists.copyOf((Object) "A"));
+    list.add(FlatLists.of("A", "B"));
+    list.add(FlatLists.of((Object) "A", "B"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add(FlatLists.of("A", null));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add(FlatLists.of("A", "B", "C"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add(FlatLists.copyOf((Object) "A", "B", "C"));
+    list.add(FlatLists.of("A", null, "C"));
+    list.add(FlatLists.of("A", "B", "C", "D"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add(FlatLists.copyOf((Object) "A", "B", "C", "D"));
+    list.add(FlatLists.of("A", null, "C", "D"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add(FlatLists.of("A", "B", "C", "D", "E"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add(FlatLists.copyOf((Object) "A", "B", "C", "D", "E"));
+    list.add(FlatLists.of("A", null, "C", "D", "E"));
+    list.add(FlatLists.of("A", "B", "C", "D", "E", "F"));
+    list.add(FlatLists.copyOf((Object) "A", "B", "C", "D", "E", "F"));
+    list.add(FlatLists.of("A", null, "C", "D", "E", "F"));
+    list.add((List)
+        FlatLists.of((Comparable) "A", "B", "C", "D", "E", "F", "G"));
+    list.add(FlatLists.copyOf((Object) "A", "B", "C", "D", "E", "F", "G"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    list.add((List)
+        FlatLists.of((Comparable) "A", null, "C", "D", "E", "F", "G"));
+    list.add(Lists.newArrayList(Util.last(list)));
+    for (int i = 0; i < list.size(); i++) {
+      final List<Object> outer = list.get(i);
+      for (List<Object> inner : list) {
+        if (inner.toString().equals("[A, B, C,D]")) {
+          System.out.println(1);
+        }
+        boolean strEq = outer.toString().equals(inner.toString());
+        assertThat(outer.toString() + "=" + inner.toString(),
+            outer.equals(inner), is(strEq));
+      }
+    }
+  }
+
   @Test public void testFlatListProduct() {
     final List<Enumerator<List<String>>> list = new ArrayList<>();
     list.add(Linq4j.enumerator(l2(l1("a"), l1("b"))));