Skip to content

Commit 0020da4

Browse files
committed
HBASE-26742 Comparator of NOT_EQUAL NULL is invalid for checkAndMutate (#4105)
Signed-off-by: Duo Zhang <zhangduo@apache.org>
1 parent c8ccbde commit 0020da4

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4896,11 +4896,11 @@ public CheckAndMutateResult checkAndMutate(CheckAndMutate checkAndMutate, long n
48964896
boolean valueIsNull =
48974897
comparator.getValue() == null || comparator.getValue().length == 0;
48984898
if (result.isEmpty() && valueIsNull) {
4899-
matches = true;
4900-
} else if (result.size() > 0 && result.get(0).getValueLength() == 0 && valueIsNull) {
4901-
matches = true;
4899+
matches = op != CompareOperator.NOT_EQUAL;
4900+
} else if (result.size() > 0 && valueIsNull) {
4901+
matches = (result.get(0).getValueLength() == 0) == (op != CompareOperator.NOT_EQUAL);
49024902
cellTs = result.get(0).getTimestamp();
4903-
} else if (result.size() == 1 && !valueIsNull) {
4903+
} else if (result.size() == 1) {
49044904
Cell kv = result.get(0);
49054905
cellTs = kv.getTimestamp();
49064906
int compareResult = PrivateCellUtil.compareValue(kv, comparator);

hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestCheckAndMutate.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static org.junit.Assert.assertNull;
2323
import static org.junit.Assert.assertTrue;
2424
import static org.junit.Assert.fail;
25-
2625
import java.io.IOException;
2726
import java.util.Arrays;
2827
import java.util.Collections;
@@ -1218,4 +1217,54 @@ public void testCheckAndRowMutationsBatch() throws Throwable {
12181217
assertEquals("h", Bytes.toString(result.getValue(FAMILY, Bytes.toBytes("H"))));
12191218
}
12201219
}
1220+
1221+
@Test
1222+
public void testCheckAndMutateForNull() throws Exception {
1223+
byte[] qualifier = Bytes.toBytes("Q");
1224+
try (Table table = createTable()) {
1225+
byte [] row1 = Bytes.toBytes("testRow1");
1226+
Put put = new Put(row1);
1227+
put.addColumn(FAMILY, qualifier, Bytes.toBytes("v0"));
1228+
table.put(put);
1229+
assertEquals("v0", Bytes.toString(
1230+
table.get(new Get(row1).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
1231+
1232+
CheckAndMutate checkAndMutate1 = CheckAndMutate.newBuilder(row1)
1233+
.ifMatches(FAMILY, qualifier, CompareOperator.NOT_EQUAL, new byte[] {})
1234+
.build(new Put(row1).addColumn(FAMILY, qualifier, Bytes.toBytes("v1")));
1235+
table.checkAndMutate(checkAndMutate1);
1236+
assertEquals("v1", Bytes.toString(
1237+
table.get(new Get(row1).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
1238+
1239+
byte [] row2 = Bytes.toBytes("testRow2");
1240+
put = new Put(row2);
1241+
put.addColumn(FAMILY, qualifier, new byte[] {});
1242+
table.put(put);
1243+
assertEquals(0,
1244+
table.get(new Get(row2).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier).length);
1245+
1246+
CheckAndMutate checkAndMutate2 = CheckAndMutate.newBuilder(row2)
1247+
.ifMatches(FAMILY, qualifier, CompareOperator.EQUAL, new byte[] {})
1248+
.build(new Put(row2).addColumn(FAMILY, qualifier, Bytes.toBytes("v2")));
1249+
table.checkAndMutate(checkAndMutate2);
1250+
assertEquals("v2", Bytes.toString(
1251+
table.get(new Get(row2).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
1252+
1253+
byte [] row3 = Bytes.toBytes("testRow3");
1254+
put = new Put(row3).addColumn(FAMILY, qualifier, Bytes.toBytes("v0"));
1255+
assertNull(table.get(new Get(row3).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier));
1256+
CheckAndMutate checkAndMutate3 = CheckAndMutate.newBuilder(row3)
1257+
.ifMatches(FAMILY, qualifier, CompareOperator.NOT_EQUAL, new byte[] {})
1258+
.build(put);
1259+
table.checkAndMutate(checkAndMutate3);
1260+
assertNull(table.get(new Get(row3).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier));
1261+
1262+
CheckAndMutate checkAndMutate4 = CheckAndMutate.newBuilder(row3)
1263+
.ifMatches(FAMILY, qualifier, CompareOperator.EQUAL, new byte[] {})
1264+
.build(put);
1265+
table.checkAndMutate(checkAndMutate4);
1266+
assertEquals("v0", Bytes.toString(
1267+
table.get(new Get(row3).addColumn(FAMILY, qualifier)).getValue(FAMILY, qualifier)));
1268+
}
1269+
}
12211270
}

0 commit comments

Comments
 (0)