commit 5343748a235cf427af5243ab45e861943fcdae67 Author: Bharath Krishna Date: Wed May 9 13:40:28 2018 -0700 HIVE-14388 : Add number of rows inserted message after insert command in Beeline diff --git beeline/src/main/resources/BeeLine.properties beeline/src/main/resources/BeeLine.properties index c41b3ed637e04d8d2d9800ad5e9284264f7e4055..30b4ef954a433773b8bf9367c68725927aac893d 100644 --- beeline/src/main/resources/BeeLine.properties +++ beeline/src/main/resources/BeeLine.properties @@ -138,7 +138,7 @@ abort-drop-all: Aborting drop all tables. drivers-found-count: 0#No driver classes found|1#{0} driver class found|1<{0} driver classes found rows-selected: 0#No rows selected|1#{0} row selected|1<{0} rows selected -rows-affected: 0#No rows affected|1#{0} row affected|1<{0} rows affected|0>Unknown rows affected +rows-affected: -1#Unknown rows affected|0#No rows affected|1#{0} row affected|1<{0} rows affected active-connections: 0#No active connections|1#{0} active connection:|1<{0} active connections: time-ms: ({0,number,#.###} seconds) diff --git itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java index b217259553be472863cd33bb2259aa700e6c3528..d47c136c885127f2f102e55e664bee818ce6d580 100644 --- itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java +++ itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java @@ -977,7 +977,7 @@ private void doTestSelectAll(String tableName, int maxRows, int fetchSize) throw assertNotNull("ResultSet is null", res); assertTrue("getResultSet() not returning expected ResultSet", res == stmt .getResultSet()); - assertEquals("get update count not as expected", -1, stmt.getUpdateCount()); + assertEquals("get update count not as expected", 0, stmt.getUpdateCount()); int i = 0; ResultSetMetaData meta = res.getMetaData(); @@ -2962,23 +2962,25 @@ public void testInsertOverwriteExecAsync3() throws Exception { private void testInsertOverwrite(HiveStatement stmt) throws SQLException { String tblName = "testInsertOverwriteExecAsync"; - int rowCount = 0; - stmt.execute("create table " + tblName + " (col1 int , col2 string)"); - boolean isResulSet = - stmt.executeAsync("insert overwrite table " + tblName + " select * from " + tableName); - assertFalse(isResulSet); - // HiveStatement#getUpdateCount blocks until the async query is complete - stmt.getUpdateCount(); - // Read from the new table - ResultSet rs = stmt.executeQuery("select * from " + tblName); - assertNotNull(rs); - while (rs.next()) { - String value = rs.getString(2); - rowCount++; - assertNotNull(value); + try { + int rowCount = 0; + stmt.execute("create table " + tblName + " (col1 int , col2 string)"); + boolean isResulSet = + stmt.executeAsync("insert overwrite table " + tblName + " select * from " + tableName); + assertFalse(isResulSet); + // HiveStatement#getUpdateCount blocks until the async query is complete + rowCount = stmt.getUpdateCount(); + // Read from the new table + ResultSet rs = stmt.executeQuery("select * from " + tblName); + assertNotNull(rs); + while (rs.next()) { + String value = rs.getString(2); + assertNotNull(value); + } + assertEquals(dataFileRowCount, rowCount); + } finally { + stmt.execute("drop table " + tblName); } - assertEquals(rowCount, dataFileRowCount); - stmt.execute("drop table " + tblName); } // Test that opening a JDBC connection to a non-existent database throws a HiveSQLException diff --git jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java index 06542cee02e5dc4696f2621bb45cc4f24c67dfda..02a462785cccf56a17f42108020da450013b7154 100644 --- jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java +++ jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java @@ -369,7 +369,7 @@ TGetOperationStatusResp waitForOperationToComplete() throws SQLException { TGetOperationStatusResp statusResp = null; // Poll on the operation status, till the operation is complete - while (!isOperationComplete) { + do { try { /** * For an async SQLOperation, GetOperationStatus will use the long polling approach It will @@ -414,7 +414,7 @@ TGetOperationStatusResp waitForOperationToComplete() throws SQLException { isLogBeingGenerated = false; throw new SQLException(e.toString(), "08S01", e); } - } + } while (!isOperationComplete); /* we set progress bar to be completed when hive query execution has completed @@ -703,13 +703,20 @@ public int getResultSetType() throws SQLException { @Override public int getUpdateCount() throws SQLException { checkConnection("getUpdateCount"); - /** - * Poll on the operation status, till the operation is complete. We want to ensure that since a - * client might end up using executeAsync and then call this to check if the query run is - * finished. - */ - waitForOperationToComplete(); - return -1; + + // Poll on the operation status, till the operation is complete. We want to ensure that since a + // client might end up using executeAsync and then call this to check if the query run is + // finished. + long numModifiedRows = -1; + TGetOperationStatusResp resp = waitForOperationToComplete(); + if (resp != null) { + numModifiedRows = resp.getNumModifiedRows(); + } + if (numModifiedRows > Integer.MAX_VALUE) { + LOG.warn("Number of rows is greater than Integer.MAX_VALUE"); + return -1; + } + return (int) numModifiedRows; } /* diff --git ql/src/java/org/apache/hadoop/hive/ql/Driver.java ql/src/java/org/apache/hadoop/hive/ql/Driver.java index 52799b30c39af2f192c4ae22ce7d68b403014183..8fad3e49bccc724f6e4a59c1098de498fc15e14c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/Driver.java +++ ql/src/java/org/apache/hadoop/hive/ql/Driver.java @@ -2326,11 +2326,14 @@ private void execute() throws CommandProcessorResponse { Map stats = SessionState.get().getMapRedStats(); if (stats != null && !stats.isEmpty()) { long totalCpu = 0; + long numModifiedRows = 0; console.printInfo("MapReduce Jobs Launched: "); for (Map.Entry entry : stats.entrySet()) { console.printInfo("Stage-" + entry.getKey() + ": " + entry.getValue()); totalCpu += entry.getValue().getCpuMSec(); + numModifiedRows += entry.getValue().getNumModifiedRows(); } + queryState.setNumModifiedRows(numModifiedRows); console.printInfo("Total MapReduce CPU Time Spent: " + Utilities.formatMsecToStr(totalCpu)); } lDrvState.stateLock.lock(); diff --git ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java index cf9c2273159c0d779ea90ad029613678fb0967a6..483c3d9fcd2f55a644321a62224b13846e421188 100644 --- ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java +++ ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java @@ -38,6 +38,8 @@ String jobId; + private long numModifiedRows; + public MapRedStats(int numMap, int numReduce, long cpuMSec, boolean ifSuccess, String jobId) { this.numMap = numMap; this.numReduce = numReduce; @@ -94,6 +96,14 @@ public void setJobId(String jobId) { this.jobId = jobId; } + public long getNumModifiedRows() { + return numModifiedRows; + } + + public void setNumModifiedRows(long numModifiedRows) { + this.numModifiedRows = numModifiedRows; + } + public String getTaskNumbers() { StringBuilder sb = new StringBuilder(); if (numMap > 0) { diff --git ql/src/java/org/apache/hadoop/hive/ql/QueryState.java ql/src/java/org/apache/hadoop/hive/ql/QueryState.java index 706c9ffa48b9c3b4a6fdaae78bab1d39c3d0efda..b1a602c205b8530058792e5587f1411dc46cfdec 100644 --- ql/src/java/org/apache/hadoop/hive/ql/QueryState.java +++ ql/src/java/org/apache/hadoop/hive/ql/QueryState.java @@ -49,6 +49,11 @@ */ private HiveTxnManager txnManager; + /** + * Holds the number of rows affected for insert queries. + */ + private long numModifiedRows = 0; + /** * Private constructor, use QueryState.Builder instead. * @param conf The query specific configuration object @@ -100,6 +105,13 @@ public void setTxnManager(HiveTxnManager txnManager) { this.txnManager = txnManager; } + public long getNumModifiedRows() { + return numModifiedRows; + } + + public void setNumModifiedRows(long numModifiedRows) { + this.numModifiedRows = numModifiedRows; + } /** * Builder to instantiate the QueryState object. */ diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java index 01a5b4c9c328cb034a613a1539cea2584e122fb4..b38b9a1d33b25eb14415cb14d7b05d4328d0ac5d 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.io.Serializable; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -82,27 +81,13 @@ import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Writable; import org.apache.hadoop.mapred.JobConf; -import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hive.common.util.HiveStringUtils; import org.apache.hive.common.util.Murmur3; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; import java.util.function.BiFunction; - -import static org.apache.hadoop.hive.conf.HiveConf.ConfVars.HIVE_TEMPORARY_TABLE_STORAGE; - /** * File Sink operator implementation. **/ @@ -146,6 +131,8 @@ private transient boolean isInsertOverwrite; private transient String counterGroup; private transient BiFunction hashFunc; + public static final transient String TOTAL_TABLE_ROWS_WRITTEN = "TOTAL_TABLE_ROWS_WRITTEN"; + /** * Counters. */ @@ -582,6 +569,12 @@ protected void initializeOp(Configuration hconf) throws HiveException { hashFunc = conf.getTableInfo().getBucketingVersion() == 2 ? ObjectInspectorUtils::getBucketHashCode : ObjectInspectorUtils::getBucketHashCodeOld; + + //Counter for number of rows that are associated with a destination table in FileSinkOperator. + //This count is used to get total number of rows in an insert query. + if (conf.getTableInfo() != null && conf.getTableInfo().getTableName() != null) { + statsMap.put(TOTAL_TABLE_ROWS_WRITTEN, row_count); + } } catch (HiveException e) { throw e; } catch (Exception e) { diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java index fcdc9967f12a454a9d3f31031e2261f264479118..7ad4bf2dedf61069914b633ed64e08255adaf6b2 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java @@ -34,6 +34,7 @@ import org.apache.hadoop.hive.conf.HiveConf.ConfVars; import org.apache.hadoop.hive.ql.Context; import org.apache.hadoop.hive.ql.MapRedStats; +import org.apache.hadoop.hive.ql.exec.FileSinkOperator; import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.exec.Task; import org.apache.hadoop.hive.ql.exec.TaskHandle; @@ -426,6 +427,16 @@ private MapRedStats progress(ExecDriverTaskHandle th) throws IOException, LockEx SessionState ss = SessionState.get(); if (ss != null) { + //Set the number of table rows affected in mapRedStats to display number of rows inserted. + if (ctrs != null) { + Counter counter = ctrs.findCounter( + SessionState.get().getConf().getVar(HiveConf.ConfVars.HIVECOUNTERGROUP), + FileSinkOperator.TOTAL_TABLE_ROWS_WRITTEN); + if (counter != null) { + mapRedStats.setNumModifiedRows(counter.getValue()); + } + } + this.callBackObj.logPlanProgress(ss); } // LOG.info(queryPlan); diff --git ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out index 18f4c69a191bde3cae2d5efac5ef20fd0b1a9f0c..b694b20c399a8422f94b92e2430b640b355f3a45 100644 --- ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out +++ ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out @@ -35,6 +35,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 84 RECORDS_OUT_OPERATOR_SEL_5: 57 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 84 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -65,6 +66,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 189 RECORDS_OUT_OPERATOR_SEL_5: 121 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -103,6 +105,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 189 RECORDS_OUT_OPERATOR_SEL_5: 121 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -133,6 +136,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 292 RECORDS_OUT_OPERATOR_SEL_5: 184 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 292 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -185,6 +189,7 @@ Stage-2 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_5: 121 RECORDS_OUT_OPERATOR_SEL_6: 105 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-2 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -223,6 +228,7 @@ Stage-2 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_5: 184 RECORDS_OUT_OPERATOR_SEL_6: 208 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 292 Stage-2 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -270,6 +276,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_7: 189 RECORDS_OUT_OPERATOR_TS_0: 500 RECORDS_OUT_OPERATOR_TS_3: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 GROUPED_INPUT_SPLITS_Map_4: 1 @@ -313,6 +320,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_7: 292 RECORDS_OUT_OPERATOR_TS_0: 500 RECORDS_OUT_OPERATOR_TS_3: 500 + TOTAL_TABLE_ROWS_WRITTEN: 292 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 GROUPED_INPUT_SPLITS_Map_4: 1 diff --git ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out index 28f376f8c4c2151383286e754447d1349050ef4e..eb81dead2cb933c0b315347c14c456f83d6d214f 100644 --- ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out +++ ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out @@ -35,6 +35,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 84 RECORDS_OUT_OPERATOR_SEL_5: 57 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 84 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -65,6 +66,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 189 RECORDS_OUT_OPERATOR_SEL_5: 121 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -103,6 +105,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 189 RECORDS_OUT_OPERATOR_SEL_5: 121 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -133,6 +136,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_2: 292 RECORDS_OUT_OPERATOR_SEL_5: 184 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 292 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -185,6 +189,7 @@ Stage-2 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_5: 121 RECORDS_OUT_OPERATOR_SEL_6: 105 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-2 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -223,6 +228,7 @@ Stage-2 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_5: 184 RECORDS_OUT_OPERATOR_SEL_6: 208 RECORDS_OUT_OPERATOR_TS_0: 500 + TOTAL_TABLE_ROWS_WRITTEN: 292 Stage-2 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 INPUT_DIRECTORIES_Map_1: 1 @@ -270,6 +276,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_7: 189 RECORDS_OUT_OPERATOR_TS_0: 500 RECORDS_OUT_OPERATOR_TS_3: 500 + TOTAL_TABLE_ROWS_WRITTEN: 189 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 GROUPED_INPUT_SPLITS_Map_4: 1 @@ -313,6 +320,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_7: 292 RECORDS_OUT_OPERATOR_TS_0: 500 RECORDS_OUT_OPERATOR_TS_3: 500 + TOTAL_TABLE_ROWS_WRITTEN: 292 Stage-1 INPUT COUNTERS: GROUPED_INPUT_SPLITS_Map_1: 1 GROUPED_INPUT_SPLITS_Map_4: 1 diff --git ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out index 96819f4e1c446f6de423f99c7697d548ff5dbe06..ef3dbab2e190f281a1d344542983f05c9c1720d4 100644 --- ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out +++ ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out @@ -1878,6 +1878,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_MAP_0: 0 RECORDS_OUT_OPERATOR_SEL_2: 2 RECORDS_OUT_OPERATOR_TS_0: 98 + TOTAL_TABLE_ROWS_WRITTEN: 2 Stage-1 LLAP IO COUNTERS: ALLOCATED_BYTES: 2359296 ALLOCATED_USED_BYTES: 44166 diff --git ql/src/test/results/clientpositive/llap/tez_input_counters.q.out ql/src/test/results/clientpositive/llap/tez_input_counters.q.out index d2fcdaa1bfba03e1f0e4191c8d056b05f334443d..63fdd74795cd588dec45ab7163696062a60df292 100644 --- ql/src/test/results/clientpositive/llap/tez_input_counters.q.out +++ ql/src/test/results/clientpositive/llap/tez_input_counters.q.out @@ -1829,6 +1829,7 @@ Stage-1 HIVE COUNTERS: RECORDS_OUT_OPERATOR_SEL_5: 240 RECORDS_OUT_OPERATOR_SEL_6: 240 RECORDS_OUT_OPERATOR_TS_0: 240 + TOTAL_TABLE_ROWS_WRITTEN: 240 Stage-1 LLAP IO COUNTERS: CACHE_HIT_BYTES: 922 NUM_DECODED_BATCHES: 148 diff --git service-rpc/if/TCLIService.thrift service-rpc/if/TCLIService.thrift index 30f8af7f3e6e0598b410498782900ac27971aef0..1cf8a918a37e2eeca998243de64881083853254f 100644 --- service-rpc/if/TCLIService.thrift +++ service-rpc/if/TCLIService.thrift @@ -1070,6 +1070,7 @@ struct TGetOperationStatusResp { 10: optional TProgressUpdateResp progressUpdateResponse + 11: optional i64 numModifiedRows } diff --git service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp index b2b62c71492b844f4439367364c5c81aa62f3908..d312896c720ba70246378997e62bee42f72b2542 100644 --- service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp +++ service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp @@ -8571,6 +8571,11 @@ void TGetOperationStatusResp::__set_progressUpdateResponse(const TProgressUpdate __isset.progressUpdateResponse = true; } +void TGetOperationStatusResp::__set_numModifiedRows(const int64_t val) { + this->numModifiedRows = val; +__isset.numModifiedRows = true; +} + uint32_t TGetOperationStatusResp::read(::apache::thrift::protocol::TProtocol* iprot) { apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); @@ -8675,6 +8680,14 @@ uint32_t TGetOperationStatusResp::read(::apache::thrift::protocol::TProtocol* ip xfer += iprot->skip(ftype); } break; + case 11: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->numModifiedRows); + this->__isset.numModifiedRows = true; + } else { + xfer += iprot->skip(ftype); + } + break; default: xfer += iprot->skip(ftype); break; @@ -8743,6 +8756,11 @@ uint32_t TGetOperationStatusResp::write(::apache::thrift::protocol::TProtocol* o xfer += this->progressUpdateResponse.write(oprot); xfer += oprot->writeFieldEnd(); } + if (this->__isset.numModifiedRows) { + xfer += oprot->writeFieldBegin("numModifiedRows", ::apache::thrift::protocol::T_I64, 11); + xfer += oprot->writeI64(this->numModifiedRows); + xfer += oprot->writeFieldEnd(); + } xfer += oprot->writeFieldStop(); xfer += oprot->writeStructEnd(); return xfer; @@ -8760,6 +8778,7 @@ void swap(TGetOperationStatusResp &a, TGetOperationStatusResp &b) { swap(a.operationCompleted, b.operationCompleted); swap(a.hasResultSet, b.hasResultSet); swap(a.progressUpdateResponse, b.progressUpdateResponse); + swap(a.numModifiedRows, b.numModifiedRows); swap(a.__isset, b.__isset); } @@ -8774,6 +8793,7 @@ TGetOperationStatusResp::TGetOperationStatusResp(const TGetOperationStatusResp& operationCompleted = other283.operationCompleted; hasResultSet = other283.hasResultSet; progressUpdateResponse = other283.progressUpdateResponse; + numModifiedRows = other283.numModifiedRows; __isset = other283.__isset; } TGetOperationStatusResp& TGetOperationStatusResp::operator=(const TGetOperationStatusResp& other284) { @@ -8787,6 +8807,7 @@ TGetOperationStatusResp& TGetOperationStatusResp::operator=(const TGetOperationS operationCompleted = other284.operationCompleted; hasResultSet = other284.hasResultSet; progressUpdateResponse = other284.progressUpdateResponse; + numModifiedRows = other284.numModifiedRows; __isset = other284.__isset; return *this; } @@ -8803,6 +8824,7 @@ void TGetOperationStatusResp::printTo(std::ostream& out) const { out << ", " << "operationCompleted="; (__isset.operationCompleted ? (out << to_string(operationCompleted)) : (out << "")); out << ", " << "hasResultSet="; (__isset.hasResultSet ? (out << to_string(hasResultSet)) : (out << "")); out << ", " << "progressUpdateResponse="; (__isset.progressUpdateResponse ? (out << to_string(progressUpdateResponse)) : (out << "")); + out << ", " << "numModifiedRows="; (__isset.numModifiedRows ? (out << to_string(numModifiedRows)) : (out << "")); out << ")"; } diff --git service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h index 4321ad6d3c966d30f7a69552f91804cf2f1ba6c4..b30c28ffabe8e0adffaa9be10d58d79310dc4a6e 100644 --- service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h +++ service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h @@ -3840,7 +3840,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), hasResultSet(false), progressUpdateResponse(false) {} + _TGetOperationStatusResp__isset() : operationState(false), sqlState(false), errorCode(false), errorMessage(false), taskStatus(false), operationStarted(false), operationCompleted(false), hasResultSet(false), progressUpdateResponse(false), numModifiedRows(false) {} bool operationState :1; bool sqlState :1; bool errorCode :1; @@ -3850,6 +3850,7 @@ typedef struct _TGetOperationStatusResp__isset { bool operationCompleted :1; bool hasResultSet :1; bool progressUpdateResponse :1; + bool numModifiedRows :1; } _TGetOperationStatusResp__isset; class TGetOperationStatusResp { @@ -3857,7 +3858,7 @@ class TGetOperationStatusResp { TGetOperationStatusResp(const TGetOperationStatusResp&); TGetOperationStatusResp& operator=(const TGetOperationStatusResp&); - TGetOperationStatusResp() : operationState((TOperationState::type)0), sqlState(), errorCode(0), errorMessage(), taskStatus(), operationStarted(0), operationCompleted(0), hasResultSet(0) { + TGetOperationStatusResp() : operationState((TOperationState::type)0), sqlState(), errorCode(0), errorMessage(), taskStatus(), operationStarted(0), operationCompleted(0), hasResultSet(0), numModifiedRows(0) { } virtual ~TGetOperationStatusResp() throw(); @@ -3871,6 +3872,7 @@ class TGetOperationStatusResp { int64_t operationCompleted; bool hasResultSet; TProgressUpdateResp progressUpdateResponse; + int64_t numModifiedRows; _TGetOperationStatusResp__isset __isset; @@ -3894,6 +3896,8 @@ class TGetOperationStatusResp { void __set_progressUpdateResponse(const TProgressUpdateResp& val); + void __set_numModifiedRows(const int64_t val); + bool operator == (const TGetOperationStatusResp & rhs) const { if (!(status == rhs.status)) @@ -3934,6 +3938,10 @@ class TGetOperationStatusResp { return false; else if (__isset.progressUpdateResponse && !(progressUpdateResponse == rhs.progressUpdateResponse)) return false; + if (__isset.numModifiedRows != rhs.__isset.numModifiedRows) + return false; + else if (__isset.numModifiedRows && !(numModifiedRows == rhs.numModifiedRows)) + return false; return true; } bool operator != (const TGetOperationStatusResp &rhs) const { diff --git service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java index 15e8220eb3eb12b72c7b64029410dced33bc0d72..a7c1f86462753a94a8f07f18f571e5322e32b3fa 100644 --- service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java +++ service-rpc/src/gen/thrift/gen-javabean/org/apache/hive/service/rpc/thrift/TGetOperationStatusResp.java @@ -48,6 +48,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 org.apache.thrift.protocol.TField PROGRESS_UPDATE_RESPONSE_FIELD_DESC = new org.apache.thrift.protocol.TField("progressUpdateResponse", org.apache.thrift.protocol.TType.STRUCT, (short)10); + private static final org.apache.thrift.protocol.TField NUM_MODIFIED_ROWS_FIELD_DESC = new org.apache.thrift.protocol.TField("numModifiedRows", org.apache.thrift.protocol.TType.I64, (short)11); private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); static { @@ -65,6 +66,7 @@ private long operationCompleted; // optional private boolean hasResultSet; // optional private TProgressUpdateResp progressUpdateResponse; // optional + private long numModifiedRows; // 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 { @@ -81,7 +83,8 @@ OPERATION_STARTED((short)7, "operationStarted"), OPERATION_COMPLETED((short)8, "operationCompleted"), HAS_RESULT_SET((short)9, "hasResultSet"), - PROGRESS_UPDATE_RESPONSE((short)10, "progressUpdateResponse"); + PROGRESS_UPDATE_RESPONSE((short)10, "progressUpdateResponse"), + NUM_MODIFIED_ROWS((short)11, "numModifiedRows"); private static final Map byName = new HashMap(); @@ -116,6 +119,8 @@ public static _Fields findByThriftId(int fieldId) { return HAS_RESULT_SET; case 10: // PROGRESS_UPDATE_RESPONSE return PROGRESS_UPDATE_RESPONSE; + case 11: // NUM_MODIFIED_ROWS + return NUM_MODIFIED_ROWS; default: return null; } @@ -160,8 +165,9 @@ public String getFieldName() { 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 static final int __NUMMODIFIEDROWS_ISSET_ID = 4; 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,_Fields.HAS_RESULT_SET,_Fields.PROGRESS_UPDATE_RESPONSE}; + 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,_Fields.PROGRESS_UPDATE_RESPONSE,_Fields.NUM_MODIFIED_ROWS}; 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); @@ -185,6 +191,8 @@ public String getFieldName() { new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL))); tmpMap.put(_Fields.PROGRESS_UPDATE_RESPONSE, new org.apache.thrift.meta_data.FieldMetaData("progressUpdateResponse", org.apache.thrift.TFieldRequirementType.OPTIONAL, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT , "TProgressUpdateResp"))); + tmpMap.put(_Fields.NUM_MODIFIED_ROWS, new org.apache.thrift.meta_data.FieldMetaData("numModifiedRows", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))); metaDataMap = Collections.unmodifiableMap(tmpMap); org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TGetOperationStatusResp.class, metaDataMap); } @@ -226,6 +234,7 @@ public TGetOperationStatusResp(TGetOperationStatusResp other) { if (other.isSetProgressUpdateResponse()) { this.progressUpdateResponse = other.progressUpdateResponse; } + this.numModifiedRows = other.numModifiedRows; } public TGetOperationStatusResp deepCopy() { @@ -248,6 +257,8 @@ public void clear() { setHasResultSetIsSet(false); this.hasResultSet = false; this.progressUpdateResponse = null; + setNumModifiedRowsIsSet(false); + this.numModifiedRows = 0; } public TStatus getStatus() { @@ -484,6 +495,28 @@ public void setProgressUpdateResponseIsSet(boolean value) { } } + public long getNumModifiedRows() { + return this.numModifiedRows; + } + + public void setNumModifiedRows(long numModifiedRows) { + this.numModifiedRows = numModifiedRows; + setNumModifiedRowsIsSet(true); + } + + public void unsetNumModifiedRows() { + __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __NUMMODIFIEDROWS_ISSET_ID); + } + + /** Returns true if field numModifiedRows is set (has been assigned a value) and false otherwise */ + public boolean isSetNumModifiedRows() { + return EncodingUtils.testBit(__isset_bitfield, __NUMMODIFIEDROWS_ISSET_ID); + } + + public void setNumModifiedRowsIsSet(boolean value) { + __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __NUMMODIFIEDROWS_ISSET_ID, value); + } + public void setFieldValue(_Fields field, Object value) { switch (field) { case STATUS: @@ -566,6 +599,14 @@ public void setFieldValue(_Fields field, Object value) { } break; + case NUM_MODIFIED_ROWS: + if (value == null) { + unsetNumModifiedRows(); + } else { + setNumModifiedRows((Long)value); + } + break; + } } @@ -601,6 +642,9 @@ public Object getFieldValue(_Fields field) { case PROGRESS_UPDATE_RESPONSE: return getProgressUpdateResponse(); + case NUM_MODIFIED_ROWS: + return getNumModifiedRows(); + } throw new IllegalStateException(); } @@ -632,6 +676,8 @@ public boolean isSet(_Fields field) { return isSetHasResultSet(); case PROGRESS_UPDATE_RESPONSE: return isSetProgressUpdateResponse(); + case NUM_MODIFIED_ROWS: + return isSetNumModifiedRows(); } throw new IllegalStateException(); } @@ -739,6 +785,15 @@ public boolean equals(TGetOperationStatusResp that) { return false; } + boolean this_present_numModifiedRows = true && this.isSetNumModifiedRows(); + boolean that_present_numModifiedRows = true && that.isSetNumModifiedRows(); + if (this_present_numModifiedRows || that_present_numModifiedRows) { + if (!(this_present_numModifiedRows && that_present_numModifiedRows)) + return false; + if (this.numModifiedRows != that.numModifiedRows) + return false; + } + return true; } @@ -796,6 +851,11 @@ public int hashCode() { if (present_progressUpdateResponse) list.add(progressUpdateResponse); + boolean present_numModifiedRows = true && (isSetNumModifiedRows()); + list.add(present_numModifiedRows); + if (present_numModifiedRows) + list.add(numModifiedRows); + return list.hashCode(); } @@ -907,6 +967,16 @@ public int compareTo(TGetOperationStatusResp other) { return lastComparison; } } + lastComparison = Boolean.valueOf(isSetNumModifiedRows()).compareTo(other.isSetNumModifiedRows()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetNumModifiedRows()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.numModifiedRows, other.numModifiedRows); + if (lastComparison != 0) { + return lastComparison; + } + } return 0; } @@ -1008,6 +1078,12 @@ public String toString() { } first = false; } + if (isSetNumModifiedRows()) { + if (!first) sb.append(", "); + sb.append("numModifiedRows:"); + sb.append(this.numModifiedRows); + first = false; + } sb.append(")"); return sb.toString(); } @@ -1142,6 +1218,14 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, TGetOperationStatus org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } break; + case 11: // NUM_MODIFIED_ROWS + if (schemeField.type == org.apache.thrift.protocol.TType.I64) { + struct.numModifiedRows = iprot.readI64(); + struct.setNumModifiedRowsIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); + } + break; default: org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type); } @@ -1215,6 +1299,11 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, TGetOperationStatu oprot.writeFieldEnd(); } } + if (struct.isSetNumModifiedRows()) { + oprot.writeFieldBegin(NUM_MODIFIED_ROWS_FIELD_DESC); + oprot.writeI64(struct.numModifiedRows); + oprot.writeFieldEnd(); + } oprot.writeFieldStop(); oprot.writeStructEnd(); } @@ -1261,7 +1350,10 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TGetOperationStatus if (struct.isSetProgressUpdateResponse()) { optionals.set(8); } - oprot.writeBitSet(optionals, 9); + if (struct.isSetNumModifiedRows()) { + optionals.set(9); + } + oprot.writeBitSet(optionals, 10); if (struct.isSetOperationState()) { oprot.writeI32(struct.operationState.getValue()); } @@ -1289,6 +1381,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, TGetOperationStatus if (struct.isSetProgressUpdateResponse()) { struct.progressUpdateResponse.write(oprot); } + if (struct.isSetNumModifiedRows()) { + oprot.writeI64(struct.numModifiedRows); + } } @Override @@ -1297,7 +1392,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TGetOperationStatusR struct.status = new TStatus(); struct.status.read(iprot); struct.setStatusIsSet(true); - BitSet incoming = iprot.readBitSet(9); + BitSet incoming = iprot.readBitSet(10); if (incoming.get(0)) { struct.operationState = org.apache.hive.service.rpc.thrift.TOperationState.findByValue(iprot.readI32()); struct.setOperationStateIsSet(true); @@ -1335,6 +1430,10 @@ public void read(org.apache.thrift.protocol.TProtocol prot, TGetOperationStatusR struct.progressUpdateResponse.read(iprot); struct.setProgressUpdateResponseIsSet(true); } + if (incoming.get(9)) { + struct.numModifiedRows = iprot.readI64(); + struct.setNumModifiedRowsIsSet(true); + } } } diff --git service-rpc/src/gen/thrift/gen-php/Types.php service-rpc/src/gen/thrift/gen-php/Types.php index abb7c1ff3a2c8b72dc97689758266b675880e32b..39572d4f090f96ceea4bab183189fd13a0b9d8d3 100644 --- service-rpc/src/gen/thrift/gen-php/Types.php +++ service-rpc/src/gen/thrift/gen-php/Types.php @@ -8351,6 +8351,10 @@ class TGetOperationStatusResp { * @var \TProgressUpdateResp */ public $progressUpdateResponse = null; + /** + * @var int + */ + public $numModifiedRows = null; public function __construct($vals=null) { if (!isset(self::$_TSPEC)) { @@ -8397,6 +8401,10 @@ class TGetOperationStatusResp { 'type' => TType::STRUCT, 'class' => '\TProgressUpdateResp', ), + 11 => array( + 'var' => 'numModifiedRows', + 'type' => TType::I64, + ), ); } if (is_array($vals)) { @@ -8430,6 +8438,9 @@ class TGetOperationStatusResp { if (isset($vals['progressUpdateResponse'])) { $this->progressUpdateResponse = $vals['progressUpdateResponse']; } + if (isset($vals['numModifiedRows'])) { + $this->numModifiedRows = $vals['numModifiedRows']; + } } } @@ -8524,6 +8535,13 @@ class TGetOperationStatusResp { $xfer += $input->skip($ftype); } break; + case 11: + if ($ftype == TType::I64) { + $xfer += $input->readI64($this->numModifiedRows); + } else { + $xfer += $input->skip($ftype); + } + break; default: $xfer += $input->skip($ftype); break; @@ -8593,6 +8611,11 @@ class TGetOperationStatusResp { $xfer += $this->progressUpdateResponse->write($output); $xfer += $output->writeFieldEnd(); } + if ($this->numModifiedRows !== null) { + $xfer += $output->writeFieldBegin('numModifiedRows', TType::I64, 11); + $xfer += $output->writeI64($this->numModifiedRows); + $xfer += $output->writeFieldEnd(); + } $xfer += $output->writeFieldStop(); $xfer += $output->writeStructEnd(); return $xfer; diff --git service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py index 0f8fd0745be0f4ed9e96b7bbe0f092d03649bcdf..989ba4456f94fc27435849fc5152c06ccad7cc36 100644 --- service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py +++ service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py @@ -6303,6 +6303,7 @@ class TGetOperationStatusResp: - operationCompleted - hasResultSet - progressUpdateResponse + - numModifiedRows """ thrift_spec = ( @@ -6317,9 +6318,10 @@ class TGetOperationStatusResp: (8, TType.I64, 'operationCompleted', None, None, ), # 8 (9, TType.BOOL, 'hasResultSet', None, None, ), # 9 (10, TType.STRUCT, 'progressUpdateResponse', (TProgressUpdateResp, TProgressUpdateResp.thrift_spec), None, ), # 10 + (11, TType.I64, 'numModifiedRows', None, None, ), # 11 ) - def __init__(self, status=None, operationState=None, sqlState=None, errorCode=None, errorMessage=None, taskStatus=None, operationStarted=None, operationCompleted=None, hasResultSet=None, progressUpdateResponse=None,): + def __init__(self, status=None, operationState=None, sqlState=None, errorCode=None, errorMessage=None, taskStatus=None, operationStarted=None, operationCompleted=None, hasResultSet=None, progressUpdateResponse=None, numModifiedRows=None,): self.status = status self.operationState = operationState self.sqlState = sqlState @@ -6330,6 +6332,7 @@ def __init__(self, status=None, operationState=None, sqlState=None, errorCode=No self.operationCompleted = operationCompleted self.hasResultSet = hasResultSet self.progressUpdateResponse = progressUpdateResponse + self.numModifiedRows = numModifiedRows 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: @@ -6392,6 +6395,11 @@ def read(self, iprot): self.progressUpdateResponse.read(iprot) else: iprot.skip(ftype) + elif fid == 11: + if ftype == TType.I64: + self.numModifiedRows = iprot.readI64() + else: + iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6442,6 +6450,10 @@ def write(self, oprot): oprot.writeFieldBegin('progressUpdateResponse', TType.STRUCT, 10) self.progressUpdateResponse.write(oprot) oprot.writeFieldEnd() + if self.numModifiedRows is not None: + oprot.writeFieldBegin('numModifiedRows', TType.I64, 11) + oprot.writeI64(self.numModifiedRows) + oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -6463,6 +6475,7 @@ def __hash__(self): value = (value * 31) ^ hash(self.operationCompleted) value = (value * 31) ^ hash(self.hasResultSet) value = (value * 31) ^ hash(self.progressUpdateResponse) + value = (value * 31) ^ hash(self.numModifiedRows) return value def __repr__(self): diff --git service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb index 60183dae9e9927bd09a9676e49eeb4aea2401737..6ab4063bbdb91a27f34303df9e9050fdbf84480f 100644 --- service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb +++ service-rpc/src/gen/thrift/gen-rb/t_c_l_i_service_types.rb @@ -1624,6 +1624,7 @@ class TGetOperationStatusResp OPERATIONCOMPLETED = 8 HASRESULTSET = 9 PROGRESSUPDATERESPONSE = 10 + NUMMODIFIEDROWS = 11 FIELDS = { STATUS => {:type => ::Thrift::Types::STRUCT, :name => 'status', :class => ::TStatus}, @@ -1635,7 +1636,8 @@ class TGetOperationStatusResp OPERATIONSTARTED => {:type => ::Thrift::Types::I64, :name => 'operationStarted', :optional => true}, OPERATIONCOMPLETED => {:type => ::Thrift::Types::I64, :name => 'operationCompleted', :optional => true}, HASRESULTSET => {:type => ::Thrift::Types::BOOL, :name => 'hasResultSet', :optional => true}, - PROGRESSUPDATERESPONSE => {:type => ::Thrift::Types::STRUCT, :name => 'progressUpdateResponse', :class => ::TProgressUpdateResp, :optional => true} + PROGRESSUPDATERESPONSE => {:type => ::Thrift::Types::STRUCT, :name => 'progressUpdateResponse', :class => ::TProgressUpdateResp, :optional => true}, + NUMMODIFIEDROWS => {:type => ::Thrift::Types::I64, :name => 'numModifiedRows', :optional => true} } def struct_fields; FIELDS; end diff --git service/src/java/org/apache/hive/service/cli/CLIService.java service/src/java/org/apache/hive/service/cli/CLIService.java index c9914ba9bf8653cbcbca7d6612e98a64058c0fcc..821f0d569cacb333b71fab0945a1c1bed349a559 100644 --- service/src/java/org/apache/hive/service/cli/CLIService.java +++ service/src/java/org/apache/hive/service/cli/CLIService.java @@ -473,6 +473,8 @@ public OperationStatus getOperationStatus(OperationHandle opHandle, boolean getP } OperationStatus opStatus = operation.getStatus(); LOG.debug(opHandle + ": getOperationStatus()"); + long numModifiedRows = operation.getNumModifiedRows(); + opStatus.setNumModifiedRows(numModifiedRows); opStatus.setJobProgressUpdate(progressUpdateLog(getProgressUpdate, operation, conf)); return opStatus; } diff --git service/src/java/org/apache/hive/service/cli/OperationStatus.java service/src/java/org/apache/hive/service/cli/OperationStatus.java index 52cc3ae4f26b990b3e4edb52d9de85b3cc25f269..581bf925c568e86f52396cea01cf7357c03ec274 100644 --- service/src/java/org/apache/hive/service/cli/OperationStatus.java +++ service/src/java/org/apache/hive/service/cli/OperationStatus.java @@ -31,6 +31,7 @@ private final boolean hasResultSet; private final HiveSQLException operationException; private JobProgressUpdate jobProgressUpdate; + private long numModifiedRows; public OperationStatus(OperationState state, String taskStatus, long operationStarted, long operationCompleted, boolean hasResultSet, HiveSQLException operationException) { this.state = state; @@ -72,4 +73,12 @@ void setJobProgressUpdate(JobProgressUpdate jobProgressUpdate){ public JobProgressUpdate jobProgressUpdate(){ return jobProgressUpdate; } + + public long getNumModifiedRows() { + return numModifiedRows; + } + + void setNumModifiedRows(long numRows) { + this.numModifiedRows = numRows; + } } diff --git service/src/java/org/apache/hive/service/cli/operation/Operation.java service/src/java/org/apache/hive/service/cli/operation/Operation.java index 3706c72abc77ac8bd77947cc1c5d084ddf965e9f..07ab4872605a7a230d8aa66393d05b9c8b73d354 100644 --- service/src/java/org/apache/hive/service/cli/operation/Operation.java +++ service/src/java/org/apache/hive/service/cli/operation/Operation.java @@ -184,6 +184,10 @@ public void setOperationTimeout(long operationTimeout) { this.operationTimeout = operationTimeout; } + public long getNumModifiedRows() { + return queryState.getNumModifiedRows(); + } + protected void setOperationException(HiveSQLException operationException) { this.operationException = operationException; } diff --git service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java index c64c99120ad21ee98af81ec6659a2722e3e1d1c7..512d604065139fae6200a39aaf73115846bca01b 100644 --- service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java +++ service/src/java/org/apache/hive/service/cli/thrift/ThriftCLIService.java @@ -20,6 +20,22 @@ import static com.google.common.base.Preconditions.checkArgument; +import org.apache.hive.service.cli.CLIService; +import org.apache.hive.service.cli.FetchOrientation; +import org.apache.hive.service.cli.FetchType; +import org.apache.hive.service.cli.GetInfoType; +import org.apache.hive.service.cli.GetInfoValue; +import org.apache.hive.service.cli.HiveSQLException; +import org.apache.hive.service.cli.JobProgressUpdate; +import org.apache.hive.service.cli.OperationHandle; +import org.apache.hive.service.cli.OperationState; +import org.apache.hive.service.cli.OperationStatus; +import org.apache.hive.service.cli.OperationType; +import org.apache.hive.service.cli.ProgressMonitorStatusMapper; +import org.apache.hive.service.cli.RowSet; +import org.apache.hive.service.cli.SessionHandle; +import org.apache.hive.service.cli.TableSchema; +import org.apache.hive.service.cli.TezProgressMonitorStatusMapper; import org.apache.hive.service.rpc.thrift.TSetClientInfoReq; import org.apache.hive.service.rpc.thrift.TSetClientInfoResp; @@ -43,21 +59,6 @@ import org.apache.hive.service.auth.HiveAuthConstants; import org.apache.hive.service.auth.HiveAuthFactory; import org.apache.hive.service.auth.TSetIpAddressProcessor; -import org.apache.hive.service.cli.CLIService; -import org.apache.hive.service.cli.FetchOrientation; -import org.apache.hive.service.cli.FetchType; -import org.apache.hive.service.cli.GetInfoType; -import org.apache.hive.service.cli.GetInfoValue; -import org.apache.hive.service.cli.HiveSQLException; -import org.apache.hive.service.cli.JobProgressUpdate; -import org.apache.hive.service.cli.OperationHandle; -import org.apache.hive.service.cli.OperationStatus; -import org.apache.hive.service.cli.OperationType; -import org.apache.hive.service.cli.ProgressMonitorStatusMapper; -import org.apache.hive.service.cli.RowSet; -import org.apache.hive.service.cli.SessionHandle; -import org.apache.hive.service.cli.TableSchema; -import org.apache.hive.service.cli.TezProgressMonitorStatusMapper; import org.apache.hive.service.cli.operation.Operation; import org.apache.hive.service.cli.session.SessionManager; import org.apache.hive.service.rpc.thrift.TCLIService; @@ -691,6 +692,11 @@ public TGetOperationStatusResp GetOperationStatus(TGetOperationStatusReq req) th try { OperationStatus operationStatus = cliService.getOperationStatus(operationHandle, req.isGetProgressUpdate()); + + if (operationStatus.getState().equals(OperationState.FINISHED)) { + long numModifiedRows = operationStatus.getNumModifiedRows(); + resp.setNumModifiedRows(numModifiedRows); + } resp.setOperationState(operationStatus.getState().toTOperationState()); resp.setErrorMessage(operationStatus.getState().getErrorMessage()); HiveSQLException opException = operationStatus.getOperationException();