You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "JeongMin Ju (Jira)" <ji...@apache.org> on 2026/03/27 01:34:00 UTC

[jira] [Created] (HBASE-30033) Scan.setBatch() validation can be bypassed by calling setBatch() before setFilter()

JeongMin Ju created HBASE-30033:
-----------------------------------

             Summary: Scan.setBatch() validation can be bypassed by calling setBatch() before setFilter()
                 Key: HBASE-30033
                 URL: https://issues.apache.org/jira/browse/HBASE-30033
             Project: HBase
          Issue Type: Bug
          Components: Client
    Affects Versions: 2.5.11
            Reporter: JeongMin Ju


Scan.setBatch(int) validates that the scan does not have a filter with hasFilterRow() == true, throwing IncompatibleFilterException if it does. However, Scan.setFilter(Filter) does not perform the reverse check against an existing batch setting.

  This means calling setBatch() before setFilter() silently creates an invalid Scan configuration that setBatch() was designed to prevent:

  {code:java}
  // This correctly throws IncompatibleFilterException
  Scan scan = new Scan();
  scan.setFilter(new PageFilter(10));
  scan.setBatch(5); // throws IncompatibleFilterException

  // This silently creates the same invalid combination
  Scan scan = new Scan();
  scan.setBatch(5);              // succeeds - no filter yet
  scan.setFilter(new PageFilter(10)); // succeeds - no batch check
  // scan now has both batch and hasFilterRow()=true filter
  {code}

  When this invalid Scan is executed, setBatch splits rows into partial results, but filterRow() operates on partial data instead of the full row, producing incorrect results.

  Fix suggestion: Add validation in setFilter(Filter) to check if batch is already set:

  {code:java}
  public Scan setFilter(Filter filter) {
    super.setFilter(filter);
    if (this.batch > 0 && filter != null && filter.hasFilterRow()) {
      throw new IncompatibleFilterException(
        "Cannot set a filter that returns true for hasFilterRow on a scan with batch set");
    }
    return this;
  }
  {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)