PHOENIX-2010 Properly validate number of arguments passed to the functions in FunctionParseNode#validate(Rajeshbabu)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/b2c0cb90 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/b2c0cb90 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/b2c0cb90 Branch: refs/heads/4.x-HBase-1.1 Commit: b2c0cb9002ee881f21d968817c386a98d39074ca Parents: a600cc4 Author: Rajeshbabu Chintaguntla <rajeshb...@apache.org> Authored: Sun May 31 07:40:39 2015 +0530 Committer: Rajeshbabu Chintaguntla <rajeshb...@apache.org> Committed: Sun May 31 07:40:39 2015 +0530 ---------------------------------------------------------------------- .../phoenix/end2end/UserDefinedFunctionsIT.java | 14 ++++++++++++++ .../org/apache/phoenix/parse/FunctionParseNode.java | 4 ++++ .../main/java/org/apache/phoenix/parse/PFunction.java | 4 +--- 3 files changed, 19 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/b2c0cb90/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java index 7dbde3c..868e19d 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java @@ -442,6 +442,20 @@ public class UserDefinedFunctionsIT extends BaseOwnClusterIT{ rs = stmt.executeQuery("select k from t9 where mysum9(k)=11"); assertTrue(rs.next()); assertEquals(1, rs.getInt(1)); + try { + rs = stmt.executeQuery("select k from t9 where mysum9(k,10,'x')=11"); + fail("FunctionNotFoundException should be thrown"); + } catch(FunctionNotFoundException e) { + } catch(Exception e) { + fail("FunctionNotFoundException should be thrown"); + } + try { + rs = stmt.executeQuery("select mysum9() from t9"); + fail("FunctionNotFoundException should be thrown"); + } catch(FunctionNotFoundException e) { + } catch(Exception e) { + fail("FunctionNotFoundException should be thrown"); + } stmt.execute("drop function mysum9"); try { rs = stmt.executeQuery("select k from t9 where mysum9(k)=11"); http://git-wip-us.apache.org/repos/asf/phoenix/blob/b2c0cb90/phoenix-core/src/main/java/org/apache/phoenix/parse/FunctionParseNode.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/FunctionParseNode.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/FunctionParseNode.java index d1001ee..be52d89 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/parse/FunctionParseNode.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/FunctionParseNode.java @@ -41,6 +41,7 @@ import org.apache.phoenix.expression.function.FunctionExpression; import org.apache.phoenix.expression.function.UDFExpression; import org.apache.phoenix.parse.PFunction.FunctionArgument; import org.apache.phoenix.schema.ArgumentTypeMismatchException; +import org.apache.phoenix.schema.FunctionNotFoundException; import org.apache.phoenix.schema.ValueRangeExcpetion; import org.apache.phoenix.schema.types.PDataType; import org.apache.phoenix.schema.types.PDataTypeFactory; @@ -133,6 +134,9 @@ public class FunctionParseNode extends CompoundParseNode { public List<Expression> validate(List<Expression> children, StatementContext context) throws SQLException { BuiltInFunctionInfo info = this.getInfo(); BuiltInFunctionArgInfo[] args = info.getArgs(); + if (args.length < children.size() || info.getRequiredArgCount() > children.size()) { + throw new FunctionNotFoundException(this.name); + } if (args.length > children.size()) { List<Expression> moreChildren = new ArrayList<Expression>(children); for (int i = children.size(); i < info.getArgs().length; i++) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/b2c0cb90/phoenix-core/src/main/java/org/apache/phoenix/parse/PFunction.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/parse/PFunction.java b/phoenix-core/src/main/java/org/apache/phoenix/parse/PFunction.java index 351bec7..aeed3ac 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/parse/PFunction.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/parse/PFunction.java @@ -96,9 +96,7 @@ public class PFunction implements PMetaDataEntity { } public PFunction(PFunction function) { - this(function.getTenantId(), function.getFunctionName(), function.getFunctionArguments(), - function.getReturnType(), function.getClassName(), function.getJarPath(), function - .getTimeStamp()); + this(function, function.isTemporaryFunction()); } public String getFunctionName() {