[ https://issues.apache.org/jira/browse/HIVE-3495?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13459905#comment-13459905 ]
Yin Huai commented on HIVE-3495: -------------------------------- org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getGenericUDAFEvaluator is called by three methods, org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlanGroupByOperator, org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlanGroupByOperator1, and org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlanMapGroupByOperator. genExprNodeDesc is used only by genGroupByPlanMapGroupByOperator. For other two methods, they just create an ExprNodeColumnDesc. We cannot simply use genExprNodeDesc for all cases, because genExprNodeDesc will return an ExprNodeColumnDesc directly when it can find the ColumnInfo through groupByInputRowResolver, which is the case for genGroupByPlanGroupByOperator and genGroupByPlanGroupByOperator1 (otherwise, a SemanticException will be thrown). any suggestion? > elements in aggParameters passed to SemanticAnalyzer.getGenericUDAFEvaluator > are generated in two different ways > ----------------------------------------------------------------------------------------------------------------- > > Key: HIVE-3495 > URL: https://issues.apache.org/jira/browse/HIVE-3495 > Project: Hive > Issue Type: Bug > Components: Query Processor > Reporter: Yin Huai > Assignee: Yin Huai > Priority: Minor > > When I was working on HIVE-3493, I also found elements in aggParameters are > generated by two different ways. One is > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genExprNodeDesc(ASTNode, > RowResolver). Another is to create an ExprNodeColumnDesc. Since a UDAF may > need to check the type of its parameters, e.g. percentile_approx > (GenericUDAFPercentileApprox), if the second way is used, we may get a > UDFArgumentTypeException. > An example used to reply the error is > {code:sql} > set hive.map.aggr=false; > SELECT percentile_approx(cast(substr(src.value,5) AS double), 0.5) FROM src; > {code}. > Here is the log > {code} > 2012-09-20 12:36:06,947 DEBUG exec.FunctionRegistry > (FunctionRegistry.java:getGenericUDAFResolver(849)) - Looking up GenericUDAF: > percentile_approx > 2012-09-20 12:36:06,952 ERROR ql.Driver (SessionState.java:printError(400)) - > FAILED: UDFArgumentTypeException The second argument must be a constant, but > double was passed instead. > org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException: The second argument > must be a constant, but double was passed instead. > at > org.apache.hadoop.hive.ql.udf.generic.GenericUDAFPercentileApprox.getEvaluator(GenericUDAFPercentileApprox.java:149) > at > org.apache.hadoop.hive.ql.exec.FunctionRegistry.getGenericUDAFEvaluator(FunctionRegistry.java:774) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.getGenericUDAFEvaluator(SemanticAnalyzer.java:2389) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlanGroupByOperator(SemanticAnalyzer.java:2561) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genGroupByPlan1MR(SemanticAnalyzer.java:3341) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genBodyPlan(SemanticAnalyzer.java:6140) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.genPlan(SemanticAnalyzer.java:6903) > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:7484) > at > org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:245) > at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:431) > at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:335) > at org.apache.hadoop.hive.ql.Driver.run(Driver.java:903) > at > org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259) > at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216) > at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:412) > at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:347) > at org.apache.hadoop.hive.ql.QTestUtil.executeClient(QTestUtil.java:713) > at > org.apache.hadoop.hive.cli.TestCliDriver.testCliDriver_udaf_percentile_approx_replay(TestCliDriver.java:125) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at junit.framework.TestCase.runTest(TestCase.java:168) > at junit.framework.TestCase.runBare(TestCase.java:134) > at junit.framework.TestResult$1.protect(TestResult.java:110) > at junit.framework.TestResult.runProtected(TestResult.java:128) > at junit.framework.TestResult.run(TestResult.java:113) > at junit.framework.TestCase.run(TestCase.java:124) > at junit.framework.TestSuite.runTest(TestSuite.java:232) > at junit.framework.TestSuite.run(TestSuite.java:227) > at > org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520) > at > org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060) > at > org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911) > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira