[ https://issues.apache.org/jira/browse/HIVE-26426?focusedWorklogId=795339&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-795339 ]
ASF GitHub Bot logged work on HIVE-26426: ----------------------------------------- Author: ASF GitHub Bot Created on: 26/Jul/22 16:25 Start Date: 26/Jul/22 16:25 Worklog Time Spent: 10m Work Description: jfsii commented on code in PR #3474: URL: https://github.com/apache/hive/pull/3474#discussion_r930178880 ########## ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java: ########## @@ -947,7 +947,7 @@ Pair<Boolean, String> canCBOHandleAst(ASTNode ast, QB qb, PreCboCtx cboCtx) { // Now check QB in more detail. canHandleQbForCbo returns null if query can // be handled. msg = CalcitePlanner.canHandleQbForCbo(queryProperties, conf, true, needToLogMessage); - if (msg == null) { + if (msg == null || msg.isEmpty()) { return Pair.of(true, msg); } msg = msg.substring(0, msg.length() - 2); Review Comment: I would likely either - move the substring to canHandleQbForCbo, so that method always returns a valid looking message or change canHandleQbForCbo to construct a List<String> of reasons and then use String.join with "; " (and remove the substring code). I might also even change the method not to bother with taking in verbose and to always create and return error messages. This is on the error path and not some inner loop reading data, so the performance optimization of checking log levels, etc is in the camp of unneeded optimization making the code ugly. Though I'd go with what @zabetak prefers since they are the primary reviewer. Issue Time Tracking ------------------- Worklog Id: (was: 795339) Time Spent: 1h 20m (was: 1h 10m) > Avoid StringIndexOutOfBoundsException in canCBOHandleAst() method. > ------------------------------------------------------------------ > > Key: HIVE-26426 > URL: https://issues.apache.org/jira/browse/HIVE-26426 > Project: Hive > Issue Type: Bug > Components: HiveServer2 > Reporter: Abhay > Assignee: Abhay > Priority: Minor > Labels: pull-request-available > Time Spent: 1h 20m > Remaining Estimate: 0h > > The call to canHandleQbForCbo() can result in an > StringIndexOutOfBoundsException. The assumption in the code is that the msg > can only be null and we handle that but the msg can also be an empty string > if the *verbose* is set to false. This can happen if INFO Logging is not > enabled. We need to handle that case. > [https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java#L913] > Here is the stack trace for reference: > {noformat} > FAILED: StringIndexOutOfBoundsException String index out of range: -2 > 15:10:24.192 [HiveServer2-Background-Pool: Thread-305] ERROR > org.apache.hadoop.hive.ql.Driver - FAILED: StringIndexOutOfBoundsException > String index out of range: -2 > java.lang.StringIndexOutOfBoundsException: String index out of range: -2 > at java.lang.String.substring(String.java:1967) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner.canCBOHandleAst(CalcitePlanner.java:996) > > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner.genOPTree(CalcitePlanner.java:572) > > at > org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:13063) > at > org.apache.hadoop.hive.ql.parse.CalcitePlanner.analyzeInternal(CalcitePlanner.java:472) > > at > org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:314) > at org.apache.hadoop.hive.ql.Compiler.analyze(Compiler.java:223) > at org.apache.hadoop.hive.ql.Compiler.compile(Compiler.java:105) > at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:201) > at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:650) > at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:596) > at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:590) > at > org.apache.hadoop.hive.ql.reexec.ReExecDriver.compileAndRespond(ReExecDriver.java:127) > at > org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:206) > at > org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork$1.run(SQLOperation.java:336) > at java.security.AccessController.doPrivileged(Native Method) > at javax.security.auth.Subject.doAs(Subject.java:422) > at > org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1899) > at > org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork.run(SQLOperation.java:358) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > at java.lang.Thread.run(Thread.java:750){noformat} -- This message was sent by Atlassian Jira (v8.20.10#820010)