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.
