diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java index 20e9c3c7e0..7fed41cdc3 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java @@ -19,6 +19,7 @@ package org.apache.hive.jdbc; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.common.classification.InterfaceAudience.LimitedPrivate; import org.apache.hive.jdbc.logs.InPlaceUpdateStream; import org.apache.hive.service.cli.RowSet; @@ -1015,12 +1016,18 @@ public void setInPlaceUpdateStream(InPlaceUpdateStream stream) { */ @LimitedPrivate(value={"Hive and closely related projects."}) public String getQueryId() throws SQLException { - if (stmtHandle == null) { + // Storing it in temp variable as this method is not thread-safe and concurrent thread can + // close this handle and set it to null after checking for null. + TOperationHandle stmtHandleTmp = stmtHandle; + if (stmtHandleTmp == null) { // If query is not running or already closed. return null; } try { - return client.GetQueryId(new TGetQueryIdReq(stmtHandle)).getQueryId(); + String queryId = client.GetQueryId(new TGetQueryIdReq(stmtHandleTmp)).getQueryId(); + + // Returns empty string if query was already closed. + return StringUtils.isBlank(queryId) ? null : queryId; } catch (TException e) { throw new SQLException(e); } diff --git a/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java b/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java index 48f4fe29ec..8f13fb3cca 100644 --- a/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java +++ b/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java @@ -856,7 +856,7 @@ public TGetQueryIdResp GetQueryId(TGetQueryIdReq req) throws TException { throw new TException(e); } catch (Exception e) { // If concurrently the query is closed before we fetch queryID. - return new TGetQueryIdResp((String)null); + return new TGetQueryIdResp(""); } }