[ https://issues.apache.org/jira/browse/PHOENIX-2963?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mac updated PHOENIX-2963: ------------------------- Priority: Major (was: Critical) > Exception with functional indexes over UDFs > ------------------------------------------- > > Key: PHOENIX-2963 > URL: https://issues.apache.org/jira/browse/PHOENIX-2963 > Project: Phoenix > Issue Type: Bug > Affects Versions: 4.5.2 > Environment: HBase1.0 > Phoenix-4.5.2 > Reporter: Mac > > One exception i have met but not sure if it is an issue. here are the steps > 1. Create a function > CREATE FUNCTION geohash_1(double, double) returns varchar as > 'co.mac.test.GeoHashFunction' using jar > '/Users/mac/Downloads/phoenix-4.5.2-HBase-1.0/phoenix-plugins/target/phoenix-plugins-4.5.2-HBase-1.0.jar’; > 1. Create a Geohash UDF and use this to create the index > CREATE INDEX geohash_mac_test_3 ON MAC_TEST_3(geohash_1(lng, lat)); > > > this is to make the index work when we query like select A from MAC_TEST_3 > where GEOHASH_1(LNG, LAT) = ‘wts22xxgfg'; > 2. Use the select statement without geohash UDF: select * from MAC_TEST_3 > where A=‘aaa’ > Exception happen here: > -------------------------- > Error: ERROR 6001 (42F01): Function undefined. functionName=GEOHASH_1 > (state=42F01,code=6001) > org.apache.phoenix.schema.FunctionNotFoundException: ERROR 6001 (42F01): > Function undefined. functionName=GEOHASH_1 > at > org.apache.phoenix.compile.FromCompiler$BaseColumnResolver.resolveFunction(FromCompiler.java:561) > at > org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:321) > at > org.apache.phoenix.compile.ExpressionCompiler.visitLeave(ExpressionCompiler.java:141) > at > org.apache.phoenix.parse.FunctionParseNode.accept(FunctionParseNode.java:86) > at > org.apache.phoenix.parse.IndexExpressionParseNodeRewriter.<init>(IndexExpressionParseNodeRewriter.java:56) > at > org.apache.phoenix.optimize.QueryOptimizer.addPlan(QueryOptimizer.java:238) > at > org.apache.phoenix.optimize.QueryOptimizer.getApplicablePlans(QueryOptimizer.java:152) > at > org.apache.phoenix.optimize.QueryOptimizer.optimize(QueryOptimizer.java:94) > at > org.apache.phoenix.optimize.QueryOptimizer.optimize(QueryOptimizer.java:80) > at > org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:262) > at > org.apache.phoenix.jdbc.PhoenixStatement$1.call(PhoenixStatement.java:256) > at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53) > at > org.apache.phoenix.jdbc.PhoenixStatement.executeQuery(PhoenixStatement.java:255) > at > org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1436) > at sqlline.Commands.execute(Commands.java:822) > at sqlline.Commands.sql(Commands.java:732) > at sqlline.SqlLine.dispatch(SqlLine.java:808) > at sqlline.SqlLine.begin(SqlLine.java:681) > at sqlline.SqlLine.start(SqlLine.java:398) > at sqlline.SqlLine.main(SqlLine.java:292) > ----------------------------------------------- > but if i use the UPPER function to create index, things work well. I did a > simple DEBUG, and find the difference is here > Somehow QueryPlan thinks the GEOHASH_1 is a UDFParseNode, but UPPER is a > FunctionParseNode. Is this because I manually call “CREATE FUNCTION” For the > geohash_1? > ---------------------------------- > public Expression visitLeave(FunctionParseNode node, List<Expression> > children) throws SQLException { > PFunction function = null; > if(node instanceof UDFParseNode) { > function = context.getResolver().resolveFunction(node.getName()); > BuiltInFunctionInfo info = new BuiltInFunctionInfo(function); > node = new UDFParseNode(node.getName(), node.getChildren(), info); > } > children = node.validate(children, context); > Expression expression = null; > if (function == null) { > ----------------------------------------- -- This message was sent by Atlassian JIRA (v6.3.4#6332)