Index: src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java (revision 1135332) +++ src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java (working copy) @@ -4151,5 +4151,47 @@ } executorService.shutdownNow(); } + + + @Test + public void testCheckAndPut() throws IOException { + final byte [] anotherrow = Bytes.toBytes("anotherrow"); + final byte [] value2 = Bytes.toBytes("abcd"); + + HTable table = TEST_UTIL.createTable(Bytes.toBytes("testCheckAndPut"), + new byte [][] {FAMILY}); + Put put1 = new Put(ROW); + put1.add(FAMILY, QUALIFIER, VALUE); + + // row doesn't exist, so using non-null value should be considered "not match". + boolean ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, VALUE, put1); + assertEquals(ok, false); + + // row doesn't exist, so using "null" to check for existence should be considered "match". + ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put1); + assertEquals(ok, true); + + // row now exists, so using "null" to check for existence should be considered "not match". + ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put1); + assertEquals(ok, false); + + Put put2 = new Put(ROW); + put2.add(FAMILY, QUALIFIER, value2); + + // row now exists, use the matching value to check + ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, VALUE, put2); + assertEquals(ok, true); + + Put put3 = new Put(anotherrow); + put3.add(FAMILY, QUALIFIER, VALUE); + + // try to do CheckAndPut on different rows + try { + ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, value2, put3); + fail("trying to check and modify different rows should have failed."); + } catch(Exception e) {} + + } + } Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 1135332) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -1774,11 +1774,12 @@ try { result = get(get, false); + boolean valueIsNull = comparator.getValue() == null || + comparator.getValue().length == 0; boolean matches = false; - if (result.size() == 0 && - (comparator.getValue() == null || comparator.getValue().length == 0)) { + if (result.size() == 0 && valueIsNull) { matches = true; - } else if (result.size() == 1) { + } else if (result.size() == 1 && !valueIsNull) { int compareResult = comparator.compareTo(result.get(0).getValue()); switch (compareOp) { case LESS: