From 2878187b0c329d562d3bf9bb208c4f9d27f4db4d Mon Sep 17 00:00:00 2001 From: Mahesh Kumar Behera Date: Fri, 9 Nov 2018 17:11:43 +0530 Subject: [PATCH 1/2] HIVE-20897 : TestJdbcDriver2#testSelectExecAsync2 fails with result set not present error --- service-rpc/if/TCLIService.thrift | 2 +- .../gen/thrift/gen-cpp/TCLIService_types.cpp | 17 +++--- .../gen/thrift/gen-cpp/TCLIService_types.h | 7 ++- .../service/rpc/thrift/TOperationHandle.java | 58 ++++++++++--------- .../gen/thrift/gen-py/TCLIService/ttypes.py | 2 - .../thrift/gen-rb/t_c_l_i_service_types.rb | 3 +- .../hive/service/cli/OperationHandle.java | 11 +++- .../hive/service/cli/OperationStatus.java | 9 ++- .../hive/service/cli/operation/Operation.java | 7 ++- .../service/cli/thrift/ThriftCLIService.java | 4 +- .../cli/thrift/ThriftCLIServiceClient.java | 2 +- 11 files changed, 73 insertions(+), 49 deletions(-) diff --git a/service-rpc/if/TCLIService.thrift b/service-rpc/if/TCLIService.thrift index 1cf8a918a37e..d1b170cc9a37 100644 --- a/service-rpc/if/TCLIService.thrift +++ b/service-rpc/if/TCLIService.thrift @@ -539,7 +539,7 @@ struct TOperationHandle { // does not generate a result set, and calling // GetResultSetMetadata or FetchResults against // this OperationHandle will generate an error. - 3: required bool hasResultSet + 3: optional bool hasResultSet // For operations that don't generate result sets, // modifiedRowCount is either: diff --git a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp b/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp index d312896c720b..eb78f30e0489 100644 --- a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp +++ b/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp @@ -4491,6 +4491,7 @@ void TOperationHandle::__set_operationType(const TOperationType::type val) { void TOperationHandle::__set_hasResultSet(const bool val) { this->hasResultSet = val; +__isset.hasResultSet = true; } void TOperationHandle::__set_modifiedRowCount(const double val) { @@ -4512,7 +4513,6 @@ uint32_t TOperationHandle::read(::apache::thrift::protocol::TProtocol* iprot) { bool isset_operationId = false; bool isset_operationType = false; - bool isset_hasResultSet = false; while (true) { @@ -4543,7 +4543,7 @@ uint32_t TOperationHandle::read(::apache::thrift::protocol::TProtocol* iprot) { case 3: if (ftype == ::apache::thrift::protocol::T_BOOL) { xfer += iprot->readBool(this->hasResultSet); - isset_hasResultSet = true; + this->__isset.hasResultSet = true; } else { xfer += iprot->skip(ftype); } @@ -4569,8 +4569,6 @@ uint32_t TOperationHandle::read(::apache::thrift::protocol::TProtocol* iprot) { throw TProtocolException(TProtocolException::INVALID_DATA); if (!isset_operationType) throw TProtocolException(TProtocolException::INVALID_DATA); - if (!isset_hasResultSet) - throw TProtocolException(TProtocolException::INVALID_DATA); return xfer; } @@ -4587,10 +4585,11 @@ uint32_t TOperationHandle::write(::apache::thrift::protocol::TProtocol* oprot) c xfer += oprot->writeI32((int32_t)this->operationType); xfer += oprot->writeFieldEnd(); - xfer += oprot->writeFieldBegin("hasResultSet", ::apache::thrift::protocol::T_BOOL, 3); - xfer += oprot->writeBool(this->hasResultSet); - xfer += oprot->writeFieldEnd(); - + if (this->__isset.hasResultSet) { + xfer += oprot->writeFieldBegin("hasResultSet", ::apache::thrift::protocol::T_BOOL, 3); + xfer += oprot->writeBool(this->hasResultSet); + xfer += oprot->writeFieldEnd(); + } if (this->__isset.modifiedRowCount) { xfer += oprot->writeFieldBegin("modifiedRowCount", ::apache::thrift::protocol::T_DOUBLE, 4); xfer += oprot->writeDouble(this->modifiedRowCount); @@ -4630,7 +4629,7 @@ void TOperationHandle::printTo(std::ostream& out) const { out << "TOperationHandle("; out << "operationId=" << to_string(operationId); out << ", " << "operationType=" << to_string(operationType); - out << ", " << "hasResultSet=" << to_string(hasResultSet); + out << ", " << "hasResultSet="; (__isset.hasResultSet ? (out << to_string(hasResultSet)) : (out << "")); out << ", " << "modifiedRowCount="; (__isset.modifiedRowCount ? (out << to_string(modifiedRowCount)) : (out << "")); out << ")"; } diff --git a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h b/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h index b30c28ffabe8..e0fddb117221 100644 --- a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h +++ b/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h @@ -2079,7 +2079,8 @@ inline std::ostream& operator<<(std::ostream& out, const TSessionHandle& obj) } typedef struct _TOperationHandle__isset { - _TOperationHandle__isset() : modifiedRowCount(false) {} + _TOperationHandle__isset() : hasResultSet(false), modifiedRowCount(false) {} + bool hasResultSet :1; bool modifiedRowCount :1; } _TOperationHandle__isset; @@ -2113,7 +2114,9 @@ class TOperationHandle { return false; if (!(operationType == rhs.operationType)) return false; - if (!(hasResultSet == rhs.hasResultSet)) + if (__isset.hasResultSet != rhs.__isset.hasResultSet) + return false; + else if (__isset.hasResultSet && !(hasResultSet == rhs.hasResultSet)) return false; if (__isset.modifiedRowCount != rhs.__isset.modifiedRowCount) return false; diff --git a/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TOperationHandle.java b/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TOperationHandle.java index 7c3eb81cf519..e24a32e31d98 100644 --- a/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TOperationHandle.java +++ b/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TOperationHandle.java @@ -51,7 +51,7 @@ private THandleIdentifier operationId; // required private TOperationType operationType; // required - private boolean hasResultSet; // required + private boolean hasResultSet; // optional private double modifiedRowCount; // optional /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ @@ -129,7 +129,7 @@ public String getFieldName() { private static final int __HASRESULTSET_ISSET_ID = 0; private static final int __MODIFIEDROWCOUNT_ISSET_ID = 1; private byte __isset_bitfield = 0; - private static final _Fields optionals[] = {_Fields.MODIFIED_ROW_COUNT}; + private static final _Fields optionals[] = {_Fields.HAS_RESULT_SET,_Fields.MODIFIED_ROW_COUNT}; public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; static { Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class); @@ -137,7 +137,7 @@ public String getFieldName() { new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, THandleIdentifier.class))); tmpMap.put(_Fields.OPERATION_TYPE, new org.apache.thrift.meta_data.FieldMetaData("operationType", org.apache.thrift.TFieldRequirementType.REQUIRED, new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, TOperationType.class))); - tmpMap.put(_Fields.HAS_RESULT_SET, new org.apache.thrift.meta_data.FieldMetaData("hasResultSet", org.apache.thrift.TFieldRequirementType.REQUIRED, + tmpMap.put(_Fields.HAS_RESULT_SET, new org.apache.thrift.meta_data.FieldMetaData("hasResultSet", org.apache.thrift.TFieldRequirementType.OPTIONAL, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL))); tmpMap.put(_Fields.MODIFIED_ROW_COUNT, new org.apache.thrift.meta_data.FieldMetaData("modifiedRowCount", org.apache.thrift.TFieldRequirementType.OPTIONAL, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE))); @@ -150,14 +150,11 @@ public TOperationHandle() { public TOperationHandle( THandleIdentifier operationId, - TOperationType operationType, - boolean hasResultSet) + TOperationType operationType) { this(); this.operationId = operationId; this.operationType = operationType; - this.hasResultSet = hasResultSet; - setHasResultSetIsSet(true); } /** @@ -392,8 +389,8 @@ public boolean equals(TOperationHandle that) { return false; } - boolean this_present_hasResultSet = true; - boolean that_present_hasResultSet = true; + boolean this_present_hasResultSet = true && this.isSetHasResultSet(); + boolean that_present_hasResultSet = true && that.isSetHasResultSet(); if (this_present_hasResultSet || that_present_hasResultSet) { if (!(this_present_hasResultSet && that_present_hasResultSet)) return false; @@ -427,7 +424,7 @@ public int hashCode() { if (present_operationType) list.add(operationType.getValue()); - boolean present_hasResultSet = true; + boolean present_hasResultSet = true && (isSetHasResultSet()); list.add(present_hasResultSet); if (present_hasResultSet) list.add(hasResultSet); @@ -523,10 +520,12 @@ public String toString() { sb.append(this.operationType); } first = false; - if (!first) sb.append(", "); - sb.append("hasResultSet:"); - sb.append(this.hasResultSet); - first = false; + if (isSetHasResultSet()) { + if (!first) sb.append(", "); + sb.append("hasResultSet:"); + sb.append(this.hasResultSet); + first = false; + } if (isSetModifiedRowCount()) { if (!first) sb.append(", "); sb.append("modifiedRowCount:"); @@ -547,10 +546,6 @@ public void validate() throws org.apache.thrift.TException { throw new org.apache.thrift.protocol.TProtocolException("Required field 'operationType' is unset! Struct:" + toString()); } - if (!isSetHasResultSet()) { - throw new org.apache.thrift.protocol.TProtocolException("Required field 'hasResultSet' is unset! Struct:" + toString()); - } - // check for sub-struct validity if (operationId != null) { operationId.validate(); @@ -649,9 +644,11 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, TOperationHandle s oprot.writeI32(struct.operationType.getValue()); oprot.writeFieldEnd(); } - oprot.writeFieldBegin(HAS_RESULT_SET_FIELD_DESC); - oprot.writeBool(struct.hasResultSet); - oprot.writeFieldEnd(); + if (struct.isSetHasResultSet()) { + oprot.writeFieldBegin(HAS_RESULT_SET_FIELD_DESC); + oprot.writeBool(struct.hasResultSet); + oprot.writeFieldEnd(); + } if (struct.isSetModifiedRowCount()) { oprot.writeFieldBegin(MODIFIED_ROW_COUNT_FIELD_DESC); oprot.writeDouble(struct.modifiedRowCount); @@ -676,12 +673,17 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TOperationHandle st TTupleProtocol oprot = (TTupleProtocol) prot; struct.operationId.write(oprot); oprot.writeI32(struct.operationType.getValue()); - oprot.writeBool(struct.hasResultSet); BitSet optionals = new BitSet(); - if (struct.isSetModifiedRowCount()) { + if (struct.isSetHasResultSet()) { optionals.set(0); } - oprot.writeBitSet(optionals, 1); + if (struct.isSetModifiedRowCount()) { + optionals.set(1); + } + oprot.writeBitSet(optionals, 2); + if (struct.isSetHasResultSet()) { + oprot.writeBool(struct.hasResultSet); + } if (struct.isSetModifiedRowCount()) { oprot.writeDouble(struct.modifiedRowCount); } @@ -695,10 +697,12 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TOperationHandle str struct.setOperationIdIsSet(true); struct.operationType = org.apache.hive.service.rpc.thrift.TOperationType.findByValue(iprot.readI32()); struct.setOperationTypeIsSet(true); - struct.hasResultSet = iprot.readBool(); - struct.setHasResultSetIsSet(true); - BitSet incoming = iprot.readBitSet(1); + BitSet incoming = iprot.readBitSet(2); if (incoming.get(0)) { + struct.hasResultSet = iprot.readBool(); + struct.setHasResultSetIsSet(true); + } + if (incoming.get(1)) { struct.modifiedRowCount = iprot.readDouble(); struct.setModifiedRowCountIsSet(true); } diff --git a/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py b/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py index 989ba4456f94..0d7aec34bc3b 100644 --- a/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py +++ b/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py @@ -3497,8 +3497,6 @@ def validate(self): raise TProtocol.TProtocolException(message='Required field operationId is unset!') if self.operationType is None: raise TProtocol.TProtocolException(message='Required field operationType is unset!') - if self.hasResultSet is None: - raise TProtocol.TProtocolException(message='Required field hasResultSet is unset!') return diff --git a/service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb b/service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb index 6ab4063bbdb9..3c2975ff748b 100644 --- a/service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb +++ b/service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb @@ -942,7 +942,7 @@ class TOperationHandle FIELDS = { OPERATIONID => {:type => ::Thrift::Types::STRUCT, :name => 'operationId', :class => ::THandleIdentifier}, OPERATIONTYPE => {:type => ::Thrift::Types::I32, :name => 'operationType', :enum_class => ::TOperationType}, - HASRESULTSET => {:type => ::Thrift::Types::BOOL, :name => 'hasResultSet'}, + HASRESULTSET => {:type => ::Thrift::Types::BOOL, :name => 'hasResultSet', :optional => true}, MODIFIEDROWCOUNT => {:type => ::Thrift::Types::DOUBLE, :name => 'modifiedRowCount', :optional => true} } @@ -951,7 +951,6 @@ def struct_fields; FIELDS; end def validate raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field operationId is unset!') unless @operationId raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field operationType is unset!') unless @operationType - raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field hasResultSet is unset!') if @hasResultSet.nil? unless @operationType.nil? || ::TOperationType::VALID_VALUES.include?(@operationType) raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field operationType!') end diff --git a/service/src/java/org/apache/hive/service/cli/OperationHandle.java b/service/src/java/org/apache/hive/service/cli/OperationHandle.java index 000291392487..14a9d90feeeb 100644 --- a/service/src/java/org/apache/hive/service/cli/OperationHandle.java +++ b/service/src/java/org/apache/hive/service/cli/OperationHandle.java @@ -25,6 +25,7 @@ public class OperationHandle extends Handle { private final OperationType opType; private final TProtocolVersion protocol; private boolean hasResultSet = false; + private boolean hasResultSetIsSet = false; public OperationHandle(OperationType opType, TProtocolVersion protocol) { super(); @@ -42,6 +43,7 @@ public OperationHandle(TOperationHandle tOperationHandle, TProtocolVersion proto this.opType = OperationType.getOperationType(tOperationHandle.getOperationType()); this.hasResultSet = tOperationHandle.isHasResultSet(); this.protocol = protocol; + this.hasResultSetIsSet = tOperationHandle.isSetHasResultSet(); } public OperationType getOperationType() { @@ -50,17 +52,24 @@ public OperationType getOperationType() { public void setHasResultSet(boolean hasResultSet) { this.hasResultSet = hasResultSet; + hasResultSetIsSet = true; } public boolean hasResultSet() { return hasResultSet; } + public boolean isHasResultSetIsSet() { + return hasResultSetIsSet; + } + public TOperationHandle toTOperationHandle() { TOperationHandle tOperationHandle = new TOperationHandle(); tOperationHandle.setOperationId(getHandleIdentifier().toTHandleIdentifier()); tOperationHandle.setOperationType(opType.toTOperationType()); - tOperationHandle.setHasResultSet(hasResultSet); + if (hasResultSetIsSet) { + tOperationHandle.setHasResultSet(hasResultSet); + } return tOperationHandle; } diff --git a/service/src/java/org/apache/hive/service/cli/OperationStatus.java b/service/src/java/org/apache/hive/service/cli/OperationStatus.java index 581bf925c568..bd55801ef834 100644 --- a/service/src/java/org/apache/hive/service/cli/OperationStatus.java +++ b/service/src/java/org/apache/hive/service/cli/OperationStatus.java @@ -32,14 +32,17 @@ public class OperationStatus { private final HiveSQLException operationException; private JobProgressUpdate jobProgressUpdate; private long numModifiedRows; + private final boolean hasResultSetIsSet; - public OperationStatus(OperationState state, String taskStatus, long operationStarted, long operationCompleted, boolean hasResultSet, HiveSQLException operationException) { + public OperationStatus(OperationState state, String taskStatus, long operationStarted, long operationCompleted, + boolean hasResultSet, HiveSQLException operationException, boolean hasResultSetIsSet) { this.state = state; this.taskStatus = taskStatus; this.operationStarted = operationStarted; this.operationCompleted = operationCompleted; this.hasResultSet = hasResultSet; this.operationException = operationException; + this.hasResultSetIsSet = hasResultSetIsSet; } public OperationState getState() { @@ -81,4 +84,8 @@ public long getNumModifiedRows() { void setNumModifiedRows(long numRows) { this.numModifiedRows = numRows; } + + public boolean isHasResultSetIsSet() { + return hasResultSetIsSet; + } } diff --git a/service/src/java/org/apache/hive/service/cli/operation/Operation.java b/service/src/java/org/apache/hive/service/cli/operation/Operation.java index cb995de94ec4..67835510af76 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/Operation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/Operation.java @@ -61,7 +61,8 @@ public abstract class Operation { private final OperationHandle opHandle; public static final FetchOrientation DEFAULT_FETCH_ORIENTATION = FetchOrientation.FETCH_NEXT; public static final Logger LOG = LoggerFactory.getLogger(Operation.class.getName()); - protected boolean hasResultSet; + protected boolean hasResultSet = false; + protected boolean hasResultSetIsSet = false; protected volatile HiveSQLException operationException; protected volatile Future backgroundHandle; protected OperationLog operationLog; @@ -139,7 +140,8 @@ public OperationStatus getStatus() { } catch (HiveSQLException sqlException) { LOG.error("Error getting task status for " + opHandle.toString(), sqlException); } - return new OperationStatus(state, taskStatus, operationStart, operationComplete, hasResultSet, operationException); + return new OperationStatus(state, taskStatus, operationStart, operationComplete, hasResultSet, + operationException, hasResultSetIsSet); } public boolean hasResultSet() { @@ -148,6 +150,7 @@ public boolean hasResultSet() { protected void setHasResultSet(boolean hasResultSet) { this.hasResultSet = hasResultSet; + this.hasResultSetIsSet = true; opHandle.setHasResultSet(hasResultSet); } 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 059e4c98dcff..085604bdac0c 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 @@ -706,7 +706,9 @@ public TGetOperationStatusResp GetOperationStatus(TGetOperationStatusReq req) th resp.setTaskStatus(operationStatus.getTaskStatus()); resp.setOperationStarted(operationStatus.getOperationStarted()); resp.setOperationCompleted(operationStatus.getOperationCompleted()); - resp.setHasResultSet(operationStatus.getHasResultSet()); + if (operationStatus.isHasResultSetIsSet()) { + resp.setHasResultSet(operationStatus.getHasResultSet()); + } JobProgressUpdate progressUpdate = operationStatus.jobProgressUpdate(); ProgressMonitorStatusMapper mapper = ProgressMonitorStatusMapper.DEFAULT; if ("tez".equals(hiveConf.getVar(ConfVars.HIVE_EXECUTION_ENGINE))) { diff --git a/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIServiceClient.java b/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIServiceClient.java index df16b64e7f93..056dd0520112 100644 --- a/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIServiceClient.java +++ b/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIServiceClient.java @@ -384,7 +384,7 @@ public OperationStatus getOperationStatus(OperationHandle opHandle, boolean getP opException = new HiveSQLException(resp.getErrorMessage(), resp.getSqlState(), resp.getErrorCode()); } return new OperationStatus(opState, resp.getTaskStatus(), resp.getOperationStarted(), - resp.getOperationCompleted(), resp.isHasResultSet(), opException); + resp.getOperationCompleted(), resp.isHasResultSet(), opException, resp.isSetHasResultSet()); } catch (HiveSQLException e) { throw e; } catch (Exception e) { From ae5e87e6d3109840158b698f1157345d971950b5 Mon Sep 17 00:00:00 2001 From: Mahesh Kumar Behera Date: Tue, 27 Nov 2018 21:56:06 +0530 Subject: [PATCH 2/2] HIVE-20897 : TestJdbcDriver2#testSelectExecAsync2 fails with result set not present error : review comment fix --- .../apache/hive/service/cli/OperationHandle.java | 14 ++++++-------- .../apache/hive/service/cli/OperationStatus.java | 10 ++++------ .../hive/service/cli/operation/Operation.java | 10 ++++------ 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/service/src/java/org/apache/hive/service/cli/OperationHandle.java b/service/src/java/org/apache/hive/service/cli/OperationHandle.java index 14a9d90feeeb..1090315075f0 100644 --- a/service/src/java/org/apache/hive/service/cli/OperationHandle.java +++ b/service/src/java/org/apache/hive/service/cli/OperationHandle.java @@ -24,8 +24,7 @@ public class OperationHandle extends Handle { private final OperationType opType; private final TProtocolVersion protocol; - private boolean hasResultSet = false; - private boolean hasResultSetIsSet = false; + private Boolean hasResultSet = null; public OperationHandle(OperationType opType, TProtocolVersion protocol) { super(); @@ -41,9 +40,8 @@ public OperationHandle(TOperationHandle tOperationHandle) { public OperationHandle(TOperationHandle tOperationHandle, TProtocolVersion protocol) { super(tOperationHandle.getOperationId()); this.opType = OperationType.getOperationType(tOperationHandle.getOperationType()); - this.hasResultSet = tOperationHandle.isHasResultSet(); + this.hasResultSet = tOperationHandle.isSetHasResultSet() ? tOperationHandle.isHasResultSet() : null; this.protocol = protocol; - this.hasResultSetIsSet = tOperationHandle.isSetHasResultSet(); } public OperationType getOperationType() { @@ -52,22 +50,22 @@ public OperationType getOperationType() { public void setHasResultSet(boolean hasResultSet) { this.hasResultSet = hasResultSet; - hasResultSetIsSet = true; } public boolean hasResultSet() { - return hasResultSet; + // null check to retain the old behavior + return hasResultSet == null ? false : hasResultSet; } public boolean isHasResultSetIsSet() { - return hasResultSetIsSet; + return hasResultSet != null; } public TOperationHandle toTOperationHandle() { TOperationHandle tOperationHandle = new TOperationHandle(); tOperationHandle.setOperationId(getHandleIdentifier().toTHandleIdentifier()); tOperationHandle.setOperationType(opType.toTOperationType()); - if (hasResultSetIsSet) { + if (hasResultSet != null) { tOperationHandle.setHasResultSet(hasResultSet); } return tOperationHandle; diff --git a/service/src/java/org/apache/hive/service/cli/OperationStatus.java b/service/src/java/org/apache/hive/service/cli/OperationStatus.java index bd55801ef834..62aa64aa7cee 100644 --- a/service/src/java/org/apache/hive/service/cli/OperationStatus.java +++ b/service/src/java/org/apache/hive/service/cli/OperationStatus.java @@ -28,11 +28,10 @@ public class OperationStatus { private final String taskStatus; private final long operationStarted; private final long operationCompleted; - private final boolean hasResultSet; + private final Boolean hasResultSet; private final HiveSQLException operationException; private JobProgressUpdate jobProgressUpdate; private long numModifiedRows; - private final boolean hasResultSetIsSet; public OperationStatus(OperationState state, String taskStatus, long operationStarted, long operationCompleted, boolean hasResultSet, HiveSQLException operationException, boolean hasResultSetIsSet) { @@ -40,9 +39,8 @@ public OperationStatus(OperationState state, String taskStatus, long operationSt this.taskStatus = taskStatus; this.operationStarted = operationStarted; this.operationCompleted = operationCompleted; - this.hasResultSet = hasResultSet; + this.hasResultSet = hasResultSetIsSet ? hasResultSet : null; this.operationException = operationException; - this.hasResultSetIsSet = hasResultSetIsSet; } public OperationState getState() { @@ -62,7 +60,7 @@ public long getOperationCompleted() { } public boolean getHasResultSet() { - return hasResultSet; + return hasResultSet == null ? false : hasResultSet; } public HiveSQLException getOperationException() { @@ -86,6 +84,6 @@ void setNumModifiedRows(long numRows) { } public boolean isHasResultSetIsSet() { - return hasResultSetIsSet; + return hasResultSet != null; } } diff --git a/service/src/java/org/apache/hive/service/cli/operation/Operation.java b/service/src/java/org/apache/hive/service/cli/operation/Operation.java index 67835510af76..6d4a2d4a31ed 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/Operation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/Operation.java @@ -61,8 +61,7 @@ public abstract class Operation { private final OperationHandle opHandle; public static final FetchOrientation DEFAULT_FETCH_ORIENTATION = FetchOrientation.FETCH_NEXT; public static final Logger LOG = LoggerFactory.getLogger(Operation.class.getName()); - protected boolean hasResultSet = false; - protected boolean hasResultSetIsSet = false; + protected Boolean hasResultSet = null; protected volatile HiveSQLException operationException; protected volatile Future backgroundHandle; protected OperationLog operationLog; @@ -140,17 +139,16 @@ public OperationStatus getStatus() { } catch (HiveSQLException sqlException) { LOG.error("Error getting task status for " + opHandle.toString(), sqlException); } - return new OperationStatus(state, taskStatus, operationStart, operationComplete, hasResultSet, - operationException, hasResultSetIsSet); + return new OperationStatus(state, taskStatus, operationStart, operationComplete, hasResultSet(), + operationException, hasResultSet != null); } public boolean hasResultSet() { - return hasResultSet; + return hasResultSet == null ? false : hasResultSet; } protected void setHasResultSet(boolean hasResultSet) { this.hasResultSet = hasResultSet; - this.hasResultSetIsSet = true; opHandle.setHasResultSet(hasResultSet); }