Repository: hive
Updated Branches:
  refs/heads/master 1c970d924 -> da13a1379


HIVE-14388: Add number of rows inserted message after insert command in Beeline 
(Bharathkrishna Guruvayoor Murali, reviewed by Sahil Takiar, Peter Vary)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/da13a137
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/da13a137
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/da13a137

Branch: refs/heads/master
Commit: da13a13797c7d9926f9a2332ee7b33c7b5f08a1e
Parents: 1c970d9
Author: Bharathkrishna Guruvayoor Murali <bhar...@cloudera.com>
Authored: Fri Jun 1 05:46:54 2018 -0500
Committer: Sahil Takiar <stak...@cloudera.com>
Committed: Fri Jun 1 05:46:54 2018 -0500

----------------------------------------------------------------------
 beeline/src/main/resources/BeeLine.properties   |   2 +-
 .../org/apache/hive/jdbc/TestJdbcDriver2.java   |  36 ++++---
 .../org/apache/hive/jdbc/HiveStatement.java     |  16 ++-
 .../java/org/apache/hadoop/hive/ql/Driver.java  |  15 +++
 .../org/apache/hadoop/hive/ql/MapRedStats.java  |  10 ++
 .../org/apache/hadoop/hive/ql/QueryState.java   |  12 +++
 .../hadoop/hive/ql/exec/FileSinkOperator.java   |  23 ++--
 .../hive/ql/exec/mr/HadoopJobExecHelper.java    |  11 ++
 .../clientpositive/llap/dp_counter_mm.q.out     |   8 ++
 .../clientpositive/llap/dp_counter_non_mm.q.out |   8 ++
 .../clientpositive/llap/orc_ppd_basic.q.out     |   1 +
 .../llap/tez_input_counters.q.out               |   1 +
 service-rpc/if/TCLIService.thrift               |   1 +
 .../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 +-
 .../org/apache/hive/service/cli/CLIService.java |   2 +
 .../hive/service/cli/OperationStatus.java       |   9 ++
 .../hive/service/cli/operation/Operation.java   |   4 +
 .../service/cli/thrift/ThriftCLIService.java    |   6 ++
 23 files changed, 303 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/beeline/src/main/resources/BeeLine.properties
----------------------------------------------------------------------
diff --git a/beeline/src/main/resources/BeeLine.properties 
b/beeline/src/main/resources/BeeLine.properties
index c41b3ed..30b4ef9 100644
--- a/beeline/src/main/resources/BeeLine.properties
+++ b/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)

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
----------------------------------------------------------------------
diff --git 
a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java 
b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
index b217259..d47c136 100644
--- a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
+++ b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcDriver2.java
@@ -977,7 +977,7 @@ public class TestJdbcDriver2 {
     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 class TestJdbcDriver2 {
 
   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

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 06542ce..ad8d1a7 100644
--- a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java
+++ b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java
@@ -369,7 +369,7 @@ public class HiveStatement implements java.sql.Statement {
     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 @@ public class HiveStatement implements java.sql.Statement {
         isLogBeingGenerated = false;
         throw new SQLException(e.toString(), "08S01", e);
       }
-    }
+    } while (!isOperationComplete);
 
     /*
       we set progress bar to be completed when hive query execution has 
completed
@@ -708,8 +708,16 @@ public class HiveStatement implements java.sql.Statement {
      * client might end up using executeAsync and then call this to check if 
the query run is
      * finished.
      */
-    waitForOperationToComplete();
-    return -1;
+    long numModifiedRows = -1;
+    TGetOperationStatusResp resp = waitForOperationToComplete();
+    if (resp != null) {
+      numModifiedRows = resp.getNumModifiedRows();
+    }
+    if (numModifiedRows == -1 || numModifiedRows > Integer.MAX_VALUE) {
+      LOG.warn("Number of rows is greater than Integer.MAX_VALUE");
+      return -1;
+    }
+    return (int) numModifiedRows;
   }
 
   /*

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java 
b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
index 52799b3..7d5e7d4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java
@@ -2326,11 +2326,18 @@ public class Driver implements IDriver {
       Map<String, MapRedStats> stats = SessionState.get().getMapRedStats();
       if (stats != null && !stats.isEmpty()) {
         long totalCpu = 0;
+        long numModifiedRows = 0;
         console.printInfo("MapReduce Jobs Launched: ");
         for (Map.Entry<String, MapRedStats> entry : stats.entrySet()) {
           console.printInfo("Stage-" + entry.getKey() + ": " + 
entry.getValue());
           totalCpu += entry.getValue().getCpuMSec();
+
+          if (numModifiedRows > -1) {
+            //if overflow, then numModifiedRows is set as -1. Else update 
numModifiedRows with the sum.
+            numModifiedRows = addWithOverflowCheck(numModifiedRows, 
entry.getValue().getNumModifiedRows());
+          }
         }
+        queryState.setNumModifiedRows(numModifiedRows);
         console.printInfo("Total MapReduce CPU Time Spent: " + 
Utilities.formatMsecToStr(totalCpu));
       }
       lDrvState.stateLock.lock();
@@ -2351,6 +2358,14 @@ public class Driver implements IDriver {
     }
   }
 
+  private long addWithOverflowCheck(long val1, long val2) {
+    try {
+      return Math.addExact(val1, val2);
+    } catch (ArithmeticException e) {
+      return -1;
+    }
+  }
+
   private void releasePlan(QueryPlan plan) {
     // Plan maybe null if Driver.close is called in another thread for the 
same Driver object
     lDrvState.stateLock.lock();

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java 
b/ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java
index cf9c227..483c3d9 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/MapRedStats.java
@@ -38,6 +38,8 @@ public class MapRedStats {
 
   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 class MapRedStats {
     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) {

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/java/org/apache/hadoop/hive/ql/QueryState.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/QueryState.java 
b/ql/src/java/org/apache/hadoop/hive/ql/QueryState.java
index 706c9ff..b1a602c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/QueryState.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/QueryState.java
@@ -50,6 +50,11 @@ public class QueryState {
   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 class QueryState {
     this.txnManager = txnManager;
   }
 
+  public long getNumModifiedRows() {
+    return numModifiedRows;
+  }
+
+  public void setNumModifiedRows(long numModifiedRows) {
+    this.numModifiedRows = numModifiedRows;
+  }
   /**
    * Builder to instantiate the QueryState object.
    */

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java
index 9c57eff..83b53f4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/FileSinkOperator.java
@@ -22,7 +22,6 @@ import static 
org.apache.hadoop.hive.conf.HiveConf.ConfVars.HIVE_TEMPORARY_TABLE
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -83,27 +82,13 @@ import org.apache.hadoop.hive.shims.ShimLoader;
 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.
  **/
@@ -147,6 +132,8 @@ public class FileSinkOperator extends 
TerminalOperator<FileSinkDesc> implements
   private transient boolean isInsertOverwrite;
   private transient String counterGroup;
   private transient BiFunction<Object[], ObjectInspector[], Integer> hashFunc;
+  public static final String TOTAL_TABLE_ROWS_WRITTEN = 
"TOTAL_TABLE_ROWS_WRITTEN";
+
   /**
    * Counters.
    */
@@ -583,6 +570,12 @@ public class FileSinkOperator extends 
TerminalOperator<FileSinkDesc> implements
       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) {

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java
index fcdc996..c31e22f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/mr/HadoopJobExecHelper.java
@@ -34,6 +34,7 @@ import org.apache.hadoop.hive.conf.HiveConf;
 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 @@ public class HadoopJobExecHelper {
 
     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(
+            ss.getConf().getVar(HiveConf.ConfVars.HIVECOUNTERGROUP),
+            FileSinkOperator.TOTAL_TABLE_ROWS_WRITTEN);
+        if (counter != null) {
+          mapRedStats.setNumModifiedRows(counter.getValue());
+        }
+      }
+
       this.callBackObj.logPlanProgress(ss);
     }
     // LOG.info(queryPlan);

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out 
b/ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out
index 1be25fe..25dc0c9 100644
--- a/ql/src/test/results/clientpositive/llap/dp_counter_mm.q.out
+++ b/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

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out 
b/ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out
index c0d2141..bbe4044 100644
--- a/ql/src/test/results/clientpositive/llap/dp_counter_non_mm.q.out
+++ b/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

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out 
b/ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out
index 49f9544..ad8aef0 100644
--- a/ql/src/test/results/clientpositive/llap/orc_ppd_basic.q.out
+++ b/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

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/ql/src/test/results/clientpositive/llap/tez_input_counters.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/tez_input_counters.q.out 
b/ql/src/test/results/clientpositive/llap/tez_input_counters.q.out
index d2fcdaa..63fdd74 100644
--- a/ql/src/test/results/clientpositive/llap/tez_input_counters.q.out
+++ b/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

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/service-rpc/if/TCLIService.thrift
----------------------------------------------------------------------
diff --git a/service-rpc/if/TCLIService.thrift 
b/service-rpc/if/TCLIService.thrift
index 30f8af7..1cf8a91 100644
--- a/service-rpc/if/TCLIService.thrift
+++ b/service-rpc/if/TCLIService.thrift
@@ -1070,6 +1070,7 @@ struct TGetOperationStatusResp {
 
   10: optional TProgressUpdateResp progressUpdateResponse
 
+  11: optional i64 numModifiedRows
 }
 
 

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 b2b62c7..d312896 100644
--- a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.cpp
+++ b/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 << "<null>"));
   out << ", " << "hasResultSet="; (__isset.hasResultSet ? (out << 
to_string(hasResultSet)) : (out << "<null>"));
   out << ", " << "progressUpdateResponse="; (__isset.progressUpdateResponse ? 
(out << to_string(progressUpdateResponse)) : (out << "<null>"));
+  out << ", " << "numModifiedRows="; (__isset.numModifiedRows ? (out << 
to_string(numModifiedRows)) : (out << "<null>"));
   out << ")";
 }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 4321ad6..b30c28f 100644
--- a/service-rpc/src/gen/thrift/gen-cpp/TCLIService_types.h
+++ b/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 {

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 15e8220..a7c1f86 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
@@ -48,6 +48,7 @@ import org.slf4j.LoggerFactory;
   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<Class<? extends IScheme>, SchemeFactory> schemes = 
new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -65,6 +66,7 @@ import org.slf4j.LoggerFactory;
   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 @@ import org.slf4j.LoggerFactory;
     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<String, _Fields> byName = new HashMap<String, 
_Fields>();
 
@@ -116,6 +119,8 @@ import org.slf4j.LoggerFactory;
           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 @@ import org.slf4j.LoggerFactory;
   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 @@ import org.slf4j.LoggerFactory;
         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 @@ import org.slf4j.LoggerFactory;
     if (other.isSetProgressUpdateResponse()) {
       this.progressUpdateResponse = other.progressUpdateResponse;
     }
+    this.numModifiedRows = other.numModifiedRows;
   }
 
   public TGetOperationStatusResp deepCopy() {
@@ -248,6 +257,8 @@ import org.slf4j.LoggerFactory;
     setHasResultSetIsSet(false);
     this.hasResultSet = false;
     this.progressUpdateResponse = null;
+    setNumModifiedRowsIsSet(false);
+    this.numModifiedRows = 0;
   }
 
   public TStatus getStatus() {
@@ -484,6 +495,28 @@ import org.slf4j.LoggerFactory;
     }
   }
 
+  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 @@ import org.slf4j.LoggerFactory;
       }
       break;
 
+    case NUM_MODIFIED_ROWS:
+      if (value == null) {
+        unsetNumModifiedRows();
+      } else {
+        setNumModifiedRows((Long)value);
+      }
+      break;
+
     }
   }
 
@@ -601,6 +642,9 @@ import org.slf4j.LoggerFactory;
     case PROGRESS_UPDATE_RESPONSE:
       return getProgressUpdateResponse();
 
+    case NUM_MODIFIED_ROWS:
+      return getNumModifiedRows();
+
     }
     throw new IllegalStateException();
   }
@@ -632,6 +676,8 @@ import org.slf4j.LoggerFactory;
       return isSetHasResultSet();
     case PROGRESS_UPDATE_RESPONSE:
       return isSetProgressUpdateResponse();
+    case NUM_MODIFIED_ROWS:
+      return isSetNumModifiedRows();
     }
     throw new IllegalStateException();
   }
@@ -739,6 +785,15 @@ import org.slf4j.LoggerFactory;
         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 @@ import org.slf4j.LoggerFactory;
     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 @@ import org.slf4j.LoggerFactory;
         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 @@ import org.slf4j.LoggerFactory;
       }
       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 @@ import org.slf4j.LoggerFactory;
               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 @@ import org.slf4j.LoggerFactory;
           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 @@ import org.slf4j.LoggerFactory;
       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 @@ import org.slf4j.LoggerFactory;
       if (struct.isSetProgressUpdateResponse()) {
         struct.progressUpdateResponse.write(oprot);
       }
+      if (struct.isSetNumModifiedRows()) {
+        oprot.writeI64(struct.numModifiedRows);
+      }
     }
 
     @Override
@@ -1297,7 +1392,7 @@ import org.slf4j.LoggerFactory;
       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 @@ import org.slf4j.LoggerFactory;
         struct.progressUpdateResponse.read(iprot);
         struct.setProgressUpdateResponseIsSet(true);
       }
+      if (incoming.get(9)) {
+        struct.numModifiedRows = iprot.readI64();
+        struct.setNumModifiedRowsIsSet(true);
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 abb7c1f..39572d4 100644
--- a/service-rpc/src/gen/thrift/gen-php/Types.php
+++ b/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;

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 0f8fd07..989ba44 100644
--- a/service-rpc/src/gen/thrift/gen-py/TCLIService/ttypes.py
+++ b/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 @@ class TGetOperationStatusResp:
     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 @@ class TGetOperationStatusResp:
           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 @@ class TGetOperationStatusResp:
       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 @@ class TGetOperationStatusResp:
     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):

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 60183da..6ab4063 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
@@ -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

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/service/src/java/org/apache/hive/service/cli/CLIService.java
----------------------------------------------------------------------
diff --git a/service/src/java/org/apache/hive/service/cli/CLIService.java 
b/service/src/java/org/apache/hive/service/cli/CLIService.java
index 3e26197..dbfaf71 100644
--- a/service/src/java/org/apache/hive/service/cli/CLIService.java
+++ b/service/src/java/org/apache/hive/service/cli/CLIService.java
@@ -474,6 +474,8 @@ public class CLIService extends CompositeService implements 
ICLIService {
     }
     OperationStatus opStatus = operation.getStatus();
     LOG.debug(opHandle + ": getOperationStatus()");
+    long numModifiedRows = operation.getNumModifiedRows();
+    opStatus.setNumModifiedRows(numModifiedRows);
     opStatus.setJobProgressUpdate(progressUpdateLog(getProgressUpdate, 
operation, conf));
     return opStatus;
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 52cc3ae..581bf92 100644
--- a/service/src/java/org/apache/hive/service/cli/OperationStatus.java
+++ b/service/src/java/org/apache/hive/service/cli/OperationStatus.java
@@ -31,6 +31,7 @@ public class OperationStatus {
   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 @@ public class OperationStatus {
   public JobProgressUpdate jobProgressUpdate(){
     return jobProgressUpdate;
   }
+
+  public long getNumModifiedRows() {
+    return numModifiedRows;
+  }
+
+  void setNumModifiedRows(long numRows) {
+    this.numModifiedRows = numRows;
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 3706c72..07ab487 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
@@ -184,6 +184,10 @@ public abstract class Operation {
     this.operationTimeout = operationTimeout;
   }
 
+  public long getNumModifiedRows() {
+    return queryState.getNumModifiedRows();
+  }
+
   protected void setOperationException(HiveSQLException operationException) {
     this.operationException = operationException;
   }

http://git-wip-us.apache.org/repos/asf/hive/blob/da13a137/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 c64c991..d425423 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
@@ -20,6 +20,7 @@ package org.apache.hive.service.cli.thrift;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
+import org.apache.hive.service.cli.OperationState;
 import org.apache.hive.service.rpc.thrift.TSetClientInfoReq;
 import org.apache.hive.service.rpc.thrift.TSetClientInfoResp;
 
@@ -691,6 +692,11 @@ public abstract class ThriftCLIService extends 
AbstractService implements TCLISe
     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();

Reply via email to