[ https://issues.apache.org/jira/browse/PHOENIX-538?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14513791#comment-14513791 ]
Hudson commented on PHOENIX-538: -------------------------------- SUCCESS: Integrated in Phoenix-master #723 (See [https://builds.apache.org/job/Phoenix-master/723/]) PHOENIX-538 Support UDFs(Rajeshbabu Chintaguntla) (rajeshbabu: rev 66bd3e35c0d2105dcc393116f8bb5851ce1f5ec4) * phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java * phoenix-protocol/src/main/PFunction.proto * phoenix-protocol/src/main/MetaDataService.proto * phoenix-core/src/main/java/org/apache/phoenix/parse/CreateIndexStatement.java * bin/sqlline.py * phoenix-core/src/main/java/org/apache/phoenix/query/QueryServicesOptions.java * phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java * phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificTablesDDLIT.java * phoenix-core/src/main/java/org/apache/phoenix/compile/QueryCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/parse/UpsertStatement.java * phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java * bin/phoenix_utils.py * phoenix-core/src/main/java/org/apache/phoenix/protobuf/ProtobufUtil.java * phoenix-core/src/main/java/org/apache/phoenix/parse/FunctionParseNode.java * phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java * phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java * phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java * phoenix-core/src/main/java/org/apache/phoenix/query/MetaDataMutated.java * phoenix-core/src/main/java/org/apache/phoenix/parse/NamedNode.java * phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/parse/DMLStatement.java * phoenix-core/src/main/java/org/apache/phoenix/parse/DropFunctionStatement.java * phoenix-core/src/main/java/org/apache/phoenix/parse/IndexExpressionParseNodeRewriter.java * phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java * phoenix-core/src/main/java/org/apache/phoenix/compile/StatementNormalizer.java * phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java * phoenix-core/src/main/java/org/apache/phoenix/compile/RowProjector.java * phoenix-core/src/main/java/org/apache/phoenix/compile/ExpressionCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/parse/DeleteStatement.java * phoenix-core/src/main/java/org/apache/phoenix/expression/visitor/CloneExpressionVisitor.java * phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/cache/GlobalCache.java * phoenix-core/src/main/java/org/apache/phoenix/expression/ExpressionType.java * phoenix-core/src/main/java/org/apache/phoenix/compile/ColumnResolver.java * phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixStatement.java * phoenix-core/src/main/java/org/apache/phoenix/parse/UDFParseNode.java * phoenix-core/src/main/java/org/apache/phoenix/query/QueryServices.java * phoenix-core/src/main/java/org/apache/phoenix/parse/SelectStatement.java * phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/PFunctionProtos.java * phoenix-core/src/test/java/org/apache/phoenix/query/ParallelIteratorsSplitTest.java * phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java * phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataImpl.java * phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionInfo.java * phoenix-core/src/test/java/org/apache/phoenix/parse/QueryParserTest.java * phoenix-core/src/it/java/org/apache/phoenix/end2end/UserDefinedFunctionsIT.java * phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java * phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaData.java * phoenix-core/src/main/antlr3/PhoenixSQL.g * phoenix-core/src/main/java/org/apache/phoenix/compile/SubqueryRewriter.java * phoenix-core/src/main/java/org/apache/phoenix/expression/function/UDFExpression.java * phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataEntity.java * phoenix-core/src/main/java/org/apache/phoenix/schema/NewerFunctionAlreadyExistsException.java * phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/MetaDataProtos.java * phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeFactory.java * phoenix-core/src/main/java/org/apache/phoenix/compile/SubselectRewriter.java * phoenix-core/src/it/java/org/apache/phoenix/end2end/QueryDatabaseMetaDataIT.java * phoenix-core/src/main/java/org/apache/phoenix/schema/PTable.java * phoenix-core/src/main/java/org/apache/phoenix/schema/FunctionAlreadyExistsException.java * phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java * phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java * phoenix-core/src/main/java/org/apache/phoenix/expression/function/ScalarFunction.java * phoenix-core/src/main/java/org/apache/phoenix/parse/ParseNodeRewriter.java * phoenix-core/src/main/java/org/apache/phoenix/parse/CreateFunctionStatement.java * phoenix-core/src/main/java/org/apache/phoenix/schema/FunctionNotFoundException.java * phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataProtocol.java * phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java * phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServices.java * phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java * phoenix-core/src/main/java/org/apache/phoenix/query/DelegateConnectionQueryServices.java * phoenix-core/src/main/java/org/apache/phoenix/parse/PFunction.java > Support UDFs > ------------ > > Key: PHOENIX-538 > URL: https://issues.apache.org/jira/browse/PHOENIX-538 > Project: Phoenix > Issue Type: Task > Reporter: James Taylor > Assignee: Rajeshbabu Chintaguntla > Fix For: 5.0.0, 4.4.0 > > Attachments: PHOENIX-538-wip.patch, PHOENIX-538_v1.patch, > PHOENIX-538_v2.patch, PHOENIX-538_v3.patch, PHOENIX-538_v4.patch, > PHOENIX-538_v5.patch, PHOENIX-538_v6.patch, PHOENIX-538_v6.patch > > > Phoenix allows built-in functions to be added (as described > [here](http://phoenix-hbase.blogspot.com/2013/04/how-to-add-your-own-built-in-function.html)) > with the restriction that they must be in the phoenix jar. We should improve > on this and allow folks to declare new functions through a CREATE FUNCTION > command like this: > CREATE FUNCTION mdHash(anytype) > RETURNS binary(16) > LOCATION 'hdfs://path-to-my-jar' 'com.me.MDHashFunction' > Since HBase supports loading jars dynamically, this would not be too > difficult. The function implementation class would be required to extend our > ScalarFunction base class. Here's how I could see it being implemented: > * modify the phoenix grammar to support the new CREATE FUNCTION syntax > * create a new UTFParseNode class to capture the parse state > * add a new method to the MetaDataProtocol interface > * add a new method in ConnectionQueryServices to invoke the MetaDataProtocol > method > * add a new method in MetaDataClient to invoke the ConnectionQueryServices > method > * persist functions in a new "SYSTEM.FUNCTION" table > * add a new client-side representation to cache functions called PFunction > * modify ColumnResolver to dynamically resolve a function in the same way we > dynamically resolve and load a table > * create and register a new ExpressionType called UDFExpression > * at parse time, check for the function name in the built in list first (as > is currently done), and if not found in the PFunction cache. If not found > there, then use the new UDFExpression as a placeholder and have the > ColumnResolver attempt to resolve it at compile time and throw an error if > unsuccessful. -- This message was sent by Atlassian JIRA (v6.3.4#6332)