You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by am...@apache.org on 2015/06/16 02:23:04 UTC

drill git commit: DRILL-3182, DRILL-3188, DRILL-3195: Window function with DISTINCT qualifier is disabled; Disable unsupported window frames; Window functions NTILE, LAG, LEAD, FIRST_VALUE, LAST_VALUE are disabled

Repository: drill
Updated Branches:
  refs/heads/master 68c933c75 -> 4baf9e70b


DRILL-3182, DRILL-3188, DRILL-3195: Window function with DISTINCT qualifier is disabled; Disable unsupported window frames; Window functions NTILE, LAG, LEAD, FIRST_VALUE, LAST_VALUE are disabled


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

Branch: refs/heads/master
Commit: 4baf9e70b19f78a19d59fc6670de00c871f9d609
Parents: 68c933c
Author: Hsuan-Yi Chu <hs...@usc.edu>
Authored: Tue Jun 9 14:56:08 2015 -0700
Committer: Aman Sinha <as...@maprtech.com>
Committed: Mon Jun 15 17:11:08 2015 -0700

----------------------------------------------------------------------
 .../sql/parser/UnsupportedOperatorsVisitor.java |  91 +++++++++++-
 .../apache/drill/exec/TestWindowFunctions.java  | 138 +++++++++++++++++--
 2 files changed, 213 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/4baf9e70/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/UnsupportedOperatorsVisitor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/UnsupportedOperatorsVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/UnsupportedOperatorsVisitor.java
index f3c54cc..544a838 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/UnsupportedOperatorsVisitor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/UnsupportedOperatorsVisitor.java
@@ -22,6 +22,7 @@ import org.apache.drill.exec.exception.UnsupportedOperatorCollector;
 import org.apache.drill.exec.ops.QueryContext;
 import org.apache.drill.exec.work.foreman.SqlUnsupportedException;
 
+import org.apache.calcite.sql.SqlSelectKeyword;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlSelect;
 import org.apache.calcite.sql.SqlWindow;
@@ -99,6 +100,84 @@ public class UnsupportedOperatorsVisitor extends SqlShuttle {
             throw new UnsupportedOperationException();
           }
 
+          // DRILL-3182, DRILL-3195
+          SqlCall over = (SqlCall) nodeInSelectList;
+          if(over.getOperandList().get(0) instanceof SqlCall) {
+            SqlCall function = (SqlCall) over.getOperandList().get(0);
+
+            // DRILL-3195:
+            // The following window functions are temporarily disabled
+            // NTILE(), LAG(), LEAD(), FIRST_VALUE(), LAST_VALUE()
+            String functionName = function.getOperator().getName().toUpperCase();
+            switch(functionName) {
+              case "NTILE":
+              case "LAG":
+              case "LEAD":
+              case "FIRST_VALUE":
+              case "LAST_VALUE":
+                unsupportedOperatorCollector.setException(SqlUnsupportedException.ExceptionType.FUNCTION,
+                    "The window function " + functionName + " is not supported\n" +
+                    "See Apache Drill JIRA: DRILL-3195");
+                throw new UnsupportedOperationException();
+
+              default:
+                break;
+            }
+
+
+            // DRILL-3182
+            // Window function with DISTINCT qualifier is temporarily disabled
+            if(function.getFunctionQuantifier() != null
+                && function.getFunctionQuantifier().getValue() == SqlSelectKeyword.DISTINCT) {
+              unsupportedOperatorCollector.setException(SqlUnsupportedException.ExceptionType.FUNCTION,
+                  "DISTINCT for window aggregate functions is not currently supported\n" +
+                  "See Apache Drill JIRA: DRILL-3182");
+              throw new UnsupportedOperationException();
+            }
+          }
+
+          // DRILL-3188
+          // Disable frame which is other than the default
+          // (i.e., BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+          if(((SqlCall) nodeInSelectList).operand(1) instanceof SqlWindow) {
+            SqlWindow window = (SqlWindow) ((SqlCall) nodeInSelectList).operand(1);
+
+            SqlNode lowerBound = window.getLowerBound();
+            SqlNode upperBound = window.getUpperBound();
+
+            // If no frame is specified
+            // it is a default frame
+            boolean isSupported = (lowerBound == null && upperBound == null);
+
+            // When OVER clause contain an ORDER BY clause the following frames are equivalent to the default frame:
+                // RANGE UNBOUNDED PRECEDING
+                // RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+            if(window.getOrderList().size() != 0
+                && !window.isRows()
+                    && SqlWindow.isUnboundedPreceding(lowerBound)
+                        && (upperBound == null || SqlWindow.isCurrentRow(upperBound))) {
+              isSupported = true;
+            }
+
+            // When OVER clause doesn't contain an ORDER BY clause, the following are equivalent to the default frame:
+                // RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+                // ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+            if(window.getOrderList().size() == 0
+                && SqlWindow.isUnboundedPreceding(lowerBound)
+                    && SqlWindow.isUnboundedFollowing(upperBound)) {
+              isSupported = true;
+            }
+
+            if(!isSupported) {
+              unsupportedOperatorCollector.setException(SqlUnsupportedException.ExceptionType.FUNCTION,
+                  "This type of window frame is currently not supported \n" +
+                  "See Apache Drill JIRA: DRILL-3188");
+              throw new UnsupportedOperationException();
+            }
+          }
+
+          // DRILL-3196
+          // Disable multiple partitions in a SELECT-CLAUSE
           SqlNode window = ((SqlCall) nodeInSelectList).operand(1);
 
           // Partition window is referenced as a SqlIdentifier,
@@ -119,12 +198,12 @@ public class UnsupportedOperatorsVisitor extends SqlShuttle {
           if(definedWindow == null) {
             definedWindow = window;
           } else {
-           if(!definedWindow.equalsDeep(window, false)) {
-             unsupportedOperatorCollector.setException(SqlUnsupportedException.ExceptionType.FUNCTION,
-                 "Multiple window definitions in a single SELECT list is not currently supported \n" +
-                 "See Apache Drill JIRA: DRILL-3196");
-             throw new UnsupportedOperationException();
-           }
+            if(!definedWindow.equalsDeep(window, false)) {
+              unsupportedOperatorCollector.setException(SqlUnsupportedException.ExceptionType.FUNCTION,
+                  "Multiple window definitions in a single SELECT list is not currently supported \n" +
+                  "See Apache Drill JIRA: DRILL-3196");
+              throw new UnsupportedOperationException();
+            }
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/drill/blob/4baf9e70/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java
index fc75d73..2ec2481 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/TestWindowFunctions.java
@@ -34,9 +34,7 @@ public class TestWindowFunctions extends BaseTestQuery {
     final String query = "explain plan for select sum(a2) over(partition by a2), count(*) over(partition by a2) \n" +
         "from cp.`tpch/nation.parquet`";
 
-    test("alter session set `window.enable` = true");
     test(query);
-    test("alter session set `window.enable` = false");
   }
 
   @Test // DRILL-3196
@@ -45,9 +43,7 @@ public class TestWindowFunctions extends BaseTestQuery {
         "from cp.`tpch/nation.parquet` \n" +
         "window w as (partition by a2 order by a2)";
 
-    test("alter session set `window.enable` = true");
     test(query);
-    test("alter session set `window.enable` = false");
   }
 
   @Test(expected = UnsupportedFunctionException.class) // DRILL-3196
@@ -56,9 +52,7 @@ public class TestWindowFunctions extends BaseTestQuery {
       final String query = "explain plan for select sum(a2) over(partition by a2), count(*) over(partition by a2,b2,c2) \n" +
           "from cp.`tpch/nation.parquet`";
 
-      test("alter session set `window.enable` = true");
       test(query);
-      test("alter session set `window.enable` = false");
     } catch(UserException ex) {
       throwAsUnsupportedException(ex);
       throw ex;
@@ -71,9 +65,7 @@ public class TestWindowFunctions extends BaseTestQuery {
       final String query = "explain plan for select sum(a2) over(partition by a2 order by a2), count(*) over(partition by a2 order by b2) \n" +
           "from cp.`tpch/nation.parquet`";
 
-      test("alter session set `window.enable` = true");
       test(query);
-      test("alter session set `window.enable` = false");
     } catch(UserException ex) {
       throwAsUnsupportedException(ex);
       throw ex;
@@ -87,12 +79,138 @@ public class TestWindowFunctions extends BaseTestQuery {
           "from cp.`tpch/nation.parquet` \n" +
           "window w as (partition by a2, b2, c2)";
 
-      test("alter session set `window.enable` = true");
       test(query);
-      test("alter session set `window.enable` = false");
     } catch(UserException ex) {
       throwAsUnsupportedException(ex);
       throw ex;
     }
   }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3182
+  public void testWindowFunctionWithDistinct() throws Exception {
+    try {
+      final String query = "explain plan for select a2, count(distinct b2) over(partition by a2) \n" +
+          "from cp.`tpch/nation.parquet`";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3195
+  public void testWindowFunctionNTILE() throws Exception {
+    try {
+      final String query = "explain plan for select NTILE(1) over(partition by n_name order by n_name) \n" +
+          "from cp.`tpch/nation.parquet`";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3195
+  public void testWindowFunctionLAG() throws Exception {
+    try {
+      final String query = "explain plan for select LAG(n_nationKey, 1) over(partition by n_name order by n_name) \n" +
+          "from cp.`tpch/nation.parquet`";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3195
+  public void testWindowFunctionLEAD() throws Exception {
+    try {
+      final String query = "explain plan for select LEAD(n_nationKey, 1) over(partition by n_name order by n_name) \n" +
+          "from cp.`tpch/nation.parquet`";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3195
+  public void testWindowFunctionFIRST_VALUE() throws Exception {
+    try {
+      final String query = "explain plan for select FIRST_VALUE(n_nationKey) over(partition by n_name order by n_name) \n" +
+          "from cp.`tpch/nation.parquet`";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3195
+  public void testWindowFunctionLAST_VALUE() throws Exception {
+    try {
+      final String query = "explain plan for select LAST_VALUE(n_nationKey) over(partition by n_name order by n_name) \n" +
+          "from cp.`tpch/nation.parquet`";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class) // DRILL-3188
+  public void testWindowFrame() throws Exception {
+    try {
+      final String query = "select a2, sum(a2) over(partition by a2 order by a2 rows between 1 preceding and 1 following ) \n" +
+          "from cp.`tpch/nation.parquet` t \n" +
+          "order by a2";
+
+      test(query);
+    } catch(UserException ex) {
+        throwAsUnsupportedException(ex);
+        throw ex;
+    }
+  }
+
+  @Test(expected = UnsupportedFunctionException.class)  // DRILL-3188
+  public void testRowsUnboundedPreceding() throws Exception {
+    try {
+      final String query = "explain plan for select sum(n_nationKey) over(partition by n_nationKey order by n_nationKey \n" +
+      "rows UNBOUNDED PRECEDING)" +
+      "from cp.`tpch/nation.parquet` t \n" +
+      "order by n_nationKey";
+
+      test(query);
+    } catch(UserException ex) {
+      throwAsUnsupportedException(ex);
+      throw ex;
+    }
+  }
+
+  @Test // DRILL-3188
+  public void testWindowFrameEquivalentToDefault() throws Exception {
+    final String query1 = "explain plan for select sum(n_nationKey) over(partition by n_nationKey order by n_nationKey) \n" +
+        "from cp.`tpch/nation.parquet` t \n" +
+        "order by n_nationKey";
+
+    final String query2 = "explain plan for select sum(n_nationKey) over(partition by n_nationKey order by n_nationKey \n" +
+        "range between unbounded preceding and current row) \n" +
+        "from cp.`tpch/nation.parquet` t \n" +
+        "order by n_nationKey";
+
+    final String query3 = "explain plan for select sum(n_nationKey) over(partition by n_nationKey \n" +
+        "rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)" +
+        "from cp.`tpch/nation.parquet` t \n" +
+        "order by n_nationKey";
+
+    test(query1);
+    test(query2);
+    test(query3);
+  }
 }