Repository: hive Updated Branches: refs/heads/master c6974c228 -> aed350351
HIVE-13882: When hive.server2.async.exec.async.compile is turned on, from JDBC we will get "The query did not generate a result set" (Reviewed by Jimmy Xiang) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/aed35035 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/aed35035 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/aed35035 Branch: refs/heads/master Commit: aed350351b24125ff6bbf36373b5247070c48d5c Parents: c6974c2 Author: Aihua Xu <aihu...@apache.org> Authored: Tue Apr 26 14:31:55 2016 -0400 Committer: Aihua Xu <aihu...@apache.org> Committed: Tue May 31 10:40:28 2016 -0400 ---------------------------------------------------------------------- .../org/apache/hadoop/hive/conf/HiveConf.java | 2 +- .../apache/hive/jdbc/TestJdbcWithMiniHS2.java | 69 +++++++++++- .../org/apache/hive/jdbc/HiveStatement.java | 12 ++- service-rpc/if/TCLIService.thrift | 4 + .../gen/thrift/gen-cpp/TCLIService_types.cpp | 22 ++++ .../src/gen/thrift/gen-cpp/TCLIService_types.h | 12 ++- .../rpc/thrift/TGetOperationStatusResp.java | 107 ++++++++++++++++++- service-rpc/src/gen/thrift/gen-php/Types.php | 23 ++++ .../src/gen/thrift/gen-py/TCLIService/ttypes.py | 15 ++- .../gen/thrift/gen-rb/t_c_l_i_service_types.rb | 4 +- .../hive/service/cli/OperationStatus.java | 8 +- .../hive/service/cli/operation/Operation.java | 2 +- .../service/cli/thrift/ThriftCLIService.java | 1 + .../cli/thrift/ThriftCLIServiceClient.java | 2 +- 14 files changed, 264 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java ---------------------------------------------------------------------- diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index 6a404bd..cdff4db 100644 --- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -2082,7 +2082,7 @@ public class HiveConf extends Configuration { HIVE_SERVER2_THRIFT_BIND_HOST("hive.server2.thrift.bind.host", "", "Bind host on which to run the HiveServer2 Thrift service."), HIVE_SERVER2_PARALLEL_COMPILATION("hive.driver.parallel.compilation", false, "Whether to\n" + - "enable parallel compilation between sessions on HiveServer2. The default is false."), + "enable parallel compilation of the queries between sessions and within the same session on HiveServer2. The default is false."), HIVE_SERVER2_COMPILE_LOCK_TIMEOUT("hive.server2.compile.lock.timeout", "0s", new TimeValidator(TimeUnit.SECONDS), "Number of seconds a request will wait to acquire the compile lock before giving up. " + http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java ---------------------------------------------------------------------- diff --git a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java index a01daa4..0c313a2 100644 --- a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java +++ b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java @@ -50,6 +50,7 @@ import java.util.concurrent.TimeoutException; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; + import org.apache.commons.lang.StringUtils; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; @@ -138,6 +139,66 @@ public class TestJdbcWithMiniHS2 { } @Test + public void testParallelCompilation() throws Exception { + final String tableName = "testParallelCompilation"; + hs2Conn = getConnection(); + Statement stmt = hs2Conn.createStatement(); + + // create table + stmt.execute("DROP TABLE IF EXISTS " + tableName); + stmt.execute("CREATE TABLE " + tableName + + " (under_col INT COMMENT 'the under column', value STRING) COMMENT ' test table'"); + + // load data + stmt.execute("load data local inpath '" + + kvDataFilePath.toString() + "' into table " + tableName); + + ResultSet res = stmt.executeQuery("SELECT * FROM " + tableName); + assertTrue(res.next()); + res.close(); + + stmt.execute("SET hive.driver.parallel.compilation=true"); + stmt.execute("SET hive.server2.async.exec.async.compile=true"); + + stmt.close(); + + startConcurrencyTest(hs2Conn, tableName, 10); + Connection conn2 = getConnection(); + startConcurrencyTest(conn2, tableName, 10); + conn2.close(); + } + + @Test + public void testParallelCompilation2() throws Exception { + final String tableName = "testParallelCompilation2"; + hs2Conn = getConnection(); + Statement stmt = hs2Conn.createStatement(); + + // create table + stmt.execute("DROP TABLE IF EXISTS " + tableName); + stmt.execute("CREATE TABLE " + tableName + + " (under_col INT COMMENT 'the under column', value STRING) COMMENT ' test table'"); + + // load data + stmt.execute("load data local inpath '" + + kvDataFilePath.toString() + "' into table " + tableName); + + ResultSet res = stmt.executeQuery("SELECT * FROM " + tableName); + assertTrue(res.next()); + res.close(); + + stmt.execute("SET hive.driver.parallel.compilation=false"); + stmt.execute("SET hive.server2.async.exec.async.compile=true"); + + stmt.close(); + + startConcurrencyTest(hs2Conn, tableName, 10); + Connection conn2 = getConnection(); + startConcurrencyTest(conn2, tableName, 10); + conn2.close(); + } + + @Test public void testConcurrentStatements() throws Exception { String tableName = "testConcurrentStatements"; hs2Conn = getConnection(); @@ -157,9 +218,13 @@ public class TestJdbcWithMiniHS2 { res.close(); stmt.close(); + startConcurrencyTest(hs2Conn, tableName, 300); + } + + private static void startConcurrencyTest(Connection conn, String tableName, int numTasks) { // Start concurrent testing int POOL_SIZE = 100; - int TASK_COUNT = 300; + int TASK_COUNT = numTasks; SynchronousQueue<Runnable> executorQueue = new SynchronousQueue<Runnable>(); ExecutorService workers = new ThreadPoolExecutor(1, POOL_SIZE, 20, TimeUnit.SECONDS, executorQueue); @@ -167,7 +232,7 @@ public class TestJdbcWithMiniHS2 { int i = 0; while(i < TASK_COUNT) { try { - Future<Boolean> future = workers.submit(new JDBCTask(hs2Conn, i, tableName)); + Future<Boolean> future = workers.submit(new JDBCTask(conn, i, tableName)); list.add(future); i++; } catch (RejectedExecutionException ree) { http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java ---------------------------------------------------------------------- diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java index 38ccc78..c4784c3 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java @@ -248,10 +248,10 @@ public class HiveStatement implements java.sql.Statement { @Override public boolean execute(String sql) throws SQLException { runAsyncOnServer(sql); - waitForOperationToComplete(); + TGetOperationStatusResp status = waitForOperationToComplete(); // The query should be completed by now - if (!stmtHandle.isHasResultSet()) { + if (!status.isHasResultSet()) { return false; } resultSet = new HiveQueryResultSet.Builder(this).setClient(client).setSessionHandle(sessHandle) @@ -299,7 +299,7 @@ public class HiveStatement implements java.sql.Statement { * Run asynchronously whenever possible * Currently only a SQLOperation can be run asynchronously, * in a background operation thread - * Compilation is synchronous and execution is asynchronous + * Compilation can run asynchronously or synchronously and execution run asynchronously */ execReq.setRunAsync(true); execReq.setConfOverlay(sessConf); @@ -318,9 +318,9 @@ public class HiveStatement implements java.sql.Statement { } } - void waitForOperationToComplete() throws SQLException { + TGetOperationStatusResp waitForOperationToComplete() throws SQLException { TGetOperationStatusReq statusReq = new TGetOperationStatusReq(stmtHandle); - TGetOperationStatusResp statusResp; + TGetOperationStatusResp statusResp = null; // Poll on the operation status, till the operation is complete while (!isOperationComplete) { @@ -363,6 +363,8 @@ public class HiveStatement implements java.sql.Statement { throw new SQLException(e.toString(), "08S01", e); } } + + return statusResp; } private void checkConnection(String action) throws SQLException { http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/if/TCLIService.thrift ---------------------------------------------------------------------- diff --git a/service-rpc/if/TCLIService.thrift b/service-rpc/if/TCLIService.thrift index 9879b1b..5a9a785 100644 --- a/service-rpc/if/TCLIService.thrift +++ b/service-rpc/if/TCLIService.thrift @@ -1037,9 +1037,13 @@ struct TGetOperationStatusResp { // When was the operation started 7: optional i64 operationStarted + // When was the operation completed 8: optional i64 operationCompleted + // If the operation has the result + 9: optional bool hasResultSet + } http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp ---------------------------------------------------------------------- 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 5229230..0f53cb2 100644 --- a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp +++ b/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp @@ -8293,6 +8293,11 @@ void TGetOperationStatusResp::__set_operationCompleted(const int64_t val) { __isset.operationCompleted = true; } +void TGetOperationStatusResp::__set_hasResultSet(const bool val) { + this->hasResultSet = val; +__isset.hasResultSet = true; +} + uint32_t TGetOperationStatusResp::read(::apache::thrift::protocol::TProtocol* iprot) { apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); @@ -8381,6 +8386,14 @@ uint32_t TGetOperationStatusResp::read(::apache::thrift::protocol::TProtocol* ip xfer += iprot->skip(ftype); } break; + case 9: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->hasResultSet); + this->__isset.hasResultSet = true; + } else { + xfer += iprot->skip(ftype); + } + break; default: xfer += iprot->skip(ftype); break; @@ -8439,6 +8452,11 @@ uint32_t TGetOperationStatusResp::write(::apache::thrift::protocol::TProtocol* o xfer += oprot->writeI64(this->operationCompleted); xfer += oprot->writeFieldEnd(); } + if (this->__isset.hasResultSet) { + xfer += oprot->writeFieldBegin("hasResultSet", ::apache::thrift::protocol::T_BOOL, 9); + xfer += oprot->writeBool(this->hasResultSet); + xfer += oprot->writeFieldEnd(); + } xfer += oprot->writeFieldStop(); xfer += oprot->writeStructEnd(); return xfer; @@ -8454,6 +8472,7 @@ void swap(TGetOperationStatusResp &a, TGetOperationStatusResp &b) { swap(a.taskStatus, b.taskStatus); swap(a.operationStarted, b.operationStarted); swap(a.operationCompleted, b.operationCompleted); + swap(a.hasResultSet, b.hasResultSet); swap(a.__isset, b.__isset); } @@ -8466,6 +8485,7 @@ TGetOperationStatusResp::TGetOperationStatusResp(const TGetOperationStatusResp& taskStatus = other271.taskStatus; operationStarted = other271.operationStarted; operationCompleted = other271.operationCompleted; + hasResultSet = other271.hasResultSet; __isset = other271.__isset; } TGetOperationStatusResp& TGetOperationStatusResp::operator=(const TGetOperationStatusResp& other272) { @@ -8477,6 +8497,7 @@ TGetOperationStatusResp& TGetOperationStatusResp::operator=(const TGetOperationS taskStatus = other272.taskStatus; operationStarted = other272.operationStarted; operationCompleted = other272.operationCompleted; + hasResultSet = other272.hasResultSet; __isset = other272.__isset; return *this; } @@ -8491,6 +8512,7 @@ void TGetOperationStatusResp::printTo(std::ostream& out) const { out << ", " << "taskStatus="; (__isset.taskStatus ? (out << to_string(taskStatus)) : (out << "<null>")); out << ", " << "operationStarted="; (__isset.operationStarted ? (out << to_string(operationStarted)) : (out << "<null>")); out << ", " << "operationCompleted="; (__isset.operationCompleted ? (out << to_string(operationCompleted)) : (out << "<null>")); + out << ", " << "hasResultSet="; (__isset.hasResultSet ? (out << to_string(hasResultSet)) : (out << "<null>")); out << ")"; } http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h ---------------------------------------------------------------------- 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 838bf17..d23b3cd 100644 --- a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h +++ b/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h @@ -3709,7 +3709,7 @@ inline std::ostream& operator<<(std::ostream& out, const TGetOperationStatusReq& } typedef struct _TGetOperationStatusResp__isset { - _TGetOperationStatusResp__isset() : operationState(false), sqlState(false), errorCode(false), errorMessage(false), taskStatus(false), operationStarted(false), operationCompleted(false) {} + _TGetOperationStatusResp__isset() : operationState(false), sqlState(false), errorCode(false), errorMessage(false), taskStatus(false), operationStarted(false), operationCompleted(false), hasResultSet(false) {} bool operationState :1; bool sqlState :1; bool errorCode :1; @@ -3717,6 +3717,7 @@ typedef struct _TGetOperationStatusResp__isset { bool taskStatus :1; bool operationStarted :1; bool operationCompleted :1; + bool hasResultSet :1; } _TGetOperationStatusResp__isset; class TGetOperationStatusResp { @@ -3724,7 +3725,7 @@ class TGetOperationStatusResp { TGetOperationStatusResp(const TGetOperationStatusResp&); TGetOperationStatusResp& operator=(const TGetOperationStatusResp&); - TGetOperationStatusResp() : operationState((TOperationState::type)0), sqlState(), errorCode(0), errorMessage(), taskStatus(), operationStarted(0), operationCompleted(0) { + TGetOperationStatusResp() : operationState((TOperationState::type)0), sqlState(), errorCode(0), errorMessage(), taskStatus(), operationStarted(0), operationCompleted(0), hasResultSet(0) { } virtual ~TGetOperationStatusResp() throw(); @@ -3736,6 +3737,7 @@ class TGetOperationStatusResp { std::string taskStatus; int64_t operationStarted; int64_t operationCompleted; + bool hasResultSet; _TGetOperationStatusResp__isset __isset; @@ -3755,6 +3757,8 @@ class TGetOperationStatusResp { void __set_operationCompleted(const int64_t val); + void __set_hasResultSet(const bool val); + bool operator == (const TGetOperationStatusResp & rhs) const { if (!(status == rhs.status)) @@ -3787,6 +3791,10 @@ class TGetOperationStatusResp { return false; else if (__isset.operationCompleted && !(operationCompleted == rhs.operationCompleted)) return false; + if (__isset.hasResultSet != rhs.__isset.hasResultSet) + return false; + else if (__isset.hasResultSet && !(hasResultSet == rhs.hasResultSet)) + return false; return true; } bool operator != (const TGetOperationStatusResp &rhs) const { http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java ---------------------------------------------------------------------- diff --git a/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java b/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java index 3049280..b981368 100644 --- a/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java +++ b/service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java @@ -46,6 +46,7 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper private static final org.apache.thrift.protocol.TField TASK_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("taskStatus", org.apache.thrift.protocol.TType.STRING, (short)6); private static final org.apache.thrift.protocol.TField OPERATION_STARTED_FIELD_DESC = new org.apache.thrift.protocol.TField("operationStarted", org.apache.thrift.protocol.TType.I64, (short)7); private static final org.apache.thrift.protocol.TField OPERATION_COMPLETED_FIELD_DESC = new org.apache.thrift.protocol.TField("operationCompleted", org.apache.thrift.protocol.TType.I64, (short)8); + private static final org.apache.thrift.protocol.TField HAS_RESULT_SET_FIELD_DESC = new org.apache.thrift.protocol.TField("hasResultSet", org.apache.thrift.protocol.TType.BOOL, (short)9); private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>(); static { @@ -61,6 +62,7 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper private String taskStatus; // optional private long operationStarted; // optional private long operationCompleted; // optional + private boolean hasResultSet; // optional /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ public enum _Fields implements org.apache.thrift.TFieldIdEnum { @@ -75,7 +77,8 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper ERROR_MESSAGE((short)5, "errorMessage"), TASK_STATUS((short)6, "taskStatus"), OPERATION_STARTED((short)7, "operationStarted"), - OPERATION_COMPLETED((short)8, "operationCompleted"); + OPERATION_COMPLETED((short)8, "operationCompleted"), + HAS_RESULT_SET((short)9, "hasResultSet"); private static final Map<String, _Fields> byName = new HashMap<String, _Fields>(); @@ -106,6 +109,8 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper return OPERATION_STARTED; case 8: // OPERATION_COMPLETED return OPERATION_COMPLETED; + case 9: // HAS_RESULT_SET + return HAS_RESULT_SET; default: return null; } @@ -149,8 +154,9 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper private static final int __ERRORCODE_ISSET_ID = 0; private static final int __OPERATIONSTARTED_ISSET_ID = 1; private static final int __OPERATIONCOMPLETED_ISSET_ID = 2; + private static final int __HASRESULTSET_ISSET_ID = 3; private byte __isset_bitfield = 0; - private static final _Fields optionals[] = {_Fields.OPERATION_STATE,_Fields.SQL_STATE,_Fields.ERROR_CODE,_Fields.ERROR_MESSAGE,_Fields.TASK_STATUS,_Fields.OPERATION_STARTED,_Fields.OPERATION_COMPLETED}; + private static final _Fields optionals[] = {_Fields.OPERATION_STATE,_Fields.SQL_STATE,_Fields.ERROR_CODE,_Fields.ERROR_MESSAGE,_Fields.TASK_STATUS,_Fields.OPERATION_STARTED,_Fields.OPERATION_COMPLETED,_Fields.HAS_RESULT_SET}; 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); @@ -170,6 +176,8 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))); tmpMap.put(_Fields.OPERATION_COMPLETED, new org.apache.thrift.meta_data.FieldMetaData("operationCompleted", org.apache.thrift.TFieldRequirementType.OPTIONAL, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))); + 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))); metaDataMap = Collections.unmodifiableMap(tmpMap); org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TGetOperationStatusResp.class, metaDataMap); } @@ -207,6 +215,7 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper } this.operationStarted = other.operationStarted; this.operationCompleted = other.operationCompleted; + this.hasResultSet = other.hasResultSet; } public TGetOperationStatusResp deepCopy() { @@ -226,6 +235,8 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper this.operationStarted = 0; setOperationCompletedIsSet(false); this.operationCompleted = 0; + setHasResultSetIsSet(false); + this.hasResultSet = false; } public TStatus getStatus() { @@ -417,6 +428,28 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __OPERATIONCOMPLETED_ISSET_ID, value); } + public boolean isHasResultSet() { + return this.hasResultSet; + } + + public void setHasResultSet(boolean hasResultSet) { + this.hasResultSet = hasResultSet; + setHasResultSetIsSet(true); + } + + public void unsetHasResultSet() { + __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __HASRESULTSET_ISSET_ID); + } + + /** Returns true if field hasResultSet is set (has been assigned a value) and false otherwise */ + public boolean isSetHasResultSet() { + return EncodingUtils.testBit(__isset_bitfield, __HASRESULTSET_ISSET_ID); + } + + public void setHasResultSetIsSet(boolean value) { + __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __HASRESULTSET_ISSET_ID, value); + } + public void setFieldValue(_Fields field, Object value) { switch (field) { case STATUS: @@ -483,6 +516,14 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper } break; + case HAS_RESULT_SET: + if (value == null) { + unsetHasResultSet(); + } else { + setHasResultSet((Boolean)value); + } + break; + } } @@ -512,6 +553,9 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper case OPERATION_COMPLETED: return getOperationCompleted(); + case HAS_RESULT_SET: + return isHasResultSet(); + } throw new IllegalStateException(); } @@ -539,6 +583,8 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper return isSetOperationStarted(); case OPERATION_COMPLETED: return isSetOperationCompleted(); + case HAS_RESULT_SET: + return isSetHasResultSet(); } throw new IllegalStateException(); } @@ -628,6 +674,15 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper return false; } + 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; + if (this.hasResultSet != that.hasResultSet) + return false; + } + return true; } @@ -675,6 +730,11 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper if (present_operationCompleted) list.add(operationCompleted); + boolean present_hasResultSet = true && (isSetHasResultSet()); + list.add(present_hasResultSet); + if (present_hasResultSet) + list.add(hasResultSet); + return list.hashCode(); } @@ -766,6 +826,16 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper return lastComparison; } } + lastComparison = Boolean.valueOf(isSetHasResultSet()).compareTo(other.isSetHasResultSet()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetHasResultSet()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.hasResultSet, other.hasResultSet); + if (lastComparison != 0) { + return lastComparison; + } + } return 0; } @@ -851,6 +921,12 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper sb.append(this.operationCompleted); first = false; } + if (isSetHasResultSet()) { + if (!first) sb.append(", "); + sb.append("hasResultSet:"); + sb.append(this.hasResultSet); + first = false; + } sb.append(")"); return sb.toString(); } @@ -968,6 +1044,14 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; + case 9: // HAS_RESULT_SET + if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) { + struct.hasResultSet = iprot.readBool(); + struct.setHasResultSetIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; default: org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } @@ -1029,6 +1113,11 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper oprot.writeI64(struct.operationCompleted); oprot.writeFieldEnd(); } + if (struct.isSetHasResultSet()) { + oprot.writeFieldBegin(HAS_RESULT_SET_FIELD_DESC); + oprot.writeBool(struct.hasResultSet); + oprot.writeFieldEnd(); + } oprot.writeFieldStop(); oprot.writeStructEnd(); } @@ -1069,7 +1158,10 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper if (struct.isSetOperationCompleted()) { optionals.set(6); } - oprot.writeBitSet(optionals, 7); + if (struct.isSetHasResultSet()) { + optionals.set(7); + } + oprot.writeBitSet(optionals, 8); if (struct.isSetOperationState()) { oprot.writeI32(struct.operationState.getValue()); } @@ -1091,6 +1183,9 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper if (struct.isSetOperationCompleted()) { oprot.writeI64(struct.operationCompleted); } + if (struct.isSetHasResultSet()) { + oprot.writeBool(struct.hasResultSet); + } } @Override @@ -1099,7 +1194,7 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper struct.status = new TStatus(); struct.status.read(iprot); struct.setStatusIsSet(true); - BitSet incoming = iprot.readBitSet(7); + BitSet incoming = iprot.readBitSet(8); if (incoming.get(0)) { struct.operationState = org.apache.hive.service.rpc.thrift.TOperationState.findByValue(iprot.readI32()); struct.setOperationStateIsSet(true); @@ -1128,6 +1223,10 @@ public class TGetOperationStatusResp implements org.apache.thrift.TBase<TGetOper struct.operationCompleted = iprot.readI64(); struct.setOperationCompletedIsSet(true); } + if (incoming.get(7)) { + struct.hasResultSet = iprot.readBool(); + struct.setHasResultSetIsSet(true); + } } } http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/src/gen/thrift/gen-php/Types.php ---------------------------------------------------------------------- diff --git a/service-rpc/src/gen/thrift/gen-php/Types.php b/service-rpc/src/gen/thrift/gen-php/Types.php index 9ed7403..a6a257f 100644 --- a/service-rpc/src/gen/thrift/gen-php/Types.php +++ b/service-rpc/src/gen/thrift/gen-php/Types.php @@ -8082,6 +8082,10 @@ class TGetOperationStatusResp { * @var int */ public $operationCompleted = null; + /** + * @var bool + */ + public $hasResultSet = null; public function __construct($vals=null) { if (!isset(self::$_TSPEC)) { @@ -8119,6 +8123,10 @@ class TGetOperationStatusResp { 'var' => 'operationCompleted', 'type' => TType::I64, ), + 9 => array( + 'var' => 'hasResultSet', + 'type' => TType::BOOL, + ), ); } if (is_array($vals)) { @@ -8146,6 +8154,9 @@ class TGetOperationStatusResp { if (isset($vals['operationCompleted'])) { $this->operationCompleted = $vals['operationCompleted']; } + if (isset($vals['hasResultSet'])) { + $this->hasResultSet = $vals['hasResultSet']; + } } } @@ -8225,6 +8236,13 @@ class TGetOperationStatusResp { $xfer += $input->skip($ftype); } break; + case 9: + if ($ftype == TType::BOOL) { + $xfer += $input->readBool($this->hasResultSet); + } else { + $xfer += $input->skip($ftype); + } + break; default: $xfer += $input->skip($ftype); break; @@ -8281,6 +8299,11 @@ class TGetOperationStatusResp { $xfer += $output->writeI64($this->operationCompleted); $xfer += $output->writeFieldEnd(); } + if ($this->hasResultSet !== null) { + $xfer += $output->writeFieldBegin('hasResultSet', TType::BOOL, 9); + $xfer += $output->writeBool($this->hasResultSet); + $xfer += $output->writeFieldEnd(); + } $xfer += $output->writeFieldStop(); $xfer += $output->writeStructEnd(); return $xfer; http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py ---------------------------------------------------------------------- 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 44e5462..fcd330f 100644 --- a/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py +++ b/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py @@ -6097,6 +6097,7 @@ class TGetOperationStatusResp: - taskStatus - operationStarted - operationCompleted + - hasResultSet """ thrift_spec = ( @@ -6109,9 +6110,10 @@ class TGetOperationStatusResp: (6, TType.STRING, 'taskStatus', None, None, ), # 6 (7, TType.I64, 'operationStarted', None, None, ), # 7 (8, TType.I64, 'operationCompleted', None, None, ), # 8 + (9, TType.BOOL, 'hasResultSet', None, None, ), # 9 ) - def __init__(self, status=None, operationState=None, sqlState=None, errorCode=None, errorMessage=None, taskStatus=None, operationStarted=None, operationCompleted=None,): + def __init__(self, status=None, operationState=None, sqlState=None, errorCode=None, errorMessage=None, taskStatus=None, operationStarted=None, operationCompleted=None, hasResultSet=None,): self.status = status self.operationState = operationState self.sqlState = sqlState @@ -6120,6 +6122,7 @@ class TGetOperationStatusResp: self.taskStatus = taskStatus self.operationStarted = operationStarted self.operationCompleted = operationCompleted + self.hasResultSet = hasResultSet def read(self, iprot): if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: @@ -6171,6 +6174,11 @@ class TGetOperationStatusResp: self.operationCompleted = iprot.readI64() else: iprot.skip(ftype) + elif fid == 9: + if ftype == TType.BOOL: + self.hasResultSet = iprot.readBool() + else: + iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6213,6 +6221,10 @@ class TGetOperationStatusResp: oprot.writeFieldBegin('operationCompleted', TType.I64, 8) oprot.writeI64(self.operationCompleted) oprot.writeFieldEnd() + if self.hasResultSet is not None: + oprot.writeFieldBegin('hasResultSet', TType.BOOL, 9) + oprot.writeBool(self.hasResultSet) + oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -6232,6 +6244,7 @@ class TGetOperationStatusResp: value = (value * 31) ^ hash(self.taskStatus) value = (value * 31) ^ hash(self.operationStarted) value = (value * 31) ^ hash(self.operationCompleted) + value = (value * 31) ^ hash(self.hasResultSet) return value def __repr__(self): http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb ---------------------------------------------------------------------- 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 b39ec1e..71148a0 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 @@ -1571,6 +1571,7 @@ class TGetOperationStatusResp TASKSTATUS = 6 OPERATIONSTARTED = 7 OPERATIONCOMPLETED = 8 + HASRESULTSET = 9 FIELDS = { STATUS => {:type => ::Thrift::Types::STRUCT, :name => 'status', :class => ::TStatus}, @@ -1580,7 +1581,8 @@ class TGetOperationStatusResp ERRORMESSAGE => {:type => ::Thrift::Types::STRING, :name => 'errorMessage', :optional => true}, TASKSTATUS => {:type => ::Thrift::Types::STRING, :name => 'taskStatus', :optional => true}, OPERATIONSTARTED => {:type => ::Thrift::Types::I64, :name => 'operationStarted', :optional => true}, - OPERATIONCOMPLETED => {:type => ::Thrift::Types::I64, :name => 'operationCompleted', :optional => true} + OPERATIONCOMPLETED => {:type => ::Thrift::Types::I64, :name => 'operationCompleted', :optional => true}, + HASRESULTSET => {:type => ::Thrift::Types::BOOL, :name => 'hasResultSet', :optional => true} } def struct_fields; FIELDS; end http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service/src/java/org/apache/hive/service/cli/OperationStatus.java ---------------------------------------------------------------------- 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 5e24d38..b0a26e3 100644 --- a/service/src/java/org/apache/hive/service/cli/OperationStatus.java +++ b/service/src/java/org/apache/hive/service/cli/OperationStatus.java @@ -28,13 +28,15 @@ public class OperationStatus { private final String taskStatus; private final long operationStarted; private final long operationCompleted; + private final boolean hasResultSet; private final HiveSQLException operationException; - public OperationStatus(OperationState state, String taskStatus, long operationStarted, long operationCompleted, HiveSQLException operationException) { + public OperationStatus(OperationState state, String taskStatus, long operationStarted, long operationCompleted, boolean hasResultSet, HiveSQLException operationException) { this.state = state; this.taskStatus = taskStatus; this.operationStarted = operationStarted; this.operationCompleted = operationCompleted; + this.hasResultSet = hasResultSet; this.operationException = operationException; } @@ -54,6 +56,10 @@ public class OperationStatus { return operationCompleted; } + public boolean getHasResultSet() { + return hasResultSet; + } + public HiveSQLException getOperationException() { return operationException; } http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service/src/java/org/apache/hive/service/cli/operation/Operation.java ---------------------------------------------------------------------- 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 0932884..d48b92c 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 @@ -144,7 +144,7 @@ public abstract class Operation { } catch (HiveSQLException sqlException) { LOG.error("Error getting task status for " + opHandle.toString(), sqlException); } - return new OperationStatus(state, taskStatus, operationStart, operationComplete, operationException); + return new OperationStatus(state, taskStatus, operationStart, operationComplete, hasResultSet, operationException); } public boolean hasResultSet() { http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java ---------------------------------------------------------------------- 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 5464e58..8bc3d94 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 @@ -629,6 +629,7 @@ public abstract class ThriftCLIService extends AbstractService implements TCLISe resp.setTaskStatus(operationStatus.getTaskStatus()); resp.setOperationStarted(operationStatus.getOperationStarted()); resp.setOperationCompleted(operationStatus.getOperationCompleted()); + resp.setHasResultSet(operationStatus.getHasResultSet()); if (opException != null) { resp.setSqlState(opException.getSQLState()); resp.setErrorCode(opException.getErrorCode()); http://git-wip-us.apache.org/repos/asf/hive/blob/aed35035/service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIServiceClient.java ---------------------------------------------------------------------- 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 82ac42d..3c48dbb 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 @@ -370,7 +370,7 @@ public class ThriftCLIServiceClient extends CLIServiceClient { opException = new HiveSQLException(resp.getErrorMessage(), resp.getSqlState(), resp.getErrorCode()); } return new OperationStatus(opState, resp.getTaskStatus(), resp.getOperationStarted(), - resp.getOperationCompleted(), opException); + resp.getOperationCompleted(), resp.isHasResultSet(), opException); } catch (HiveSQLException e) { throw e; } catch (Exception e) {