You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by vl...@apache.org on 2014/12/14 13:13:17 UTC

incubator-calcite git commit: [CALCITE-462] Allow table functions in LATERAL expression

Repository: incubator-calcite
Updated Branches:
  refs/heads/master b7427ed74 -> 039f7cb08


[CALCITE-462] Allow table functions in LATERAL expression


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

Branch: refs/heads/master
Commit: 039f7cb08fb7ac7fb8e099862b01b807923c8c9e
Parents: b7427ed
Author: Vladimir Sitnikov <si...@gmail.com>
Authored: Sun Dec 14 15:03:30 2014 +0300
Committer: Vladimir Sitnikov <si...@gmail.com>
Committed: Sun Dec 14 15:03:30 2014 +0300

----------------------------------------------------------------------
 .../enumerable/EnumerableTableFunctionScan.java |  1 +
 .../java/org/apache/calcite/test/JdbcTest.java  | 50 ++++++++++++++++----
 2 files changed, 42 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/039f7cb0/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
index 9ed359f..936e7fc 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java
@@ -64,6 +64,7 @@ public class EnumerableTableFunctionScan extends TableFunctionScan
             : JavaRowFormat.CUSTOM);
     RexToLixTranslator t = RexToLixTranslator.forAggregation(
         (JavaTypeFactory) getCluster().getTypeFactory(), bb, null);
+    t = t.setCorrelates(implementor.allCorrelateVariables);
     final Expression translated = t.translate(getCall());
     bb.add(Expressions.return_(null, translated));
     return implementor.result(physType, bb.toBlock());

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/039f7cb0/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 9b7d947..486ffb3 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -469,17 +469,17 @@ public class JdbcTest {
   /** Tests a JDBC connection that provides a model that contains a table
    *  function. */
   @Test public void testTableFunctionInModel() throws Exception {
-    checkTableMacroInModel(TestTableFunction.class);
+    checkTableFunctionInModel(TestTableFunction.class);
   }
 
   /** Tests a JDBC connection that provides a model that contains a table
    *  function defined as a static method. */
   @Test public void testStaticTableFunctionInModel() throws Exception {
-    checkTableMacroInModel(TestStaticTableFunction.class);
+    checkTableFunctionInModel(TestStaticTableFunction.class);
   }
 
-  private void checkTableMacroInModel(Class clazz) {
-    CalciteAssert.that()
+  private CalciteAssert.AssertThat assertWithMacro(Class clazz) {
+    return CalciteAssert.that()
         .withModel("{\n"
             + "  version: '1.0',\n"
             + "   schemas: [\n"
@@ -493,7 +493,11 @@ public class JdbcTest {
             + "       ]\n"
             + "     }\n"
             + "   ]\n"
-            + "}")
+            + "}");
+  }
+
+  private void checkTableMacroInModel(Class clazz) {
+    assertWithMacro(clazz)
         .query("select * from table(\"adhoc\".\"View\"('(30)'))")
         .returns(""
             + "c=1\n"
@@ -501,6 +505,27 @@ public class JdbcTest {
             + "c=30\n");
   }
 
+  private void checkTableFunctionInModel(Class clazz) {
+    checkTableMacroInModel(clazz);
+
+    assertWithMacro(clazz)
+        .query("select \"a\".\"c\" a, \"b\".\"c\" b\n"
+            + "  from table(\"adhoc\".\"View\"('(30)')) \"a\",\n"
+            + " lateral(select *\n"
+            + "   from table(\"adhoc\".\"View\"('('||\n"
+            + "          cast(\"a\".\"c\" as varchar(10))||')'))) \"b\"")
+        .returnsUnordered(
+            "A=1; B=1",
+            "A=1; B=3",
+            "A=1; B=1",
+            "A=3; B=1",
+            "A=3; B=3",
+            "A=3; B=3",
+            "A=30; B=1",
+            "A=30; B=3",
+            "A=30; B=30");
+  }
+
   public static <T> Queryable<T> stringUnion(
       Queryable<T> q0, Queryable<T> q1) {
     return q0.concat(q1);
@@ -6334,11 +6359,18 @@ public class JdbcTest {
   }
 
   private static QueryableTable oneThreePlus(String s) {
-    Integer latest = Integer.parseInt(s.substring(1, s.length() - 1));
-    List<Object> items = Arrays.<Object>asList(1, 3, latest);
-    final Enumerable<Object> enumerable = Linq4j.asEnumerable(items);
+    List<Integer> items;
+    // Argument is null in case SQL contains function call with expression.
+    // Then the engine calls a function with null argumets to get getRowType.
+    if (s == null) {
+      items = ImmutableList.of();
+    } else {
+      Integer latest = Integer.parseInt(s.substring(1, s.length() - 1));
+      items = ImmutableList.of(1, 3, latest);
+    }
+    final Enumerable<Integer> enumerable = Linq4j.asEnumerable(items);
     return new AbstractQueryableTable(Object[].class) {
-      public Queryable<Object> asQueryable(
+      public Queryable<Integer> asQueryable(
           QueryProvider queryProvider, SchemaPlus schema, String tableName) {
         return enumerable.asQueryable();
       }