diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java index 5cc0d0fac87f..630edc4a6ffd 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java @@ -554,6 +554,10 @@ public Scan setMaxResultSize(long maxResultSize) { @Override public Scan setFilter(Filter filter) { + if (filter != null && filter.hasFilterRow() && this.batch > 0) { + throw new IncompatibleFilterException( + "Cannot set a filter that returns true for filter.hasFilterRow on a scan with batch set"); + } super.setFilter(filter); return this; } diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java index dcc624ff112b..26ef4c0154f9 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java @@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; import java.io.IOException; @@ -29,6 +30,8 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.Scan.ReadType; import org.apache.hadoop.hbase.filter.FilterList; +import org.apache.hadoop.hbase.filter.IncompatibleFilterException; +import org.apache.hadoop.hbase.filter.PageFilter; import org.apache.hadoop.hbase.security.access.Permission; import org.apache.hadoop.hbase.security.visibility.Authorizations; import org.apache.hadoop.hbase.testclassification.ClientTests; @@ -254,6 +257,36 @@ public void testScanCopyConstructor() throws Exception { "Make sure copy constructor adds all the fields in the copied object"); } + @Test + public void testSetFilterWithBatchThrows() { + Scan scan = new Scan(); + scan.setBatch(5); + assertThrows(IncompatibleFilterException.class, () -> scan.setFilter(new PageFilter(10))); + } + + @Test + public void testSetFilterWithoutBatchDoesNotThrow() { + Scan scan = new Scan(); + scan.setFilter(new PageFilter(10)); + // no exception expected + } + + @Test + public void testSetFilterWithBatchAndNonFilterRowFilter() { + Scan scan = new Scan(); + scan.setBatch(5); + scan.setFilter(new FilterList()); + // FilterList.hasFilterRow() returns false, so no exception expected + } + + @Test + public void testSetFilterWithBatchAndNullFilter() { + Scan scan = new Scan(); + scan.setBatch(5); + scan.setFilter(null); + // null filter should not throw + } + @Test public void testScanReadType() throws Exception { Scan scan = new Scan();