DRILL-3245: Fix error message for unsupported aggregate functions on varchar 
data type


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

Branch: refs/heads/master
Commit: 287f52db0bd0125e0ad1b3408f22775224ee9494
Parents: 09e46df
Author: Mehant Baid <meha...@gmail.com>
Authored: Wed Jun 3 15:12:30 2015 -0700
Committer: Mehant Baid <meha...@gmail.com>
Committed: Wed Jun 3 15:12:30 2015 -0700

----------------------------------------------------------------------
 .../expr/fn/impl/AggregateErrorFunctions.java   | 87 ++++++++++++++++++--
 1 file changed, 82 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/287f52db/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/AggregateErrorFunctions.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/AggregateErrorFunctions.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/AggregateErrorFunctions.java
index a95a1c3..8161a43 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/AggregateErrorFunctions.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/AggregateErrorFunctions.java
@@ -25,10 +25,18 @@ import org.apache.drill.exec.expr.annotations.Workspace;
 import org.apache.drill.exec.expr.holders.BigIntHolder;
 import org.apache.drill.exec.expr.holders.BitHolder;
 import org.apache.drill.exec.expr.holders.NullableBitHolder;
+import org.apache.drill.exec.expr.holders.NullableVarCharHolder;
+import org.apache.drill.exec.expr.holders.VarCharHolder;
 
+/*
+ * TODO: For a handful of functions this approach of using function binding to 
detect that it is an invalid function is okay.
+ * However moving forward we should introduce a validation phase after we 
learn the data types and before we try
+ * to perform function resolution. Otherwise with implicit cast we will try to 
bind to an existing function.
+ */
 public class AggregateErrorFunctions {
 
-  @FunctionTemplate(names = {"sum", "max", "avg", "stddev_pop", "stddev_samp", 
"stddev", "var_pop", "var_samp", "variance"}, scope = 
FunctionTemplate.FunctionScope.POINT_AGGREGATE)
+  @FunctionTemplate(names = {"sum", "max", "avg", "stddev_pop", "stddev_samp", 
"stddev", "var_pop",
+      "var_samp", "variance"}, scope = 
FunctionTemplate.FunctionScope.POINT_AGGREGATE)
   public static class BitAggregateErrorFunctions implements DrillAggFunc {
 
     @Param BitHolder in;
@@ -37,7 +45,10 @@ public class AggregateErrorFunctions {
 
     public void setup() {
       if (true) {
-        throw new RuntimeException("Only COUNT aggregate function supported 
for Boolean type");
+        throw org.apache.drill.common.exceptions.UserException
+            .unsupportedError()
+            .message("Only COUNT aggregate function supported for Boolean 
type")
+            .build();
       }
     }
 
@@ -55,8 +66,9 @@ public class AggregateErrorFunctions {
 
   }
 
-  @FunctionTemplate(names = {"sum", "max", "avg", "stddev_pop", "stddev_samp", 
"stddev", "var_pop", "var_samp", "variance"}, scope = 
FunctionTemplate.FunctionScope.POINT_AGGREGATE)
-  public static class NullableBitAggregateErrorFunctions implements 
DrillAggFunc{
+  @FunctionTemplate(names = {"sum", "max", "avg", "stddev_pop", "stddev_samp", 
"stddev", "var_pop",
+      "var_samp", "variance"}, scope = 
FunctionTemplate.FunctionScope.POINT_AGGREGATE)
+  public static class NullableBitAggregateErrorFunctions implements 
DrillAggFunc {
 
     @Param NullableBitHolder in;
     @Workspace BigIntHolder value;
@@ -64,7 +76,72 @@ public class AggregateErrorFunctions {
 
     public void setup() {
       if (true) {
-        throw new RuntimeException("Only COUNT aggregate function supported 
for Boolean type");
+        throw org.apache.drill.common.exceptions.UserException
+            .unsupportedError()
+            .message("Only COUNT aggregate function supported for Boolean 
type")
+            .build();
+      }
+    }
+
+    @Override
+    public void add() {
+    }
+
+    @Override
+    public void output() {
+    }
+
+    @Override
+    public void reset() {
+    }
+  }
+
+
+  @FunctionTemplate(names = {"sum", "avg", "stddev_pop", "stddev_samp", 
"stddev", "var_pop", "var_samp", "variance"},
+      scope = FunctionTemplate.FunctionScope.POINT_AGGREGATE)
+  public static class VarCharAggregateErrorFunctions implements DrillAggFunc {
+
+    @Param VarCharHolder in;
+    @Workspace BigIntHolder value;
+    @Output BigIntHolder out;
+
+    public void setup() {
+      if (true) {
+        throw org.apache.drill.common.exceptions.UserException
+            .unsupportedError()
+            .message("Only COUNT, MIN and MAX aggregate functions supported 
for VarChar type")
+            .build();
+      }
+    }
+
+    @Override
+    public void add() {
+    }
+
+    @Override
+    public void output() {
+    }
+
+    @Override
+    public void reset() {
+    }
+
+  }
+
+  @FunctionTemplate(names = {"sum", "avg", "stddev_pop", "stddev_samp", 
"stddev", "var_pop", "var_samp", "variance"},
+      scope = FunctionTemplate.FunctionScope.POINT_AGGREGATE)
+  public static class NullableVarCharAggregateErrorFunctions implements 
DrillAggFunc {
+
+    @Param NullableVarCharHolder in;
+    @Workspace BigIntHolder value;
+    @Output BigIntHolder out;
+
+    public void setup() {
+      if (true) {
+        throw org.apache.drill.common.exceptions.UserException
+            .unsupportedError()
+            .message("Only COUNT, MIN and MAX aggregate functions supported 
for VarChar type")
+            .build();
       }
     }
 

Reply via email to