Hi All,
I have added few trigonometric for drill's math functions but am ending with
the below exception when trying to use it in query. I have implemented these
new functions exactly same as the floor/ceil functions (which i implemented
previously). Floor and ceil are working correctly as expected.
Can anyone throw some tips on what i am messing up here?
Also adding the diff file for reference.
##################### SQLLINE EXCEPTION #################
0: jdbc:drill:schema=parquet-local> SELECT sin(2.75) FROM
"sample-data/region.parquet";
Sep 08, 2013 4:57:40 PM org.eigenbase.sql.validate.SqlValidatorException <init>
SEVERE: org.eigenbase.sql.validate.SqlValidatorException: No match found for
function signature SIN(<NUMERIC>)
Sep 08, 2013 4:57:40 PM org.eigenbase.util.EigenbaseException <init>
SEVERE: org.eigenbase.util.EigenbaseContextException: From line 1, column 8 to
line 1, column 16
org.eigenbase.util.EigenbaseContextException: From line 1, column 8 to line 1,
column 16
at
org.eigenbase.resource.EigenbaseResource$_Def12.ex(EigenbaseResource.java:1026)
at org.eigenbase.sql.SqlUtil.newContextException(SqlUtil.java:739)
at org.eigenbase.sql.SqlUtil.newContextException(SqlUtil.java:726)
at
org.eigenbase.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:3830)
at
org.eigenbase.sql.validate.SqlValidatorImpl.handleUnresolvedFunction(SqlValidatorImpl.java:1594)
at org.eigenbase.sql.SqlFunction.deriveType(SqlFunction.java:312)
at org.eigenbase.sql.SqlFunction.deriveType(SqlFunction.java:222)
at
org.eigenbase.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4238)
at
org.eigenbase.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4220)
at org.eigenbase.sql.SqlCall.accept(SqlCall.java:187)
at
org.eigenbase.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1502)
at
org.eigenbase.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1484)
at
org.eigenbase.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:435)
at
org.eigenbase.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:3290)
at
org.eigenbase.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3026)
at
org.eigenbase.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:69)
at
org.eigenbase.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:90)
at
org.eigenbase.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:802)
at
org.eigenbase.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:790)
at org.eigenbase.sql.SqlSelect.validate(SqlSelect.java:154)
at
org.eigenbase.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:753)
at
org.eigenbase.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:444)
at
org.eigenbase.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:445)
at net.hydromatic.optiq.prepare.Prepare.prepareSql(Prepare.java:160)
at net.hydromatic.optiq.prepare.Prepare.prepareSql(Prepare.java:129)
at
net.hydromatic.optiq.prepare.OptiqPrepareImpl.prepare2_(OptiqPrepareImpl.java:255)
at
net.hydromatic.optiq.prepare.OptiqPrepareImpl.prepare_(OptiqPrepareImpl.java:195)
at
net.hydromatic.optiq.prepare.OptiqPrepareImpl.prepareSql(OptiqPrepareImpl.java:168)
at
net.hydromatic.optiq.jdbc.OptiqStatement.parseQuery(OptiqStatement.java:402)
at
net.hydromatic.optiq.jdbc.OptiqStatement.execute(OptiqStatement.java:192)
at sqlline.SqlLine$Commands.execute(SqlLine.java:3825)
at sqlline.SqlLine$Commands.sql(SqlLine.java:3738)
at sqlline.SqlLine.dispatch(SqlLine.java:882)
at sqlline.SqlLine.begin(SqlLine.java:717)
at sqlline.SqlLine.mainWithInputRedirection(SqlLine.java:460)
at sqlline.SqlLine.main(SqlLine.java:443)
Caused by: org.eigenbase.sql.validate.SqlValidatorException: No match found for
function signature SIN(<NUMERIC>)
at
org.eigenbase.resource.EigenbaseResource$_Def9.ex(EigenbaseResource.java:963)
... 32 more
##################### DIFF #################
diff --git
a/common/src/main/java/org/apache/drill/common/expression/fn/MathFunctions.java
b/common/src/main/java/org/apache/drill/common/expression/fn/MathFunctions.java
index b1e1b67..34a1a4a 100644
---
a/common/src/main/java/org/apache/drill/common/expression/fn/MathFunctions.java
+++
b/common/src/main/java/org/apache/drill/common/expression/fn/MathFunctions.java
@@ -17,10 +17,14 @@
******************************************************************************/
package org.apache.drill.common.expression.fn;
+import org.apache.drill.common.expression.Arg;
import org.apache.drill.common.expression.ArgumentValidators;
+import org.apache.drill.common.expression.BasicArgumentValidator;
import org.apache.drill.common.expression.FunctionDefinition;
import org.apache.drill.common.expression.CallProvider;
import org.apache.drill.common.expression.OutputTypeDeterminer;
+import org.apache.drill.common.types.TypeProtos;
+import org.apache.drill.common.types.Types;
@@ -35,7 +39,19 @@ public class MathFunctions implements CallProvider{
FunctionDefinition.operator("divide", new
ArgumentValidators.NumericTypeAllowed(1, Integer.MAX_VALUE, true), new
OutputTypeDeterminer.SameAsAnySoft(), "/"),
FunctionDefinition.operator("multiply", new
ArgumentValidators.NumericTypeAllowed(1, Integer.MAX_VALUE, true), new
OutputTypeDeterminer.SameAsAnySoft(), "*"),
FunctionDefinition.operator("modulo", new
ArgumentValidators.NumericTypeAllowed(1, Integer.MAX_VALUE, true), new
OutputTypeDeterminer.SameAsAnySoft(), "%"),
- XOR
+ XOR,
+ FunctionDefinition.simple("floatfloor", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "floor"),
+ FunctionDefinition.simple("floatceil", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "ceil"),
+ FunctionDefinition.simple("floatcos", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsAnySoft(), "cos"),
+ FunctionDefinition.simple("floatsin", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsAnySoft(), "sin"),
+ FunctionDefinition.simple("floattan", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsAnySoft(), "tan"),
+ FunctionDefinition.simple("floatacos", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "acos"),
+ FunctionDefinition.simple("floatasin", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "asin"),
+ FunctionDefinition.simple("floatatan", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "atan"),
+ FunctionDefinition.simple("floatcosh", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "cosh"),
+ FunctionDefinition.simple("floatsinh", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "sinh"),
+ FunctionDefinition.simple("floattanh", new BasicArgumentValidator(new
Arg(Types.required(TypeProtos.MinorType.FLOAT8))), new
OutputTypeDeterminer.SameAsFirstInput(), "tanh")
+
};
}
diff --git
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
index 3f4b976..8d143cf 100644
---
a/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
+++
b/exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/impl/MathFunctions.java
@@ -1,5 +1,12 @@
package org.apache.drill.exec.expr.fn.impl;
+import org.apache.drill.common.expression.Arg;
+import org.apache.drill.common.expression.BasicArgumentValidator;
+import org.apache.drill.common.expression.CallProvider;
+import org.apache.drill.common.expression.FunctionDefinition;
+import org.apache.drill.common.expression.OutputTypeDeterminer;
+import org.apache.drill.common.types.TypeProtos;
+import org.apache.drill.common.types.Types;
import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.FunctionTemplate.FunctionScope;
@@ -7,6 +14,7 @@ import
org.apache.drill.exec.expr.annotations.FunctionTemplate.NullHandling;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Param;
import org.apache.drill.exec.expr.holders.BigIntHolder;
+import org.apache.drill.exec.expr.holders.Float8Holder;
import org.apache.drill.exec.expr.holders.IntHolder;
import org.apache.drill.exec.record.RecordBatch;
@@ -59,4 +67,172 @@ public class MathFunctions{
}
-}
+
+
+ @FunctionTemplate(name = "floatceil", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Ceil implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.ceil(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floatfloor", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Floor implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.floor(input.value);
+ }
+
+ }
+
+
+
+ @FunctionTemplate(name = "floatcos", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Cos implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.cos(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floatsin", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Sin implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.sin(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floattan", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Tan implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.tan(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floatacos", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8ACos implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.acos(input.value);
+ }
+
+ }
+
+
+
+ @FunctionTemplate(name = "floatasin", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8ASin implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.asin(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floatatan", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8ATan implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.atan(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floatcosh", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Cosh implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.cosh(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floatsinh", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Sinh implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.sinh(input.value);
+ }
+
+ }
+
+
+ @FunctionTemplate(name = "floattanh", scope = FunctionScope.SIMPLE, nulls =
NullHandling.NULL_IF_NULL)
+ public static class Float8Tanh implements DrillSimpleFunc{
+
+ @Param Float8Holder input;
+ @Output Float8Holder out;
+
+ public void setup(RecordBatch b){}
+
+ public void eval(){
+ out.value = Math.tanh(input.value);
+ }
+
+ }
+
+}
\ No newline at end of file
##################### END #################
________________________________
NOTE: This message may contain information that is confidential, proprietary,
privileged or otherwise protected by law. The message is intended solely for
the named addressee. If received in error, please destroy and notify the
sender. Any use of this email is prohibited when received in error. Impetus
does not represent, warrant and/or guarantee, that the integrity of this
communication has been maintained nor that the communication is free of errors,
virus, interception or interference.