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 2015/03/23 09:11:51 UTC

[7/8] incubator-calcite git commit: [CALCITE-633] WITH ... ORDER BY cannot find table

[CALCITE-633] WITH ... ORDER BY cannot find table


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

Branch: refs/heads/master
Commit: 3807827b849dbdb8e58f8319e04823c69bfe7256
Parents: 321217d
Author: Julian Hyde <jh...@apache.org>
Authored: Thu Mar 19 16:17:37 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Mar 19 16:17:37 2015 -0700

----------------------------------------------------------------------
 .../calcite/sql/validate/SqlValidatorImpl.java     | 15 +++++++++++++++
 .../org/apache/calcite/test/SqlValidatorTest.java  | 14 ++++++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  |  3 +--
 core/src/test/resources/sql/sort.oq                | 17 +++++++++++++++++
 4 files changed, 47 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/3807827b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
index 44147ba..a0e7fdd 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
@@ -1039,6 +1039,21 @@ public class SqlValidatorImpl implements SqlValidatorWithHints {
           return select;
         }
       }
+      if (orderBy.query instanceof SqlWith
+          && ((SqlWith) orderBy.query).body instanceof SqlSelect) {
+        SqlWith with = (SqlWith) orderBy.query;
+        SqlSelect select = (SqlSelect) with.body;
+
+        // Don't clobber existing ORDER BY.  It may be needed for
+        // an order-sensitive function like RANK.
+        if (select.getOrderList() == null) {
+          // push ORDER BY into existing select
+          select.setOrderBy(orderBy.orderList);
+          select.setOffset(orderBy.offset);
+          select.setFetch(orderBy.fetch);
+          return with;
+        }
+      }
       final SqlNodeList selectList = new SqlNodeList(SqlParserPos.ZERO);
       selectList.add(new SqlIdentifier("*", SqlParserPos.ZERO));
       final SqlNodeList orderList;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/3807827b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
----------------------------------------------------------------------
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 d304ff5..157e12e 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -5619,6 +5619,20 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
         "(?s)Cannot apply '\\+' to arguments of type '<CHAR\\(3\\)> \\+ <INTEGER>'\\..*");
   }
 
+  @Test public void testOrderJoin() {
+    sql("select * from emp as e, dept as d order by e.empno").ok();
+  }
+
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-633">[CALCITE-633],
+   * WITH ... ORDER BY cannot find table</a>. */
+  @Test public void testWithOrder() {
+    sql("with e as (select * from emp)\n"
+            + "select * from e as e1 order by e1.empno").ok();
+    sql("with e as (select * from emp)\n"
+            + "select * from e as e1, e as e2 order by e1.empno").ok();
+  }
+
   @Test public void testOrderUnion() {
     check("select empno, sal from emp "
         + "union all "

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/3807827b/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 3cfde9d..2d85361 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -1910,8 +1910,7 @@ select * from emp2 order by deptno]]>
 LogicalSort(sort0=[$7], dir0=[ASC])
   LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
     LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
-      LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
-        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
 ]]>
         </Resource>
     </TestCase>

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/3807827b/core/src/test/resources/sql/sort.oq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/sort.oq b/core/src/test/resources/sql/sort.oq
index df6e385..7d445dc 100644
--- a/core/src/test/resources/sql/sort.oq
+++ b/core/src/test/resources/sql/sort.oq
@@ -68,4 +68,21 @@ EnumerableCalc(expr#0..1=[{inputs}], expr#2=[2], expr#3=[>=($t0, $t2)], expr#4=[
   EnumerableTableScan(table=[[foodmart2, days]])
 !plan
 
+!use post
+
+# [CALCITE-603] WITH ... ORDER BY cannot find table
+with e as (select "empid" as empid from "hr"."emps" where "empid" < 120)
+select * from e as e1, e as e2 order by e1.empid + e2.empid, e1.empid;
++-------+--------+
+| EMPID | EMPID0 |
++-------+--------+
+|   100 |    100 |
+|   100 |    110 |
+|   110 |    100 |
+|   110 |    110 |
++-------+--------+
+(4 rows)
+
+!ok
+
 # End sort.oq