This is an automated email from the ASF dual-hosted git repository.

granthenke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git

commit ea48c9b181e3256cb96940c8d6bbf2f5ec3c3607
Author: zhangyifan27 <[email protected]>
AuthorDate: Fri Oct 9 19:17:55 2020 +0800

    KUDU-3198: fix encodeRow() when encoding delete operations
    
    Before this patch, not all non-key columns are cleared when
    encoding delete row operations. If users delele with full row
    from a 64 column table, the operation would fail.
    
    Change-Id: I144e1998b99be3e660b7f320c55e4b1c9753a61f
    Reviewed-on: http://gerrit.cloudera.org:8080/16571
    Reviewed-by: Grant Henke <[email protected]>
    Tested-by: Grant Henke <[email protected]>
    Reviewed-by: Alexey Serbin <[email protected]>
---
 .../java/org/apache/kudu/client/Operation.java     |  4 +-
 .../org/apache/kudu/client/TestKuduSession.java    | 48 ++++++++++++++++++++++
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git 
a/java/kudu-client/src/main/java/org/apache/kudu/client/Operation.java 
b/java/kudu-client/src/main/java/org/apache/kudu/client/Operation.java
index cc815d3..ce59aa2 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/Operation.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/Operation.java
@@ -366,9 +366,9 @@ public abstract class Operation extends 
KuduRpc<OperationResponse> {
       if (type == ChangeType.DELETE) {
         columnCount = row.getSchema().getPrimaryKeyColumnCount();
         // Clear the bits indicating any non-key fields are set.
-        columnsBitSet.clear(schema.getPrimaryKeyColumnCount(), 
columnsBitSet.size() - 1);
+        columnsBitSet.clear(schema.getPrimaryKeyColumnCount(), 
columnsBitSet.size());
         if (schema.hasNullableColumns()) {
-          nullsBitSet.clear(schema.getPrimaryKeyColumnCount(), 
nullsBitSet.size() - 1);
+          nullsBitSet.clear(schema.getPrimaryKeyColumnCount(), 
nullsBitSet.size());
         }
       }
 
diff --git 
a/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduSession.java 
b/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduSession.java
index b8354cd..5b1864e 100644
--- a/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduSession.java
+++ b/java/kudu-client/src/test/java/org/apache/kudu/client/TestKuduSession.java
@@ -37,7 +37,9 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.kudu.ColumnSchema;
 import org.apache.kudu.Schema;
+import org.apache.kudu.Type;
 import org.apache.kudu.test.ClientTestUtil;
 import org.apache.kudu.test.KuduTestHarness;
 
@@ -201,6 +203,52 @@ public class TestKuduSession {
     assertEquals(0, countRowsInScan(client.newScannerBuilder(table).build()));
   }
 
+  /** Regression test for KUDU-3198. Delete with full row from a 64-column 
table. */
+  @Test(timeout = 100000)
+  public void testDeleteWithFullRowFrom64ColumnTable() throws Exception {
+    ArrayList<ColumnSchema> columns = new ArrayList<>(64);
+    columns.add(new ColumnSchema.ColumnSchemaBuilder("key", 
Type.INT32).key(true).build());
+    for (int i = 1; i < 64; i++) {
+      columns.add(new ColumnSchema.ColumnSchemaBuilder("column_" + i, 
Type.STRING)
+          .nullable(true)
+          .build());
+    }
+    Schema schema = new Schema(columns);
+
+    KuduTable table = client.createTable(tableName, schema, 
getBasicCreateTableOptions());
+
+    KuduSession session = client.newSession();
+    session.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
+
+    // Insert 25 rows and then delete them.
+    List<PartialRow> rows = new ArrayList<>();
+    for (int i = 0; i < 25; i++) {
+      Insert insert = table.newInsert();
+      PartialRow row = insert.getRow();
+      row.addInt(0, 1);
+      for (int j = 1; j < 64; j++) {
+        if (j % 2 == 0) {
+          row.setNull(j);
+        } else {
+          row.addString(j, "val_" + j);
+        }
+      }
+      rows.add(row);
+      session.apply(insert);
+    }
+    session.flush();
+
+    for (PartialRow row : rows) {
+      Delete del = table.newDelete();
+      del.setRow(row);
+      session.apply(del);
+    }
+    session.flush();
+
+    assertEquals(0, session.countPendingErrors());
+    assertEquals(0, countRowsInScan(client.newScannerBuilder(table).build()));
+  }
+
   /**
    * Regression test for KUDU-1402. Calls to session.flush() should return an 
empty list
    * instead of null.

Reply via email to