You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2012/10/27 23:28:33 UTC

svn commit: r1402888 - in /hbase/branches/0.94/src: main/java/org/apache/hadoop/hbase/filter/BitComparator.java test/java/org/apache/hadoop/hbase/filter/TestBitComparator.java

Author: larsh
Date: Sat Oct 27 21:28:33 2012
New Revision: 1402888

URL: http://svn.apache.org/viewvc?rev=1402888&view=rev
Log:
HBASE-6846 BitComparator bug - ArrayIndexOutOfBoundsException (Lucian George Iordache)

Modified:
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java
    hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestBitComparator.java

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java?rev=1402888&r1=1402887&r2=1402888&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java Sat Oct 27 21:28:33 2012
@@ -80,7 +80,7 @@ public class BitComparator extends Writa
     }
     int b = 0;
     //Iterating backwards is faster because we can quit after one non-zero byte.
-    for (int i = value.length - 1; i >= 0 && b == 0; i--) {
+    for (int i = length - 1; i >= 0 && b == 0; i--) {
       switch (bitOperator) {
         case AND:
           b = (this.value[i] & value[i+offset]) & 0xff;

Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestBitComparator.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestBitComparator.java?rev=1402888&r1=1402887&r2=1402888&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestBitComparator.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/filter/TestBitComparator.java Sat Oct 27 21:28:33 2012
@@ -32,6 +32,11 @@ public class TestBitComparator extends T
   private static byte[] data1 = new byte[]{15, 0, 0, 0, 0, 0};
   private static byte[] data2 = new byte[]{0, 0, 0, 0, 0, 15};
   private static byte[] data3 = new byte[]{15, 15, 15, 15, 15};
+  
+  // data for testing compareTo method with offset and length parameters
+  private static byte[] data1_2 = new byte[]{15, 15, 0, 0, 0, 0, 0, 15};
+  private static byte[] data2_2 = new byte[]{15, 0, 0, 0, 0, 0, 15, 15};
+  
   private final int Equal = 0;
   private final int NotEqual = 1;
 
@@ -65,6 +70,26 @@ public class TestBitComparator extends T
     assertEquals(comparator.compareTo(data), expected);
   }
 
+  public void testANDOperationWithOffset() {
+    testOperationWithOffset(data1_2, ones, BitComparator.BitwiseOp.AND, Equal);
+    testOperationWithOffset(data1_2, data0, BitComparator.BitwiseOp.AND, NotEqual);
+    testOperationWithOffset(data2_2, data1, BitComparator.BitwiseOp.AND, NotEqual);
+  }
+
+  public void testOROperationWithOffset() {
+    testOperationWithOffset(data1_2, zeros, BitComparator.BitwiseOp.OR, Equal);
+    testOperationWithOffset(data2_2, data1, BitComparator.BitwiseOp.OR, Equal);
+  }
+
+  public void testXOROperationWithOffset() {
+    testOperationWithOffset(data2_2, data1, BitComparator.BitwiseOp.XOR, Equal);
+  }
+
+  private void testOperationWithOffset(byte[] data, byte[] comparatorBytes, BitComparator.BitwiseOp operator, int expected) {
+    BitComparator comparator = new BitComparator(comparatorBytes, operator);
+    assertEquals(comparator.compareTo(data, 1, comparatorBytes.length), expected);
+  }
+
   @org.junit.Rule
   public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
     new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();